DPDK l3fwd-acl 应用程序无法使用命名空间使用 net_tap PMD 发送或接收

DPDK l3fwd-acl application is unable to send or receive using net_tap PMD using namespaces

我编译了dpdk 19.11.11版本来测试l3fwd-acl。在具有 2 个 CPU 和 2 个端口的 VirtualBox 实例中启动它后,我使用了 2 个 TAP 接口来模拟 2 个网络接口,用于将流量放在一个接口上并通过另一个接口返回。我使用了以下命令(并获得以下输出):

sam@sam-VirtualBox:~/prac/dpdk-stable-19.11.11/examples/l3fwd-acl/build/app$ sudo ./l3fwd-acl -l 1 -n 1 --vdev=net_tap0 --vdev=net_tap1 -- -p 0x3 -P --config="(0,0,1),(1,0,1)" --rule_ipv4="./ipv4_rules.db" --rule_ipv6="./ipv6_rules.db"
[sudo] password for sam:
EAL: Detected 2 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: Probing VFIO support...
EAL: VFIO support initialized
EAL: PCI device 0000:00:03.0 on NUMA socket -1
EAL:   probe driver: 8086:100e net_e1000_em
EAL: PCI device 0000:00:08.0 on NUMA socket -1
EAL:   probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:00:09.0 on NUMA socket -1
EAL:   probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:00:0a.0 on NUMA socket -1
EAL:   probe driver: 8086:100f net_e1000_em
Promiscuous mode selected
ACL option are:
rule_ipv4: ./ipv4_rules.db
rule_ipv6: ./ipv6_rules.db
scalar: 0
L3FWDACL: IPv4 Route entries 1:
        1:0.0.0.0/0 0.0.0.0/0 0 : 65535 0 : 65535 0x0/0x0 0xffffffff-0x1ffffffe-0x2
L3FWDACL: IPv4 ACL entries 1:
        1:0.0.0.0/0 0.0.0.0/0 0 : 65535 10101 : 10101 0x6/0xfe 0xffffffff-0x1fffffff-0xf0000000
L3FWDACL: IPv6 Route entries 1:
        1:0000:0000:0000:0000:0000:0000:0000:0000/0 0000:0000:0000:0000:0000:0000:0000:0000/0 0 : 65535 0 : 65535 0x0/0x0 0xffffffff-0x1fffffff-0x1
L3FWDACL: IPv6 ACL entries 0:
acl context <l3fwd-acl-ipv40>@0x1004d8040
  socket_id=0
  alg=3
  max_rules=100000
  rule_size=96
  num_rules=2
  num_categories=1
  num_tries=1
acl context <l3fwd-acl-ipv60>@0x100fb0440
  socket_id=0
  alg=3
  max_rules=100000
  rule_size=192
  num_rules=1
  num_categories=1
  num_tries=1
Initializing port 0 ... Creating queues: nb_rxq=1 nb_txq=1... Port 0 modified RSS hash function based on hardware support,requested:0x3bffc configured:0
 Address:08:00:27:E8:C1:2B, Allocated mbuf pool on socket 0
txq=1,0,0
Initializing port 1 ... Creating queues: nb_rxq=1 nb_txq=1... Port 1 modified RSS hash function based on hardware support,requested:0x3bffc configured:0
 Address:08:00:27:1D:45:A5, txq=1,0,0

Skipping disabled port 2

Skipping disabled port 3

Initializing rx queues on lcore 1 ... rxq=0,0,0 rxq=1,0,0

Checking link status..............................done
Port0 Link Up. Speed 1000 Mbps full-duplex
Port1 Link Up. Speed 1000 Mbps full-duplex
L3FWD: entering main loop on lcore 1
L3FWD:  -- lcoreid=1 portid=0 rxqueueid=0
L3FWD:  -- lcoreid=1 portid=1 rxqueueid=0

之后,我按照接受的解决方案中显示的命令为 dtap0 和 dtap1 分配了一个 IP 地址:

我尝试使用分配的 IP 从一个 tap 接口 ping 另一个接口,但无法得到任何响应。可能是什么问题?

