^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) #!/bin/bash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) # SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) # Multiqueue: Using pktgen threads for sending on multiple CPUs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) # * adding devices to kernel threads
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) # * notice the naming scheme for keeping device names unique
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) # * nameing scheme: dev@thread_number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) # * flow variation via random UDP source port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) basedir=`dirname $0`
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) source ${basedir}/functions.sh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) root_check_run_with_sudo "$@"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) # Required param: -i dev in $DEV
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) source ${basedir}/parameters.sh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) [ -z "$COUNT" ] && COUNT="100000" # Zero means indefinitely
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) # Base Config
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) DELAY="0" # Zero means max speed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) [ -z "$CLONE_SKB" ] && CLONE_SKB="0"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) # Flow variation random source port between min and max
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) UDP_SRC_MIN=9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) UDP_SRC_MAX=109
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) # (example of setting default params in your script)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) if [ -z "$DEST_IP" ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) [ -z "$IP6" ] && DEST_IP="198.18.0.42" || DEST_IP="FD00::1"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) [ -z "$DST_MAC" ] && DST_MAC="90:e2:ba:ff:ff:ff"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) if [ -n "$DEST_IP" ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) validate_addr${IP6} $DEST_IP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) read -r DST_MIN DST_MAX <<< $(parse_addr${IP6} $DEST_IP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) if [ -n "$DST_PORT" ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) read -r UDP_DST_MIN UDP_DST_MAX <<< $(parse_ports $DST_PORT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) validate_ports $UDP_DST_MIN $UDP_DST_MAX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) # General cleanup everything since last run
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) pg_ctrl "reset"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) # Threads are specified with parameter -t value in $THREADS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) for ((thread = $F_THREAD; thread <= $L_THREAD; thread++)); do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) # The device name is extended with @name, using thread number to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) # make then unique, but any name will do.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) dev=${DEV}@${thread}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) # Add remove all other devices and add_device $dev to thread
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) pg_thread $thread "rem_device_all"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) pg_thread $thread "add_device" $dev
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) # Notice config queue to map to cpu (mirrors smp_processor_id())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) # It is beneficial to map IRQ /proc/irq/*/smp_affinity 1:1 to CPU number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) pg_set $dev "flag QUEUE_MAP_CPU"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) # Base config of dev
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) pg_set $dev "count $COUNT"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) pg_set $dev "clone_skb $CLONE_SKB"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) pg_set $dev "pkt_size $PKT_SIZE"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) pg_set $dev "delay $DELAY"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) # Flag example disabling timestamping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) pg_set $dev "flag NO_TIMESTAMP"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) # Destination
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) pg_set $dev "dst_mac $DST_MAC"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) pg_set $dev "dst${IP6}_min $DST_MIN"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) pg_set $dev "dst${IP6}_max $DST_MAX"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) if [ -n "$DST_PORT" ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) # Single destination port or random port range
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) pg_set $dev "flag UDPDST_RND"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) pg_set $dev "udp_dst_min $UDP_DST_MIN"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) pg_set $dev "udp_dst_max $UDP_DST_MAX"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) # Setup random UDP port src range
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) pg_set $dev "flag UDPSRC_RND"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) pg_set $dev "udp_src_min $UDP_SRC_MIN"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) pg_set $dev "udp_src_max $UDP_SRC_MAX"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) # start_run
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) echo "Running... ctrl^C to stop" >&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) pg_ctrl "start"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) echo "Done" >&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) # Print results
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) for ((thread = $F_THREAD; thread <= $L_THREAD; thread++)); do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) dev=${DEV}@${thread}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) echo "Device: $dev"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) cat /proc/net/pktgen/$dev | grep -A2 "Result:"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) done