1282fb589SJesper Dangaard Brouer#!/bin/bash 2b2441318SGreg Kroah-Hartman# SPDX-License-Identifier: GPL-2.0 3282fb589SJesper Dangaard Brouer# 4282fb589SJesper Dangaard Brouer# Multiqueue: Using pktgen threads for sending on multiple CPUs 5282fb589SJesper Dangaard Brouer# * adding devices to kernel threads 6282fb589SJesper Dangaard Brouer# * notice the naming scheme for keeping device names unique 7282fb589SJesper Dangaard Brouer# * nameing scheme: dev@thread_number 8282fb589SJesper Dangaard Brouer# * flow variation via random UDP source port 9282fb589SJesper Dangaard Brouer# 10282fb589SJesper Dangaard Brouerbasedir=`dirname $0` 11282fb589SJesper Dangaard Brouersource ${basedir}/functions.sh 12282fb589SJesper Dangaard Brouerroot_check_run_with_sudo "$@" 13282fb589SJesper Dangaard Brouer# 14282fb589SJesper Dangaard Brouer# Required param: -i dev in $DEV 15282fb589SJesper Dangaard Brouersource ${basedir}/parameters.sh 16282fb589SJesper Dangaard Brouer 17*a27ac539SJ.J. Martzki# Trap EXIT first 18*a27ac539SJ.J. Martzkitrap_exit 19*a27ac539SJ.J. Martzki 2069137ea6STariq Toukan[ -z "$COUNT" ] && COUNT="100000" # Zero means indefinitely 2169137ea6STariq Toukan 22282fb589SJesper Dangaard Brouer# Base Config 23282fb589SJesper Dangaard Brouer[ -z "$CLONE_SKB" ] && CLONE_SKB="0" 24282fb589SJesper Dangaard Brouer 25282fb589SJesper Dangaard Brouer# Flow variation random source port between min and max 26723d2904SDaniel T. LeeUDP_SRC_MIN=9 27723d2904SDaniel T. LeeUDP_SRC_MAX=109 28282fb589SJesper Dangaard Brouer 29282fb589SJesper Dangaard Brouer# (example of setting default params in your script) 300f06a678SMartin KaFai Lauif [ -z "$DEST_IP" ]; then 310f06a678SMartin KaFai Lau [ -z "$IP6" ] && DEST_IP="198.18.0.42" || DEST_IP="FD00::1" 320f06a678SMartin KaFai Laufi 33282fb589SJesper Dangaard Brouer[ -z "$DST_MAC" ] && DST_MAC="90:e2:ba:ff:ff:ff" 3440f843eeSDaniel T. Leeif [ -n "$DEST_IP" ]; then 3540f843eeSDaniel T. Lee validate_addr${IP6} $DEST_IP 3640f843eeSDaniel T. Lee read -r DST_MIN DST_MAX <<< $(parse_addr${IP6} $DEST_IP) 3740f843eeSDaniel T. Leefi 386e32a74aSDaniel T. Leeif [ -n "$DST_PORT" ]; then 39723d2904SDaniel T. Lee read -r UDP_DST_MIN UDP_DST_MAX <<< $(parse_ports $DST_PORT) 40723d2904SDaniel T. Lee validate_ports $UDP_DST_MIN $UDP_DST_MAX 416e32a74aSDaniel T. Leefi 42282fb589SJesper Dangaard Brouer 43282fb589SJesper Dangaard Brouer# General cleanup everything since last run 44c8fd4852SIgor Russkikh[ -z "$APPEND" ] && pg_ctrl "reset" 45282fb589SJesper Dangaard Brouer 46282fb589SJesper Dangaard Brouer# Threads are specified with parameter -t value in $THREADS 47e0e16672STariq Toukanfor ((thread = $F_THREAD; thread <= $L_THREAD; thread++)); do 48282fb589SJesper Dangaard Brouer # The device name is extended with @name, using thread number to 49282fb589SJesper Dangaard Brouer # make then unique, but any name will do. 50282fb589SJesper Dangaard Brouer dev=${DEV}@${thread} 51282fb589SJesper Dangaard Brouer 52282fb589SJesper Dangaard Brouer # Add remove all other devices and add_device $dev to thread 53c8fd4852SIgor Russkikh [ -z "$APPEND" ] && pg_thread $thread "rem_device_all" 54282fb589SJesper Dangaard Brouer pg_thread $thread "add_device" $dev 55282fb589SJesper Dangaard Brouer 56282fb589SJesper Dangaard Brouer # Notice config queue to map to cpu (mirrors smp_processor_id()) 57282fb589SJesper Dangaard Brouer # It is beneficial to map IRQ /proc/irq/*/smp_affinity 1:1 to CPU number 58282fb589SJesper Dangaard Brouer pg_set $dev "flag QUEUE_MAP_CPU" 59282fb589SJesper Dangaard Brouer 60282fb589SJesper Dangaard Brouer # Base config of dev 61282fb589SJesper Dangaard Brouer pg_set $dev "count $COUNT" 62282fb589SJesper Dangaard Brouer pg_set $dev "clone_skb $CLONE_SKB" 63282fb589SJesper Dangaard Brouer pg_set $dev "pkt_size $PKT_SIZE" 64282fb589SJesper Dangaard Brouer pg_set $dev "delay $DELAY" 65282fb589SJesper Dangaard Brouer 66282fb589SJesper Dangaard Brouer # Flag example disabling timestamping 67282fb589SJesper Dangaard Brouer pg_set $dev "flag NO_TIMESTAMP" 68282fb589SJesper Dangaard Brouer 69282fb589SJesper Dangaard Brouer # Destination 70282fb589SJesper Dangaard Brouer pg_set $dev "dst_mac $DST_MAC" 7140f843eeSDaniel T. Lee pg_set $dev "dst${IP6}_min $DST_MIN" 7240f843eeSDaniel T. Lee pg_set $dev "dst${IP6}_max $DST_MAX" 73282fb589SJesper Dangaard Brouer 746e32a74aSDaniel T. Lee if [ -n "$DST_PORT" ]; then 756e32a74aSDaniel T. Lee # Single destination port or random port range 766e32a74aSDaniel T. Lee pg_set $dev "flag UDPDST_RND" 77723d2904SDaniel T. Lee pg_set $dev "udp_dst_min $UDP_DST_MIN" 78723d2904SDaniel T. Lee pg_set $dev "udp_dst_max $UDP_DST_MAX" 796e32a74aSDaniel T. Lee fi 806e32a74aSDaniel T. Lee 81460a9aa2SLorenzo Bianconi [ ! -z "$UDP_CSUM" ] && pg_set $dev "flag UDPCSUM" 82460a9aa2SLorenzo Bianconi 83282fb589SJesper Dangaard Brouer # Setup random UDP port src range 84282fb589SJesper Dangaard Brouer pg_set $dev "flag UDPSRC_RND" 85723d2904SDaniel T. Lee pg_set $dev "udp_src_min $UDP_SRC_MIN" 86723d2904SDaniel T. Lee pg_set $dev "udp_src_max $UDP_SRC_MAX" 87282fb589SJesper Dangaard Brouerdone 88282fb589SJesper Dangaard Brouer 896c882bdcSJuhee Kang# Run if user hits control-c 906c882bdcSJuhee Kangfunction print_result() { 91282fb589SJesper Dangaard Brouer # Print results 92e0e16672STariq Toukan for ((thread = $F_THREAD; thread <= $L_THREAD; thread++)); do 93282fb589SJesper Dangaard Brouer dev=${DEV}@${thread} 94282fb589SJesper Dangaard Brouer echo "Device: $dev" 95282fb589SJesper Dangaard Brouer cat /proc/net/pktgen/$dev | grep -A2 "Result:" 96282fb589SJesper Dangaard Brouer done 976c882bdcSJuhee Kang} 986c882bdcSJuhee Kang# trap keyboard interrupt (Ctrl-C) 996c882bdcSJuhee Kangtrap true SIGINT 1006c882bdcSJuhee Kang 1016c882bdcSJuhee Kangif [ -z "$APPEND" ]; then 1026c882bdcSJuhee Kang # start_run 1036c882bdcSJuhee Kang echo "Running... ctrl^C to stop" >&2 1046c882bdcSJuhee Kang pg_ctrl "start" 1056c882bdcSJuhee Kang echo "Done" >&2 1066c882bdcSJuhee Kang 1076c882bdcSJuhee Kang print_result 108c8fd4852SIgor Russkikhelse 109c8fd4852SIgor Russkikh echo "Append mode: config done. Do more or use 'pg_ctrl start' to run" 110c8fd4852SIgor Russkikhfi 111