网络驱动程序详解.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
网络驱动程序的介绍 Linux网络设备驱动结构 Linux网络设备驱动结构 网络协议接口层 网络协议接口层最主要的功能是给上层协议提供了透明的数据包发送和接收接口,当上层协议需要发送数据包时,它将调用网络协议接口层的如下函数发送该数据包: dev_queue_xmit(struct sk_buff *skb); 上层对数据包的接收需要调用netif_rx(): int netif_rx(struct sk_buff *skb); sk_buff结构体用于在 Linux网络子系统中的层之间传递数据,是Linux网 络子系统数据传递的“中枢神经”。 sk_buff结构体 该结构包含如下重要成员: struct device *dev; //处理该包的设备 sk_buff_data_t transport_header;//传输层协议头 sk_buff_data_t network_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; //有效数据的长度 sk_buff结构体:数据缓冲区指针head,data,tail,end head指针指向内存中已分配的用于承载网络数据的缓冲区的起始地址,sk_buff和相关数据志在分配之后,该指针的值就被固定了。 data指针则指向对应当前协议层有效数据的起始地址。data指针的值需随着当前拥有sk_buff的协议层的变化进行相应的移动。 tail指针则指向对应当前协议层有效数据负载的结尾地址,与data指针对应。 end指针指向内存中分配的数据缓冲区的结尾,与head指针对应,sk_buff被分配之后,end指针也被固定下来了。 sk_buff结构体:数据缓冲区指针head,data,tail,end head,data,tail,end的关系: sk_buff 操作:分配,释放,指针移动 分配: struct sk_buff *alloc_skb(unsigned int len,int priority); struct sk_buff *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,*skb); dev_kfree_skb()函数用于释放sk_buff结构体。 sk_buff 操作:分配,释放,指针移动 put操作: unsigned char *skb_put(struct sk_buff *skb,unsigned int len); 上述函数将tail指针往下移,增加sk_buff的len的值,并返回tail的当 前值。主要用于在尾部添加数据。 push操作 unsigned char *skb_push(struct sk_buff *skb, unsigned int len); push操作会将data指针上移,因此也需要增加sk_buff的len值,push操作 在存储空间的头部增加一段可以存储网络数据包的空间,主要用于在数据 包发送时添加头部。 sk_buff 操作:分配,释放,指针移动 pull操作 unsigned char *skb_bull(struct sk_buff *skb,unsigned int len); pull操作将data指针下移,并减少skb的len值,这个操作一般用于下层协议向上层协议移交数据包,使data指针指向上一层协议的协议头。 reserve操作 void skb_reserve(struct sk_buff *skb,unsigned int len); reserve操作将data指针和tail指针同时下移,这个操作主要用于在存储空间的头部预留len长度的空隙。 UDP数据包接收的Linux处理流程:sk_buf的操作过程 假设以太网适配器收到一个UDP数据包,Linux从底层到应用层处理 这一数据包的流程如下: 网卡收到一个UDP包后,驱动程序需要创建一个sk

文档评论(0)

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

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

1亿VIP精品文档

相关文档