Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG UE
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lizhongxiao
OpenXG UE
Commits
589b4efd
Commit
589b4efd
authored
Jan 13, 2022
by
Laurent THOMAS
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
code review comments + re-test
parent
ca82ca55
Changes
20
Show whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
116 additions
and
2269 deletions
+116
-2269
cmake_targets/build_oai
cmake_targets/build_oai
+1
-1
cmake_targets/install_external_packages.ubuntu20
cmake_targets/install_external_packages.ubuntu20
+0
-11
cmake_targets/nas_sim_tools/CMakeLists.txt
cmake_targets/nas_sim_tools/CMakeLists.txt
+1
-0
cmake_targets/tools/build_helper
cmake_targets/tools/build_helper
+1
-1
common/utils/system.c
common/utils/system.c
+1
-1
common/utils/system.h
common/utils/system.h
+3
-4
common/utils/utils.c
common/utils/utils.c
+0
-16
common/utils/utils.h
common/utils/utils.h
+99
-5
executables/main-ocp.c
executables/main-ocp.c
+1
-1
executables/nr-softmodem.c
executables/nr-softmodem.c
+1
-1
executables/nr-uesoftmodem.c
executables/nr-uesoftmodem.c
+1
-1
executables/ocp-gnb.c
executables/ocp-gnb.c
+1
-1
openair1/PHY/TOOLS/calibration_test.c
openair1/PHY/TOOLS/calibration_test.c
+1
-1
openair1/PHY/impl_defs_top.h
openair1/PHY/impl_defs_top.h
+1
-46
openair2/COMMON/openair_defs.h
openair2/COMMON/openair_defs.h
+1
-21
openair2/SIMULATION/NR_RRC/itti_sim.c
openair2/SIMULATION/NR_RRC/itti_sim.c
+1
-1
targets/RT/USER/lte-softmodem.c
targets/RT/USER/lte-softmodem.c
+1
-1
targets/RT/USER/lte-uesoftmodem.c
targets/RT/USER/lte-uesoftmodem.c
+1
-1
targets/build_helper.bash
targets/build_helper.bash
+0
-1315
targets/build_oai.bash
targets/build_oai.bash
+0
-840
No files found.
cmake_targets/build_oai
View file @
589b4efd
...
...
@@ -707,7 +707,7 @@ function main() {
# generate USIM data
if
[
-f
$dbin
/conf2uedata
]
;
then
install_nas_tools
$conf_nvram_path
$gen_nvram_path
install_nas_tools
$conf_nvram_path
$gen_nvram_path
"
$dlog
/conf2uedata.txt"
echo_info
"Copying UE specific part to
$DIR
/
$build_dir
/build"
cp
-Rvf
$dbin
/.ue_emm.nvram0
$DIR
/
$build_dir
/build
cp
-Rvf
$dbin
/.ue.nvram0
$DIR
/
$build_dir
/build
...
...
cmake_targets/install_external_packages.ubuntu20
View file @
589b4efd
...
...
@@ -452,17 +452,6 @@ install_asn1c_from_source(){
)
>
"
$asn1_install_log
"
2>&1
}
#################################################
# 2. compile
################################################
install_nas_tools
()
{
echo_success
"generate .ue_emm.nvram .ue.nvram"
./nvram
--gen
-c
"
$1
"
-o
"
$2
"
./usim
--gen
-c
"
$1
"
-o
"
$2
"
}
################################
# set_openair_env
###############################
...
...
cmake_targets/nas_sim_tools/CMakeLists.txt
View file @
589b4efd
...
...
@@ -15,6 +15,7 @@ set(CMAKE_C_FLAGS
set
(
OPENAIR_DIR $ENV{OPENAIR_DIR}
)
set
(
OPENAIR3_DIR $ENV{OPENAIR_DIR}/openair3
)
include_directories
(
${
OPENAIR_DIR
}
/openair2/COMMON
)
include_directories
(
${
OPENAIR_DIR
}
)
set
(
CONF2UEDATA_LIB_SRC
${
OPENAIR_DIR
}
/openair3/NAS/TOOLS/conf_emm.c
...
...
cmake_targets/tools/build_helper
View file @
589b4efd
...
...
@@ -901,7 +901,7 @@ install_nas_tools() {
if [ ! -f .usim.nvram0 ]; then
echo_success "generate .usim.nvram"
./usim --gen -c $1 -o $2
./usim --gen -c $1 -o $2
> "$3"
else
[ ./usim -nt .usim.nvram0 ] && ./usim --gen -c $1 -o $2
fi
...
...
common/utils/system.c
View file @
589b4efd
...
...
@@ -391,7 +391,7 @@ void thread_top_init(char *thread_name,
// Block CPU C-states deep sleep
void
configure_linux
(
void
)
{
void
set_latency_target
(
void
)
{
int
ret
;
static
int
latency_target_fd
=-
1
;
uint32_t
latency_target_value
=
2
;
// in microseconds
...
...
common/utils/system.h
View file @
589b4efd
...
...
@@ -43,9 +43,8 @@ int background_system(char *command);
void
start_background_system
(
void
);
void
set_latency_target
(
void
);
void
configure_linux
(
void
);
void
threadCreate
(
pthread_t
*
t
,
void
*
(
*
func
)(
void
*
),
void
*
param
,
char
*
name
,
int
affinity
,
int
priority
);
void
threadCreate
(
pthread_t
*
t
,
void
*
(
*
func
)(
void
*
),
void
*
param
,
char
*
name
,
int
affinity
,
int
priority
);
#define SCHED_OAI SCHED_RR
#define OAI_PRIORITY_RT_LOW sched_get_priority_min(SCHED_OAI)
...
...
@@ -65,7 +64,7 @@ void thread_top_init(char *thread_name,
int
checkIfFedoraDistribution
(
void
);
int
checkIfGenericKernelOnFedora
(
void
);
int
checkIfInsideContainer
(
void
);
int
rt_sleep_ns
(
uint64_t
x
);
int
rt_sleep_ns
(
uint64_t
x
);
#ifdef __cplusplus
}
#endif
...
...
common/utils/utils.c
View file @
589b4efd
...
...
@@ -7,23 +7,7 @@
#include <errno.h>
#include "utils.h"
void
*
calloc_or_fail
(
size_t
size
)
{
void
*
ptr
=
calloc
(
1
,
size
);
if
(
ptr
==
NULL
)
{
fprintf
(
stderr
,
"[UE] Failed to calloc %zu bytes"
,
size
);
exit
(
EXIT_FAILURE
);
}
return
ptr
;
}
void
*
malloc_or_fail
(
size_t
size
)
{
void
*
ptr
=
malloc
(
size
);
if
(
ptr
==
NULL
)
{
fprintf
(
stderr
,
"[UE] Failed to malloc %zu bytes"
,
size
);
exit
(
EXIT_FAILURE
);
}
return
ptr
;
}
const
char
*
hexdump
(
const
void
*
data
,
size_t
data_len
,
char
*
out
,
size_t
out_len
)
{
...
...
common/utils/utils.h
View file @
589b4efd
#ifndef _UTILS_H
#define _UTILS_H
#include <stdint.h>
#include <sys/types.h>
#ifdef __cplusplus
extern
"C"
{
#endif
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <sys/types.h>
#include <common/utils/assertions.h>
#ifdef MALLOC_TRACE
#define malloc myMalloc
#endif
#define sizeofArray(a) (sizeof(a)/sizeof(*(a)))
void
*
calloc_or_fail
(
size_t
size
);
void
*
malloc_or_fail
(
size_t
size
);
const
char
*
hexdump
(
const
void
*
data
,
size_t
data_len
,
char
*
out
,
size_t
out_len
);
#define cmax(a,b) ((a>b) ? (a) : (b))
#define cmax3(a,b,c) ((cmax(a,b)>c) ? (cmax(a,b)) : (c))
#define cmin(a,b) ((a<b) ? (a) : (b))
#ifdef __cplusplus
#ifdef min
#undef min
#undef max
#endif
#else
#define max(a,b) cmax(a,b)
#define min(a,b) cmin(a,b)
#endif
#ifndef malloc16
# ifdef __AVX2__
# define malloc16(x) memalign(32,x+32)
# else
# define malloc16(x) memalign(16,x+16)
# endif
#endif
#define free16(y,x) free(y)
#define bigmalloc malloc
#define bigmalloc16 malloc16
#define openair_free(y,x) free((y))
#define PAGE_SIZE 4096
#define free_and_zero(PtR) do { \
if (PtR) { \
free(PtR); \
PtR = NULL; \
} \
} while (0)
static
inline
void
*
malloc16_clear
(
size_t
size
)
{
#ifdef __AVX2__
void
*
ptr
=
memalign
(
32
,
size
+
32
);
#else
void
*
ptr
=
memalign
(
16
,
size
+
16
);
#endif
DevAssert
(
ptr
);
memset
(
ptr
,
0
,
size
);
return
ptr
;
}
static
inline
void
*
calloc_or_fail
(
size_t
size
)
{
void
*
ptr
=
calloc
(
1
,
size
);
if
(
ptr
==
NULL
)
{
fprintf
(
stderr
,
"[UE] Failed to calloc %zu bytes"
,
size
);
exit
(
EXIT_FAILURE
);
}
return
ptr
;
}
static
inline
void
*
malloc_or_fail
(
size_t
size
)
{
void
*
ptr
=
malloc
(
size
);
if
(
ptr
==
NULL
)
{
fprintf
(
stderr
,
"[UE] Failed to malloc %zu bytes"
,
size
);
exit
(
EXIT_FAILURE
);
}
return
ptr
;
}
#if !defined (msg)
# define msg(aRGS...) LOG_D(PHY, ##aRGS)
#endif
#ifndef malloc16
# ifdef __AVX2__
# define malloc16(x) memalign(32,x)
# else
# define malloc16(x) memalign(16,x)
# endif
#endif
#define free16(y,x) free(y)
#define bigmalloc malloc
#define bigmalloc16 malloc16
#define openair_free(y,x) free((y))
#define PAGE_SIZE 4096
#define PAGE_MASK 0xfffff000
#define virt_to_phys(x) (x)
const
char
*
hexdump
(
const
void
*
data
,
size_t
data_len
,
char
*
out
,
size_t
out_len
);
// Converts an hexadecimal ASCII coded digit into its value. **
int
hex_char_to_hex_value
(
char
c
);
...
...
executables/main-ocp.c
View file @
589b4efd
...
...
@@ -1150,7 +1150,7 @@ int main ( int argc, char **argv ) {
#if T_TRACER
T_Config_Init
();
#endif
configure_linux
();
set_latency_target
();
set_softmodem_sighandler
();
cpuf
=
get_cpu_freq_GHz
();
set_taus_seed
(
0
);
...
...
executables/nr-softmodem.c
View file @
589b4efd
...
...
@@ -656,7 +656,7 @@ int main( int argc, char **argv ) {
memset
(
&
openair0_cfg
[
0
],
0
,
sizeof
(
openair0_config_t
)
*
MAX_CARDS
);
memset
(
tx_max_power
,
0
,
sizeof
(
int
)
*
MAX_NUM_CCs
);
logInit
();
configure_linux
();
set_latency_target
();
printf
(
"Reading in command-line options
\n
"
);
get_options
();
...
...
executables/nr-uesoftmodem.c
View file @
589b4efd
...
...
@@ -523,7 +523,7 @@ int main( int argc, char **argv ) {
// init UE_PF_PO and mutex lock
pthread_mutex_init
(
&
ue_pf_po_mutex
,
NULL
);
memset
(
&
UE_PF_PO
[
0
][
0
],
0
,
sizeof
(
UE_PF_PO_t
)
*
NUMBER_OF_UE_MAX
*
MAX_NUM_CCs
);
configure_linux
();
set_latency_target
();
mlockall
(
MCL_CURRENT
|
MCL_FUTURE
);
if
(
IS_SOFTMODEM_DOSCOPE
)
{
...
...
executables/ocp-gnb.c
View file @
589b4efd
...
...
@@ -920,7 +920,7 @@ int main( int argc, char **argv ) {
# define PACKAGE_VERSION "UNKNOWN"
#endif
LOG_I
(
HW
,
"Version: %s
\n
"
,
PACKAGE_VERSION
);
configure_linux
();
set_latency_target
();
get_options
();
get_common_options
(
SOFTMODEM_GNB_BIT
);
AssertFatal
(
!
CONFIG_ISFLAGSET
(
CONFIG_ABORT
),
"Getting configuration failed
\n
"
);
...
...
openair1/PHY/TOOLS/calibration_test.c
View file @
589b4efd
...
...
@@ -42,7 +42,7 @@ int main(int argc, char **argv) {
get_common_options
(
SOFTMODEM_GNB_BIT
);
config_process_cmdline
(
cmdline_params
,
sizeof
(
cmdline_params
)
/
sizeof
(
paramdef_t
),
NULL
);
CONFIG_CLEARRTFLAG
(
CONFIG_NOEXITONHELP
);
configure_linux
();
set_latency_target
();
int
N_RB
=
50
;
...
...
openair1/PHY/impl_defs_top.h
View file @
589b4efd
...
...
@@ -107,11 +107,10 @@
* @}
*/
#include <common/utils/utils.h>
#include "defs_eNB.h"
#include "types.h"
/** @addtogroup _PHY_STRUCTURES_
* @{
*/
...
...
@@ -315,50 +314,6 @@ typedef struct {
#include "openairinterface5g_limits.h"
#include "assertions.h"
#define cmax(a,b) ((a>b) ? (a) : (b))
#define cmax3(a,b,c) ((cmax(a,b)>c) ? (cmax(a,b)) : (c))
#define cmin(a,b) ((a<b) ? (a) : (b))
#ifdef __cplusplus
#ifdef min
#undef min
#undef max
#endif
#else
#define max(a,b) cmax(a,b)
#define min(a,b) cmin(a,b)
#endif
#ifndef malloc16
# ifdef __AVX2__
# define malloc16(x) memalign(32,x+32)
# else
# define malloc16(x) memalign(16,x+16)
# endif
#endif
#define free16(y,x) free(y)
#define bigmalloc malloc
#define bigmalloc16 malloc16
#define openair_free(y,x) free((y))
#define PAGE_SIZE 4096
#define free_and_zero(PtR) do { \
if (PtR) { \
free(PtR); \
PtR = NULL; \
} \
} while (0)
static
inline
void
*
malloc16_clear
(
size_t
size
)
{
#ifdef __AVX2__
void
*
ptr
=
memalign
(
32
,
size
+
32
);
#else
void
*
ptr
=
memalign
(
16
,
size
+
16
);
#endif
DevAssert
(
ptr
);
memset
(
ptr
,
0
,
size
);
return
ptr
;
}
#endif //__PHY_IMPLEMENTATION_DEFS_H__
/**@}
*/
openair2/COMMON/openair_defs.h
View file @
589b4efd
...
...
@@ -24,26 +24,6 @@
#include <stdio.h>
#include <stdlib.h>
#if !defined (msg)
# define msg(aRGS...) LOG_D(PHY, ##aRGS)
#endif
#ifndef malloc16
# ifdef __AVX2__
# define malloc16(x) memalign(32,x)
# else
# define malloc16(x) memalign(16,x)
# endif
#endif
#define free16(y,x) free(y)
#define bigmalloc malloc
#define bigmalloc16 malloc16
#define openair_free(y,x) free((y))
#define PAGE_SIZE 4096
#define PAGE_MASK 0xfffff000
#define virt_to_phys(x) (x)
#define cmax(a,b) ((a>b) ? (a) : (b))
#define cmin(a,b) ((a<b) ? (a) : (b))
#include <common/utils/utils.h>
#endif //
/*__openair_DEFS_H__ */
openair2/SIMULATION/NR_RRC/itti_sim.c
View file @
589b4efd
...
...
@@ -546,7 +546,7 @@ int main( int argc, char **argv )
#endif
logInit
();
//
configure_linux
();
//
set_latency_target
();
printf
(
"Reading in command-line options
\n
"
);
get_options
();
...
...
targets/RT/USER/lte-softmodem.c
View file @
589b4efd
...
...
@@ -530,7 +530,7 @@ int main ( int argc, char **argv )
mode
=
normal_txrx
;
logInit
();
configure_linux
();
set_latency_target
();
printf
(
"Reading in command-line options
\n
"
);
get_options
();
...
...
targets/RT/USER/lte-uesoftmodem.c
View file @
589b4efd
...
...
@@ -557,7 +557,7 @@ int main( int argc, char **argv ) {
mode
=
normal_txrx
;
memset
(
&
openair0_cfg
[
0
],
0
,
sizeof
(
openair0_config_t
)
*
MAX_CARDS
);
logInit
();
configure_linux
();
set_latency_target
();
printf
(
"Reading in command-line options
\n
"
);
for
(
int
i
=
0
;
i
<
MAX_NUM_CCs
;
i
++
)
tx_max_power
[
i
]
=
23
;
...
...
targets/build_helper.bash
deleted
100755 → 0
View file @
ca82ca55
#/*
# * 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 build_helper.bash
# brief
# author Lionel Gauthier and Navid Nikaein
# company Eurecom
# email: lionel.gauthier@eurecom.fr and navid.nikaein@eurecom.fr
#
#######################################
# Helper Func
######################################
declare
ROOT_UID
=
0
declare
E_NOTROOT
=
67
declare
NUM_CPU
=
`
cat
/proc/cpuinfo |
grep
processor |
wc
-l
`
declare
OAI_INSTALLED
=
1
declare
PWD
=
`
pwd
`
declare
USER
=
`
whoami
`
declare
BUILD_FROM_MAKEFILE
=
0
declare
SUDO
=
''
declare
PW
=
''
declare
UBUNTU_REL
=
`
lsb_release
-r
|
cut
-f2
`
declare
UBUNTU_REL_NAME
=
`
lsb_release
-cs
`
set_build_from_makefile
(){
BUILD_FROM_MAKEFILE
=
$1
}
check_for_root_rights
()
{
# if [[ $EUID -ne $ROOT_EUID ]]; then
if
[
$USER
!=
"root"
]
;
then
SUDO
=
"sudo -E "
echo
"Run as a sudoers"
return
1
else
echo
"Run as a root"
return
0
fi
}
test_install_package
()
{
# usage: test_install_package package_name
if
[
$#
-eq
1
]
;
then
dpkg
-s
"
$1
"
>
/dev/null 2>&1
&&
{
echo
"
$1
is installed."
}
||
{
echo
"
$1
is not installed."
OAI_INSTALLED
=
0
$SUDO
apt-get
install
-y
$@
}
fi
}
test_uninstall_package
()
{
if
[
$#
-eq
1
]
;
then
dpkg
-s
"
$1
"
>
/dev/null 2>&1
&&
{
$SUDO
apt-get remove
--assume-yes
$1
echo
"
$1
is uninstalled."
}
||
{
echo
"
$1
is not installed."
}
fi
}
test_command_install_script
()
{
# usage: test_command_install_script searched_binary script_to_be_invoked_if_binary_not_found
command
-v
$1
>
/dev/null 2>&1
||
{
echo_warning
"Program
$1
is not installed. Trying installing it."
>
&2
;
bash
$2
;
command
-v
$1
>
/dev/null 2>&1
||
{
echo_fatal
"Program
$1
is not installed. Aborting."
>
&2
;
}
;
}
echo_success
"
$1
available"
}
check_for_machine_type
(){
MACHINE_TYPE
=
`
uname
-m
`
if
[
${
MACHINE_TYPE
}
=
"x86_64"
]
;
then
return
64
# 64-bit stuff here
else
if
[
${
MACHINE_TYPE
}
=
"i686"
]
;
then
return
32
# 32-bit stuff here
else
return
-1
fi
fi
}
####################################################
## OAI related functions
#####################################################
####################################################
# 1. install the required packages
####################################################
make_certs
(){
# for certtificate generation
rm
-rf
demoCA
mkdir
-m
777
-p
demoCA
echo
01
>
demoCA/serial
touch
demoCA/index.txt
echo
"creating the certificate"
user
=
$(
whoami
)
HOSTNAME
=
$(
hostname
-f
)
echo
"Creating certificate for user '
$HOSTNAME
'"
# CA self certificate
openssl req
-new
-batch
-x509
-days
3650
-nodes
-newkey
rsa:1024
-out
cacert.pem
-keyout
cakey.pem
-subj
/CN
=
eur/C
=
FR/ST
=
PACA/L
=
Aix/O
=
Eurecom/OU
=
CM
# openssl genrsa -out user.key.pem 1024
openssl genrsa
-out
hss.key.pem 1024
#openssl req -new -batch -out user.csr.pem -key user.key.pem -subj /CN=$HOSTNAME.eur/C=FR/ST=PACA/L=Aix/O=Eurecom/OU=CM
openssl req
-new
-batch
-out
hss.csr.pem
-key
hss.key.pem
-subj
/CN
=
hss.eur/C
=
FR/ST
=
PACA/L
=
Aix/O
=
Eurecom/OU
=
CM
openssl ca
-cert
cacert.pem
-keyfile
cakey.pem
-in
hss.csr.pem
-out
hss.cert.pem
-outdir
.
-batch
if
[
!
-d
/usr/local/etc/freeDiameter
]
;
then
echo
"Creating non existing directory: /usr/local/etc/freeDiameter/"
$SUDO
mkdir
/usr/local/etc/freeDiameter/
fi
echo
"Copying *.pem to /usr/local/etc/freeDiameter/"
$SUDO
cp
*
.pem /usr/local/etc/freeDiameter/
mv
*
.pem bin/
# openssl genrsa -out ubuntu.key.pem 1024
# openssl req -new -batch -x509 -out ubuntu.csr.pem -key ubuntu.key.pem -subj /CN=ubuntu.localdomain/C=FR/ST=BdR/L=Aix/O=fD/OU=Tests
# openssl ca -cert cacert.pem -keyfile cakey.pem -in ubuntu.csr.pem -out ubuntu.cert.pem -outdir . -batch
}
check_install_nettle
(){
if
[
!
-f
./.lock_oaibuild
]
;
then
if
[
$UBUNTU_REL
=
"12.04"
]
;
then
test_uninstall_package nettle-dev
test_uninstall_package nettle-bin
if
[
!
-d
/usr/local/src/
]
;
then
echo
"/usr/local/src/ doesn't exist please create one"
exit
-1
fi
if
[
!
-w
/usr/local/src/
]
;
then
echo
"You don't have permissions to write to /usr/local/src/, installing as a sudoer"
# exit -1
fi
cd
/usr/local/src/
echo
"Downloading nettle archive"
if
[
-f
nettle-2.5.tar.gz
]
;
then
$SUDO
rm
-f
nettle-2.5.tar.gz
fi
if
[
-f
nettle-2.5.tar
]
;
then
$SUDO
rm
-f
nettle-2.5.tar
fi
if
[
-d
nettle-2.5
]
;
then
$SUDO
rm
-rf
nettle-2.5/
fi
$SUDO
wget ftp://ftp.lysator.liu.se/pub/security/lsh/nettle-2.5.tar.gz
$SUDO
gunzip
nettle-2.5.tar.gz
$SUDO
echo
"Uncompressing nettle archive"
$SUDO
tar
-xf
nettle-2.5.tar
cd
nettle-2.5/
$SUDO
./configure
--disable-openssl
--enable-shared
--prefix
=
/usr
if
[
$?
-ne
0
]
;
then
exit
-1
fi
echo
"Compiling nettle"
$SUDO
make
-j
$NUM_CPU
$SUDO
make check
$SUDO
make
install
cd
../
fi
fi
}
check_install_freediamter
(){
if
[
$UBUNTU_REL
=
"12.04"
]
;
then
if
[
!
-d
/usr/local/src/
]
;
then
echo
"/usr/local/src/ doesn't exist please create one"
exit
-1
fi
if
[
!
-w
/usr/local/src/
]
;
then
echo
"You don't have permissions to write to /usr/local/src/, installing as a sudoer"
# exit -1
fi
cd
/usr/local/src/
echo
"Downloading nettle archive"
if
[
-f
nettle-2.5.tar.gz
]
;
then
$SUDO
rm
-f
nettle-2.5.tar.gz
fi
if
[
-f
nettle-2.5.tar
]
;
then
$SUDO
rm
-f
nettle-2.5.tar
fi
if
[
-d
nettle-2.5
]
;
then
$SUDO
rm
-rf
nettle-2.5/
fi
$SUDO
wget ftp://ftp.lysator.liu.se/pub/security/lsh/nettle-2.5.tar.gz
$SUDO
gunzip
nettle-2.5.tar.gz
$SUDO
echo
"Uncompressing nettle archive"
$SUDO
tar
-xf
nettle-2.5.tar
cd
nettle-2.5/
$SUDO
./configure
--disable-openssl
--enable-shared
--prefix
=
/usr
if
[
$?
-ne
0
]
;
then
exit
-1
fi
echo
"Compiling nettle"
$SUDO
make
-j
$NUM_CPU
$SUDO
make check
$SUDO
make
install
cd
../
fi
echo
"Downloading gnutls archive"
if
[
-f
gnutls-3.1.23.tar.xz
]
;
then
$SUDO
rm
-f
gnutls-3.1.23.tar.xz
fi
if
[
-d
gnutls-3.1.23/
]
;
then
$SUDO
rm
-rf
gnutls-3.1.23/
fi
test_uninstall_package libgnutls-dev
$SUDO
wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.1/gnutls-3.1.23.tar.xz
$SUDO
tar
-xf
gnutls-3.1.23.tar.xz
echo
"Uncompressing gnutls archive (
$PWD
)"
cd
gnutls-3.1.23/
$SUDO
./configure
--prefix
=
/usr
if
[
$?
-ne
0
]
;
then
exit
-1
fi
echo
"Compiling gnutls"
$SUDO
make
-j
$NUM_CPU
$SUDO
make
install
cd
../
echo
"Downloading freeDiameter archive"
if
[
-f
1.1.5.tar.gz
]
;
then
$SUDO
rm
-f
1.1.5.tar.gz
fi
if
[
-d
freeDiameter-1.1.5/
]
;
then
$SUDO
rm
-rf
freeDiameter-1.1.5/
fi
$SUDO
wget http://www.freediameter.net/hg/freeDiameter/archive/1.1.5.tar.gz
$SUDO
tar
-xzf
1.1.5.tar.gz
echo
"Uncompressing freeDiameter archive"
cd
freeDiameter-1.1.5
$SUDO
patch
-p1
<
$OPENAIR3_DIR
/S6A/freediameter/freediameter-1.1.5.patch
$SUDO
mkdir
build
cd
build
$SUDO
cmake
-DCMAKE_INSTALL_PREFIX
:PATH
=
/usr ../
if
[
$?
-ne
0
]
;
then
exit
-1
fi
echo
"Compiling freeDiameter"
$SUDO
make
-j
$NUM_CPU
#make help
$SUDO
make
test
$SUDO
sudo
make
install
# make_certs
}
test_is_host_reachable
()
{
ping
-c
1
$1
>
/dev/null
||
{
echo_fatal
"
$2
host
$1
does not respond to ping"
>
&2
;
}
echo_success
"
$2
host
$1
is reachable"
}
check_epc_s6a_certificate
()
{
if
[
-d
/usr/local/etc/freeDiameter
]
then
if
[
-f
/usr/local/etc/freeDiameter/user.cert.pem
]
then
full_hostname
=
`
cat
/usr/local/etc/freeDiameter/user.cert.pem |
grep
"Subject"
|
grep
"CN"
|
cut
-d
'='
-f6
`
if
[
a
$full_hostname
==
a
`
hostname
`
.
${
1
:-
'eur'
}
]
then
echo_success
"EPC S6A: Found valid certificate in /usr/local/etc/freeDiameter"
return
0
fi
fi
fi
echo_error
"EPC S6A: Did not find valid certificate in /usr/local/etc/freeDiameter"
echo_warning
"EPC S6A: generatting new certificate in /usr/local/etc/freeDiameter..."
cd
$OPENAIR3_DIR
/S6A/freediameter
./make_certs.sh
${
1
:-
'eur'
}
if
[
$#
-lt
2
]
;
then
check_epc_s6a_certificate
${
1
:-
'eur'
}
2
return
$?
else
exit
1
fi
}
check_hss_s6a_certificate
()
{
if
[
-d
/usr/local/etc/freeDiameter
]
;
then
if
[
-f
/usr/local/etc/freeDiameter/hss.cert.pem
]
;
then
full_hostname
=
`
cat
/usr/local/etc/freeDiameter/hss.cert.pem |
grep
"Subject"
|
grep
"CN"
|
cut
-d
'='
-f6
`
if
[
a
$full_hostname
==
a
`
hostname
`
.
${
1
:-
'eur'
}
]
then
echo_success
"HSS S6A: Found valid certificate in /usr/local/etc/freeDiameter"
return
0
else
echo_error
"Bad hss hostname found in cert file: "
$full_hostname
" hostname is "
`
hostname
`
fi
fi
fi
echo_error
"S6A: Did not find valid certificate in /usr/local/etc/freeDiameter"
echo_warning
"S6A: generatting new certificate in /usr/local/etc/freeDiameter..."
cd
$OPENAIR3_DIR
/OPENAIRHSS/conf
./make_certs.sh
${
1
:-
'eur'
}
if
[
$#
-lt
2
]
;
then
check_hss_s6a_certificate
${
1
:-
'eur'
}
2
return
$?
else
exit
1
fi
}
check_install_usrp_uhd_driver
(){
if
[
!
-f
/etc/apt/sources.list.d/ettus.list
]
;
then
$SUDO
bash
-c
'echo "deb http://files.ettus.com/binaries/uhd/repo/uhd/ubuntu/`lsb_release -cs` `lsb_release -cs` main" >> /etc/apt/sources.list.d/ettus.list'
$SUDO
apt-get update
fi
$SUDO
apt-get
install
-t
$UBUNTU_REL_NAME
uhd
test_install_package python
test_install_package libboost-all-dev
test_install_package libusb-1.0-0-dev
#test_install_package uhd
}
check_install_oai_software
()
{
if
[
!
-f
./.lock_oaibuild
]
;
then
$SUDO
apt-get update
if
[
$UBUNTU_REL
=
"12.04"
]
;
then
test_uninstall_package nettle-dev
test_uninstall_package nettle-bin
else
test_install_package nettle-dev
test_install_package nettle-bin
fi
test_install_package autoconf
test_install_package automake
test_install_package bison
test_install_package build-essential
test_install_package dialog
test_install_package flex
test_install_package gawk
test_install_package gcc
test_install_package gdb
test_install_package make
test_install_package cmake
test_install_package openssh-client
test_install_package openssh-server
sudo
service ssh start
test_install_package unzip
test_install_package autoconf
test_install_package automake
test_install_package bison
test_install_package build-essential
test_install_package check
test_install_package ethtool
test_install_package flex
test_install_package g++
test_install_package gawk
test_install_package gcc
test_install_package gccxml
test_install_package gdb
test_install_package guile-2.0-dev
test_install_package iperf
test_install_package iproute
test_install_package iptables
test_install_package libatlas-base-dev
test_install_package libatlas-dev
test_install_package libblas3gf
test_install_package libblas-dev
test_install_package liblapack-dev
test_install_package liblapack-dev
# if [ $MACHINE_ARCH = 64 ]; then
test_install_package libconfig8-dev
# else
# test_install_package libconfig-dev
# fi
test_install_package libforms-bin
test_install_package libforms-dev
test_install_package libgcrypt11-dev
test_install_package libgmp-dev
test_install_package libgtk-3-dev
test_install_package libidn11-dev
test_install_package libidn2-0-dev
test_install_package libpgm-dev
test_install_package libpgm-5.1-0
test_install_package libpthread-stubs0-dev
test_install_package libsctp1
test_install_package libsctp-dev
test_install_package libtasn1-3-dev
test_install_package libxml2
test_install_package libxml2-dev
# test_install_package linux-headers-`uname -r`
test_install_package openssl
test_install_package libssl-dev
test_install_package pkg-config
test_install_package python-dev
test_install_package python-pexpect
test_install_package sshfs
test_install_package subversion
test_install_package valgrind
test_install_package doxygen
test_install_package graphviz
# test_install_package libboost-all-dev
if
[
$OAI_INSTALLED
=
1
]
;
then
touch
./.lock_oaibuild
fi
else
echo_info
"All the required packages installed: skip"
fi
}
check_install_hss_software
()
{
if
[
!
-f
./.lock_oaibuild
]
;
then
$SUDO
apt-get update
if
[
$UBUNTU_REL
=
"12.04"
]
;
then
test_uninstall_package nettle-dev
test_uninstall_package nettle-bin
else
test_install_package nettle-dev
test_install_package nettle-bin
fi
test_install_package autoconf
test_install_package automake
test_install_package bison
test_install_package build-essential
test_install_package cmake
test_install_package cmake-curses-gui
test_install_package dialog
test_install_package dkms
test_install_package flex
test_install_package gawk
test_install_package gcc
test_install_package gdb
test_install_package guile-2.0-dev
test_install_package g++
test_install_package libgmp-dev
test_install_package libgcrypt11-dev
test_install_package libidn11-dev
test_install_package libidn2-0-dev
test_install_package libmysqlclient-dev
test_install_package libtasn1-3-dev
test_install_package libsctp1
test_install_package libsctp-dev
test_install_package libxml2-dev
# test_install_package linux-headers-`uname -r`
test_install_package make
test_install_package mysql-client
test_install_package mysql-server-core-5.5
test_install_package mysql-server
test_install_package openssh-client
test_install_package openssh-server
sudo
service ssh start
test_install_package phpmyadmin
test_install_package python-dev
test_install_package sshfs
test_install_package swig
test_install_package unzip
# test_install_package nettle-bin
# test_install_package nettle-dev
test_install_package valgrind
if
[
$OAI_INSTALLED
=
1
]
;
then
touch
./.lock_oaibuild
fi
else
echo_info
"All the required packages installed: skip"
fi
}
check_install_epc_software
()
{
if
[
!
-f
./.lock_oaibuild
]
;
then
$SUDO
apt-get update
if
[
$UBUNTU_REL
=
"12.04"
]
;
then
test_uninstall_package nettle-dev
test_uninstall_package nettle-bin
else
test_install_package nettle-dev
test_install_package nettle-bin
fi
test_install_package autoconf
test_install_package automake
test_install_package bison
test_install_package build-essential
test_install_package check
test_install_package cmake
test_install_package cmake-curses-gui
test_install_package dialog
test_install_package ethtool
test_install_package flex
test_install_package g++
test_install_package gawk
test_install_package gcc
test_install_package gccxml
test_install_package gdb
test_install_package guile-2.0-dev
test_install_package gtkwave
test_install_package iperf
test_install_package iproute
test_install_package iptables
test_install_package iptables-dev
test_install_package libatlas-base-dev
test_install_package libatlas-dev
test_install_package libblas
test_install_package libblas-dev
# if [ $MACHINE_ARCH = 64 ]; then
test_install_package libconfig8-dev
# else
# test_install_package libconfig-dev
# fi
test_install_package libforms-bin
test_install_package libforms-dev
test_install_package libgcrypt11-dev
test_install_package libgmp-dev
test_install_package libgtk-3-dev
test_install_package libidn11-dev
test_install_package libidn2-0-dev
test_install_package libmysqlclient-dev
test_install_package libpgm-dev
test_install_package libpthread-stubs0-dev
test_install_package libsctp1
test_install_package libsctp-dev
test_install_package libssl-dev
test_install_package libtasn1-3-dev
test_install_package libtool
test_install_package libxml2
test_install_package libxml2-dev
# test_install_package linux-headers-`uname -r`
test_install_package make
test_install_package openssh-client
test_install_package openssh-server
$SUDO
service ssh start
test_install_package openssl
test_install_package openvpn
test_install_package pkg-config
test_install_package python-dev
test_install_package sshfs
test_install_package subversion
test_install_package swig
test_install_package tshark
test_install_package uml-utilities
test_install_package unzip
test_install_package valgrind
test_install_package vlan
if
[
$OAI_INSTALLED
=
1
]
;
then
touch
./.lock_oaibuild
fi
else
echo_info
"All the required packages installed: skip"
fi
}
check_install_asn1c
(){
test_command_install_script
"asn1c"
"
$OPENAIR_TARGETS
/SCRIPTS/install_asn1c_0.9.24.modified.bash
$SUDO
"
# One mor check about version of asn1c
ASN1C_COMPILER_REQUIRED_VERSION_MESSAGE
=
"ASN.1 Compiler, v0.9.24"
ASN1C_COMPILER_VERSION_MESSAGE
=
`
asn1c
-h
2>&1 |
grep
-i
ASN
\.
1
\
Compiler
`
##ASN1C_COMPILER_VERSION_MESSAGE=`trim $ASN1C_COMPILER_VERSION_MESSAGE`
if
[
"
$ASN1C_COMPILER_VERSION_MESSAGE
"
!=
"
$ASN1C_COMPILER_REQUIRED_VERSION_MESSAGE
"
]
;
then
# diff <(echo -n "$ASN1C_COMPILER_VERSION_MESSAGE") <(echo -n "$ASN1C_COMPILER_REQUIRED_VERSION_MESSAGE")
echo_error
"Version of asn1c is not the required one, do you want to install the required one (overwrite installation) ? (Y/n)"
echo_error
"
$ASN1C_COMPILER_VERSION_MESSAGE
"
while
read
-r
-n
1
-s
answer
;
do
if
[[
$answer
=
[
YyNn]
]]
;
then
[[
$answer
=
[
Yy]
]]
&&
$OPENAIR_TARGETS
/SCRIPTS/install_asn1c_0.9.24.modified.bash
$SUDO
[[
$answer
=
[
Nn]
]]
&&
echo_error
"Version of asn1c is not the required one, exiting."
&&
exit
1
break
fi
done
fi
}
#################################################
# 2. compile
################################################
compile_hss
()
{
cd
$OPENAIR3_DIR
/OPENAIRHSS
if
[
"
$1
"
-eq
1
]
;
then
echo_info
"build a clean HSS"
rm
-rfv
obj
*
rm
-rfv
m4
rm
-rfv
.autom4
*
rm
-fv
configure
fi
OBJ_DIR
=
`
find
.
-maxdepth
1
-type
d
-iname
obj
*
`
if
[
!
-n
"
$OBJ_DIR
"
]
;
then
OBJ_DIR
=
"objs"
mkdir
--verbose
-m
777 ./
$OBJ_DIR
else
OBJ_DIR
=
`
basename
$OBJ_DIR
`
fi
if
[
!
-f
"
$OBJ_DIR
"
/Makefile
]
;
then
if
[
!
-d
m4
]
;
then
mkdir
--verbose
-m
777 m4
fi
echo_success
"Invoking autogen"
./autogen.sh
if
[
$?
-ne
0
]
;
then
return
1
fi
cd
$OBJ_DIR
echo_success
"Invoking configure"
../configure
if
[
$?
-ne
0
]
;
then
return
1
fi
else
cd
$OBJ_DIR
fi
if
[
-f
Makefile
]
;
then
echo_success
"Compiling..."
make
;
#-j $NUM_CPU
if
[
$?
-ne
0
]
;
then
echo_error
"Build failed, exiting"
return
1
else
return
0
fi
else
echo_error
"Configure failed, aborting"
fi
return
1
}
compile_epc
()
{
cd
$OPENAIR3_DIR
if
[
$1
=
1
]
;
then
echo_info
"build a clean EPC"
bash_exec
"rm -rf objs"
fi
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
[
!
-f
$OBJ_DIR
/Makefile
]
;
then
if
[
!
-n
"m4"
]
;
then
mkdir
-m
777 m4
fi
bash_exec
"autoreconf -i -f"
echo_success
"Invoking autogen"
bash_exec
"libtoolize"
bash_exec
"./autogen.sh"
cd
./
$OBJ_DIR
echo_success
"Invoking configure"
if
[
$DEBUG
-ne
0
]
;
then
../configure
--enable-debug
--enable-standalone-epc
--enable-gtp1u-in-kernel
LDFLAGS
=
-L
/usr/local/lib
else
../configure
--enable-standalone-epc
--enable-gtp1u-in-kernel
LDFLAGS
=
-L
/usr/local/lib
fi
else
cd
./
$OBJ_DIR
fi
# pkill oai_epc
# pkill tshark
if
[
-f
Makefile
]
;
then
echo_success
"Compiling..."
make
-j
$NUM_CPU
if
[
$?
-ne
0
]
;
then
echo_error
"Build failed, exiting"
return
1
else
cp
-pf
./OAI_EPC/oai_epc
$OPENAIR_TARGETS
/bin
fi
else
echo_error
"Configure failed, exiting"
return
1
fi
cd
$OPENAIR3_DIR
/GTPV1-U/GTPUAH
;
make
if
[
$?
-ne
0
]
;
then
echo_error
"Build GTPUAH module failed, exiting"
return
1
else
$SUDO
cp
-pfv
./Bin/libxt_
*
.so /lib/xtables
$SUDO
cp
-pfv
./Bin/
*
.ko
$OPENAIR_TARGETS
/bin
fi
cd
$OPENAIR3_DIR
/GTPV1-U/GTPURH
;
make
if
[
$?
-ne
0
]
;
then
echo_error
"Build GTPURH module failed, exiting"
return
1
else
$SUDO
cp
-pfv
./Bin/libxt_
*
.so /lib/xtables
$SUDO
cp
-pfv
./Bin/
*
.ko
$OPENAIR_TARGETS
/bin
fi
return
0
}
compile_exmimo2_driver
()
{
cd
$OPENAIR_TARGETS
/ARCH/EXMIMO/DRIVER/eurecom
&&
make clean
&&
make
||
exit
1
cd
$OPENAIR_TARGETS
/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT
&&
make clean
&&
make
||
exit
1
# TO DO CHECKS...
}
compile_ltesoftmodem
()
{
cd
$OPENAIR_TARGETS
/RT/USER
if
[
-f
Makefile
]
;
then
rm
-f
./lte-softmodem
echo
"LTE softmodem compiling directives:
$SOFTMODEM_DIRECTIVES
"
if
[
$OAI_CLEAN
-ne
0
]
;
then
echo
"Cleaning LTE softmodem"
make cleanall
>
/dev/null 2>&1
fi
make
-j
$NUM_CPU
$SOFTMODEM_DIRECTIVES
if
[
$?
-ne
0
]
;
then
# to locate easily compilation error in log file
make
$SOFTMODEM_DIRECTIVES
fi
if
[
$?
-ne
0
]
;
then
if
[
!
-f
./lte-softmodem
]
;
then
echo_error
"Build lte-softmodem failed, returning"
return
1
else
cp
-pf
./lte-softmodem
$OPENAIR_TARGETS
/bin
return
0
fi
else
cp
-pf
./lte-softmodem
$OPENAIR_TARGETS
/bin
return
0
fi
else
echo_error
"make file for oai softmodem not found, returning"
return
1
fi
}
compile_oaisim
()
{
cd
$OPENAIR_TARGETS
/SIMU/USER
if
[
-f
Makefile
]
;
then
echo
"Compiling for oaisim target (
$OAISIM_DIRECTIVES
)"
make cleanall
>
/dev/null
make
-j
$NUM_CPU
$OAISIM_DIRECTIVES
if
[
$?
-ne
0
]
;
then
echo_error
"Build oaisim failed, returning"
return
1
else
cp
-pf
./oaisim
$OPENAIR_TARGETS
/bin
return
0
fi
else
echo_error
"Makefile not found for oaisim target, returning"
return
1
fi
}
compile_unisim
()
{
cd
$OPENAIR1_DIR
/SIMULATION/LTE_PHY
if
[
-f
Makefile
]
;
then
echo
"Compiling for UNISIM target ..."
make cleanall
make
-j
$NUM_CPU
all
if
[
$?
-ne
0
]
;
then
echo_error
"Build unisim failed, returning"
return
1
else
cp
-pf
./dlsim
$OPENAIR_TARGETS
/bin
cp
-pf
./ulsim
$OPENAIR_TARGETS
/bin
cp
-pf
./pucchsim
$OPENAIR_TARGETS
/bin
cp
-pf
./prachsim
$OPENAIR_TARGETS
/bin
cp
-pf
./pdcchsim
$OPENAIR_TARGETS
/bin
cp
-pf
./pbchsim
$OPENAIR_TARGETS
/bin
cp
-pf
./mbmssim
$OPENAIR_TARGETS
/bin
return
0
fi
else
echo_error
"Configure failed, exiting"
return
1
fi
}
compile_nas_tools
()
{
export
NVRAM_DIR
=
$OPENAIR_TARGETS
/bin
cd
$NVRAM_DIR
if
[
!
-f
/tmp/nas_cleaned
]
;
then
echo_success
"make --directory=
$OPENAIR3_DIR
/NAS/EURECOM-NAS/tools veryveryclean"
make
--directory
=
$OPENAIR3_DIR
/NAS/EURECOM-NAS/tools veryveryclean
fi
echo_success
"make --directory=
$OPENAIR3_DIR
/NAS/EURECOM-NAS/tools all"
make
--directory
=
$OPENAIR3_DIR
/NAS/EURECOM-NAS/tools all
rm
.ue.nvram0
rm
.usim.nvram0
touch
/tmp/nas_cleaned
}
compile_ue_ip_nw_driver
()
{
cd
$OPENAIR2_DIR
&&
make ue_ip.ko
}
################################################
# 1. check if the executable functions exist
###############################################
check_for_ltesoftmodem_executable
()
{
if
[
!
-f
$OPENAIR_TARGETS
/RT/USER/lte-softmodem
]
;
then
echo_error
"Cannot find lte-softmodem executable object in directory
$OPENAIR_TARGETS
/RT/USER"
echo_error
"Check the compilation logs in bin/install_log.txt"
exit
1
fi
}
check_for_epc_executable
()
{
if
[
!
-f
$OPENAIR3_DIR
/objs/OAI_EPC/oai_epc
]
;
then
echo_error
"Cannot find oai_epc executable object in directory
$OPENAIR3_DIR
/objs/OAI_EPC/"
echo_fatal
"Please make sure you have compiled OAI EPC with --enable-standalone-epc option"
fi
}
check_for_hss_executable
()
{
if
[
!
-f
$OPENAIR3_DIR
/OPENAIRHSS/objs/openair-hss
]
;
then
echo_error
"Cannot find openair-hss executable object in directory
$OPENAIR3_DIR
/OPENAIRHSS/objs/"
echo_fatal
"Please make sure you have compiled OAI HSS"
fi
}
check_for_sgw_executable
()
{
if
[
!
-f
$OPENAIR3_DIR
/objs/OAI_SGW/oai_sgw
]
;
then
echo_error
"Cannot find oai_sgw executable object in directory
$OPENAIR3_DIR
/OPENAIRMME/objs/OAI_SGW/"
echo_fatal
"Please make sure you have compiled OAI EPC without --enable-standalone-epc option"
fi
}
check_for_oaisim_executable
()
{
if
[
!
-f
$OPENAIR_TARGETS
/SIMU/USER/oaisim
]
;
then
echo_error
"Cannot find oaisim executable object in directory
$OPENAIR_TARGETS
/SIMU/USER"
echo_error
"Check the compilation logs in bin/install_log.txt"
fi
}
check_for_dlsim_executable
()
{
if
[
!
-f
$OPENAIR1_DIR
/SIMULATION/LTE_PHY/dlsim
]
;
then
echo_error
"Cannot find dlsim executable object in directory
$OPENAIR1_DIR
/SIMULATION/LTE_PHY"
echo_error
"Check the compilation logs in bin/install_log.txt"
fi
}
check_for_ulsim_executable
()
{
if
[
!
-f
$OPENAIR1_DIR
/SIMULATION/LTE_PHY/ulsim
]
;
then
echo_error
"Cannot find ulsim executable object in directory
$OPENAIR1_DIR
/SIMULATION/LTE_PHY"
echo_error
"Check the compilation logs in bin/install_log.txt"
fi
}
check_for_pucchsim_executable
()
{
if
[
!
-f
$OPENAIR1_DIR
/SIMULATION/LTE_PHY/pucchsim
]
;
then
echo_error
"Cannot find pucchsim executable object in directory
$OPENAIR1_DIR
/SIMULATION/LTE_PHY"
echo_error
"Check the compilation logs in bin/install_log.txt"
fi
}
check_for_prachsim_executable
()
{
if
[
!
-f
$OPENAIR1_DIR
/SIMULATION/LTE_PHY/prachsim
]
;
then
echo_error
"Cannot find prachsim executable object in directory
$OPENAIR1_DIR
/SIMULATION/LTE_PHY"
echo_error
"Check the compilation logs in bin/install_log.txt"
fi
}
check_for_pdcchsim_executable
()
{
if
[
!
-f
$OPENAIR1_DIR
/SIMULATION/LTE_PHY/pdcchsim
]
;
then
echo_error
"Cannot find pdcchsim executable object in directory
$OPENAIR1_DIR
/SIMULATION/LTE_PHY"
echo_error
"Check the compilation logs in bin/install_log.txt"
fi
}
check_for_pbchsim_executable
()
{
if
[
!
-f
$OPENAIR1_DIR
/SIMULATION/LTE_PHY/pbchsim
]
;
then
echo_error
"Cannot find pbchsim executable object in directory
$OPENAIR1_DIR
/SIMULATION/LTE_PHY"
echo_error
"Check the compilation logs in bin/install_log.txt"
fi
}
check_for_mbmssim_executable
()
{
if
[
!
-f
$OPENAIR1_DIR
/SIMULATION/LTE_PHY/mbmssim
]
;
then
echo_error
"Cannot find mbmssim executable object in directory
$OPENAIR1_DIR
/SIMULATION/LTE_PHY"
echo_error
"Check the compilation logs in bin/install_log.txt"
fi
}
check_for_nas_ue_executable
()
{
if
[
!
-f
$OPENAIR3_DIR
/NAS/EURECOM-NAS/bin/UserProcess
]
;
then
echo_error
"Cannot find UserProcess executable object in directory
$OPENAIR3_DIR
/NAS/EURECOM-NAS/bin"
echo_fatal
"Check the compilation logs in bin/install_log.txt"
fi
}
################################################
# 1. check if the executable functions exist
###############################################
# arg1 is RT
# arg2 is HW
# arg3 is ENB_S1
install_ltesoftmodem
()
{
# RT
if
[
$1
=
"RTAI"
]
;
then
if
[
!
-f
/tmp/init_rt_done.tmp
]
;
then
echo_info
" 8.1 Insert RTAI modules"
$SUDO
insmod /usr/realtime/modules/rtai_hal.ko
>
/dev/null 2>&1
$SUDO
insmod /usr/realtime/modules/rtai_sched.ko
>
/dev/null 2>&1
$SUDO
insmod /usr/realtime/modules/rtai_sem.ko
>
/dev/null 2>&1
$SUDO
insmod /usr/realtime/modules/rtai_fifos.ko
>
/dev/null 2>&1
$SUDO
insmod /usr/realtime/modules/rtai_mbx.ko
>
/dev/null 2>&1
$SUDO
touch
/tmp/init_rt_done.tmp
$SUDO
chmod
666 /tmp/init_rt_done.tmp
else
echo_warning
" 8.1 RTAI modules already inserted"
fi
fi
#HW
if
[
$2
=
"EXMIMO"
]
;
then
echo_info
" 8.2 [EXMIMO] creating RTAI fifos"
for
i
in
`
seq
0 64
`
;
do
have_rtfX
=
`
ls
/dev/ |grep
-c
rtf
$i
`
;
if
[
"
$have_rtfX
"
-eq
0
]
;
then
$SUDO
mknod
-m
666 /dev/rtf
$i
c 150
$i
;
fi
;
done
echo_info
" 8.3 [EXMIMO] Build lte-softmodemdrivers"
cd
$OPENAIR_TARGETS
/ARCH/EXMIMO/DRIVER/eurecom
&&
make clean
&&
make
# || exit 1
cd
$OPENAIR_TARGETS
/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT
&&
make clean
&&
make
# || exit 1
echo_info
" 8.4 [EXMIMO] Setup RF card"
cd
$OPENAIR_TARGETS
/RT/USER
.
./init_exmimo2.sh
else
if
[
$2
=
"USRP"
]
;
then
echo_info
" 8.2 [USRP] "
fi
fi
# ENB_S1
if
[
$3
=
0
]
;
then
cd
$OPENAIR2_DIR
&&
make clean
&&
make nasmesh_netlink.ko
#|| exit 1
cd
$OPENAIR2_DIR
/NAS/DRIVER/MESH/RB_TOOL
&&
make clean
&&
make
# || exit 1
fi
}
# arg1 is ENB_S1 'boolean'
install_oaisim
()
{
if
[
$1
=
0
]
;
then
cd
$OPENAIR2_DIR
&&
make clean
&&
make nasmesh_netlink.ko
#|| exit 1
cd
$OPENAIR2_DIR
/NAS/DRIVER/MESH/RB_TOOL
&&
make clean
&&
make
# || exit 1
else
compile_ue_ip_nw_driver
install_nas_tools
fi
}
install_nas_tools
()
{
cd
$OPENAIR_TARGETS
/bin
if
[
!
-f
.ue.nvram0
]
;
then
echo_success
"generate .ue_emm.nvram0 .ue.nvram0"
$OPENAIR3_DIR
/NAS/EURECOM-NAS/bin/ue_data
--gen
fi
if
[
!
-f
.usim.nvram0
]
;
then
echo_success
"generate .usim.nvram0"
$OPENAIR3_DIR
/NAS/EURECOM-NAS/bin/usim_data
--gen
fi
$OPENAIR3_DIR
/NAS/EURECOM-NAS/bin/ue_data
--print
$OPENAIR3_DIR
/NAS/EURECOM-NAS/bin/usim_data
--print
}
install_nasmesh
(){
echo_success
"LOAD NASMESH IP DRIVER FOR UE AND eNB"
(
cd
$OPENAIR2_DIR
/NAS/DRIVER/MESH/RB_TOOL
&&
make clean
&&
make
)
(
cd
$OPENAIR2_DIR
&&
make clean
&&
make nasmesh_netlink_address_fix.ko
)
$SUDO
rmmod nasmesh
$SUDO
insmod
$OPENAIR2_DIR
/NAS/DRIVER/MESH/nasmesh.ko
}
##################################
# create HSS DB
################################
# arg 1 is mysql user (root)
# arg 2 is mysql password (linux)
# arg 3 is hss username (hssadmin)
# arg 4 is hss password (admin)
# arg 5 is database name (oai_db)
create_hss_database
(){
EXPECTED_ARGS
=
5
E_BADARGS
=
65
MYSQL
=
`
which mysql
`
rv
=
0
if
[
$#
-ne
$EXPECTED_ARGS
]
then
echo_fatal
"Usage:
$0
dbuser dbpass hssuser hsspass databasename"
rv
=
1
fi
set_openair_env
# removed %
#Q1="GRANT ALL PRIVILEGES ON *.* TO '$3'@'%' IDENTIFIED BY '$4' WITH GRANT OPTION;"
Q1
=
"GRANT ALL PRIVILEGES ON *.* TO '
$3
'@'localhost' IDENTIFIED BY '
$4
' WITH GRANT OPTION;"
Q2
=
"FLUSH PRIVILEGES;"
SQL
=
"
${
Q1
}${
Q2
}
"
$MYSQL
-u
$1
--password
=
$2
-e
"
$SQL
"
if
[
$?
-ne
0
]
;
then
echo_error
"
$3
permissions failed"
return
1
else
echo_success
"
$3
permissions succeeded"
fi
Q1
=
"CREATE DATABASE IF NOT EXISTS
${
BTICK
}
$5
${
BTICK
}
;"
SQL
=
"
${
Q1
}
"
$MYSQL
-u
$3
--password
=
$4
-e
"
$SQL
"
if
[
$?
-ne
0
]
;
then
echo_error
"
$5
creation failed"
return
1
else
echo_success
"
$5
creation succeeded"
fi
# test if tables have been created
mysql
-u
$3
--password
=
$4
-e
"desc
$5
.users"
>
/dev/null 2>&1
if
[
$?
-eq
1
]
;
then
$MYSQL
-u
$3
--password
=
$4
$5
<
$OPENAIR3_DIR
/OPENAIRHSS/db/oai_db.sql
if
[
$?
-ne
0
]
;
then
echo_error
"
$5
tables creation failed"
return
1
else
echo_success
"
$5
tables creation succeeded"
fi
fi
return
0
}
################################
# set_openair_env
###############################
set_openair_env
(){
fullpath
=
`
readlink
-f
$BASH_SOURCE
`
[
-f
"/.
$fullpath
"
]
||
fullpath
=
`
readlink
-f
$PWD
/
$fullpath
`
openair_path
=
${
fullpath
%/targets/*
}
openair_path
=
${
openair_path
%/openair3/*
}
openair_path
=
${
openair_path
%/openair[123]/*
}
export
OPENAIR_DIR
=
$openair_path
export
OPENAIR_HOME
=
$openair_path
export
OPENAIR1_DIR
=
$openair_path
/openair1
export
OPENAIR2_DIR
=
$openair_path
/openair2
export
OPENAIR3_DIR
=
$openair_path
/openair3
export
OPENAIR3_DIR
=
$openair_path
/openair3
export
OPENAIR_TARGETS
=
$openair_path
/targets
}
########################################
### print help
######################################
print_help
(){
echo_success
"Name : build_oai - install and build OAI"
echo_success
"Usage: build_oai.bash -a -b -c -d -e RTAI -m -r REL8 -s -t OAISIM -w EXMIMO -x"
echo_success
"-a | --doxygen : Enable doxygen for documentation (default disabled)"
echo_success
"-b | --disable-s1 : Disable S1 interface for eNB (default enabled)"
echo_success
"-c | --clean : Enable clean OAI build (default disabled)"
echo_success
"-C | --config-file : Set the config file local path"
echo_success
"-d | --debug : Enable debug mode (default disabled)"
echo_success
"-D | --disable-check-installed-software : Disable the checking of installed software (default is check)"
echo_success
"-e | --realtime : Set realtime mode: RTAI, NONE (default NONE)"
echo_success
"-g | --run-with-gdb : Run the executable built by this script with gdb"
echo_success
"-K | --itti-dump-file : Set the execution events trace file"
echo_success
"-l | --build-target : Set the LTE build target: ENB,EPC,HSS,NONE (default ENB)"
echo_success
"-m | --build-from-makefile : Enable build from the makefile (default disabled)"
echo_success
"-r | --3gpp-release : Set the release: REL8, REL10 (default REL8)"
echo_success
"-p | --wireshark : enable wireshark interface for L2 pdus"
echo_success
"-R | --run : Run the executable built by this script"
echo_success
"-s | --check : Enable OAI testing and sanity check (default disabled)"
echo_success
"-t | --enb-build-target : Set the eNB build target: ALL, SOFTMODEM,OAISIM,UNISIM (default ALL)"
echo_success
"-V | --vcd : Log vcd events"
echo_success
"-w | --hardware : Set the hardware platform: EXMIMO, USRP (also installs UHD driver), ETHERNET, NONE, (default EXMIMO)"
echo_success
"-x | --xforms : Enable xforms (default disabled)"
echo_success
"-z | --defaults : Set the default build options"
}
print_help_perf
(){
echo_success
"Name : perf_oai generate traffic and evaluate the performance "
echo_success
"Usage: perf_oai.bash -l ITG "
echo_success
"-l | --perf-app : Set Performance evaluation app: ITGS, ITGD,PING, OTG-OAISIM, OTG-CBA, (default PING)"
echo_success
"-m | --owd : enable D-ITG one-way-delay meter (default disabled)"
echo_success
"-e | --duration : set the duration of the experiment (default 60000ms)"
echo_success
"-i | --idt-dist : set the distribution of the inter-departure time: CONSTANT, UNIFORM,EXPONENTIAL (default CONSTANT)"
echo_success
"-s | --ps-dist : set the distribution of the inter-departure time (default CONSTANT, available options: UNIFORM,EXPONENTIAL)"
echo_success
"-d | --dst : set the destination address (default 127.0.0.1)"
echo_success
"-p | --dst-port : set the destination address (default NONE)"
echo_success
"-t | --test : enable test mode to validate the functionality (default disabled)"
echo_success
"-k | --keep-log-file : keep the log files (default disabled)"
}
###############################
## echo and family
###############################
black
=
'\E[30m'
red
=
'\E[31m'
green
=
'\E[32m'
yellow
=
'\E[33m'
blue
=
'\E[34m'
magenta
=
'\E[35m'
cyan
=
'\E[36m'
white
=
'\E[37m'
reset_color
=
'\E[00m'
cecho
()
# Color-echo
# arg1 = message
# arg2 = color
{
local
default_msg
=
"No Message."
message
=
${
1
:-
$default_msg
}
color
=
${
2
:-
$green
}
if
[
$BUILD_FROM_MAKEFILE
=
0
]
;
then
echo
-e
-n
"
$color$message$reset_color
"
echo
else
echo
"
$message
"
fi
return
}
echo_error
()
{
local
my_string
=
""
until
[
-z
"
$1
"
]
do
my_string
=
"
$my_string$1
"
shift
done
cecho
"
$my_string
"
$red
}
echo_fatal
()
{
local
my_string
=
""
until
[
-z
"
$1
"
]
do
my_string
=
"
$my_string$1
"
shift
done
echo_error
"
$my_string
"
exit
-1
}
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
}
echo_info
()
{
local
my_string
=
""
until
[
-z
"
$1
"
]
do
my_string
=
"
$my_string$1
"
shift
done
cecho
"
$my_string
"
$blue
}
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
}
is_process_started
()
{
if
[
-z
"
$1
"
]
;
then
echo_error
"WAITING FOR PROCESS START: NO PROCESS"
return
1
fi
ps
-C
$1
>
/dev/null 2>&1
if
[
$?
-ne
0
]
;
then
echo_success
"PROCESS
$1
NOT STARTED"
return
1
fi
echo_success
"PROCESS
$1
STARTED"
return
0
}
assert
()
{
# If condition false
# exit from script with error message
E_PARAM_ERR
=
98
E_PARAM_FAILED
=
99
if
[
-z
"
$2
"
]
;
then
# Not enought parameters passed.
return
$E_PARAM_ERR
fi
lineno
=
$2
if
[
!
$1
]
;
then
echo_error
"Assertion failed:
\"
$1
\"
"
echo_fatal
"File
\"
$0
\"
, line
$lineno
"
fi
}
targets/build_oai.bash
deleted
100755 → 0
View file @
ca82ca55
#/*
# * 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 build_oai.bash
# brief OAI automated build tool that can be used to install, compile, run OAI.
# author Navid Nikaein, Lionel GAUTHIER
# company Eurecom
# email: navid.nikaein@eurecom.fr, lionel.gauthier@eurecom.fr
#
#!/bin/bash
################################
# include helper functions
################################
THIS_SCRIPT_PATH
=
$(
dirname
$(
readlink
-f
$0
))
.
$THIS_SCRIPT_PATH
/build_helper.bash
check_for_root_rights
#######################################
# Default PARAMETERS
######################################
declare
OAI_DB_ADMIN_USER_NAME
=
"root"
declare
OAI_DB_ADMIN_USER_PASSWORD
=
"linux"
#only one could be set at the time
declare
BUILD_LTE
=
"NONE"
# ENB, EPC, HSS
declare
HW
=
"EXMIMO"
# EXMIMO, USRP, ETHERNET, NONE
declare
TARGET
=
"ALL"
# ALL, SOFTMODEM, OAISIM, UNISIM, NONE
declare
ENB_S1
=
1
declare
REL
=
"REL8"
# REL8, REL10
declare
RT
=
"NONE"
# RTAI, RT_PREMPT, NONE
declare
DEBUG
=
0
declare
CONFIG_FILE
=
" "
declare
CONFIG_FILE_ACCESS_OK
=
0
declare
EXE_ARGUMENTS
=
" "
declare
RUN_GDB
=
0
declare
RUN
=
0
declare
DISABLE_CHECK_INSTALLED_SOFTWARE
=
0
declare
OAI_CLEAN
=
0
declare
CLEAN_IPTABLES
=
0
declare
CLEAN_HSS
=
0
declare
OAI_TEST
=
0
declare
XFORMS
=
0
# script is not currently handling these params
declare
EPC
=
0
# flag to build EPC
declare
ITTI_ANALYZER
=
0
declare
VCD_TIMING
=
0
declare
WIRESHARK
=
0
declare
TIME_MEAS
=
0
declare
DOXYGEN
=
0
declare
DEV
=
0
#EMULATION_DEV_INTERFACE="eth0"
#EMULATION_MULTICAST_GROUP=1
#EMULATION_DEV_ADDRESS=`ifconfig $EMULATION_DEV_INTERFACE | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}'`
############## script params #####################
if
[
-f
./.lock_oaibuild
]
;
then
OAI_CLEAN
=
0
else
OAI_CLEAN
=
1
fi
#for i in "$@"
#do
# echo "i is : $i"
# case $i in
until
[
-z
"
$1
"
]
do
case
"
$1
"
in
-a
|
--doxygen
)
DOXYGEN
=
1
echo
"setting doxygen flag to:
$DOXYGEN
"
shift
;
;;
-b
|
--disable-s1
)
ENB_S1
=
0
echo
"disable eNB S1 flag"
shift
;
;;
-c
|
--clean
)
rm
-rf
./.lock_oaibuild
OAI_CLEAN
=
1
CLEAN_HSS
=
1
echo
"setting clean flag to:
$OAI_CLEAN
"
echo
"may check package installation, and recompile OAI"
shift
;
;;
--clean-iptables
)
CLEAN_IPTABLES
=
1
;
shift
;
;;
-C
|
--config-file
)
CONFIG_FILE
=
$2
# may be relative path
if
[
-f
$(
dirname
$(
readlink
-f
$0
))
/
$CONFIG_FILE
]
;
then
CONFIG_FILE
=
$(
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
]
;
then
echo
"setting config file to:
$CONFIG_FILE
"
CONFIG_FILE_ACCESS_OK
=
1
else
echo
"config file not found"
exit
1
fi
fi
EXE_ARGUMENTS
=
"
$EXE_ARGUMENTS
-O
$CONFIG_FILE
"
shift
2
;
;;
-d
|
--debug
)
DEBUG
=
1
echo
"setting debug flag to:
$DEBUG
"
shift
;
;;
-D
|
--disable-check-installed-software
)
DISABLE_CHECK_INSTALLED_SOFTWARE
=
1
echo
"disable check installed software"
shift
;
;;
-e
|
--realtime
)
RT
=
$2
echo
"setting realtime flag to:
$RT
"
shift
2
;
;;
-g
|
--run-with-gdb
)
DEBUG
=
1
RUN
=
1
RUN_GDB
=
1
echo
"Running with gdb"
shift
;
;;
-K
|
--itti-dump-file
)
ITTI_ANALYZER
=
1
ITTI_DUMP_FILE
=
$2
echo
"setting ITTI dump file to:
$ITTI_DUMP_FILE
"
EXE_ARGUMENTS
=
"
$EXE_ARGUMENTS
-K
$ITTI_DUMP_FILE
"
shift
2
;
;;
-l
|
--build-target
)
BUILD_LTE
=
$2
echo
"setting top-level build target to:
$2
"
shift
2
;
;;
-h
|
--help
)
print_help
exit
-1
;;
-m
|
--build-from-makefile
)
BUILD_FROM_MAKEFILE
=
1
set_build_from_makefile
$BUILD_FROM_MAKEFILE
echo
"setting a flag to build from makefile to:
$BUILD_FROM_MAKEFILE
"
shift
;
;;
-r
|
--3gpp-release
)
REL
=
$2
echo
"setting release to:
$REL
"
shift
2
;
;;
-R
|
--run
)
RUN
=
1
echo
"setting run to
$RUN
"
shift
;
;;
-s
|
--check
)
OAI_TEST
=
1
echo
"setting sanity check to:
$OAI_TEST
"
shift
;
;;
-t
|
--enb-build-target
)
TARGET
=
$2
echo
"setting enb build target to:
$TARGET
"
shift
2
;
;;
-V
|
--vcd
)
echo
"setting gtk-wave output"
VCD_TIMING
=
1
EXE_ARGUMENTS
=
"
$EXE_ARGUMENTS
-V"
shift
;
;;
-w
|
--hardware
)
HW
=
"
$2
"
#"${i#*=}"
echo
"setting hardware to:
$HW
"
shift
2
;
;;
-x
|
--xforms
)
XFORMS
=
1
EXE_ARGUMENTS
=
"
$EXE_ARGUMENTS
-d"
echo
"setting xforms to:
$XFORMS
"
shift
;
;;
-p
|
--wireshark
)
WIRESHARK
=
1
echo
"enabling Wireshark interface to
$WIRESHARK
"
shift
;
;;
-z
|
--defaults
)
echo
"setting all parameters to: default"
rm
-rf
./.lock_oaibuild
OAI_CLEAN
=
1
HW
=
"EXMIMO"
TARGET
=
"ALL"
ENB_S1
=
1
REL
=
"REL8"
RT
=
"NONE"
DEBUG
=
0
ENB_CONFIG_FILE
=
$OPENAIR_TARGETS
/
"PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.conf"
OAI_TEST
=
0
shift
;
;;
*
)
echo
"Unknown option
$1
"
break
;
# unknown option
;;
esac
done
#####################
# create a bin dir
#####################
echo_info
"1. Creating the bin dir ..."
mkdir
-m
777 bin
build_date
=
`
date
+%Y_%m_%d
`
oai_build_date
=
"oai_built_
${
build_date
}
"
touch
bin/
${
oai_build_date
}
chmod
-f
777 bin/
${
oai_build_date
}
touch
bin/install_log.txt
chmod
-f
777 bin/install_log.txt
################################
# cleanup first
################################
#echo_info "3. Cleaning ..."
#$SUDO kill -9 `ps -ef | grep oaisim | awk '{print $2}'` 2>&1
#$SUDO kill -9 `ps -ef | grep lte-softmodem | awk '{print $2}'` 2>&1
#$SUDO kill -9 `ps -ef | grep dlsim | awk '{print $2}'` 2>&1
#$SUDO kill -9 `ps -ef | grep ulsim | awk '{print $2}'` 2>&1
if
[
$CLEAN_IPTABLES
-eq
1
]
;
then
echo_info
"Flushing iptables..."
$SUDO
modprobe ip_tables
$SUDO
modprobe x_tables
$SUDO
iptables
-P
INPUT ACCEPT
$SUDO
iptables
-F
INPUT
$SUDO
iptables
-P
OUTPUT ACCEPT
$SUDO
iptables
-F
OUTPUT
$SUDO
iptables
-P
FORWARD ACCEPT
$SUDO
iptables
-F
FORWARD
$SUDO
iptables
-t
nat
-F
$SUDO
iptables
-t
mangle
-F
$SUDO
iptables
-t
filter
-F
$SUDO
iptables
-t
raw
-F
echo_info
"Flushed iptables"
fi
############################################
# setting and printing OAI envs, we should check here
############################################
echo_info
"2. Setting the OAI PATHS ..."
set_openair_env
cecho
"OPENAIR_HOME =
$OPENAIR_HOME
"
$green
cecho
"OPENAIR1_DIR =
$OPENAIR1_DIR
"
$green
cecho
"OPENAIR2_DIR =
$OPENAIR2_DIR
"
$green
cecho
"OPENAIR3_DIR =
$OPENAIR3_DIR
"
$green
cecho
"OPENAIR3_DIR =
$OPENAIR3_DIR
"
$green
cecho
"OPENAIR_TARGETS =
$OPENAIR_TARGETS
"
$green
echo
"OPENAIR_HOME =
$OPENAIR_HOME
"
>>
bin/
${
oai_build_date
}
echo
"OPENAIR1_DIR =
$OPENAIR1_DIR
"
>>
bin/
${
oai_build_date
}
echo
"OPENAIR2_DIR =
$OPENAIR2_DIR
"
>>
bin/
${
oai_build_date
}
echo
"OPENAIR3_DIR =
$OPENAIR3_DIR
"
>>
bin/
${
oai_build_date
}
echo
"OPENAIR3_DIR =
$OPENAIR3_DIR
"
>>
bin/
${
oai_build_date
}
echo
"OPENAIR_TARGETS =
$OPENAIR_TARGETS
"
>>
bin/
${
oai_build_date
}
build_enb
(){
##########################################
# process parameters
#########################################
echo_info
"4. Process the parameters"
echo_info
"User-defined Parameters : HW=
$HW
, TARGET=
$TARGET
, ENB_S1=
$ENB_S1
, REL=
$REL
, RT=
$RT
, DEBUG=
$DEBUG
XFORMS=
$XFORMS
"
echo
"User-defined Parameters : HW=
$HW
, TARGET=
$TARGET
, ENB_S1=
$ENB_S1
, REL=
$REL
, RT=
$RT
, DEBUG=
$DEBUG
XFORMS=
$XFORMS
"
>>
bin/
${
oai_build_date
}
############################################
# compilation directives
############################################
echo_info
"5. building the compilation directives ..."
SOFTMODEM_DIRECTIVES
=
"DEBUG=
$DEBUG
XFORMS=
$XFORMS
"
OAISIM_DIRECTIVES
=
"DEBUG=
$DEBUG
XFORMS=
$XFORMS
"
if
[
$ENB_S1
-eq
1
]
;
then
SOFTMODEM_DIRECTIVES
=
"
$SOFTMODEM_DIRECTIVES
USE_MME=R10 ENABLE_ITTI=1 LINK_ENB_PDCP_TO_GTPV1U=1 SECU=1 "
#OAISIM_DIRECTIVES="$OAISIM_DIRECTIVES USE_MME=R10 ENABLE_ITTI=1 LINK_ENB_PDCP_TO_GTPV1U=1 SECU=1 "
OAISIM_DIRECTIVES
=
"
$OAISIM_DIRECTIVES
ENABLE_ITTI=1 LINK_ENB_PDCP_TO_GTPV1U=1 SECU=1 "
fi
if
[
$DEBUG
-eq
0
]
;
then
SOFTMODEM_DIRECTIVES
=
"
$SOFTMODEM_DIRECTIVES
DISABLE_XER_PRINT=1 "
OAISIM_DIRECTIVES
=
"
$OAISIM_DIRECTIVES
DISABLE_XER_PRINT=1 "
fi
if
[
$HW
=
"USRP"
]
;
then
SOFTMODEM_DIRECTIVES
=
"
$SOFTMODEM_DIRECTIVES
USRP=1 "
fi
if
[
$HW
=
"ADRV9371_ZC706"
]
;
then
SOFTMODEM_DIRECTIVES
=
"
$SOFTMODEM_DIRECTIVES
ADRV9371_ZC706=1 "
fi
if
[
$HW
=
"EXMIMO"
]
;
then
SOFTMODEM_DIRECTIVES
=
"
$SOFTMODEM_DIRECTIVES
EXMIMO=1 "
fi
if
[
$HW
=
"ETHERNET"
]
;
then
SOFTMODEM_DIRECTIVES
=
"
$SOFTMODEM_DIRECTIVES
ETHERNET=1 "
fi
if
[
$ENB_S1
-eq
0
]
;
then
SOFTMODEM_DIRECTIVES
=
"
$SOFTMODEM_DIRECTIVES
NAS=1 "
OAISIM_DIRECTIVES
=
"
$OAISIM_DIRECTIVES
NAS=1 "
fi
if
[
$REL
=
"REL8"
]
;
then
SOFTMODEM_DIRECTIVES
=
"
$SOFTMODEM_DIRECTIVES
Rel8=1 "
OAISIM_DIRECTIVES
=
"
$OAISIM_DIRECTIVES
Rel8=1 "
else
SOFTMODEM_DIRECTIVES
=
"
$SOFTMODEM_DIRECTIVES
Rel10=1 "
OAISIM_DIRECTIVES
=
"
$OAISIM_DIRECTIVES
Rel10=1 "
fi
if
[
$RT
=
"RTAI"
]
;
then
if
[
!
-f
/usr/realtime/modules/rtai_hal.ko
]
;
then
echo_warning
"RTAI doesn't seem to be installed"
RT
=
"NONE"
SOFTMODEM_DIRECTIVES
=
"
$SOFTMODEM_DIRECTIVES
RTAI=0 "
else
SOFTMODEM_DIRECTIVES
=
"
$SOFTMODEM_DIRECTIVES
HARD_RT=1 "
fi
else
SOFTMODEM_DIRECTIVES
=
"
$SOFTMODEM_DIRECTIVES
RTAI=0 "
RT
=
"NONE"
fi
if
[
$TARGET
!=
"ALL"
]
;
then
if
[
$TARGET
!=
"SOFTMODEM"
]
;
then
HW
=
"NONE"
fi
fi
if
[
$UBUNTU_REL
=
"12.04"
]
;
then
output
=
$(
check_for_machine_type 2>&1
)
MACHINE_ARCH
=
$?
if
[
$MACHINE_ARCH
-eq
64
]
;
then
SOFTMODEM_DIRECTIVES
=
"
$SOFTMODEM_DIRECTIVES
LIBCONFIG_LONG=1 "
OAISIM_DIRECTIVES
=
"
$OASIM_DIRECTIVES
LIBCONFIG_LONG=1 "
fi
fi
echo_success
"SOFTMODEM Compilation directives:
$SOFTMODEM_DIRECTIVES
"
echo_success
"OAISIM Compilation directives:
$OAISIM_DIRECTIVES
"
echo
"SOFTMODEM Compilation directives:
$SOFTMODEM_DIRECTIVES
"
>>
bin/
${
oai_build_date
}
echo
"OAISIM Compilation directive:
$OAISIM_DIRECTIVES
"
>>
bin/
${
oai_build_date
}
############################################
# check the installation
############################################
if
[
$DISABLE_CHECK_INSTALLED_SOFTWARE
-eq
0
]
;
then
echo_info
"6. Checking the the required softwares/packages ..."
check_install_oai_software
if
[
$HW
=
"USRP"
]
;
then
check_install_usrp_uhd_driver
fi
check_install_asn1c
check_install_nettle
else
echo_info
"6. Not checking the required softwares/packages ..."
touch
./.lock_oaibuild
fi
############################################
# compile
############################################
echo_info
"7. compiling and installing the OAI binaries ..."
softmodem_compiled
=
1
oaisim_compiled
=
1
unisim_compiled
=
1
if
[
$TARGET
=
"ALL"
]
;
then
echo
"############# compile_ltesoftmodem #############"
>>
bin/install_log.txt
output
=
$(
compile_ltesoftmodem
>>
bin/install_log.txt 2>&1
)
softmodem_compiled
=
$?
check_for_ltesoftmodem_executable
echo_info
"7.1 finished ltesoftmodem target : check the installation log file bin/install_log.txt"
echo
"################ compile_oaisim #################"
>>
bin/install_log.txt
output
=
$(
compile_oaisim
>>
bin/install_log.txt 2>&1
)
oaisim_compiled
=
$?
check_for_oaisim_executable
echo_info
"7.2 finished oaisim target : check the installation log file bin/install_log.txt"
echo
"################## compile_unisim ##################"
>>
bin/install_log.txt
output
=
$(
compile_unisim
>>
bin/install_log.txt 2>&1
)
unisim_compiled
=
$?
check_for_dlsim_executable
check_for_ulsim_executable
check_for_pucchsim_executable
check_for_prachsim_executable
check_for_pdcchsim_executable
check_for_pbchsim_executable
check_for_mbmssim_executable
echo_info
"7.3 finished unisim target : check the installation log file bin/install_log.txt"
else
if
[
$TARGET
==
"SOFTMODEM"
]
;
then
echo
"############# compile_ltesoftmodem #############"
>>
bin/install_log.txt
output
=
$(
compile_ltesoftmodem
>>
bin/install_log.txt 2>&1
)
softmodem_compiled
=
$?
check_for_ltesoftmodem_executable
echo_info
"7.1 finished ltesoftmodem target: check the installation log file bin/install_log.txt"
if
[
$HW
==
"EXMIMO"
]
;
then
output
=
$(
compile_exmimo2_driver
>>
bin/install_log.txt 2>&1
)
fi
fi
if
[
$TARGET
=
"OAISIM"
]
;
then
echo
"################ compile_oaisim #################"
>>
bin/install_log.txt
output
=
$(
compile_oaisim
>>
bin/install_log.txt 2>&1
)
oaisim_compiled
=
$?
check_for_oaisim_executable
echo_info
"7.2 finished oaisim target: check the installation log file bin/install_log.txt"
if
[
$ENB_S1
-eq
1
]
;
then
compile_nas_tools 2>&1
nas_tools_compiled
=
$?
check_for_nas_tools_executable
echo_info
"7.2.1 finished nas ue target: check the installation log file bin/install_log.txt"
fi
fi
if
[
$TARGET
=
"UNISIM"
]
;
then
echo
"################## compile_unisim ##################"
>>
bin/install_log.txt
output
=
$(
compile_unisim
>>
bin/install_log.txt 2>&1
)
unisim_compiled
=
$?
check_for_dlsim_executable
check_for_ulsim_executable
check_for_pucchsim_executable
check_for_prachsim_executable
check_for_pdcchsim_executable
check_for_pbchsim_executable
check_for_mbmssim_executable
echo_info
"7.3 finished unisim target: check the installation log file bin/install_log.txt"
fi
fi
############################################
# install
############################################
echo_info
"8. Installing ..."
if
[
$softmodem_compiled
-eq
0
]
;
then
echo_success
"target lte-softmodem built and installed in the bin directory"
echo
"target lte-softmodem built and installed in the bin directory"
>>
bin/
${
oai_build_date
}
output
=
$(
install_ltesoftmodem
$RT
$HW
$ENB_S1
)
fi
if
[
$oaisim_compiled
-eq
0
]
;
then
echo_success
"target oaisim built and installed in the bin directory"
echo
"target oaisim built and installed in the bin directory"
>>
bin/
${
oai_build_date
}
output
=
$(
install_oaisim
$ENB_S1
)
fi
if
[
$unisim_compiled
-eq
0
]
;
then
echo_success
"target unisim built and installed in the bin directory"
echo
"target unisim built and installed in the bin directory"
>>
bin/
${
oai_build_date
}
fi
echo_info
"build terminated, binaries are located in bin/"
echo_info
"build terminated, logs are located in bin/
${
oai_build_date
}
and bin/install_log.txt"
}
build_epc
(){
epc_compiled
=
1
echo_info
"Note: this scripts tested only on Ubuntu 14.04x64"
######################################
# CHECK MISC SOFTWARES AND LIBS #
######################################
if
[
$DISABLE_CHECK_INSTALLED_SOFTWARE
-eq
0
]
;
then
echo_info
"4. Checking the the required softwares/packages for EPC..."
check_install_epc_software
check_install_asn1c
if
[
$OAI_CLEAN
-eq
1
]
;
then
check_install_freediamter
else
if
[
!
-d
/usr/local/etc/freeDiameter
]
;
then
check_install_freediamter
fi
fi
else
echo_info
"4. Not checking the required softwares/packages for EPC"
fi
###########################################
# configure and compile
##########################################
echo_info
"5. configure and compile epc"
output
=
$(
compile_epc
$OAI_CLEAN
>>
$OPENAIR_TARGETS
/bin/install_log.txt 2>&1
)
epc_compiled
=
$?
if
[
$epc_compiled
-ne
0
]
;
then
echo_error
"EPC compilation failed : check the installation log file bin/install_log.txt"
exit
1
fi
check_for_epc_executable
echo_info
"finished epc target: check the installation log file bin/install_log.txt"
if
[
$CONFIG_FILE_ACCESS_OK
-eq
0
]
;
then
echo_error
"You have to provide a EPC config file"
exit
1
fi
TEMP_FILE
=
`
tempfile
`
VARIABLES
=
" S6A_CONF
\|\
HSS_HOSTNAME
\|\
REALM"
VARIABLES
=
$(
echo
$VARIABLES
|
sed
-e
's/\\r//g'
)
VARIABLES
=
$(
echo
$VARIABLES
|
tr
-d
' '
)
cat
$CONFIG_FILE
|
grep
-w
"
$VARIABLES
"
|
tr
-d
" "
|
tr
-d
";"
>
$TEMP_FILE
source
$TEMP_FILE
rm
-f
$TEMP_FILE
if
[
x
"
$REALM
"
==
"x"
]
;
then
echo_error
"Your config file do not contain a REALM for S6A configuration"
exit
1
fi
if
[
x
"
$S6A_CONF
"
!=
"x./epc_s6a.conf"
]
;
then
echo_error
"Your config file do not contain the good path for the S6A config file,"
echo_error
"accordingly to what is done in this script, it should be set to epc_s6a.conf"
exit
1
fi
check_epc_s6a_certificate
$REALM
###########################################
# install the binary in bin
##########################################
echo_info
"6. install the binary file"
if
[
$epc_compiled
-eq
0
]
;
then
echo_success
"target epc built and installed in the bin directory"
echo
"target epc built and installed in the bin directory"
>>
bin/
${
oai_build_date
}
cp
-f
$CONFIG_FILE
$OPENAIR_TARGETS
/bin
cp
-f
$OPENAIR3_DIR
/objs/UTILS/CONF/s6a.conf
$OPENAIR_TARGETS
/bin/epc_s6a.conf
fi
}
build_hss
(){
echo_info
"Note: this script tested only for Ubuntu 12.04 x64 -> 14.04 x64"
######################################
# CHECK MISC SOFTWARES AND LIBS #
######################################
if
[
$DISABLE_CHECK_INSTALLED_SOFTWARE
-eq
0
]
;
then
echo_info
"4. check the required packages for HSS"
check_install_hss_software
if
[
$OAI_CLEAN
-eq
1
]
;
then
check_install_freediamter
else
if
[
!
-d
/usr/local/etc/freeDiameter
]
;
then
check_install_freediamter
fi
fi
else
echo_info
"4. Not checking the required packages for HSS"
fi
######################################
# compile HSS #
######################################
echo_info
"5. compile HSS"
# Bad behaviour of $OAI_CLEAN with ./.lock_oaibuild ...
compile_hss
$CLEAN_HSS
hss_compiled
=
$?
check_for_hss_executable
echo_info
"finished hss target"
######################################
# Check certificates #
######################################
TEMP_FILE
=
`
tempfile
`
cat
$OPENAIR3_DIR
/OPENAIRHSS/conf/hss_fd.conf |
grep
-w
"Identity"
|
tr
-d
" "
|
tr
-d
";"
>
$TEMP_FILE
cat
$OPENAIR3_DIR
/OPENAIRHSS/conf/hss.conf |
grep
-w
"MYSQL_user"
|
tr
-d
" "
|
tr
-d
";"
>>
$TEMP_FILE
cat
$OPENAIR3_DIR
/OPENAIRHSS/conf/hss.conf |
grep
-w
"MYSQL_pass"
|
tr
-d
" "
|
tr
-d
";"
>>
$TEMP_FILE
cat
$OPENAIR3_DIR
/OPENAIRHSS/conf/hss.conf |
grep
-w
"MYSQL_db"
|
tr
-d
" "
|
tr
-d
";"
>>
$TEMP_FILE
source
$TEMP_FILE
rm
-f
$TEMP_FILE
if
[
x
"
$Identity
"
==
"x"
]
;
then
echo_error
"Your config file do not contain a host identity for S6A configuration"
exit
1
fi
HSS_REALM
=
$(
echo
$Identity
|
sed
's/.*\.//'
)
HSS_HOSTNAME
=
${
Identity
%.
$HSS_REALM
}
NEW_HOSTNAME
=
`
hostname
-s
`
if
[
"x
$HSS_HOSTNAME
"
!=
"x
$NEW_HOSTNAME
"
]
;
then
echo_warning
"Changing identity of HSS from <
$HSS_HOSTNAME
.
$HSS_REALM
> to <
$NEW_HOSTNAME
.
$HSS_REALM
>"
sed
-ibak
"s/
$HSS_HOSTNAME
/
$NEW_HOSTNAME
/"
$OPENAIR3_DIR
/OPENAIRHSS/conf/hss_fd.conf
fi
check_hss_s6a_certificate
$HSS_REALM
######################################
# fill the HSS DB
######################################
echo_info
"6. create HSS database (for EURECOM SIM CARDS)"
hss_db_created
=
1
create_hss_database
$OAI_DB_ADMIN_USER_NAME
$OAI_DB_ADMIN_USER_PASSWORD
$MYSQL_user
$MYSQL_pass
$MYSQL_db
if
[
$?
-eq
1
]
;
then
echo_fatal
"hss DB not created"
fi
}
echo_info
"3. set the top-level build target"
case
"
$BUILD_LTE
"
in
'ENB'
)
echo_success
"build LTE eNB"
build_enb
;;
'EPC'
)
echo_success
"build EPC(MME and xGW)"
build_epc
;;
'HSS'
)
echo_success
"build HSS"
build_hss
;;
'NONE'
)
;;
*
)
;;
esac
# Additional operation
############################################
# Generate doxygen documentation
############################################
if
[
$DOXYGEN
=
1
]
;
then
echo_info
"9. Generate doxygen documentation ..."
doxygen
$OPENAIR_TARGETS
/DOCS/Doxyfile
echo_info
"9.1 use your navigator to open
$OPENAIR_TARGETS
/DOCS/html/index.html "
else
echo_info
"9. Bypassing doxygen documentation ..."
fi
############################################
# testing
############################################
if
[
$OAI_TEST
-eq
1
]
;
then
echo_info
"10. Running OAI pre commit tests (pre-ci) ..."
python
$OPENAIR_TARGETS
/TEST/OAI/test01.py
-l
else
echo_info
"10. Bypassing the Tests ..."
fi
############################################
# run
############################################
if
[
$RUN
-ne
0
]
;
then
echo_info
"11. Running ..."
cd
$OPENAIR_TARGETS
/bin
case
"
$BUILD_LTE
"
in
'ENB'
)
if
[
$TARGET
==
"SOFTMODEM"
]
;
then
if
[
$HW
==
"EXMIMO"
]
;
then
$SUDO
chmod
777
$OPENAIR_TARGETS
/RT/USER/init_exmimo2.sh
$SUDO
$OPENAIR_TARGETS
/RT/USER/init_exmimo2.sh
fi
if
[
$WIRESHARK
-eq
1
]
;
then
EXE_ARGUMENTS
=
"
$EXE_ARGUMENTS
-W"
fi
echo
"############# running ltesoftmodem #############"
if
[
$RUN_GDB
-eq
0
]
;
then
$SUDO
$OPENAIR_TARGETS
/bin/lte-softmodem
`
echo
$EXE_ARGUMENTS
`
else
$SUDO
setenv MALLOC_CHECK_ 2
$SUDO
touch
~/.gdb_lte_softmodem
$SUDO
echo
"file
$OPENAIR_TARGETS
/bin/lte-softmodem"
>
~/.gdb_lte_softmodem
$SUDO
echo
"set args
$EXE_ARGUMENTS
"
>>
~/.gdb_lte_softmodem
$SUDO
echo
"run"
>>
~/.gdb_lte_softmodem
$SUDO
gdb
-nh
-x
~/.gdb_lte_softmodem 2>&1
fi
elif
[
$TARGET
==
"OAISIM"
]
;
then
if
[
$ENB_S1
-eq
0
]
;
then
install_nasmesh
else
# prepare NAS for UE
if
[
!
-f
.ue.nvram0
]
;
then
echo_success
"generate .ue_emm.nvram0 .ue.nvram0"
$OPENAIR3_DIR
/NAS/EURECOM-NAS/bin/ue_data
--gen
fi
if
[
!
-f
.usim.nvram0
]
;
then
echo_success
"generate .usim.nvram0"
$OPENAIR3_DIR
/NAS/EURECOM-NAS/bin/usim_data
--gen
fi
$OPENAIR3_DIR
/NAS/EURECOM-NAS/bin/ue_data
--print
$OPENAIR3_DIR
/NAS/EURECOM-NAS/bin/usim_data
--print
insmod
$OPENAIR2_DIR
/NETWORK_DRIVER/UE_IP/ue_ip.ko
fi
if
[
$WIRESHARK
-eq
1
]
;
then
EXE_ARGUMENTS
=
"
$EXE_ARGUMENTS
-P wireshark"
fi
if
[
$RUN_GDB
-eq
0
]
;
then
$SUDO
exec
$OPENAIR_TARGETS
/bin/oaisim
`
echo
$EXE_ARGUMENTS
`
else
$SUDO
setenv MALLOC_CHECK_ 2
$SUDO
touch
~/.gdb_oaisim
$SUDO
echo
"file
$OPENAIR_TARGETS
/bin/lte-oaisim"
>
~/.gdb_oaisim
$SUDO
echo
"set args
$EXE_ARGUMENTS
"
>>
~/.gdb_oaisim
$SUDO
echo
"run"
>>
~/.gdb_oaisim
$SUDO
gdb
-nh
-x
~/.gdb_oaisim 2>&1
fi
fi
;;
'EPC'
)
echo
"############# running EPC #############"
test_is_host_reachable
$HSS_HOSTNAME
.
$REALM
HSS
if
[
$RUN_GDB
-eq
0
]
;
then
$SUDO
$OPENAIR_TARGETS
/bin/oai_epc
`
echo
$EXE_ARGUMENTS
`
else
touch
~/.gdb_epc
chmod
777 ~/.gdb_epc
echo
"file
$OPENAIR_TARGETS
/bin/oai_epc"
>
~/.gdb_epc
echo
"set args
$EXE_ARGUMENTS
"
>>
~/.gdb_epc
echo
"run"
>>
~/.gdb_epc
$SUDO
gdb
-nh
-x
~/.gdb_epc 2>&1
fi
;;
'HSS'
)
echo
"############# running HSS #############"
cd
$OPENAIR3_DIR
/OPENAIRHSS/objs
if
[
$RUN_GDB
-eq
0
]
;
then
$SUDO
exec
./openair-hss
-c
./conf/hss.conf
else
touch
~/.gdb_hss
chmod
777 ~/.gdb_hss
echo
"file ./openair-hss"
>
~/.gdb_hss
echo
"set args -c ./conf/hss.conf"
>>
~/.gdb_hss
echo
"run"
>>
~/.gdb_hss
$SUDO
gdb
-nh
-x
~/.gdb_hss 2>&1
fi
;;
'NONE'
)
;;
*
)
echo_error
"Unknown option
$BUILD_LTE
: do not execute"
;;
esac
else
echo_info
"11. No run requested, end of script"
exit
0
fi
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment