Large Send Offload (LSO) での NVGRE のサポート
NDIS 6.30 (Windows Server 2012) では、NVGRE (Network Virtualization using Generic Routing Encapsulation) が導入されています。 NDIS ミニポート、プロトコル、large send offload (LSO) バージョン 2 (LSOV2) を実行するフィルター ドライバーと 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.LsoV2Transmit 構造体の MSS 値を新しい GRE ヘッダーを考慮して小さくします。
- TCP ペイロードの長さは、小さくなった MSS 値の正確な倍数にはならない可能性があります。
- NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO 構造体の InnerFrameOffset、TransportIpHeaderRelativeOffset、TcpHeaderRelativeOffset の値を、GRE ヘッダーを考慮して調整します。
NIC とミニポート ドライバーは、innerFrameOffset、TransportIpHeaderRelativeOffset、および TcpHeaderRelativeOffset、NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO 構造体で提供される値を使用できます。 NIC またはミニポート ドライバーは、トンネル (外部) IP ヘッダーまたは後続のヘッダーで必要なヘッダー チェックを実行することにより、これらのオフセットを検証できます。
ミニポート ドライバーは、NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO.InnerFrameOffset がパケットの先頭とは異なる scatter-gather リストに含まれる場合も処理する必要があります。 プロトコル ドライバーは、先頭に付加されたすべてのカプセル化ヘッダー (ETH、IP、GRE) が物理的に連続し、パケットの最初の MDL に含まれることを保証します。
プロトコル ドライバーとフィルター ドライバーでは、TCP ペイロードの合計長が、小さくした MSS 値の正確な倍数であることを保証しません。 このため、ミニポート ドライバーと NIC は、トンネル (外部) IP ヘッダーを更新する必要があります。 NIC は、NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO.LsoV2Transmit OOB 情報の小さくなった MSS 値に基づいて、可能な限り多くのフルサイズのセグメントを生成する必要があります。 サブ MSS セグメントは、LSOv2 送信ごとに 1 つだけ生成できます。
ミニポート ドライバーは、次のことを行う必要があります。
- トンネル (外部) IP ヘッダーの チェックサムを計算します。
- パケットごとにトンネル (外部) IP ヘッダーの IP 識別 (IP ID) 値をインクリメントします。 最初のパケットは、元のトンネル (外部) IP ヘッダーの IP ID を使用する必要があります。
- パケットごとにトランスポート (内部) IP ヘッダーの IP ID をインクリメントします。 最初のパケットは、元のトランスポート (内部) IP ヘッダーの IP ID を使用する必要があります。
- TCP ヘッダーとトランスポート (内部) IP ヘッダーのチェックサムを計算します。
- カプセル化トンネル (外部) ヘッダーを含む完全なヘッダーが、生成されたすべてのパケットに追加されていることを確認します。