DPDK l2fwd - 如何将以太网接口转发到我的 PMD

DPDK l2fwd - How to forward ethernet interface to my PMD

我有一块带有一个以太网接口 (eth0) 的板子 运行 Linux。 我正在尝试使用 dpdk-l2fwd 示例应用程序将所有传入流量从 eth0 转发到我的 PMD 驱动程序。

这是我试过的:

./dpdk-l2fwd -c 0x3 --vdev={my_pmd}0 -- -p 0x3 -T 0

我可以看到我的 rx_pkt_burst 回调由应用程序轮询,仅此而已。

如何将所有传入的 eth0 数据包转发到我的 PMD?

我尝试使用 net_tap,使用以下命令:

./dpdk-l2fwd -c 0xff --vdev=net_tap0 --vdev={my_pmd}0 -- -p 0x7 -T 0 --portmap="(1,2)"

我的 tx_pkt_burst 回调偶尔会被调用,但不是在我认为应该调用的时候。 例如,如果我从另一个板子 ping 这个板子,ping 成功,但是 tx_pkt_burst 回调没有被调用。

我尝试使用 devbind 工具,但未检测到任何设备:

./usertools/dpdk-devbind.py --status

No 'Network' devices detected
=============================

No 'Baseband' devices detected
==============================

No 'Crypto' devices detected
============================

No 'Eventdev' devices detected
==============================

No 'Mempool' devices detected
=============================

No 'Compress' devices detected
==============================

No 'Misc (rawdev)' devices detected
===================================

No 'Regex' devices detected
===========================

更新

$ lshw -class network
  *-network
       description: Ethernet interface
       physical id: 3
       logical name: eth0
       serial: 00:11:22:44:11:44
       size: 1Gbit/s
       capacity: 1Gbit/s
       capabilities: ethernet physical tp mii 10bt-fd 100bt-fd 1000bt-fd autonegotiation
       configuration: autonegotiation=on broadcast=yes driver=fsl_dpaa2_eth driverversion=5.10.35-00002-g3434eea0e1e7-dir duplex=full firmware=7.17 ip=192.168.15.157 link=yes multicast=yes port=twisted pair speed=1Gbit/s

我正在尝试将所有流量绕过我目前正在开发的 PMD。

谢谢。

[EDIT-1] 对 DPDK 和内核路由使用相同接口的说明

答案>如评论讨论请参考DPDKD + kernel on same interface

根据共享的信息,单个查询有多个问题 I'm trying to bypass all traffic to the PMD I'm currently developing。下面分别解决每个问题

  1. 问题 1:使用 dpdk-l2fwd 示例应用程序

Answer> DPDK 应用程序 l2fwd 应用程序使用基本 APi,几乎没有硬件卸载。根据您的环境(我有一块带有一个以太网接口 (eth0) 的板),正确的参数集应该是 -p 0x1 --no-mac-updating -T 1。这会将应用程序配置为使用单个 DPDK 接口(即您板上的 eth0)接收和传输数据包。

注意:DPDK 应用程序可以与物理和虚拟的 DPDK PMD 一起工作

  1. 问题 2:我尝试使用 net_tap,使用以下命令:

Answer> 如果打算拦截来自physical的流量然后转发到tap接口,那么需要修改eal参数为./build/l2fwd --vdev=net_tap0,iface="my_eth0" -- -p 0x3 -T 1 --no-mac-updating。这将允许应用程序探测物理 NXP 接口 (eth0) 并使用 Linux TAP 接口作为辅助接口。因此,来自 NXP 和 TAP 的任何流量都将交叉连接,例如 NXP (eth0) <==> TAP (my_eth0)

  1. 问题3:./usertools/dpdk-devbind.py --status returns empty

回答> 形成 dpdk 站点 supported NIC list NXP dpaa, dpaa2, enetc, enetfec, pfe. Cross checking the kernel driver fsl_dpaa2_eth I think it is safe to assume dpaa2 PMD is supported. As you have mentioned the NIC is not enumerated, it looks like there are certain caveats to such model revision, supported board, BSP package, vendor-sub vendor ID check etc. More details can be found Board Support Package, and DPAA2 NIC guide

调试和替代解决方案:

  1. 首先使用内核驱动程序引入数据包
  2. 使用额外的日志记录和调试来确定应用程序中显示 NIC 的原因

方法一:

  1. 确保 NIC 与内核驱动程序绑定 fsl_dpaa2_eth
  2. 确保 NIC 已连接并且 link 已启动 ethtool eth0
  3. 设置为混杂模式 ifconfig eth0 promisc up
  4. 使用 PCAP PMD 启动 DPDK 应用程序,./build/l2fwd --vdev=net_pcap0,iface=eth0 -- -p 1 --no-mac-updating -T 1
  5. 检查数据包是否收到并通过检查统计信息重定向到 PCAP eth0 PMD。

方法二:

  1. 理想情况下,NIC 应归类在要由 debind.py 探测的网络设备下。
  2. 使用 lshw -c net -businfo 查看 network 的设备详细信息。
  3. 尝试使用 lspci -Dvmmnnk [PCIe BUS:Slot:Function id] 检查网络详细信息。
  4. 如果以上详细信息未显示为网络设备,则可能是未列出的原因。
  • 建议或解决方法:您可以尝试通过dpdk-devbind -b vfio-pci [PCIe S:B:F]强制绑定igb_uio或vfio-pci(我对NXP SoC不太熟悉)。然后用 lspci -ks [PCIe S:B:F] 交叉检查。成功完成后,可以使用 ./build/l2fwd -a [PCIe S:B:F] --log-level=pmd,8 -- -p 1 --no-mac-updating | more 在 PMD 调试模式下启动 dpdk l2fwd。因此,通过拦截和解释日志,可以确定发生了什么

注:

  1. 假定应用程序是使用静态库而非动态库构建的。要使用静态库构建,请对 l2fwd 使用 make static
  2. 对于所描述的用例,推荐的应用程序是 basicfwd/skeleton 而不是 l2fwd。

找到问题了。 我不得不解除 eth0 与 Linux 内核的绑定。 现在我可以简单地 运行:

./dpdk-l2fwd -c 0x3 --vdev={MY_PMD}0 -- -p 0x3 -T 1

并且物理端口的所有流量都转发到我的PMD。