欢迎来到 DPDK交流社区 ,有什么问题可以尽管在这里提问,您将会收到社区其他成员的回答;也可以将您的总结写在这里,为社区其他成员提供帮助。 (QQ交流群:127163755)

DPDK使用ntuple过滤器,不能正常匹配

+2 投票
内核版本 centos 6.5 2.6.32-431.el6.x86_64
IXGBE驱动版本 3.22.3
内核中的操作
ethtool -K eth1 ntuple on
ethtool --config-ntuple eth1 flow-type tcp4 src-ip 11.11.11.0 m 255.255.255.250 action 0
ethtool --config-ntuple eth1 flow-type tcp4 src-ip 11.11.11.1 m 255.255.255.250 action -1
ethtool --config-ntuple eth1 flow-type tcp4 src-ip 11.11.11.4 m 255.255.255.250 action -1
ethtool --config-ntuple eth1 flow-type tcp4 src-ip 11.11.11.5 m 255.255.255.250 action 0

bin(250) === 0b11111010
11.11.11.0 (0b00000000) mask 0b11111010  === X0X0 匹配最后4位
11.11.11.1 (0b00000001) mask 0b11111010  === X0X1 匹配最后4位
11.11.11.4 (0b00000100) mask 0b11111010  === X1X0 匹配最后4位
11.11.11.5 (0b00000101) mask 0b11111010  === X1X1 匹配最后4位
小弟的理解是这个掩码是按位匹配的, 而且0表示启用;
配置这个掩码的目的是想测试是不是确实是按位匹配的效果。
然后进行测试,效果也确实如此。
用11.11.11.2访问能通,11.11.11.3访问被阻断,11.11.11.6被阻断, 11.11.11.7 能通

然后我尝试了DPDK中处理,如下
DPDK版本2.0.0
网卡初始化
struct rte_fdir_conf g_fdir_conf;
memset(&g_fdir_conf, 0, sizeof(g_fdir_conf));
g_fdir_conf.mode = RTE_FDIR_MODE_PERFECT;
g_fdir_conf.pballoc = RTE_FDIR_PBALLOC_256K;
g_fdir_conf.status = RTE_FDIR_REPORT_STATUS_ALWAYS;
g_fdir_conf.drop_queue = -1;
//struct rte_eth_fdir_masks& t_mask = g_fdir_conf.mask;
g_fdir_conf.mask.vlan_tci_mask = 0x0;
g_fdir_conf.mask.ipv4_mask.src_ip = 0xFFFFFFFF;
g_fdir_conf.mask.ipv4_mask.dst_ip = 0xFFFFFFFF;
g_fdir_conf.mask.ipv6_mask.src_ip = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF};
g_fdir_conf.mask.ipv6_mask.dst_ip = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF};
g_fdir_conf.mask.src_port_mask = 0xFFFF;
g_fdir_conf.mask.dst_port_mask = 0xFFFF;
port_conf.fdir_conf = g_fdir_conf;

上面的MASK,小弟理解是按位使能

流分类配置增加
struct rte_eth_ntuple_filter filter;
memset(&filter, 0, sizeof(struct rte_eth_ntuple_filter));
filter.flags = RTE_5TUPLE_FLAGS;
filter.dst_ip = 0;
filter.dst_ip_mask = 0x0;
if (i==1)
filter.src_ip = inet_addr("11.11.11.1");//m++;
else filter.src_ip = ntohl(inet_addr("11.11.11.1"));
filter.src_ip_mask = 0xFFFFFFFF;
filter.dst_port = 0;
filter.dst_port_mask = 0x0;
filter.src_port = 0;
filter.src_port_mask = 0X0;
filter.proto = 0;
filter.proto_mask = 0x0;
filter.tcp_flags = 0;
filter.priority = 0x3;
filter.queue = i;
ret = rte_eth_dev_filter_ctrl(port_id,
    RTE_ETH_FILTER_NTUPLE, RTE_ETH_FILTER_ADD, &filter);
if (ret < 0) printf("[pqtest] 5tuple filter programming error: (%s)\n", strerror(-ret));
else printf("[pqtest] 5tuple filter programming ok (%s)\n", strerror(-ret));

上面的MASK必须是全1或者全0,分别表示开启和关闭,无法做到如内核模式下的按位掩码,
然后小弟尝试了各种组合,通过获取接口状态寄存器信息,fdirmatch一直为0 , fdirmiss倒时一直增长,
也就是总是不能正常匹配。

麻烦大神指点下,问题在哪?
小弟的疑问主要有如下:
1. g_fdir_conf.mask.ipv4_mask.src_ip = 0xFFFFFFFF; 这个MASK的具体含义是什么?为什么是一个全局的?
2. 5ntuple规则处理里面,filter.src_ip_mask = 0xFFFFFFFF; 这个为何不能像内核ethtool那样支持按位掩码呢?

谢谢了

 

http://sysight.com/index.php?qa=207&qa_1=ixgbe-%E6%B5%81%E5%88%86%E7%B1%BB%E5%8A%9F%E8%83%BDfdir-%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F
最新提问 4月 21, 2017 分类:DPDK API问答 | 用户: TomatoShield (200 分)
修改于 4月 22, 2017 用户:TomatoShield

1个回答

+1 投票
参考:
http://sysight.com/index.php?qa=207&qa_1=ixgbe-%E6%B5%81%E5%88%86%E7%B1%BB%E5%8A%9F%E8%83%BDfdir-%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F

另外补充一点的是我说的那个经验例子可能有误导性,准确的说是5元组过滤流分类,上面哪个mask就是按位掩码的
最新回答 4月 24, 2017 用户: oops (2,160 分)
...