RSS 雜湊函式
概觀
NIC 或其迷你埠驅動程式會使用 RSS 雜湊函數來計算 RSS 雜湊值。
過度分配驅動程式會設定雜湊類型、函式和資料表,以指派連線給 CPU。 如需詳細資訊,請參閱 RSS 組態。
雜湊函式可以是下列其中一項:
- NdisHashFunctionToeplitz
- NdisHashFunctionReserved1
- NdisHashFunctionReserved2
- NdisHashFunctionReserved3
注意
目前, NdisHashFunctionToeplitz 是唯一可供迷你埠驅動程式使用的雜湊函式。 其他雜湊函式會保留給 NDIS。
迷你埠驅動程式應該在驅動程式指出已接收的資料之前,先識別它在每個 NET_BUFFER_LIST 結構中使用的雜湊函式和值。 如需詳細資訊,請參閱 指出 RSS 接收資料。
範例
下列四個虛擬程式碼範例示範如何計算 NdisHashFunctionToeplitz 雜湊值。 這些範例代表 NdisHashFunctionToeplitz可用的四種可能雜湊類型。 如需雜湊類型的詳細資訊,請參閱 RSS 雜湊類型。
為了簡化範例,需要處理輸入位元組資料流程的一般化演算法。 位元組資料流程的特定格式稍後會在四個範例中定義。
超載驅動程式會將秘密金鑰 (K) 提供給迷你埠驅動程式,以用於雜湊計算。 索引鍵 (320 位) 長 40 個位元組。 如需金鑰的詳細資訊,請參閱 RSS 組態。
假設輸入陣列包含 n 個位元組,位元組資料流程的定義如下:
input[0] input[1] input[2] ... input[n-1]
最左邊的位元組是 input[0],而最顯著位的 input[0] 是最左邊的位。 最右邊的位元組是 input[n-1],而最不重要的輸入位[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 封包中每個專案的位元組範圍。
IPv4 與 TCP 標頭的範例雜湊計算
將封包的 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)