Linux网络设备驱动程序培训教材(共29页).ppt_第1页
Linux网络设备驱动程序培训教材(共29页).ppt_第2页
Linux网络设备驱动程序培训教材(共29页).ppt_第3页
Linux网络设备驱动程序培训教材(共29页).ppt_第4页
Linux网络设备驱动程序培训教材(共29页).ppt_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 Linux网络设备驱动程序网络设备驱动程序 第9章本章目标本章目标 了解Linux网络驱动程序的数据交换过程 掌握移植和编写具体网卡驱动程序的方法 本章结构本章结构Linux网络设备驱动程序网络设备驱动程序Linux网络设备驱动的结构网络设备驱动的结构 网络设备的注册、注销和初始化网络设备的注册、注销和初始化 网络设备的翻开和释放网络设备的翻开和释放 数据包发送数据包发送 数据包接收数据包接收 网络连接状态网络连接状态 参数设置和统计数据参数设置和统计数据 Linux网络设备简介网络设备简介 网络设备,又叫网络接口是Linux第三类标准设备 网络设备和块设备类似,在内核的特定数据结构中注册自

2、己 当发生网络数据交换时,网络设备驱动程序注册的方法将被内核调用 网络设备不会在/dev下存在一个设备入口,它使用保存的内部设备名网络设备的特点网络设备的特点 网络设备异步的接收外来的数据包,有别于其他设备 网络设备主动的“请求将硬件获得的数据包压入内核,而其他设备例如块设备被“请求向内核发送缓冲区 网络设备同时要执行大量的管理任务 设置地址 修改传输参数 维护流量和流量控制 错误统计和报告网络设备的特点网络设备的特点 网络子系统是完全与协议无关的, 网络驱动程序与内核其余局部之间的每次交互处理的都是一个网络数据包9.1 Linux网络设备驱动的结构网络设备驱动的结构89.1.1 网络协议接口

3、层网络协议接口层 最主要的功能是给上层协议提供了透明的数据包发送最主要的功能是给上层协议提供了透明的数据包发送和接收接口。和接收接口。 上层上层ARP或或IP协议需要发送数据包时,调用网络协议协议需要发送数据包时,调用网络协议接口层的接口层的dev_queue_xmit()函数函数 上层对数据包的接收也通过向上层对数据包的接收也通过向netif_rx()函数函数:dev_queue_xmit(struct sk_buff *skb); int netif_rx(struct sk_buff *skb);9.1.1 网络协议接口层网络协议接口层套接字缓冲区套接字缓冲区(sk_buff)结构结构套

4、接字缓冲区套接字缓冲区sk_buff结构是结构是Linux内核网络子内核网络子系统的核心内容,在系统的核心内容,在中被定义中被定义sk_buff结构中的重要字段结构中的重要字段:struct net_device *rx_dev; struct net_device *dev;union /* . */ h;union /* . . . */ nh;union /*. */ mac;unsigned char *head;unsigned char *data;unsigned char *tail;unsigned char *end;unsigned long len;unsigned c

5、har ip_summed;unsigned char pkt_type分别为接收和发送缓冲区的设备分别为接收和发送缓冲区的设备指向数据包中各个层的数据包头。指向数据包中各个层的数据包头。h指向传指向传输层包头,输层包头,nh指向网络层包头,指向网络层包头,mac指向指向链路层包头链路层包头用来寻址数据包中的数据指针。用来寻址数据包中的数据指针。head指向指向已分配空间开头,已分配空间开头,data指向有效的指向有效的octet开开头,头,tail指向有效的指向有效的octet结尾,而结尾,而end指向指向tail可以到达的最大地址可以到达的最大地址P A C K E T _ H O S T

6、 PACKET_BROADCAST PACKET_MULTICASTPACKET_OTHERHOST109.1.1 网络协议接口层网络协议接口层struct sk_buff *alloc_skb(unsigned int len, int priority);struct sk_buff *dev_alloc_skb(unsigned int len);void kfree_skb(struct sk_buff *skb);void dev_kfree_skb(struct sk_buff *skb);unsigned char *skb_put(struct sk_buff *skb, in

7、t len);unsigned char *_ _skb_put(struct sk_buff *skb, int len);在缓冲区末尾添加数据,前在缓冲区末尾添加数据,前一个函数会进行检查一个函数会进行检查释放套接字缓冲区释放套接字缓冲区分配套接字缓冲区分配套接字缓冲区119.1.1 网络协议接口层网络协议接口层unsigned char *skb_push(struct sk_buff *skb, int len);unsigned char *_ _skb_push(struct sk_buff *skb, int len);缓冲区头部添加数据缓冲区头部添加数据int skb_tail

8、room(struct sk_buff *skb);void skb_reserve(struct sk_buff *skb, int len);unsigned char *skb_pull(struct sk_buff *skb, int len);int skb_headroom(struct sk_buff *skb);返回缓冲区后部可用空间总量返回缓冲区后部可用空间总量返回缓冲区前面局部可用空间总量返回缓冲区前面局部可用空间总量在可填充缓冲区之前保存包头空间在可填充缓冲区之前保存包头空间从数据包头拿出数据,通常用来剥离数据包头从数据包头拿出数据,通常用来剥离数据包头129.1.2 网

