384 lines
17 KiB
Bash
Executable File
384 lines
17 KiB
Bash
Executable File
#!/bin/bash
|
|
################################################################################
|
|
# OpenAirInterface
|
|
# Copyright(c) 1999 - 2014 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) any later 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 start_epc.bash
|
|
# 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 MME+S/P-GW (all in one executable, on one host)
|
|
# Depending on configuration files, it can be instanciated a virtual switch
|
|
# setting or a VLAN setting.
|
|
#
|
|
###########################################################################################################################
|
|
# VIRTUAL BOX SETTING
|
|
###########################################################################################################################
|
|
# NETWORK SETTING AT EURECOM IN EXPERIMENTAL NETWORK (192.168.12.X)
|
|
#
|
|
#
|
|
# INTERNET GW 192.168.12.100
|
|
# |
|
|
# |
|
|
# 192.168.12.X/24 |
|
|
# +-----------+----------------+---+--+---------------------------------------+
|
|
# | COMPUTER 1| | eth0 | |
|
|
# +-----------+ +---+--+ |
|
|
# | | |
|
|
# | | |
|
|
# | ROUTER +-----+------+ |
|
|
# | |MASQUERADING| |
|
|
# | |FORWARDING | |
|
|
# | +-----+------+ |
|
|
# | | |
|
|
# | | |
|
|
# | | |
|
|
# | | |
|
|
# | | |
|
|
# | +---+--+ |
|
|
# | | eth1 | |
|
|
# +----------------------------+---+--+---------------------------------------+
|
|
# |router.eur
|
|
# 11 VLANS | INTERNET GW 192.168.12.100
|
|
# ids=[5..15] | |
|
|
# 192.168.13.X/24 | |
|
|
# +-----------+----------------+---+--+---------------------+---+--+----------+
|
|
# | COMPUTER 2| SGI | eth1 | Physical | eth0 | |
|
|
# +-----------+ +-+--+-+ Interface +------+ |
|
|
# | | | 'HOST_BRIDGED_IF_NAME' |
|
|
# | | | |
|
|
# | | | +-----------+ |
|
|
# | | | +------+ HSS | |
|
|
# | | +----------+ eth0 | (VM) | |
|
|
# | | +------+ | |
|
|
# | | | | |
|
|
# | | +-+------+--+ |
|
|
# | | |eth1 | hss.eur |
|
|
# | virtual box | +--+---+ |
|
|
# | +------------------+ | virtual box |
|
|
# | | bridged network | host-only |
|
|
# | | | network |
|
|
# | | | 192.168.57/24 |
|
|
# | | | |
|
|
# | +--+---+ +--+-----+ |
|
|
# | |eth0 | |vboxnet1| |
|
|
# | +-+------+--+192.168.56.101 192.168.56.1+-+--------++ |
|
|
# | | eNB 0 +------+ virtual box +--------+ MME | |
|
|
# | | (VM) |eth1 +----------------+vboxnet0| S+P/GW | |
|
|
# | | +------+ host-only +--------+(execu. on | |
|
|
# | | | network |COMPUTER2) | |
|
|
# | | | 192.168.56/24 | | |
|
|
# | | LTE eNB 1 | | | |
|
|
# | | LTE UEs | | | |
|
|
# | +-----------+ +-----------+ |
|
|
# | |
|
|
# | |
|
|
# +---------------------------------------------------------------------------+
|
|
#
|
|
|
|
###########################################################
|
|
THIS_SCRIPT_PATH=$(dirname $(readlink -f $0))
|
|
. $THIS_SCRIPT_PATH/utils.bash
|
|
. $THIS_SCRIPT_PATH/interfaces.bash
|
|
. $THIS_SCRIPT_PATH/networks.bash
|
|
###########################################################
|
|
|
|
control_c()
|
|
# run if user hits control-c
|
|
{
|
|
echo -en "\n*** Exiting... ***\n"
|
|
pkill -9 tshark
|
|
pkill -9 oai_epc
|
|
echo -en "\n*** Exit ***\n"
|
|
exit $?
|
|
}
|
|
|
|
|
|
|
|
if [ $# -eq 1 ]; then
|
|
declare -x CONFIG_FILE_DIR=$1
|
|
if [ ! -d $CONFIG_FILE_DIR ]; then
|
|
echo_error "ERROR while invoking this script, as first argument to this script you have to provide the path to a directory (./CONF/VLAN.VIRTUAL.$HOSTNAME for example) containing valid epc and enb config files"
|
|
exit 1
|
|
fi
|
|
else
|
|
echo_error "ERROR while invoking this script, as first argument to this script you have to provide the path to a directory (./CONF/VLAN.VIRTUAL.$HOSTNAME for example) containing valid epc and enb config files"
|
|
exit 1
|
|
fi
|
|
|
|
|
|
|
|
#check_install_epc_software
|
|
|
|
|
|
##################################
|
|
# Get or set OBJ DIR and compile #
|
|
##################################
|
|
# TEST IF EXIST
|
|
cd $OPENAIRCN_DIR
|
|
OBJ_DIR=`find . -maxdepth 1 -type d -iname obj*`
|
|
if [ ! -n "$OBJ_DIR" ]
|
|
then
|
|
OBJ_DIR="objs"
|
|
bash_exec "mkdir -m 777 ./$OBJ_DIR"
|
|
echo_success "Created $OBJ_DIR directory"
|
|
else
|
|
OBJ_DIR=`basename $OBJ_DIR`
|
|
fi
|
|
if [ ! -n "m4" ]
|
|
then
|
|
mkdir -m 777 m4
|
|
fi
|
|
if [ ! -f $OBJ_DIR/Makefile ]
|
|
then
|
|
autoreconf -i
|
|
echo_success "Invoking autogen"
|
|
bash_exec "./autogen.sh"
|
|
cd ./$OBJ_DIR
|
|
echo_success "Invoking configure"
|
|
../configure HAVE_CHECK=true --enable-debug --enable-standalone-epc --enable-raw-socket-for-sgi LDFLAGS=-L/usr/local/lib
|
|
else
|
|
cd ./$OBJ_DIR
|
|
fi
|
|
|
|
pkill oai_epc
|
|
pkill tshark
|
|
|
|
if [ -f Makefile ]
|
|
then
|
|
echo_success "Compiling..."
|
|
make -j `cat /proc/cpuinfo | grep processor | wc -l`
|
|
if [ $? -ne 0 ]; then
|
|
echo_error "Build failed, exiting"
|
|
exit 1
|
|
fi
|
|
else
|
|
echo_error "Configure failed, exiting"
|
|
exit 1
|
|
fi
|
|
|
|
|
|
cd $THIS_SCRIPT_PATH
|
|
#######################################################
|
|
# FIND CONFIG FILE
|
|
#######################################################
|
|
SEARCHED_CONFIG_FILE_EPC="epc*.conf"
|
|
CONFIG_FILE_EPC=`find $CONFIG_FILE_DIR -iname $SEARCHED_CONFIG_FILE_EPC`
|
|
if [ -f $CONFIG_FILE_EPC ]; then
|
|
echo_warning "EPC config file found is now $CONFIG_FILE_EPC"
|
|
else
|
|
echo_error "EPC config file not found, exiting (searched for $SEARCHED_CONFIG_FILE_EPC)"
|
|
exit 1
|
|
fi
|
|
|
|
SEARCHED_CONFIG_FILE_ENB="enb*.conf"
|
|
CONFIG_FILE_ENB=`find $CONFIG_FILE_DIR -iname $SEARCHED_CONFIG_FILE_ENB`
|
|
if [ -f $CONFIG_FILE_ENB ]; then
|
|
echo_warning "eNB config file found is now $CONFIG_FILE_ENB"
|
|
else
|
|
echo_error "eNB config file not found, exiting"
|
|
exit 1
|
|
fi
|
|
|
|
|
|
|
|
#######################################################
|
|
# SOURCE CONFIG FILE
|
|
#######################################################
|
|
rm -f /tmp/source.txt
|
|
VARIABLES="
|
|
GNU_DEBUGGER\|\
|
|
ENB_INTERFACE_NAME_FOR_S1_MME\|\
|
|
ENB_IPV4_ADDRESS_FOR_S1_MME\|\
|
|
ENB_INTERFACE_NAME_FOR_S1U\|\
|
|
ENB_IPV4_ADDRESS_FOR_S1U\|\
|
|
MME_INTERFACE_NAME_FOR_S6A\|\
|
|
MME_IPV4_ADDRESS_FOR_S6A\|\
|
|
MME_INTERFACE_NAME_FOR_S1_MME\|\
|
|
MME_IPV4_ADDRESS_FOR_S1_MME\|\
|
|
MME_INTERFACE_NAME_FOR_S11_MME\|\
|
|
MME_IPV4_ADDRESS_FOR_S11_MME\|\
|
|
HSS_INTERFACE_NAME_FOR_S6A\|\
|
|
HSS_IPV4_ADDRESS_FOR_S6A\|\
|
|
SGW_INTERFACE_NAME_FOR_S11\|\
|
|
SGW_IPV4_ADDRESS_FOR_S11\|\
|
|
SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP\|\
|
|
SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP\|\
|
|
SGW_INTERFACE_NAME_FOR_S5_S8_UP\|\
|
|
SGW_IPV4_ADDRESS_FOR_S5_S8_UP\|\
|
|
PGW_INTERFACE_NAME_FOR_S5_S8\|\
|
|
PGW_IPV4_ADDRESS_FOR_S5_S8\|\
|
|
PGW_INTERFACE_NAME_FOR_SGI\|\
|
|
PGW_IPV4_ADDR_FOR_SGI"
|
|
|
|
VARIABLES=$(echo $VARIABLES | sed -e 's/\\r//g')
|
|
VARIABLES=$(echo $VARIABLES | tr -d ' ')
|
|
cat $CONFIG_FILE_EPC | grep -w "$VARIABLES"| tr -d " " | tr -d ";" > /tmp/source.txt
|
|
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 '/')
|
|
declare MME_IPV4_NETMASK_FOR_S1_MME=$( echo $MME_IPV4_ADDRESS_FOR_S1_MME | cut -f2 -d '/')
|
|
declare MME_IPV4_NETMASK_FOR_S11_MME=$( echo $MME_IPV4_ADDRESS_FOR_S11_MME | cut -f2 -d '/')
|
|
declare MME_IPV4_NETMASK_FOR_S6A=$( echo $MME_IPV4_ADDRESS_FOR_S6A | cut -f2 -d '/')
|
|
declare SGW_IPV4_NETMASK_FOR_S11=$( echo $SGW_IPV4_ADDRESS_FOR_S11 | cut -f2 -d '/')
|
|
declare SGW_IPV4_NETMASK_FOR_S1U_S12_S4_UP=$(echo $SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP | cut -f2 -d '/')
|
|
declare SGW_IPV4_NETMASK_FOR_S5_S8_UP=$( echo $SGW_IPV4_ADDRESS_FOR_S5_S8_UP | cut -f2 -d '/')
|
|
declare PGW_IPV4_NETMASK_FOR_S5_S8=$( echo $PGW_IPV4_ADDRESS_FOR_S5_S8 | cut -f2 -d '/')
|
|
declare PGW_IPV4_NETMASK_FOR_SGI=$( echo $PGW_IPV4_ADDR_FOR_SGI | 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 '/')
|
|
MME_IPV4_ADDRESS_FOR_S1_MME=$( echo $MME_IPV4_ADDRESS_FOR_S1_MME | cut -f1 -d '/')
|
|
MME_IPV4_ADDRESS_FOR_S11_MME=$( echo $MME_IPV4_ADDRESS_FOR_S11_MME | cut -f1 -d '/')
|
|
SGW_IPV4_ADDRESS_FOR_S11=$( echo $SGW_IPV4_ADDRESS_FOR_S11 | cut -f1 -d '/')
|
|
SGW_IPV4_ADDRESS_FOR_S6A=$( echo $SGW_IPV4_ADDRESS_FOR_S6A | cut -f1 -d '/')
|
|
SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP=$( echo $SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP | cut -f1 -d '/')
|
|
SGW_IPV4_ADDRESS_FOR_S5_S8_UP=$( echo $SGW_IPV4_ADDRESS_FOR_S5_S8_UP | cut -f1 -d '/')
|
|
PGW_IPV4_ADDRESS_FOR_S5_S8=$( echo $PGW_IPV4_ADDRESS_FOR_S5_S8 | cut -f1 -d '/')
|
|
PGW_IPV4_ADDR_FOR_SGI=$( echo $PGW_IPV4_ADDR_FOR_SGI | cut -f1 -d '/')
|
|
|
|
#is_vlan_interface $MME_INTERFACE_NAME_FOR_S1_MME \
|
|
# $SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP
|
|
|
|
|
|
#if [ $? -eq 1 ]; then
|
|
# echo_success "Found open VLAN network configuration"
|
|
# clean_epc_vlan_network
|
|
# build_mme_spgw_vlan_network
|
|
#else
|
|
# clean_epc_vlan_network
|
|
#create_sgi_vlans
|
|
delete_sgi_vlans
|
|
#fi
|
|
|
|
get_mac_router
|
|
|
|
##################################################
|
|
# LAUNCH MME + S+P-GW executable
|
|
##################################################
|
|
|
|
cd $THIS_SCRIPT_PATH
|
|
if [ ! -d "OUTPUT/"$HOSTNAME ]
|
|
then
|
|
bash_exec "mkdir -p -m 777 ./OUTPUT/$HOSTNAME"
|
|
echo_success "Created OUTPUT/$HOSTNAME directory"
|
|
fi
|
|
|
|
|
|
ITTI_LOG_FILE=itti_mme.$HOSTNAME.log
|
|
#rotate_log_file $THIS_SCRIPT_PATH/OUTPUT/$HOSTNAME/$ITTI_LOG_FILE
|
|
|
|
STDOUT_LOG_FILE=stdout_mme.$HOSTNAME.log
|
|
#rotate_log_file $THIS_SCRIPT_PATH/OUTPUT/$HOSTNAME/$STDOUT_LOG_FILE
|
|
|
|
PCAP_S1C_LOG_FILE=tshark_mme_s1c.$HOSTNAME.pcap
|
|
#rotate_log_file $THIS_SCRIPT_PATH/OUTPUT/$HOSTNAME/$PCAP_S1C_LOG_FILE
|
|
|
|
PCAP_S6A_LOG_FILE=tshark_mme_s6a.$HOSTNAME.pcap
|
|
#rotate_log_file $THIS_SCRIPT_PATH/OUTPUT/$HOSTNAME/$PCAP_S6A_LOG_FILE
|
|
|
|
PCAP_S6A_S1C_LOG_FILE=tshark_mme_s6a_s1c.$HOSTNAME.pcap
|
|
|
|
PCAP_SGI_LOG_FILE=tshark_mme_sgi.$HOSTNAME.pcap
|
|
|
|
|
|
touch $THIS_SCRIPT_PATH/kill_epc.bash
|
|
echo '#!/bin/bash' > $THIS_SCRIPT_PATH/kill_epc.bash
|
|
echo "pkill -P $$" >> $THIS_SCRIPT_PATH/kill_epc.bash
|
|
chmod 777 $THIS_SCRIPT_PATH/kill_epc.bash
|
|
|
|
|
|
trap control_c SIGINT
|
|
|
|
echo_success "Resolving hss.eur"
|
|
HSS_IP=$(get_ip hss.eur)
|
|
echo_success "HSS_IP: $HSS_IP"
|
|
|
|
HSS_ROUTE=$(ip route get $HSS_IP | grep $HSS_IP )
|
|
HSS_ROUTE_IS_LOCAL=`echo $HSS_ROUTE | cut -d ' ' -f 1`
|
|
if [ "x$HSS_ROUTE_IS_LOCAL" == "xlocal" ]; then
|
|
MME_INTERFACE_NAME_FOR_S6A=`ip route get $HSS_IP | grep $HSS_IP | cut -d ' ' -f 4`
|
|
else
|
|
MME_INTERFACE_NAME_FOR_S6A=`ip route get $HSS_IP | grep $HSS_IP | cut -d ' ' -f 3`
|
|
fi
|
|
|
|
echo_success "MME_INTERFACE_NAME_FOR_S1_MME : $MME_INTERFACE_NAME_FOR_S1_MME"
|
|
echo_success "MME_INTERFACE_NAME_FOR_S6A : $MME_INTERFACE_NAME_FOR_S6A"
|
|
|
|
# see http://www.coverfire.com/articles/queueing-in-the-linux-network-stack/
|
|
bash_exec "ethtool -A $MME_INTERFACE_NAME_FOR_S1_MME autoneg off rx off tx off"
|
|
bash_exec "ethtool -G $MME_INTERFACE_NAME_FOR_S1_MME rx 4096 tx 4096"
|
|
bash_exec "ethtool -C $MME_INTERFACE_NAME_FOR_S1_MME rx-usecs 3"
|
|
bash_exec "ifconfig $MME_INTERFACE_NAME_FOR_S1_MME txqueuelen 1000"
|
|
|
|
if [ x$MME_INTERFACE_NAME_FOR_S1_MME != x$SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP ]; then
|
|
bash_exec "ethtool -A $SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP autoneg off rx off tx off"
|
|
bash_exec "ethtool -G $SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP rx 4096 tx 4096"
|
|
bash_exec "ethtool -C $SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP rx-usecs 3"
|
|
bash_exec "ifconfig $SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP txqueuelen 1000"
|
|
fi
|
|
|
|
if [ x$MME_INTERFACE_NAME_FOR_S1_MME == x$MME_INTERFACE_NAME_FOR_S6A ]; then
|
|
nohup tshark -i $MME_INTERFACE_NAME_FOR_S1_MME -f "not port 22" -w $THIS_SCRIPT_PATH/OUTPUT/$HOSTNAME/$PCAP_S6A_S1C_LOG_FILE &
|
|
else
|
|
nohup tshark -i $MME_INTERFACE_NAME_FOR_S1_MME -f "not port 22" -w $THIS_SCRIPT_PATH/OUTPUT/$HOSTNAME/$PCAP_S1C_LOG_FILE &
|
|
nohup tshark -i $MME_INTERFACE_NAME_FOR_S6A -f "not port 22" -w $THIS_SCRIPT_PATH/OUTPUT/$HOSTNAME/$PCAP_S6A_LOG_FILE &
|
|
fi
|
|
|
|
if [ x$PGW_INTERFACE_NAME_FOR_SGI != xnone ]; then
|
|
nohup tshark -i $PGW_INTERFACE_NAME_FOR_SGI -f "not port 22" -w $THIS_SCRIPT_PATH/OUTPUT/$HOSTNAME/$PCAP_SGI_LOG_FILE &
|
|
fi
|
|
|
|
wait_process_started tshark
|
|
|
|
|
|
cd $OPENAIRCN_DIR/$OBJ_DIR
|
|
echo "GNU_DEBUGGER:"$GNU_DEBUGGER
|
|
|
|
if [ "x$GNU_DEBUGGER" == "xyes" ]; then
|
|
echo_success "Running with GDB"
|
|
touch .gdbinit
|
|
echo "file $OPENAIRCN_DIR/$OBJ_DIR/OAI_EPC/oai_epc" > ~/.gdbinit
|
|
echo "set args -K $THIS_SCRIPT_PATH/OUTPUT/$HOSTNAME/$ITTI_LOG_FILE -c $THIS_SCRIPT_PATH/$CONFIG_FILE_EPC" >> ~/.gdbinit
|
|
# echo "b encode_eps_mobile_identity" >> ~/.gdbinit
|
|
echo "run" >> ~/.gdbinit
|
|
gdb 2>&1 | tee $THIS_SCRIPT_PATH/OUTPUT/$HOSTNAME/$STDOUT_LOG_FILE
|
|
else
|
|
echo_success "Running without GDB"
|
|
$OPENAIRCN_DIR/$OBJ_DIR/OAI_EPC/oai_epc -K $THIS_SCRIPT_PATH/OUTPUT/$HOSTNAME/$ITTI_LOG_FILE -c $THIS_SCRIPT_PATH/$CONFIG_FILE_EPC 2>&1 | tee $THIS_SCRIPT_PATH/OUTPUT/$HOSTNAME/$STDOUT_LOG_FILE
|
|
fi
|
|
|