1*b64b0d1eSJesper Dangaard Brouer# 2*b64b0d1eSJesper Dangaard Brouer# Common functions used by pktgen scripts 3*b64b0d1eSJesper Dangaard Brouer# - Depending on bash 3 (or higher) syntax 4*b64b0d1eSJesper Dangaard Brouer# 5*b64b0d1eSJesper Dangaard Brouer# Author: Jesper Dangaaard Brouer 6*b64b0d1eSJesper Dangaard Brouer# License: GPL 7*b64b0d1eSJesper Dangaard Brouer 8*b64b0d1eSJesper Dangaard Brouer## -- General shell logging cmds -- 9*b64b0d1eSJesper Dangaard Brouerfunction err() { 10*b64b0d1eSJesper Dangaard Brouer local exitcode=$1 11*b64b0d1eSJesper Dangaard Brouer shift 12*b64b0d1eSJesper Dangaard Brouer echo "ERROR: $@" >&2 13*b64b0d1eSJesper Dangaard Brouer exit $exitcode 14*b64b0d1eSJesper Dangaard Brouer} 15*b64b0d1eSJesper Dangaard Brouer 16*b64b0d1eSJesper Dangaard Brouerfunction warn() { 17*b64b0d1eSJesper Dangaard Brouer echo "WARN : $@" >&2 18*b64b0d1eSJesper Dangaard Brouer} 19*b64b0d1eSJesper Dangaard Brouer 20*b64b0d1eSJesper Dangaard Brouerfunction info() { 21*b64b0d1eSJesper Dangaard Brouer if [[ -n "$VERBOSE" ]]; then 22*b64b0d1eSJesper Dangaard Brouer echo "INFO : $@" >&2 23*b64b0d1eSJesper Dangaard Brouer fi 24*b64b0d1eSJesper Dangaard Brouer} 25*b64b0d1eSJesper Dangaard Brouer 26*b64b0d1eSJesper Dangaard Brouer## -- Pktgen proc config commands -- ## 27*b64b0d1eSJesper Dangaard Brouerexport PROC_DIR=/proc/net/pktgen 28*b64b0d1eSJesper Dangaard Brouer# 29*b64b0d1eSJesper Dangaard Brouer# Three different shell functions for configuring the different 30*b64b0d1eSJesper Dangaard Brouer# components of pktgen: 31*b64b0d1eSJesper Dangaard Brouer# pg_ctrl(), pg_thread() and pg_set(). 32*b64b0d1eSJesper Dangaard Brouer# 33*b64b0d1eSJesper Dangaard Brouer# These functions correspond to pktgens different components. 34*b64b0d1eSJesper Dangaard Brouer# * pg_ctrl() control "pgctrl" (/proc/net/pktgen/pgctrl) 35*b64b0d1eSJesper Dangaard Brouer# * pg_thread() control the kernel threads and binding to devices 36*b64b0d1eSJesper Dangaard Brouer# * pg_set() control setup of individual devices 37*b64b0d1eSJesper Dangaard Brouerfunction pg_ctrl() { 38*b64b0d1eSJesper Dangaard Brouer local proc_file="pgctrl" 39*b64b0d1eSJesper Dangaard Brouer proc_cmd ${proc_file} "$@" 40*b64b0d1eSJesper Dangaard Brouer} 41*b64b0d1eSJesper Dangaard Brouer 42*b64b0d1eSJesper Dangaard Brouerfunction pg_thread() { 43*b64b0d1eSJesper Dangaard Brouer local thread=$1 44*b64b0d1eSJesper Dangaard Brouer local proc_file="kpktgend_${thread}" 45*b64b0d1eSJesper Dangaard Brouer shift 46*b64b0d1eSJesper Dangaard Brouer proc_cmd ${proc_file} "$@" 47*b64b0d1eSJesper Dangaard Brouer} 48*b64b0d1eSJesper Dangaard Brouer 49*b64b0d1eSJesper Dangaard Brouerfunction pg_set() { 50*b64b0d1eSJesper Dangaard Brouer local dev=$1 51*b64b0d1eSJesper Dangaard Brouer local proc_file="$dev" 52*b64b0d1eSJesper Dangaard Brouer shift 53*b64b0d1eSJesper Dangaard Brouer proc_cmd ${proc_file} "$@" 54*b64b0d1eSJesper Dangaard Brouer} 55*b64b0d1eSJesper Dangaard Brouer 56*b64b0d1eSJesper Dangaard Brouer# More generic replacement for pgset(), that does not depend on global 57*b64b0d1eSJesper Dangaard Brouer# variable for proc file. 58*b64b0d1eSJesper Dangaard Brouerfunction proc_cmd() { 59*b64b0d1eSJesper Dangaard Brouer local result 60*b64b0d1eSJesper Dangaard Brouer local proc_file=$1 61*b64b0d1eSJesper Dangaard Brouer # after shift, the remaining args are contained in $@ 62*b64b0d1eSJesper Dangaard Brouer shift 63*b64b0d1eSJesper Dangaard Brouer local proc_ctrl=${PROC_DIR}/$proc_file 64*b64b0d1eSJesper Dangaard Brouer if [[ ! -e "$proc_ctrl" ]]; then 65*b64b0d1eSJesper Dangaard Brouer err 3 "proc file:$proc_ctrl does not exists (dev added to thread?)" 66*b64b0d1eSJesper Dangaard Brouer else 67*b64b0d1eSJesper Dangaard Brouer if [[ ! -w "$proc_ctrl" ]]; then 68*b64b0d1eSJesper Dangaard Brouer err 4 "proc file:$proc_ctrl not writable, not root?!" 69*b64b0d1eSJesper Dangaard Brouer fi 70*b64b0d1eSJesper Dangaard Brouer fi 71*b64b0d1eSJesper Dangaard Brouer 72*b64b0d1eSJesper Dangaard Brouer if [[ "$DEBUG" == "yes" ]]; then 73*b64b0d1eSJesper Dangaard Brouer echo "cmd: $@ > $proc_ctrl" 74*b64b0d1eSJesper Dangaard Brouer fi 75*b64b0d1eSJesper Dangaard Brouer # Quoting of "$@" is important for space expansion 76*b64b0d1eSJesper Dangaard Brouer echo "$@" > "$proc_ctrl" 77*b64b0d1eSJesper Dangaard Brouer local status=$? 78*b64b0d1eSJesper Dangaard Brouer 79*b64b0d1eSJesper Dangaard Brouer result=$(grep "Result: OK:" $proc_ctrl) 80*b64b0d1eSJesper Dangaard Brouer # Due to pgctrl, cannot use exit code $? from grep 81*b64b0d1eSJesper Dangaard Brouer if [[ "$result" == "" ]]; then 82*b64b0d1eSJesper Dangaard Brouer grep "Result:" $proc_ctrl >&2 83*b64b0d1eSJesper Dangaard Brouer fi 84*b64b0d1eSJesper Dangaard Brouer if (( $status != 0 )); then 85*b64b0d1eSJesper Dangaard Brouer err 5 "Write error($status) occurred cmd: \"$@ > $proc_ctrl\"" 86*b64b0d1eSJesper Dangaard Brouer fi 87*b64b0d1eSJesper Dangaard Brouer} 88*b64b0d1eSJesper Dangaard Brouer 89*b64b0d1eSJesper Dangaard Brouer# Old obsolete "pgset" function, with slightly improved err handling 90*b64b0d1eSJesper Dangaard Brouerfunction pgset() { 91*b64b0d1eSJesper Dangaard Brouer local result 92*b64b0d1eSJesper Dangaard Brouer 93*b64b0d1eSJesper Dangaard Brouer if [[ "$DEBUG" == "yes" ]]; then 94*b64b0d1eSJesper Dangaard Brouer echo "cmd: $1 > $PGDEV" 95*b64b0d1eSJesper Dangaard Brouer fi 96*b64b0d1eSJesper Dangaard Brouer echo $1 > $PGDEV 97*b64b0d1eSJesper Dangaard Brouer local status=$? 98*b64b0d1eSJesper Dangaard Brouer 99*b64b0d1eSJesper Dangaard Brouer result=`cat $PGDEV | fgrep "Result: OK:"` 100*b64b0d1eSJesper Dangaard Brouer if [[ "$result" == "" ]]; then 101*b64b0d1eSJesper Dangaard Brouer cat $PGDEV | fgrep Result: 102*b64b0d1eSJesper Dangaard Brouer fi 103*b64b0d1eSJesper Dangaard Brouer if (( $status != 0 )); then 104*b64b0d1eSJesper Dangaard Brouer err 5 "Write error($status) occurred cmd: \"$1 > $PGDEV\"" 105*b64b0d1eSJesper Dangaard Brouer fi 106*b64b0d1eSJesper Dangaard Brouer} 107*b64b0d1eSJesper Dangaard Brouer 108*b64b0d1eSJesper Dangaard Brouer## -- General shell tricks -- 109*b64b0d1eSJesper Dangaard Brouer 110*b64b0d1eSJesper Dangaard Brouerfunction root_check_run_with_sudo() { 111*b64b0d1eSJesper Dangaard Brouer # Trick so, program can be run as normal user, will just use "sudo" 112*b64b0d1eSJesper Dangaard Brouer # call as root_check_run_as_sudo "$@" 113*b64b0d1eSJesper Dangaard Brouer if [ "$EUID" -ne 0 ]; then 114*b64b0d1eSJesper Dangaard Brouer if [ -x $0 ]; then # Directly executable use sudo 115*b64b0d1eSJesper Dangaard Brouer info "Not root, running with sudo" 116*b64b0d1eSJesper Dangaard Brouer sudo "$0" "$@" 117*b64b0d1eSJesper Dangaard Brouer exit $? 118*b64b0d1eSJesper Dangaard Brouer fi 119*b64b0d1eSJesper Dangaard Brouer err 4 "cannot perform sudo run of $0" 120*b64b0d1eSJesper Dangaard Brouer fi 121*b64b0d1eSJesper Dangaard Brouer} 122