【发布时间】:2020-12-28 12:12:34
【问题描述】:
我想测试 DPDK 20.08 中的流分类示例,我正在尝试修改给定的 ACL 规则文件以匹配所有 TCP 数据包。
#file format:
#src_ip/masklen dst_ip/masklen src_port : mask dst_port : mask proto/mask priority
#
2.2.2.3/24 2.2.2.7/24 32 : 0xffff 33 : 0xffff 17/0xff 0
9.9.9.3/24 9.9.9.7/24 32 : 0xffff 33 : 0xffff 17/0xff 1
9.9.9.3/24 9.9.9.7/24 32 : 0xffff 33 : 0xffff 6/0xff 2
9.9.8.3/24 9.9.8.7/24 32 : 0xffff 33 : 0xffff 6/0xff 3
6.7.8.9/24 2.3.4.5/24 32 : 0x0000 33 : 0x0000 132/0xff 4
6.7.8.9/32 192.168.0.36/32 10 : 0xffff 11 : 0xffff 6/0xfe 5
6.7.8.9/24 192.168.0.36/24 10 : 0xffff 11 : 0xffff 6/0xfe 6
6.7.8.9/16 192.168.0.36/16 10 : 0xffff 11 : 0xffff 6/0xfe 7
6.7.8.9/8 192.168.0.36/8 10 : 0xffff 11 : 0xffff 6/0xfe 8
#error rules
#9.8.7.6/8 192.168.0.36/8 10 : 0xffff 11 : 0xffff 6/0xfe 9
我应该添加0.0.0.0/0 0.0.0.0/0 0 : 0x0000 0 : 0x0000 6/0xff 0 规则吗?我试过了,但仍然没有匹配的数据包。
ps: 这是我正在使用的文件。
#file format:
#src_ip/masklen dst_ip/masklen src_port : mask dst_port : mask proto/mask priority
#
2.2.2.3/24 2.2.2.7/24 32 : 0xffff 33 : 0xffff 17/0xff 0
9.9.9.3/24 9.9.9.7/24 32 : 0xffff 33 : 0xffff 17/0xff 1
9.9.9.3/24 9.9.9.7/24 32 : 0xffff 33 : 0xffff 6/0xff 2
9.9.8.3/24 9.9.8.7/24 32 : 0xffff 33 : 0xffff 6/0xff 3
6.7.8.9/24 2.3.4.5/24 32 : 0x0000 33 : 0x0000 132/0xff 4
6.7.8.9/32 192.168.0.36/32 10 : 0xffff 11 : 0xffff 6/0xfe 5
6.7.8.9/24 192.168.0.36/24 10 : 0xffff 11 : 0xffff 6/0xfe 6
6.7.8.9/16 192.168.0.36/16 10 : 0xffff 11 : 0xffff 6/0xfe 7
#6.7.8.9/8 192.168.0.36/8 10 : 0xffff 11 : 0xffff 6/0xfe 8
0.0.0.0/0 0.0.0.0/0 0 : 0x0000 0 : 0x0000 6/0xff 8
#error rules
#9.8.7.6/8 192.168.0.36/8 10 : 0xffff 11 : 0xffff 6/0xfe 9
我又跑了,结果是这样的:
rule [0] query failed ret [-22]
rule [1] query failed ret [-22]
rule [2] query failed ret [-22]
rule [3] query failed ret [-22]
rule [4] query failed ret [-22]
rule [5] query failed ret [-22]
rule [6] query failed ret [-22]
rule [7] query failed ret [-22]
rule[8] count=2
proto = 6
Segmentation fault
我不知道是什么导致了Segmentation fault。
命令是sudo ./build/flow_classify -l 101 --log-level=pmd,8 -- --rule_ipv4="./ipv4_rules_file_pass.txt" > ~/flow_classify_log,我没有改源码。
我正在使用两个端口的 82599 网卡。我将日志文件放在下面,其中包含输出之前显示Segmentation fault
第一次迭代有时能正常处理,有时不能。
更新 1-3: 我修改了代码以停止数据包转发并释放每个接收到的数据包以检查是否是导致问题的转发过程。
在主函数中:
/* if (nb_ports < 2 || (nb_ports & 1))
rte_exit(EXIT_FAILURE, "Error: number of ports must be even\n"); */
if (nb_ports < 1)
rte_exit(EXIT_FAILURE, "Error: no port avaliable\n");
在 lcore_main 函数中:
//in lcore_main function
/* Send burst of TX packets, to second port of pair. */
/* const uint16_t nb_tx = rte_eth_tx_burst(port ^ 1, 0,
bufs, nb_rx); */
const uint16_t nb_tx = 0;
/* Free any unsent packets. */
if (unlikely(nb_tx < nb_rx)) {
uint16_t buf;
for (buf = nb_tx; buf < nb_rx; buf++)
rte_pktmbuf_free(bufs[buf]);
}
And this is the new log, but I don't think there is any difference. 我只使用单个 82599ES NIC 上的两个端口之一。可能是我添加的错误分类规则导致了问题,因为它在默认规则设置下运行良好。
【问题讨论】:
-
当你得到
no matching packets时控制台输出什么?是rule query failed ret还是rule count?请分享日志 -
我在问题中添加了规则和日志。
-
根据规则文件11条规则,其中规则
index 7被示例代码删除。generic rule的优先级设置为8与上一条规则相同。能否请您使用rte_pktmbuf_dump转储数据包内容以识别 ipv4 5 元组 -
非常感谢,稍后我会用数据包内容修改描述。我使用真实的网络流量而不是数据包生成器来测试流分类库,所以我想设置一个通用规则来测试它是否可以正常工作,即所有数据包都可以匹配。并且以
#开头的规则应该被绕过了,所以我认为修改后的规则文件中有9条规则。 -
根据日志有不匹配的
8规则。有1匹配规则(在新结果中)跟有分段错误。由于缺少 DPDK 日志,因此很难判断出了什么问题。看起来您在number of DPDK ports中有问题。请通过选项--log-level=pmd,8运行来分享 lcommand line和logs
标签: dpdk