Linux网络设备驱动.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文档。上传文档
查看更多
网络设备驱动 网络层次模型 OSI 7层网络模型? TCP/IP网络层次结构? 网络协议层次模型 网络协议结构图 网络设备的特点 将接口注册到内核中,供内核在需要时调用 没有设备文件(没有read,write等调用) 异步接收数据,需要将数据推送给内核 驱动和协议相互独立 需要支持设置网络地址, 修改发送参数, 以及维护流量和错误统计等操作 网络设备驱动体系结构 net_device结构 分配 #include linux/netdevice.h struct net_device *alloc_netdev(int sizeof_priv, const char *name, void (*setup)(struct net_device *)); sizeof_priv :私有数据区的大小 name:接口名(如eth0等) setup:初始化函数的指针, 用来设置 net_device 结构的剩余部分(snull的net_device初始化函数分析) 如: snull_devs[0] = alloc_netdev(sizeof(struct snull_priv), sn%d, snull_init); 对于以太网,可以简化为: #include linux/etherdevice.h struct net_device *alloc_etherdev(int sizeof_priv); 默认使用eth%d 作为name参数. ether_setup()为初始化函数。 释放 void free_netdev(struct net_device *dev); 网络设备的注册和注销 int register_netdev(struct net_device *dev); void unregister_netdev(struct net_device *dev); 网络接口的打开和关闭(1) open和close接口由ifconfig调用 open时所做的处理: -申请必要的资源(中断、I/O地址空间等) -设置硬件地址(MAC地址) 启动发送队列 void netif_start_queue(struct net_device *dev); 网络接口的打开和关闭(2) close所做的处理: -释放所申请到的资源 -停止发送队列 -void netif_stop_queue(struct net_device *dev); 数据包的发送 sk_buff结构 #include linux/skbuff.h 包含要发送的数据包 sk_buff的分配和释放 struct sk_buff *dev_alloc_skb(unsigned int len); (使用GFP_ATOMIC标志调用kmalloc,可以在中断处理函数中使用) void dev_kfree_skb(struct sk_buff *skb); 发送队列的操作 发送函数 hard_start_stransmit() 停止发送 netif_stop_queue(struct net_device *dev); 重启发送 netif_wake_queue(struct net_device *dev); 完全停止发送 void netif_tx_disable(struct net_device *dev); (确保返回时没有数据包在发送 ) 接收数据包流程 中断方式 分配一个缓存区来保存报文(dev_alloc_skb) 调用 memcpy将报文数据拷贝到缓存区 更新数据包统计计数 调用netif_rx将 skb提交给上层 中断处理函数 通过网卡中的中断状态寄存器判断是接收还是发送中断,或是错误指示、状态改变等 snull中断处理函数分析 * * *

文档评论(0)

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

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

1亿VIP精品文档

相关文档