#!/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_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 " -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 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 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" ;; -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_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 } 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 "$@"