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
Header netreceivescaling.h (netadaptercx.h を含む)
IRQL DISPATCH_LEVEL

こちらもご覧ください

NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES

NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRY

NetAdapterCx Receive Side Scaling