参考:
参考1:https://www.jianshu.com/p/53f57a06c4cf
参考2:https://doc.dpdk.org/guides-22.11/tools/pdump.html
前言
项目上需要对DPDK程序进行抓包,通过参考文档,本以为简单编译后即可使用dpdk-pdump进行抓包,但在实际运用时,发现无法使用。本文记录一下debug过程。
dpdk进程
从官网参考2中可以得知,如果想要进程支持dpdk-pdump抓包,需要增加部分初始化代码,文档中让用户根据dpdk-testpmd来添加初始化,根据相关的宏(RTE_LIB_PDUMP),需要在main中做对应流程的初始化添加流程
...
#ifdef RTE_LIB_PDUMP
#include <rte_pdump.h>
#endif
...
...
int main(int argc, char **argv)
{
...
#ifdef RTE_LIB_PDUMP
/* initialize packet capture framework */
rte_pdump_init();
#endif
...
...
#ifdef RTE_LIB_PDUMP
/* uninitialize packet capture framework */
rte_pdump_uninit();
#endif
...
}
默认编译时,这个编译宏是打开的。
编译脚本meson文件,可以参考testpmd的,需要额外增加deps
if dpdk_conf.has('RTE_LIB_PDUMP')
deps += 'pdump'
endif
dpdk-dump使用
在实际调试中,dpdk进程(假定名为dpdk-fwd1)会接管2个口,bond0口和1个pcie网卡,其命令参数如下:
./dpdk-fwd1 -c 3000 --vdev=net_af_packet0,iface=eth0 -a 0000:08:01.0 --file-prefix=dpdk-fwd1
其中,bond口使用的dpdk af-packet驱动;这里增加–file-prefix,主要是因为系统中可能运行多个DPDK进程
使用的dpdk-pdump进程如下命令:
./dpdk-pdump -l 3,4,5 --file-prefix=dpdk-fwd1 -- --pdump 'port=0,queue=*,rx-dev=/tmp/rx-upcall.pcap,tx-dev=/tmp/tx-upcall.pcap' --pdump 'port=1,queue=*,rx-dev=/tmp/rx-bond.pcap,tx-dev=/tmp/tx-bond.pcap'
参数说明:
- port=0:这里指明了pcie接口对应的dpdk进程port-id号
- port=1:这里指明了vdev接口(对应bond口)
端口号需要根据实际情况来指定。
运行后,正常的话,会有如下打印:
core (3), capture for (2) tuples
- port 0 device ((null)) queue 65535
- port 1 device ((null)) queue 65535
端口有报文时,在/tmp下可以看到对应的抓包文件在增加。使用ctrl+c退出后,会有如下打印:
##### PDUMP DEBUG STATS #####
-packets dequeued: 241
-packets transmitted to vdev: 241
-packets freed: 0
##### PDUMP DEBUG STATS #####
-packets dequeued: 94
-packets transmitted to vdev: 94
-packets freed: 0
dpdk-dump调试过程问题
dpdk-dump启动后退出
dpdk-dump启动后异常退出,打印如下:
EAL: Failed to hotplug add device
EAL: Error - exiting with code: 1
Cause: vdev creation failed:create_mp_ring_vdev:700
dpdk-fwd1有如下对应的错误打印:
EAL: failed to parse device "vdev:net_pcap_rx_0"
EAL: Failed to hotplug add device on primary
根本原因与解决方法
根本原因是因为没有编译上libpcap-dev开发库。需要安装这个库。参考《参考1》以及部分网上文章:
- 安装libpcap-dev库
yum search libpcap-dev ##找一下libpcap-dev对应的yum包名
yum install libpcap-devel.aarch64
- 修改ldconfig配置
# 根据libpcap名找到对应的安装目录,修改 /etc/ld.so.conf文件
include ld.so.conf.d/*.conf
/usr/lib64 ## 根据自己项目添加对应的路径
# 执行ldconfig -f /etc/ld.so.conf
此后重新编译相关进程即可成功。
定位过程
- 通过修改日志打印级别或gdb看更详细的日志:
这里可以看出,两边都用dpdk mp库,对调用到vdev_action。最终出错是在dpdk-fwd1中,创建设备时找不到处理的vdev driver。根据《参考2》可以看出需要运行的驱动为pcap pmd,在对应的driver中没有。并且dpdk编译中发现该驱动没有该驱动 - 编译依赖
(1)drivers/net/pcap/meson.build
if not dpdk_conf.has('RTE_PORT_PCAP')
build = false
reason = 'missing dependency, "libpcap"'
endif
(2)根据RTE_PROT_PCAP查找相关配置,找到配置文件:config/meson.config
# check for pcap
pcap_dep = dependency('libpcap', required: false, method: 'pkg-config')
if not pcap_dep.found()
# pcap got a pkg-config file only in 1.9.0
# message('----------------------pcap_dep not found------------------')
pcap_dep = cc.find_library('pcap', required: false)
endif
if pcap_dep.found() and cc.has_header('pcap.h', dependencies: pcap_dep)
# message('------------------- found------------------')
dpdk_conf.set('RTE_PORT_PCAP', 1)
dpdk_extr