支持 UDP 分段卸载中的 NVGRE (USO)

NDIS 6.85 引入了 使用泛型路由封装 (NVGRE) 的网络虚拟化 ,其中 UDP 分段卸载 (USO) 。 NDIS 微型端口、协议和筛选器驱动程序以及执行 USO 的 NIC 应支持 NVGRE 和 VXLAN 封装。

注意:本文假定你熟悉 UDP 分段卸载 (USO) 中的信息。

如果 NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFOIsEncapsulatedPacketTRUEUdpSegmentationOffloadInfo 带外 (OOB) 信息有效,需要 NVGRE 和 VXLAN 支持。 NIC 必须在具有以下条件的 NVGRE/VXLAN 封装数据包上执行 USO 卸载:

若要在 USO 中支持 NVGRE,协议和筛选器驱动程序必须:

NIC 和微型端口驱动程序可以使用在 NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO 结构中提供的 InnerFrameOffsetTransportIpHeaderRelativeOffsetTcpHeaderRelativeOffset 值。 NIC 或微型端口驱动程序可能会对隧道 (外部) IP 标头或后续标头执行任何所需的标头检查,以验证这些偏移量。

微型端口驱动程序必须处理 NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO的情况。InnerFrameOffset 可能与数据包的开头位于不同的散点-收集列表中。 协议驱动程序将保证 (ETH、IP、GRE/VXLAN) 的所有附加封装标头在物理上是连续的,并且将位于数据包的第一个 MDL 中。

NDIS_OFFLOAD功能中设置 UdpSegmentation.SubMssFinalSegmentSupported 时,协议和筛选器驱动程序不确保 UDP 有效负载总长度是减小的 MSS 值的倍数。 因此,具有 SubMssFinalSegmentSupported 的微型端口驱动程序和 NIC 必须更新隧道 (外部) IP 标头。 NIC 必须根据NDIS_UDP_SEGMENTATION_OFFLOAD_NET_BUFFER_LIST_INFO中减小的 MSS 值生成尽可能多的全大小段。传输OOB 信息。 每个 LSOv2 发送只能生成一个子 MSS 段。

微型端口驱动程序必须:

  • 计算隧道 (外部) IP 标头的校验和。
  • 为每个数据包递增隧道 (外部) IP 标头的 IP 标识 (IP ID) 值。 第一个数据包必须使用原始隧道 (外部) IP 标头中的 IP ID。
  • 递增每个数据包的内部) IP 标头 (传输的 IP ID。 第一个数据包必须使用原始传输 (内部) IP 标头中的 IP ID。
  • 计算 UDP 标头和传输 (内部) IP 标头的校验和。
  • 确保将完整的标头(包括封装隧道 (外部) 标头)添加到每个生成的数据包。

UDP 分段卸载 (USO)