NDIS_TCP_OFFLOAD_EVENT_INDICATE コールバック関数 (ndischimney.h)

[TCP チムニー オフロード機能は非推奨であり、使用しないでください。]

オフロード ターゲットは NdisTcpOffloadEventHandler 関数を呼び出して、オフロードされた TCP 接続に関連するイベントを示します。

構文

NDIS_TCP_OFFLOAD_EVENT_INDICATE NdisTcpOffloadEventIndicate;

void NdisTcpOffloadEventIndicate(
  [in] IN NDIS_HANDLE NdisOffloadHandle,
  [in] IN ULONG EventType,
  [in] IN ULONG EventSpecificInformation
)
{...}

パラメーター

[in] NdisOffloadHandle

指示が行われているオフロードされた TCP 接続を識別するハンドル。 接続がオフロードされたとき、このハンドルは の NdisOffloadHandle メンバーで指定されました。 NDIS_MINIPORT_OFFLOAD_BLOCK_LIST 接続状態に関連付けられた構造体です。

[in] EventType

次のいずれかの TCP_OFFLOAD_EVENT_TYPE 値として示されているイベント。

TcpIndicateDisconnect

接続で FIN セグメントを送信することによって、リモート ホストが正常な切断を開始したことを示します。

TcpIndicateRetrieve

オフロード ターゲットが TCP 接続のオフロードを終了するようにホスト スタックに要求していることを示します。

TcpIndicateAbort

接続で許容可能な RST セグメントを送信することによって、リモート ホストが中止切断を開始したことを示します。

TcpIndicateSendBacklogChange

優先する送信バックログ サイズの変更を示します。

[in] EventSpecificInformation

次のように示されているイベントに関する追加情報を指定します。

TcpIndicateDisconnect

意味がありません。

TcpIndicateRetrieve

アップロード要求の理由を TCP_UPLOAD_REASON 値として示します。 詳細については、次の「解説」を参照してください。

TcpIndicateAbort

意味がありません。

TcpIndicateSendBacklogChange

ホスト スタックがオフロード ターゲットで未処理にする必要がある送信データバイトの最適な数を指定します。

戻り値

なし

解説

正常な切断を示す

オフロード ターゲットは、次の場合にのみ正常な切断を示す必要があります。
  • リモート ホストから FIN セグメントを受信しました。
  • FIN セグメントの受信前に接続で受信されたすべてのデータは、クライアント アプリケーションによって使用されています (つまり、接続で示される受信データはありません)。
オフロード ターゲットは、ホスト スタックが接続のオフロードを終了するまで、接続のリソースを解放することはできません。

正常な切断では、接続の受信半分のみがシャットダウンされることに注意してください。 接続の送信の半分はシャットダウンされません。

切断の中止を示す

オフロード ターゲットが TCP 接続で許容可能な RST セグメントを受信する場合は、次の手順を実行する必要があります。
  1. 接続の内部状態で、接続を中止済みとしてマークします。
  2. EventTypeTcpIndicateAbortNdisTcpOffloadEventHandler 関数を呼び出します。
    メモ ミニポートが TcpIndicateAbort イベントを示すと、ホスト TCP/IP スタックは接続のオフロードを終了します。 オフロード ターゲットは、RST セグメントが到着するとすぐに TcpIndicateAbort イベントを示す自由です。
     
  3. NDIS_STATUS_REQUEST_ABORTEDを使用して、接続で未処理のすべての送信要求と切断要求を完了します。 オフロード ターゲットは、リンクされたリスト内の各NET_BUFFER_LIST構造体の Status メンバーにこの状態値を書き込みます。 NdisTcpOffloadSendComplete 関数または NdisTcpOffloadDisconnectComplete 関数。
オフロード ターゲットは、ホスト スタックが接続のオフロードを終了するまで、接続のリソースを解放することはできません。

TCP 接続の終了の要求

オフロード ターゲットは、終了要求の理由を、NdisTcpOffloadEventHandler 関数に渡す EventSpecificInformation パラメーターのTCP_UPLOAD_REASON値として指定します。 応答として、ホスト スタックはオフロード ターゲットの MiniportTerminateOffload 関数を呼び出します。

オフロード ターゲットは、 NdisTcpOffloadEventHandler の呼び出しごとに 1 つの TCP 接続の終了のみを要求できます。 オフロード ターゲットは、近隣状態オブジェクトまたはパス状態オブジェクトの終了を要求できません。 ホスト スタックのみが近隣オブジェクトまたはパス状態オブジェクトの終了を開始できます。

