RSS ハッシュ関数

概要

NIC またはそのミニポート ドライバーは、RSS ハッシュ関数を使用して RSS ハッシュ値を計算します。

上位ドライバーは、CPU に接続を割り当てるためにハッシュの種類、関数、およびテーブルを設定します。 詳細については、「RSS の構成」を参照してください。

ハッシュ関数は次のいずれかになります。

  • NdisHashFunctionToeplitz
  • NdisHashFunctionReserved1
  • NdisHashFunctionReserved2
  • NdisHashFunctionReserved3

Note

現在、 NdisHashFunctionToeplitz は、ミニポート ドライバーで使用できる唯一のハッシュ関数です。 その他のハッシュ関数は NDIS 用に予約されています。 

ミニポート ドライバーは、ドライバーが受信したデータを示す前に、各 NET_BUFFER_LIST 構造体で使用するハッシュ関数と値を識別する必要があります。 詳細については、「RSS 受信データの表示」を参照してください。

次の 4 つの擬似コードの例は、NdisHashFunctionToeplitz ハッシュ値を計算する方法を示しています。 これらの例は、NdisHashFunctionToeplitz で使用できる可能性のある 4 つのハッシュの種類を表しています。 ハッシュの種類の詳細については、「RSS ハッシュの種類」を参照してください。

例を簡略化するには、入力バイト ストリームを処理する一般化アルゴリズムが必要です。 バイト ストリームの特定の形式は、4 つの例の後半で定義します。

上位ドライバーは、ハッシュ計算で使用するミニポート ドライバーに秘密キー (K) を提供します。 キーの長さは 40 バイト (320 ビット) です。 キーの詳細については、「RSS の構成」を参照してください。

n バイトを含む入力配列を指定すると、バイト ストリームは次のように定義されます。

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

左端のバイトは input[0] で、input[0] の最上位ビットは左端のビットです。 右端のバイトは input[n-1] で、input[n-1] の最下位ビットは右端のビットです。

上記の定義を考えると、一般的な入力バイト ストリームを処理するための擬似コードは次のように定義されます。

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

擬似コードには、フォーム @n-m のエントリが含まれています。 これらのエントリは、TCP パケット内の各要素のバイト範囲を識別します。

TCP ヘッダーを使用した IPv4 のハッシュ計算の例

パケットの SourceAddress、DestinationAddress、SourcePort、DestinationPort の各フィールドをバイト配列に連結し、パケットで発生した順序を保持します。

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

IPv4 のみのハッシュ計算の例

パケットの SourceAddress フィールドと DestinationAddress フィールドをバイト配列に連結します。

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

TCP ヘッダーを使用した IPv6 のハッシュ計算の例

パケットの SourceAddress、DestinationAddress、SourcePort、DestinationPort の各フィールドをバイト配列に連結し、パケットで発生した順序を保持します。

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

IPv6 のみのハッシュ計算の例

パケットの SourceAddress フィールドと DestinationAddress フィールドをバイト配列に連結します。

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