IGB网卡工作原理

主要涉及Intel IGB 网卡接收/发送数据包的原理

IGB网卡

IGB网卡包含I210, I211, I350等千兆网卡, 用于替代老旧的e1000, e1000e网卡

接收

接收路径主要关注3个点

网卡硬件数据包buffer(数据包FIFO), 网卡硬件接收描述符队列, 主机接收描述符队列(Ring buffer)

网卡收到包之后会将数据包放入数据包buffer
然后获取一个可用的接收描述符, 接收描述符里有一个映射后的DMA地址, 网卡将数据包通过DMA传输到指定地址处

这样就完成了数据包从网卡数据包buffer传递到主机内存的整个操作

有些网卡的数据包buffer是一个FIFO, 即可以存放多个数据包(比如ixgbe网卡), 但一般都只是一个临时存放处(igb网卡很可能是)

放到网卡硬件数据包buffer里之后网卡就会从网卡接收描述符队列中取足够数量的接收描述符,获取的接收描述符的数量取决于接收到的数据包的大小以及接收描述符指向的buffer大小

比如每个接收描述符指向的buffer大小为2KB, 接收到的数据包长度是8KB, 则需要4个接收描述符才能完整接收此数据包

主机接收描述符队列和网卡的硬件接收描述符队列的结类似 但是由于其占用主机内存, 所以数量上可以有很多个(最大数量取决于网卡的接收描述符长度寄存器, 这个用于描述主机内存里的接收描述符队列长度)

这个队列里的每个元素不是数据包, 而是接收描述符, 接收描述符里有指向数据包buffer的指针
接收描述符里还有一些描述数据包的字段

主机接收描述符队列由网卡的一些寄存器描述
RDT和RDH表示头指针和尾指针, 头指针被硬件使用, 尾指针被软件使用

当软件处理了尾指针后面的接收描述符后, 将内存地址映射成DMA地址然后写入尾指针后面的接收描述符, 并将尾指针向后移动

当硬件拷贝数据包到当前头指针指向的接收描述符里的DMA地址并且回写一些控制信息后, 头指针向后移动

到达接收描述符队列的队列尾之后又绕回队列头, 形成环形队列

To be continue

发送

发送和接收类似, 逆过程而已