DPDK - RSS 卸载(哈希计算):ETH_RSS_IPV6_EX - 解释
DPDK - RSS Offloads (Hash Calculations): ETH_RSS_IPV6_EX - Explanation
所以我目前正在努力了解如何在 DPDK(数据平面开发工具包)中进行接收端缩放 (RSS) 卸载。因此,基本上根据我的理解,根据您选择的卸载,它会计算一个哈希值并使用该值将您的数据包放置在特定队列上进行处理,该队列绑定到特定的 CPU 核心。
所以我对此有 2 个疑问:
当我使用 **ETH_RSS_IPV6_EX**
的 RSS 卸载时,我无法获取
不是零的哈希值,这意味着该数据包被认为是
根据所选的 RSS Offload 无效,即使我的
Mellanox 卡支持这种卸载。我已经发送了以下 Scapy 数据包,但哈希值仍然为 0:sendp(Ether(dst="AA:AA:BB:BB:CC:DD")/IPv6(dst="a:a:a:a:a:a:a:b",src="a:a:a:a:a:a:a:c",nh=60)/IPv6ExtHdrDestOpt(nh=43,options=HAO(hoa="a:a:a:a:a:a:a:d"))/IPv6ExtHdrRouting(nh=59,type=2,addresses=["a:a:a:a:a:a:a:e"]),iface="enp4s0f0",count=1)
。
(我从 https://docs.microsoft.com/en-us/windows-hardware/drivers/network/rss-hashing-types#ndis_hash_ipv6_ex 获得了关于要处理哪些数据包的资源,但我相信这些 RSS 卸载和 DPDK 具有的卸载之间可能存在差异。)这是什么 EX RSS Offload 中的术语均值。
除此之外,有人可以指点我一个资源来解释
RSS Offloads,一次一个,在 DPDK 中,其中一些是
以下(如果您对这些有所了解,提供一些笑话也会有所帮助):
#define ETH_RSS_IPV4 (1ULL << 2)
#define ETH_RSS_FRAG_IPV4 (1ULL << 3)
#define ETH_RSS_NONFRAG_IPV4_TCP (1ULL << 4)
#define ETH_RSS_NONFRAG_IPV4_UDP (1ULL << 5)
#define ETH_RSS_NONFRAG_IPV4_SCTP (1ULL << 6)
#define ETH_RSS_NONFRAG_IPV4_OTHER (1ULL << 7)
#define ETH_RSS_IPV6 (1ULL << 8)
#define ETH_RSS_FRAG_IPV6 (1ULL << 9)
#define ETH_RSS_NONFRAG_IPV6_TCP (1ULL << 10)
#define ETH_RSS_NONFRAG_IPV6_UDP (1ULL << 11)
#define ETH_RSS_NONFRAG_IPV6_SCTP (1ULL << 12)
#define ETH_RSS_NONFRAG_IPV6_OTHER (1ULL << 13)
#define ETH_RSS_L2_PAYLOAD (1ULL << 14)
#define ETH_RSS_IPV6_EX (1ULL << 15)
#define ETH_RSS_IPV6_TCP_EX (1ULL << 16)
#define ETH_RSS_IPV6_UDP_EX (1ULL << 17)
如果您需要任何澄清或详细说明,请随时提出。
提前致谢。
Edit_1(回应Vipin的评论):
我正在这个结构中启用 RSS (ETH_RSS_IPV6_EX):
静态结构rte_eth_conf port_conf = {
.rx 模式 = {
.mq_mode = ETH_MQ_RX_RSS,
.max_rx_pkt_len = RTE_ETHER_MAX_LEN,
.split_hdr_size = 0,
.offloads = DEV_RX_OFFLOAD_CHECKSUM,
},
.rx_adv_conf = {
.rss_conf = {
.rss_key = NULL,
.rss_hf = ETH_RSS_IPV6_EX, //ETH_RSS_IP //原始, //AU: Changing Hash Application
},
},
.txmode = {
.mq_mode = ETH_MQ_TX_NONE,
},
};
我用的DPDK版本是20.08.
正在使用的网卡是 Mellanox ConnectX-5
我正在使用 DPDK l3fwd 应用程序作为基础并在其上进行测试。
如评论中所述,ETH_RSS_IPV6_EX
是通用占位符。并非所有 driver 都支持相同的内容。因此,根据 PMD,将支持 driver 和固件 extended features
,例如基于 SRC-IP/DST-IP 或某些字段的 RSS。示例 ETH_RSS_IPV6_TCP
将在 IPV6 中包含 TCP 时使用,而 ETH_RSS_IPV6_TCP_EX
将在扩展 TCP header.
时使用
注意:igb和ixgbe支持_EX
而i40e不支持,你查一下intel NIC. DPDK mail thread discussion。因此,不要指望每个 NIC 都具有相同的 RSS
功能集
好的,伙计们,我联系了 Mellanox 支持人员,他们回复说他们已经与他们的 DPDK 专家核实并报告说他们不支持 RSS 卸载中的 IPv6 扩展 headers 支持,因此零散列的原因是在使用 IPV6_EX
RSS 卸载时进行计算。
我问 Mellanox 的问题是关于 ConnectX-5 和 ConnectX-6 的。
感谢@Vipin 的支持
所以我目前正在努力了解如何在 DPDK(数据平面开发工具包)中进行接收端缩放 (RSS) 卸载。因此,基本上根据我的理解,根据您选择的卸载,它会计算一个哈希值并使用该值将您的数据包放置在特定队列上进行处理,该队列绑定到特定的 CPU 核心。
所以我对此有 2 个疑问:
当我使用
**ETH_RSS_IPV6_EX**
的 RSS 卸载时,我无法获取 不是零的哈希值,这意味着该数据包被认为是 根据所选的 RSS Offload 无效,即使我的 Mellanox 卡支持这种卸载。我已经发送了以下 Scapy 数据包,但哈希值仍然为 0:sendp(Ether(dst="AA:AA:BB:BB:CC:DD")/IPv6(dst="a:a:a:a:a:a:a:b",src="a:a:a:a:a:a:a:c",nh=60)/IPv6ExtHdrDestOpt(nh=43,options=HAO(hoa="a:a:a:a:a:a:a:d"))/IPv6ExtHdrRouting(nh=59,type=2,addresses=["a:a:a:a:a:a:a:e"]),iface="enp4s0f0",count=1)
。 (我从 https://docs.microsoft.com/en-us/windows-hardware/drivers/network/rss-hashing-types#ndis_hash_ipv6_ex 获得了关于要处理哪些数据包的资源,但我相信这些 RSS 卸载和 DPDK 具有的卸载之间可能存在差异。)这是什么 EX RSS Offload 中的术语均值。除此之外,有人可以指点我一个资源来解释 RSS Offloads,一次一个,在 DPDK 中,其中一些是 以下(如果您对这些有所了解,提供一些笑话也会有所帮助):
#define ETH_RSS_IPV4 (1ULL << 2) #define ETH_RSS_FRAG_IPV4 (1ULL << 3) #define ETH_RSS_NONFRAG_IPV4_TCP (1ULL << 4) #define ETH_RSS_NONFRAG_IPV4_UDP (1ULL << 5) #define ETH_RSS_NONFRAG_IPV4_SCTP (1ULL << 6) #define ETH_RSS_NONFRAG_IPV4_OTHER (1ULL << 7) #define ETH_RSS_IPV6 (1ULL << 8) #define ETH_RSS_FRAG_IPV6 (1ULL << 9) #define ETH_RSS_NONFRAG_IPV6_TCP (1ULL << 10) #define ETH_RSS_NONFRAG_IPV6_UDP (1ULL << 11) #define ETH_RSS_NONFRAG_IPV6_SCTP (1ULL << 12) #define ETH_RSS_NONFRAG_IPV6_OTHER (1ULL << 13) #define ETH_RSS_L2_PAYLOAD (1ULL << 14) #define ETH_RSS_IPV6_EX (1ULL << 15) #define ETH_RSS_IPV6_TCP_EX (1ULL << 16) #define ETH_RSS_IPV6_UDP_EX (1ULL << 17)
如果您需要任何澄清或详细说明,请随时提出。
提前致谢。
Edit_1(回应Vipin的评论):
我正在这个结构中启用 RSS (ETH_RSS_IPV6_EX):
静态结构rte_eth_conf port_conf = { .rx 模式 = { .mq_mode = ETH_MQ_RX_RSS, .max_rx_pkt_len = RTE_ETHER_MAX_LEN, .split_hdr_size = 0, .offloads = DEV_RX_OFFLOAD_CHECKSUM, }, .rx_adv_conf = { .rss_conf = { .rss_key = NULL, .rss_hf = ETH_RSS_IPV6_EX, //ETH_RSS_IP //原始, //AU: Changing Hash Application }, }, .txmode = { .mq_mode = ETH_MQ_TX_NONE, }, };
我用的DPDK版本是20.08.
正在使用的网卡是 Mellanox ConnectX-5
我正在使用 DPDK l3fwd 应用程序作为基础并在其上进行测试。
如评论中所述,ETH_RSS_IPV6_EX
是通用占位符。并非所有 driver 都支持相同的内容。因此,根据 PMD,将支持 driver 和固件 extended features
,例如基于 SRC-IP/DST-IP 或某些字段的 RSS。示例 ETH_RSS_IPV6_TCP
将在 IPV6 中包含 TCP 时使用,而 ETH_RSS_IPV6_TCP_EX
将在扩展 TCP header.
注意:igb和ixgbe支持_EX
而i40e不支持,你查一下intel NIC. DPDK mail thread discussion。因此,不要指望每个 NIC 都具有相同的 RSS
好的,伙计们,我联系了 Mellanox 支持人员,他们回复说他们已经与他们的 DPDK 专家核实并报告说他们不支持 RSS 卸载中的 IPv6 扩展 headers 支持,因此零散列的原因是在使用 IPV6_EX
RSS 卸载时进行计算。
我问 Mellanox 的问题是关于 ConnectX-5 和 ConnectX-6 的。
感谢@Vipin 的支持