1 .. SPDX-License-Identifier: GPL-2.0
3 ====================================
4 HOWTO for the linux packet generator
5 ====================================
7 Enable CONFIG_NET_PKTGEN to compile and build pktgen either in-kernel
8 or as a module. A module is preferred; modprobe pktgen if needed. Once
9 running, pktgen creates a thread for each CPU with affinity to that CPU.
10 Monitoring and controlling is done via /proc. It is easiest to select a
11 suitable sample script and configure that.
16 root 129 0.3 0.0 0 0 ? SW 2003 523:20 [kpktgend_0]
17 root 130 0.3 0.0 0 0 ? SW 2003 509:50 [kpktgend_1]
20 For monitoring and control pktgen creates::
22 /proc/net/pktgen/pgctrl
23 /proc/net/pktgen/kpktgend_X
27 Tuning NIC for max performance
28 ==============================
30 The default NIC settings are (likely) not tuned for pktgen's artificial
31 overload type of benchmarking, as this could hurt the normal use-case.
33 Specifically increasing the TX ring buffer in the NIC::
35 # ethtool -G ethX tx 1024
37 A larger TX ring can improve pktgen's performance, while it can hurt
38 in the general case, 1) because the TX ring buffer might get larger
39 than the CPU's L1/L2 cache, 2) because it allows more queueing in the
40 NIC HW layer (which is bad for bufferbloat).
42 One should hesitate to conclude that packets/descriptors in the HW
43 TX ring cause delay. Drivers usually delay cleaning up the
44 ring-buffers for various performance reasons, and packets stalling
45 the TX ring might just be waiting for cleanup.
47 This cleanup issue is specifically the case for the driver ixgbe
48 (Intel 82599 chip). This driver (ixgbe) combines TX+RX ring cleanups,
49 and the cleanup interval is affected by the ethtool --coalesce setting
50 of parameter "rx-usecs".
52 For ixgbe use e.g. "30" resulting in approx 33K interrupts/sec (1/30*10^6)::
54 # ethtool -C ethX rx-usecs 30
59 Pktgen creates a thread for each CPU with affinity to that CPU.
60 Which is controlled through procfile /proc/net/pktgen/kpktgend_X.
62 Example: /proc/net/pktgen/kpktgend_0::
66 Result: OK: add_device=eth4@0
68 Most important are the devices assigned to the thread.
70 The two basic thread commands are:
72 * add_device DEVICE@NAME -- adds a single device
73 * rem_device_all -- remove all associated devices
75 When adding a device to a thread, a corresponding procfile is created
76 which is used for configuring this device. Thus, device names need to
79 To support adding the same device to multiple threads, which is useful
80 with multi queue NICs, the device naming scheme is extended with "@":
83 The part after "@" can be anything, but it is custom to use the thread
89 The Params section holds configured information. The Current section
90 holds running statistics. The Result is printed after a run or after
91 interruption. Example::
93 /proc/net/pktgen/eth4@0
95 Params: count 100000 min_pkt_size: 60 max_pkt_size: 60
96 frags: 0 delay: 0 clone_skb: 64 ifname: eth4@0
98 queue_map_min: 0 queue_map_max: 0
99 dst_min: 192.168.81.2 dst_max:
101 src_mac: 90:e2:ba:0a:56:b4 dst_mac: 00:1b:21:3c:9d:f8
102 udp_src_min: 9 udp_src_max: 109 udp_dst_min: 9 udp_dst_max: 9
103 src_mac_count: 0 dst_mac_count: 0
104 Flags: UDPSRC_RND NO_TIMESTAMP QUEUE_MAP_CPU
106 pkts-sofar: 100000 errors: 0
107 started: 623913381008us stopped: 623913396439us idle: 25us
108 seq_num: 100001 cur_dst_mac_offset: 0 cur_src_mac_offset: 0
109 cur_saddr: 192.168.8.3 cur_daddr: 192.168.81.2
110 cur_udp_dst: 9 cur_udp_src: 42
113 Result: OK: 15430(c15405+d25) usec, 100000 (60byte,0frags)
114 6480562pps 3110Mb/sec (3110669760bps) errors: 0
119 This is done via the /proc interface, and most easily done via pgset
120 as defined in the sample scripts.
121 You need to specify PGDEV environment variable to use functions from sample
124 export PGDEV=/proc/net/pktgen/eth4@0
125 source samples/pktgen/functions.sh
129 pg_ctrl start starts injection.
130 pg_ctrl stop aborts injection. Also, ^C aborts generator.
132 pgset "clone_skb 1" sets the number of copies of the same packet
133 pgset "clone_skb 0" use single SKB for all transmits
134 pgset "burst 8" uses xmit_more API to queue 8 copies of the same
135 packet and update HW tx queue tail pointer once.
136 "burst 1" is the default
137 pgset "pkt_size 9014" sets packet size to 9014
138 pgset "frags 5" packet will consist of 5 fragments
139 pgset "count 200000" sets number of packets to send, set to zero
140 for continuous sends until explicitly stopped.
142 pgset "delay 5000" adds delay to hard_start_xmit(). nanoseconds
144 pgset "dst 10.0.0.1" sets IP destination address
145 (BEWARE! This generator is very aggressive!)
147 pgset "dst_min 10.0.0.1" Same as dst
148 pgset "dst_max 10.0.0.254" Set the maximum destination IP.
149 pgset "src_min 10.0.0.1" Set the minimum (or only) source IP.
150 pgset "src_max 10.0.0.254" Set the maximum source IP.
151 pgset "dst6 fec0::1" IPV6 destination address
152 pgset "src6 fec0::2" IPV6 source address
153 pgset "dstmac 00:00:00:00:00:00" sets MAC destination address
154 pgset "srcmac 00:00:00:00:00:00" sets MAC source address
156 pgset "queue_map_min 0" Sets the min value of tx queue interval
157 pgset "queue_map_max 7" Sets the max value of tx queue interval, for multiqueue devices
158 To select queue 1 of a given device,
159 use queue_map_min=1 and queue_map_max=1
161 pgset "src_mac_count 1" Sets the number of MACs we'll range through.
162 The 'minimum' MAC is what you set with srcmac.
164 pgset "dst_mac_count 1" Sets the number of MACs we'll range through.
165 The 'minimum' MAC is what you set with dstmac.
167 pgset "flag [name]" Set a flag to determine behaviour. Current flags
168 are: IPSRC_RND # IP source is random (between min/max)
169 IPDST_RND # IP destination is random
170 UDPSRC_RND, UDPDST_RND,
171 MACSRC_RND, MACDST_RND
173 MPLS_RND, VID_RND, SVID_RND
175 QUEUE_MAP_RND # queue map random
176 QUEUE_MAP_CPU # queue map mirrors smp_processor_id()
178 IPSEC # IPsec encapsulation (needs CONFIG_XFRM)
179 NODE_ALLOC # node specific memory allocation
180 NO_TIMESTAMP # disable timestamping
181 pgset 'flag ![name]' Clear a flag to determine behaviour.
182 Note that you might need to use single quote in
183 interactive mode, so that your shell wouldn't expand
184 the specified flag as a history command.
186 pgset "spi [SPI_VALUE]" Set specific SA used to transform packet.
188 pgset "udp_src_min 9" set UDP source port min, If < udp_src_max, then
189 cycle through the port range.
191 pgset "udp_src_max 9" set UDP source port max.
192 pgset "udp_dst_min 9" set UDP destination port min, If < udp_dst_max, then
193 cycle through the port range.
194 pgset "udp_dst_max 9" set UDP destination port max.
196 pgset "mpls 0001000a,0002000a,0000000a" set MPLS labels (in this example
197 outer label=16,middle label=32,
198 inner label=0 (IPv4 NULL)) Note that
199 there must be no spaces between the
200 arguments. Leading zeros are required.
201 Do not set the bottom of stack bit,
202 that's done automatically. If you do
203 set the bottom of stack bit, that
204 indicates that you want to randomly
205 generate that address and the flag
206 MPLS_RND will be turned on. You
207 can have any mix of random and fixed
208 labels in the label stack.
210 pgset "mpls 0" turn off mpls (or any invalid argument works too!)
212 pgset "vlan_id 77" set VLAN ID 0-4095
213 pgset "vlan_p 3" set priority bit 0-7 (default 0)
214 pgset "vlan_cfi 0" set canonical format identifier 0-1 (default 0)
216 pgset "svlan_id 22" set SVLAN ID 0-4095
217 pgset "svlan_p 3" set priority bit 0-7 (default 0)
218 pgset "svlan_cfi 0" set canonical format identifier 0-1 (default 0)
220 pgset "vlan_id 9999" > 4095 remove vlan and svlan tags
221 pgset "svlan 9999" > 4095 remove svlan tag
224 pgset "tos XX" set former IPv4 TOS field (e.g. "tos 28" for AF11 no ECN, default 00)
225 pgset "traffic_class XX" set former IPv6 TRAFFIC CLASS (e.g. "traffic_class B8" for EF no ECN, default 00)
227 pgset "rate 300M" set rate to 300 Mb/s
228 pgset "ratep 1000000" set rate to 1Mpps
230 pgset "xmit_mode netif_receive" RX inject into stack netif_receive_skb()
231 Works with "burst" but not with "clone_skb".
232 Default xmit_mode is "start_xmit".
237 A collection of tutorial scripts and helpers for pktgen is in the
238 samples/pktgen directory. The helper parameters.sh file support easy
239 and consistent parameter parsing across the sample scripts.
241 Usage example and help::
243 ./pktgen_sample01_simple.sh -i eth4 -m 00:1B:21:3C:9D:F8 -d 192.168.8.2
247 ./pktgen_sample01_simple.sh [-vx] -i ethX
249 -i : ($DEV) output interface/device (required)
250 -s : ($PKT_SIZE) packet size
251 -d : ($DEST_IP) destination IP
252 -m : ($DST_MAC) destination MAC-addr
253 -t : ($THREADS) threads to start
254 -c : ($SKB_CLONE) SKB clones send before alloc new SKB
255 -b : ($BURST) HW level bursting of SKBs
256 -v : ($VERBOSE) verbose
259 The global variables being set are also listed. E.g. the required
260 interface/device parameter "-i" sets variable $DEV. Copy the
261 pktgen_sampleXX scripts and modify them to fit your own needs.
265 pktgen.conf-1-2 # 1 CPU 2 dev
266 pktgen.conf-1-1-rdos # 1 CPU 1 dev w. route DoS
267 pktgen.conf-1-1-ip6 # 1 CPU 1 dev ipv6
268 pktgen.conf-1-1-ip6-rdos # 1 CPU 1 dev ipv6 w. route DoS
269 pktgen.conf-1-1-flows # 1 CPU 1 dev multiple flows.
274 Note that when adding devices to a specific CPU it is a good idea to
275 also assign /proc/irq/XX/smp_affinity so that the TX interrupts are bound
276 to the same CPU. This reduces cache bouncing when freeing skbs.
278 Plus using the device flag QUEUE_MAP_CPU, which maps the SKBs TX queue
279 to the running threads CPU (directly from smp_processor_id()).
283 Default IPsec transformation with ESP encapsulation plus transport mode
284 can be enabled by simply setting::
289 To avoid breaking existing testbed scripts for using AH type and tunnel mode,
290 you can use "pgset spi SPI_VALUE" to specify which transformation mode
294 Current commands and configuration options
295 ==========================================
297 **Pgcontrol commands**::
303 **Thread commands**::
309 **Device commands**::
387 xmit_mode <start_xmit|netif_receive>
400 - ftp://robur.slu.se/pub/Linux/net-development/pktgen-testing/
401 - tp://robur.slu.se/pub/Linux/net-development/pktgen-testing/examples/
403 Paper from Linux-Kongress in Erlangen 2004.
404 - ftp://robur.slu.se/pub/Linux/net-development/pktgen-testing/pktgen_paper.pdf
408 Grant Grundler for testing on IA-64 and parisc, Harald Welte, Lennert Buytenhek
409 Stephen Hemminger, Andi Kleen, Dave Miller and many others.
412 Good luck with the linux net-development.