所以我目前正在研究如何在 DPDK(数据平面开发工具包)中接收侧缩放 (RSS) 卸载工作。所以基本上根据我的理解,根据您选择的卸载,它计算一个哈希值并使用它来将您的数据包放置在一个特定的队列上进行处理,该队列绑定到一个特定的 CPU 核心。
所以我有两个关于这个的查询:
当我使用 RSS 卸载时
**ETH_RSS_IPV6_EX**
,我无法获得零以外的哈希值,这意味着根据选择的 RSS 卸载,数据包被认为是无效的,即使我的 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 卸载中是什么意思。除此之外,有人可以指出一个资源来解释 DPDK 中的 RSS 卸载,一次一个,其中一些如下(如果您了解这些,提供其中的一个笑话也可以有帮助):
#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 = { .rxmode = { .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_h, rss_key = ETH_NULL,IP //ETH_RSS_IP //Orignal, //AU: 改变哈希应用 }, }, .txmode = { .mq_mode = ETH_MQ_TX_NONE, }, };
我使用的 DPDK 版本是 20.08。
使用的 NIC 是 Mellanox ConnectX-5
我使用 DPDK l3fwd 应用程序作为基础并在其上进行测试。