#/*
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
# * contributor license agreements.  See the NOTICE file distributed with
# * this work for additional information regarding copyright ownership.
# * The OpenAirInterface Software Alliance licenses this file to You under
# * the OAI Public License, Version 1.1  (the "License"); you may not use this file
# * except in compliance with the License.
# * You may obtain a copy of the License at
# *
# *      http://www.openairinterface.org/?page_id=698
# *
# * Unless required by applicable law or agreed to in writing, software
# * distributed under the License is distributed on an "AS IS" BASIS,
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# * See the License for the specific language governing permissions and
# * limitations under the License.
# *-------------------------------------------------------------------------------
# * For more information about the OpenAirInterface (OAI) Software Alliance:
# *      contact@openairinterface.org
# */
################################################################################
# file build_oai.bash
# brief apply a traffic generator, send traffic and measure the performance of OAI
# OTG is mainly used for OASIM and D-ITG (or iperf) for LTE-SOFTMODEM
# author  Navid Nikaein 
# company Eurecom
# email:  navid.nikaein@eurecom.fr 
# date 2015

#!/bin/bash
################################
# include helper functions
################################
THIS_SCRIPT_PATH=$(dirname $(readlink -f $0))
. $THIS_SCRIPT_PATH/build_helper.bash

check_for_root_rights


#######################################
# Default PARAMETERS
######################################
#general 

declare PERF_APP="PING" # ITG, ITG_DECODE, PING, OTG, 
declare TEST_MODE=0
declare KEEP_LOG_FILESNUM_PKTS=0
declare OWD="rttm" 
declare DURATION=60000 # ms
declare NUM_PKTS=10000
declare KBYTES=1000 # KBYTES
declare START=0
declare DST="127.0.0.1"
declare DPORT="8999"
declare TP="UDP"
declare IDT_DIST="CONSTANT"
declare PS_DIST="CONSTANT"

#IDT
declare RATE=1000    # pkt / s
declare MIN_RATE=100
declare MAX_RATE=1000


############## script params #####################

  until [ -z "$1" ]
  do
  case "$1" in
      -c | --test)
	  TEST_MODE=1;
	  echo_info "enabling the test mode"
	  shift;
	  ;;
      -l | --perf-app) 
	  PERF_APP=$2
          echo_info "Setting the performance evaluation APP to $PERF_APP"
	  if [ $PERF_APP = "DITG" ]; then 
	      echo_info "you need to run "
          fi 
	  shift 2;
	  ;;
      -m | --owd)
          OWD="owdm"
          echo_info "setting D-ITG one-way-delay meter"
          shift;
          ;;
      -e | --duration)
          DURATION=$2
          echo_info "Setting the traffic duration to $DURATION"
          shift 2;
          ;;
      -n | --num-pkts) 
	  NUM_PKTS=$2
	  echo_info "Setting number of packets to $NUM_PKTS"
          shift 2;
          ;;
      -k | --keep-log-file)
	  KEEP_LOG_FILESNUM_PKTS=1
	  echo_info "Keep the log files"
          shift;
          ;;
      -i | --idt-dist)
          IDT_DIST=$2
          echo_info "setting IDT distribution to $IDT_DIST"
          shift 2;
          ;;
      -s | --ps-dist)
          PS_DIST=$2
          echo_info "setting PS distribution to $PS_DIST"
          shift 2;
          ;;
      -d | --dst)
	  DST=$2
	  echo_info "setting the destination address to $DST"
	  shift 2;
	  ;;
      -p | --dst-port) 
	  DPORT=$2
	  echo_info "setting the destination port to $DPORT"
	  shift 2;
	  ;;
      -h | --help)
          print_help_perf
          exit -1
          ;;
      *)   
            echo "Unknown option $1"
            break ;
            # unknown option
            ;;
   esac
done

#####################
# create a bin dir
#####################
echo_info "1. Creating the results dir ..." 
#rm -rf results
mkdir -m 777 -p results 

exp_date=`date +%Y_%m_%d`
exp_time=`date +%H_%M_%S`
oai_exp_date="exp_date_${exp_date}"
touch results/${oai_exp_date} 

