DPDK pdump抓包说明

转自:https://www.cnblogs.com/yhp-smarthome/p/7102557.html

一.环境与编译

pdump库是在16.07版本引入的,提供了一个抓包调试功能。在$(RTE_SDK)/app目录下就有一个dpdk-pdump的工具。配置这个这个工具可以用于抓取指定接口、队列的数据包。

1.1 库及依赖

Pdump依赖于libpcap库及libpcap-dev等相关库,要预先安装。

1.2 编译选项

Pdump依赖于基于libpcap的PMD驱动,需要开启两个设置,来生成运行pdump工具

  1. CONFIG_RTE_LIBRTE_PMD_PCAP=y ($(RTE_SDK)/config/common_base文件)
  2. CONFIG_RTE_LIBRTE_PDUMP=y ($(RTE_SDK)/config/common_base文件)

1.3 编译dpdk-pdump

这里以17.02版本为例说明。按照官方文档,在$(RTE_SDK)目录下,

  1. 设置编译的目录 export RTE_SDK=XXX ,XXX就是dpdk的源码包的目录
  2. 设置编译后的安装目录(主要就是拷贝生成的库,头文件等) export DESTDIR=XXX,这个安装目录可以自行设置。推荐自己建一个目录,好找就行,生成的pdump工具就在这个目录里。
  3. 执行编译安装 make install T=x86_64-native-linuxapp-gcc;这里的T是指编译的TARGET,根据机器和编译器选择组合,具体可参考官方文档——《Getting started Guide For Linux》

二. 测试与使用

在编译安装后,就会在安装目录的bin目录中发现dpdk-pdump可执行文件。可以拷贝出来后续运行。

2.1 运行原理

dpdk-pdump使用时,作为secondary进程依附于primary进程。primary进程中启动server端,初始化pdump抓包框架任务;dpdk-pdump进程是作为client端向primary进程发送开始/停止抓包请求,然后primary进程拷贝一份数据包到ring中,secondary进程从ring中读取出来,并保存为pcap文件。因此,可以看出在primary进程中需要初始化pdump server。

2.2 简单示例

  1. 在示例中,使用l3fd来当primary进程,但是需要做些小修改,在rte_eal_init()后,初始化pdump框架,添加如下代码:

    #ifdef RTE_LIBRTE_PDUMP
    /* initialize packet capture framework */
    rte_pdump_init(NULL);
    #endif

    然后编译l3fd生成l3fd可执行文件,就以官方例子参数运行。

  2. 运行dpdk-pdump,作为secondary进程,依附于前面启动的l3fd。执行如下参数命令: ./dpdk-pdump -- --pdump 'port=0,queue=*,rx-dev=/tmp/rx.pcap'
    这里需要注意port的取值,一定是DPDK绑定的网卡,如绑定了3张网卡,那port取值范围就是0-2,对应于每个网卡。自然,也可以使用PCI号来传参,指明抓哪个网卡。Dev=/tmp/rx.pcap就指明了最后抓的包存放的路径。

更详细的dpdp-pdump运行参数可以根据情况设置,格式如下:

usage: %s [EAL options] -- --pdump "
            "'(port=<port id> | device_id=<pci id or vdev name>),"
            "(queue=<queue_id>),"
            "(rx-dev=<iface or pcap file> |"
            " tx-dev=<iface or pcap file>,"
            "[ring-size=<ring size>default:16384],"
            "[mbuf-size=<mbuf data size>default:2176],"
            "[total-num-mbufs=<number of mbufs>default:65535]'\n"
            "[--server-socket-path=<server socket dir>"
                "default:/var/run/.dpdk/ (or) ~/.dpdk/]\n"
            "[--client-socket-path=<client socket dir>"
                "default:/var/run/.dpdk/ (or) ~/.dpdk/]\n"
注意:参数中注意单引号那个字符,还有指定server-socket-path的路径时的”\n”字符。
   
   
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当将 ndpi 集成到 DPDK 后,无法对 DPDK抓包数据进行协议识别可能有以下几个原因: 1. 数据包处理顺序:DPDK 使用多核心和数据包处理管线来实现高性能数据包处理。当数据包经过 DPDK 的处理管线时,可能会改变数据包的顺序和格式,这可能会导致 ndpiReader.c 无法正确解析数据包。 2. 数据包封装格式:DPDK 通常使用特定的封装格式来处理数据包,例如 DPDK 的 mbuf 结构。这些封装格式可能与 ndpiReader.c 期望的数据包格式不一致,导致无法正确解析。 3. 需要自定义适配:由于 DPDK 和 ndpi 是两个独立的框架,它们的接口和数据结构可能不兼容。因此,在集成 ndpi 到 DPDK 时,可能需要进行自定义适配和修改,以确保正确的数据包解析和协议识别。 解决这个问题的方法可能包括: 1. 检查 ndpiReader.c 的代码以了解其协议识别逻辑,并与 DPDK 的数据包处理流程进行比较。确定是否存在数据包处理顺序或封装格式上的差异。 2. 分析 DPDK抓包数据和 ndpiReader.c 预期的数据包格式之间的差异,并尝试编写适配代码来处理这些差异。 3. 考虑使用其他基于 DPDK 的协议识别工具或库,这些工具可能已经针对 DPDK 进行了适配和优化,从而更容易与 DPDK 集成。 请注意,集成 ndpi 到 DPDK 并进行协议识别是一个复杂的任务,需要深入了解 DPDK 和 ndpi 的工作原理和代码结构。如果你对两者都不太熟悉,可能需要更多的研究和调试来解决这个问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值