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)