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],输入[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)