DPDK无法收包和找不到some.so文件的解决方法
发表于 2025/10/22
0
作者 | 方原
问题场景描述
以DPDK纳管网口为enp129s0f0,未纳管网口为enp130s0f0为例,enp129s0f0和enp130s0f0通过光纤直连。
DPDK纳管测试:通过Tcpreplay向enp130s0f0网口写入pcap包,使用dpdk-testpmd监测enp129s0f0网口是否收到数据。
具体测试步骤如下:
1.安装Tcpreplay。
yum install tcpreplay2.发包。
tcpreplay -i enp130s0f0 -l 0 -t *.pcap3.启动dpdk-testpmd。
LD PRELOAD=***/librte_net_sp600.so.21 dpdk-testpmd -c 0x3 -n 4 -- -i --portmask=0x1如果适配SP680网卡,且所用的DPDK版本未包含SP600驱动的源码,可通过动态链接或者静态编译的方式集成驱动。
- 动态链接:通过LD_PRELOAD实现,如下为示例。
LD PRELOAD=***/librte_net_sp600.so.21 dpdk-testpmd -c 0x3 -n 4 -- -i --portmask=0x1- 静态连接:查看make文件,找到静态库的查询路径,将静态库放进指定的目录中。
4. DPDK启动端口。
port start5.DPDK观察端口是否收到信息。
show port stats allmarsio用户场景测试:
依次启动用户程序,同样使用Tcpreplay向enp130s0f0网口写包,通过用户的监测命令检查是否收到包。
问题1:使用Tcpreplay向DPDK未纳管接口发包,启动DPDK后在纳管接口未收到包
问题现象描述
使用Tcpreplay向DPDK未纳管接口发包,启动DPDK后在纳管接口未收到包。
关键过程、根本原因分析
首先测试enp129s0f0发包,enp130s0f0是否能够正常收包。
testpmd> port stop all // 停止所有端口
testpmd> set fwd txonly // 仅发送
testpmd> set verbose 1
testpmd> port start all
testpmd> start // 开始发送强制连接后调用上面的检查链路的命令,发现其链路还是no link,可能是物理链路(光模块, 光纤)有问题,或者网口没有插好。去机房检查检查中发现两个网口的指示灯均未亮起,说明物理链路有问题。
结果为无法收包。enp129s0f0和enp130s0f0都无法接收,查看两个端口的状态。
ip link | grep UP
上面命令查看到两者都为DOWN,用下面命令使其UP:
ip link set enp129s0f0f up & ip link set enp130s0f0 up
或者
ifconfig enp129s0f0 up & ifconfig enp130s0f0 up
重新用ip link | grep UP查看,发现二者还是DOWN。在DPDK中使用tstpmd> set link-up port 0尝试使0端口(enp129s0f0)的状态为UP,但是使用testpmd> show port info all发现0端口的link状态还是no link。
用ethtool -i enp129s0f0(ethtool -i enp129s0f0)或者hinicadm3 hilink_port -i hinic1 -p 0(hinicadm3 hilink_port -i hinic1 -p 0)查看两个网口的链路状态,发现都是no link。尝试使用ethtool --show-priv-flags <网口名>查看网口的Force-Link_up状态并且使用ethtool --set-priv-flags <网口名>来使其强制连接。
结论、解决方案及效果
经过尝试,最终定位为光模块故障,更换光模块后,指示灯正常亮起。调用ethtool -i enp129s0f0命令检查链路状态发现均为UP,调用ip link | grep UP发现两个网口均为UP。
问题2:程序启动后提示找不到some.so文件
当提示找不到SO库,需要考虑此SO库是否损坏或者是否与此平台匹配。使用readelf
-h some.so读取some.so的头部信息,发现其架构为x86,不能被Arm平台的程序读取。需重新编译出some.so库,并放至指定目录即可。
问题2:程序启动后提示找不到some.so文件
当提示找不到SO库,需要考虑此SO库是否损坏或者是否与此平台匹配。使用readelf -h some.so读取some.so的头部信息,发现其架构为x86,不能被Arm平台的程序读取。需重新编译出some.so库,并放至指定目录即可。


