次の方法で共有


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. TcpIndicateAbort EventType を使用して、NdisTcpOffloadEventHandler 関数呼び出します。
    ミニポートが tcpIndicateAbort イベント 示す場合、ホスト TCP/IP スタックは接続のオフロードを終了します。 オフロード ターゲットは、RST セグメントが到着するとすぐに、TcpIndicateAbort イベントを示すために自由です。
     
  3. NDIS_STATUS_REQUEST_ABORTEDを使用して、接続で未処理のすべての送信要求と切断要求を完了します。 オフロード ターゲットは、リンク リスト内の各 NET_BUFFER_LIST 構造体の 状態 メンバーにこの状態値を書き込みます。 NdisTcpOffloadSendComplete 関数またはNdisTcpOffloadDisconnectComplete 関数を します。
オフロード ターゲットは、ホスト スタックが接続のオフロードを終了するまで、接続のリソースを解放することはできません。

TCP 接続の終了を要求する

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

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

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

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

イベント/状況 TCP_UPLOAD_REASON ホスト スタックの TCP 接続の終了
接続の追跡に使用されるハードウェアの状態が破損しています。 HardwareFailure 必須
オフロード ターゲットは、無効な状態オブジェクトに依存する TCP 接続でデータを送信しようとしました。 InvalidState 必須
オフロード ターゲットは、TCP ヘッダーに URG ビットが設定されたセグメントを受け取ります。 オフロード ターゲットは緊急データを確認する ACK を送信しないことに注意してください。 ReceivedUrgentData 必須
TCP 接続でタイムアウトが発生しました。 TimeoutExpiration 必須
オフロード ターゲットは、未指定の理由でアップロードを要求しています。 UploadRequested 必須
オフロード ターゲットは、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 する」を参照してください。

送信バックログ サイズの変更を示す

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

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

必要条件

要件 価値
ターゲット プラットフォーム 万国
ヘッダー ndischimney.h (Ndischimney.h を含む)
IRQL DISPATCH_LEVEL

関連項目

TCP Chimney-Specific イベントの を示す

ミニポートInitiateOffload

ミニポート ターミナルのOffload

NdisMOffloadEventIndicate

NdisTcpOffloadDisconnectComplete NdisTcpOffloadReceiveComplete をする

NdisTcpOffloadSendComplete

ProtocolTcpOffloadEvent

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