我有一块板,上面有一个运行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:使用dpdk-l2fwd示例应用程序
答案>DPDK应用程序l2fwd应用程序使用基本APi,几乎没有硬件卸载。根据您的环境(我有一个带有一个以太网接口(eth0(的板(,正确的参数集应该是-p 0x1 --no-mac-updating -T 1
。这将配置应用程序使用单个DPDK接口(即板上的eth0(接收和传输数据包。
注意:DPDK应用程序可以与DPDK PMD一起工作,包括物理和虚拟
- 问题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)
- 问题3:/usertools/dpdk-devbind.py--状态返回空
答案>形成dpdk站点支持的NIC列表NXPdpaa, dpaa2, enetc, enetfec, pfe
。交叉检查内核驱动程序fsl_dpaa2_eth
我认为可以安全地假设支持dpaa2 PMD。正如您所提到的,NIC没有枚举,看起来对此类型号修订、支持的板、BSP包、供应商子供应商ID检查等有一些注意事项。更多详细信息可以在板支持包和DPAA2 NIC指南中找到
调试&替代解决方案:
- 首先使用内核驱动程序引入数据包
- 使用额外的日志记录和调试来确定NIC显示在应用程序中的原因
方法1:
- 确保NIC与内核驱动程序
fsl_dpaa2_eth
绑定 - 确保NIC已连接并且链接已与
ethtool eth0
建立 - 使用
ifconfig eth0 promisc up
设置为混杂模式 - 使用PCAP PMD、
./build/l2fwd --vdev=net_pcap0,iface=eth0 -- -p 1 --no-mac-updating -T 1
启动DPDK应用程序 - 通过检查统计信息,接收检查数据包并将其重定向到PCAP eth0 PMD
方法2:
- 理想情况下,NIC应分类在debind.py要探测的网络设备下
- 使用
lshw -c net -businfo
检查network
的设备详细信息 - 请尝试使用
lspci -Dvmmnnk [PCIe BUS:Slot:Function id]
查看网络详细信息 - 如果以上详细信息没有显示为网络设备,这可能是未列出的原因
- 建议或解决方法:您可以尝试通过
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。因此,通过拦截和解释日志,可以识别正在发生的事情
注意:
- 假设应用程序是用静态库而不是动态库构建的。要使用静态库进行构建,请将
make static
用于l2fwd - 对于所描述的用例,推荐的应用程序是
basicfwd/skeleton
,而不是l2fwd
发现问题。我不得不从Linux内核中解除eth0的绑定。现在我可以简单地运行:
./dpdk-l2fwd -c 0x3 --vdev={MY_PMD}0 -- -p 0x3 -T 1
并且物理端口中的所有流量都被转发到我的PMD。