チェックサム タスクのオフロード

NDIS では、実行時の TCP/IP チェックサム タスクのオフロードがサポートされます。

Note

 チェックサム オフロード 帯域外 (OOB) データは、NET_BUFFER_LIST 情報配列に格納されます。 OOB データの詳細については、「TCP/IP オフロード NET_BUFFER_LIST 情報へのアクセス」を参照してください。

ミニポート ドライバーがチェックサム タスクを実行するパケットの NET_BUFFER_LIST 構造をミニポート ドライバーに渡す前に、TCP/IP トランスポートは、NET_BUFFER_LIST 構造に関連するチェックサム情報を指定します。 この情報は、NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO 構造によって指定され、NET_BUFFER_LIST 構造に関連付けられている NET_BUFFER_LIST 情報(帯域外データ)の一部です。

TCP パケットの チェックサム計算をオフロードする前に、TCP/IP トランスポートは TCP 擬似ヘッダーの補数の合計を計算します。 TCP/IP トランスポートは、ソース IP アドレス、送信先 IP アドレス、プロトコル、TCP パケットの TCP 長など、擬似ヘッダー内のすべてのフィールドにわたって、補数の合計を計算します。 TCP/IP トランスポートは、TCP ヘッダーの Checksum フィールドに擬似ヘッダーの補数の合計を入力します。

TCP/IP トランスポートによって提供される擬似ヘッダーの補数の合計により、NIC は送信パケットの実際の TCP チェックサムの計算を早期開始します。 実際の TCP チェックサムを計算するために、NIC は TCP チェックサムの可変部分 (TCP ヘッダーとペイロード)を計算し、TCP/IP トランスポートによって計算される擬似ヘッダーの補数の合計にこのチェックサムを追加し、チェックサムの 16 ビットの補数を計算します。 このようなチェックサムの計算の詳細については、RFC 793 および RFC 1122 を参照してください。

Note

TCP/IP トランスポートは、TCP パケットの場合と同じ手順を使用して、UDP パケットの擬似ヘッダーの補数の合計を計算し、その値を UDP ヘッダーの チェックサム フィールドに格納します。

TCP/IP トランスポートでは、下位ミニポート ドライバーにパケットを渡す前に、パケットの IP ヘッダーの チェックサム フィールドが 常に 0 に設定されていることを確認します。 ミニポート ドライバーは、IP ヘッダーの チェックサム フィールドを無視する必要があります。 ミニポート ドライバーは、チェックサム フィールドが 0 に設定されていることを確認する必要はありません。このフィールドを 0 に設定する必要もありません。

MiniportSendNetBufferLists または MiniportCoSendNetBufferLists 関数で NET_BUFFER_LIST 構造を受信した後、ミニポート ドライバーは通常、以下のチェックサム処理を行います。

  1. ミニポート ドライバーは、NET_BUFFER_LIST_INFO マクロを TcpIpChecksumNetBufferListInfo_Idで呼び出し、 NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO 構造を取得します。

  2. ミニポート ドライバーは、NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO 構造の IsIPv4 フラグと IsIPv6 フラグをテストします。 IsIPv4 フラグと IsIPv6 フラグの両方が設定されていない場合、NIC はパケットに対していかなるチェックサム操作も実行しないでください。

  3. IsIPv4 フラグまたは IsIPv6 フラグが設定されている場合、ミニポート ドライバーは TcpChecksum フラグ、UdpChecksum フラグ、および IpHeaderChecksum フラグをテストして、NIC がパケットに対して計算すべきチェックサムを決定します。

  4. ミニポート ドライバーは、パケットを NIC に渡し、パケットの適切なチェックサムを計算します。 パケットにトンネル IP ヘッダーとトランスポート IP ヘッダーの両方がある場合、IP チェックサム オフロードをサポートする NIC は、トンネル ヘッダーでのみ IP チェックサム タスクを実行します。 TCP/IP トランスポートは、トランスポート IP ヘッダー上で IP チェックサム タスクを実行します。

チェックサムタスクを実行する受信パケットの NET_BUFFER_LIST 構造を示す前に、ミニポート ドライバーは適切なチェックサムを検証し、NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO 構造に適切な XxxChecksumFailed フラグまたは XxxChecksumSucceeded フラグを設定します。

ラージ センド オフロード(LSO)が有効になっているときにアドレス チェックサム オフロードをオフにしても、ミニポート ドライバーが LSO 機能によって生成されたパケットにチェックサムを計算して挿入することを防ぐことはできません。 この場合、アドレス チェックサム オフロードを無効にするには、ユーザーも LSO を無効にする必要があります。