Ich weiß, dass wir im Linux-Kernel ein eigenes Protokoll auf der Transportschicht hinzufügen können, ähnlich wie bei TCP, UDP etc.
Gibt es irgendwelche Hooks, um ein neues Protokoll auf der Netzwerkschicht zu registrieren, ähnlich IP, ARP, das die Pakete an die Anwendung übertragen könnte und wie man dieses Protokoll im Linux-Kernel hinzufügt?
Um die Kommunikation vom Benutzerbereich zu Ihrem Protokoll zu verwalten, registrieren Sie Ihr Protokoll mit dem Kernel Sockets API . Auf diese Weise können Sie einen normalen Socket aus dem Benutzerbereich erstellen.
Sehen Sie sich die Bluetooth / RFCOM-Socket-Implementierung für relevante Codebeispiele .
%Vor%Um ein Protokoll zu registrieren, müssen Sie die proto_ops ausfüllen Struktur. Diese Struktur folgt dem objektorientierten Muster , das an anderer Stelle im Kernel beobachtet wurde. Diese Struktur definiert eine Schnittstelle für Entwickler, die ihre eigene Socket-Schnittstelle implementieren.
Implementieren Sie die von der Schnittstelle definierten Funktionen wie binden, verbinden, überwachen und weisen Sie den Funktionszeiger dem Struktureintrag zu. Definieren Sie ioctls für Funktionen, die nicht von der Betriebsschnittstelle abgedeckt werden.
Sie haben am Ende eine Struktur, die Sie später in den Socket einbetten struct kehren wir von der create-Funktion zurück.
Struct net_proto_family definiert eine neue Protokollfamilie. Diese Struktur enthält die create-Funktion, bei der Ihre Funktionsimplementierung eine Socket-Struktur auffüllen soll, die mit der proto_ops-Struktur gefüllt ist.
Danach registrieren Sie die Familie mit sock_register , und wenn alles in Ordnung ist, sollten Sie in der Lage sein, aus dem Benutzerbereich einen passenden Socket zu erstellen.
Intern sollte das Protokoll wahrscheinlich skbuffs verwenden 1 , [2] [3] (pdf) um mit den Netzwerkgeräten zu kommunizieren.
skbuffs sind die universelle Möglichkeit, Netzwerkpakete im Linux-Kernel zu behandeln. Die Pakete werden von der Netzwerkkarte empfangen, in einige skbuffs eingegeben und dann an den Netzwerkstack übergeben, der den skbuff die ganze Zeit benutzt.
Dies ist die grundlegende Datenstruktur und der io-Pfad, um ein Netzwerkprotokoll innerhalb des Linux-Kernels zu implementieren.
Ich kenne kein Dokument, das diesen Vorgang von Anfang bis Ende beschreibt. Die Quelle ist bei dir dabei.
Um das Protokoll zu implementieren, schreiben Sie ein Kernelmodul.
Das Modul sollte ein neues Gerät in /dev
erstellen. Die Anwendung kann dann ioctl()
verwenden, um mit Ihrem Modul zu sprechen, um Dinge wie Ziel-Host, Optionen usw. anzugeben.
Weitere Informationen zum Implementieren von ioctl()
in einem Kernel finden Sie in Kapitel 7 des Linux Kernel Module-Programmierhandbuchs Modul.
Dieser Blogpost scheint auch eine gute Einführung in das Thema zu sein.
Tags und Links c kernel linux networking linux-kernel