GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Hinzufügung eines neuen Netzwerkprotokolls im Linux-Kernel

Um die Kommunikation vom Userspace zu Ihrem Protokoll abzuwickeln, registrieren Sie Ihr Protokoll bei der Kernel-Socket-API. Damit können Sie einen normalen Socket aus dem Userspace erstellen.

Sehen Sie sich die Bluetooth/RFCOM-Socket-Implementierung für relevante Codebeispiele an.

static const struct proto_ops rfcomm_sock_ops = {
     .family         = PF_BLUETOOTH,
     .owner          = THIS_MODULE,
     .bind           = rfcomm_sock_bind,
     .connect        = rfcomm_sock_connect,
     .listen         = rfcomm_sock_listen,
     .
     .
     .
     .accept         = rfcomm_sock_accept,

};
 
static const struct net_proto_family rfcomm_sock_family_ops = {
     .family         = PF_BLUETOOTH,
     .owner          = THIS_MODULE,
     .create         = rfcomm_sock_create
};

Um ein Protokoll zu registrieren, müssen Sie die proto_ops-Struktur füllen. Diese Struktur folgt dem objektorientierten Muster, das an anderer Stelle im Kernel beobachtet wird. Diese Struktur definiert eine Schnittstelle für Entwickler, die ihre eigene Socket-Schnittstelle implementieren.

Implementieren Sie die Funktionen, die die Schnittstelle definiert, wie z. B. Binden, Verbinden, Abhören, und weisen Sie den Funktionszeiger dem Struktureintrag zu. Definieren Sie ioctl's für Funktionen, die nicht von der Betriebsschnittstelle abgedeckt werden.

Am Ende haben Sie eine Struktur, die Sie später in die Socket-Struktur einbetten, die wir von der create-Funktion zurückgeben.

Struct net_proto_family definiert eine neue Protokollfamilie. Diese Struktur enthält die create-Funktion, bei der Ihre Funktionsimplementierung eine Socket-Struktur füllen sollte, 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, einen richtigen Socket aus dem Userspace zu erstellen.

Intern sollte das Protokoll wahrscheinlich skbuffs verwenden (siehe hier und hier), um mit den Netzwerkgeräten zu kommunizieren.

skbuffs sind die universelle Art, Netzwerkpakete im Linux-Kernel zu handhaben. Die Pakete werden von der Netzwerkkarte empfangen, in einige skbuffs gesteckt und dann an den Netzwerkstack weitergegeben, der den skbuff die ganze Zeit verwendet.

Dies ist die grundlegende Datenstruktur und der IO-Pfad, um ein Netzwerkprotokoll innerhalb des Linux-Kernels zu implementieren.

Mir ist kein Dokument bekannt, das dieses Verfahren von Anfang bis Ende beschreibt. Die Quelle ist bei Ihnen.


Linux
  1. Kontinuierliche Integrationstests für den Linux-Kernel

  2. So verwenden Sie den Linux-Befehl mtr

  3. Ich freue mich auf die Linux-Netzwerkkonfiguration in der anfänglichen Ramdisk (initrd)

  4. Erlauben Sie das X-Protokoll in Ihrem Netzwerk?

  5. Was ist die aktuelle Linux-Kernelquelle?

Wie der Linux-Kernel mit Interrupts umgeht

So überprüfen Sie die Kernel-Version in Linux

So verwenden Sie den netstat-Befehl unter Linux

Linux Kernel 5.0 veröffentlicht, neue Funktionen und Verbesserungen!

Deaktivieren des ARP-Protokolls in der Linux-Box

Wie wird dem Linux-Kernel Unterstützung für neue Hardware hinzugefügt?