xref: /openbmc/linux/samples/pktgen/functions.sh (revision b64b0d1e64959691c1f4067a05fdb541d453ed6a)
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