26Linux网络设备驱动的体系结构.pptVIP

  1. 1、本文档共37页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
26Linux网络设备驱动的体系结构

Linux网络设备驱动的结构 大 纲 Linux网络设备驱动结构概述 网络协议接口层 网络设备接口层 设备驱动功能层 网络设备与媒介层 大 纲 Linux网络设备驱动结构概述 网络协议接口层 网络设备接口层 设备驱动功能层 网络设备与媒介层 Linux网络设备驱动结构概述 Linux网络设备驱动层次结构为: 网络协议接口层 网络设备接口层 设备驱动功能层 网络设备与媒介层 大 纲 Linux网络设备驱动结构概述 网络协议接口层 网络设备接口层 设备驱动功能层 网络设备与媒介层 网络协议接口层 主要功能 给上层协议提供统一的数据包收发接口,无论上层是ARP协议还是IP协议,都通过dev_queue_xmit()函数发送数据,通过netif_rx()函数接收数据。此层使上层协议独立于具体的设备。 为网络驱动提供一系列netif开头的函数 网络协议接口层 激活设备发送队列 void netif_start_queue(struct net_device *dev) 停止设备传输包 void netif_stop_queue(struct net_device *dev) 重新启动设备发送队列 void netif_awake_queue(struct net_device *dev) 网络协议接口层 相关数据结构sk_buff sk_buff称为“套接字缓冲区”,用于在Linux网络子系统中各层之间传递数据。是Linux网络子系统数据传递的“中枢神经”。 sk_buff定义位置为:include/linux/skbuff.h 网络协议接口层 sk_buff中的各协议头 传输层协议头 网络协议接口层 sk_buff中的各协议头 网络层协议头 网络协议接口层 sk_buff中的各协议头 数据链路层帧头 网络协议接口层 sk_buff中的数据缓冲区的指针 Linux必须分配用于容纳数据包的缓冲区,sk_buff中定义了4个指向这片缓冲区的不同位置的指针head、data、tail、end。 head:指针指向内存中已分配的用于存储网路数据的缓冲区起始地址,sk_buff和相关数据块在分配后,该指针的值就固定了。 网络协议接口层 sk_buff中的数据缓冲区的指针 data:指针指向对应当前协议层有效数据的起始地址。每个协议的有效数据含义不同。 tail:指向对应当前协议层有效数据负载的结尾地址,与data对应。 end:指向内存分配的数据缓冲区的结尾地址,与head指针对应。和head一样,sk_buff和相关数据块被分配后,end指针也就固定了。 网络协议接口层 sk_buff中的数据缓冲区的指针 网络协议接口层 套接字缓冲区sk_buff相关操作 分配: struct sk_buff *dev_alloc_skb(unsigned len) 释放: dev_kfree_skb(struct sk_buff *skb) dev_kfree_skb_irq(struct sk_buff *skb) dev_kfree_skb_any(struct sk_buff *skb) 网络协议接口层 套接字缓冲区sk_buff相关操作 put操作: unsigned char *skb_put(struct sk_buff *skb, unsigned int len); unsigned char *__skb_put(struct sk_buff *skb, unsigned int len); 作用:tail指针下移len长度,并增加sk_buff中len的值,返回改变后的tail值。主要用于在尾部追加数据。 网络协议接口层 套接字缓冲区sk_buff相关操作 push操作: unsigned char *skb_push(struct sk_buff *skb, unsigned int len); unsigned char *__skb_push(struct sk_buff *skb, unsigned int len); 作用:将data指针上移,同时增加sk_buff中的len。主要用于在数据包发送时添加头部。函数带__和不带__的区别在于:带__的会检测放入缓冲区的数据,后则不会。 网络协议接口层 套接字缓冲区sk_buff相关操作 pull操作: unsigned char *skb_pull(struct sk_buff *skb, unsigned int len); 作用:将data指针下移,并减少sk_buff中的len值。这个操作一般用于下层协议向上层协议移交数据包,使data指针指向上一层协议的协议头。 网络协议接口层 套接字缓冲区sk_buff相关操作 reserve操作:

文档评论(0)

yan698698 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档