Freigeben über


RSS-Hashfunktionen

Überblick

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

Durch übergeordnete Treiber werden der Hashtyp, die Funktion und die Tabelle festgelegt, um Verbindungen CPUs 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 miniport-Treibern zur Verfügung steht. 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 Hashwert NdisHashFunctionToeplitz 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.

Um die Beispiele zu vereinfachen, ist ein generalisierter Algorithmus erforderlich, der einen Eingabebytestrom verarbeitet. Spezifische Formate für die Bytedatenströme werden weiter unten in den vier Beispielen definiert.

Der Überlauftreiber stellt dem Miniporttreiber für die Verwendung in der Hashberechnung einen geheimen Schlüssel (K) bereit. Der Schlüssel ist 40 Bytes (320 Bit) 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 linksste Byte ist eingabe[0], und das wichtigste Bit der Eingabe[0] ist das linksste Bit. Das rechteste Byte ist die Eingabe[n-1], und das am wenigsten signifikante Bit der Eingabe[n-1] ist das rechteste Bit.

In Anbetracht der vorstehenden Definitionen wird der Pseudocode für die Verarbeitung eines allgemeinen Eingabebytestroms 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 des Formulars @n-m. Diese Einträge identifizieren den Bytebereich jedes Elements im TCP-Paket.

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

Verketten Sie die Felder "SourceAddress", "DestinationAddress", "SourcePort" und "DestinationPort" des Pakets in ein Bytearray, wobei die Reihenfolge erhalten bleibt, 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-Hashberechnung für IPv6 mit dem TCP-Header

Verketten Sie die Felder "SourceAddress", "DestinationAddress", "SourcePort" und "DestinationPort" des Pakets in ein 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)

Beispielhashberechnung 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)