`
mmdev
  • 浏览: 12848568 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

LDD3学习笔记(20):网络驱动

 
阅读更多

#include<linux/netdevice.h>

定义structnet_devicestructnet_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_rxNAPI对等函数;它递交一个报文给内核.当一个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_putskb的尾部放置数据,skb_push放在开始.正常版本进行检查以确保有足够的空间;双下划线版本不进行检查.

intskb_headroom(structsk_buff*skb);

intskb_tailroom(structsk_buff*skb);

voidskb_reserve(structsk_buff*skb,intlen);

进行skb中的空间管理的函数.skb_headroomskb_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和安排下一个可用的

ethxdev->name,如果名子的第一个字符是一个空格或者NULL字符.

unsignedshorteth_type_trans(structsk_buff*skb,structnet_device*dev);

当一个以太网接口收到一个报文,这个函数被调用来设置skb->pkt_type.返回值是一个协议号,通常存储于skb->protocol.

#include<linux/sockios.h>

SIOCDEVPRIVATE

16ioctl命令,每个驱动可为它们自己的私有用途而实现.所有的网络ioctl命令都在sockios.h中定义.

#include<linux/mii.h>

structmii_if_info;

声明和一个结构,支持实现MII标准的设备的驱动.

#include<linux/ethtool.h>

structethtool_ops;

声明和结构,使得设备与ethtool工具一起工作.

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics