使用DPDK PDUMP抓包

参考:

参考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

此后重新编译相关进程即可成功。

定位过程

  1. 通过修改日志打印级别或gdb看更详细的日志:
    这里可以看出,两边都用dpdk mp库,对调用到vdev_action。最终出错是在dpdk-fwd1中,创建设备时找不到处理的vdev driver。根据《参考2》可以看出需要运行的驱动为pcap pmd,在对应的driver中没有。并且dpdk编译中发现该驱动没有该驱动
  2. 编译依赖
    (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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值