- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第11章1.网络设备驱动程序
协议栈层次对比 Linux 网络子系统的顶部是系统调用接口层。它为 用户空间的应用程序提供了一种访问内核网络子系 统的方法。位于其下面的是一个协议无关层,它提 供了一种通用方法来使用传输层协议。然后是具体 协议的实现,在Linux 中包括内嵌的协议TCP、 UDP,当然还有IP。然后是设备无关层,它提供了 协议与设备驱动通信的通用接口,最下面是设备驱 动程序。 为应用程序提供访问内核网络子系统的方法:Socket系统调用。 实现一组通用函数来访问各种不同的协议: 通过socket实现。Linux 中的socket 使用 struct sock来描述,这个结构包含了特定 socket 所需要的所有状态信息,还包括 socket 所使用的特定协议和在socket 上可 以执行的一些操作。 网络协议层用于实现各种具体的网络协 议,如: TCP、UDP 等。 设备无关接口将协议与各种网络设备驱动连接在一起。 这一层提供一组通用函数供底层网络设备驱动程序使 用,让它们可以对高层协议栈进行操作。首先,设备驱 动程序可能会通过调用register_netdevice 或 unregister_netdevice 在内核中进行注册或注销。调 用者首先填写net_device 结构,然后传递这个结构进 行注册。内核调用它的init 函数(如果定义了这种函 数),然后执行一组健全性检查,并将新设备添加到设 备列表中(内核中的活动设备链表)。 要从协议层向设备发送数据,需要使用 dev_queue_xmit 函数,这个函数对数据进行排 队,并交由底层设备驱动程序进行最终传输报文的 接收通常是使用netif_rx 执行的。当底层设备驱动 程序接收到一个报文(包含在所分配的sk_buff 中)时,就会通过调用netif_rx 将数据上传至设备 无关层,然后,这个函数通过netif_rx_schedule 将sk_buff 在上层协议队列中进行排队,供以后进 行处理。 网络体系结构的最底部是负责管理物理网络设备的设备驱动程序层。 每个网络接口都由一个net_device结构来描述, 该结构可使用如下内核函数动态分配: 1、struct net_device *alloc_netdev(int sizeof_priv, const char *mask, void (*setup)(struct net_device *)) sizeof_priv 私有数据区大小; mask:设备名; setup 初始化函数 2、struct net_device *alloc_etherdev(int sizeof_priv) 两个函数的关系? 结构net_device 的主要成员包括: char name[IFNAMSIZ] 设备名,如:eth%d unsigned long state 设备状态 unsigned long base_addr I/O 基地址 unsigned int irq 中断号 int (*init)(struct net_device *dev) 初始化函数。该函数在register_netdev时 被调用来完成对net_device 结构的初始化 和字符驱动一样, 网络设备也要声明能操作它 的函数。有些操作可以保留为NULL, 有的可 以通过ether_setup 来使用默认设置。网络 接口的设备方法可分为两组:基本的和可选 的,基本方法包括那些使用接口所必需的; 可选的方法实现更多高级的功能。 int (*open)(struct net_device *dev) 打开接口。ifconfig 激活时,接口将被打开。 int (*stop)(struct net_device *dev) 停止接口。该什么时候调用呢? int (*hard_start_xmit) (struct sk_buff *skb, struct net_device *dev) 数据发送函数。 int (*do_ioctl)(struct net_device *dev, struct ifreq *ifr, int cmd) 处理特定于接口的ioctl 命令 int (*set_mac_address)(struct net_device *dev, void *addr) 改变Mac地址的函数,需要硬件支持该功能 网络接口驱动的注册方式与字符驱动不同 之处在于它没有主次设备号,并使用如下 函数注册。 int register_netdev(struct net_device *dev) Linux内核中的每个网络数据包都由一个套接字缓冲区结构struct sk_buff 描述,即一个sk_buff结构就是一个包,指向sk_buff的指针通常
文档评论(0)