1 / 26
文档名称:

网络驱动程序.ppt

格式:ppt   大小:376KB   页数:26页
下载后只包含 1 个 PPT 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

网络驱动程序.ppt

上传人:坐水行舟 2019/1/28 文件大小:376 KB

下载得到文件列表

网络驱动程序.ppt

文档介绍

文档介绍:网络驱动程序的介绍Linux网络设备驱动结构Linux网络设备驱动结构网络协议接口层向网络层协议提供统一的数据包收发接口,通过dev_queue_xmit()函数发送数据,if_rx()函数接收数据,这一层的存在使得上层协议独立于具体的设备。_device,该结构体是设备驱动功能层中各函数的容器。_device数据结构的具体成员,是驱使网络设备硬件完成相应动作的程序,它通过hard_start_xmit()函数启动发送操作,并通过网络设备上的中断触发接收操作。网络设备与媒介层是完成数据包发送和接收的物理实体,包括网络适配器和具体的传输媒介。网络协议接口层网络协议接口层最主要的功能是给上层协议提供了透明的数据包发送和接收接口,当上层协议需要发送数据包时,它将调用网络协议接口层的如下函数发送该数据包:dev_queue_xmit(structsk_buff*skb);if_rx():if_rx(structsk_buff*skb);sk_buff结构体用于在Linux网络子系统中的层之间传递数据,是Linux网络子系统数据传递的“中枢神经”。sk_buff结构体该结构包含如下重要成员:structdevice*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_tlen;//有效数据的长度sk_buff结构体:数据缓冲区指针head,data,tail,endhead指针指向内存中已分配的用于承载网络数据的缓冲区的起始地址,sk_buff和相关数据志在分配之后,该指针的值就被固定了。data指针则指向对应当前协议层有效数据的起始地址。data指针的值需随着当前拥有sk_buff的协议层的变化进行相应的移动。tail指针则指向对应当前协议层有效数据负载的结尾地址,与data指针对应。end指针指向内存中分配的数据缓冲区的结尾,与head指针对应,sk_buff被分配之后,end指针也被固定下来了。sk_buff结构体:数据缓冲区指针head,data,tail,endhead,data,tail,end的关系:headdatatailend有效数据sk_buff对于传输层而言,用户数据和传输层协议头属于有效数据。对于网络层而言,用户数据,传输层协议头和网络层协议头是有效数据。对于数据链路层而言,用户数据,传输层协议头,网络层协议头和链路层头部都属于有效数据。lensk_buff操作:分配,释放,指针移动分配:structsk_buff*alloc_skb(unsignedintlen,intpriority);structsk_buff*dev_alloc_skb(unsignedintlen);alloc_skb()函数分配一个sk_buff缓冲区,参数len为数据缓冲区的空间大小。参数priority为内存分配的优先级。分配成功后,因为还没有存放具体的网络数据包,所以sk_buff的data,tail指针都指向存储空间的起始址head,而len的大小则为0。释放: voiddev_kfree_skb(structsk_buff,*skb); dev_kfree_skb()函数用于释放sk_buff结构体。sk_buff操作:分配,释放,指针移动put操作:unsignedchar*skb_put(structsk_buff*skb,unsignedintlen);上述函数将tail指针往下移,增加sk_buff的len的值,并返回tail的当前值。主要用于在尾部添加数据。push操作unsignedchar*skb_push(structsk_buff*skb,unsignedintlen);push操作会将data指针上移,因此也需要增加sk_buff的len值,push操作在存储空间的头部增加一段可以存储网络数据包的空间,主要用于在数据包发送时添加头部。sk_buff操作:分配,释放,指针移动pull操作 unsignedchar*skb_bull(structsk_buff*skb,unsignedintlen); pull操作将data指针下移,并减少skb的len值,这个操作一般用于下层协议向上层协议移交数据包,使data指针指向上一层协议的协议头。reserve操作 voidskb_reserve(s