Share via


RSS-Hashfunktionen

Übersicht

Eine NIC oder ihr Miniporttreiber verwendet die RSS-Hashfunktion, um einen RSS-Hashwert zu berechnen.

Überlastende Treiber legen den Hashtyp, die Funktion und die Tabelle fest, um CPUs Verbindungen zuzuweisen. Weitere Informationen finden Sie unter RSS-Konfiguration.

Die Hashfunktion kann eine der folgenden Sein:

  • NdisHashFunctionToeplitz
  • NdisHashFunctionReserved1
  • NdisHashFunctionReserved2
  • NdisHashFunctionReserved3

Hinweis

Derzeit ist NdisHashFunctionToeplitz die einzige Hashfunktion, die für Miniporttreiber verfügbar ist. Die anderen Hashfunktionen sind für NDIS reserviert. 

Ein Miniporttreiber sollte die Hashfunktion und den Wert identifizieren, die er in jeder NET_BUFFER_LIST-Struktur verwendet, bevor der Treiber empfangene Daten angibt. Weitere Informationen finden Sie unter Angeben von RSS-Empfangsdaten.

Beispiele

Die folgenden vier Pseudocodebeispiele zeigen, wie der NdisHashFunctionToeplitz-Hashwert berechnet wird. Diese Beispiele stellen die vier möglichen Hashtypen dar, die für NdisHashFunctionToeplitz verfügbar sind. Weitere Informationen zu Hashtypen finden Sie unter RSS-Hashingtypen.

Zur Vereinfachung der Beispiele ist ein generalisierter Algorithmus erforderlich, der einen Eingabebytestrom verarbeitet. Spezifische Formate für die Bytestreams werden später in den vier Beispielen definiert.

Der übersteigende Treiber stellt dem Miniporttreiber einen geheimen Schlüssel (K) zur Verwendung bei der Hashberechnung bereit. Der Schlüssel ist 40 Bytes (320 Bits) lang. Weitere Informationen zum Schlüssel finden Sie unter RSS-Konfiguration.

Bei einem Eingabearray, das n Byte enthält, wird der Bytedatenstrom wie folgt definiert:

input[0] input[1] input[2] ... input[n-1]

Das Byte auf der linken Seite ist input[0], und das wichtigste Bit der Eingabe[0] ist das bit, das am weitesten links ist. Das byte rechts ist input[n-1], und das kleinste Bit der Eingabe[n-1] ist das richtige Bit.

Unter Berücksichtigung der vorherigen Definitionen wird der Pseudocode für die Verarbeitung eines allgemeinen Eingabebytestreams wie folgt definiert:

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

Der Pseudocode enthält Einträge im Format @n-m. Diese Einträge identifizieren den Bytebereich jedes Elements im TCP-Paket.

Beispiel für eine Hashberechnung für IPv4 mit dem TCP-Header

Verketten Sie die Felder SourceAddress, DestinationAddress, SourcePort und DestinationPort des Pakets in ein Bytearray, und behalten Sie dabei die Reihenfolge bei, in der sie im Paket aufgetreten sind:

Input[12] = @12-15, @16-19, @20-21, @22-23
Result = ComputeHash(Input, 12)

Beispielhashberechnung nur für IPv4

Verketten Sie die Felder SourceAddress und DestinationAddress des Pakets in ein Bytearray.

Input[8] = @12-15, @16-19
Result = ComputeHash(Input, 8) 

Beispiel für eine Hashberechnung für IPv6 mit dem TCP-Header

Verketten Sie die Felder SourceAddress, DestinationAddress, SourcePort und DestinationPort des Pakets in einem Bytearray, wobei die Reihenfolge beibehalten wird, in der sie im Paket aufgetreten sind.

Input[36] = @8-23, @24-39, @40-41, @42-43
Result = ComputeHash(Input, 36)

Beispiel für eine Hashberechnung nur für IPv6

Verketten Sie die Felder SourceAddress und DestinationAddress des Pakets in ein Bytearray.

Input[32] = @8-23, @24-39
Result = ComputeHash(Input, 32)