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



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

以下是我尝试过的:

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

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

如何将所有传入的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
===========================

更新

  • DPDK版本-20.11
  • My HW是一款基于恩智浦Layerscape的嵌入式设备
$ 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+内核

基于共享的信息,对于单个查询I'm trying to bypass all traffic to the PMD I'm currently developing存在多个问题。在下分别寻址

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

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

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

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

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

  1. 问题3:/usertools/dpdk-devbind.py--状态返回空

答案>形成dpdk站点支持的NIC列表NXPdpaa, dpaa2, enetc, enetfec, pfe。交叉检查内核驱动程序fsl_dpaa2_eth我认为可以安全地假设支持dpaa2 PMD。正如您所提到的,NIC没有枚举,看起来对此类型号修订、支持的板、BSP包、供应商子供应商ID检查等有一些注意事项。更多详细信息可以在板支持包和DPAA2 NIC指南中找到

调试&替代解决方案:

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

方法1:

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

方法2:

  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. 假设应用程序是用静态库而不是动态库构建的。要使用静态库进行构建,请将make static用于l2fwd
  2. 对于所描述的用例,推荐的应用程序是basicfwd/skeleton,而不是l2fwd

发现问题。我不得不从Linux内核中解除eth0的绑定。现在我可以简单地运行:

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

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

最新更新