OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES

警告

本トピックの一部の情報はリリース前の製品に関することであり、正式版がリリースされるまでに大幅に変更される可能性があります。 Microsoft はここに示されている情報について、明示か黙示かを問わず、一切保証しません。

RSSv2 は、Windows 10 バージョン 1809 でのみプレビューです。

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID は、RSSv2 対応ミニポート ドライバーに送信され、個々の間接指定テーブル エントリの移動を実行します。 この OID は 同期 OID で、NDIS_STATUS_PENDING を返すことはできません。 IRQL == DISPATCH_LEVEL でメソッド要求としてのみ発行されます。

この呼び出しでは、XxxSynchronousOidRequest エントリ ポイントが使用され、このとき Xxx は、要求を受信するドライバーの種類に応じて、Miniport または Filter となります。 このエントリ ポイントにより、NDIS_STATUS_PENDING の戻り状態が表示された場合、システム バグ チェックが発生します。

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES は、NDIS_RSS_SET_INDIRECTION_ENTRIES 構造体を使用して、一連のアクションを同期的に実行するようにミニポート アダプターに指示します。このとき、各アクションにより、指定された VPort の RSS 間接指定テーブルの単一エントリがターゲット指定 CPU に移動します。

解説

この OID は、これを発行したプロセッサ コンテキストで実行および完了する必要があります。 ミニポート ドライバーは、上層に NDIS_STATUS_SUCCESS を返す際に、この OID を完全に実行する必要があります。 つまり、ミニポート ドライバーは、最初の移動が NDIS_STATUS_SUCCESS で終了した直後に、新しいプロセッサで複数の ITE を移動する OID 要求を連続で受信できるようになっている必要があります。

ヒント

この OID を完全に実行するには、ミニポート ドライバーが ITE を移動する別のアクションを正常に試行する準備ができている必要があります。 キューの移動の直後に、ソース CPU またはターゲット CPU 上の処理中の受信トラフィックが示される場所は規定されていません。

上位層プロトコルでは、OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES が発行して、異なるプロセッサを指すように ITE および/またはプライマリと既定のプロセッサ パラメーターを設定します。

この OID は、 active または inactive トラフィック ステアリング パラメーターに発行できます。 ステアリング パラメーターの詳細については、「受信側スケーリング バージョン 2 (RSSv2)」 を参照してください。 inactive 状態のパラメーター/ITE の場合、ミニポート ドライバーはターゲット プロセッサを検証し、次の関連する RSS 状態が変更されるまで (有効化または無効化) キャッシュする必要があります。 その時点で、キャッシュされたプロセッサ番号が active になり、トラフィックの転送に使用されます。 active パラメーターの更新 (検証も必要) は、トラフィックを転送するために直ちに有効にする必要があります。

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES は、NDIS_OID_REQUEST_FLAGS_VPORT_ID_VALID フラグがクリアされているミニポート アダプターに発行される必要があります。 これは、配列内の異なる要素によって異なる VPort が参照される可能性があるためです。

この OID は IRQL == DISPATCH_LEVEL でのみ呼び出されます。

ミニポート ドライバーは、NDIS_NIC_SWITCH_CAPABILITIES 構造体でアドバタイズされた数以上の間接指定テーブル エントリの移動アクションを処理できる必要があります。 これは、その構造体の NumberOfIndirectionTableEntriesPerNonDefaultPFVPort または NumberOfIndirectionTableEntriesForDefaultVPort メンバー、またはネイティブ RSS モードの 128 で定義されています。

