#!/bin/bash
#set -x
###########################################################
THIS_SCRIPT_PATH=$(dirname $(readlink -f $0))
###########################################################

black='\E[30m'
red='\E[31m'
green='\E[32m'
yellow='\E[33m'
blue='\E[34m'
magenta='\E[35m'
cyan='\E[36m'
white='\E[37m'

ROOT_UID=0
E_NOTROOT=67

trim ()
{
    echo "$1" | sed -n '1h;1!H;${;g;s/^[ \t]*//g;s/[ \t]*$//g;p;}'
}


cecho()   # Color-echo
# arg1 = message
# arg2 = color
{
    local default_msg="No Message."
    message=${1:-$default_msg}
    color=${2:-$black}
    echo -e "$color"
    echo -n "$message"
    tput sgr0
    echo
    return
}

echo_error() {
    local my_string=""
    until [ -z "$1" ]
    do
        my_string="$my_string$1"
        shift
        done
        cecho "$my_string" $red
}

echo_warning() {
    local my_string=""
    until [ -z "$1" ]
    do
        my_string="$my_string$1"
        shift
    done
    cecho "$my_string" $yellow
}

echo_success() {
    local my_string=""
    until [ -z "$1" ]
    do
        my_string="$my_string$1"
        shift
    done
    cecho "$my_string" $green
}

bash_exec() {
    output=$($1 2>&1)
    result=$?
    if [ $result -eq 0 ]
    then
        echo_success "$1"
    else
        echo_error "$1: $output"
    fi
}

wait_process_started () {
  if  [ -z "$1" ]
  then
    echo_error "WAITING FOR PROCESS START: NO PROCESS"
    return 1
  fi
  ps -C $1 > /dev/null 2>&1
  while [ $? -ne 0 ]; do
    echo_warning "WAITING FOR $1 START"
    sleep 2
    ps -C $1 > /dev/null 2>&1
  done
  echo_success "PROCESS $1 STARTED"
  return 0
}

wait_process_ended () {
  if  [ -z "$1" ]
  then
    echo_error "WAITING FOR PROCESS START: NO PROCESS"
    return 1
  fi
  pkill $1
  ps -C $1 > /dev/null 2>&1
  while [ $? -eq 0 ]; do
    echo_warning "WAITING FOR $1 END"
    pkill $1
    sleep 2
    ps -C $1 > /dev/null 2>&1
  done
  echo_success "PROCESS $1 ENDED"
  return 0
}

assert() {
  # If condition false
  # exit from script with error message
  E_PARAM_ERR=98
  E_PARAM_FAILED=99
  
  if [ -z "$2" ] # Not enought parameters passed.
  then
    return $E_PARAM_ERR
  fi
  
  lineno=$2
  if [ ! $1 ]
  then
    echo "Assertion failed:  \"$1\""
    echo "File \"$0\", line $lineno"
    exit $E_ASSERT_FAILED
  fi
}

control_c()
# run if user hits control-c
{
  echo -en "\n*** Exiting ***\n"
  pkill oaisim
  wait_process_ended oaisim
  sleep 2
  ip link set oai0 down
  /sbin/rmmod oai_nw_drv
  exit $?
}


set_openair() {
    path=`pwd`
    declare -i length_path
    declare -i index
    length_path=${#path}

    index=`echo $path | grep -b -o 'targets' | cut -d: -f1`
    #echo ${path%$token*}
    if [[ $index -lt $length_path  && index -gt 0 ]]
       then
           declare -x OPENAIR_DIR
           index=`expr $index - 1`
           openair_path=`echo $path | cut -c1-$index`
           #openair_path=`echo ${path:0:$index}`
           export OPENAIR_DIR=$openair_path
           export OPENAIR1_DIR=$openair_path/openair1
           export OPENAIR2_DIR=$openair_path/openair2
           export OPENAIR3_DIR=$openair_path/openair3
           export OPENAIR_TARGETS=$openair_path/targets
           return 0
    fi
    return -1
}


trap control_c SIGINT
set_openair
echo "OPENAIR1_DIR="$OPENAIR1_DIR
echo "OPENAIR2_DIR="$OPENAIR2_DIR
echo "OPENAIR3_DIR="$OPENAIR3_DIR
echo "OPENAIR_TARGETS="$OPENAIR_TARGETS

echo "Bringup UE interface"
pkill oaisim
/sbin/rmmod oai_nw_drv
make naslite_netlink_ether oaisim
/sbin/insmod  $OPENAIR2_DIR/NAS/DRIVER/LITE/oai_nw_drv.ko  oai_nw_drv_IMEI=3,9,1,8,3,6,7,3,0,2,0,0,0,0

#avoid conflict with reserved multicast addresses (224.0.0.11,224.0.0.13, 224.0.0.16)
ip link set oai0 broadcast ff:ff:ff:ff:ff:ff
ip route add 239.0.0.160/28 dev eth1
ip link set oai0 up
sleep 1
ifconfig oai0 10.0.1.3 netmask 255.255.255.0 broadcast 10.0.1.255
sleep 1
ip addr add dev oai0 2001:1::3/64
# -a     -> Add RB
# -d    -> Delete RB
# -cxx  -> lcr
# -ixx  -> instance
# -zxx  -> dscp
# -fxxx -> classref (uid of a classifier entry) if fn is used , fn is used for send classifier and n+1 for receive classifier
# -sxxx -> source ipv4 address
# -txxx -> destination ipv4 address
# -x    -> source ipv6 address
# -y    -> destination ipv6 address
# -r    -> radio bearer id
$OPENAIR2_DIR/NAS/DRIVER/LITE/RB_TOOL/rb_tool -a -c0 -f0 -i0 -z0  -x 0::0/128    -y 0::0/128 -r 3
$OPENAIR2_DIR/NAS/DRIVER/LITE/RB_TOOL/rb_tool -a -c0 -f2 -i0 -z0  -s 10.0.1.3/32 -t 10.0.1.1/32  -r 3
$OPENAIR2_DIR/NAS/DRIVER/LITE/RB_TOOL/rb_tool -a -c0 -f4 -i0 -z64 -x 0::0/128    -y 0::0/128 -r 3
$OPENAIR2_DIR/NAS/DRIVER/LITE/RB_TOOL/rb_tool -a -c0 -f6 -i0 -z64 -s 0.0.0.0/32  -t 0.0.0.0/32  -r 3

echo "   Enabling ping broadcast"
bash_exec "sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=0"
assert "`sysctl -n net.ipv4.icmp_echo_ignore_broadcasts` -eq 0" $LINENO

nice --adjustment=-10 $OPENAIR_TARGETS/SIMU/USER/oaisim -E 1234  -b0 -M1 -p3 -g1 -l3 > /dev/null 2>&1
#gdb --args $OPENAIR_TARGETS/SIMU/USER/oaisim -E 1234  -b0 -M1 -p3 -g1 -l3 

echo "End"