RSS 哈希类型

概述

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

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

哈希类型是一种由以下标志有效组合构成的“或”运算。

  • 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

以下是有效的标志组合集:

  • IPv4(NDIS_HASH_IPV4、NDIS_HASH_TCP_IPV4和NDIS_HASH_UDP_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 标头字段计算哈希值:

  • 源 -IPv4-Address
  • 目的地-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 应计算以下字段的哈希值:

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

NDIS_HASH_UDP_IPV4

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

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

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

  • 源 -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 应基于以下字段计算哈希:

  • 源 -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 应计算以下字段的哈希值:

  • 源 -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 地址。
  • 来自关联扩展头部的路由头类型 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事例指定的哈希。

注释

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

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