NetLink 7 C -Funktion

NetLink 7 C -Funktion
Die Benutzer-Raum-Aufgaben sowie der Kernel kommunizieren miteinander über NetLink. Es besteht aus einer inneren Kernel-API für die Kern-Plugins und einer gängigen Sockets-zentrierten Benutzer-Space-Task-Schnittstelle. In diesem Unterrichtsartikel wird die Kernkern -Schnittstelle nicht beschrieben. Darüber hinaus gibt es in der Tat eine veraltete NetLink -Schnittstelle, die über die NetLink -Charakterperipheriegeräte zugänglich ist. Diese Schnittstelle wird hier nicht beschrieben und ausschließlich zur Rückwärtskompatibilität enthalten. Datagramme stehen im Mittelpunkt des NetLink -Dienstes. Es gibt zwei akzeptable Optionen für den Socket -Stil: SOCK_RAW und SOCK_DGRAM. Die NetLink -Schnittstelle unterscheidet sich inzwischen nicht zwischen den Datagrammen und den Rohstücken.

Netlink -Familien

Der NetLink -Clan bestimmt das Kernel -Paket oder den NetLink -Set für die Kommunikation. Die vorhandenen Netlink -Familien sind Folgendes:

  • Netlink_route: Es akzeptiert sowohl die Routing- als auch die Verbindungs ​​-Updates, mit denen die IPs, die Linkeinstellungen, die Nachbarkonfigurationen, die Warteschlangendisziplinen, die Kommunikationsklassifizierungen und die Paketklassifizierungen verwendet werden können.
  • Netlink_w1: Die vom 1-Wire-Netzwerk gesendeten Nachrichten.
  • Netlink_usersock: Verwendet nur von den Benutzer-Mode-Schnittstellenprotokollen.
  • Netlink_firewall: Übertragen Sie die IPv4 -Pakete über den Benutzermodus in NetFilter, das von der IP -Warteschlange von Core -Paket verwendet wird. Da für eine langwierige Zeitdauer als unnötig eingestuft wird (zugunsten der weitaus ausgefeilteren NFNETLink -Warteschlangenfunktion), wird NetLink Firewall schließlich in Linux 3 eliminiert.5.
  • Netlink_sock_diag: Fragt den Kern um Details zu den Sockeln, die zu den verschiedenen Protokollvarianten gehören.
  • Netlink Crypto: Anfordern von Verschlüsselungsdaten mithilfe der NetLink -Schnittstelle sowohl mit der Verschlüsselungs -API des Kernels authentifiziert als auch ermöglicht es, die kryptografische API des Kernels einzurichten.
  • Netlink_ip6_fw: Übermittelt IPv6 -Frames über den Benutzermodus in NetFilter. Nutzung von der Kernel -Komponente IP6 -Warteschlange.

Die Schnittstelle NetLink ist nicht vertrauenswürdig. Es bemüht sich, die Informationen an seine beabsichtigten Empfänger zu liefern. Wenn jedoch ein Speicherproblem oder ein anderer Fehler auftritt, kann dies die Kommunikation verlieren. Durch Aktivieren des NLM -F -ACK. NLMSG -Fehlerpakete mit dem auf 0 festgelegten Fehlerfeld sind Bestätigungen. Die Anerkennung für die empfangenen Nachrichten sollten vom Programm selbst erstellt werden.

Für jedes fallengelassene Paket versucht der Kernel, eine NLMSG -Fehlerantwort zu geben. Dieses Muster sollte auch von den Benutzerprozessen folgen. In jedem Fall ist es schwierig, die Daten aus dem Kernel vertrauenswürdig an den Benutzer zu übermitteln.

Wenn der Socket-Speicher gefüllt ist, kann der Kernel keine NetLink-Nachricht übertragen, da die Informationen verloren gehen und der Kern mit seinem Benutzer-Raum-Betrieb nicht mehr den gleichen Begriff des Status des Kerns teilen würde. Die App ist dafür verantwortlich.

Beispiel:

