You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为自定义简易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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 20:42:21