在校验和卸载中支持 NVGRE

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

注意 本页假定你熟悉 卸载校验和任务中的信息。

如果 NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFOIsEncapsulatedPacketTRUE并且 TcpIpChecksumNetBufferListInfo 带外 (OOB) 信息有效,这表示需要 NVGRE 支持,并且 NIC 必须计算隧道 (外部) IP 标头、传输 (内部) IP 标头以及 TCP 或 UDP 标头的校验和。

NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO 结构中的 IsIPv4IsIPv6 标志指示隧道 (外部) IP 标头的 IP 标头版本。 NIC 必须分析内部) IP 标头 (传输以确定该标头的 IP 版本。 由于允许混合模式数据包 (看到 NDIS_ENCAPSULATED_PACKET_TASK_OFFLOAD) ,因此 NIC 不得假定内部和外部 IP 标头具有相同的 IP 标头版本。

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

请注意, NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO时。IsEncapsulatedPacket 为 TRUE,现有标头偏移量字段 NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFOLsoV2TransmitTcpHeaderOffsetNDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO传输TcpHeaderOffset 没有正确的值,并且不能由 NIC 或驱动程序使用。

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

校验和验证

NVGRE 的校验和验证与否大致相同。

如果微型端口收到 OID_TCP_OFFLOAD_PARAMETERS OID 请求并成功 NDIS_ENCAPSULATION_TYPE_GRE_MAC (请参阅 NDIS_OFFLOAD_PARAMETERS) ,则 NIC 必须对隧道 (外部) IP 标头、传输 (内部) IP 标头以及 TCP 或 UDP 标头执行校验和验证。

对于具有 IPv4 隧道 (外部) 标头和 IPv4 传输 (内部) 标头的封装数据包,仅当两个 IP 标头校验和验证成功时,微型端口驱动程序才应在NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO结构中设置 IpChecksumSucceeded 标志。 对于同时具有隧道 (外部) IPv4 标头和传输 (内部) IPv4 标头的封装数据包,如果任一 IP 标头校验和验证失败,微型端口驱动程序应设置 IpChecksumFailed 标志。