チェックサム オフロードでの NVGRE のサポート

NDIS 6.30 (Windows Server 2012) では、NVGRE (Network Virtualization using Generic Routing Encapsulation) が導入されています。 NDIS ミニポート ドライバー、プロトコル ドライバー、フィルター ドライバー、NIC は、チェックサム タスクをオフロードする際に NVGRE をサポートする方法で行う必要があります。

: このページは、「チェックサム タスクのオフロード」の情報を理解していることを前提としています。

NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO.IsEncapsulatedPacketTRUE で、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 ヘッダーが同じ IP バージョンであると想定しないでください。

NIC とミニポート ドライバーは、innerFrameOffsetTransportIpHeaderRelativeOffset、および TcpHeaderRelativeOffsetNDIS_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.TcpHeaderOffsetNDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO.Transmit.TcpHeaderOffset は正しい値を持たないため、NIC またはドライバーで使用してはなりません。

ミニポート ドライバーは、NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO.InnerFrameOffset がパケットの先頭とは異なる scatter-gather リストに含まれる場合も処理する必要があります。 プロトコル ドライバーは、先頭に付加されたすべてのカプセル化ヘッダー (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 トランスポート (内部) ヘッダーを持つカプセル化されたパケットの場合、ミニポート ドライバーは、両方の IP ヘッダー チェックサム検証が成功した場合にのみ、NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO 構造体で IpChecksumSucceeded フラグを設定する必要があります。 トンネル (外部) IPv4 ヘッダーとトランスポート (内部) IPv4 ヘッダーの両方を持つカプセル化されたパケットの場合、ミニポート ドライバーはいずれかの IP ヘッダー チェックサム検証に失敗した場合、IpChecksumFailed フラグを設定する必要があります。