用戶端驅動程式會實作 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