EVT_NET_ADAPTER_RECEIVE_SCALING_SET_INDIRECTION_ENTRIES funzione di callback (netreceivescaling.h)
Il EvtNetAdapterReceiveScalingSetIndirectionEntries funzione di callback viene implementata dal driver client per eseguire spostamenti di voci di tabella di reindirizzamento indiretto (RSS) di ricezione in nuove code di ricezione.
Sintassi
EVT_NET_ADAPTER_RECEIVE_SCALING_SET_INDIRECTION_ENTRIES EvtNetAdapterReceiveScalingSetIndirectionEntries;
NTSTATUS EvtNetAdapterReceiveScalingSetIndirectionEntries(
[_In_] NETADAPTER Adapter,
[_Inout_] NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES *IndirectionEntries
)
{...}
Parametri
[_In_] Adapter
L'oggetto NETADAPTER ottenuto dal driver client in una chiamata precedente a NetAdapterCreate.
[_Inout_] IndirectionEntries
Puntatore a una struttura NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES che rappresenta la tabella di riferimento indiretto.
Valore restituito
Restituisce STATUS_SUCCESS se le operazioni di spostamento hanno avuto esito positivo. In caso contrario, restituisce un codice di errore NTSTATUS appropriato.
Osservazioni
Registrare l'implementazione di questa funzione di callback impostando il membro appropriato della struttura NET_ADAPTER_RECEIVE_SCALING_CAPABILITIES e quindi chiamando NetAdapterSetReceiveScalingCapabilities. I driver client chiamano in genere NetAdapterSetReceiveScalingCapabilities all'avvio di una scheda net, prima di chiamare NetAdapterStart.
Quando un driver di protocollo deve ribilanciare il carico di lavoro del processore in RSS, calcola prima di tutto un nuovo mapping per ogni voce di tabella di riferimento indiretto a un nuovo processore. Il protocollo passa quindi queste informazioni a NetAdapterCx, che esegue il mapping interno dei numeri del processore agli ID coda di ricezione della scheda di interfaccia di rete. NetAdapterCx archivia la nuova tabella di riferimento indiretto, con voci mappate per ricevere GLI ID coda, in una struttura NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES e passa questa struttura al driver client NIC quando richiama il driver EvtNetAdapterReceiveScalingSetIndirectionEntries funzione di callback.
In questo callback i driver client spostano ogni voce nella tabella di riferimento indiretto della scheda di interfaccia di rete nella coda di ricezione specificata. Ogni struttura NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRY nella matrice NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES contiene l'indice hash per tale voce nella tabella, la nuova coda di ricezione a cui assegnare la voce e un campo di stato che indica se tale spostamento è riuscito o meno.
La funzione di assegnazione delle voci di indice alle code di ricezione hardware dipende dalla progettazione di ogni scheda di interfaccia di rete. Ad esempio, alcuni driver client della scheda di interfaccia di rete potrebbero assegnare i propri ID a ogni coda di ricezione diversi dagli ID assegnati a NetAdapterCx, quindi dovranno prima convertire gli ID coda forniti in ID coda personalizzati prima di riassegnare voci di tabella di riferimento indiretto. Altre schede di interfaccia di rete potrebbero avere una tabella di riferimento indiretto compresso diversa dalle dimensioni della tabella di riferimento indiretto gestita dal sistema, pertanto i driver client di tali schede di interfaccia di rete dovranno calcolare l'indice corretto nella tabella di riferimento indiretto dell'hardware durante l'assegnazione delle voci. Per un esempio di codice di questo secondo esempio, vedere il driver di esempio Realtek Github.
Esempio
Questo semplice esempio presuppone un rapporto di 1:1 tra code di ricezione e processori, quindi la tabella di riferimento indiretto della scheda di interfaccia di rete corrisponde alla tabella di riferimento indiretto del sistema.
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;
}
Fabbisogno
Requisito | Valore |
---|---|
piattaforma di destinazione | Universale |
versione minima di KMDF | 1.25 |
versione minima di UMDF | 2.33 |
intestazione | netreceivescaling.h (include netadaptercx.h) |
IRQL | DISPATCH_LEVEL |
Vedere anche
NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES