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