virtio协议1.0 -- 网络设备

本文深入探讨了virtio网络设备的工作原理,包括其使用的虚拟以太网卡、 virtio_queue的配置、特征位的意义及其依赖关系。内容涵盖设备初始化流程、报文发送与接收的处理,以及控制队列的使用,如混杂模式、MAC过滤、VLAN过滤和Gratuitous ARP。同时详细解析了报文的校验和分片卸载功能,以及多队列模式下的接收调度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引子

  • 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)

    • 什么是Gratuitous ARP_weixin_33754065的博客-CSDN博客 

    • 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_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值