ミニポート ドライバーは、できるだけ多くのエントリを実行し、操作の結果を使用して各 NDIS_RSS_SET_INDIRECTION_ENTRYEntryStatus メンバーの更新を試みる必要があります。

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES の OID ハンドラー

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES の OID ハンドラーは、次のように動作する必要があります。

  • OID の同期呼び出しタイプのため、NDIS_STATUS_PENDING の戻り値は許可されません。
  • 現在の CPU 宛ての受信 ITE の移動 (以前にリモート プロセッサで開始された) を最終処理します。
  • ミニポート ドライバーが完全なパラメーター検証パスを実行することを強くお勧めします。 できない場合は、配列エントリの検証と実行を 1 つずつ実施します。 ミニポート ドライバーは、参照されているすべてのオブジェクトが有効な場合、以下を特にチェックする必要があります。
    • ITE の EntryStatus フィールドに NDIS_STATUS_PENDING を返すことが許可されていない。
    • ミニポート アダプターが存在し、適切な状態である。 それ以外の場合は、エントリの EntryStatus フィールドを NDIS_STATUS_ADAPTER_NOT_FOUND、NDIS_STATUS_ADAPTER_NOT_READY などに設定します。
    • 各 VPort が存在し、良好な状態である。 それ以外の場合は、エントリの EntryStatus フィールドを NDIS_STATUS_INVALID_PORT、NDIS_STATUS_INVALID_PORT_STATE などに設定します。
    • 各間接指定テーブル エントリ インデックスが、構成された範囲内にある。 この範囲は 0xFFFF か、OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 OID によって設定された [0...NumberOfIndirectionTableEntries - 1] 範囲内にあります。 0xFFFF および 0xFFFE エントリ インデックスには特別な意味があります。0xFFFF は既定のプロセッサを定義し、0xFFFE はプライマリ プロセッサを定義します。 エラーが発生した場合、ハンドラーはエントリの EntryStatus フィールドを NDIS_STATUS_INVALID_PARAMETER に設定します。
    • 上位層とミニポート ドライバーが、移動前に ITE が現在のプロセッサ (アクター CPU) を指していることを想定している。 つまり、ITE をリモートでリダイレクトすることはできません。 これが当てはまらない場合、エントリの EntryStatus フィールドを NDIS_STATUS_NOT_ACCEPTED に設定します。
    • すべてのターゲット プロセッサが有効で、ミニポート アダプターの RSS セットの一部である。 それ以外の場合は、エントリの EntryStatus フィールドを NDIS_STATUS_INVALID_DATA に設定します。
  • その後、またはパラメーター検証パスの一部として、リソースの状況を検証します。 完全なバッチ移動 (退避) 後に使用されるキューの数が、OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 要求中に NDIS_RECEIVE_SCALE_PARAMETERS_V2 構造体で設定された NumberOfQueues を超えていないことを検証します。 それ以外の場合は、NDIS_STATUS_NO_QUEUES が返されます。 NDIS_STATUS_NO_QUEUES は、構成された数のキューの違反を表すすべての条件に使用される必要があります。 NDIS_STATUS_RESOURCES は、一時的なメモリ不足の状態を指定するためにのみ使用される必要があります。
  • リソース チェックの一部として、スケーリング エンティティ (VPort など) ごとに、ミニポート ドライバーは、現在の CPU を指すすべての ITE がそこから移動されたときに、条件を処理する必要があります。

上記のすべてのチェックに合格すると、ミニポート ドライバーは無条件で新しい構成を適用でき、各エントリの EntryStatus フィールドを NDIS_STATUS_SUCCESS に設定する必要があります。

一般に、この OID のハンドラーは非常に軽量である必要があります。 スピンロックや NdisMConfigMSIXTableEntry などの可能な同期操作以外では、NDIS またはオペレーティング システム サービスを呼び出しません。

ミニポート ドライバーは、状態または PnP イベントを示すために NDIS を呼び出しません。

ミニポート ドライバーは、再帰が発生するため、この OID ハンドラーのコンテキストでは受信/送信の完了表示を使用しません。 上位層は、受信または送信表示のコンテキストからこの OID を呼び出すことができます。

すべての間接指定テーブル エントリの移動

