RSS 哈希类型

概述

RSS 哈希类型指定接收的网络数据部分,NIC 必须使用这些数据来计算 RSS 哈希值。

过度分配驱动程序设置哈希类型、函数和间接寻址表。 覆盖驱动程序设置的哈希类型可以是微型端口驱动程序可以支持的类型的子集。 有关详细信息,请参阅 RSS 配置

哈希类型是以下标志的有效组合的 OR:

  • NDIS_HASH_IPV4
  • NDIS_HASH_TCP_IPV4
  • NDIS_HASH_UDP_IPV4
  • NDIS_HASH_IPV6
  • NDIS_HASH_TCP_IPV6
  • NDIS_HASH_UDP_IPV6
  • NDIS_HASH_IPV6_EX
  • NDIS_HASH_TCP_IPV6_EX
  • NDIS_HASH_UDP_IPV6_EX

下面是一组有效的标志组合:

  • NDIS_HASH_IPV4、NDIS_HASH_TCP_IPV4和NDIS_HASH_UDP_IPV4) 的 IPv4 (组合
  • IPv6 (NDIS_HASH_IPV6、NDIS_HASH_TCP_IPV6和NDIS_HASH_UDP_IPV6) 的组合
  • 具有扩展标头的 IPv6 (NDIS_HASH_IPV6_EX、NDIS_HASH_TCP_IPV6_EX和NDIS_HASH_UDP_IPV6_EX) 的组合

NIC 必须支持 IPv4 集中的组合之一。 其他集和组合是可选的。 一个 NIC 一次可以支持多个集。 在这种情况下,接收的数据类型决定了 NIC 使用的哈希类型。

通常,如果 NIC 无法正确解释接收的数据,则它不得计算哈希值。 例如,如果 NIC 仅支持 IPv4,并且它接收无法正确解释的 IPv6 数据包,则它不得计算哈希值。 如果 NIC 收到它不支持的传输类型的数据包,则它不得计算哈希值。 例如,如果 NIC 在应该计算 TCP 数据包的哈希值时收到 UDP 数据包,则它不得计算哈希值。 在这种情况下,数据包的处理方式是非 RSS 情况下的。 有关非 RSS 接收处理的详细信息,请参阅 非 RSS 接收处理

IPv4 哈希类型组合

IPv4 集中的有效哈希类型组合包括:

NDIS_HASH_IPV4

如果仅设置此标志,则 NIC 应通过以下 IPv4 标头字段计算哈希值:

  • Source-IPv4-Address
  • Destination-IPv4-Address

注意

如果 NIC 收到同时具有 IP 和 TCP 标头的数据包,则不应始终使用 NDIS_HASH_TCP_IPV4。 对于分段的 IP 数据包,必须使用NDIS_HASH_IPV4。 这包括第一个同时包含 IP 和 TCP 标头的片段。

NDIS_HASH_TCP_IPV4

如果仅设置此标志,NIC 应分析接收的数据,以标识包含 TCP 段的 IPv4 数据包。

NIC 必须标识并跳过存在的任何 IP 选项。 如果 NIC 无法跳过任何 IP 选项,则不应计算哈希值。

NIC 应通过以下字段计算哈希值:

  • Source-IPv4-Address
  • Destination-IPv4-Address
  • 源 TCP 端口
  • 目标 TCP 端口

NDIS_HASH_UDP_IPV4

如果仅设置此标志,NIC 应分析收到的数据,以标识包含 UDP 数据报的 IPv4 数据包。

NIC 必须标识并跳过存在的任何 IP 选项。 如果 NIC 无法跳过任何 IP 选项,则不应计算哈希值。

NIC 应通过以下字段计算哈希值:

  • Source-IPv4-Address
  • Destination-IPv4-Address
  • 源 UDP 端口
  • 目标 UDP 端口

NDIS_HASH_TCP_IPV4 |NDIS_HASH_IPV4

如果设置了此标志组合,NIC 应执行为NDIS_HASH_TCP_IPV4事例指定的哈希计算。 但是,如果数据包不包含 TCP 标头,则 NIC 应计算为NDIS_HASH_IPV4事例指定的哈希值。

NDIS_HASH_UDP_IPV4 |NDIS_HASH_IPV4

如果设置了此标志组合,NIC 应执行针对NDIS_HASH_UDP_IPV4事例指定的哈希计算。 但是,如果数据包不包含 UDP 标头,则 NIC 应计算为NDIS_HASH_IPV4事例指定的哈希值。

NDIS_HASH_TCP_IPV4 |NDIS_HASH_UDP_IPV4 |NDIS_HASH_IPV4

如果设置了此标志组合,NIC 应执行数据包中传输指定的哈希计算。 但是,如果数据包不包含 TCP 或 UDP 标头,则 NIC 应计算为NDIS_HASH_IPV4事例指定的哈希值。

IPv6 哈希类型组合

IPv6 集中的有效哈希类型组合包括:

NDIS_HASH_IPV6

如果单独设置了此标志,则 NIC 应通过以下字段计算哈希:

  • Source-IPv6-Address
  • Destination-IPv6-Address

NDIS_HASH_TCP_IPV6

如果仅设置此标志,NIC 应分析收到的数据,以标识包含 TCP 段的 IPv6 数据包。 NIC 必须标识并跳过数据包中存在的任何 IPv6 扩展标头。 如果 NIC 无法跳过任何 IPv6 扩展标头,则不应计算哈希值。

NIC 应通过以下字段计算哈希值:

  • Source-IPv6 -Address
  • Destination-IPv6 -Address
  • 源 TCP 端口
  • 目标 TCP 端口

NDIS_HASH_UDP_IPV6

如果仅设置此标志,NIC 应分析收到的数据,以标识包含 UDP 数据报的 IPv6 数据包。 NIC 必须标识并跳过数据包中存在的任何 IPv6 扩展标头。 如果 NIC 无法跳过任何 IPv6 扩展标头,则不应计算哈希值。

NIC 应通过以下字段计算哈希值:

  • Source-IPv6-Address
  • Destination-IPv6-Address
  • 源 UDP 端口
  • 目标 UDP 端口

NDIS_HASH_TCP_IPV6 |NDIS_HASH_IPV6

如果设置了此标志组合,NIC 应执行为NDIS_HASH_TCP_IPV6事例指定的哈希计算。 但是,如果数据包不包含 TCP 标头,则 NIC 应计算为NDIS_HASH_IPV6事例指定的哈希。

例如,如果数据包是分段的,则它可能不包含 TCP 标头。 在这种情况下,NIC 应仅通过 IP 标头计算哈希。

NDIS_HASH_UDP_IPV6 |NDIS_HASH_IPV6

如果设置了此标志组合,NIC 应执行针对NDIS_HASH_UDP_IPV6事例指定的哈希计算。 但是,如果数据包不包含 UDP 标头,则 NIC 应计算为NDIS_HASH_IPV6事例指定的哈希。

例如,如果数据包是分段的,则它可能不包含 UDP 标头。 在这种情况下,NIC 应仅通过 IP 标头计算哈希。

NDIS_HASH_TCP_IPV6 |NDIS_HASH_UDP_IPV6 |NDIS_HASH_IPV6

如果设置了此标志组合,NIC 应执行数据包中传输指定的哈希计算。 但是,如果数据包不包含 TCP 或 UDP 标头,则 NIC 应计算NDIS_HASH_IPV6事例中指定的哈希值。

例如,如果数据包是分段的,则它可能不包含 TCP 或 UDP 标头。 在这种情况下,NIC 应仅通过 IP 标头计算哈希。

具有扩展标头哈希类型组合的 IPv6

IPv6 中设置了扩展标头的有效组合如下:

NDIS_HASH_IPV6_EX

如果单独设置了此标志,则 NIC 应通过以下字段计算哈希:

  • IPv6 目标选项标头中的家庭地址选项中的家庭地址。 如果扩展标头不存在,请使用源 IPv6 地址。
  • 从关联的扩展标头包含在 Routing-Header-Type-2 中的 IPv6 地址。 如果扩展标头不存在,请使用目标 IPv6 地址。

NDIS_HASH_TCP_IPV6_EX

如果单独设置了此标志,则 NIC 应通过以下字段计算哈希:

  • IPv6 目标选项标头中的家庭地址选项中的家庭地址。 如果扩展标头不存在,请使用源 IPv6 地址。
  • 从关联的扩展标头包含在 Routing-Header-Type-2 中的 IPv6 地址。 如果扩展标头不存在,请使用目标 IPv6 地址。
  • 源 TCP 端口
  • 目标 TCP 端口

NDIS_HASH_UDP_IPV6_EX

如果单独设置了此标志,则 NIC 应通过以下字段计算哈希:

  • IPv6 目标选项标头中的家庭地址选项中的家庭地址。 如果扩展标头不存在,请使用源 IPv6 地址。
  • 从关联的扩展标头包含在 Routing-Header-Type-2 中的 IPv6 地址。 如果扩展标头不存在,请使用目标 IPv6 地址。
  • 源 UDP 端口
  • 目标 UDP 端口

NDIS_HASH_TCP_IPV6_EX |NDIS_HASH_IPV6_EX

如果设置了此标志组合,则 NIC 应执行针对NDIS_HASH_TCP_IPV6_EX事例指定的哈希计算。 但是,如果数据包不包含 TCP 标头,则 NIC 应计算为NDIS_HASH_IPV6_EX事例指定的哈希。

NDIS_HASH_UDP_IPV6_EX |NDIS_HASH_IPV6_EX

如果设置了此标志组合,则 NIC 应执行针对NDIS_HASH_UDP_IPV6_EX事例指定的哈希计算。 但是,如果数据包不包含 UDP 标头,则 NIC 应计算为NDIS_HASH_IPV6_EX事例指定的哈希。

NDIS_HASH_TCP_IPV6_EX |NDIS_HASH_UDP_IPV6_EX |NDIS_HASH_IPV6_EX

如果设置了此标志组合,NIC 应执行数据包传输指定的哈希计算。 但是,如果数据包不包含 TCP 或 UDP 标头,则 NIC 应计算为NDIS_HASH_IPV6_EX事例指定的哈希。

注意

如果微型端口驱动程序报告NDIS_RSS_CAPS_HASH_TYPE_TCP_IPV6_EX和/或NDIS_RSS_CAPS_HASH_TYPE_UDP_IPV6_EX NIC 的功能,则 NIC 必须根据协议驱动程序设置的 IPv6 扩展哈希类型计算) IPv6 扩展标头中的字段 (哈希值。 NIC 可以将扩展哈希类型或常规哈希类型存储在计算哈希值的 IPv6 数据包的NET_BUFFER_LIST结构中。

微型端口驱动程序在指示接收的数据之前,在 NET_BUFFER_LIST 结构中设置哈希类型。 有关详细信息,请参阅 指示 RSS 接收数据