支援大型傳送卸載中的 NVGRE (LSO)
NDIS 6.30 (Windows Server 2012) 使用一般路由封裝 (NVGRE) 引進網路虛擬化。 執行大型傳送卸除版本 2 (LSOV2) 的 NDIS 迷你埠、通訊協定和篩選驅動程式和 NIC 應以支援 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 值的確切倍數。
- 調整 InnerFrameOffset、TransportIpHeaderRelativeOffset和 TcpHeaderRelativeOffset 等值來考慮 GRE 標頭,這些值位於 NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO 結構中。
NIC 和迷你埠驅動程式可以使用 InnerFrameOffset、TransportIpHeaderRelativeOffset,以及 TcpHeaderRelativeOffsetNDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO 結構中提供的值。 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 值,盡可能產生多的完整段。LsoV2Transmit OOB 資訊。 每個 LSOv2 傳送只能產生一個子MSS 區段。
迷你埠驅動程式必須執行下列動作:
- 計算通道(外部)IP 標頭的校驗和。
- 針對每個封包,遞增通道 (外部) IP 標頭的 IP 識別碼 (IP ID) 值。 第一個封包必須使用原始通道 (外部) IP 標頭中的IP標識碼。
- 針對每個封包增加傳輸層 IP 標頭的 IP 標識碼。 第一個封包必須使用原始傳輸(內部)IP標頭中的IP標識碼。
- 計算 TCP 標頭和傳輸(內部)IP 標頭的校驗和。
- 請確定完整標頭,包括封裝通道(外部)標頭已新增至每個產生的封包。