115f2cbbdSJesper Dangaard Brouer#!/bin/bash 2b2441318SGreg Kroah-Hartman# SPDX-License-Identifier: GPL-2.0 315f2cbbdSJesper Dangaard Brouer# 415f2cbbdSJesper Dangaard Brouer# Script example for many flows testing 515f2cbbdSJesper Dangaard Brouer# 615f2cbbdSJesper Dangaard Brouer# Number of simultaneous flows limited by variable $FLOWS 715f2cbbdSJesper Dangaard Brouer# and number of packets per flow controlled by variable $FLOWLEN 815f2cbbdSJesper Dangaard Brouer# 915f2cbbdSJesper Dangaard Brouerbasedir=`dirname $0` 1015f2cbbdSJesper Dangaard Brouersource ${basedir}/functions.sh 1115f2cbbdSJesper Dangaard Brouerroot_check_run_with_sudo "$@" 1215f2cbbdSJesper Dangaard Brouer 1315f2cbbdSJesper Dangaard Brouer# Parameter parsing via include 1415f2cbbdSJesper Dangaard Brouersource ${basedir}/parameters.sh 15*a27ac539SJ.J. Martzki 16*a27ac539SJ.J. Martzki# Trap EXIT first 17*a27ac539SJ.J. Martzkitrap_exit 18*a27ac539SJ.J. Martzki 1915f2cbbdSJesper Dangaard Brouer# Set some default params, if they didn't get set 200f0c4f1bSJuhee Kangif [ -z "$DEST_IP" ]; then 210f0c4f1bSJuhee Kang [ -z "$IP6" ] && DEST_IP="198.18.0.42" || DEST_IP="FD00::1" 220f0c4f1bSJuhee Kangfi 2315f2cbbdSJesper Dangaard Brouer[ -z "$DST_MAC" ] && DST_MAC="90:e2:ba:ff:ff:ff" 2415f2cbbdSJesper Dangaard Brouer[ -z "$CLONE_SKB" ] && CLONE_SKB="0" 2569137ea6STariq Toukan[ -z "$COUNT" ] && COUNT="0" # Zero means indefinitely 2640f843eeSDaniel T. Leeif [ -n "$DEST_IP" ]; then 270f0c4f1bSJuhee Kang validate_addr${IP6} $DEST_IP 280f0c4f1bSJuhee Kang read -r DST_MIN DST_MAX <<< $(parse_addr${IP6} $DEST_IP) 2940f843eeSDaniel T. Leefi 306e32a74aSDaniel T. Leeif [ -n "$DST_PORT" ]; then 31723d2904SDaniel T. Lee read -r UDP_DST_MIN UDP_DST_MAX <<< $(parse_ports $DST_PORT) 32723d2904SDaniel T. Lee validate_ports $UDP_DST_MIN $UDP_DST_MAX 336e32a74aSDaniel T. Leefi 3415f2cbbdSJesper Dangaard Brouer 3515f2cbbdSJesper Dangaard Brouer# NOTICE: Script specific settings 3615f2cbbdSJesper Dangaard Brouer# ======= 3715f2cbbdSJesper Dangaard Brouer# Limiting the number of concurrent flows ($FLOWS) 3815f2cbbdSJesper Dangaard Brouer# and also set how many packets each flow contains ($FLOWLEN) 3915f2cbbdSJesper Dangaard Brouer# 4015f2cbbdSJesper Dangaard Brouer[ -z "$FLOWS" ] && FLOWS="8000" 4115f2cbbdSJesper Dangaard Brouer[ -z "$FLOWLEN" ] && FLOWLEN="10" 4215f2cbbdSJesper Dangaard Brouer 4315f2cbbdSJesper Dangaard Brouerif [[ -n "$BURST" ]]; then 4415f2cbbdSJesper Dangaard Brouer err 1 "Bursting not supported for this mode" 4515f2cbbdSJesper Dangaard Brouerfi 4615f2cbbdSJesper Dangaard Brouer 4740f843eeSDaniel T. Lee# 198.18.0.0 / 198.19.255.255 4840f843eeSDaniel T. Leeread -r SRC_MIN SRC_MAX <<< $(parse_addr 198.18.0.0/15) 4940f843eeSDaniel T. Lee 5015f2cbbdSJesper Dangaard Brouer# General cleanup everything since last run 51c8fd4852SIgor Russkikh[ -z "$APPEND" ] && pg_ctrl "reset" 5215f2cbbdSJesper Dangaard Brouer 5315f2cbbdSJesper Dangaard Brouer# Threads are specified with parameter -t value in $THREADS 54e0e16672STariq Toukanfor ((thread = $F_THREAD; thread <= $L_THREAD; thread++)); do 5515f2cbbdSJesper Dangaard Brouer dev=${DEV}@${thread} 5615f2cbbdSJesper Dangaard Brouer 5715f2cbbdSJesper Dangaard Brouer # Add remove all other devices and add_device $dev to thread 58c8fd4852SIgor Russkikh [ -z "$APPEND" ] && pg_thread $thread "rem_device_all" 5915f2cbbdSJesper Dangaard Brouer pg_thread $thread "add_device" $dev 6015f2cbbdSJesper Dangaard Brouer 6115f2cbbdSJesper Dangaard Brouer # Base config 6215f2cbbdSJesper Dangaard Brouer pg_set $dev "flag QUEUE_MAP_CPU" 6315f2cbbdSJesper Dangaard Brouer pg_set $dev "count $COUNT" 6415f2cbbdSJesper Dangaard Brouer pg_set $dev "clone_skb $CLONE_SKB" 6515f2cbbdSJesper Dangaard Brouer pg_set $dev "pkt_size $PKT_SIZE" 6615f2cbbdSJesper Dangaard Brouer pg_set $dev "delay $DELAY" 6715f2cbbdSJesper Dangaard Brouer pg_set $dev "flag NO_TIMESTAMP" 6815f2cbbdSJesper Dangaard Brouer 6915f2cbbdSJesper Dangaard Brouer # Single destination 7015f2cbbdSJesper Dangaard Brouer pg_set $dev "dst_mac $DST_MAC" 710f0c4f1bSJuhee Kang pg_set $dev "dst${IP6}_min $DST_MIN" 720f0c4f1bSJuhee Kang pg_set $dev "dst${IP6}_max $DST_MAX" 7315f2cbbdSJesper 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 8315f2cbbdSJesper Dangaard Brouer # Randomize source IP-addresses 8415f2cbbdSJesper Dangaard Brouer pg_set $dev "flag IPSRC_RND" 8540f843eeSDaniel T. Lee pg_set $dev "src_min $SRC_MIN" 8640f843eeSDaniel T. Lee pg_set $dev "src_max $SRC_MAX" 8715f2cbbdSJesper Dangaard Brouer 8815f2cbbdSJesper Dangaard Brouer # Limit number of flows (max 65535) 8915f2cbbdSJesper Dangaard Brouer pg_set $dev "flows $FLOWS" 9015f2cbbdSJesper Dangaard Brouer # 9115f2cbbdSJesper Dangaard Brouer # How many packets a flow will send, before flow "entry" is 9215f2cbbdSJesper Dangaard Brouer # re-generated/setup. 9315f2cbbdSJesper Dangaard Brouer pg_set $dev "flowlen $FLOWLEN" 9415f2cbbdSJesper Dangaard Brouer # 9515f2cbbdSJesper Dangaard Brouer # Flag FLOW_SEQ will cause $FLOWLEN packets from the same flow 9615f2cbbdSJesper Dangaard Brouer # being send back-to-back, before next flow is selected 9715f2cbbdSJesper Dangaard Brouer # incrementally. This helps lookup caches, and is more realistic. 9815f2cbbdSJesper Dangaard Brouer # 9915f2cbbdSJesper Dangaard Brouer pg_set $dev "flag FLOW_SEQ" 10015f2cbbdSJesper Dangaard Brouer 10115f2cbbdSJesper Dangaard Brouerdone 10215f2cbbdSJesper Dangaard Brouer 10315f2cbbdSJesper Dangaard Brouer# Run if user hits control-c 10415f2cbbdSJesper Dangaard Brouerfunction print_result() { 10515f2cbbdSJesper Dangaard Brouer # Print results 106e0e16672STariq Toukan for ((thread = $F_THREAD; thread <= $L_THREAD; thread++)); do 10715f2cbbdSJesper Dangaard Brouer dev=${DEV}@${thread} 10815f2cbbdSJesper Dangaard Brouer echo "Device: $dev" 10915f2cbbdSJesper Dangaard Brouer cat /proc/net/pktgen/$dev | grep -A2 "Result:" 11015f2cbbdSJesper Dangaard Brouer done 11115f2cbbdSJesper Dangaard Brouer} 11215f2cbbdSJesper Dangaard Brouer# trap keyboard interrupt (Ctrl-C) 11315f2cbbdSJesper Dangaard Brouertrap true SIGINT 11415f2cbbdSJesper Dangaard Brouer 115c8fd4852SIgor Russkikhif [ -z "$APPEND" ]; then 11615f2cbbdSJesper Dangaard Brouer echo "Running... ctrl^C to stop" >&2 11715f2cbbdSJesper Dangaard Brouer pg_ctrl "start" 11815f2cbbdSJesper Dangaard Brouer 11915f2cbbdSJesper Dangaard Brouer print_result 120c8fd4852SIgor Russkikhelse 121c8fd4852SIgor Russkikh echo "Append mode: config done. Do more or use 'pg_ctrl start' to run" 122c8fd4852SIgor Russkikhfi 123