共用方式為


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來註冊此回呼函式的實作。 用戶端驅動程式通常會在啟動 net adapter 時呼叫 NetAdapterSetReceiveScalingCapabilities,然後再呼叫 NetAdapterStart

當通訊協定驅動程式需要在 RSS 中重新平衡處理器工作負載時,它會先計算每個間接數據表專案與新處理器的新對應。 然後通訊協定會將這項資訊傳遞至 NetAdapterCx,而 NetAdapterCx 會在內部將處理器編號對應至 NIC 接收佇列標識碼。 NetAdapterCx 會將新的間接數據表儲存在 NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES 結構中,並對應至接收佇列標識符的專案,並在叫用驅動程式的 EvtNetAdapterReceiveScalingSetIndirectionEntries 回呼函式時,將此結構傳遞給 NIC 用戶端驅動程式。

在此回呼中,客戶端驅動程式會將 NIC 間接數據表中的每個專案移至指定的接收佇列。 NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES 陣列中的每個 NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRY 結構都包含數據表中該專案的哈希索引、要指派專案的新接收佇列,以及指出個別移動是否成功的狀態欄位。

將索引專案指派給硬體接收佇列的功能取決於每個 NIC 的設計。 例如,某些 NIC 用戶端驅動程式可能會將自己的標識碼指派給與 NetAdapterCx 指派標識碼不同的每個接收佇列,因此它們必須先將提供的佇列標識碼轉譯為自己的佇列標識碼,再重新指派間接數據表專案。 其他 NIC 可能有與系統維護間接取值數據表大小不同的壓縮間接數據表,因此指派專案時,這些 NIC 的用戶端驅動程式必須計算正確索引到其硬體的間接數據表中。 如需第二個範例的程式代碼範例,請參閱 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
標頭 netreceivescaling.h (包括 netadaptercx.h)
IRQL DISPATCH_LEVEL

另請參閱

NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES

NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRY

NetAdapterCx 接收端調整