pktgen工具使用及案例整理
pktgen是一个位于linux内核层的高性能网络测试工具。主要用来测试网络驱动与网卡设备,支持多线程,能够产生随机mac地址、IP地址、UDP端口号的数据包。
pktgen的配置与统计信息查看都使用/proc文件系统完成,/proc文件系统是一种特殊的,有软件创建的文件系统,内核使用/proc文件系统向外界导出信息,外界也可以通过它配置内核态的一些进程的参数,如ps top uptime等linux发行版中的很多工具就是通过/proc实现的。
在大多情况下,我们只用/proc读出数据(用于调试内核驱动等),而在pktgen中配置命令就用到了/proc的写入数据功能。
1、pktgen工具命令说明
1.1、pktgen控制命令
pktgen命令参数 | 参数说明 |
---|---|
start | 所有的线程开始发送 |
stop | 停止 |
1.2、线程的控制命令
pktgen命令参数 | 参数说明 |
---|---|
add_device | 添加某个端口到某个线程 |
rem_device_all | 删除绑定在某个线程的所有端口 |
max_before_softirq | 在最多发送多少个数据包后,执行do_softirq() |
1.3、端口命令
pktgen命令参数 | 参数说明 |
---|---|
debug | 调试 |
clone_skb | 对每个skb进行多少个复制,0表示不复制。对于Dos等测试必须至零 |
clear_counters | 清空计数器,一般程序自动清空 |
pkt_size | 链路包的大小(前去CRC的值) |
min_pkt_size | 数据包最小值 |
max_pkt_size | 数据包最大值 |
flags | 包的分片数量 |
count | 发送数据包的个数,0 表示一直发送 |
delay | 发送两个数据包之间的延时 |
dst | 目的IP |
dst_min | 目的IP的最小值 |
dst_max | 目的IP的最大值 |
src_min | 源IP最小值 |
src_max | 源IP最大值 |
dst6 | 目的IPv6地址 |
src6 | 源IPv6地址 |
dstmac | 目的mac |
srcmac | 源mac |
src_mac_count | 源mac的数量,从srcmac设置的mac开始轮询 |
dst_mac_count | 目的mac的数量,从srcmac设置的mac开始轮询 |
udp_src_min | 最小源udp端口号 |
udp_src_max | 最大源udp端口号 |
udp_dst_min | 最小目的udp端口号 |
udp_dst_max | 最大目的udp端口号 |
flows | 并发流的个数 |
flowlen | 流的长度 |
1.4、Flags
Flags参数 | 参数说明 |
---|---|
IPSRC_RND IPDST_RND TXSIZE_RND UDPSRC_RND UDPDST_RND MACSRC_RND MACDST_RND | PSRC_RND 源IP随机发送 |
2、操作方法
从上面可以看出 pgctrl 控制 kpktgend_X 的启动停止发包, kpktgend_X 控制 ethX 使用网卡进行实际动作.
从 pktgen 加载之后, 使用 ps aux | grep pktgen 可以看到和 CPU 核心数相同的内核线程。
那么要让 pktgen 发包, 可以想象出来, 按照以下的步骤即可:
1. 内核线程 kpktgend_X 关联网口 (操作 kpktgend_X)
2. 配置网口发送参数 (操作 ehtX)
3. 启动发送 (操作pgctl)
2.1 pktgen一个使用案例
#! /bin/sh
#modprobe pktgen
# 写虚拟文件系统的函数, 每次操作之前, 设置好要操作的设备 $PGDEV 为 pgctl/kpktgend_X/ehtX
function pgset() {
local result
echo $1 > $PGDEV
result=`cat $PGDEV | fgrep "Result: OK:"`
if [ "$result" = "" ]; then
cat $PGDEV | fgrep Result:
fi
}
function pg() {
echo inject > $PGDEV
cat $PGDEV
}
# Config Start Here -----------------------------------------------------------
# thread config
# Each CPU has own thread. Two CPU exammple. We add eth0, eth2 respectivly.
# 移除线程中对应的所有网口, 再添加
PGDEV=/proc/net/pktgen/kpktgend_0
echo "Removing all devices"
pgset "rem_device_all"
echo "Adding eth0"
pgset "add_device eth0"
echo "Setting max_before_softirq 10000"
pgset "max_before_softirq 10000"
# device config
# ipg is inter packet gap. 0 means maximum speed.
CLONE_SKB="clone_skb 1000000"
# NIC adds 4 bytes CRC
PKT_SIZE="pkt_size 60"
# COUNT 0 means forever
#COUNT="count 0"
COUNT="count 10000000"
# ipg 参数在我实验的时候无效, 我从2.6.32的源码中也没有看到相关的设置, 可以将 ipg 相关的配置删掉
#IPG="ipg 0"
PGDEV=/proc/net/pktgen/eth0
echo "Configuring $PGDEV"
pgset "$COUNT"
pgset "$CLONE_SKB"
pgset "$PKT_SIZE"
#pgset "$IPG"
# 配置目标IP
pgset "dst 192.168.2.254"
# 配置目标MAC
pgset "dst_mac 00:04:32:08:a1:89"
# Time to run
PGDEV=/proc/net/pktgen/pgctrl
# 发送 start 给 pgctl, 让 pktgen 开始发包
echo "Running... ctrl^C to stop"
pgset "start"
echo "Done"
# Result can be vieved in /proc/net/pktgen/eth0