如何为自定义简易DPDK应用添加dpdk-dumpcap抓包框架
解决DPDK自定义应用中集成dpdk-dumpcap抓包功能的问题
针对基于skeleton/icmpecho的DPDK自定义应用无法适配dpdk-dumpcap的问题,结合DPDK 22.11.1版本特性,给出以下可落地的解决步骤:
1. 确认DPDK编译配置
确保DPDK编译时开启了pdump库支持:
- 检查
build/.config文件,确认存在CONFIG_RTE_LIBRTE_PDUMP=y - 若未开启,重新编译DPDK:
meson configure -Dlib_pdump=true build && ninja -C build
2. 应用内初始化pdump组件
在应用端口初始化之前,调用rte_pdump_init完成组件初始化,必须检查返回值:
#include <rte_pdump.h> // ... 其他初始化代码 ... int ret = rte_pdump_init(rte_socket_id()); if (ret != 0) { rte_exit(EXIT_FAILURE, "pdump init failed: %d\n", ret); }
传入rte_socket_id()确保初始化在应用运行的socket上完成。
3. 为端口注册抓包回调
在端口启动(rte_eth_dev_start)之后,为每个需要抓包的端口注册默认的RX/TX抓包回调:
uint16_t port_id; RTE_ETH_FOREACH_DEV(port_id) { // 注册RX回调 ret = rte_pdump_set_rx_callback(port_id, NULL, NULL); if (ret != 0) { rte_exit(EXIT_FAILURE, "set RX pdump callback failed for port %u: %d\n", port_id, ret); } // 注册TX回调 ret = rte_pdump_set_tx_callback(port_id, NULL, NULL); if (ret != 0) { rte_exit(EXIT_FAILURE, "set TX pdump callback failed for port %u: %d\n", port_id, ret); } }
参数NULL使用DPDK内置的默认回调逻辑,满足dpdk-dumpcap的基础抓包需求;若需自定义过滤,可替换为自己的回调函数和私有参数。
4. 编译链接配置
修改应用的Makefile,确保链接pdump库:
LDLIBS += -lrte_eal -lrte_ethdev -lrte_mbuf -lrte_pdump
5. 启动dpdk-dumpcap抓包
先启动自定义应用,再在另一个终端执行抓包命令(以抓取端口0的所有队列RX流量为例):
dpdk-dumpcap -- --pdump 'port=0,queue=*,rx-dev=/tmp/rx_traffic.pcap'
常见排查点
- 确保应用和dpdk-dumpcap均以root权限运行
- 确认端口已成功启动(
rte_eth_dev_start返回0) - 开启调试日志排查:启动应用时添加
--log-level=pmd.pdump:debug,查看pdump组件的初始化和回调注册日志 - 检查dpdk-dumpcap版本与当前DPDK版本一致,版本不匹配会导致IPC通信失败
内容的提问来源于stack exchange,提问作者Nafiul Alam Fuji
相关产品推荐
相关产品推荐

