W_TCP_OFFLOAD_RECEIVE_HANDLER コールバック関数 (ndischimney.h)
[TCP チムニー オフロード機能は非推奨であり、使用しないでください。]
NDIS は 、ミニポートTcpOffloadReceive 関数を呼び出して、オフロードされた TCP 接続に受信要求 (受信バッファー) を投稿します。
構文
W_TCP_OFFLOAD_RECEIVE_HANDLER WTcpOffloadReceiveHandler;
NDIS_STATUS WTcpOffloadReceiveHandler(
[in] IN NDIS_HANDLE MiniportAdapterContext,
[in] IN PVOID MiniportOffloadContext,
[in] IN PNET_BUFFER_LIST NetBufferList
)
{...}
パラメーター
[in] MiniportAdapterContext
オフロード ターゲットがアダプターのこのインスタンスに関する状態情報を保持するオフロード ターゲット割り当てコンテキスト領域へのハンドル。 ミニポート ドライバーは、呼び出されたときに NDIS にこのハンドルを提供しました から NdisMSetMiniportAttributes MiniportInitializeEx 関数。
[in] MiniportOffloadContext
PVOID 値を含むメモリ位置へのポインター。 この PVOID 値は、受信要求が投稿されている TCP 接続の状態オブジェクトを含むミニポート オフロード コンテキストを参照します。 オフロード ターゲットは、TCP 接続状態オブジェクトをオフロードするときに、この PVOID 値を指定しました。
[in] NetBufferList
NET_BUFFER_LIST構造体へのポインター。 この構造体には、スタンドアロン構造、またはNET_BUFFER_LIST構造体のリンクされたリスト内の最初の構造体を指定できます。 リスト内の各NET_BUFFER_LIST構造体には、1 つの NET_BUFFER 構造体が記述されています。 NET_BUFFER構造体は、メモリ記述子リスト (MDL) のチェーンにマップされます。 NET_BUFFER_LISTおよび関連する構造体は、物理メモリに常駐し続けることができるようにロックされます。 ただし、システム メモリにはマップされません。
戻り値
NDIS_STATUS_PENDINGは、許可される唯一の戻り値です。 オフロード ターゲットは、ポストされた受信要求を常に非同期的に完了 (返します) します。 NdisTcpOffloadReceiveComplete。
注釈
クライアント アプリケーションは、オフロードされた TCP 接続で受信要求をポストできます。 オフロード ターゲットは、これらの要求を使用して、接続で受信したデータをクライアント アプリケーションに転送します。 受信要求が接続に投稿された場合、オフロード ターゲットは常にそれらを使用して、接続で受信したデータを転送する必要があります。 詳細については、「 配信アルゴリズム」を参照してください。
オフロード ターゲットは、転記されたNET_BUFFER_LIST構造を先入れ先出し (FIFO) 順にキューに入れます。 オフロード ターゲットは、各NET_BUFFER_LIST構造体の ミニポート予約済み メンバーを使用して、構造体をキューに入れます。
MiniportTcpOffloadReceive 関数に渡される各NET_BUFFER_LIST構造体には、NET_BUFFER構造体が 1 つだけ関連付けられています。
オフロード ターゲットは、FIFO 順にポストされた受信要求に受信データを配置する必要があります。 つまり、最初に受信したデータは、最初に投稿された受信要求に配置する必要があります。などです。
ホスト スタックは、 MiniportTcpOffloadReceive 関数の呼び出しを接続ごとにシリアル化します。 その接続の MiniportTcpOffloadReceive 関数の呼び出しが進行中の間、ホスト スタックは接続で MiniportTcpOffloadReceive 関数を呼び出しません。 これにより、受信要求が常にオフロード ターゲットの MiniportTcpOffloadReceive 関数に正しい順序で投稿されます。
ただし、オフロード ターゲットが同じ接続で MiniportTcpOffloadReceive 関数の 1 つ以上の呼び出しを完了する前に、ホスト スタックが接続で MiniportTcpOffloadReceive 関数を 呼び出すことができることに注意してください。 また、ホスト スタックは、1 つの接続でオフロード ターゲットの MiniportTcpOffloadReceive 関数を呼び出すことができます。同時に、 MiniportTcpOffloadReceive 関数への 1 つ以上の呼び出しが別の接続で進行中であることにも注意してください。
投稿された受信要求は、必要に応じて、次の 2 つのモードのいずれかにできます。
- Push モード
- 非push モード
バッファーがどのモードにあるかを判断するために、オフロード ターゲットは NET_BUFFER_LIST_INFO マクロを呼び出して TcpReceiveNoPush の値を取得します。 値が TRUE の場合、受信要求は非ループ モードになります。
受信要求がプッシュ モードの場合、オフロード ターゲットは、NET_BUFFER_LIST_INFO マクロを呼び出して TcpReceiveBytesTransferred の値を取得します。 この値が 0 以外の場合、オフロード ターゲットは直ちに接続の プッシュ タイマー を開始します。 この値が 0 の場合、オフロード ターゲットは、オフロード ターゲットが受信要求に受信データの最初のバイトを配置するとすぐに、接続のプッシュ タイマーを開始します。 オフロード ターゲットは常に、入力された受信要求をすぐに完了します。 オフロード ターゲットは、次のいずれかが発生した場合にプッシュ モードになっている部分的に入力された受信要求を完了します。
- プッシュ タイマーの有効期限が切れます。
- オフロード ターゲットは、PSH ビットが設定されている接続で TCP セグメントを受け取ります。
プッシュ タイマーの実行中にオフロード接続でデータを受信した場合、オフロード ターゲットは、その接続のプッシュ タイマーを再起動する必要があります。
要件
要件 | 値 |
---|---|
対象プラットフォーム | Windows |
ヘッダー | ndischimney.h (Ndischimney.h を含む) |
IRQL | 任意のレベル |