DPDK PKTGEN使用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DPDK PKTGEN使用相关的知识,希望对你有一定的参考价值。
参考技术APKTGEN有两种形式,一种是直接由linux系统自带的内核模块进行发包(也就是略过协议栈,直接控制发包),另一种是依赖于dpdk的pktgen也就是本文主要讲的,需要进行稍微复杂的编译
modprobe pktgen
在/proc/net/pktgen看到以下文件:
kpktgend_0 kpktgend_1 kpktgend_2 kpktgend_3 pgctrl
其中kpktgen_*的多少是根据你的CPU的个数决定的,如我的机子的CPU数目为4,则有四个此文件。
通过命令cat /proc/net/pktgen/pgctrl可以查看pktgen的版本等信息:
注:也有使用insmod的,和modprobe的区别是:比如需要安装b模块,但是b依赖于a模块,因此使用insmod安装就需要先安装a模块再安装b模块;如果使用modprobe的话,就可以直接安装b模块,默认将安装a模块
基本上设置完成后就可以进行测试,要查看是否有流量,可以使用ifstat,tcpdump工具查看,使用应用层的抓包工具是无法看到的
关键参数介绍
参数中,最复杂的是 -m <string>
-m <string> 配置端口到逻辑核的映射关系,使用类似BNF类语法.映射的逻辑核要与 [EAL options]中的逻辑核要一致。
运行命令 ./app/x86_64-native-linuxapp-gcc/pktgen -l 0-2 -n 3 -- -P -m "[1].0, [2].1"
官方的default.cfg内容如下:
需要修改的地方有三处:
修改完后即可执行。
图中port1和port2已经有明显区别,收包数相差100个包
用pkggen再发1000个包
linux内核发包工具pktgen
pktgen使用说明
内核路径 net/core/pktgen.c
作者对于pktgen的介绍: 原作者编写的pdf介绍
pktgen.c 原理介绍
pktgen运用了proc 文件系统特征来实现用户和内核的交互,用户通过向proc中传输数据,内核接收到数据后进行解析按照预定义的操作执行,添加端口,填充报文,通过内核发包接口dev_queue_xmit/netdev_start_xmit 发送给网卡,省去了从用户态发包的大部分流程( 发包流程介绍,引用 )。
代码分析:加载pktgen.ko内核模块,module_init(pg_init); 会发现多了跟cpu core数相等的kpktgend_%d 内核线程,
static struct pernet_operations pg_net_ops =
.init = pg_net_init,
.exit = pg_net_exit,
.id = &pg_net_id,
.size = sizeof(struct pktgen_net),
;
然后配置时候主要涉及三个文件节点的操作 ,对相应节点文件做读写操作的时候触发对应的proc ops
kpktgend_%d
安装了内核模块以后,在/proc/net/pktgen/目录下面会创建对应的文件,对应的操作定义为
static const struct proc_ops pktgen_thread_proc_ops =
.proc_open = pktgen_thread_open,
.proc_read = seq_read,
.proc_lseek = seq_lseek,
.proc_write = pktgen_thread_write,
.proc_release = single_release,
;
pktgen_thread_write 在多add device的操作的时候会在/proc/net/pktgen/ 下添加对应的网卡名称命名的文件例如:/proc/net/pktgen/eth0
网口节点
static const struct proc_ops pktgen_if_proc_ops =
.proc_open = pktgen_if_open,
.proc_read = seq_read,
.proc_lseek = seq_lseek,
.proc_write = pktgen_if_write,
.proc_release = single_release,
;
通过pktgen_if_write 来实现对报文内容和发包逻辑的配置
pgctrl
static const struct proc_ops pktgen_proc_ops =
.proc_open = pgctrl_open,
.proc_read = seq_read,
.proc_lseek = seq_lseek,
.proc_write = pgctrl_write,
.proc_release = single_release,
;
通过对pgctrl的控制来实现线程发包的开始,停止,重启。
使用场景
- 没有测试仪器的情况下对网卡,路由器,交换机等网络设备的带宽进行测试,根据包长不同会有不同表现,1500 包长达到10G测试下来没问题
- 特殊场景,绕过协议栈等上层的处理进行发包的需求
以上是关于DPDK PKTGEN使用的主要内容,如果未能解决你的问题,请参考以下文章