支援總和檢查碼卸載中的 NVGRE
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 和迷你埠驅動程式可以使用NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO結構中提供的InnerFrameOffset、TransportIpHeaderRelativeOffset和TcpHeaderRelativeOffset值。 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。傳輸。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 旗標。