文档介绍:网络驱动程序的介绍 1 Linux 网络设备驱动结构 2 Linux 网络设备驱动结构?网络协议接口层向网络层协议提供统一的数据包收发接口,通过 dev_queue_xmit() 函数发送数据,if_rx() 函数接收数据,这一层的存在使得上层协议独立于具体的设备。?网络设备接口层向协议接口层提供统一的用于描述具体网络设备属性和操_device ,该结构体是设备驱动功能层中各函数的容器。?_device 数据结构的具体成员, 是驱使网络设备硬件完成相应动作的程序,它通过 hard_start_xmit() 函数启动发送操作,并通过网络设备上的中断触发接收操作。?网络设备与媒介层是完成数据包发送和接收的物理实体,包括网络适配器和具体的传输媒介。 3 网络协议接口层?网络协议接口层最主要的功能是给上层协议提供了透明的数据包发送和接收接口,当上层协议需要发送数据包时,它将调用网络协议接口层的如下函数发送该数据包: dev_queue_xmit(struct sk_buff dev_queue_xmit(struct sk_buff * * skb); skb); if_rx(): if_rx(struct sk_buff if_rx(struct sk_buff * * skb); skb); sk_buff sk_buff 结构体用于在 Linux 网络子系统中的层之间传递数据,是 Linux 网络子系统数据传递的“中枢神经”。 4 sk_buff 结构体该结构包含如下重要成员: struct device *dev; // 处理该包的设备 sk_buff_data_t transport_header;/ / 传输层协议头 work_header;/ / 网络层协议头 sk_buff_data_t mac_header;/ / 链路层协议头 sk_buff_data_t *head; // 分配空间的开始 sk_buff_data_t *data; // 有效数据的开始 sk_buff_data_t *tail; // 有效数据的结束 sk_buff_data_t *end; // 分配空间的结束 sk_buff_data_t len ;//有效数据的长度 5 sk_buff 结构体:数据缓冲区指针 head,data,tail,end ? head 指针指向内存中已分配的用于承载网络数据的缓冲区的起始地址, sk_buff 和相关数据志在分配之后,该指针的值就被固定了。? data 指针则指向对应当前协议层有效数据的起始地址。 data 指针的值需随着当前拥有 sk_buff 的协议层的变化进行相应的移动。? tail 指针则指向对应当前协议层有效数据负载的结尾地址,与 data 指针对应。? end 指针指向内存中分配的数据缓冲区的结尾,与 head 指针对应, sk_buff 被分配之后, end 指针也被固定下来了。 6 sk_buff 结构体:数据缓冲区指针 head,data,tail,end ? head,data,tail,end 的关系: head data tail end 有效数据 sk_buff 对于传输层而言,用户数据和传输层协议头属于有效数据。对于网络层而言,用户数据,传输层协议头和网络层协议头是有效数据。对于数据链路层而言,用户数据, 传输层协议头,网络层协议头和链路层头部都属于有效数据。 len7 sk_buff 操作:分配,释放,指针移动?分配: struct sk_buff struct sk_buff * * alloc_skb(unsigned int len,int priority); alloc_skb(unsigned int len,int priority); struct sk_buff struct sk_buff * * dev_alloc_skb(unsigned int len); dev_alloc_skb(unsigned int len); alloc_skb() 函数分配一个 sk_buff 缓冲区,参数 len 为数据缓冲区的空间大小。参数 priority 为内存分配的优先级。分配成功后,因为还没有存放具体的网络数据包,所以 sk_buff 的 data ,tail 指针都指向存储空间的起始址 head ,而 len 的大小则为 0。?释放: void dev_kfree_skb(struct sk_buff, void dev_kfree_skb(struct sk_buff, * * skb); skb); dev_kfree_skb dev_kfree_skb ()函数用于释放 sk_buff 结构体。 8 sk_buff