次の方法で共有


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 は、要求を受け取るドライバーの種類に応じて、ミニポート または フィルター。 このエントリ ポイントは、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で終了した直後に、新しいプロセッサで複数の IT を移動する OID 要求を受信する準備をする必要があります。

先端

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

上位層プロトコルでは、異なるプロセッサを指す ITEs やプライマリおよび既定のプロセッサ パラメーターを設定するOID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIESが発行されます。

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

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 をリモートでリダイレクトすることはできません。 true でない場合は、エントリの 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" とマークされたエントリのみが表示される場合は、システムをバグ チェックし、ミニポート ドライバーを原因としてポイントします。

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

  • 同じ VPort に対する "すべて移動" コマンドの一部として、上位レイヤーを一緒に実行するコマンドは、バッチ全体に連続して配置されます。
  • ミニポート ドライバーは、"すべて移動" の方法で、異なる VPort を対象とする可能性がある全体的なコマンド バッチを実行しないでください。 "すべて移動" セマンティクスに準拠して実行する必要があるのは、同じ VPort (同じ SwitchId + VPortId ペアでタグ付けされた) コマンドのグループだけです。
  • 上位レイヤーが "すべて移動" セマンティクスを気にしない場合、コマンドを別の VPort にコマンドを使用して同じ VPort にインターリーブすることがあります。 この場合、同じ VPort に対する 2 番目のコマンド グループが "キューの数" 違反のために実行できない場合、ミニポート ドライバーは対応する状態コード (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 つの移動コマンドをすべてアトミックに実行する必要はありません。 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 ごとのより細かいロックを使用でき、特定のデッドロックが回避されます。

手記

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

エラー条件と状態コード

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

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

必要条件

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

関連項目