次の表では、オフロード ターゲットが TCP 接続のオフロードの終了を要求する可能性があるイベントまたは状況について説明します。

右端の列は、各 TCP_UPLOAD_REASONについて、ホスト スタックが常に接続をアップロードするか (必須)、または接続をアップロードしない可能性があるか (省略可能) かを示します。 必須の場合、オフロード ターゲットはオフロードされた接続の処理を続行しません。 オプションの場合、オフロード ターゲットは、ホスト スタックがその接続のオフロードを終了しない場合、オフロードされた接続で処理を続行できる必要があります。

イベント/状況 TCP_UPLOAD_REASON ホスト スタックによる TCP 接続の終了
接続の追跡に使用されるハードウェアの状態が破損しています。 HardwareFailure Mandatory
オフロード ターゲットは、無効な状態オブジェクトに依存する TCP 接続でデータを送信しようとしました。 InvalidState Mandatory
オフロード ターゲットは、TCP ヘッダーに URG ビットが設定されたセグメントを受け取ります。 オフロード ターゲットは緊急データを確認するために ACK を送信しないことに注意してください。 ReceivedUrgentData Mandatory
TCP 接続でタイムアウトが発生しました。 TimeoutExpiration Mandatory
オフロード ターゲットは、未指定の理由でアップロードを要求しています。 UploadRequested Mandatory
オフロード ターゲットは、TCP 接続で削除されている送信セグメントが多すぎることを検出しました。 HighDropRate オプション
オフロード ターゲットは、TCP 接続で受信されているフラグメントが多すぎることを検出しました。 HighFragmentation オプション
オフロード ターゲットが TCP 接続で受信した順序が異なっているセグメントが多すぎます。 HighOutofOrderPackets オプション
TCP 接続のアクティビティ (送受信) が低すぎます。 LowActivity オプション
TCP 接続用の事前にポストされた受信バッファーはありません。 NoBufferProposting オプション
TCP 接続用にポストされた受信バッファーが小さすぎます。 SmallIO オプション
 

オフロード ターゲットは、その接続が次のいずれかの状態にある場合に、ハーフクローズ TCP 接続の終了を開始することはできません。

  • FIN_WAIT1--ローカル ホスト スタックは TCP 接続を閉じていますが、接続がリモート エンドポイントからデータを受信している可能性があります。
  • FIN_WAIT2--ローカル ホストは TCP 接続を閉じ、送信した FIN セグメントの ACK を受信しましたが、オフロードされた接続は引き続きリモート ホストからデータを受信している可能性があります。
  • CLOSE_WAIT--ローカル ホストは引き続きデータを送信している可能性があります。
オフロード ターゲットは、オフロードされたすべての TCP 接続の終了を要求できます。 詳細については、「 NdisMOffloadEventIndicate」を参照してください。

Send Backlog サイズの変更を示す

送信バックログ サイズは、接続、インターフェイス帯域幅、およびその他のパラメーターのラウンド トリップ時間 (RTT) の関数です。 オフロード ターゲットが送信バックログ サイズの計算に使用する特定の変数とアルゴリズムは、実装固有です。 たとえば、オフロード ターゲットでは、帯域幅遅延製品とアドバタイズされた受信ウィンドウの最小値をアルゴリズムとして使用できます。 ただし、送信バックログ のサイズは、接続での送信のために現在投稿されているデータ バイト数によって異ならない点に注意してください。

オフロード ターゲットでは、 SendBacklogSize の値が頻繁に変更される場合や量が少なすぎる場合に、オフロード ターゲットが SendBacklogSize イベントを示さないことを確認するために、調整メカニズムを実装する必要があります。 これにより、イベントの兆候の嵐が発生するのを防ぐことができます。

要件

要件
対象プラットフォーム ユニバーサル
Header ndischimney.h (Ndischimney.h を含む)
IRQL DISPATCH_LEVEL

こちらもご覧ください

TCP Chimney-Specific イベントの示し方

MiniportInitiateOffload

MiniportTerminateOffload

NdisMOffloadEventIndicate

NdisTcpOffloadDisconnectComplete NdisTcpOffloadReceiveComplete

NdisTcpOffloadSendComplete

ProtocolTcpOffloadEvent

FIN または RST セグメントの受信への応答