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 接続で中止切断または正常切断を実行します。

中止切断

FlagsTCP_DISCONNECT_ABORTIVE_CLOSE に設定されている場合、オフロード ターゲットは、指定された TCP 接続で RST セグメントを送信することによって中止切断を実行します。

メモ これは、オフロード ターゲットが RST セグメントを送信できる唯一のインスタンスです。
 
を呼び出す前に、 NdisTcpOffloadDisconnectComplete 関数を使用して中止切断を完了するには、オフロード ターゲットは、状態値が NDIS_STATUS_REQUEST_ABORTED の接続で未処理のすべての送信要求を完了する必要があります。 オフロード ターゲットは、 に渡すリンクリスト内の各NET_BUFFER_LIST構造体の Status メンバーにこの 状態 値を書き込みます。 NdisTcpOffloadSendComplete 関数。

オフロード ターゲットが RST セグメントの送信前または送信後に未処理の送信要求を終了するかどうかは関係ありません。

接続に未処理の受信表示またはイベント表示がある場合、オフロード ターゲットは、RST セグメントを送信する前に、これらの表示が完了するまで待つ必要はありません。 オフロード ターゲットは、接続上の受信セグメントの処理を直ちに停止し、クライアント アプリケーションで使用されていない受信データを含め、受信セグメントを確認しない必要があります。

Flags = TCP_DISCONNECT_ABORTIVE_CLOSEすると、NetBufferList ポインターによって参照されるNET_BUFFER_LIST構造体に関連付けられたNET_BUFFER構造体にデータは含まれます。 つまり、NET_BUFFER構造体の NetBufferHeader 内のNET_BUFFER_DATA構造体の DataLength メンバーは 0 です。

正常な切断

FlagsTCP_DISCONNECT_GRACEFUL_CLOSEに設定されている場合、オフロード ターゲットは、指定された TCP 接続で FIN セグメントを送信することで、正常な切断を実行します。

FIN セグメントの前に送信するユーザー データがない場合、 NetBufferList ポインターによって参照されるNET_BUFFER_LIST構造体に関連付けられているNET_BUFFER構造体にはデータが含まれます。 送信するユーザー データがある場合は、NET_BUFFER構造体に関連付けられているメモリ記述子リスト (MDL) に、送信するユーザー データが含まれます。

オフロード ターゲットは、FIN セグメントを送信する前に、送信されたユーザー データの受信確認を待つべきではありません。 オフロード ターゲットは、ユーザー データの送信後に別の FIN セグメントを送信できます。または、オフロード ターゲットは、送信するユーザー データの最後のセグメントの TCP ヘッダーに FIN ビットを設定できます。

オフロード ターゲットの観点から見ると、FIN セグメントを送信すると、接続の送信の半分が閉じられます。 ただし、FIN セグメントを送信しても、接続の受信半分は閉じられません。 リモート ホストは、次のいずれかをオフロード ターゲットに送信することで、接続の受信半分を終了します。

  • 正常な切断を要求する FIN セグメント。
  • 中止切断を要求する RST セグメント。
FIN セグメントを送信した後、オフロード ターゲットは、リモート ホストが正常または中止切断を開始するまで、またはローカル ホストが接続のオフロードを終了するか、または中止切断を開始するまで、接続上のセグメントを受信できます。

オフロード ターゲットの呼び出し前 NdisTcpOffloadDisconnectComplete では、オフロード ターゲットに配信されたのと同じ順序で、接続で未処理のすべての送信要求を完了する必要があります。

切断要求に対する必須の応答

オフロード ターゲットは、指定された TCP 接続がアップロードされているか、または中止されている (たとえば、リモート ホストが接続で RST セグメントを送信したため) 場合を除き、切断要求を失敗させてはなりません。 オフロード ターゲットが切断要求に失敗した場合、ホスト スタックは後で切断要求を再発行しません。

接続リソースの解放

オフロード ターゲットは、ホスト スタックが接続のオフロードを終了するまで、中止または正常切断を発行した接続のリソースを解放することはできません。

要件

要件
対象プラットフォーム Windows
ヘッダー ndischimney.h (Ndischimney.h を含む)
IRQL 任意のレベル

こちらもご覧ください

MiniportInitializeEx

MiniportTerminateOffload

NET_BUFFER

NET_BUFFER_DATA

NET_BUFFER_LIST

NET_BUFFER_LIST_INFO

NdisAdvanceNetBufferDataStart

NdisMSetMiniportAttributes

NdisTcpOffloadDisconnectComplete

NdisTcpOffloadSendComplete