在DPKD中,XL710 Intel NIC默认不激活ETH_RSS_IPV4
数据流。因此,当您想要在lcores之间分发数据包时,您必须选择XL710支持的其他IPv4数据流,即ETH_RSS_FRAG_IPV4
,ETH_RSS_NONFRAG_IPV4_TCP
,ETH_RSS_NONFRAG_IPV4_UDP
,ETH_RSS_NONFRAG_IPV4_SCTP
和ETH_RSS_NONFRAG_IPV4_OTHER
。但是,当您处理碎片化的IP数据包时,您将面临一个愚蠢的问题。如果您选择使用ETH_RSS_FRAG_IPV4
和ETH_RSS_NONFRAG_IPV4_TCP
选项,则连接的某些碎片数据包将落入另一个队列,因为它们没有L4端口号。如果排除ETH_RSS_NONFRAG_IPV4_TCP
函数,则ETH_RSS_FRAG_IPV4
哈希函数将不会应用于非分段数据包,并且这些数据包将进入队列0.所有其他哈希函数组合将不起作用。那么,我们应该怎么做?
答案 0 :(得分:4)
XL710的行为与DPDK中的约定不兼容。因此,您必须直接使用i40e驱动程序提供的API才能为ETH_RSS_IPV4设置RSS。如英特尔®以太网控制器710系列规范更新,第18页(2017年1月发布)中所述:
需要在IPv4数据包上使用哈希(RSS)过滤器的函数 设置PFQF_HENA / VFQF_HENA中的所有IPv4 PCTYPE(PCTYPE 31,33 ... 36)
英特尔®以太网控制器710系列数据表第597页和第598页(2017年1月发布)中提到了支持的数据包类型(PCTYPE)。您可以看到没有为IPv4定义的数据包类型。
然而,有一个解决方案。线索是为所有必需的流类型(或数据包类型)修改输入集。让我们使用DPDK在app文件夹中提供的testpmd
工具进行尝试。编译DPDK和应用程序后,运行testpmd
应用程序:
./app/test-pmd/testpmd -c ff -n 2 -w 0a:00.0 -w 0a:00.1 -- -i --rxq=4 --txq=4
我们的系统中有两个XL710。使用以下命令,您可以将XL710配置为支持IPv4数据流。
port config all rss all
set_hash_input_set 0 ipv4-tcp src-ipv4 select
set_hash_input_set 0 ipv4-tcp dst-ipv4 add
set_hash_input_set 0 ipv4-udp src-ipv4 select
set_hash_input_set 0 ipv4-udp dst-ipv4 add
set_hash_input_set 1 ipv4-tcp src-ipv4 select
set_hash_input_set 1 ipv4-tcp dst-ipv4 add
set_hash_input_set 1 ipv4-udp src-ipv4 select
set_hash_input_set 1 ipv4-udp dst-ipv4 add
set_hash_global_config 0 default ipv4-frag enable
set_hash_global_config 0 default ipv4-tcp enable
set_hash_global_config 0 default ipv4-udp enable
set_hash_global_config 1 default ipv4-frag enable
set_hash_global_config 1 default ipv4-tcp enable
set_hash_global_config 1 default ipv4-udp enable
通过删除L4端口部分为TCP和UDP流类型选择正确的输入集。如果需要,set_hash_global_config
命令会启用对称哈希。通过修改TCP输入集,它的行为就像 Frag IPv4 流类型一样,因此属于同一连接的所有数据包都会转到同一个lcore。
请注意, Frag IPv4 和 NonFIPv4,其他的默认输入设置为IP4-S和IP4-D。所以它不需要修改。请记住修改所有其他IPv4流输入集及其对称质量。
您可以通过查看testpmd应用程序的源代码找到这些命令的API函数。