在大规模发送卸载 (LSO) 中支持 NVGRE
NDIS 6.30 (Windows Server 2012) 引入了使用通用路由封装 (NVGRE) 的网络虚拟化。 执行大型发送卸载 (LSO) 版本 2 (LSOV2) 的 NDIS 微型端口、协议和筛选器驱动程序和 NIC 应以支持 NVGRE 的方式执行此操作。
注意 本页假定你熟悉 卸载大型 TCP 数据包分段中的信息。
如果 NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO。IsEncapsulatedPacket 为 TRUE , 并且 TcpIpChecksumNetBufferListInfo 带外 (OOB) 信息有效,这表明需要 NVGRE 支持,并且 NIC 必须在 NVGRE 格式的数据包上执行 LSOV2 卸载,但条件如下:
- 仅 NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO中的值。LsoV2Transmit 结构有效。 NIC 和微型端口驱动程序不得引用 NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO中的值。LsoV1Transmit 结构。
- NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO。LsoV2Transmit。TcpHeaderOffset 成员没有正确的偏移值,NIC 或微型端口驱动程序不得使用。
若要在 LSOV2 中支持 NVGRE,协议和筛选器驱动程序必须进行以下更改:
- 减少NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO中的 MSS 值。用于解释新 GRE 标头的 LsoV2Transmit 结构。
- 发送一个 TCP 有效负载长度,该长度可能不是减小的 MSS 值的确切倍数。
- 调整 NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO 结构中的 InnerFrameOffset、TransportIpHeaderRelativeOffset 和 TcpHeaderRelativeOffset 值,以考虑 GRE 标头。
NIC 和微型端口驱动程序可以使用在 NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO 结构中提供的 InnerFrameOffset、TransportIpHeaderRelativeOffset 和 TcpHeaderRelativeOffset 值。 NIC 或微型端口驱动程序可能会对隧道 (外部) IP 标头或后续标头执行任何所需的标头检查,以验证这些偏移量。
微型端口驱动程序必须处理 NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO的情况。InnerFrameOffset 可能与数据包开头位于不同的散点集合列表中。 协议驱动程序将保证 (ETH、IP、GRE) 的所有附加封装标头在物理上是连续的,并且将位于数据包的第一个 MDL 中。
协议和筛选器驱动程序不确保 TCP 有效负载总长度是减小的 MSS 值的精确倍数。 因此,微型端口驱动程序和 NIC 必须更新隧道 (外部) IP 标头。 NIC 必须根据NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO中减小的 MSS 值生成尽可能多的全尺寸段。LsoV2TransmitOOB 信息。 每个 LSOv2 发送只能生成一个子 MSS 段。
微型端口驱动程序必须执行以下操作:
- 计算外部) IP 标头 (隧道的校验和。
- 将每个数据包 (外部) IP 标头的隧道的 IP 标识 (IP ID) 值递增。 第一个数据包必须使用原始隧道中的 IP ID (外部) IP 标头。
- 为每个数据包递增传输 (内部) IP 标头的 IP ID。 第一个数据包必须使用原始传输 (内部) IP 标头中的 IP ID。
- 计算 TCP 标头和传输 (内部) IP 标头的校验和。
- 确保将完整的标头(包括封装隧道 (外部) 标头)添加到每个生成的数据包。