Configuration RSS
Pour obtenir des informations de configuration RSS, un pilote supérieur peut envoyer une requête OID de OID_GEN_RECEIVE_SCALE_CAPABILITIES à un pilote miniport. NDIS fournit également les informations de configuration RSS aux pilotes de protocole supérieurs dans la structure NDIS_BIND_PARAMETERS lors de l’initialisation.
Le pilote supérieur choisit une fonction de hachage, un type, et une table d’indirection. Pour définir ces options de configuration, le pilote envoie une requête OID set de OID_GEN_RECEIVE_SCALE_PARAMETERS au pilote miniport. Les pilotes supérieurs peuvent également interroger cet OID pour obtenir les paramètres RSS actuels. Le tampon d’informations pour l’OID OID_GEN_RECEIVE_SCALE_PARAMETERS contient un pointeur vers une structure NDIS_RECEIVE_SCALE_PARAMETERS.
Le pilote supérieur peut désactiver le RSS sur la NIC. Dans ce cas, le pilote définit l’indicateur NDIS_RSS_PARAM_FLAG_DISABLE_RSS dans le membre Flags de la structure NDIS_RECEIVE_SCALE_PARAMETERS. Lorsque cet indicateur est défini, le pilote miniport doit ignorer tous les autres indicateurs et paramètres et désactiver RSS sur la NIC.
NDIS traite OID_GEN_RECEIVE_SCALE_PARAMETERS avant de le transmettre au pilote miniport et met à jour le *mot-clé RSS standardisé de l’adaptateur miniport, si nécessaire. Pour plus d’informations sur le mot-clé *RSS, veuillez consulter la section Standardized INF Keywords for RSS.
Après réception d’une requête set OID_GEN_RECEIVE_SCALE_PARAMETERS avec l’indicateur NDIS_RSS_PARAM_FLAG_DISABLE_RSS activé, le pilote miniport doit définir l’état RSS de la NIC à l’état initial de la NIC après l’initialisation. Par conséquent, si le pilote miniport reçoit une requête set OID_GEN_RECEIVE_SCALE_PARAMETERS subséquente avec l’indicateur NDIS_RSS_PARAM_FLAG_DISABLE_RSS désactivé, tous les paramètres doivent avoir les mêmes valeurs que celles définies après que le pilote miniport a reçu la requête set OID_GEN_RECEIVE_SCALE_PARAMETERS pour la première fois après l’initialisation de l’adaptateur miniport.
Un pilote supérieur peut utiliser l’OID OID_GEN_RECEIVE_HASH pour activer et configurer les calculs de hachage sur les trames reçues sans activer RSS. Les pilotes supérieurs peuvent également interroger cet OID pour obtenir les paramètres de hachage de réception actuels.
Le tampon d’informations pour l’OID OID_GEN_RECEIVE_HASH contient un pointeur vers une structure NDIS_RECEIVE_HASH_PARAMETERS. Pour une requête set, l’OID spécifie les paramètres de hachage que l’adaptateur miniport doit utiliser. Pour une requête query, l’OID renvoie les paramètres de hachage utilisés par l’adaptateur miniport. Cet OID est facultatif pour les pilotes prenant en charge RSS.
Remarque : Si le calcul de hachage de réception est activé, NDIS désactive le calcul de hachage de réception avant d’activer RSS. Si RSS est activé, NDIS désactive RSS avant d’activer le calcul de hachage de réception.
Tous les adaptateurs miniport pris en charge par le pilote miniport doivent fournir les mêmes paramètres de configuration de hachage à tous les protocoles liés ultérieurement. Cet OID inclut également la clé secrète que le pilote miniport ou la NIC doit utiliser pour les calculs de hachage. La clé fait 320 bits de long (40 octets) et peut contenir n’importe quelles données choisies par le pilote supérieur, par exemple, un flux aléatoire d’octets.
Pour rééquilibrer la charge de traitement, le pilote supérieur peut définir les paramètres RSS et modifier la table d’indirection. Normalement, tous les paramètres restent inchangés sauf la table d’indirection. Cependant, après l’initialisation de RSS, le pilote supérieur pourrait modifier d’autres paramètres d’initialisation RSS. Si nécessaire, le pilote miniport peut réinitialiser le matériel de la NIC pour modifier la fonction de hachage, la clé secrète de hachage, le type de hachage, le numéro de CPU de base, ou le nombre de bits utilisés pour indexer la table d’indirection.
Remarque : Le pilote supérieur peut définir ces paramètres à tout moment. Cela peut entraîner des indications de réception hors ordre. Les pilotes miniport prenant en charge TCP ne sont pas tenus de purger leurs files d’attente de réception dans ce cas.
La figure suivante fournit un exemple de contenu pour deux instances de la table d’indirection.
La figure précédente suppose une configuration à quatre processeurs, et le nombre de bits les moins significatifs utilisés à partir de la valeur de hachage est de 6 bits. Par conséquent, la table d’indirection contient 64 entrées.
Dans la figure, la table A liste les valeurs dans la table d’indirection immédiatement après l’initialisation. Plus tard, à mesure que la charge de trafic normale varie, la charge du processeur devient déséquilibrée. Le pilote supérieur détecte cette condition déséquilibrée et tente de rééquilibrer la charge en définissant une nouvelle table d’indirection. La table B répertorie les nouvelles valeurs de la table d’indirection. Dans la table B, une partie de la charge du CPU 2 est déplacée vers les CPU 1 et 3.
Remarque : Lorsque la table d’indirection est modifiée, pendant une courte période (pendant que les files d’attente des descripteurs de réception actuelles sont traitées), les paquets peuvent être traités sur le mauvais CPU. Il s’agit d’une condition transitoire normale.
La taille de la table d’indirection est généralement de deux à huit fois le nombre de processeurs du système.
Lorsque le pilote miniport distribue les paquets aux CPU, s’il y a trop de CPU, l’effort consacré à la distribution de la charge pourrait devenir prohibitif. Dans ce cas, les pilotes supérieurs doivent choisir un sous-ensemble de CPU sur lesquels le traitement des données réseau a lieu.
Dans certains cas, le nombre de files d’attente de réception matérielles disponibles pourrait être inférieur au nombre de CPU du système. Le pilote miniport doit examiner la table d’indirection pour déterminer les numéros de CPU à associer aux files d’attente matérielles. Si le nombre total de numéros de CPU différents apparaissant dans la table d’indirection est supérieur au nombre de files d’attente matérielles prises en charge par la NIC, le pilote miniport doit choisir un sous-ensemble des numéros de CPU de la table d’indirection. Le sous-ensemble est égal en nombre au nombre de files d’attente matérielles. Le pilote miniport a obtenu le paramètre IndirectionTableSize de OID_GEN_RECEIVE_SCALE_PARAMETERS. Le pilote miniport a spécifié la valeur NumberOfReceiveQueues en réponse à OID_GEN_RECEIVE_SCALE_CAPABILITIES.