W_TCP_OFFLOAD_DISCONNECT_HANDLER コールバック関数 (ndischimney.h)
[TCP のチムニー オフロード機能は非推奨であり、使用しないでください。]
MiniportTcpOffloadDisconnect 関数は、オフロードされた TCP 接続の送信の半分を閉じます。 さらに、実行する切断が正常な切断である場合、NDIS は、FIN セグメントを送信する前に関数が送信する必要がある MiniportTcpOffloadDisconnect 関数にアプリケーション データを提供できます。
構文
W_TCP_OFFLOAD_DISCONNECT_HANDLER WTcpOffloadDisconnectHandler;
NDIS_STATUS WTcpOffloadDisconnectHandler(
[in] IN NDIS_HANDLE MiniportAdapterContext,
[in] IN PVOID MiniportOffloadContext,
[in] IN PNET_BUFFER_LIST NetBufferList,
[in] IN ULONG Flags
)
{...}
パラメーター
[in] MiniportAdapterContext
オフロード ターゲットがアダプターのこのインスタンスに関する状態情報を保持するオフロード ターゲット割り当てコンテキスト領域へのハンドル。 オフロード ターゲットは、呼び出されたときに NDIS にこのハンドルを提供しました NdisMSetMiniportAttributes MiniportInitializeEx 関数。
[in] MiniportOffloadContext
PVOID 値を含むメモリの場所へのポインター。 この PVOID 値は、切断される TCP 接続の状態オブジェクトを含むミニポート オフロード コンテキストを参照します。 オフロード ターゲットは、TCP 接続状態オブジェクトをオフロードしたときに、この PVOID 値を指定しました。
[in] NetBufferList
単一の NET_BUFFER_LIST 構造体へのポインター。 このNET_BUFFER_LIST構造体に関連付けられている NET_BUFFER 構造体は 1 つだけです。
[in] Flags
次のいずれかの値として、オフロード ターゲットが実行する必要がある切断の種類。
TCP_DISCONNECT_ABORTIVE_CLOSE
オフロード ターゲットは、RST セグメントを送信することによって中止切断を実行する必要があります。
TCP_DISCONNECT_GRACEFUL_CLOSE
オフロード ターゲットは、FIN セグメントを送信することによって正常な切断を実行する必要があります。
戻り値
MiniportTcpOffloadDisconnect 関数は常にNDIS_STATUS_PENDINGを返します。 オフロード ターゲットは、 を呼び出して非同期的に切断要求を完了します。 NdisTcpOffloadDisconnectComplete。
注釈
Flags 設定に応じて、MiniportTcpOffloadDisconnect 関数は、指定された TCP 接続で中止切断または正常切断を実行します。
中止切断
Flags が TCP_DISCONNECT_ABORTIVE_CLOSE に設定されている場合、オフロード ターゲットは、指定された TCP 接続で RST セグメントを送信することによって中止切断を実行します。
オフロード ターゲットが RST セグメントの送信前または送信後に未処理の送信要求を終了するかどうかは関係ありません。
接続に未処理の受信表示またはイベント表示がある場合、オフロード ターゲットは、RST セグメントを送信する前に、これらの表示が完了するまで待つ必要はありません。 オフロード ターゲットは、接続上の受信セグメントの処理を直ちに停止し、クライアント アプリケーションで使用されていない受信データを含め、受信セグメントを確認しない必要があります。
Flags = TCP_DISCONNECT_ABORTIVE_CLOSEすると、NetBufferList ポインターによって参照されるNET_BUFFER_LIST構造体に関連付けられたNET_BUFFER構造体にデータは含まれます。 つまり、NET_BUFFER構造体の NetBufferHeader 内のNET_BUFFER_DATA構造体の DataLength メンバーは 0 です。
正常な切断
Flags がTCP_DISCONNECT_GRACEFUL_CLOSEに設定されている場合、オフロード ターゲットは、指定された TCP 接続で FIN セグメントを送信することで、正常な切断を実行します。
FIN セグメントの前に送信するユーザー データがない場合、 NetBufferList ポインターによって参照されるNET_BUFFER_LIST構造体に関連付けられているNET_BUFFER構造体にはデータが含まれます。 送信するユーザー データがある場合は、NET_BUFFER構造体に関連付けられているメモリ記述子リスト (MDL) に、送信するユーザー データが含まれます。
オフロード ターゲットは、FIN セグメントを送信する前に、送信されたユーザー データの受信確認を待つべきではありません。 オフロード ターゲットは、ユーザー データの送信後に別の FIN セグメントを送信できます。または、オフロード ターゲットは、送信するユーザー データの最後のセグメントの TCP ヘッダーに FIN ビットを設定できます。
オフロード ターゲットの観点から見ると、FIN セグメントを送信すると、接続の送信の半分が閉じられます。 ただし、FIN セグメントを送信しても、接続の受信半分は閉じられません。 リモート ホストは、次のいずれかをオフロード ターゲットに送信することで、接続の受信半分を終了します。
- 正常な切断を要求する FIN セグメント。
- 中止切断を要求する RST セグメント。
オフロード ターゲットの呼び出し前 NdisTcpOffloadDisconnectComplete では、オフロード ターゲットに配信されたのと同じ順序で、接続で未処理のすべての送信要求を完了する必要があります。
切断要求に対する必須の応答
オフロード ターゲットは、指定された TCP 接続がアップロードされているか、または中止されている (たとえば、リモート ホストが接続で RST セグメントを送信したため) 場合を除き、切断要求を失敗させてはなりません。 オフロード ターゲットが切断要求に失敗した場合、ホスト スタックは後で切断要求を再発行しません。
接続リソースの解放
オフロード ターゲットは、ホスト スタックが接続のオフロードを終了するまで、中止または正常切断を発行した接続のリソースを解放することはできません。
要件
要件 | 値 |
---|---|
対象プラットフォーム | Windows |
ヘッダー | ndischimney.h (Ndischimney.h を含む) |
IRQL | 任意のレベル |