Wir werden ein Programm diskutieren, um die NetLink () -Funktion für die Kommunikation zwischen dem Kernel und den normalen Systemen zu verwenden. Zunächst werfen wir einen Blick auf die Benutzerseite dieses Programms. Dafür müssen wir den Hauptbuchsen und die NetLink -Header im Code hinzufügen, um die Sockets im C -Programm zusammen mit der Netlink () -Funktion zu verwenden, i.e. "Steckdose.H ”und„ NetLink.H".

Danach setzen wir die maximale Nutzlastgröße auf 1024 und legen die definierenden Strukturen fest, ich.e. SOCKADDR_NL, src_adr, dest_adr. Die Nullstruktur "NLMSGHDR" ist auch mit "*nl" und iovec -Struktur definiert. Die main () -Funktion wird mit der Erstellung einer Sockel mit der Funktion „Socket“ gestartet. Diese Funktion enthält den Namen PF_NetLink Domain für den Socket und den Sock_raw -Socket -Typ. Das NetLink_test -Socket -Protokoll ist in den Parametern der Socket -Funktion definiert.

Die Funktion memset () wird verwendet, um auf den Block "src_adr" des Strukturspeichers zu verweisen, in dem der Wert 0 auf mehrere Bytes gesetzt ist, die die Struktur "Src_adr" enthält. Mit der SRC_ADR -Struktur setzen wir die Familie, die Prozess -ID und die Gruppen des jeweiligen Sockets auf AF_NetLink, Self Process ID bzw. 0. Ähnlich wie bei einer TCP/IP -Verbindung ist der festgelegte Socket über die NetLink Bind () -Funktion mit einer lokalen IP (Origin) -Kinneziell -IP verknüpft. Die Funktion memset () wird erneut verwendet, um auf den Block „dest_adr“ des Strukturspeichers zu verweisen, in dem der Wert 0 auf mehrere Bytes eingestellt ist, die die Zielstruktur enthält.

Mit der Dest_adr -Struktur weisen wir die Familie, die Prozess -ID und die Gruppen für den jeweiligen Zielsocket AF_NetLink, 0 Prozess -ID bzw. 0 Gruppen zu. Mit der MALCOC () -Funktion weisen wir den dynamischen Speicher „NLMSGHDR“ zu und speichern das Rückgabeergebnis, i, i.e. erfolgreich oder nicht. Der Nullstrukturzeiger „NL“ zeigt auf die Nachrichtenlänge, die Prozess -ID und die Flag -0, um den NetLink -Nachrichtenheader zu füllen. Die Funktion von Strcpy () ist hier, um die Zeichenfolge in der Null -Zeigerstruktur „NL“ zu kopieren.


Daher besteht die Kommunikationsnutzlast plus NLMSGHDR eine NetLink -Nachricht aus. Wenn eine Kommunikation empfangen wird, geht sie in den Puffer, auf den der NL -Zeiger zeigt. Wir können die aktualisierte Nachricht auch an die Struktur MSGHDR "MSG" senden. Der Strukturzeiger „NL“ kann die Nachricht aus dem Kernel lesen und über die Verwendung der Funktion nlmsg_data () auf der Shell anstellen.

Zuletzt wird der NetLink Socket Descriptor verwendet, um die NetLink Socket zu schließen.

Innerhalb des Kernel -Programmraums erstellen wir zusammen mit seinem Zeiger "*nl_sk" eine Nullstruktur „Sock“, die "*nl_sk". Die Funktion nl_data_ready () verwendet diese Struktur und eine gewisse Länge, um sie aufzuwecken und die Daten nach einem Schlaf fertig zu machen. Die Funktion netlink_test () ist hier, um auf eine Nachricht zu warten, die vom Benutzerraum zum Kernel abfällt, und sie ausdrucken. Am Ende setzt der Kernel -Raum die Steckdose frei.

Das „Hallo du!Die Nachricht wird auf unserem Bildschirm nach der Ausführung dieses Beispiels angezeigt.

Abschluss

Hier geht. Wir haben ihre Verwendung besprochen, indem wir eine Nachricht vom Benutzerraum an den entsprechenden Kernelraum gesendet haben. Der Beispielcode dieses Artikels kann in jedem Compiler implementiert werden.