ミニポート ドライバーは、現在の CPU からすべての間接指定テーブル エントリを移動する特別な要求を認識し、処理する必要があります。 RSSv2 は個々の ITE 移動で動作するため、ミニポート ドライバーは、操作全体の原子性を保証する必要があります。 移動コマンドの対応する配列の処理中にバッチの途中でエラーが発生した場合、ミニポート ドライバーは既に実行されたすべてのコマンドを元に戻し、コマンドごとの EntryStatus フィールドですべてのコマンドを "失敗" としてマークする必要があります。 上位層プロトコルでは常に、"move all ITEs" バッチに "succeeded" とマークされたすべてのコマンド、または "failed" とマークされたすべてのコマンドが含まれていることが想定され、トラフィックは結果の状態 (移動の前または後のいずれか) に従うことを前提としています。 上位層に "failed" とマークされたエントリのみが表示される場合、システムのバグチェックが発生し、ミニポート ドライバーが原因として示されます。

ミニポート ドライバーの "move all ITEs" コマンドの処理を支援し、デッドロックを回避するために、上位層プロトコルは、以下のように SwitchId + VPortId フィールドのペアで移動コマンドをバッチ内でグループ化します。

  • 同じ VPort に対する "move all" コマンドの一部として、上位層により一緒に実行される必要があるコマンドは、バッチ全体に連続して配置されます。
  • ミニポート ドライバーは、"move all" 方法では、異なる VPort を対象とする可能性がある全体的なコマンド バッチを実行しません。 "move all" セマンティクスに準拠して実行する必要があるのは、同じ VPort (同じ SwitchId + VPortId ペアでタグ付けされた) を対象とするコマンドのグループだけです。
  • 上位層が "move all" セマンティクスの影響を受けない場合、別の VPort に対するコマンドを使用して同じ VPort にコマンドをインターリーブしてもかまいません。 この場合、同じ VPort に対する 2 番目のコマンド グループが "number of queues" 違反のために実行できない場合、ミニポート ドライバーは対応する状態コード (NDIS_STATUS_NO_QUEUES) でそのグループをマークし、上位層が回復を担当します。

たとえば、上位層プロトコルが次のような一連のコマンドをインターリーブする場合があります。

  • VPort=1 ITE[0,1]
  • VPort=2 ITE[0]
  • VPort=1 ITE[2]

ミニポート ドライバーは、4 つの移動コマンドのすべて、または VPort=1 (ITE[0,1,2]) の 3 つの移動コマンドのすべてをアトミックに実行する必要はありません。 "move all" 方法で VPort=1 ITE[0,1] グループを実行し、次に VPort=2 ITE[0] グループ、VPort=1 ITE[2] グループの順に実行します。 3 つのコマンド グループすべての結果が異なる場合があります。 たとえば、VPort=1 ITE[0,1]VPort=2 ITE[0] のグループは成功し、VPort=1 ITE[2] グループは失敗する場合があります。 結果は、各コマンド構造の対応する EntryStatus メンバーに反映される必要があります。 このように、ミニポート ドライバーは、バッチ全体を安全に実行するための予防措置を講じる必要がありません (アダプター全体をロックするなど)。 特定の VPort を対象とするコマンドのみをシリアル化する必要があり、VPort ごとのより細かいロックを使用でき、特定のデッドロックが回避されます。

Note

コマンドのエントリのグループ全体が同じエントリの状態でマークされている必要があります。

エラー状態と状態コード

この OID は、エラーが発生すると、次の状態コードを返します。

状態コード エラー状態
NDIS_STATUS_INVALID_LENGTH OID の形式に誤りがある。
NDIS_STATUS_INVALID_PARAMETER ヘッダーまたは OID 自体 (個々のコマンド エントリは含まれません) の他のフィールドに無効な値が含まれています。

要件

バージョン: Windows 10 バージョン 1709 ヘッダー: Ntddndis.h (Ndis.h を含む)

関連項目