From 88e3d382b832b57ed6bd12cfdec4d24a2878c712 Mon Sep 17 00:00:00 2001
From: Navid Nikaein <navid.nikaein@eurecom.fr>
Date: Wed, 25 Feb 2015 15:10:57 +0000
Subject: [PATCH] * update the build scripts * add oai (oaisim, lte-softmodem)
 perfroamnce evaulation scripts

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@6618 818b1a75-f10b-46b9-bf7c-635c3b92a50f
---
 targets/TEST/OAI/case05.py  |   2 +-
 targets/TEST/OAI/openair.py |   2 +-
 targets/build_helper.bash   |  23 ++
 targets/build_oai.bash      |   7 +-
 targets/perf_oai.bash       | 736 ++++++++++++++++++++++++++++++++++++
 5 files changed, 765 insertions(+), 5 deletions(-)
 create mode 100755 targets/perf_oai.bash

diff --git a/targets/TEST/OAI/case05.py b/targets/TEST/OAI/case05.py
index 48b39bd9d4..0d3fe0229f 100644
--- a/targets/TEST/OAI/case05.py
+++ b/targets/TEST/OAI/case05.py
@@ -54,7 +54,7 @@ def execute(oai, user, pw, host,logfile,logdir,debug):
     try:
         log.start()
         test = '00'
-        name = 'Perf oai.dlsim.sanity'
+        name = 'Perf oai.ulsim.sanity'
         conf = '-a -A AWGN -n 100'
         diag = 'ulsim is not running normally (Segmentation fault / Exiting / FATAL), debugging might be needed'
         trace = logdir + '/log_' + host + case + test + '_1.txt;'
diff --git a/targets/TEST/OAI/openair.py b/targets/TEST/OAI/openair.py
index 1af21f879f..a40018d065 100644
--- a/targets/TEST/OAI/openair.py
+++ b/targets/TEST/OAI/openair.py
@@ -185,7 +185,7 @@ class openair(core):
             print "Error removing oai network driver module:", val
    
     def driver(self,oai,user,pw):
-        pwd = oai.send_recv('pwd') 
+        #pwd = oai.send_recv('pwd') 
         oai.send('cd $OPENAIR_TARGETS;')   
         oai.send('cd SIMU/USER;')   
         try:
diff --git a/targets/build_helper.bash b/targets/build_helper.bash
index 2f6b3488b0..10c7d3f93d 100755
--- a/targets/build_helper.bash
+++ b/targets/build_helper.bash
@@ -1047,6 +1047,14 @@ install_nas_tools() {
     $OPENAIRCN_DIR/NAS/EURECOM-NAS/bin/usim_data --print
 }
 
+install_nasmesh(){
+    echo_success "LOAD NASMESH IP DRIVER FOR UE AND eNB" 
+    (cd $OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL && make clean && make)
+    (cd $OPENAIR2_DIR && make clean && make nasmesh_netlink_address_fix.ko)
+    $SUDO rmmod nasmesh
+    $SUDO insmod $OPENAIR2_DIR/NAS/DRIVER/MESH/nasmesh.ko
+}
+
 ##################################
 # create HSS DB
 ################################
@@ -1158,6 +1166,21 @@ print_help(){
     echo_success "-x | --xforms                           : Enable xforms (default disabled)"
     echo_success "-z | --defaults                         : Set the default build options"
 }
+
+print_help_perf(){
+    echo_success "Name : perf_oai  generate traffic and evaluate the performance "
+    echo_success "Usage: perf_oai.bash -l ITG "
+    echo_success "-l | --perf-app               : Set Performance evaluation app: ITGS, ITGD,PING, OTG-OAISIM, OTG-CBA, (default PING)"
+    echo_success "-m | --owd                    : enable D-ITG one-way-delay meter (default disabled)"
+    echo_success "-e | --duration               : set the duration of the experiment (default 60000ms)"
+    echo_success "-i | --idt-dist               : set the distribution of the inter-departure time: CONSTANT, UNIFORM,EXPONENTIAL (default CONSTANT)"
+    echo_success "-s | --ps-dist                : set the distribution of the inter-departure time (default CONSTANT, available options: UNIFORM,EXPONENTIAL)"
+    echo_success "-d | --dst                    : set the destination address (default 127.0.0.1)"
+    echo_success "-p | --dst-port               : set the destination address (default NONE)"
+    echo_success "-t | --test                   : enable test mode to validate the functionality (default disabled)"
+    echo_success "-k | --keep-log-file          : keep the log files (default disabled)"
+
+}
 ###############################
 ## echo and  family 
 ###############################
diff --git a/targets/build_oai.bash b/targets/build_oai.bash
index 3cac55dc26..37ca00f77b 100755
--- a/targets/build_oai.bash
+++ b/targets/build_oai.bash
@@ -49,13 +49,13 @@ declare OAI_DB_ADMIN_USER_NAME="root"
 declare OAI_DB_ADMIN_USER_PASSWORD="linux"
 
 #only one could be set at the time
-declare BUILD_LTE="" # ENB, EPC, HSS, NONE
+declare BUILD_LTE="ENB" # ENB, EPC, HSS
 
 declare HW="EXMIMO" # EXMIMO, USRP, ETHERNET, NONE
 declare TARGET="ALL" # ALL, SOFTMODEM, OAISIM, UNISIM, NONE
 declare ENB_S1=1
 declare REL="REL8" # REL8, REL10
-declare RT="NONE" # RTAI, RT_PREMPT or RT_DISABLED, NONE
+declare RT="NONE" # RTAI, RT_PREMPT, NONE
 declare DEBUG=0
 declare CONFIG_FILE=" "
 declare CONFIG_FILE_ACCESS_OK=0
@@ -725,6 +725,7 @@ fi
 ############################################
 # run 
 ############################################
+
 if [ $RUN -ne 0 ]; then 
     echo_info "11. Running ..."
     cd $OPENAIR_TARGETS/bin
@@ -750,7 +751,7 @@ if [ $RUN -ne 0 ]; then
             elif [ $TARGET == "OAISIM" ]; then
             
                 if [ $ENB_S1 -eq 0 ]; then
-                    echo_error "TODO: LOAD NASMESH IP DRIVER FOR UE AND eNB" 
+		    install_nasmesh
                 else
                     # prepare NAS for UE
                     if [ ! -f .ue.nvram ]; then
diff --git a/targets/perf_oai.bash b/targets/perf_oai.bash
new file mode 100755
index 0000000000..57139cdb01
--- /dev/null
+++ b/targets/perf_oai.bash
@@ -0,0 +1,736 @@
+################################################################################
+#   OpenAirInterface
+#   Copyright(c) 1999 - 2015 Eurecom
+#
+#    OpenAirInterface is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation, either version 3 of the License, or
+#    (at your option) anylater version.
+#
+#
+#    OpenAirInterface is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with OpenAirInterface.The full GNU General Public License is
+#    included in this distribution in the file called "COPYING". If not,
+#    see <http://www.gnu.org/licenses/>.
+#
+#  Contact Information
+#  OpenAirInterface Admin: openair_admin@eurecom.fr
+#  OpenAirInterface Tech : openair_tech@eurecom.fr
+#  OpenAirInterface Dev  : openair4g-devel@eurecom.fr
+#
+#  Address      : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
+#
+################################################################################
+# 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 "OPENAIRCN_DIR   = $OPENAIRCN_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 "OPENAIRCN_DIR   = $OPENAIRCN_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
+
-- 
2.26.2