github代码地址:GitHub - DPDK/dpdk: Data Plane Development Kit · GitHub
目前使用直接的git clone命令总是会报错(windows下),在WSL中则可以顺利进行git clone。
来自官网的使用教程:https://core.dpdk.org/doc/quick-start/
编译逻辑
根据官网的描述,进行当前设备上DPDK编译的主要工具为meson(用于配置生成)、ninja(用于gcc工具调度)。
meson build
ninja -C build当然,在这个基础的编译过程中很有可能遇到各种各样的bug,这里贴一个完成图,完成后会在当前文件夹下生成一个build文件夹,在其中的app文件夹里面就能看到我们需要的东西:

有关meson(配置生成工具)、ninja(编译工具)的具体配置参数与相关联的源码分析,有待下一篇文章详细讲讲。
testpmd使用方法
testpmd是DPDK自带的最常用的交互式数据包转发测试工具,其使用的完整流程主要包括环境准备、应用启动、交互操作等。
环境准备
首先,加载vfio-pci模块。这是一个linux的模块,主要用于将物理PCI/PCIE设备安全地直通给用户空间使用。它的核心目标是再保证系统安全性和隔离性的前提下,让用户态程序能够直接、独占地控制硬件设备。
modprobe vfio-pciPS:这里可以注意一下modprobe(可以识别依赖关系)和insmod(不识别依赖关系)的区别。具体来说就是,如果你直接前往/lib/modules/{username}/kernel/drivers/下面去加载ko文件的话,由于insmod依赖关系的不存,会报错。具体来说,vfio-pci存在vfio_pci_core、vfio_iommu_type1、vfio等多个文件的依赖关系需要加载。
详情如下:其中Used by描述了各模块之间的依赖关系

然后,需要将物理网卡绑定到DPDK驱动上。由于物理网卡默认由内核驱动,所以需要进行解绑+重新绑定的操作:(可以使用usertools中的dpdk-devbind.py工具)
# 查看当前网卡状态
./usertools/dpdk-devbind.py --status
# 假设网卡 PCI 地址为 0000:07:00.0,绑定到 vfio-pci
./usertools/dpdk-devbind.py -b vfio-pci 0000:07:00.0
最后,还需要为DPDK配置大页内存来提高TLB命中率从而提升性能:
# 临时分配 1024 个 2MB 大页(约 2GB)
echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
# 挂载大页目录(如果尚未挂载)
mkdir -p /mnt/huge
mount -t hugetlbfs nodev /mnt/huge启动Testpmd
testpmd的主要组成分为--符号前的EAL(硬件抽象层)与--符号后的特定参数两个部分。
./build/app/dpdk-testpmd -l 0-3 -n 4 -- -i其中EAL参数:
-l 0-3:指定使用的CPU核心列表
-n 4:指定内存通道数
Testpmd特定参数:
-i:代表进入交互模式,进入testpmd提示符中并允许手动输入

testpmd本身参数可以参考网站:https://doc.dpdk.org/guides/testpmd_app_ug/
交互模式下的命令
对于DPDK来说,我们希望具备如下的能力:
具备查看当前设备信息的能力,比如网口信息、网口上的mac、ip信息、网口的接口统计信息、FEC信息等(配置检查)
具备设置一种待发送报文类型的能力,分为改变报文IP、MAC、端口号、协议栈类型、长度等有限的修改,以及针对payload、任意header的无限修改(报文修改)
具备抓包或进行端口统计的能力,其一是要具备抓包为pcap的能力,其二是要具备端口状态、端口报文计数、丢包与错报计数的能力(抓包与统计)
具备设置发送模式的能力,注意发送模式并不指报文如何,而是指近来的报文作和中处理,进行何种匹配后关联到哪个port出去(转发行为)
默认模式下会开启io fwd的转发模式,具体命令由于比较复杂,后续分为不同的模块专门谈。