IPsec Offload Version 2 によるネットワーク データの送信

[IPsec タスク オフロード機能は非推奨であり、使用しないでください。]

TCP/IP トランスポートは、OID_TCP_TASK_IPSEC_OFFLOAD_V2_ADD_SA OID を持つ 1 つ以上の SA に IPsec オフロード バージョン 2 (IPsecOV2) 情報を提供します。 ミニポート ドライバーは、OID_TCP_TASK_IPSEC_OFFLOAD_V2_ADD_SA の正常な結果を返す前に、オフロード ハンドルを初期化します。 TCP/IP トランスポートは、NET_BUFFER_LIST アウトオブバンド (OOB) 情報の一部である、NDIS_IPSEC_OFFLOAD_V2_NET_BUFFER_LIST_INFO および NDIS_IPSEC_OFFLOAD_V2_HEADER_NET_BUFFER_LIST_INFO 構造体で IPsecOV2 情報を指定することによって、NET_BUFFER_LIST 構造体の処理をオフロードするミニポート ドライバーを要求します。

TCP/IP トランスポートは、送信パケットのトランスポート (エンド ツー エンド接続) 部分の送信セキュリティ アソシエーション (SA) へのハンドルを指定する、NDIS_IPSEC_OFFLOAD_V2_NET_BUFFER_LIST_INFOOffloadHandle メンバーにオフロード ハンドルを提供します。

TCP/IP トランスポートは、NDIS_IPSEC_OFFLOAD_V2_HEADER_NET_BUFFER_LIST_INFO 構造体に次のヘッダー情報を提供します:

  • AH ヘッダー、ESP ヘッダー、またはその両方のヘッダー オフセット。

  • 次のプロトコル値 (ESP トレーラーに含まれているのと同じ値)。

  • 大容量送信オフロード (LSO) と IPsec オフロードの組み合わせに使用されるパッドの長さ。

また、送信パケットがトンネル経由で送信される場合、TCP/IP トランスポートは NDIS_IPSEC_OFFLOAD_V2_TUNNEL_NET_BUFFER_LIST_INFO 構造を提供します。 この構造体は、送信パケットのトンネル部分の送信 SA へのオフロード ハンドルを指定します。 OOB 情報へのアクセスの詳細については、「IPsec オフロード バージョン 2 の NET_BUFFER_LIST 情報へのアクセス」を参照してください。

ミニポート ドライバーは、OID_TCP_TASK_IPSEC_OFFLOAD_V2_ADD_SA の OID セット要求に応答してオフロード ハンドルを提供しました。 SA の詳細については、「IPsec オフロード バージョン 2 でのセキュリティ アソシエーションの管理」を参照してください。

ミニポート ドライバーが MiniportSendNetBufferLists 関数の送信要求を処理するとき、ミニポート ドライバーは以下を実行します:

  • IPsec オフロード サービスを処理するようにハードウェアが構成されていることを確認します。 IPsec オフロード サービスを処理するようにハードウェアが構成されていない場合、ミニポート ドライバーはオフロード サービスを提供せずに送信要求を処理する必要があります。

  • IPsec 暗号化処理が必要かどうかを判断するために、NDIS_IPSEC_OFFLOAD_V2_NET_BUFFER_LIST_INFO および NDIS_IPSEC_OFFLOAD_V2_TUNNEL_NET_BUFFER_LIST_INFO 構造体のハンドルを確認します。 オフロード ハンドルの値が 0 の場合は、NET_BUFFER_LIST に対して IPsec タスク オフロードを実行する必要がないことを示します。 ミニポート ドライバーは、指定したオフロード ハンドルに対応するオフロード SA を見つけることができないと、送信パケットは、NDIS_STATUS_FAILURE 値で失敗します。

  • NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO 構造体のハンドルを確認して、NET_BUFFER_LIST に対してセグメント化オフロードを実行する必要があるかどうかを判断します。

  • NET_BUFFER_LIST内のすべての送信パケットに必要な AH および ESP 処理を完了します。 NIC は、送信パケットに対して IPsec 処理を実行すると、パケット データに対して暗号化操作を実行します。 TCP/IP トランスポートは既にパケットをフレーム化し、(必要に応じて) 埋め込み、シーケンス番号とセキュリティ パラメーター インデックス (SPI) を割り当てています。 LSO と IPsec を組み合わせたオフロードの場合、NIC が大きなパケットをセグメント化する間に破棄される埋め込みが NET_BUFFER に含まれる場合があります。 埋め込みの量は、NDIS_IPSEC_OFFLOAD_V2_HEADER_NET_BUFFER_LIST_INFO 構造体の PadLength メンバーで指定されます。 セグメント化されたパケットでは、IPsec 操作をサポートするために埋め込みが必要になる場合があります。

プロトコル ドライバーは、LSO と IPsecOV2 の両方を要求するパケットを送信するときに、ESP トレーラーをフレームしません。 これは、埋め込み長など、ESP トレーラー内の情報が、NIC によって生成された最後のセグメントに対して正確ではないためです。