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 來註冊此回呼函式的實作。 用戶端驅動程式通常會在啟動網路適配器之前呼叫 NetAdapterSetReceiveScalingCapabilities ,然後再呼叫 NetAdapterStart。
當通訊協定驅動程式需要重新平衡 RSS 中的處理器工作負載時,它會先計算每個間接數據表專案與新處理器的新對應。 然後通訊協定會將這項資訊傳遞至 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;
}
規格需求
需求 | 值 |
---|---|
目標平台 | Universal |
最小 KMDF 版本 | 1.25 |
最低UMDF版本 | 2.33 |
標頭 | netreceivescaling.h (包含 netadaptercx.h) |
IRQL | DISPATCH_LEVEL |
另請參閱
NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES