# this is retained mostly for historical purposes and may not be
# up to date for contemporary netperf versions
#
# a script that can be used to measure aggregate netperf performance,
# original author is Mike Traynor. Modifications to create the
# "netperf TCP_ARR test" by rick jones
#

init_parms() {
  TEST_TIME=60
  NTEST=3
  TOLERANCE=15
  MAX_RETRIES=3

  NETPERF="/usr/local/netperf/netperf"
  NETPERF="./netperf"

  NPROC_LIST=""
  RR_SIZES=""
  REM_HOST_LIST=""
  DEVFILELIST=""
  LLA=0
  TCP=1
  UDP=0
  GPROF=0
}

set_default_parms() {
  if [ "X$NPROC_LIST" = "X" ]
  then
    NPROC_LIST="1"
  fi
  
  if [ "X$REM_HOST_LIST" = "X" ]
  then
    REM_HOST_LIST="127.0.0.1"
  fi

  if [ "X$RR_SIZES" = "X" ]
  then
    RR_SIZES="1,1"
  fi

  NHOSTS=`echo $REM_HOST_LIST | awk '{printf "%d",NF}'`
  GPROF_RUN_TIME=`expr $TEST_TIME - 20`
}

usage() {
more << @EOF

$*

    USAGE: scale_script {test_options} {hostlist}

    Measure maximum system network throughput.

    The following are optional parameters:

        -t nsec		: Causes each test to be run for nsec seconds.
        -gprof system	: Take a gprof sample during the test.  system
                  	  is the name of the kernel the system was booted
                  	  with.
        -n "nproclist"	: One series of tests is run for each space-separated
                  	  value in nproclist.
        -r "sizelist"	: One series of tests is run for each space-separated
                	  request,reply pair in sizelist.
	hostlist	: A space separated list of hosts to test against.

        +|-tcp		: Run/Don't run TCP tests.
        +|-udp		: Run/Don't run UDP tests.
        +|-lla 		: Run/Don't run LLA tests; this option also requires 
			  the user to specify a list of network device files
        	    	  using the -d option described below.

    The following option must be provided when using the -lla option
    described above:

        -d "devfilelst" : Where devfilelst is a space-separated list
                     	  of network device file pairs.  Each pair in
                  	  the list contains two device file names,
              	  	  separated by a comma (eg. /dev/lan0,/dev/lan1),
                 	  where the device file on the left side of the
                	  comma is for the local system and the device
                	  file on the right side is for the remote system.
                 	  A device file pair must be specified for each
                   	  remote host which is specified.

    Examples:

        scale_script -n "8 16" -udp LGs37U1 LGs37U2 -r "1,1 100,100"

        scale_script -t 1000 -n "16" -tcp -gprof /stand/vmunix LGs37U1 LGs37U2

        scale_script -n 4 -lla -d /dev/lan0,/dev/lan0 /dev/lan1,/dev/lan0 \\
          LGs37U1 LGs37U2
        
@EOF
}

check_usage() {
  if [ `expr $TCP + $UDP + $LLA` -eq 0 ]
  then
    usage $0: ERROR: Must specify a test
    exit
  fi

  if [ $LLA -eq 1 ]
  then  
    NDEV=`echo $DEVFILELIST | awk '{printf "%d",NF}'`
    if [ $NDEV -ne $NHOSTS ]
    then
      usage $0: ERROR: Number of device files does not match number of hosts
      exit
    fi
  fi

  for HOST in $REM_HOST_LIST
  do
    if [ `/etc/ping $HOST 100 1 | awk '/transmitted/{print $4}'`0 -ne 10 ] 
    then
      usage $0: ERROR: Cannot ping host: $HOST
      exit
    fi
  done

  if [ $GPROF -eq 1 ]
  then
    if [ ! -r $GPROF_KERNEL ]
    then
      usage $0: ERROR: Cannot find system file: $GPROF_KERNEL
      exit
    fi
    if [ $GPROF_RUN_TIME -le 800 ]
    then
      echo "\nWARNING: GPROF RUN TIME LESS THAN 800 SECONDS\n"
    fi
  fi
}

display_headstone() {
cat << @EOF

$TESTNAME Aggregate REQUEST/RESPONSE TEST to $REM_HOST_LIST
Local /Remote
Socket Size   Request  Resp.   Elapsed  Trans.     Num.
Send   Recv   Size     Size    Time     Rate       Concurrent
bytes  Bytes  bytes    bytes   secs.    per sec    Netperfs

@EOF
}

display_test_banner() {
cat << @EOF
@EOF
}

build_sap_list() {
      LSAP=4
      SAPLIST=""
      PROC=0
      while [ $PROC -lt $NPROCS ]
      do
        PROC=`expr $PROC + 1`
        LSAP=`expr $LSAP + 4`
        RSAP=`expr $LSAP + 2`
        SAPLIST="$SAPLIST $LSAP,$RSAP"
      done
}

start_gprof() {
  if [ $GPROF -eq 1 ]
  then
    ( kgmon -h; kgmon -r; sleep 10; kgmon -b; sleep $GPROF_RUN_TIME; kgmon -h; kgmon -p $GPROF_KERNEL; mv gmon.out gmon.out.$TEST.$NPROCS )&
  fi
}

start_1_proc_per_host() {
  HOSTNUM=0
  for HOST in $REM_HOST_LIST
  do
    if [ "$TEST" = "HIPPI_RR" ]
    then
      PROCNUM=`expr $PROCNUM + 1`
      SAP=`echo $SAPLIST | awk "{print \\$$PROCNUM}"`
      SAP="-s $SAP"
      HOSTNUM=`expr $HOSTNUM + 1`
      DEVFILE=`echo $DEVFILELIST | awk "{print \\$$HOSTNUM}"`
      DEVFILE="-D $DEVFILE"
    fi
    $NETPERF -t $TEST -l $TEST_TIME -H $HOST -P0 -v0 -- \
      $COW $DEVFILE $SAP $RR_SIZE $SEND_SIZE $SOCKET_SIZE &
  done
}

start_n_procs_per_host() {
  PROC=0
  while [ $PROC -lt $1 ]
  do
    PROCNUM=`expr $PROC \* ${NHOSTS}`
    start_1_proc_per_host &
    PROC=`expr $PROC + 1`
  done
  wait
}

run_1_test() {
	start_n_procs_per_host $PROCS_PER_HOST |\
          awk 'BEGIN {max=0;min=99999;sum=0;n=0}				\
             {sum += $1;n++;ave=sum/n} 					\
             $1<min {min=$1} 						\
             $1>max {max=$1} 						\
             {errl=(ave-min)/ave;errm=(max-ave)/ave;err=errl}		\
             errm>errl {err=errm}					\
             END {printf "Aggregate throughput: %2.2f TPS  +/- %2.2f %%\n",sum,err*100}'
}

run_test_n_times() {
  RETRY=0
  TEST_COUNT=0
  while [ $TEST_COUNT -lt $1 ]
  do
    TEST_COUNT=`expr $TEST_COUNT + 1`
    start_gprof
    run_1_test > .run_test_n_file
    cat .run_test_n_file
    ERROR_LVL=`awk '{print int($6+0.99)}' .run_test_n_file`
    if [ $ERROR_LVL -gt $TOLERANCE ]
    then
      RETRY=`expr $RETRY + 1`
      if [ $RETRY -le $MAX_RETRIES ]
      then
        TEST_COUNT=`expr $TEST_COUNT - 1`
        TEST_TIME=`expr $TEST_TIME \* 2`
      else
	echo "!!!This is an INVALID RUN of the arr_script!!!" >&2
	echo "!!!UNABLE to hit TOLERANCE of " $TOLERANCE "!!!" >&2
	echo "Please select a longer initial time and try again." >&2
       exit
      fi
    fi
  done
}

