在大型傳送卸載 (LSO) 中支援 NVGRE
NDIS 6.30 (Windows Server 2012) 使用一般路由封裝 (NVGRE) 引進網路虛擬化。 執行大型傳送卸載的 NDIS 迷你埠、通訊協定和篩選驅動程式和 NIC (LSO) 第 2 版 (LSOV2) 應該以支援 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值。LsoV2Transmit結構,以考慮新的 GRE 標頭。
- 傳送 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 識別碼) 值。 第一個封包必須使用原始通道中的 IP 識別碼, (外部) IP 標頭。
- 遞增每個封包之傳輸 (內部) IP 標頭的 IP 識別碼。 第一個封包必須使用原始傳輸 (內部) IP 標頭中的 IP 識別碼。
- 計算 TCP 標頭和傳輸 (內部) IP 標頭總和檢查碼。
- 請確定完整的標頭,包括封裝通道 (外部) 標頭新增至每個產生的封包。