RSS 哈希函数

概述

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)