Freigeben über


EVT_NET_ADAPTER_RECEIVE_SCALING_SET_INDIRECTION_ENTRIES Rückruffunktion (netreceivescaling.h)

Die Rückruffunktion EvtNetAdapterReceiveScalingSetIndirectionEntries wird vom Clienttreiber implementiert, um Verschiebungen von RSS-Indirektionstabelleneinträgen (Receive Side Scaling) in neue Empfangswarteschlangen durchzuführen.

Syntax

EVT_NET_ADAPTER_RECEIVE_SCALING_SET_INDIRECTION_ENTRIES EvtNetAdapterReceiveScalingSetIndirectionEntries;

NTSTATUS EvtNetAdapterReceiveScalingSetIndirectionEntries(
  [_In_]    NETADAPTER Adapter,
  [_Inout_] NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES *IndirectionEntries
)
{...}

Parameter

[_In_] Adapter

Das NETADAPTER-Objekt, das der Clienttreiber in einem vorherigen Aufruf von NetAdapterCreate abgerufen hat.

[_Inout_] IndirectionEntries

Ein Zeiger auf eine NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES-Struktur , die die Indirektionstabelle darstellt.

Rückgabewert

Gibt STATUS_SUCCESS zurück, wenn die Verschiebungsvorgänge erfolgreich waren. Andernfalls wird ein entsprechender NTSTATUS-Fehlercode zurückgegeben.

Hinweise

Registrieren Sie Ihre Implementierung dieser Rückruffunktion, indem Sie den entsprechenden Member der NET_ADAPTER_RECEIVE_SCALING_CAPABILITIES-Struktur festlegen und dann NetAdapterSetReceiveScalingCapabilities aufrufen. Clienttreiber rufen in der Regel NetAdapterSetReceiveScalingCapabilities auf, wenn sie einen Netzadapter starten, bevor NetAdapterStart aufgerufen wird.

Wenn ein Protokolltreiber die Prozessorworkload in RSS neu ausgleichen muss, berechnet er zunächst eine neue Zuordnung für jeden Indirektionstabelleneintrag zu einem neuen Prozessor. Anschließend übergibt das Protokoll diese Informationen an NetAdapterCx, das intern Prozessornummern NIC-Empfangswarteschlangen-IDs zuordnet. NetAdapterCx speichert die neue Indirektionstabelle mit Einträgen, die Empfangswarteschlangen-IDs zugeordnet sind, in einer NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES-Struktur und übergibt diese Struktur an den NIC-Clienttreiber, wenn die EvtNetAdapterReceiveScalingSetIndirectionEntries-Rückruffunktion des Treibers aufgerufen wird.

In diesem Rückruf verschieben Clienttreiber jeden Eintrag in der Indirektionstabelle ihrer NIC in die angegebene Empfangswarteschlange. Jede NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRY-Struktur im NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES-Array enthält den Hashindex für diesen Eintrag in der Tabelle, die neue Empfangswarteschlange, der der Eintrag zugewiesen werden soll, und ein status Feld, das angibt, ob diese einzelne Verschiebung erfolgreich war oder nicht.

Die Funktion zum Zuweisen von Indexeinträgen zu Hardware-Empfangswarteschlangen hängt vom Design der einzelnen NIC ab. Beispielsweise können einige NIC-Clienttreiber jeder Empfangswarteschlange ihre eigenen IDs zuweisen, die sich von den von NetAdapterCx zugewiesenen IDs unterscheiden, sodass sie zuerst die bereitgestellten Warteschlangen-IDs in ihre eigenen Warteschlangen-IDs übersetzen müssen, bevor Sie Einträge für indirekte Tabellen neu zuweisen. Andere NICs verfügen möglicherweise über eine komprimierte Indirektionstabelle, die sich in der Größe von der vom System verwalteten Indirektionstabelle unterscheidet, sodass Clienttreiber dieser NICs beim Zuweisen von Einträgen den richtigen Index in der Indirektionstabelle ihrer Hardware berechnen müssen. Ein Codebeispiel dieses zweiten Beispiels finden Sie im Realtek Github-Beispieltreiber.

Beispiel

In diesem einfachen Beispiel wird ein Verhältnis von Empfangswarteschlangen zu Prozessoren von 1:1 vorausgesetzt, sodass die Indirektionstabelle der NIC dieselbe Größe wie die Indirektionstabelle des Systems aufweist.

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;
}

Anforderungen

Anforderung Wert
Zielplattform Universell
KMDF-Mindestversion 1,25
UMDF-Mindestversion 2.33
Kopfzeile netreceivescaling.h (include netadaptercx.h)
IRQL DISPATCH_LEVEL

Weitere Informationen

NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES

NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRY

NetAdapterCx-Empfangsskalierung