#!/bin/bash
#/*
# * 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 start_enb_ue_virt_noS1
# brief
# author Lionel Gauthier
# company Eurecom
# email: lionel.gauthier@eurecom.fr
###########################################
# INPUT OF THIS SCRIPT:
# THE DIRECTORY WHERE ARE LOCATED THE CONFIGURATION FILES
#########################################
# This script start  ENB+UE (all in one executable, on one host)
# eNB is in standalone mode, it does not require a MME.



###########################################################
THIS_SCRIPT_PATH=$(dirname $(readlink -f $0))
. $THIS_SCRIPT_PATH/build_helper
###########################################################




function help()
{
  echo_error " "
  echo_error "Usage: start_enb_ue_virt_noS1 [OPTION]..."
  echo_error "Run the eNB and/or UE executable with no hardware."
  echo_error " "
  echo_error "Options:"
  echo_error "Mandatory arguments to long options are mandatory for short options too."
  echo_error "  -a, --abstraction                       enable phy abstraction mode"
  echo_error "  -c, -C, --config-file  eNB_config_file  eNB config file, (see $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF)"
  echo_error "                                          Default eNB config file if not set is $1"
  echo_error "  -g, --gdb                               Run with GDB."
  echo_error "  -l, --log-level                         set the global log level (8:trace, 7:debug, 6:info, 4:warn, 3:error). Note that the log configuration is eNB config file is ignored for oaisim."
  echo_error "  -h, --help                              Print this help."
  echo_error "  -K, --itti-dump-file   filename         ITTI dump file containing all ITTI events occuring during EPC runtime.(can omit file name if last argument)"
  echo_error "  -m, --mscgen           directory        Generate mscgen output files in a directory"
  echo_error "  -V, --vcd                               Dump timings of processing in a GTKWave compliant file format."
  echo_error "  -W, --wireshark-l2                      Dump MAC frames for visualization with wireshark."
  echo_error "                                          You need to open Wireshark, open the preferences, and check try heuristics for the UDP protocol, MAC-LTE, RLC-LTE,"
  echo_error "                                          and PDCP-LTE. Then capture for all the interfaces with the following filters: s1ap or lte_rrc or mac-lte or rlc-lte"
  echo_error "                                          or pdcp-lte. Note the L2 pdus are transmitted to the local interface."
  echo_error "  -x, --xforms                            Run XFORMS scope windows."
  echo_error "  -n, --num-frames                        Set number of frames for simulation"
}



function main()
{
  set_openair_env
  cecho "OPENAIR_DIR    = $OPENAIR_DIR" $green

  local -i run_gdb=0
  local -i run_mscgen=0
  local    exe_arguments=""
  local    DEFAULT_CONFIG_FILE_ENB=$OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf
  local    CONFIG_FILE_ENB=$DEFAULT_CONFIG_FILE_ENB
  local    MSC_DIR="/tmp"
  local abstraction_flag=0

  until [ -z "$1" ]
    do
    case "$1" in
	-a | --abstraction )
	abstraction_flag=1
	echo "enabling abstraction mode"
	exe_arguments="$exe_arguments -a"
        shift;
	;;      
	-c | -C | --config-file)
        CONFIG_FILE_ENB=$2
        # may be relative path 
        if [ -f $(dirname $(readlink -f $0))/$CONFIG_FILE ]; then
          CONFIG_FILE_ENB=$(dirname $(readlink -f $0))/$CONFIG_FILE
          echo "setting config file to: $CONFIG_FILE"
          config_FILE_ACCESS_OK=1
        else
          # may be absolute path 
          if [ -f $CONFIG_FILE_ENB ]; then
            echo "setting config file to: $CONFIG_FILE_ENB"
          else
            echo_fatal "config file $CONFIG_FILE_ENB not found"
          fi
        fi
        shift 2;
        ;;
      -g | --gdb)
        run_gdb=1
        echo "setting GDB flag to: $GDB"
        shift;
        ;;
      -l | --log-level)
	echo "setting the log level to $2"
	exe_arguments="$exe_arguments -l $2"
        shift 2;
	;;          
      -h | --help)
        help $DEFAULT_CONFIG_FILE_ENB
        shift;
        exit 0
        ;;
      -K | --itti-dump-file)
        ITTI_DUMP_FILE=$2
        # can omit file name if last arg on the line
        if [ "x$ITTI_DUMP_FILE" = "x" ]; then
          ITTI_DUMP_FILE="/tmp/itti_enb_ue_s1.log"
          shift 1;
        else
          shift 2;
        fi
        echo "setting ITTI dump file to: $ITTI_DUMP_FILE"
        exe_arguments="$exe_arguments -K $ITTI_DUMP_FILE"
        ;;      

      -m | --mscgen)
        MSC_DIR=$2
        if [ -d  "$MSC_DIR" ]; then
          echo "setting mscgen log files to dir: $MSC_DIR"
          run_mscgen=1
          shift 2;
        else
          echo_error "Mscgen log dir does not exist"
          exit -1
        fi
        ;;      
