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的控制来实现线程发包的开始,停止,重启。

使用场景

  1. 没有测试仪器的情况下对网卡,路由器,交换机等网络设备的带宽进行测试,根据包长不同会有不同表现,1500 包长达到10G测试下来没问题
  2. 特殊场景,绕过协议栈等上层的处理进行发包的需求
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值