EVT_NET_ADAPTER_RECEIVE_SCALING_SET_INDIRECTION_ENTRIES コールバック関数 (netreceivescaling.h)
EvtNetAdapterReceiveScalingSetIndirectionEntries コールバック関数は、受信側スケーリング (RSS) 間接参照テーブル エントリを新しい受信キューに移動するために、クライアント ドライバーによって実装されます。
構文
EVT_NET_ADAPTER_RECEIVE_SCALING_SET_INDIRECTION_ENTRIES EvtNetAdapterReceiveScalingSetIndirectionEntries;
NTSTATUS EvtNetAdapterReceiveScalingSetIndirectionEntries(
[_In_] NETADAPTER Adapter,
[_Inout_] NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES *IndirectionEntries
)
{...}
パラメーター
[_In_] Adapter
NetAdapterCreate の以前の呼び出しで取得したクライアント ドライバー の NETADAPTER オブジェクト。
[_Inout_] IndirectionEntries
間接参照テーブルを表す NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES 構造体へのポインター。
戻り値
移動操作が成功した場合STATUS_SUCCESSを返します。 それ以外の場合は、適切な NTSTATUS エラー コードを返します。
注釈
このコールバック関数の実装を登録するには、 NET_ADAPTER_RECEIVE_SCALING_CAPABILITIES 構造体の適切なメンバーを設定し、 NetAdapterSetReceiveScalingCapabilities を呼び出します。 クライアント ドライバーは通常、NetAdapterStart を呼び出す前に、Net アダプターを起動するときに NetAdapterSetReceiveScalingCapabilities を呼び出 します。
プロトコル ドライバーは、RSS でプロセッサのワークロードを再調整する必要がある場合、最初に新しいプロセッサへの各間接参照テーブル エントリの新しいマッピングを計算します。 その後、プロトコルはこの情報を NetAdapterCx に渡します。これにより、プロセッサ番号が NIC 受信キュー ID に内部的にマップされます。 NetAdapterCx は、キュー ID を受信するようにマップされたエントリを含む新しい間接テーブルを NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES 構造体に格納し、ドライバーの EvtNetAdapterReceiveScalingSetIndirectionEntries コールバック関数を呼び出すときに、この構造体を NIC クライアント ドライバーに渡します。
このコールバックでは、クライアント ドライバーは、NIC の間接参照テーブル内の各エントリを指定された受信キューに移動します。 NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES配列の各NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRY構造体には、テーブル内のそのエントリのハッシュ インデックス、エントリを割り当てる新しい受信キュー、および個々の移動が成功したかどうかを示す状態フィールドが含まれています。
ハードウェア受信キューにインデックス エントリを割り当てる機能は、各 NIC の設計によって異なります。 たとえば、一部の NIC クライアント ドライバーは、NetAdapterCx 割り当て ID とは異なる各受信キューに独自の ID を割り当てる可能性があるため、間接参照テーブルエントリを再割り当てする前に、最初に指定されたキュー ID を独自のキュー ID に変換する必要があります。 他の NIC には、システムによって管理される間接参照テーブルとはサイズが異なる圧縮間接参照テーブルがある場合があるため、これらの NIC のクライアント ドライバーは、エントリを割り当てるときに、ハードウェアの間接参照テーブルに正しいインデックスを計算する必要があります。 この 2 番目の例のコード サンプルについては、 Realtek Github サンプル ドライバーを参照してください。
例
この簡単な例では、プロセッサに対する受信キューの比率が 1:1 であると仮定しているため、NIC の間接参照テーブルのサイズはシステムの間接参照テーブルと同じです。
NTSTATUS
MyEvtNetAdapterReceiveScalingSetIndirectionEntries(
_In_ NETADAPTER Adapter,
_Inout_ PNET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES IndirectionEntries
)
{
// Get the adapter's context to retrieve the address of the hardware indirection table
PMY_NET_ADAPTER_CONTEXT adapterContext = GetMyAdapterContext(Adapter);
// Assign each indirection table entry to the specified receive queue
for(size_t i = 0; i < IndirectionEntries->Count; i++)
{
// Get the queue ID from its context
const ULONG queueId = GetMyRxQueueContext(IndirectionEntries->Entries[i].Queue)->QueueId;
// Get the hash index for this entry
const UINT32 index = IndirectionEntries->Entries[i].Index;
// Assign the new queue ID for this index in the indirection table and record success
IndirectionEntries->Entries[i].Status = MySetIndirectionTableEntry(adapterContext->HardwareInfo->RssIndirectionTable[index],
queueId
);
}
return STATUS_SUCCESS;
}
要件
要件 | 値 |
---|---|
対象プラットフォーム | ユニバーサル |
最小 KMDF バージョン | 1.25 |
最小 UMDF バージョン | 2.33 |
Header | netreceivescaling.h (netadaptercx.h を含む) |
IRQL | DISPATCH_LEVEL |
こちらもご覧ください
NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES