目录
文章目录
前文列表
《DPDK — 安装部署》
《DPDK — TestPMD》
linux
DPDK PDUMP
pdump 库是在 DPDK 16.07 版本引入的一个 DPDK 数据包捕获框架(抓包工具)。由于 DPDK App 是彻底内核旁路的用户态网络协议栈,因此没法使用 tcpdump 工具来进行抓包。使用 DPDK pdump 能够用于抓取被 DPDK App 接管的指定接口、队列的数据包。vim
安装部署
DPDK pdump 抓包工具依赖基于 libpcap 的 PMD 驱动,须要预先安装:网络
- libpcap 网络数据包捕获函数库(A system-independent interface for user-level packet capture)。
- libpcap-devel 用于编译和使用基于 libcap 的 PMD 轮询模式驱动程序。
yum install -y libpcap.x86_64 libpcap-devel.x86_64
默认状况下,该驱动程序被禁用,须要经过修改 Target Env 的配置文件来开启:并发
$ vim dpdk-18.08/x86_64-native-linuxapp-gcc/.config CONFIG_RTE_LIBRTE_PMD_PCAP=y CONFIG_RTE_LIBRTE_PDUMP=y $ make
最后再安装 pdump:app
$ cd dpdk-18.08/app/pdump $ make && make install
运行原理
在使用 pdump 时,pdump 会做为 “Secondary 进程” 依附于 “Primary 进程”,即 DPDK App,例如:testpmd、l2fwd、l3fwd。Primary 进程做为 Server 端,初始化 pdump 抓包框架。而 Secondary 进程则做为 Client 端向 Primary 进程发送 Start/Stop 抓包的请求,而后 Primary 进程会拷贝一份数据包到 Ring 中,Secondary 进程再从 Ring 中读取出来,并发送到 pcap pmd 设备。能够保存为 pcap 文件,也能够经过 Linux Console 输出。框架
操做步骤
以 testpmd 为例,使用 dpdk-pdump 进行抓包。socket
- 启动 testpmd 做为 Primary
$ ./testpmd -l 1,2,3 --socket-mem 1024 -n 4 --log-level=8 -- -i
- 启动 dpdk-pdump 做为 Secondary
$ ./build/app/dpdk-pdump -- --pdump 'port=0,queue=*,rx-dev=/tmp/capture.pcap'
- 查看 pcap 文件
$ tcpdump -nr /tmp/capture.pcap
dpdk-pdump 指令
./build/app/dpdk-pdump -- --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>], [mbuf-size=<mbuf data size>], [total-num-mbufs=<number of mbufs>]' [--server-socket-path=<server socket dir>] [--client-socket-path=<client socket dir>]
- –pdump:是必选的,多个 --pdump 能够用于捕获不一样的接口和队列
- –server-socket-path:是可选的,指定 Server socket 的目录。root 用户就默认为 /var/run/.dpdk/,非 root 用户默认为 ~/.dpdk/。
- –client-socket-path:是可选的,指定 Client Socket 的目录。root 用户就默认为 /var/run/.dpdk/,非 root 用户默认为 ~/.dpdk/。
–pdump 的子参数:tcp
- port:须要被抓包的以太网 Port id。
- device_id:须要被抓包的以太网 PCI 设备的 id。
- queue:须要被抓包的以太网 PCI 设备的 Queue id,
*
表示全部队列。 - rx-dev:入口方向被抓取的报文,参数应该是一个 pcap 文件名或者 Linux 接口。
- tx-dev:出口方向被抓取的报文,参数应该是一个 pcap 文件名或者 Linux 接口。
NOTE:若是两个方向都分别要,tx-dev 与 rx-dev 应该被同时指定两个不一样的文件或者接口;若是两个方向都同时要,tx-dev 与 rx-dev 应该指定相同的文件或接口。函数
- ring-size:指定用于存储数据包的 Ring 的大小,默认是16384。用于主程序向抓包程序入队用的。
- mbuf-sizze:MBuf Data 的 大小,用于 mempool 的建立,默认是2176。用于入队列的mbuf用的。用于主程序向抓包程序传数据用的。
- total-num-mbufs:指建立 mbug 的个数,默认值为 65535。