5. 发送与接收数据包
数据包的发送:
图5-1 发送数据包的结构图及相互关系
根据发送队列数num_tx_queues建立相应的发送缓冲区结构e1000_tx_ring,在该结构中有描述该区域的指向e1000_tx_desc结构的desc,该缓冲区指向的dma总线地址,用于接收硬件传送来的用e1000_buffer结构描述的缓冲块数组buffer_info[],另外的几个参数则主要用于描述这些缓冲块,其中count表示缓冲块的个数,next_to_use和next_to_clean主要描述缓冲块的使用状态,如已经接收接收了数据的位置及准备接收的位置,当有新的数据包要发送时,首先由上层协议调用e1000_xmit_frame(),在该函数中接着调用e1000_tx_queue()根据相应的参数找到缓冲块存放,缓冲块的初始化则由函数e1000_tx_map()实现。buffer_info指向的环形缓冲块区域主要用来接收总线地址映射来的数据包,所有的缓冲块用next_to_match连接成一个环,每个缓冲块用结构体e1000_buffer表示,在该结构中,skb存放数据包的内容,dma表示该数据包所在的总线地址。此处使用函数pci_map_single()进行流式映射,的映射方向为PCI_DMA_TODEVICE,控制总线会把虚拟地址空间所指内容映射到总线地址,然后将该内容由网卡传送出去。发送数据包的相关结构图及相互关系如图5-1所示。
e1000_tx_ring结构中的desc所指向的buffer_addr记录了每次发送的缓冲块所映射的总线地址,即buffer_addr记录的是总线地址。而desc本是一个虚拟地址,该虚拟地址是通过pci_alloc_consistent()映射的发送缓冲区的地址,其与DMA缓冲区中的一段总线地址相对应,该总线地址由e1000_tx_ring结构中的dma成员保存,这种映射关系在对开启网卡时就实现了,其与在发送数据包时映射的总线地址有区别,后者是在发送时动态进行的。
数据包的接收
图5-2 接收数据包的结构图及相互关系