NDIS 6.30(Windows Server 2012)引入了使用通用路由封装(NVGRE)的网络虚拟化。 负责卸载校验和任务的 NDIS 微型端口、协议和筛选器驱动程序以及 NIC 应以支持 NVGRE 的方式进行操作。
注意 本页假设你已熟悉卸载校验和任务中的信息。
如果 NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO.IsEncapsulatedPacket 为 TRUE 时,并且 TcpIpChecksumNetBufferListInfo 带外 (OOB) 信息有效,这就表明需要 NVGRE 支持,并且 NIC 必须计算隧道(外部)IP 标头、传输(内部)IP 标头以及 TCP 或 UDP 标头的校验和。
NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO结构中的 IsIPv4 和 IsIPv6 标志指示隧道(外部)IP 标头的 IP 标头版本。 NIC 必须分析传输(内部)IP 标头,以确定该标头的 IP 版本。 由于允许混合模式数据包(请参阅 NDIS_ENCAPSULATED_PACKET_TASK_OFFLOAD),因此 NIC 不得假定内部和外部 IP 标头将具有相同的 IP 标头版本。
NIC 和微型端口驱动程序可以使用 InnerFrameOffset、TransportIpHeaderRelativeOffset 和 TcpHeaderRelativeOffset 值,这些值在 NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO 结构中提供。 NIC 或微型端口驱动程序可以在隧道(外部)IP 标头或后续标头上执行任何所需的标头检查,以验证这些偏移量。
请注意,当 NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO.IsEncapsulatedPacket 为 TRUE 时,现有标头偏移字段 NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO.LsoV2Transmit.TcpHeaderOffset 和 NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO.Transmit.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 传输(内部)标头的封装数据包,微型端口驱动程序应在NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO结构中设置 IpChecksumSucceeded 标志,前提是这两个 IP 标头校验和验证都成功。 对于具有隧道(外部)IPv4 标头和传输(内部)IPv4 标头的封装数据包,如果任一 IP 标头校验和验证失败,微型端口驱动程序应设置 IpChecksumFailed 标志。