测来测去10:DPDK i40e X710 Flow Director Deep Dive(1)

这篇文章介绍DPDK i40e X710网卡如何配置Flow director mask的过程中演示了一下如何给UDP流量添加dest Port Mask。首先对当时的配置再做一点细节上的补充:

一个是Input Set的配置。这个配置决定了Flow director具体关心UDP的哪些字段。只有在Input set中的字段才有加Mask的必要。在演示的例子中:

1
2
3
4
5
6
7
8
9
10
11
struct rte_eth_fdir_filter_info info;
struct rte_pmd_i40e_inset inset;

memset(&info, 0, sizeof(info));
info.info_type = RTE_ETH_FDIR_FILTER_INPUT_SET_SELECT;
//针对Nonfrag-ipv4-udp这种流量类型
info.info.input_set_conf.flow_type = RTE_ETH_FLOW_NONFRAG_IPV4_UDP;
//添加UDP-dst-port作为一个`input set`,且仅有这一个
info.info.input_set_conf.field[0] = RTE_ETH_INPUT_SET_L4_UDP_DST_PORT;
info.info.input_set_conf.inset_size = 1;
info.info.input_set_conf.op = RTE_ETH_INPUT_SET_SELECT;

通过这种形式配置了Flow director仅关心一个UDP字段,也就是dest Port。其实也可以认为是给src IP/dest IP/src Port设置了通配。

另外关于配置掩码的规则在这里也说明一下,示例中给的fdir规则dst_port是0x2e06,掩码是0xF000:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct rte_eth_fdir_filter arg_udpport = {
.soft_id = 1,
.input = {
.flow_type = RTE_ETH_FLOW_NONFRAG_IPV4_UDP,
.flow = {
.udp4_flow = {
.dst_port = 0x2e06, //5678=>0x162e
},
},
},
.action = {
.rx_queue = 2,
.behavior = RTE_ETH_FDIR_ACCEPT,
.report_status = RTE_ETH_FDIR_REPORT_ID,
},
};

这个配置可以匹配目的端口号为:1582(0x062e);5678(0x162e);9774(0x262e)…的端口,即前4个bit为任意数值,后12个bit为0x62e的全部端口号。

注意此时在fdir规则的配置中,.dst_port只能写0x2e06才可以生效,一是考虑大小端数字的转换,二是需要被Mask的那几位Bit必须写0。另外,对应的Mask(0xF000)中,需要被Mask的Bit位上要写1。

别问我为什么这么设定,我也不知道,我只管好不好使。

两条fdir UDP规则

如果你需要配置两条UDP fdir规则,那么之前关于input set和mask的配置是同时应用于这两条UDP规则的。

比如,所有目的端口号4096(0x1000)-8191的UDP进入队列1,端口号8192(0x2000)-12287(0x2FFF)的进入队列2,可以采取如下配置方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
   struct rte_eth_fdir_filter arg_udpport1 = {
.soft_id = 1,
.input = {
.flow_type = RTE_ETH_FLOW_NONFRAG_IPV4_UDP,
.flow = {
.udp4_flow = {
.dst_port = 0x10,
},
},
},
.action = {
.rx_queue = 1,
.behavior = RTE_ETH_FDIR_ACCEPT,
.report_status = RTE_ETH_FDIR_REPORT_ID,
},
};

struct rte_eth_fdir_filter arg_udpport2 = {
.soft_id = 2,
.input = {
.flow_type = RTE_ETH_FLOW_NONFRAG_IPV4_UDP,
.flow = {
.udp4_flow = {
.dst_port = 0x20,
},
},
},
.action = {
.rx_queue = 2,
.behavior = RTE_ETH_FDIR_ACCEPT,
.report_status = RTE_ETH_FDIR_REPORT_ID,
},
};

此时Mask需要设置为0x0FFF。然后调用示例中的相关接口就可以达到目的。

© 2020 DecodeZ All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero