struct file_operations
die Struktur struct net_device
.init_module
und cleanup_module
registriert und entregistriert.int register_netdev(struct net_device *dev);
bzw. void unregister_netdev(struct net_device *dev);
an- und abgemeldet. Netzwerktreiber benötigen keine Major- und Minor-Nummern, sondern fügen eine Datenstruktur für jedes neue Interface in eine globale Liste von Netzwerkgeräten ein. Jedes Interface wird durch ein struct net_device
beschrieben. Die Struktur beschreiben wir hier nicht, da sie sehr groß ist. Wer Interesse hat, kann sie sich in <linux/netdevices.h>
anschauen.init
-Funktion erfolgen. I/O-Ports und Interrupt Lines sollten jetzt noch nicht registriert werden, sondern erst, wenn das Device geöffnet wird. Das gilt insbesondere, wenn Interrupt Lines mit anderen Devices geteilt werden, um nicht jedes Mal aufgerufen zu werden, wenn ein anderes Device eine IRQ Line triggert.dev
-Struktur füllen, was immer zur Laufzeit geschieht. Bei char und block devices werden die Strukturen zur Compilezeit gefüllt.init
mit der Adresse der probe
-Funktion belegt werden. Diese Funktion wird während der Abarbeitung von register_netdev
vom Kernel aufgerufen. Die probe
-Funktion hat die Aufgabe, die eigentliche Hardwareerkennung durchzuführen. Außerdem werden in dieser Funktion - falls noch nicht geschehen - die Funktionspointer der übrigen Treiberfunktionen (z.B. open, close
) in die Struktur struct net_device
eingetragen. Da die Struktur ebenso noch protokollspezifische Felder enthält, die initialisiert werden müssen, bietet der Betriebssystemkern Funktionen dafür an. Im Falle einer
Ethernet-Karte wird beispielsweise die Funktion ether_setup
aufgerufen.
ether_setup(dev);/*assign some of the fields */
dev->open =my_open;
dev->stop =my_release;
dev->set_config =my_config;
dev->hard_start_xmit =my_tx;
dev->do_ioctl =my_ioctl;
dev->get_stats =my_stats;
dev->rebuild_header =my_rebuild_header;
dev->hard_header =my_header;
#ifdef HAVE_TX_TIMEOUT
dev->tx_timeout =my_tx_timeout; /*Transmission Timeouts
dev->watchdog_timeo =timeout;
#endif
/*keep the default flags,just add NOARP */
dev->flags |=IFF_NOARP; /*ARP (Address Resolution Protocol) kann nicht benutzt werden
dev->hard_header_cache =NULL;/*Disable caching */
SET_MODULE_OWNER(dev);
Die Treiberfunktionen sind die folgenden:int (*open)(struct net_device *dev);
ifconfig
das Interface aktiviertint (*stop)(struct net_device *dev);
int (*hard_start_xmit)(struct sk_buff *skb,struct net_device *dev);
int (*hard_header)(struct sk_buff *skb,struct net_device *dev,unsigned short type,void *daddr,void *saddr, unsigned len);
int (*rebuild_header)(struct sk_buff *skb);
void (*tx_timeout)(struct net_device *dev);
struct net_device_stats *(*get_stats)(struct net_device *dev);
int (*set_config)(struct net_device *dev,struct ifmap *map);