#!/bin/sh
#
# This script runs a series of netperf tests intended to gather the 
# raw material necessary to arrive at estimates for the cost of
# sending and receiving a TCP segment, the cost of each additional byte
# and the cost of each incremental segment.
# 
# there are a number of data points gathered by this script - it might
# run for a considerable length of time.
#
# rick jones 4/99
#

if [ $# -gt 2 ]; then
  echo "try again, correctly -> packet_byte_script hostname [CPU]"
  exit 1
fi

if [ $# -eq 0 ]; then
  echo "try again, correctly -> packet_byte_script hostname [CPU]"
  exit 1
fi

# where is netperf
NETPERF_CMD=/usr/bin/netperf

# at what port will netserver be waiting? If you decide to run
# netserver at a differnet port than the default of 12865, then set
# the value of NETPERF_PORT apropriately
# NETPERF_PORT="-p some_other_portnum"
NETPERF_PORT=${NETPERF_PORT:=""}


# The test length in seconds
NETPERF_TIME=${NETPERF_TIME:=20}

# How accurate we want the estimate of performance: 
#      maximum and minimum test iterations (-i)
#      confidence level (99 or 95) and interval (percent)
NETPERF_STATS=${NETPERF_STATS:="-i 10,3 -I 99,5"}

# The socket sizes that we will be testing - using -1 will let it 
# be the system default.
NETPERF_SKTS=${NETPERF_SKTS:="-1"}

# The request,response sizes that we will be using. The netperf
# command parser will treat "1" the same as "1,1" - I use 1,1 to
# remember that it is "request,response"
NETPERF_REQS=${NETPERF_REQS:="1 16 32 64 128 256 512 1024 \
 1460 1461 2920 2921 4380 4381"}

NETPERF_RESP=${NETPERF_RESP:="1 16 32 64 128 256 512 1024 \
 1460 1461 2920 2921 4380 4381"}

# if there are two parms, parm one it the hostname and parm two will
# be a CPU indicator. actually, anything as a second parm will cause
# the CPU to be measured, but we will "advertise" it should be "CPU"

if [ $# -eq 2 ]; then
  REM_HOST=$1
  LOC_CPU="-c"
  REM_CPU="-C"
fi

if [ $# -eq 1 ]; then
  REM_HOST=$1
fi

# If we are measuring CPU utilization, then we can save beaucoup
# time by saving the results of the CPU calibration and passing
# them in during the real tests. So, we execute the new CPU "tests"
# of netperf and put the values into shell vars.
case $LOC_CPU in
\-c) LOC_RATE=`$NETPERF_CMD $PORT -t LOC_CPU`;;
*) LOC_RATE=""
esac

case $REM_CPU in
\-C) REM_RATE=`$NETPERF_CMD $PORT -t REM_CPU -H $REM_HOST`;;
*) REM_RATE=""
esac

# This disables header display
NO_HDR="-P 0"
NO_HDR=""

for SOCKET_SIZE in $NETPERF_SKTS
 do
  echo
  echo ------------------------------------------------------
  echo Testing with the following command line:
  # we echo the command line for cut and paste to th database
  echo $NETPERF_CMD $NETPERF_PORT -l $NETPERF_TIME -H $REM_HOST -t TCP_RR \
       $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $NETPERF_STATS --\
       -s $SOCKET_SIZE -S $SOCKET_SIZE
  echo
  echo and these settings for send sizes $NETPERF_REQS
  echo

  for REQ in $NETPERF_REQS
  do
   # since we have the confidence interval stuff, we do not
   # need to repeat a test multiple times from the shell
   $NETPERF_CMD $NETPERF_PORT -l $NETPERF_TIME -H $REM_HOST $NO_HDR \
   -t TCP_RR $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $NETPERF_STATS --\
   -r ${REQ},1 -s $SOCKET_SIZE -S $SOCKET_SIZE
   NO_HDR="-P 0"
  done
  echo
  echo ------------------------------------------------------
  NO_HDR=""
  echo Testing with the following command line:
  # we echo the command line for cut and paste to th database
  echo $NETPERF_CMD $NETPERF_PORT -l $NETPERF_TIME -H $REM_HOST -t TCP_RR \
       $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $NETPERF_STATS --\
       -s $SOCKET_SIZE -S $SOCKET_SIZE
  echo and these settings for response sizes $NETPERF_RESP
  echo
  for RESP in $NETPERF_RESP
   do
   # since we have the confidence interval stuff, we do not
   # need to repeat a test multiple times from the shell
   $NETPERF_CMD $PORT -l $NETPERF_TIME -H $REM_HOST $NO_HDR \
   -t TCP_RR $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $NETPERF_STATS --\
   -r 1,${RESP} -s $SOCKET_SIZE -S $SOCKET_SIZE
   NO_HDR="-P 0"
 done
  echo
  echo ------------------------------------------------------
  NO_HDR=""
  echo Testing with the following command line:
  # we echo the command line for cut and paste to th database
  echo $NETPERF_CMD $NETPERF_PORT -l $NETPERF_TIME -H $REM_HOST -t TCP_STREAM\
       $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $NETPERF_STATS --\
       -s $SOCKET_SIZE -S $SOCKET_SIZE
  echo and these settings for response sizes $NETPERF_RESP
  echo
  for REQ in $NETPERF_REQS
   do
   # since we have the confidence interval stuff, we do not
   # need to repeat a test multiple times from the shell
   $NETPERF_CMD $PORT -l $NETPERF_TIME -H $REM_HOST $NO_HDR \
   -t TCP_STREAM $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $NETPERF_STATS --\
   -m ${REQ} -s $SOCKET_SIZE -S $SOCKET_SIZE -D
   NO_HDR="-P 0"
 done
done

# The test length in seconds for the CRR test, which needs to be
#    longer for a connect/request/response test

NETPERF_CRR_TIME=${NETPERF_CRR_TIME:=120}

# now we do the TCP_CRR test
echo
echo ------------------------------------------------------
echo $NETPERF_CMD $NETPERF_PORT -l $NETPERF_CRR_TIME -H $REM_HOST -t TCP_CRR\
       $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $NETPERF_STATS --\
       -s $SOCKET_SIZE -S $SOCKET_SIZE
echo
$NETPERF_CMD $NETPERF_PORT -l $NETPERF_CRR_TIME -H $REM_HOST -t TCP_CRR\
       $LOC_CPU $LOC_RATE $REM_CPU $REM_RATE $NETPERF_STATS --\
       -s $SOCKET_SIZE -S $SOCKET_SIZE
