Network Devices (Slideshow)#
Module Initialization: Device Allocation#
struct net_device *alloc_netdev(
        int sizeof_priv, const char *name,
        void (*setup)(struct net_device *));
sizeof_priv: private driver data, both allocated alongside net device structure in one large chunkpriv = netdev_priv(dev);
name: can contain"%d"⟶ kernel inserts device numbersetup: setup function, see below
Helper funcion for ethernet devices:
#include <linux/etherdevice.h>
struct net_device *alloc_etherdev(int sizeof_priv);
Finally, deallocation on unload:
free_netdev(dev);
Module Initialization: Device Registration#
err = register_netdev(dev);
unregister_netdev(dev);
Device Methods#
int (*open)(struct net_device *dev);Called when activated by
ifconfig. Allocates resources like interrupts, initializes devince, …int (*stop)(struct net_device *dev);The reverse of
open()int (*hard_start_xmit) (struct sk_buff *skb, struct net_device *dev);Submits packet for transmission.
void (*tx_timeout)(struct net_device *dev);Called by networking layer above when it detects that a packet hasn’t completed.
int weight;int (*poll)(struct net_device *dev; int *quota);Used to mitigate interrupt load on high speed networks. Interrupts are off, and polling is used in stead. NAPI (“New API”).
int (*do_ioctl)(struct net_device *dev, struct ifreq *ifr, int cmd);Much like
ioctl()in character devices.(A lot more omitted)
Kernel Networking Layer Utilities#
void netif_start_queue(struct net_device *dev);Usually called by
open().void netif_stop_queue(struct net_device *dev);Stops a queue; usually called by the
stop()method, or in situations where the device sees no way of handling further packets.void netif_wake_queue(struct net_device *dev);Called when the device has room for more packets, and had stopped the queue before.
(A lot more omitted)