概觀
NIC 或其迷你埠驅動程式會使用 RSS 雜湊函式來計算 RSS 雜湊值。
上層驅動程式會設定雜湊類型、功能及資料表,將連線指派給 CPU。 如需詳細資訊,請參閱 RSS 組態。
雜湊函數可以是下列其中一項:
- NdisHashFunctionToeplitz
- NdisHashFunctionReserved1
- NdisHashFunctionReserved2
- NdisHashFunctionReserved3
備註
目前, NdisHashFunctionToeplitz 是迷你埠驅動程式唯一可用的雜湊函式。 其他雜湊函式會保留給 NDIS。
迷你埠驅動程式應該先識別它在每個 NET_BUFFER_LIST 結構中使用的雜湊函式和值,再讓驅動程式指示收到的資料。 如需詳細資訊,請參閱 表示 RSS 接收資料的說明。
範例
下列四個虛擬程式碼範例示範如何計算 NdisHashFunctionToeplitz 雜湊值。 這些範例代表 NdisHashFunctionToeplitz 可用的四種可能雜湊類型。 如需雜湊類型的詳細資訊,請參閱 RSS 雜湊類型。
為了簡化範例,需要處理輸入位元組資料流程的通用演算法。 位元組資料流程的特定格式稍後會在四個範例中定義。
上覆驅動程式會提供秘密金鑰 (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)