[编辑 2] 使用上述步骤,我们能够从 tap0 命名空间 ping 命名空间 tap1,但我们观察到该通信期间的数据包丢失。

The rules files are:
1) ipv4_rules.db
+++
R0.0.0.0/0  12.12.12.2/32 0 : 65535 0 : 65535 0/0xfe 1
R0.0.0.0/0  12.12.12.1/32 0 : 65535 0 : 65535 0/0xfe 0
+++
2) ipv6_rules.db
+++
R0:0:0:0:0:0:0:0/0 0:0:0:0:0:0:0:0/0 0 : 65535 0 : 65535 0x00/0x00 0
 +++
Apart from ping with packet loss, not able to exchange traffic using "netcat" or "socat" though.  Commands used for netcat/socat were:
a) Listener side:
sudo ip netns exec tap1 nc -l 1567
OR
sudo ip netns exec tap1 socat TCP4-LISTEN:1567,fork EXEC:cat
b) Sender side:
sudo ip netns exec tap0 nc 12.12.12.2 1567

L3fwd-acl 仅适用于 IP 数据包,对于它丢弃的所有非 IP 数据包。因此,对于 TAP PMD,我必须遵循

的变化
  1. 使用 --no-pci
  2. 禁用任何 NIC PCIe 设备
  3. 使用新命令作为sudo ./build/l3fwd-acl --file-prefix=mytest -l 2-4 --vdev=net_tap0 --vdev=net_tap1 --no-pci -- -P -p 3 --config="(0,0,4),(1,0,3)" --rule_ipv4=ipv4-sample.db --rule-ipv6=ipv6-sample.db --eth-dest=0,<mac address of DPDK TAP0> --eth-dest=1,<mac address of DPDK TAP1>
  4. 使用要分配给 dtap0 and dtap1.
  5. 的条目编辑 ip-sample.db 文件
  6. 参考部分24.1.3 to identify the format and for default drop rule
  7. 启动应用程序并使用以下 netns 命令。
sudo ip netns add tap0
sudo ip netns add tap1
ip netns
ip netns exec tap0 ifconfig -a
ip netns exec tap1 ifconfig -a
sudo ip link set dtap0 netns tap0
sudo ip link set dtap1 netns tap1
ip netns exec tap0 ifconfig -a
ip netns exec tap1 ifconfig -a
sudo ip netns exec tap0 ifconfig dtap0 12.12.12.1 up
sudo ip netns exec tap1 ifconfig dtap1 12.12.12.2 up

如果我们执行sudo ip netns exec tap0 ping 12.12.12.2 ARP 数据包将被丢弃,因为它不是 IP 数据包。为防止这种情况发生,请在命名空间 tap0 and tap1 中为 dtap0 和 dtap1 添加静态 ARP 条目。这将使内核发出 ICMP 数据包,然后由 L3FWD ACL 程序路由。

注意:可以使用 DPDK L2FWD 和 --file-prefix=test --no-pci --vdev=net_tap0 --vdev=net_tap1 -l 12-13 -- -p 3 -T 1 --no-mac-updating

进行相同的测试

[EDIT-1] 问题: 如何为 TAP PMD 分配静态 MAC? 答案:请参考TAP PMD link使用选项mac='desired mac address'来实现同样的效果。

[EDIT-2] 使用新 linux 内核为 TAP PMD 创建多个 rx-tx 队列> 使用 DPDK 示例 l3fwd-acl 基于总 lcores RX-TX 创建。因此,如果我们不从所有队列中读取数据包,就会丢失。

要解决此问题,只需使用 1 个 lcore。

命令:sudo ./build/l3fwd-acl --file-prefix=mytest -l 2 --no-pci --vdev=net_tap0,mac=10:20:30:40:50:66 --vdev=net_tap1,mac=10:20:30:40:50:60 -- -P -p 3 --config="(0,0,2),(1,0,2)" --rule_ipv4=ipv4-sample.db --rule_ipv6=ipv6-sample.db --eth-dest=0,10:20:30:40:50:66 --eth-dest=1,10:20:30:40:50:60

Proc-info: sudo ./dpdk-proc-info --no-pci --file-prefix=mytest -- -p 3 --stats | grep -v ": 0"