9、络设备接口层网络设备接口层 net_device 结构结构该结构是网络设备驱动的核心,它包含了许多成员。可以参考文件,阅读它的完整定义。net_device结构可分为 全局成员 硬件相关成员 接口相关成员 设备方法成员 公用成员9.1.2 网络设备接口层网络设备接口层net_device 结构的主要成员结构的主要成员全局信息全局信息 char nameIFNAMESIZ int (*init)(struct net_device *dev)硬件信息硬件信息 unsigned long rmem_end; unsigned long rmem_start; unsigned long mem_e

10、nd; unsigned long mem_start; unsigned long base_addr; unsigned char irq; unsigned char if_port; unsigned char dma;如果被设置了,在register_netdev奖调用他初始化net_device结构,现代驱动一般在注册接口中完成初始化。这些字段描述了设备共享内存的这些字段描述了设备共享内存的起止地址起止地址描述设备的描述设备的I/O基地址基地址描述设备中断号描述设备中断号描述多端口设备的活动端口描述多端口设备的活动端口描述设备的描述设备的DMA通道通道9.1.2 网络设备接口层网络

11、设备接口层 接口信息int (*open)(struct net_device *dev);int (*stop)(struct net_device *dev);int (*hard_start_xmit) (struct sk_buff *skb, struct net_device *dev);int (*hard_header) (struct sk_buff *skb, struct net_device *dev, unsigned short type, void *daddr, void *saddr, unsigned len);翻开接口。当翻开接口。当ifconfig激活网

12、络设备时,激活网络设备时,接口被翻开。通常我们在接口被翻开。通常我们在open方法里方法里面完成资源的分配,包括面完成资源的分配,包括I/O映射、中映射、中断注册、断注册、DMA注册等。同时激活硬件,注册等。同时激活硬件,并增加使用计数并增加使用计数停止接口。在这个方法里面,我们完停止接口。在这个方法里面,我们完成与成与open方法相反的,注销操作方法相反的,注销操作该方法初始化数据包的传输。是网络设备驱动中非常重要的一个方法。我们将该方法初始化数据包的传输。是网络设备驱动中非常重要的一个方法。我们将完整的数据包放入一个套接字缓冲区完整的数据包放入一个套接字缓冲区sk_buff结构里结构里根据

13、先前检索到的源和目的硬件地址建立硬件头根据先前检索到的源和目的硬件地址建立硬件头9.1.2 网络设备接口层网络设备接口层int (*rebuild_header)(struct sk_buff *skb);void (*tx_timeout)(struct net_device *dev);struct net_device_stats *(*get_stats)(struct net_device *dev);int (*set_config)(struct net_device *dev, struct ifmap *map);int (*do_ioctl)(struct net_devi

14、ce *dev, struct ifreq *ifr, int cmd);void (*set_multicast_list)(struct net_device *dev);用来在传输数据包之前重建硬件头用来在传输数据包之前重建硬件头数据包发送在超时时间内失败,这时数据包发送在超时时间内失败,这时该方法被调用。这个方法应该解决失该方法被调用。这个方法应该解决失败的问题并重新开始发送数据包败的问题并重新开始发送数据包当应用程序需要获得接口的统计信息时,这个方法被调用当应用程序需要获得接口的统计信息时,这个方法被调用改变接口的配置。比方改变改变接口的配置。比方改变I/O端口和中断号端口和中断号等

15、,现在的驱动程序通常无需该方法等,现在的驱动程序通常无需该方法实现设备自定义的实现设备自定义的ioctl命令命令当设备的组播列表改变或设备当设备的组播列表改变或设备标志改变时,该方法被调用标志改变时,该方法被调用9.1.2 网络设备接口层网络设备接口层int (*set_mac_address)(struct net_device *dev, void *addr);int (*change_mtu)(struct net_device *dev, int new_mtu);int (*header_cache) (struct neighbour *neigh, struct hh_cach

16、e *hh);int (*hard_header_parse) (struct sk_buff *skb, unsigned char *haddr);int (*header_cache_update) (struct hh_cache *hh, struct net_device *dev, unsigned char *haddr);如果接口支持如果接口支持MAC地址改地址改变,那么可以实现该函数变,那么可以实现该函数当接口的当接口的MTU改变时,改变时,该方法将被调用,负责该方法将被调用,负责做出相应的特定处理做出相应的特定处理根据根据ARP查询的结果填充查询的结果填充hh_cache

17、结构结构在发生变化时,该方法更新在发生变化时,该方法更新hh_cache结构中的目的地址结构中的目的地址从从skb中包含的数据包中获得源地址,并中包含的数据包中获得源地址,并将其复制到位于将其复制到位于haddr的缓冲区中的缓冲区中9.2.1 网络设备的注册、注销网络设备的注册、注销注册与注销函数注册与注销函数创立创立net_device 释放释放net_device int register_netdev(struct net_device *dev);void unregister_netdev(struct net_device *dev);struct net_device *allo

