Condividi tramite


EVT_NET_ADAPTER_RECEIVE_SCALING_SET_INDIRECTION_ENTRIES funzione di callback (netreceivescaling.h)

La funzione di callback EvtNetAdapterReceiveScalingSetIndirectionEntries viene implementata dal driver client per eseguire lo spostamento delle voci di tabella di scalabilità lato ricezione (RSS) per le 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 il driver client ottenuto in una chiamata precedente a NetAdapterCreate.

[_Inout_] IndirectionEntries

Puntatore a una struttura NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES che rappresenta la tabella di 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.

Commenti

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 quando si avvia 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 indiretta 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 indiretta, con voci mappate per ricevere ID coda, in una struttura NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES e passa questa struttura al driver client della scheda di interfaccia di rete quando richiama la funzione di callback evtNetAdapterReceiveScalingSetIndirectionEntries .

In questo callback i driver client spostano ogni voce nella tabella di indiretto della scheda di interfaccia di rete nella coda di ricezione specificata. Ogni struttura NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRY nella matrice di 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 singolo movimento ha avuto esito positivo o meno.

La funzione di assegnazione delle voci di indice all'hardware riceve le code dipende dalla progettazione di ogni scheda di interfaccia di rete. Ad esempio, alcuni driver client della scheda di interfaccia di interfaccia di rete potrebbero assegnare i propri ID a ogni coda di ricezione diversa dagli ID assegnati a NetAdapterCx, in modo da dover prima tradurre gli ID della coda forniti nei propri ID coda prima di riassegnare voci di tabella indirette. Altre schede di interfaccia di rete potrebbero avere una tabella di indiretto compressa che differisce dalle dimensioni della tabella indiretta gestita dal sistema, pertanto i driver client di tali schede di interfaccia di rete dovranno calcolare l'indice corretto nella tabella di indiretto dell'hardware durante l'assegnazione delle voci. Per un esempio di codice di questo secondo esempio, vedere il driver di esempio Github Realtek.

Esempio

Questo semplice esempio presuppone un rapporto 1:1 di code di ricezione ai processori, quindi la tabella di indiretto della scheda di interfaccia di rete è la stessa dimensione della tabella di 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;
}

Requisiti

Requisito Valore
Piattaforma di destinazione Universale
Versione KMDF minima 1,25
Versione UMDF minima 2.33
Intestazione netreceivescaling.h (include netadaptercx.h)
IRQL DISPATCH_LEVEL

Vedi anche

NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES

NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRY

Scalabilità laterale netAdapterCx