0001 .. SPDX-License-Identifier: GPL-2.0
0002
0003 ====================================
0004 HOWTO for the linux packet generator
0005 ====================================
0006
0007 Enable CONFIG_NET_PKTGEN to compile and build pktgen either in-kernel
0008 or as a module. A module is preferred; modprobe pktgen if needed. Once
0009 running, pktgen creates a thread for each CPU with affinity to that CPU.
0010 Monitoring and controlling is done via /proc. It is easiest to select a
0011 suitable sample script and configure that.
0012
0013 On a dual CPU::
0014
0015 ps aux | grep pkt
0016 root 129 0.3 0.0 0 0 ? SW 2003 523:20 [kpktgend_0]
0017 root 130 0.3 0.0 0 0 ? SW 2003 509:50 [kpktgend_1]
0018
0019
0020 For monitoring and control pktgen creates::
0021
0022 /proc/net/pktgen/pgctrl
0023 /proc/net/pktgen/kpktgend_X
0024 /proc/net/pktgen/ethX
0025
0026
0027 Tuning NIC for max performance
0028 ==============================
0029
0030 The default NIC settings are (likely) not tuned for pktgen's artificial
0031 overload type of benchmarking, as this could hurt the normal use-case.
0032
0033 Specifically increasing the TX ring buffer in the NIC::
0034
0035 # ethtool -G ethX tx 1024
0036
0037 A larger TX ring can improve pktgen's performance, while it can hurt
0038 in the general case, 1) because the TX ring buffer might get larger
0039 than the CPU's L1/L2 cache, 2) because it allows more queueing in the
0040 NIC HW layer (which is bad for bufferbloat).
0041
0042 One should hesitate to conclude that packets/descriptors in the HW
0043 TX ring cause delay. Drivers usually delay cleaning up the
0044 ring-buffers for various performance reasons, and packets stalling
0045 the TX ring might just be waiting for cleanup.
0046
0047 This cleanup issue is specifically the case for the driver ixgbe
0048 (Intel 82599 chip). This driver (ixgbe) combines TX+RX ring cleanups,
0049 and the cleanup interval is affected by the ethtool --coalesce setting
0050 of parameter "rx-usecs".
0051
0052 For ixgbe use e.g. "30" resulting in approx 33K interrupts/sec (1/30*10^6)::
0053
0054 # ethtool -C ethX rx-usecs 30
0055
0056
0057 Kernel threads
0058 ==============
0059 Pktgen creates a thread for each CPU with affinity to that CPU.
0060 Which is controlled through procfile /proc/net/pktgen/kpktgend_X.
0061
0062 Example: /proc/net/pktgen/kpktgend_0::
0063
0064 Running:
0065 Stopped: eth4@0
0066 Result: OK: add_device=eth4@0
0067
0068 Most important are the devices assigned to the thread.
0069
0070 The two basic thread commands are:
0071
0072 * add_device DEVICE@NAME -- adds a single device
0073 * rem_device_all -- remove all associated devices
0074
0075 When adding a device to a thread, a corresponding procfile is created
0076 which is used for configuring this device. Thus, device names need to
0077 be unique.
0078
0079 To support adding the same device to multiple threads, which is useful
0080 with multi queue NICs, the device naming scheme is extended with "@":
0081 device@something
0082
0083 The part after "@" can be anything, but it is custom to use the thread
0084 number.
0085
0086 Viewing devices
0087 ===============
0088
0089 The Params section holds configured information. The Current section
0090 holds running statistics. The Result is printed after a run or after
0091 interruption. Example::
0092
0093 /proc/net/pktgen/eth4@0
0094
0095 Params: count 100000 min_pkt_size: 60 max_pkt_size: 60
0096 frags: 0 delay: 0 clone_skb: 64 ifname: eth4@0
0097 flows: 0 flowlen: 0
0098 queue_map_min: 0 queue_map_max: 0
0099 dst_min: 192.168.81.2 dst_max:
0100 src_min: src_max:
0101 src_mac: 90:e2:ba:0a:56:b4 dst_mac: 00:1b:21:3c:9d:f8
0102 udp_src_min: 9 udp_src_max: 109 udp_dst_min: 9 udp_dst_max: 9
0103 src_mac_count: 0 dst_mac_count: 0
0104 Flags: UDPSRC_RND NO_TIMESTAMP QUEUE_MAP_CPU
0105 Current:
0106 pkts-sofar: 100000 errors: 0
0107 started: 623913381008us stopped: 623913396439us idle: 25us
0108 seq_num: 100001 cur_dst_mac_offset: 0 cur_src_mac_offset: 0
0109 cur_saddr: 192.168.8.3 cur_daddr: 192.168.81.2
0110 cur_udp_dst: 9 cur_udp_src: 42
0111 cur_queue_map: 0
0112 flows: 0
0113 Result: OK: 15430(c15405+d25) usec, 100000 (60byte,0frags)
0114 6480562pps 3110Mb/sec (3110669760bps) errors: 0
0115
0116
0117 Configuring devices
0118 ===================
0119 This is done via the /proc interface, and most easily done via pgset
0120 as defined in the sample scripts.
0121 You need to specify PGDEV environment variable to use functions from sample
0122 scripts, i.e.::
0123
0124 export PGDEV=/proc/net/pktgen/eth4@0
0125 source samples/pktgen/functions.sh
0126
0127 Examples::
0128
0129 pg_ctrl start starts injection.
0130 pg_ctrl stop aborts injection. Also, ^C aborts generator.
0131
0132 pgset "clone_skb 1" sets the number of copies of the same packet
0133 pgset "clone_skb 0" use single SKB for all transmits
0134 pgset "burst 8" uses xmit_more API to queue 8 copies of the same
0135 packet and update HW tx queue tail pointer once.
0136 "burst 1" is the default
0137 pgset "pkt_size 9014" sets packet size to 9014
0138 pgset "frags 5" packet will consist of 5 fragments
0139 pgset "count 200000" sets number of packets to send, set to zero
0140 for continuous sends until explicitly stopped.
0141
0142 pgset "delay 5000" adds delay to hard_start_xmit(). nanoseconds
0143
0144 pgset "dst 10.0.0.1" sets IP destination address
0145 (BEWARE! This generator is very aggressive!)
0146
0147 pgset "dst_min 10.0.0.1" Same as dst
0148 pgset "dst_max 10.0.0.254" Set the maximum destination IP.
0149 pgset "src_min 10.0.0.1" Set the minimum (or only) source IP.
0150 pgset "src_max 10.0.0.254" Set the maximum source IP.
0151 pgset "dst6 fec0::1" IPV6 destination address
0152 pgset "src6 fec0::2" IPV6 source address
0153 pgset "dstmac 00:00:00:00:00:00" sets MAC destination address
0154 pgset "srcmac 00:00:00:00:00:00" sets MAC source address
0155
0156 pgset "queue_map_min 0" Sets the min value of tx queue interval
0157 pgset "queue_map_max 7" Sets the max value of tx queue interval, for multiqueue devices
0158 To select queue 1 of a given device,
0159 use queue_map_min=1 and queue_map_max=1
0160
0161 pgset "src_mac_count 1" Sets the number of MACs we'll range through.
0162 The 'minimum' MAC is what you set with srcmac.
0163
0164 pgset "dst_mac_count 1" Sets the number of MACs we'll range through.
0165 The 'minimum' MAC is what you set with dstmac.
0166
0167 pgset "flag [name]" Set a flag to determine behaviour. Current flags
0168 are: IPSRC_RND # IP source is random (between min/max)
0169 IPDST_RND # IP destination is random
0170 UDPSRC_RND, UDPDST_RND,
0171 MACSRC_RND, MACDST_RND
0172 TXSIZE_RND, IPV6,
0173 MPLS_RND, VID_RND, SVID_RND
0174 FLOW_SEQ,
0175 QUEUE_MAP_RND # queue map random
0176 QUEUE_MAP_CPU # queue map mirrors smp_processor_id()
0177 UDPCSUM,
0178 IPSEC # IPsec encapsulation (needs CONFIG_XFRM)
0179 NODE_ALLOC # node specific memory allocation
0180 NO_TIMESTAMP # disable timestamping
0181 pgset 'flag ![name]' Clear a flag to determine behaviour.
0182 Note that you might need to use single quote in
0183 interactive mode, so that your shell wouldn't expand
0184 the specified flag as a history command.
0185
0186 pgset "spi [SPI_VALUE]" Set specific SA used to transform packet.
0187
0188 pgset "udp_src_min 9" set UDP source port min, If < udp_src_max, then
0189 cycle through the port range.
0190
0191 pgset "udp_src_max 9" set UDP source port max.
0192 pgset "udp_dst_min 9" set UDP destination port min, If < udp_dst_max, then
0193 cycle through the port range.
0194 pgset "udp_dst_max 9" set UDP destination port max.
0195
0196 pgset "mpls 0001000a,0002000a,0000000a" set MPLS labels (in this example
0197 outer label=16,middle label=32,
0198 inner label=0 (IPv4 NULL)) Note that
0199 there must be no spaces between the
0200 arguments. Leading zeros are required.
0201 Do not set the bottom of stack bit,
0202 that's done automatically. If you do
0203 set the bottom of stack bit, that
0204 indicates that you want to randomly
0205 generate that address and the flag
0206 MPLS_RND will be turned on. You
0207 can have any mix of random and fixed
0208 labels in the label stack.
0209
0210 pgset "mpls 0" turn off mpls (or any invalid argument works too!)
0211
0212 pgset "vlan_id 77" set VLAN ID 0-4095
0213 pgset "vlan_p 3" set priority bit 0-7 (default 0)
0214 pgset "vlan_cfi 0" set canonical format identifier 0-1 (default 0)
0215
0216 pgset "svlan_id 22" set SVLAN ID 0-4095
0217 pgset "svlan_p 3" set priority bit 0-7 (default 0)
0218 pgset "svlan_cfi 0" set canonical format identifier 0-1 (default 0)
0219
0220 pgset "vlan_id 9999" > 4095 remove vlan and svlan tags
0221 pgset "svlan 9999" > 4095 remove svlan tag
0222
0223
0224 pgset "tos XX" set former IPv4 TOS field (e.g. "tos 28" for AF11 no ECN, default 00)
0225 pgset "traffic_class XX" set former IPv6 TRAFFIC CLASS (e.g. "traffic_class B8" for EF no ECN, default 00)
0226
0227 pgset "rate 300M" set rate to 300 Mb/s
0228 pgset "ratep 1000000" set rate to 1Mpps
0229
0230 pgset "xmit_mode netif_receive" RX inject into stack netif_receive_skb()
0231 Works with "burst" but not with "clone_skb".
0232 Default xmit_mode is "start_xmit".
0233
0234 Sample scripts
0235 ==============
0236
0237 A collection of tutorial scripts and helpers for pktgen is in the
0238 samples/pktgen directory. The helper parameters.sh file support easy
0239 and consistent parameter parsing across the sample scripts.
0240
0241 Usage example and help::
0242
0243 ./pktgen_sample01_simple.sh -i eth4 -m 00:1B:21:3C:9D:F8 -d 192.168.8.2
0244
0245 Usage:::
0246
0247 ./pktgen_sample01_simple.sh [-vx] -i ethX
0248
0249 -i : ($DEV) output interface/device (required)
0250 -s : ($PKT_SIZE) packet size
0251 -d : ($DEST_IP) destination IP. CIDR (e.g. 198.18.0.0/15) is also allowed
0252 -m : ($DST_MAC) destination MAC-addr
0253 -p : ($DST_PORT) destination PORT range (e.g. 433-444) is also allowed
0254 -t : ($THREADS) threads to start
0255 -f : ($F_THREAD) index of first thread (zero indexed CPU number)
0256 -c : ($SKB_CLONE) SKB clones send before alloc new SKB
0257 -n : ($COUNT) num messages to send per thread, 0 means indefinitely
0258 -b : ($BURST) HW level bursting of SKBs
0259 -v : ($VERBOSE) verbose
0260 -x : ($DEBUG) debug
0261 -6 : ($IP6) IPv6
0262 -w : ($DELAY) Tx Delay value (ns)
0263 -a : ($APPEND) Script will not reset generator's state, but will append its config
0264
0265 The global variables being set are also listed. E.g. the required
0266 interface/device parameter "-i" sets variable $DEV. Copy the
0267 pktgen_sampleXX scripts and modify them to fit your own needs.
0268
0269
0270 Interrupt affinity
0271 ===================
0272 Note that when adding devices to a specific CPU it is a good idea to
0273 also assign /proc/irq/XX/smp_affinity so that the TX interrupts are bound
0274 to the same CPU. This reduces cache bouncing when freeing skbs.
0275
0276 Plus using the device flag QUEUE_MAP_CPU, which maps the SKBs TX queue
0277 to the running threads CPU (directly from smp_processor_id()).
0278
0279 Enable IPsec
0280 ============
0281 Default IPsec transformation with ESP encapsulation plus transport mode
0282 can be enabled by simply setting::
0283
0284 pgset "flag IPSEC"
0285 pgset "flows 1"
0286
0287 To avoid breaking existing testbed scripts for using AH type and tunnel mode,
0288 you can use "pgset spi SPI_VALUE" to specify which transformation mode
0289 to employ.
0290
0291
0292 Current commands and configuration options
0293 ==========================================
0294
0295 **Pgcontrol commands**::
0296
0297 start
0298 stop
0299 reset
0300
0301 **Thread commands**::
0302
0303 add_device
0304 rem_device_all
0305
0306
0307 **Device commands**::
0308
0309 count
0310 clone_skb
0311 burst
0312 debug
0313
0314 frags
0315 delay
0316
0317 src_mac_count
0318 dst_mac_count
0319
0320 pkt_size
0321 min_pkt_size
0322 max_pkt_size
0323
0324 queue_map_min
0325 queue_map_max
0326 skb_priority
0327
0328 tos (ipv4)
0329 traffic_class (ipv6)
0330
0331 mpls
0332
0333 udp_src_min
0334 udp_src_max
0335
0336 udp_dst_min
0337 udp_dst_max
0338
0339 node
0340
0341 flag
0342 IPSRC_RND
0343 IPDST_RND
0344 UDPSRC_RND
0345 UDPDST_RND
0346 MACSRC_RND
0347 MACDST_RND
0348 TXSIZE_RND
0349 IPV6
0350 MPLS_RND
0351 VID_RND
0352 SVID_RND
0353 FLOW_SEQ
0354 QUEUE_MAP_RND
0355 QUEUE_MAP_CPU
0356 UDPCSUM
0357 IPSEC
0358 NODE_ALLOC
0359 NO_TIMESTAMP
0360
0361 spi (ipsec)
0362
0363 dst_min
0364 dst_max
0365
0366 src_min
0367 src_max
0368
0369 dst_mac
0370 src_mac
0371
0372 clear_counters
0373
0374 src6
0375 dst6
0376 dst6_max
0377 dst6_min
0378
0379 flows
0380 flowlen
0381
0382 rate
0383 ratep
0384
0385 xmit_mode <start_xmit|netif_receive>
0386
0387 vlan_cfi
0388 vlan_id
0389 vlan_p
0390
0391 svlan_cfi
0392 svlan_id
0393 svlan_p
0394
0395
0396 References:
0397
0398 - ftp://robur.slu.se/pub/Linux/net-development/pktgen-testing/
0399 - ftp://robur.slu.se/pub/Linux/net-development/pktgen-testing/examples/
0400
0401 Paper from Linux-Kongress in Erlangen 2004.
0402 - ftp://robur.slu.se/pub/Linux/net-development/pktgen-testing/pktgen_paper.pdf
0403
0404 Thanks to:
0405
0406 Grant Grundler for testing on IA-64 and parisc, Harald Welte, Lennert Buytenhek
0407 Stephen Hemminger, Andi Kleen, Dave Miller and many others.
0408
0409
0410 Good luck with the linux net-development.