pktgen 使用小记
pktgen 是 Linux 内核自带的一个发包工具。下面知识简单的通过一个例子介绍一下。
安装
要使用 pktgen,首先必须加载 pktgen 的内核模块。
modprobe pktgen
当然,要卸载也是同样。rmmod pktgen
。
在安装完模块之后,会自动产生 /proc/net/pktgen 这样一个目录。其中会存在类似 kpktgend_0 这样的文件,这些文件对应了所在机器的逻辑核。而 pgctrl 则是控制程序。
简单样例
下面通过这个简单的脚本说明一下使用。
#!/bin/sh
# 函数用于设置参数
function pgset() {
local result
echo $1 > $PGDEV
result=`cat $PGDEV | fgrep "Result: OK:"`
if [ "$result" = "" ]; then
cat $PGDEV | fgrep Result:
fi
}
# 在 CPU 0 上绑定网卡 enp0s8
PGDEV=/proc/net/pktgen/kpktgend_0
echo "Removing all devices"
pgset "rem_device_all"
echo "Adding enp0s8"
pgset "add_device enp0s8"
echo "Setting max_before_softirq 10000"
pgset "max_before_softirq 10000"
# 为网卡 enp0s8 设置各种参数。包括发包数量,包大小,延迟,目标 IP,目标 mac 地址等。
# COUNT 0 means forever
COUNT="count 100000"
CLONE_SKB="clone_skb 000000"
# NIC adds 4 bytes CRC
PKT_SIZE="pkt_size 64"
# delay is inter packet gap. 0 means maximum speed.
delay="delay 0"
PGDEV=/proc/net/pktgen/enp0s8
echo "Configuring $PGDEV"
pgset "$COUNT"
pgset "$CLONE_SKB"
pgset "$PKT_SIZE"
pgset "$delay"
pgset "dst 10.10.11.2"
pgset "dst_mac 08:00:27:f7:55:35"
# 运行程序
PGDEV=/proc/net/pktgen/pgctrl
echo "Running... ctrl^C to stop"
pgset "start"
echo "Done"
运行结果会在 /proc/net/pktgen/enp0s8 中:
Params: count 100000 min_pkt_size: 64 max_pkt_size: 64
frags: 0 delay: 0 clone_skb: 0 ifname: enp0s8
flows: 0 flowlen: 0
queue_map_min: 0 queue_map_max: 0
dst_min: 10.10.11.2 dst_max:
src_min: src_max:
src_mac: 08:00:27:8c:20:01 dst_mac: 08:00:27:f7:55:35
udp_src_min: 9 udp_src_max: 9 udp_dst_min: 9 udp_dst_max: 9
src_mac_count: 0 dst_mac_count: 0
Flags:
Current:
pkts-sofar: 100000 errors: 0
started: 1725189480us stopped: 1738624191us idle: 275397us
seq_num: 100001 cur_dst_mac_offset: 0 cur_src_mac_offset: 0
cur_saddr: 0.0.0.0 cur_daddr: 10.10.11.2
cur_udp_dst: 9 cur_udp_src: 9
cur_queue_map: 0
flows: 0
Result: OK: 13434711(c13159314+d275397) usec, 100000 (64byte,0frags)
7443pps 3Mb/sec (3810816bps) errors:
posted on 2021-07-22 16:54 alfred_zhong 阅读(638) 评论(0) 编辑 收藏 举报