EVT_NET_ADAPTER_RECEIVE_SCALING_SET_INDIRECTION_ENTRIES Rückruffunktion (netreceivescaling.h)

Die Rückruffunktion EvtNetAdapterReceiveScalingSetIndirectionEntries wird vom Clienttreiber implementiert, um Verschiebungen von RSS-Dereferenzierungstabelleneinträ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 bei einem vorherigen Aufruf von NetAdapterCreate abgerufen hat.

[_Inout_] IndirectionEntries

Ein Zeiger auf eine NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES-Struktur , die die Dereferenzierungstabelle 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 beim Starten eines Netzadapters auf, bevor NetAdapterStart aufgerufen wird.

Wenn ein Protokolltreiber die Prozessorworkload in RSS neu ausgleichen muss, berechnet er zunächst eine neue Zuordnung für jeden Dereferenzierungstabelleneintrag zu einem neuen Prozessor. Anschließend übergibt das Protokoll diese Informationen an NetAdapterCx, das die Prozessornummern intern NIC-Empfangswarteschlangen-IDs zuordnet. NetAdapterCx speichert die neue Dereferenzierungstabelle 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 er die EvtNetAdapterReceiveScalingSetIndirectionEntries-Rückruffunktion des Treibers aufruft.

In diesem Rückruf verschieben Clienttreiber jeden Eintrag in der Dereferenzierungstabelle 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 Entwurf der einzelnen Netzwerkkarten ab. Beispielsweise können einige NIC-Clienttreiber jeder Empfangswarteschlange ihre eigenen IDs zuweisen, die sich von den netAdapterCx-zugewiesenen IDs unterscheiden, sodass sie die bereitgestellten Warteschlangen-IDs zuerst in ihre eigenen Warteschlangen-IDs übersetzen müssen, bevor sie die Einträge der dereferenzierenden Tabelle neu zuweisen. Andere NICs verfügen möglicherweise über eine komprimierte Dereferenzierungstabelle, die sich in ihrer Größe von der vom System verwalteten Dereferenzierungstabelle unterscheidet, sodass Clienttreiber dieser NICs beim Zuweisen von Einträgen den richtigen Index in der Dereferenzierungstabelle 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 Dereferenzierungstabelle der NIC dieselbe Größe wie die Dereferenzierungstabelle 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
Kopfzeile netreceivescaling.h (include netadaptercx.h)
IRQL DISPATCH_LEVEL

Weitere Informationen

NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES

NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRY

NetAdapterCx-Empfangsseitige Skalierung