Problems reported by Jorge Muñoz Castañer <jorgem@gti.uvigo.es>. - use Rel14 binaries (those are produced by default) - let -x option work to have graphical output - fix VCD missing 'echo'
302 lines
10 KiB
Bash
Executable File
302 lines
10 KiB
Bash
Executable File
#!/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.0 (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_s1
|
|
# 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)
|
|
# MME+SP-GW executable have to be launched by your own (run_hss, run_epc) before this script is invoked.
|
|
#
|
|
|
|
|
|
|
|
###########################################################
|
|
THIS_SCRIPT_PATH=$(dirname $(readlink -f $0))
|
|
. $THIS_SCRIPT_PATH/build_helper
|
|
###########################################################
|
|
|
|
function trim2()
|
|
{
|
|
local var=$@
|
|
var="${var#"${var%%[![:space:]]*}"}" # remove leading whitespace characters
|
|
var="${var%"${var##*[![:space:]]}"}" # remove trailing whitespace characters
|
|
echo -n "$var"
|
|
}
|
|
|
|
function is_tun_interface()
|
|
{
|
|
my_bool=1
|
|
for var in "$@"
|
|
do
|
|
if [ "a$var" == "a" ]; then
|
|
echo "0";
|
|
return;
|
|
fi
|
|
if [[ "$var" != *tun* ]]; then
|
|
echo "0";
|
|
return;
|
|
fi
|
|
done
|
|
echo "$my_bool"
|
|
}
|
|
|
|
|
|
function help()
|
|
{
|
|
echo_error " "
|
|
echo_error "Usage: start_enb_ue_virt_s1 [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 " -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 " -g, --gdb Run with GDB."
|
|
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 " "
|
|
echo_error " A simple data traffic test example: ping -m 1 -I oip1 192.168.12.100"
|
|
}
|
|
|
|
|
|
|
|
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_mme.conf
|
|
local CONFIG_FILE_ENB=$DEFAULT_CONFIG_FILE_ENB
|
|
local MSC_DIR="/tmp"
|
|
|
|
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;
|
|
;;
|
|
-l | --log-level)
|
|
echo "setting the log level to $2"
|
|
exe_arguments="$exe_arguments -l $2"
|
|
shift 2;
|
|
;;
|
|
-g | --gdb)
|
|
run_gdb=1
|
|
echo "setting GDB flag to: $GDB"
|
|
shift;
|
|
;;
|
|
-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
|
|
# can omit file name if last arg on the line
|
|
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
|
|
;;
|
|
|
|
-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 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"
|
|
|
|
|
|
|
|
#######################################################
|
|
# SOURCE CONFIG FILE
|
|
#######################################################
|
|
rm -f /tmp/source.txt
|
|
VARIABLES="
|
|
ENB_INTERFACE_NAME_FOR_S1_MME\|\
|
|
ENB_IPV4_ADDRESS_FOR_S1_MME\|\
|
|
ENB_INTERFACE_NAME_FOR_S1U\|\
|
|
ENB_IPV4_ADDRESS_FOR_S1U"
|
|
|
|
VARIABLES=$(echo $VARIABLES | sed -e 's/\\r//g')
|
|
VARIABLES=$(echo $VARIABLES | tr -d ' ')
|
|
cat $CONFIG_FILE_ENB | grep -w "$VARIABLES"| tr -d " " | tr -d ";" > /tmp/source.txt
|
|
source /tmp/source.txt
|
|
|
|
declare ENB_IPV4_NETMASK_FOR_S1_MME=$( echo $ENB_IPV4_ADDRESS_FOR_S1_MME | cut -f2 -d '/')
|
|
declare ENB_IPV4_NETMASK_FOR_S1U=$( echo $ENB_IPV4_ADDRESS_FOR_S1U | cut -f2 -d '/')
|
|
|
|
ENB_IPV4_ADDRESS_FOR_S1_MME=$( echo $ENB_IPV4_ADDRESS_FOR_S1_MME | cut -f1 -d '/')
|
|
ENB_IPV4_ADDRESS_FOR_S1U=$( echo $ENB_IPV4_ADDRESS_FOR_S1U | cut -f1 -d '/')
|
|
|
|
|
|
is_tun=`is_tun_interface $ENB_INTERFACE_NAME_FOR_S1_MME $ENB_INTERFACE_NAME_FOR_S1U`
|
|
# if [ $is_tun = "1" ]; then
|
|
# openvpn --mktun --dev $ENB_INTERFACE_NAME_FOR_S1U;sync
|
|
# openvpn --mktun --dev $ENB_INTERFACE_NAME_FOR_S1_MME;sync
|
|
# ip -4 addr add $ENB_IPV4_ADDRESS_FOR_S1U/$ENB_IPV4_NETMASK_FOR_S1U dev $ENB_INTERFACE_NAME_FOR_S1U;sync
|
|
# ip -4 addr add $ENB_IPV4_ADDRESS_FOR_S1_MME/$ENB_IPV4_NETMASK_FOR_S1_MME dev $ENB_INTERFACE_NAME_FOR_S1_MME;sync
|
|
# ifconfig $ENB_INTERFACE_NAME_FOR_S1U up;sync
|
|
# ifconfig $ENB_INTERFACE_NAME_FOR_S1_MME up;sync
|
|
# echo_success "Configured local eNB S1 tun interfaces"
|
|
# else
|
|
# echo_success "eNB S1 tun interfaces should be ethernet interfaces (no tunnels configured)"
|
|
# fi
|
|
|
|
##################################################
|
|
# LAUNCH eNB + UE executable
|
|
##################################################
|
|
pkill oaisim
|
|
rmmod ue_ip > /dev/null 2>&1
|
|
|
|
echo_success "Bringup UE interface..."
|
|
insmod $OPENAIR_DIR/targets/bin/ue_ip.ko
|
|
|
|
ip route flush cache
|
|
|
|
# Check table 200 lte in /etc/iproute2/rt_tables
|
|
fgrep lte /etc/iproute2/rt_tables > /dev/null
|
|
if [ $? -ne 0 ]; then
|
|
echo "200 lte " >> /etc/iproute2/rt_tables
|
|
fi
|
|
|
|
exe_arguments="$exe_arguments -s15 -AAWGN -y1 -b1 -u1 -Q0"
|
|
|
|
cd $OPENAIR_DIR/targets/bin
|
|
|
|
|
|
if [ $run_mscgen -eq 1 ]; then
|
|
rm -f /tmp/openair.msc.*
|
|
fi
|
|
|
|
if [ $run_gdb -eq 0 ]; then
|
|
exec $OPENAIR_DIR/targets/bin/oaisim.Rel14 $exe_arguments | tee /tmp/enb_ue_s1.log.txt
|
|
else
|
|
touch ~/.gdb_enb_ue_s1
|
|
chmod 777 ~/.gdb_enb_ue_s1
|
|
echo "file $OPENAIR_DIR/targets/bin/oaisim.Rel14" > ~/.gdb_enb_ue_s1
|
|
echo "set args $exe_arguments" >> ~/.gdb_enb_ue_s1
|
|
echo "run" >> ~/.gdb_enb_ue_s1
|
|
cat ~/.gdb_enb_ue_s1
|
|
gdb -n -x ~/.gdb_enb_ue_s1
|
|
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
|
|
|
|
}
|
|
|
|
sudo echo
|
|
is_sudo=$?
|
|
if [[ "$is_sudo" -ne 0 ]]; then
|
|
echo_error "This script must be run by root or a sudo'er"
|
|
echo
|
|
exit 1
|
|
fi
|
|
|
|
main "$@"
|