Schnellreferenz

Dieser Abschnitt enthält eine Referenz der Konzepte, die in diesem Kapitel eingeführt wurden. Er erläutert darüber hinaus die Bedeutung jeder Header-Datei, die ein Treiber einbinden muß. Die Liste der Felder in net_device und sk_buff wird dagegen nicht wiederholt.

#include <linux/netdevice.h>

Diese Header-Datei enthält die Definitionen von struct net_device und struct net_device_stats und bindet einige zusätzliche Header-Dateien ein, die von Netzwerk-Treibern benötigt werden.

int register_netdev(struct net_device *dev);, void unregister_netdev(struct net_device *dev);

Registrieren und deregistrieren eines Netzwerk-Geräts.

SET_MODULE_OWNER(struct net_device *dev);

Dieses Makro speichert einen Zeiger auf das aktuelle Modul in der Geräte-Struktur (oder übrigens auch in jeder anderen Struktur mit einem owner-Feld). Damit kann das Netzwerk-Subsystem den Verwendungszähler des Moduls pflegen.

netif_start_queue(struct net_device *dev);, netif_stop_queue(struct net_device *dev);, netif_wake_queue(struct net_device *dev);

Diese Funktionen steuern die Übergabe von zu übertragenden Paketen an den Treiber. Es werden keine Pakete übertragen, solange nicht netif_start_queue aufgerufen worden ist. netif_stop_queue hält die Übertragung an und netif_wake_queue startet die Warteschlange wieder und stubst die Netzwerk-Schicht an, damit diese wieder Pakete überträgt.

void netif_rx(struct sk_buff *skb);

Diese Funktion kann zur Interrupt-Zeit aufgerufen werden, um dem Kernel mitzuteilen, daß ein Paket empfangen und in einem Socket-Buffer gekapselt wurde.

#include <linux/if.h>

Wird von netdevice.h eingebunden und deklariert die Schnittstellen-Flags (die IFF_-Makros) sowie struct ifmap, das eine bedeutende Rolle in der ioctl-Implementation von Netzwerk_Treibern spielt.

void netif_carrier_off(struct net_device *dev);, void netif_carrier_on(struct net_device *dev);, int netif_carrier_ok(struct net_device *dev);

Die ersten beiden Funktionen können dazu verwendet werden, dem Kernel mitzuteilen, ob eine bestimmte Schnittstelle gerade ein Carrier-Signal hat. netif_carrier_ok fragt den Carrier-Zustand ab, wie er in der Gerätestruktur steht.

#include <linux/if_ether.h>, ETH_ALEN, ETH_P_IP, struct ethhdr;

Wird von netdevice.h eingebunden und definiert alle ETH_-Makros, mit denen Oktett-Längen (wie die Adreßlänge) und Netzwerk-Protokolle (wie IP) repräsentiert werden. Außerdem wird in dieser Datei die Struktur ethhdr definiert.

#include <linux/skbuff.h>

Enthält die Definition von struct sk_buff und verwandten Strukturen sowie mehrere Inline-Funktionen, die auf diesen Puffern operieren. Diese Header-Datei wird auch von netdevice.h eingebunden.

struct sk_buff *alloc_skb(unsigned int len, int priority);, struct sk_buff *dev_alloc_skb(unsigned int len);, void kfree_skb(struct sk_buff *skb);, void dev_kfree_skb(struct sk_buff *skb);

Diese Funktionen kümmern sich um das Allozieren und Freigeben von Socket-Buffern. Treiber sollten normalerweise die für diesen Zweck vorgesehenen dev_-Varianten verwenden.

unsigned char *skb_put(struct sk_buff *skb, int len);, unsigned char *_ _skb_put(struct sk_buff *skb, int len);, unsigned char *skb_push(struct sk_buff *skb, int len);, unsigned char *_ _skb_push(struct sk_buff *skb, int len);

Diese Funktionen fügen einem skb Daten hinzu; skb_put stellt die Daten an das Ende des skb, skb_push dagegen an den Anfang. Die normalen Versionen überprüfen, ob hinreichend Platz zur Verfügung steht, die Versionen mit den führenden Unterstrichen tun das nicht.

int skb_headroom(struct sk_buff *skb);, int skb_tailroom(struct sk_buff *skb);, void skb_reserve(struct sk_buff *skb, int len);

Diese Funktionen verwalten Platz in einem skb. skb_headroom und skb_tailroom geben zurück, wieviel Platz am Anfang beziehungsweise am Ende eines skb zur Verfügung steht. skb_reserve kann verwendet werden, um Platz am Anfang eines skb zu reservieren, der leer sein muß.

unsigned char *skb_pull(struct sk_buff *skb, int len);

skb_pull “entfernt” Daten aus einem skb durch Anpassen der internen Zeiger.

#include <linux/etherdevice.h>, void ether_setup(struct net_device *dev);

Diese Funktion setzt die Zeiger der meisten Gerätemethoden auf die allgemein verwendbaren Implementationen für Ethernet-Treiber. Außerdem wird hier dev->flags gesetzt und der nächste verfügbare ethx-Name an dev->name zugewiesen, wenn das erste Zeichen im Namen ein Leer- oder Nullzeichen ist.

unsigned short eth_type_trans(struct sk_buff *skb, struct net_device *dev);

Wenn eine Ethernet-Schnittstelle ein Paket empfängt, dann kann diese Funktion aufgerufen werden, um skb->pkt_type zu setzen. Der Rückgabewert ist eine Protokoll-Nummer, die normalerweise in skb->protocol abgelegt wird.

#include <linux/sockios.h>, SIOCDEVPRIVATE

Der erste der 16 ioctl-Befehle, die von jedem Treiber zur privaten Verwendung implementiert werden können. Alle Netzwerk-ioctl-Befehle sind in sockios.h definiert.