do_req_rr_sizes() {
  for S2 in $RR_SIZES
    do
      RR_SIZE="-r $S2"
      display_test_banner $NPROCS $TEST $S2
      run_test_n_times $NTEST > .do_series_file
      TPS=`awk "int(\$6+0.99)<=$TOLERANCE {print}" .do_series_file |\
        awk 'BEGIN {sum=0;n=1}	\
             sum>0 {n++}	\
             {sum+=$3}		\
             END {printf "%2.2f\n",(sum)/(n)}'`
    SOCK_SEND=`echo $SOCKET_SIZE | awk '{print $2}'`
    SOCK_RECV=`echo $SOCKET_SIZE | awk '{print $4}'`
    REQ_SIZE=`echo $S2 | awk -F"," '{print $1}'`
    RSP_SIZE=`echo $S2 | awk -F"," '{print $2}'`
    echo  $SOCK_SEND $SOCK_RECV $REQ_SIZE $RSP_SIZE $TEST_TIME $TPS $PROCS |\
    awk '{printf "%5d  %5d  %5d    %5d   %5d    %8.2f   %5d",$1,$2,$3,$4,$5,$6,$7}'
    done
}

tcp_test() {
    #Run the TCP RR tests
    TEST="TCP_RR"
    SEND_SIZE=""
    SOCKET_SIZE="-s 8192 -S 8192"
    COW="-V"
    do_req_rr_sizes
    echo
}

udp_test() {  
    #Run the UDP RR tests
    TEST="UDP_RR"
    SEND_SIZE=""
    SOCKET_SIZE="-s 9216 -S 9216"
    COW="-V"
    do_req_rr_sizes
    echo
}

lla_test() {  
    #Run the UDP RR tests
    TEST="HIPPI_RR"
    SEND_SIZE=""
    SOCKET_SIZE=""
    COW=""
    build_sap_list
    do_req_rr_sizes
    echo
}

do_req_procs() {
  if [ $TCP -eq 1 ]
  then
    TESTNAME="TCP"
    display_headstone
    for PROCS in $NPROC_LIST  
      do
        #Determine number of procs per host
        PROCS_PER_HOST=`echo $PROCS $REM_HOST_LIST | awk '{printf "%d",($1+NF-2)/(NF-1)}'`
        NPROCS=`expr $PROCS_PER_HOST \* $NHOSTS`
        tcp_test
      done
  fi

  if [ $UDP -eq 1 ]
  then
    TESTNAME="UDP"
    display_headstone
    for PROCS in $NPROC_LIST  
      do
        #Determine number of procs per host
        PROCS_PER_HOST=`echo $PROCS $REM_HOST_LIST | awk '{printf "%d",($1+NF-2)/(NF-1)}'`
        NPROCS=`expr $PROCS_PER_HOST \* $NHOSTS`
        udp_test
      done
  fi

  if [ $LLA -eq 1 ]
  then
    TESTNAME="LLA"
    display_headstone
    for PROCS in $NPROC_LIST  
      do
        #Determine number of procs per host
        PROCS_PER_HOST=`echo $PROCS $REM_HOST_LIST | awk '{printf "%d",($1+NF-2)/(NF-1)}'`
        NPROCS=`expr $PROCS_PER_HOST \* $NHOSTS`
        lla_test
      done
  fi
}

######################################################################

init_parms

PARMS="${0##*/} ${@}"

# Parse the command line
while [ $# != 0 ]
do
  case $1 in
    \-gprof) GPROF=1
             GPROF_KERNEL=$2
             shift
             ;;
    \-t)     TEST_TIME=$2
             shift
           ;;
    \-n)     NPROC_LIST="$NPROC_LIST $2"
             shift
             ;;
    \+lla)   LLA=1
             ;;
    \+tcp)   TCP=1
             ;;
    \+udp)   UDP=1
             ;;
    \-lla)   LLA=0
             ;;
    \-tcp)   TCP=0
             ;;
    \-udp)   UDP=0
             ;;
    \-d)     DEVFILELIST="$DEVFILELIST $2"
             shift
             ;;
    \-r)     RR_SIZES="$RR_SIZES $2"
             shift
             ;;
    \-*)     usage $0: ERROR: Unexpected paramter: $1
             exit
             ;;
    *)       REM_HOST_LIST="$REM_HOST_LIST $1"
             ;;
  esac
  shift
done

set_default_parms
check_usage
do_req_procs