touch results/perf_log.txt
chmod -f 777 results/perf_log.txt

echo "start experiment at date $exp_date time $exp_time " >> results/${oai_exp_date} 

############################################
# setting and printing OAI envs, we should check here
############################################
    
echo_info "2. Setting the OAI PATHS ..."

set_openair_env 
cecho "OPENAIR_HOME    = $OPENAIR_HOME" $green
cecho "OPENAIR1_DIR    = $OPENAIR1_DIR" $green
cecho "OPENAIR2_DIR    = $OPENAIR2_DIR" $green
cecho "OPENAIR3_DIR    = $OPENAIR3_DIR" $green
cecho "OPENAIR3_DIR   = $OPENAIR3_DIR" $green
cecho "OPENAIR_TARGETS = $OPENAIR_TARGETS" $green


echo "OPENAIR_HOME    = $OPENAIR_HOME" >>  results/${oai_exp_date}
echo "OPENAIR1_DIR    = $OPENAIR1_DIR"  >>  results/${oai_exp_date}
echo "OPENAIR2_DIR    = $OPENAIR2_DIR"  >>  results/${oai_exp_date}
echo "OPENAIR3_DIR    = $OPENAIR3_DIR"  >>  results/${oai_exp_date}
echo "OPENAIR3_DIR   = $OPENAIR3_DIR"  >>  results/${oai_exp_date}
echo "OPENAIR_TARGETS = $OPENAIR_TARGETS"  >>  results/${oai_exp_date}

################################
# run ITGSEND
################################

