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