在大规模发送卸载 (LSO) 中支持 NVGRE

NDIS 6.30 (Windows Server 2012) 引入了使用通用路由封装 (NVGRE) 的网络虚拟化。 执行大型发送卸载 (LSO) 版本 2 (LSOV2) 的 NDIS 微型端口、协议和筛选器驱动程序和 NIC 应以支持 NVGRE 的方式执行此操作。

注意 本页假定你熟悉 卸载大型 TCP 数据包分段中的信息。

如果 NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFOIsEncapsulatedPacketTRUE并且 TcpIpChecksumNetBufferListInfo 带外 (OOB) 信息有效,这表明需要 NVGRE 支持,并且 NIC 必须在 NVGRE 格式的数据包上执行 LSOV2 卸载,但条件如下:

若要在 LSOV2 中支持 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) 的所有附加封装标头在物理上是连续的,并且将位于数据包的第一个 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 标头的校验和。
  • 确保将完整的标头(包括封装隧道 (外部) 标头)添加到每个生成的数据包。

卸载大型 TCP 数据包的段