#      -u | --num-ue )
	    
      -V | --vcd)
        echo "setting gtk-wave output"
        exe_arguments="$exe_arguments -V /tmp/oai_gtk_wave.vcd"
        shift ;
        ;;
      -W | --wireshark-l2)
        echo "setting l2 pcap dump output"
        exe_arguments="$exe_arguments -P wireshark"
        shift 1;
        ;;
      -n | --num-frames)
	echo "setting the number of frames in simulation to $2"
	exe_arguments="$exe_arguments -n $2"
        shift 2;
	;; 
      -x | --xforms)
        echo "running with xforms"
        exe_arguments="$exe_arguments --xforms"
        shift 1;
        ;;
      *)   
        echo "Unknown option $1"
        help
        exit 0
        ;;
    esac
  done

  # may use default config file
  exe_arguments="$exe_arguments --enb-conf $CONFIG_FILE_ENB"


  ##################################################
  # LAUNCH eNB + UE executable
  ##################################################
  $SUDO pkill oaisim
  $SUDO rmmod nasmesh > /dev/null 2>&1

  echo_success "Bringup UE interface..."
  $SUDO insmod  $OPENAIR_DIR/targets/bin/nasmesh.ko
  sync

  echo "bring up oai0 interface for enb"
  $SUDO ifconfig oai0 10.0.1.1 netmask 255.255.255.0 broadcast 10.0.1.255
  sync
  echo "bring up oai1 interface for ue 1"
  $SUDO ifconfig oai1 10.0.2.2 netmask 255.255.255.0 broadcast 10.0.2.255
  sync

  # enb -> ue1
  $OPENAIR_DIR/targets/bin/rb_tool -a -c0 -i0 -z0 -s 10.0.1.1 -t 10.0.1.2 -r 1
  # ue1 -> enb
  $OPENAIR_DIR/targets/bin/rb_tool -a -c0 -i1 -z0 -s 10.0.2.2 -t 10.0.2.1 -r 1

  if [ "$abstraction_flag" -eq "0" ] ; then 
      exe_arguments="$exe_arguments -s15 -AAWGN -b1 -u1"
  else 
      exe_arguments="$exe_arguments -b1 -u1" 
  fi 
    
  cd  $OPENAIR_DIR/targets/bin
   
   
  if [ $run_mscgen -eq 1 ]; then 
    $SUDO rm -f /tmp/openair.msc.*
  fi
  
  if [ $run_gdb -eq 0 ]; then 
    exec $SUDO $OPENAIR_DIR/targets/bin/oaisim_nos1.Rel14 $exe_arguments | tee /tmp/enb_ue_nos1.log.txt
  else
    touch      ~/.gdb_enb_ue_nos1
    chmod 777  ~/.gdb_enb_ue_nos1
    echo "file $OPENAIR_DIR/targets/bin/oaisim_nos1.Rel14" > ~/.gdb_enb_ue_nos1
    echo "set args $exe_arguments" >> ~/.gdb_enb_ue_nos1
    echo "run"                        >> ~/.gdb_enb_ue_nos1
    cat ~/.gdb_enb_ue_nos1
    $SUDO gdb -n -x ~/.gdb_enb_ue_nos1 
  fi
  
  if [ $run_mscgen -eq 1 ]; then 
    cd $MSC_DIR
    last_created_file=`ls -t mscgen* | head -1 | tr -d ':'`
    $OPENAIR_DIR/targets/SCRIPTS/msc_gen.py  --profile E_UTRAN
    sync
    last_created_file2=`ls -t mscgen* | head -1 | tr -d ':'`
        
    if [ x"$last_created_file" != x"$last_created_file2" ]; then
      if [ -f ./$last_created_file2/oai_mscgen_page_0.png ]; then 
        command -v eog 2>/dev/null &&  eog ./$last_created_file2/oai_mscgen_page_0.png
      fi
    fi 
  fi
}

main "$@"
