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 d’indirection rss (receive side scaling) 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 par le pilote client lors d’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 retournée
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’une carte réseau, avant d’appeler NetAdapterStart.
Lorsqu’un pilote de protocole doit rééquilibrer la charge de travail du processeur en RSS, il calcule d’abord un nouveau mappage pour chaque entrée de table d’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’il appelle la fonction de rappel EvtNetAdapterReceiveScalingSetIndirectionEntries du pilote.
Dans ce rappel, les pilotes clients déplacent chaque entrée de 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 status 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, de sorte qu’ils doivent 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 dont la taille diffère 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’attribution d’entrées. Pour obtenir un exemple de code de ce deuxième exemple, consultez l’exemple de pilote Github Realtek.
Exemple
Cet exemple simple suppose un ratio 1 :1 entre les files d’attente de réception et les processeurs, de sorte que la table d’indirection de la carte réseau a 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;
}
Configuration requise
Condition requise | Valeur |
---|---|
Plateforme cible | Universal |
Version KMDF minimale | 1,25 |
Version UMDF minimale | 2,33 |
En-tête | netreceivescaling.h (inclure netadaptercx.h) |
IRQL | DISPATCH_LEVEL |
Voir aussi
NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES