共用方式為


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)