XL710如何设置RSS hash函数接收IPv4流类型?
How to set up RSS hash fuction in XL710 to receive IPv4 flow type?
在 DPKD 中,XL710 Intel NIC 默认未激活 ETH_RSS_IPV4
数据流。因此,当您想要在 lcore 之间分发数据包时,您必须 select 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。所有其他哈希函数组合将不起作用。那么,我们该怎么办呢?
XL710 的行为与 DPDK 中的约定不兼容。因此,您必须直接使用 i40e 驱动程序提供的 API 才能为 ETH_RSS_IPV4 设置 RSS。如 英特尔® 以太网控制器 710 系列规范更新,第 18 页(2017 年 1 月发布)所述:
Functions that require the Hash (RSS) filters on IPv4 packets should
set all IPv4 PCTYPEs in the PFQF_HENA / VFQF_HENA (PCTYPEs 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,Other 的默认输入集是 IP4-S 和 IP4-D。所以不需要修改。请记住修改所有其他 IPv4 流输入集和它们的对称质量。
您可以通过查看 testpmd 应用程序的源代码找到这些命令的 API 功能。
在 DPKD 中,XL710 Intel NIC 默认未激活 ETH_RSS_IPV4
数据流。因此,当您想要在 lcore 之间分发数据包时,您必须 select 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。所有其他哈希函数组合将不起作用。那么,我们该怎么办呢?
XL710 的行为与 DPDK 中的约定不兼容。因此,您必须直接使用 i40e 驱动程序提供的 API 才能为 ETH_RSS_IPV4 设置 RSS。如 英特尔® 以太网控制器 710 系列规范更新,第 18 页(2017 年 1 月发布)所述:
Functions that require the Hash (RSS) filters on IPv4 packets should set all IPv4 PCTYPEs in the PFQF_HENA / VFQF_HENA (PCTYPEs 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,Other 的默认输入集是 IP4-S 和 IP4-D。所以不需要修改。请记住修改所有其他 IPv4 流输入集和它们的对称质量。
您可以通过查看 testpmd 应用程序的源代码找到这些命令的 API 功能。