Fonctions de hachage RSS

Vue d'ensemble

Une carte réseau ou son pilote miniport utilise la fonction de hachage RSS pour calculer une valeur de hachage RSS.

Les pilotes sur-ment définissent le type de hachage, la fonction et la table pour affecter 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

Notes

Actuellement, NdisHashFunctionToeplitz est la seule fonction de hachage disponible pour les pilotes miniport. Les autres fonctions de hachage sont réservées à NDIS. 

Un pilote miniport doit identifier la fonction de hachage et la valeur qu’il 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 pseudocodes 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 nécessaire. Des formats spécifiques pour les flux d’octets sont définis plus loin dans les quatre exemples.

Le pilote overlying fournit une clé secrète (K) au pilote miniport à utiliser dans le calcul de hachage. La clé est de 40 octets (320 bits) de long. 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 input[0], et le bit d’entrée le plus significatif[0] est le bit le plus à gauche. L’octet le plus à droite est input[n-1], et le bit d’entrée le moins significatif[n-1] est le bit le plus à droite.

Compte tenu des 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 de la forme @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)