#include<linux/netdevice.h>
定义structnet_device和structnet_device_stats的头文件,包含了几个其他网络驱动需要的头
文件.
structnet_device*alloc_netdev(intsizeof_priv,char*name,void(*setup)(structnet_device*);
structnet_device*alloc_etherdev(intsizeof_priv);
voidfree_netdev(structnet_device*dev);
分配和释放net_device结构的函数
intregister_netdev(structnet_device*dev);
voidunregister_netdev(structnet_device*dev);
注册和注销一个网络设备.
void*netdev_priv(structnet_device*dev);
获取网络设备结构的驱动私有区域的指针的函数.
structnet_device_stats;
持有设备统计的结构.
netif_start_queue(structnet_device*dev);
netif_stop_queue(structnet_device*dev);
netif_wake_queue(structnet_device*dev);
控制传送给驱动来发送的报文的函数.没有报文被传送,直到netif_start_queue被调用.
netif_stop_queue挂起发送,netif_wake_queue重启队列并刺探网络层重启发送报文.
skb_shinfo(structsk_buff*skb);
宏定义,提供对报文缓存的"sharedinfo"部分的存取.
voidnetif_rx(structsk_buff*skb);
调用来通知内核一个报文已经收到并且封装到一个socket缓存中的函数.
voidnetif_rx_schedule(dev);
来告诉内核报文可用并且应当启动查询接口;它只是被NAPI兼容的驱动使用.
intnetif_receive_skb(structsk_buff*skb);
voidnetif_rx_complete(structnet_device*dev);
应当只被NAPI兼容的驱动使用.netif_receive_skb是对于netif_rx的NAPI对等函数;它递交一个报文给内核.当一个NAPI兼容的驱动已耗尽接收报文的供应,它应当重开中断,并且调用netif_rx_complete来停止查询.
#include<linux/if.h>
由netdevice.h包含,这个文件声明接口标志(IFF_宏定义)和structifmap,它在网络驱动的ioctl实现中有重要地位.
voidnetif_carrier_off(structnet_device*dev);
voidnetif_carrier_on(structnet_device*dev);
intnetif_carrier_ok(structnet_device*dev);
前2个函数可用来告知内核是否接口上有载波信号.netif_carrier_ok测试载波状态,如同在设备结构中反映的.
#include<linux/if_ether.h>
ETH_ALEN
ETH_P_IP
structethhdr;
由netdevice.h包含,if_ether.h定义所有的ETH_宏定义,用来代表字节长度(例如地址长度)以及网络协议(例如IP).它也定义ethhdr结构.
#include<linux/skbuff.h>
structsk_buff和相关结构的定义,以及几个操作缓存的内联函数.这个头文件由netdevice.h包含.
structsk_buff*alloc_skb(unsignedintlen,intpriority);
structsk_buff*dev_alloc_skb(unsignedintlen);
voidkfree_skb(structsk_buff*skb);
voiddev_kfree_skb(structsk_buff*skb);
voiddev_kfree_skb_irq(structsk_buff*skb);
voiddev_kfree_skb_any(structsk_buff*skb);
处理socket缓存的分配和释放的函数.通常驱动应当使用dev_变体,其意图就是此目的.
unsignedchar*skb_put(structsk_buff*skb,intlen);
unsignedchar*__skb_put(structsk_buff*skb,intlen);
unsignedchar*skb_push(structsk_buff*skb,intlen);
unsignedchar*__skb_push(structsk_buff*skb,intlen);
添加数据到一个skb的函数;skb_put在skb的尾部放置数据,而skb_push放在开始.正常版本进行检查以确保有足够的空间;双下划线版本不进行检查.
intskb_headroom(structsk_buff*skb);
intskb_tailroom(structsk_buff*skb);
voidskb_reserve(structsk_buff*skb,intlen);
进行skb中的空间管理的函数.skb_headroom和skb_tailroom说明在开始和结尾分别有多少空间可用.skb_reserve可用来保留空间,在一个必须为空的skb开始.
unsignedchar*skb_pull(structsk_buff*skb,intlen);
skb_pull"去除"数据从一个skb,通过调整内部指针.
intskb_is_nonlinear(structsk_buff*skb);
如果这个skb是为发散/汇聚I/O分隔为几个片,函数返回一个真值.
intskb_headlen(structsk_buff*skb);
返回skb的第一个片的长度,由skb->data指向.
void*kmap_skb_frag(skb_frag_t*frag);
voidkunmap_skb_frag(void*vaddr);
提供对非线性skb中的片直接存取的函数.
#include<linux/etherdevice.h>
voidether_setup(structnet_device*dev);
为以太网驱动设置大部分方法为通用实现的函数.它还设置dev->flags和安排下一个可用的
ethx给dev->name,如果名子的第一个字符是一个空格或者NULL字符.
unsignedshorteth_type_trans(structsk_buff*skb,structnet_device*dev);
当一个以太网接口收到一个报文,这个函数被调用来设置skb->pkt_type.返回值是一个协议号,通常存储于skb->protocol.
#include<linux/sockios.h>
SIOCDEVPRIVATE
前16个ioctl命令,每个驱动可为它们自己的私有用途而实现.所有的网络ioctl命令都在sockios.h中定义.
#include<linux/mii.h>
structmii_if_info;
声明和一个结构,支持实现MII标准的设备的驱动.
#include<linux/ethtool.h>
structethtool_ops;
声明和结构,使得设备与ethtool工具一起工作.