itg_send(){

    test_install_package d-itg
    
    LOG_FILE="itg_log_template.txt"
    touch results/${LOG_FILE} 
    
    if [ $TEST_MODE = 0 ] ; then 
	declare -a PS=(32 64 128 256 512 1024 1408)
	declare -a IDT=(1 5 10 50 100 1000)
    else 
	declare -a PS=(32 64)
	declare -a IDT=(1)
    fi 

    declare PS_LEN=${#PS[@]} 
    declare IDT_LEN=${#IDT[@]} 
#echo_info "PS_LEN is $PS_LEN, IDT_LEN is $IDT_LEN"

    declare i=0
    declare j=0
    declare e=0
    # send traffic 
    for idt in ${IDT[@]}; do
#  echo_info "IDT is set to $idt i is $i"
	if [ $i -lt $IDT_LEN ]; then 
	    let i++;
	fi
	
	if [ $IDT_DIST = "CONSTANT" ]; then 
	    IDT_OPT="-C $idt "
	fi
	if [ $IDT_DIST = "UNIFORM" ]; then 
	    IDT_OPT="-U $idt ${IDT[i]} "
	fi
	if [ $IDT_DIST = "EXPONENTIAL" ]; then 
	    IDT_OPT="-E $idt "
	fi
	
	for ps in ${PS[@]}; do
#      echo_info "PS is $ps j is $j"
	    if [ $j -lt  $PS_LEN ]; then 
		let j++;
	    fi
	    if [ $PS_DIST = "CONSTANT" ]; then 
		PS_OPT="-c $ps "
	    fi
	    if [ $PS_DIST = "UNIFORM" ]; then 
		PS_OPT="-u $ps ${PS[j]} "
	    fi
	    if [ $PS_DIST = "EXPONENTIAL" ]; then 
		PS_OPT="-e $ps "
	    fi
	    start=$(date +%s)
	    RECV_FILE="recv_log_${IDT_DIST}_idt${idt}_${PS_DIST}_ps${ps}_${OWD}_${TP}"
	    echo_info "Start test_$i.$j:: ITGSend -a $DST $IDT_OPT $PS_OPT -m $OWD -d $START -T $TP -t $DURATION -x $RECV_FILE -l "
	    echo "Start test_$i.$j:: ITGSend -a $DST $IDT_OPT $PS_OPT -m $OWD -d $START -T $TP -t $DURATION -x $RECV_FILE -l " >> results/${oai_exp_date} 
	    #sleep 1 
	    ITGSend -a $DST $IDT_OPT $PS_OPT -m $OWD -d $START -T $TP -t $DURATION -x $RECV_FILE -l
	    itg_status=$?
	    end=$(date +%s)
	    diff=$(( $end - $start ))
	    
	    if [ $itg_status = 0 ] ; then 
		echo_success "[$end] test_$i.$j passed"
		echo "[$end] test_$i.$j passed" >> ./results/$LOG_FILE
		STATUS="PASSED"	   
	    else
		let e++;
		echo_error "[$end] test_$i.$j failed :: D-ITG return exit code $itg_status"
		echo "[$end]test_$i.$j failed :: ITG return exit code $itg_status" >> ./results/$LOG_FILE
		STATUS="FAILED"
	    fi 
	   
	    echo_info "End test_$i.$j:: runtime: $diff"
	    echo  "End test_$i.$j:: runtime: $diff" >>  results/${oai_exp_date} 
	    
	done
	
    done     
   
}

itg_decode(){
  
    declare i=0
    declare j=0
    if [ $TEST_MODE = 0 ] ; then 
	declare -a PS=(32 64 128 256 512 1024 1408)
	declare -a IDT=(1 5 10 50 100 1000)
    else 
	declare -a PS=(32 64)
	declare -a IDT=(1)
    fi 

    for idt in ${IDT[@]}; do
	
	for ps in ${PS[@]}; do
	    RECV_FILE="recv_log_${IDT_DIST}_idt${idt}_${PS_DIST}_ps${ps}_${OWD}_${TP}"
	    OUTPUT_FILE="results_${IDT_DIST}_idt${idt}_${PS_DIST}_ps${ps}_${OWD}_${TP}.txt"
	    OCTAVE_FILE="results_${IDT_DIST}_idt${idt}_${PS_DIST}_ps${ps}_${OWD}_${TP}.."
	    
	    echo_info "decode test_$i.$j: ITGDec $RECV_FILE -v -t -l $OUTPUT_FILE -o $OCTAVE_FILE"
	    ITGDec $RECV_FILE -v -t -l $OUTPUT_FILE
	    
	done
      
  done      
           

}

ping_stats(){

    status="failed"
    failedhosts=""
  
# add ip / hostname separated by white space

if [ $TEST_MODE = 0 ]; then 
    declare COUNT=100
    declare -a HOSTS=($DST)
    declare -a PS=(64 768 2048 4096 8192)
    declare -a IDT=(1 .8 .4 .2)
else 
    declare COUNT=10
    declare -a HOSTS=(localhost)
    declare -a PS=(64 2048)
    declare -a IDT=(.5)
fi 


declare i=0
declare j=0
declare k=0

start_exp=$(date +%s)

for host in ${HOSTS[@]}; do 
    let i++;
    let j=0;
    OUTPUT_FILE="rtt_host${host}.csv"
    touch results/${OUTPUT_FILE}
    for idt in ${IDT[@]}; do
	let j++;
	let k=0;
	for ps in ${PS[@]}; do
	    let k++;
             # | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }')
	    start=$(date +%s)
	    LOG_FILE="recv_log_host${host}_idt${idt}_ps${ps}.txt"
	    touch results/${LOG_FILE} 
	    echo_info "Start test_$i.$j.$k:: ping -c $COUNT -q -U $host -s $ps -i $idt"
	    echo "Start test_$i.$j.$k:: ping -c $COUNT -q -U $host -s $ps -i $idt" >> results/${oai_exp_date} 
	    $(ping -c $COUNT -q -U $host -s $ps -i $idt 1>&2  >> ./results/$LOG_FILE )
	    end=$(date +%s)
	    diff=$(( $end - $start ))
	    
	    count=$(cat ./results/$LOG_FILE   | awk -F, '/received/{print $2*1}')
	    latency=$(cat ./results/$LOG_FILE | tail -1 |cut -f2- -d=)
	    
	    MIN=$(cut -f1 -d/ <<< $latency)
	    AVG=$(cut -f2 -d/ <<< $latency)
	    MAX=$(cut -f3 -d/ <<< $latency)
	    MDEV=$(cut -f4 -d/ <<< $latency | cut -f1 -d" ")
	    UNIT=$(cut -f2 -d" " <<< $latency)
	    
	    echo_success "Latency:: count $count min $MIN avg $AVG max $MAX mdev $MDEV ($UNIT)"
	    echo "$idt;$ps;$COUNT;$count;$MIN;$AVG;$MAX;$MDEV;" >> ./results/$OUTPUT_FILE 
	    if [ $count -eq 0 ]; then
		failedhosts="$failedhosts $host"
		status="failed"
	    else 
		status="passed"
	    fi
	    echo_info "End test_$i.$j.$k:: runtime: $diff :: status $status "
	    echo  "End test_$i.$j.$k:: runtime: $diff :; status $status" >>  results/${oai_exp_date} 
	   
	done
    done
done
end_exp=$(date +%s)
diff_exp=$(( $end_exp - $start_exp ))
	  
let total_tests=i*j*k;
echo_info "total tests: $total_tests for a duration $diff_exp (s)"

}

oaisim_otg_stats(){

# install the required packages
    
    test_install_package octave >> results/perf_log.txt 2>&1

# set paths to the required binaries and check if the required binaries are available  
    OAISIM="bin/oaisim"
    OTGPLOT="$OPENAIR2_DIR/UTIL/OTG/OTGplot"
    PS2PDF="ps2pdf"
  
    if [ ! -f $OAISIM ]; then 
	echo_info "3.1 compiling OAISIM ($OPENAIR_TARGETS/build_oai.bash -t OAISIM -b -D -c)"
	($OPENAIR_TARGETS/build_oai.bash -t OAISIM -b -D -c >> results/perf_log.txt 2>&1 )
	build_stats=$?
	if [ $build_stats != 0 ] ; then 
	    echo_error "$OAISIM cannot be built, check results/perf_log.txt file"
	    exit $?
	fi 
    else 
	echo_info "ensure that OAISIM is not built with the S1 interface"
    fi
    
    (install_nasmesh >> results/perf_log.txt 2>&1 )
    
    if [ ! -f $OTGPLOT ]; then 
	echo_error "$OTGPLOT not found"
	exit $?
    fi 

# Set the default Parameters
    ABSTRACTION=1
#FRAME_TYPE=0 # FDD=0, TDD =1, 2,3,4,5,6
    AGGR_RESULT=1
    STATUS="PASSED"
    EXTRA_STATS=0
    declare NUM_UES=7
    
    if [ $TEST_MODE = 0 ]; then 
	declare -a TEMPLATES=(120 121 122 123 124 125 126 127 128 129 130)
	declare -a FRAME_TYPE=(0 3)
	declare -a METRICS=(latency jitter goodput)
	declare -a RB=(25 50 100)
    else 
	declare -a TEMPLATES=(125)
	declare -a FRAME_TYPE=(3)
	declare -a METRICS=(latency)
	declare -a RB=(25)
    fi 
    
    if [ $ABSTRACTION = 1 ]; then 
	OPT="-a "
    fi
    
    declare num_cols=0
    let num_cols=NUM_UES+1
    if [ $AGGR_RESULT = 1 ]; then 
	COLUMN="[$num_cols:$num_cols]"
    else
	COLUMN="[1:$num_cols]"
    fi 
    
    declare i=0
    declare j=0
    declare k=0
    declare e=0
    
    start_exp=$(date +%s)
    
    for template in ${TEMPLATES[@]}; do 
	let i++;
	let j=0;
	for frame  in ${FRAME_TYPE[@]}; do
	    let j++;
	    let k=0;
	    
	    if [ $frame = 0 ]; then 
		OPT="$OPT -F "
	    else 
		OPT="$OPT -C $frame "
	    fi 
	    
	    for rb in ${RB[@]}; do
		let k++;
		start=$(date +%s)
		LOG_FILE="oaisim_log_template${template}_frame${frame}_rb${rb}.txt"
		touch results/${LOG_FILE} 
		echo_info "[$start] Start test_$i.$j.$k:: $OAISIM $OPT -R $RB -c $template"
		echo "Start test_$i.$j.$k:: $OAISIM $OPT -R $RB -c $template" >> results/${oai_exp_date} 
	#sleep 1 
		$OAISIM $OPT -R $RB -c $template 1>&2  >> ./results/$LOG_FILE
	# store exit status 
		oai_status=$?
		end=$(date +%s)
		diff=$(( $end - $start ))
		
        #check the oaisim exit status 
		if [ $oai_status = 0 ] ; then 
		    echo_success "[$end] test_$i.$j.$k passed"
		    echo "[$end] test_$i.$j.$k passed" >> ./results/$LOG_FILE
		    STATUS="PASSED"	   
		else
		    let e++;
		    echo_error "[$end] test_$i.$j.$k failed :: OAISIM return exit code $oai_status (remove bin/oaisim)"
		    echo "[$end]test_$i.$j.$k failed :: OAISIM return exit code $oai_status" >> ./results/$LOG_FILE
		    STATUS="FAILED"
		fi 
	    	
         # create the curves 
		for metric  in ${METRICS[@]}; do
		    if [ $metric = "goodput" ]; then 
			unit="(kB/s)"
		    else
			unit="(ms)"
		    fi 	
		    if [ -f /tmp/otg_${metric}.dat ]; then 
			export TITLE="Application $metric $unit"
			cp /tmp/otg_${metric}.dat ./results/otg-${metric}-template${template}-frame${frame}-rb${rb}.dat
			echo_info "$OTGPLOT ./results/otg-${metric}-template${template}-frame${frame}-rb${rb}.dat $COLUMN"
			echo "$OTGPLOT ./results/otg-${metric}-template${template}-frame${frame}-rb${rb}.dat $COLUMN"  >> results/${oai_exp_date} 
			$($OTGPLOT ./results/otg-${metric}-template${template}-frame${frame}-rb${rb}.dat $COLUMN 1>&2 >> ./results/$LOG_FILE )
			$($PS2PDF -dOptimize=true -dEmbedAllFonts=true ./otg-${metric}-template${template}-frame${frame}-rb${rb}.eps )
		# remove the first line of the file
			echo "$(tail -n+2 ./results/otg-${metric}-template${template}-frame${frame}-rb${rb}.dat)" > ./results/otg-${metric}-template${template}-frame${frame}-rb${rb}.dat
		    else 
			echo_error "file /tmp/otg_${metric}.dat does not exists"
		    fi 
		done 
		if [ $KEEP_LOG_FILESNUM_PKTS = 0 ]; then 
		    rm -f ./results/$LOG_FILE
		fi 
		mv *.eps ./results/
		mv *.pdf ./results/
		mv /tmp/otg.log ./results/otg-template${template}-frame${frame}-rb${rb}.log
		echo_info "End test_$i.$j.$k:: runtime: $diff :: status $STATUS"
		echo  "End test_$i.$j.$k:: runtime: $diff :: status $STATUS" >>  results/${oai_exp_date} 
		
	    	
	    done
	done 
    done

    end_exp=$(date +%s)
    diff_exp=$(( $end_exp - $start_exp ))
    
    let total_tests=i*j*k;
    echo_info "total tests: $total_tests for a duration $diff_exp (s) error ($e)"
    echo  "total tests: $total_tests for a duration $diff_exp (s) error ($e)" >>  results/${oai_exp_date} 
    
}


cba_otg_stats(){

    test_install_package octave

ABSTRACTION=1
FRAME_TYPE=0 # FDD=0, TDD =1
AGGR_RESULT=1
#OAISIM="$OPENAIR_TARGETS/bin/oaisim"
OAISIM="bin/oaisim.cba" # to compile: make cleanall; make Rel10=1 CBA=1 in targets/SIMU/USER
OTGPLOT="$OPENAIR2_DIR/UTIL/OTG/OTGplot"
PS2PDF="ps2pdf"
STATUS="PASSED"
EXTRA_STATS=0
declare NUM_UES=7

if [ $TEST_MODE = 0 ]; then 
    declare -a TEMPLATES=(120 121 122 123 124 125 126 127 128 129 130)
    declare -a CBA=(0 1 2 3 4)
    declare -a BACKOFF=(0 15 30 60 120)
    declare -a METRICS=(latency jitter goodput)
    declare -a RB=(25)
else 
    declare -a TEMPLATES=(125)
    declare -a CBA=(1)
    declare -a BACKOFF=(0 15 30 60 120)
    declare -a METRICS=(latency)
    declare -a RB=(25)
fi 

if [ ! -f $OAISIM ]; then 
    echo_error "$OAISIM not found"
    exit $?
fi 
if [ ! -f $OTGPLOT ]; then 
    echo_error "$OTGPLOT not found"
    exit $?
fi 

if [ $ABSTRACTION = 1 ]; then 
    OPT="-a "
fi
if [ $FRAME_TYPE = 0 ]; then 
    OPT="$OPT -F "
fi

declare num_cols=0
let num_cols=NUM_UES+1
if [ $AGGR_RESULT = 1 ]; then 
    COLUMN="[$num_cols:$num_cols]"
else
    COLUMN="[1:$num_cols]"
fi 

declare collision=0
declare enb_cba_access=0
declare ue_cba_access=0
declare missed=0
declare unused=0

declare i=0
declare j=0
declare k=0
declare e=0

start_exp=$(date +%s)

STATS1="cba_stats1.txt"
touch results/${STATS1}
    
for template in ${TEMPLATES[@]}; do 
    let i++;
    let j=0;
    for group  in ${CBA[@]}; do
	let j++;
	let k=0;
	for backoff in ${BACKOFF[@]}; do
	    let k++;
	    start=$(date +%s)
	    LOG_FILE="oaisim_log_template${template}_group${group}_backoff${backoff}.txt"
	    touch results/${LOG_FILE} 
	    echo_info "[$start] Start test_$i.$j.$k:: $OAISIM $OPT -w $group -R $RB --cba-backoff $backoff -c $template"
	    echo "Start test_$i.$j.$k:: $OAISIM $OPT -w $group -R $RB --cba-backoff $backoff -c $template" >> results/${oai_exp_date} 
	#sleep 1 
	    $OAISIM $OPT -w $group -R $RB --cba-backoff $backoff -c $template 1>&2  >> ./results/$LOG_FILE
	# store exit status 
	    oai_status=$?
	    end=$(date +%s)
	    diff=$(( $end - $start ))
	    
        #check the oaisim exit status 
	    if [ $oai_status = 0 ] ; then 
		echo_success "[$end] test_$i.$j.$k passed"
		echo "[$end] test_$i.$j.$k passed" >> ./results/$LOG_FILE
		STATUS="PASSED"	   
	    else
		let e++;
		echo_error "[$end] test_$i.$j.$k failed :: OAISIM return exit code $oai_status"
		echo "[$end]test_$i.$j.$k failed :: OAISIM return exit code $oai_status" >> ./results/$LOG_FILE
		STATUS="FAILED"
	    fi 
	
	    if [ $group -gt 0 ]; then 
	    
		let ue_cba_access=$(cat ./results/$LOG_FILE    | grep -c "CBA transmission oppurtunity" )
		let enb_cba_access=$(cat ./results/$LOG_FILE   | grep -c "schedule CBA access" )
		let missed=$(cat ./results/$LOG_FILE          | grep -c "wait for backoff to expire" )
		let unused=enb_cba_access-ue_cba_access;
		let collision=$(cat ./results/$LOG_FILE        | grep -c "first CBA collision detected" )

	    #frame, subframe, ue, group
	    #collision_stats=$(cat ./results/$LOG_FILE      | grep "collision"  | cut -d " " -f3,5,12,15 )
		if [ $EXTRA_STATS = 1 ]; then 
		    STATS2="cba_template_${template}_stats2.txt"
		    touch results/${STATS2}
  		    while read -r line
		    do
			SFN=$(cut -f1  -d " " <<< $line)
			SSFN=$(cut -f2 -d " " <<< $line)
			UEID=$(cut -f3  -d " " <<< $line)
			GPID=$(cut -f4  -d " " <<< $line)
		#echo_success "$SFN;$SSFN;$UEID;$GPID;"
			echo "$SFN;$SSFN;$UEID;$GPID;"  >> ./results/$STATS2
		    done < <(cat ./results/$LOG_FILE      | grep "CBA collision set SR for UE"  | cut -d " " -f3,5,13,16 )
		fi
		
		echo_success "CBA stats:: template $template;group $group; backoff $backoff; enb cba allocation $enb_cba_access; ue cba access $ue_cba_access; collision $collision; missed $missed; unused $unused;"
		echo "$template;$group;$backoff;$enb_cba_access;$ue_cba_access;$collision;$missed;$unused;" >> ./results/$STATS1
	    fi
	    
         # create the curves 
	    for metric  in ${METRICS[@]}; do
		if [ $metric = "goodput" ]; then 
		    unit="(kB/s)"
		else
		    unit="(ms)"
		fi 	
		if [ -f /tmp/otg_${metric}.dat ]; then 
		    export TITLE="Application $metric $unit"
		    cp /tmp/otg_${metric}.dat ./results/otg-${metric}-template${template}-group${group}-backoff${backoff}.dat
		    echo_info "$OTGPLOT ./results/otg-${metric}-template${template}-group${group}-backoff${backoff}.dat $COLUMN"
		    echo "$OTGPLOT ./results/otg-${metric}-template${template}-group${group}-backoff${backoff}.dat $COLUMN"  >> results/${oai_exp_date} 
		    $($OTGPLOT ./results/otg-${metric}-template${template}-group${group}-backoff${backoff}.dat $COLUMN 1>&2 >> ./results/$LOG_FILE )
		    $($PS2PDF -dOptimize=true -dEmbedAllFonts=true ./otg-${metric}-template${template}-group${group}-backoff${backoff}.eps )
		# remove the first line of the file
		    echo "$(tail -n+2 ./results/otg-${metric}-template${template}-group${group}-backoff${backoff}.dat)" > ./results/otg-${metric}-template${template}-group${group}-backoff${backoff}.dat
		else 
		    echo_error "file /tmp/otg_${metric}.dat does not exists"
		fi 
	    done 
	    if [ $KEEP_LOG_FILESNUM_PKTS = 0 ]; then 
		rm -f ./results/$LOG_FILE
	    fi 
	    mv *.eps ./results/
	    mv *.pdf ./results/
	    mv /tmp/otg.log ./results/otg-template${template}-group${group}-backoff${backoff}.log
	    echo_info "End test_$i.$j.$k:: runtime: $diff :: status $STATUS"
	    echo  "End test_$i.$j.$k:: runtime: $diff :: status $STATUS" >>  results/${oai_exp_date} 
	
	    # backoff not required when CBA is not used
	    if [ $group -eq 0 ]; then
		break;
	    fi 
	    
	done
    done 
done

end_exp=$(date +%s)
diff_exp=$(( $end_exp - $start_exp ))

let total_tests=i*j*k;
echo_info "total tests: $total_tests for a duration $diff_exp (s) error ($e)"
echo  "total tests: $total_tests for a duration $diff_exp (s) error ($e)" >>  results/${oai_exp_date} 

}




case "$PERF_APP" in
    'ITGS')
        echo_info "3. running ITGSend"
        itg_send
        ;;
    'ITGD')
        echo_info "running ITGDECODE (ensure that the results are in the current directory)"
        itg_decode
        ;;
    'PING')
	echo_info "3. running ping"
        ping_stats
    	;;
    'OTG-OAISIM')
	echo_info "3. running OTG on oaisim"
        oaisim_otg_stats
    	;;
    'OTG-CBA')
	echo_info "3. running OTG on oaisim with cba"
        cba_otg_stats
    	;;

    'IPERF')
	echo_warning "iperf not supported"
	;;
    'NONE')
        ;;
    *)
        echo_error "Unknown option $RUN_ITG"
        ;;
esac