Partager via


EVT_NET_ADAPTER_RECEIVE_SCALING_SET_INDIRECTION_ENTRIES fonction de rappel (netreceivescaling.h)

La fonction de rappel EvtNetAdapterReceiveScalingSetIndirectionEntries est implémentée par le pilote client pour effectuer des déplacements d’entrées de table de mise à l’échelle côté réception (RSS) vers de nouvelles files d’attente de réception.

Syntaxe

EVT_NET_ADAPTER_RECEIVE_SCALING_SET_INDIRECTION_ENTRIES EvtNetAdapterReceiveScalingSetIndirectionEntries;

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

Paramètres

[_In_] Adapter

Objet NETADAPTER obtenu dans un appel précédent à NetAdapterCreate.

[_Inout_] IndirectionEntries

Pointeur vers une structure NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES qui représente la table d’indirection.

Valeur de retour

Retourne STATUS_SUCCESS si les opérations de déplacement ont réussi. Sinon, retourne un code d’erreur NTSTATUS approprié.

Remarques

Inscrivez votre implémentation de cette fonction de rappel en définissant le membre approprié de la structure NET_ADAPTER_RECEIVE_SCALING_CAPABILITIES, puis en appelant NetAdapterSetReceiveScalingCapabilities. Les pilotes clients appellent généralement NetAdapterSetReceiveScalingCapabilities lors du démarrage d’un adaptateur net, avant d’appeler NetAdapterStart.

Lorsqu’un pilote de protocole doit rééquilibrer la charge de travail du processeur dans RSS, il calcule d’abord un nouveau mappage pour chaque entrée de table indirection vers un nouveau processeur. Ensuite, le protocole transmet ces informations à NetAdapterCx, qui mappe en interne les numéros de processeur aux ID de file d’attente de la carte réseau. NetAdapterCx stocke la nouvelle table d’indirection, avec des entrées mappées pour recevoir des ID de file d’attente, dans une structure NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES et transmet cette structure au pilote client de carte réseau lorsqu’elle appelle la fonction de rappel EvtNetAdapterReceiveScalingSetIndirectionEntries fonction de rappel.

Dans ce rappel, les pilotes clients déplacent chaque entrée dans la table d’indirection de leur carte réseau vers la file d’attente de réception spécifiée. Chaque structure NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRY dans le tableau NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES contient l’index de hachage de cette entrée dans la table, la nouvelle file d’attente de réception à laquelle affecter l’entrée et un champ d’état indiquant si ce déplacement individuel a réussi ou non.

La fonction d’affectation d’entrées d’index aux files d’attente de réception matérielles dépend de la conception de chaque carte réseau. Par exemple, certains pilotes clients de carte réseau peuvent affecter leurs propres ID à chaque file d’attente de réception qui sont différents des ID attribués par NetAdapterCx. Ils doivent donc d’abord traduire les ID de file d’attente fournis en leurs propres ID de file d’attente avant de réaffecter les entrées de table d’indirection. D’autres cartes réseau peuvent avoir une table d’indirection compressée qui diffère de la taille de la table d’indirection gérée par le système. Les pilotes clients de ces cartes réseau doivent donc calculer l’index correct dans la table d’indirection de leur matériel lors de l’affectation d’entrées. Pour obtenir un exemple de code de ce deuxième exemple, consultez le exemple de pilote Github Realtek.

Exemple

Cet exemple simple suppose un ratio de 1:1 des files d’attente de réception aux processeurs, de sorte que la table d’indirection de la carte réseau est de la même taille que la table d’indirection du système.

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

Exigences

Exigence Valeur
plateforme cible Universel
version minimale de KMDF 1.25
version minimale de UMDF 2.33
d’en-tête netreceivescaling.h (include netadaptercx.h)
IRQL DISPATCH_LEVEL

Voir aussi

NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES

NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRY

la mise à l’échelle côté réception NetAdapterCx