Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Aperçu
Une carte réseau (NIC) ou son pilote miniport utilise la fonction de hachage RSS pour calculer une valeur de hachage RSS.
Les pilotes superposés définissent le type de hachage, la fonction et la table pour attribuer des connexions aux processeurs. Pour plus d’informations, consultez Configuration RSS.
La fonction de hachage peut être l’une des suivantes :
- NdisHashFunctionToeplitz
- NdisHashFunctionReserved1
- NdisHashFunctionReserved2
- NdisHashFunctionReserved3
Remarque
Actuellement, NdisHashFunctionToeplitz est la seule fonction de hachage disponible pour les pilotes miniport. Les autres fonctions de hachage sont réservées à l'NDIS.
Un pilote miniport doit identifier la fonction de hachage et la valeur qu’elle utilise dans chaque structure NET_BUFFER_LIST avant que le pilote indique les données reçues. Pour plus d’informations, consultez Indication des données de réception RSS.
Exemples
Les quatre exemples de pseudocode suivants montrent comment calculer la valeur de hachage NdisHashFunctionToeplitz . Ces exemples représentent les quatre types de hachage possibles disponibles pour NdisHashFunctionToeplitz. Pour plus d’informations sur les types de hachage, consultez Types de hachage RSS.
Pour simplifier les exemples, un algorithme généralisé qui traite un flux d’octets d’entrée est requis. Les formats spécifiques pour les flux d’octets sont définis plus loin dans les quatre exemples.
Le pilote supérieur fournit une clé secrète (K) au pilote miniport pour le calcul de hachage. La clé est de 40 octets (320 bits) longs. Pour plus d’informations sur la clé, consultez Configuration RSS.
Étant donné un tableau d’entrée qui contient n octets, le flux d’octets est défini comme suit :
input[0] input[1] input[2] ... input[n-1]
L’octet le plus à gauche est l’entrée[0], et le bit le plus significatif de l’entrée[0] est le bit le plus à gauche. L’octet le plus à droite est l'entrée[n-1], et le bit le moins significatif de l'entrée[n-1] est le bit le plus à droite.
Étant donné les définitions précédentes, le pseudocode pour le traitement d’un flux d’octets d’entrée général est défini comme suit :
ComputeHash(input[], n)
result = 0
For each bit b in input[] from left to right
{
if (b == 1) result ^= (left-most 32 bits of K)
shift K left 1 bit position
}
return result
Le pseudocode contient des entrées du formulaire @n-m. Ces entrées identifient la plage d’octets de chaque élément du paquet TCP.
Exemple de calcul de hachage pour IPv4 avec l’en-tête TCP
Concaténer les champs SourceAddress, DestinationAddress, SourcePort et DestinationPort du paquet dans un tableau d’octets, en conservant l’ordre dans lequel ils se sont produits dans le paquet :
Input[12] = @12-15, @16-19, @20-21, @22-23
Result = ComputeHash(Input, 12)
Exemple de calcul de hachage pour IPv4 uniquement
Concaténer les champs SourceAddress et DestinationAddress du paquet dans un tableau d’octets.
Input[8] = @12-15, @16-19
Result = ComputeHash(Input, 8)
Exemple de calcul de hachage pour IPv6 avec l’en-tête TCP
Concaténer les champs SourceAddress, DestinationAddress, SourcePort et DestinationPort du paquet dans un tableau d’octets, en conservant l’ordre dans lequel ils se sont produits dans le paquet.
Input[36] = @8-23, @24-39, @40-41, @42-43
Result = ComputeHash(Input, 36)
Exemple de calcul de hachage pour IPv6 uniquement
Concaténer les champs SourceAddress et DestinationAddress du paquet dans un tableau d’octets.
Input[32] = @8-23, @24-39
Result = ComputeHash(Input, 32)