1*4882a593Smuzhiyun# 2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 3*4882a593Smuzhiyun# Common parameter parsing for pktgen scripts 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun 6*4882a593Smuzhiyunfunction usage() { 7*4882a593Smuzhiyun echo "" 8*4882a593Smuzhiyun echo "Usage: $0 [-vx] -i ethX" 9*4882a593Smuzhiyun echo " -i : (\$DEV) output interface/device (required)" 10*4882a593Smuzhiyun echo " -s : (\$PKT_SIZE) packet size" 11*4882a593Smuzhiyun echo " -d : (\$DEST_IP) destination IP. CIDR (e.g. 198.18.0.0/15) is also allowed" 12*4882a593Smuzhiyun echo " -m : (\$DST_MAC) destination MAC-addr" 13*4882a593Smuzhiyun echo " -p : (\$DST_PORT) destination PORT range (e.g. 433-444) is also allowed" 14*4882a593Smuzhiyun echo " -t : (\$THREADS) threads to start" 15*4882a593Smuzhiyun echo " -f : (\$F_THREAD) index of first thread (zero indexed CPU number)" 16*4882a593Smuzhiyun echo " -c : (\$SKB_CLONE) SKB clones send before alloc new SKB" 17*4882a593Smuzhiyun echo " -n : (\$COUNT) num messages to send per thread, 0 means indefinitely" 18*4882a593Smuzhiyun echo " -b : (\$BURST) HW level bursting of SKBs" 19*4882a593Smuzhiyun echo " -v : (\$VERBOSE) verbose" 20*4882a593Smuzhiyun echo " -x : (\$DEBUG) debug" 21*4882a593Smuzhiyun echo " -6 : (\$IP6) IPv6" 22*4882a593Smuzhiyun echo "" 23*4882a593Smuzhiyun} 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun## --- Parse command line arguments / parameters --- 26*4882a593Smuzhiyun## echo "Commandline options:" 27*4882a593Smuzhiyunwhile getopts "s:i:d:m:p:f:t:c:n:b:vxh6" option; do 28*4882a593Smuzhiyun case $option in 29*4882a593Smuzhiyun i) # interface 30*4882a593Smuzhiyun export DEV=$OPTARG 31*4882a593Smuzhiyun info "Output device set to: DEV=$DEV" 32*4882a593Smuzhiyun ;; 33*4882a593Smuzhiyun s) 34*4882a593Smuzhiyun export PKT_SIZE=$OPTARG 35*4882a593Smuzhiyun info "Packet size set to: PKT_SIZE=$PKT_SIZE bytes" 36*4882a593Smuzhiyun ;; 37*4882a593Smuzhiyun d) # destination IP 38*4882a593Smuzhiyun export DEST_IP=$OPTARG 39*4882a593Smuzhiyun info "Destination IP set to: DEST_IP=$DEST_IP" 40*4882a593Smuzhiyun ;; 41*4882a593Smuzhiyun m) # MAC 42*4882a593Smuzhiyun export DST_MAC=$OPTARG 43*4882a593Smuzhiyun info "Destination MAC set to: DST_MAC=$DST_MAC" 44*4882a593Smuzhiyun ;; 45*4882a593Smuzhiyun p) # PORT 46*4882a593Smuzhiyun export DST_PORT=$OPTARG 47*4882a593Smuzhiyun info "Destination PORT set to: DST_PORT=$DST_PORT" 48*4882a593Smuzhiyun ;; 49*4882a593Smuzhiyun f) 50*4882a593Smuzhiyun export F_THREAD=$OPTARG 51*4882a593Smuzhiyun info "Index of first thread (zero indexed CPU number): $F_THREAD" 52*4882a593Smuzhiyun ;; 53*4882a593Smuzhiyun t) 54*4882a593Smuzhiyun export THREADS=$OPTARG 55*4882a593Smuzhiyun info "Number of threads to start: $THREADS" 56*4882a593Smuzhiyun ;; 57*4882a593Smuzhiyun c) 58*4882a593Smuzhiyun export CLONE_SKB=$OPTARG 59*4882a593Smuzhiyun info "CLONE_SKB=$CLONE_SKB" 60*4882a593Smuzhiyun ;; 61*4882a593Smuzhiyun n) 62*4882a593Smuzhiyun export COUNT=$OPTARG 63*4882a593Smuzhiyun info "COUNT=$COUNT" 64*4882a593Smuzhiyun ;; 65*4882a593Smuzhiyun b) 66*4882a593Smuzhiyun export BURST=$OPTARG 67*4882a593Smuzhiyun info "SKB bursting: BURST=$BURST" 68*4882a593Smuzhiyun ;; 69*4882a593Smuzhiyun v) 70*4882a593Smuzhiyun export VERBOSE=yes 71*4882a593Smuzhiyun info "Verbose mode: VERBOSE=$VERBOSE" 72*4882a593Smuzhiyun ;; 73*4882a593Smuzhiyun x) 74*4882a593Smuzhiyun export DEBUG=yes 75*4882a593Smuzhiyun info "Debug mode: DEBUG=$DEBUG" 76*4882a593Smuzhiyun ;; 77*4882a593Smuzhiyun 6) 78*4882a593Smuzhiyun export IP6=6 79*4882a593Smuzhiyun info "IP6: IP6=$IP6" 80*4882a593Smuzhiyun ;; 81*4882a593Smuzhiyun h|?|*) 82*4882a593Smuzhiyun usage; 83*4882a593Smuzhiyun err 2 "[ERROR] Unknown parameters!!!" 84*4882a593Smuzhiyun esac 85*4882a593Smuzhiyundone 86*4882a593Smuzhiyunshift $(( $OPTIND - 1 )) 87*4882a593Smuzhiyun 88*4882a593Smuzhiyunif [ -z "$PKT_SIZE" ]; then 89*4882a593Smuzhiyun # NIC adds 4 bytes CRC 90*4882a593Smuzhiyun export PKT_SIZE=60 91*4882a593Smuzhiyun info "Default packet size set to: set to: $PKT_SIZE bytes" 92*4882a593Smuzhiyunfi 93*4882a593Smuzhiyun 94*4882a593Smuzhiyunif [ -z "$F_THREAD" ]; then 95*4882a593Smuzhiyun # First thread (F_THREAD) reference the zero indexed CPU number 96*4882a593Smuzhiyun export F_THREAD=0 97*4882a593Smuzhiyunfi 98*4882a593Smuzhiyun 99*4882a593Smuzhiyunif [ -z "$THREADS" ]; then 100*4882a593Smuzhiyun export THREADS=1 101*4882a593Smuzhiyunfi 102*4882a593Smuzhiyun 103*4882a593Smuzhiyunexport L_THREAD=$(( THREADS + F_THREAD - 1 )) 104*4882a593Smuzhiyun 105*4882a593Smuzhiyunif [ -z "$DEV" ]; then 106*4882a593Smuzhiyun usage 107*4882a593Smuzhiyun err 2 "Please specify output device" 108*4882a593Smuzhiyunfi 109*4882a593Smuzhiyun 110*4882a593Smuzhiyunif [ -z "$DST_MAC" ]; then 111*4882a593Smuzhiyun warn "Missing destination MAC address" 112*4882a593Smuzhiyunfi 113*4882a593Smuzhiyun 114*4882a593Smuzhiyunif [ -z "$DEST_IP" ]; then 115*4882a593Smuzhiyun warn "Missing destination IP address" 116*4882a593Smuzhiyunfi 117*4882a593Smuzhiyun 118*4882a593Smuzhiyunif [ ! -d /proc/net/pktgen ]; then 119*4882a593Smuzhiyun info "Loading kernel module: pktgen" 120*4882a593Smuzhiyun modprobe pktgen 121*4882a593Smuzhiyunfi 122