引子
- virtio network device 是一种虚拟以太网卡
- 迄今为止virtio支持的最复杂的设备(其他设备可挖掘的内容很多)
- 空缓冲区被提前放置在RX virtqueue中用于接收数据包,收包一个队列
- 发送的数据包被排队到TX virtqueue中以便按该顺序传输,发送一个队列
- 控制队列用于控制和高级过滤功能
Device ID
- 1
Virtqueues
- 队列分布布局
- 如果 VIRTIO_NET_F_MQ 没有协商,N = 1
- 如果 VIRTIO_NET_F_MQ 协商了,N = max_virtqueue_pairs
- VIRTIO_NET_F_CTRL_VQ 协商了,才会有 control queue
Feature bits
-
feature bit 说明
-
VIRTIO_NET_F_CSUM (0) 设备进行部分校验数据包。“checksum offload”是现代网卡的常见功能。
-
VIRTIO_NET_F_GUEST_CSUM (1) 驱动进行部分校验数据包。
-
VIRTIO_NET_F_CTRL_GUEST_OFFLOADS (2) 没有代码使用过,offload配置通道,好像和 XDP LRO/CSUM 相关。Control channel offloads reconfiguration support.Dynamic offload configuration。
-
VIRTIO_NET_F_MAC (5) 设备有指定的MAC
-
VIRTIO_NET_F_GUEST_TSO4 (7) 驱动支持TSOv4
-
VIRTIO_NET_F_GUEST_TSO6 (8) 驱动支持 TSOv6
-
VIRTIO_NET_F_GUEST_ECN (9) 驱动支持带有ECN 的 TSO
-
VIRTIO_NET_F_GUEST_UFO (10) 驱动支持 UFO.
VIRTIO_NET_F_HOST_TSO4 (11) 设备支持 TSOv4. -
VIRTIO_NET_F_HOST_TSO6 (12) 设备支持 TSOv6.
-
VIRTIO_NET_F_HOST_ECN (13) 设备支持有 ECN 的 TSO
-
VIRTIO_NET_F_HOST_UFO (14) 设备支持 UFO
-
VIRTIO_NET_F_MRG_RXBUF (15) 驱动支持 Merge Buffer
-
VIRTIO_NET_F_STATUS (16) 支持Configuration status 域,config change有关
-
-
VIRTIO_NET_F_CTRL_VQ (17) 支持Control queue
-
VIRTIO_NET_F_CTRL_RX (18) 支持 通过Control queue 设置 RX mode,如混杂模式,组播,广播等
-
-
VIRTIO_NET_F_CTRL_VLAN (19) Control queue 设置vlan过滤表
-
VIRTIO_NET_F_GUEST_ANNOUNCE(21) 驱动支持发送 gratuitous packets(Gratuitous ARP)
-
VIRTIO_NET_F_MQ(22) 设备支持多队列,并且RR方式接收报文
-
VIRTIO_NET_F_CTRL_MAC_ADDR(23) 支持通过Control Queue设置MAC地址
-
-
-
feature bit 依赖关系
-
VIRTIO_NET_F_GUEST_TSO4 需要 VIRTIO_NET_F_GUEST_CSUM.
-
VIRTIO_NET_F_GUEST_TSO6 需要 VIRTIO_NET_F_GUEST_CSUM.
-
VIRTIO_NET_F_GUEST_ECN 需要 VIRTIO_NET_F_GUEST_TSO4 或者 VIRTIO_NET_F_GUEST_TSO6.
-
VIRTIO_NET_F_GUEST_UFO 需要 VIRTIO_NET_F_GUEST_CSUM.
-
VIRTIO_NET_F_HOST_TSO4 需要 VIRTIO_NET_F_CSUM.
-
VIRTIO_NET_F_HOST_TSO6 需要 VIRTIO_NET_F_CSUM.
-
VIRTIO_NET_F_HOST_ECN 需要 VIRTIO_NET_F_HOST_TSO4 或VIRTIO_NET_F_HOST_TSO6
-
VIRTIO_NET_F_HOST_UFO 需要 VIRTIO_NET_F_CSUM.
VIRTIO_NET_F_CTRL_RX 需要 VIRTIO_NET_F_CTRL_VQ.
VIRTIO_NET_F_CTRL_VLAN 需要 VIRTIO_NET_F_CTRL_VQ.
VIRTIO_NET_F_GUEST_ANNOUNCE 需要 VIRTIO_NET_F_CTRL_VQ.
VIRTIO_NET_F_MQ 需要 VIRTIO_NET_F_CTRL_VQ.
VIRTIO_NET_F_CTRL_MAC_ADDR 需要 VIRTIO_NET_F_CTRL_VQ.
-
-
区别
-
VIRTIO_NET_F_GSO (6) 设备支持报文分片,但是在未来将会有多个bit描述这个功能,以便更加清晰
-
设备 configuration 布局
- 当前定义了三个driver-read-only 配置字段
- mac地址字段始终存在(但仅当设置了VIRTIO_NET_F_mac时有效),
- status仅当设置了VIRTIO_NET_F_status时才存在。
- 为状态字段定义了两个只读位(用于驱动程序):VIRTIO_NET_S_LINK_UP和VIRTIO_NET_S_ANNOUNCE
- 字段max_virtqueue_pairs仅在设置VIRTIO_NET_F_MQ时存在。此字段指定在协商VIRTIO_NET_F_MQ后可以配置的传输和接收VirtQueue(分别为receiveq1…receiveqN和transmitq1…transmitqN)的最大数量
- 驱动
- 如果设备有MAC,应该协商VIRTIO_NET_F_MAC
- 如果支持 VIRTIO_NET_F_MAC,驱动必须将NIC的指定的MAC到mac域。否则,它应该使用本地管理的MAC地址
- 如果驱动不支持VIRTIO_NET_F_