18、c_netdev(int sizeof_priv, const char *name, void (*setup)(struct net_device*); struct net_device *alloc_etherdev(int sizeof_priv); void free_netdev(struct net_device *dev);189.2.1 网络设备的注册、注销网络设备的注册、注销1 int xxx_init_module(void)2 3 4 /*分配net_device结构体并对其成员赋值*/5 xxx_dev = alloc_netdev(sizeof(struct xx

19、x_priv),“sn%d, xxx_init);6if(xxx_dev = NULL)7/*分配net_device失败*/89/*注册net_device结构体*/10if(result = register_netdev(xxx_dev)1112 1314 void xxx_cleanup(void)15 1617/*注销net_device结构体*/18 unregister_netdev(xxx_dev);19 /*释放net_device结构体*/20 free_netdev(xxx_dev);21 199.3 网络设备的翻开和释放网络设备的翻开和释放 网络设备的翻开函数完成如下工

20、作: 使能设备使用的硬件资源,申请I/O区域、中断和DMA通道等。 调用Linux内核提供的netif_start_queue()函数,激活设备发送队列。 网络设备的关闭函数需要完成如下工作: 调用Linux内核提供的netif_stop_queue()函数,停止设备传输包。 释放设备所使用的I/O区域、中断和DMA资源。 netif_start_queue()和netif_stop_queue()两个函数的原型void netif_start_queue(struct net_device *dev);void netif_stop_queue(struct net_device *dev)

21、;9.3 网络设备的翻开和释放网络设备的翻开和释放int xxx_open(struct net_device *dev) /*申请端口、IRQ等,类似于fops-open */ ret = request_irq(dev-irq, &xxx_interrupt, 0, dev-name, dev); netif_start_queue(dev); int xxx_release(struct net_device *dev) /*释放端口、IRQ等,类似于fops-close*/ free_irq(dev-irq, dev); netif_stop_queue(dev); /*can

22、t transmit any more*/ 219.4 数据包发送数据包发送 网络设备驱动完成数据包发送的流程如下: 网络设备驱动程序从上层协议传递过来的sk_buff参数获得数据包的有效数据和长度,将有效数据放入临时缓冲区。 对于以太网,如果有效数据的长度小于以太网冲突检测所要求数据帧的最小长度ETH_ZLEN,那么给临时缓冲区的末尾填充0。 设置硬件的存放器,驱使网络设备进行数据发送操作。9.4 数据包发送数据包发送1 int xxx_tx(struct sk_buff *skb, struct net_device *dev)2 3 int len;4 char *data, short

23、ktETH_ZLEN;5 /*获得有效数据指针和长度*/6 data = skb-data;7 len = skb-len;8 if(len data, skb-len);13 len = ETH_ZLEN;14data = shortpkt;15 17dev-trans_start = jiffies; /*记录发送时间戳*/ 19 /*设置硬件存放器让硬件把数据包发送出去*20 xxx_hw_tx(data, len, dev);21 22 239.4 数据包发送数据包发送 传输超时处理传输超时处理当数据传输超时时,意味着当前的发送操作失败,此时,数据包发送超时处理函数xxx_tx_tim

24、eout将被调用。这个函数需要调用Linux内核提供的netif_wake_queue()函数重新启动设备发送队列。如下所示:1void xxx_tx_timeout(struct net_device *dev)234netif_ wake_queue(dev);/*重新启动设备发送队列重新启动设备发送队列*/59.5 数据包接收数据包接收网络设备接收数据的主要方法是由中断引发设备的中断处理函数,中断处理函数判断中断类型,如果为接收中断,那么读取接收到的数据,分配sk_buffer数据结构和数据缓冲区将接收到的数据复制到数据缓冲区,并调用netif_rx()函数将sk_buffer传递给上层

25、协议。 259.5 数据包接收数据包接收static void xxx_interrupt(int irq, void *dev_id, struct pt_regs *regs) switch(status & ISQ_EVENT_MASK) case ISQ_RECEIVER_EVENT:/*获取数据包*/xxx_rx(dev);break;/*其他类型的中断*/ static void xxx_rx(struct xxx_device *dev)length = get_rev_len();/*分配新的套接字缓冲区*/skb = dev_alloc_skb(length + 2)

26、;skb = reserve(skb, 2); /*对齐*/skb-dev = dev;/*读取硬件上接收到的数据*/insw(ioaddr + RX_FRAME_PORT, skb_put(skb, length), length 1);if(length & l) skb-datalength 1 = inw(ioaddr + RX_FRAME_PORT); /*获取上层协议类型*/skb-protocol = eth_type_trans(skb, dev);netif_rx(skb) ; /*把数据包交给上层把数据包交给上层*/dev-last_rx = jiffies ; /*记录接收时间戳记录接收时间戳*/.269.6 网络连接状态网络连接状态 网络适配器硬件电路可以检测出链路上是否有载波,载波反映了网络的连接是否正常。 网络设备驱动可以通过如下函

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论