build_helper 12.8 KB
Newer Older
thomasl's avatar
thomasl committed
1
2
################################################################################
#
3
4
# Copyright (c) 2015, EURECOM (www.eurecom.fr)
# All rights reserved.
thomasl's avatar
thomasl committed
5
#
6
7
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
thomasl's avatar
thomasl committed
8
#
9
10
11
12
13
# 1. Redistributions of source code must retain the above copyright notice, this
#    list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright notice,
#    this list of conditions and the following disclaimer in the documentation
#    and/or other materials provided with the distribution.
thomasl's avatar
thomasl committed
14
#
15
16
17
18
19
20
21
22
23
24
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
thomasl's avatar
thomasl committed
25
#
26
27
28
# The views and conclusions contained in the software and documentation are those
# of the authors and should not be interpreted as representing official policies,
# either expressed or implied, of the FreeBSD Project.
thomasl's avatar
thomasl committed
29
30
#
################################################################################
31
# file build_helper
thomasl's avatar
thomasl committed
32
# brief
33
# authors Laurent Thomas, Lionel GAUTHIER
thomasl's avatar
thomasl committed
34
35
#
#######################################
36
SUDO='sudo -E'
thomasl's avatar
thomasl committed
37

38
39
40
41
42
43
44
###############################
## echo and  family
###############################
black='\E[30m'
red='\E[31m'
green='\E[32m'
yellow='\E[33m'
45
blue='\E[1;34m'
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
magenta='\E[35m'
cyan='\E[36m'
white='\E[37m'
reset_color='\E[00m'
COLORIZE=1

cecho()  {  
    # Color-echo
    # arg1 = message
    # arg2 = color
    local default_msg="No Message."
    message=${1:-$default_msg}
    color=${2:-$green}
    [ "$COLORIZE" = "1" ] && message="$color$message$reset_color"
    echo -e "$message"
    return
}

echo_error()   { cecho "$*" $red          ;}
echo_fatal()   { cecho "$*" $red; exit -1 ;}
echo_warning() { cecho "$*" $yellow       ;}
echo_success() { cecho "$*" $green        ;}
echo_info()    { cecho "$*" $blue         ;}

70

71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97

###########################
# Cleaners
###########################

clean_kernel() {
    $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"
    $SUDO rmmod nasmesh > /dev/null 2>&1
    $SUDO rmmod oai_nw_drv  > /dev/null 2>&1
    $SUDO rmmod openair_rf > /dev/null 2>&1
    $SUDO rmmod ue_ip > /dev/null 2>&1
    echo_info "removed drivers from kernel"
}

clean_all_files() {
98
 set_openair_env
thomasl's avatar
thomasl committed
99
 dir=$OPENAIR_DIR/cmake_targets
100
 rm -rf $dir/log $OPENAIR_DIR/targets/bin/* 
thomasl's avatar
thomasl committed
101
102
103
 rm -rf $dir/lte_build_oai $dir/lte-simulators/build
 rm -rf $dir/oaisim_build_oai/build $dir/oaisim_build_oai/CMakeLists.txt
 rm -rf $dir/autotests/bin $dir/autotests/log $dir/autotests/*/build 
104
105
106
107
108
109
}

###################################
# Compilers
###################################

thomasl's avatar
thomasl committed
110
compilations() {
thomasl's avatar
thomasl committed
111
  cd $OPENAIR_DIR/cmake_targets/$1/build
thomasl's avatar
thomasl committed
112
113
  {
    rm -f $3
114
    make -j`nproc` $2 VERBOSE=$VERBOSE_COMPILE
thomasl's avatar
thomasl committed
115
  } > $dlog/$2.$REL.txt 2>&1
116
  echo_info "Log file for compilation has been written to: $dlog/$2.$REL.txt"
thomasl's avatar
thomasl committed
117
  if [ -s $3 ] ; then
118
     cp $3 $4
thomasl's avatar
thomasl committed
119
     echo_success "$2 compiled"
thomasl's avatar
thomasl committed
120
  else
thomasl's avatar
thomasl committed
121
     echo_error "$2 compilation failed"
thomasl's avatar
thomasl committed
122
123
124
  fi
}

125
126
127
128
############################################
# External packages installers
############################################

thomasl's avatar
thomasl committed
129
130
131
install_nettle_from_source() {
    cd /tmp
    echo "Downloading nettle archive"
132
    rm -rf /tmp/nettle-2.5.tar.gz* /tmp/nettle-2.5
thomasl's avatar
thomasl committed
133
134
135
136
137
    wget ftp://ftp.lysator.liu.se/pub/security/lsh/nettle-2.5.tar.gz 
    tar -xzf nettle-2.5.tar.gz
    cd nettle-2.5/
    ./configure --disable-openssl --enable-shared --prefix=/usr 
    echo "Compiling nettle"
138
    make -j`nproc`
thomasl's avatar
thomasl committed
139
140
141
142
143
144
145
146
    make check 
    $SUDO make install 
    rm -rf /tmp/nettle-2.5.tar.gz /tmp/nettle-2.5
}

install_gnutls_from_source(){
    cd /tmp 
    echo "Downloading gnutls archive"
147
    rm -rf /tmp/gnutls-3.1.23.tar.xz* /tmp/gnutls-3.1.23
thomasl's avatar
thomasl committed
148
149
150
151
152
    wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.1/gnutls-3.1.23.tar.xz 
    tar -xzf gnutls-3.1.23.tar.xz
    cd gnutls-3.1.23/
    ./configure --prefix=/usr
    echo "Compiling gnutls"
153
    make -j`nproc`
thomasl's avatar
thomasl committed
154
155
156
157
    $SUDO make install 
    rm -rf /tmp/gnutls-3.1.23.tar.xz /tmp/gnutls-3.1.23
}

gauthier's avatar
   
gauthier committed
158
159


thomasl's avatar
thomasl committed
160
check_install_usrp_uhd_driver(){
thomasl's avatar
thomasl committed
161
162
        v=$(lsb_release -cs)
        $SUDO apt-add-repository "deb http://files.ettus.com/binaries/uhd/repo/uhd/ubuntu/$v $v main"
thomasl's avatar
thomasl committed
163
        $SUDO apt-get update
thomasl's avatar
thomasl committed
164
165
166
        $SUDO apt-get -y install  python python-tk libboost-all-dev libusb-1.0-0-dev
        $SUDO apt-get -y install -t `lsb_release -cs` uhd --force-yes
}
167
168
169
170
check_install_bladerf_driver(){
	$SUDO add-apt-repository -y ppa:bladerf/bladerf
	$SUDO apt-get update
	$SUDO apt-get install -y bladerf libbladerf-dev
nikaeinn's avatar
nikaeinn committed
171
172
173
	$SUDO apt-get install bladerf-firmware-fx3
	$SUDO apt-get install bladerf-fpga-hostedx40	
	bladeRF-cli --flash-firmware /usr/share/Nuand/bladeRF/bladeRF_fw.img	
174
}
thomasl's avatar
thomasl committed
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195

check_install_additional_tools (){
    $SUDO apt-get update
    $SUDO apt-get install -y \
	check \
	dialog \
	dkms \
	gawk \
	libboost-all-dev \
	libpthread-stubs0-dev \
	openvpn \
	phpmyadmin \
	pkg-config \
	python-dev  \
	python-pexpect \
	sshfs \
	swig  \
	tshark \
	uml-utilities \
	unzip  \
	valgrind  \
196
197
	vlan	  \
	ctags
thomasl's avatar
thomasl committed
198
199
200
201
202
}

check_install_oai_software() {
    
    $SUDO apt-get update
203
    $SUDO apt-get install -y \
gauthier's avatar
   
gauthier committed
204
    autoconf  \
thomasl's avatar
thomasl committed
205
206
207
208
209
210
	automake  \
	bison  \
	build-essential \
	cmake \
	cmake-curses-gui  \
	doxygen \
211
	doxygen-gui\
212
	texlive-latex-base\
thomasl's avatar
thomasl committed
213
214
	ethtool \
	flex  \
gauthier's avatar
   
gauthier committed
215
216
217
    gccxml \
    gdb  \
    git \
thomasl's avatar
thomasl committed
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
	graphviz \
	gtkwave \
	guile-2.0-dev  \
	iperf \
	iproute \
	iptables \
	iptables-dev \
	libatlas-base-dev \
	libatlas-dev \
	libblas3gf \
	libblas-dev \
	libconfig8-dev \
	libforms-bin \
	libforms-dev \
	libgcrypt11-dev \
	libgmp-dev \
	libgtk-3-dev \
	libidn2-0-dev  \
gauthier's avatar
   
gauthier committed
236
    libidn11-dev \
thomasl's avatar
thomasl committed
237
	libmysqlclient-dev  \
238
	liboctave-dev \
thomasl's avatar
thomasl committed
239
240
241
242
243
244
245
246
247
248
249
	libpgm-5.1 \
	libpgm-dev \
	libsctp1  \
	libsctp-dev  \
	libssl-dev  \
	libtasn1-3-dev  \
	libtool  \
	libusb-1.0-0-dev \
	libxml2 \
	libxml2-dev  \
	linux-headers-`uname -r` \
250
251
252
	mscgen  \
	octave \
	octave-signal \
thomasl's avatar
thomasl committed
253
254
255
256
	openssh-client \
	openssh-server \
	openssl \
	python  \
Rohit Gupta's avatar
Rohit Gupta committed
257
258
	subversion \
        xmlstarlet
259
    $SUDO update-alternatives --set liblapack.so /usr/lib/atlas-base/atlas/liblapack.so
thomasl's avatar
thomasl committed
260
261
    if [ `lsb_release -rs` = '12.04' ] ; then
        install_nettle_from_source
262
        install_gnutls_from_source
thomasl's avatar
thomasl committed
263
264
265
    else
        $SUDO apt-get install -y libgnutls-dev nettle-dev nettle-bin 
    fi
thomasl's avatar
thomasl committed
266
    install_asn1c_from_source
thomasl's avatar
thomasl committed
267
268
}

thomasl's avatar
thomasl committed
269
install_asn1c_from_source(){
270
    mkdir -p /tmp/asn1c-r1516
thomasl's avatar
thomasl committed
271
    cd /tmp/asn1c-r1516
272
    rm -rf /tmp/asn1c-r1516/*
thomasl's avatar
thomasl committed
273
    svn co https://github.com/vlm/asn1c/trunk  /tmp/asn1c-r1516 -r 1516 > /tmp/log_compile_asn1c
gauthier's avatar
gauthier committed
274
275
    patch -p0 < $OPENAIR_DIR/openair3/S1AP/MESSAGES/ASN1/asn1cpatch.p0 >> /tmp/log_compile_asn1c
    patch -p0 < $OPENAIR_DIR/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_2.p0 >> /tmp/log_compile_asn1c
276
    patch -p0 < $OPENAIR_DIR/openair2/RRC/LITE/MESSAGES/asn1c/asn1cpatch.p0 >> /tmp/log_compile_asn1c
277
    patch -p0 < $OPENAIR_DIR/openair3/S1AP/MESSAGES/ASN1/asn1cpatch_3.p0 >> /tmp/log_compile_asn1c
thomasl's avatar
thomasl committed
278
    ./configure
thomasl's avatar
thomasl committed
279
    make > /tmp/log_compile_asn1c 2>&1
thomasl's avatar
thomasl committed
280
    $SUDO make install
thomasl's avatar
thomasl committed
281
282
283
284
285
}

#################################################
# 2. compile 
################################################
thomasl's avatar
thomasl committed
286

thomasl's avatar
thomasl committed
287
install_nas_tools() {
gauthier's avatar
gauthier committed
288
289
290
291
292
  cd $1
  if [ ! -f .ue.nvram ]; then
    echo_success "generate .ue_emm.nvram .ue.nvram"
    ./nvram --gen
  else
gauthier's avatar
syntax    
gauthier committed
293
    [ ./nvram -nt .ue.nvram  -o ./nvram -nt .ue_emm.nvram ] && ./nvram --gen
gauthier's avatar
gauthier committed
294
  fi
thomasl's avatar
thomasl committed
295

gauthier's avatar
gauthier committed
296
297
298
299
300
301
  if [ ! -f .usim.nvram ]; then
    echo_success "generate .usim.nvram"
    ./usim --gen
  else
    [ ./usim -nt .usim.nvram ] && ./usim --gen
  fi
thomasl's avatar
thomasl committed
302
303

}
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
#################################################
# 3. Network interfaces utilities 
################################################

cidr2mask(){
  local i mask=""
  local full_octets=$(($1/8))
  local partial_octet=$(($1%8))

  for ((i=0;i<4;i+=1)); do
    if [ $i -lt $full_octets ]; then
      mask+=255
    elif [ $i -eq $full_octets ]; then
      mask+=$((256 - 2**(8-$partial_octet)))
    else
      mask+=0
    fi
    test $i -lt 3 && mask+=.
  done

  echo $mask
}

# example: netcalc 192.168.12.100 255.255.255.0
netcalc(){
  local IFS='.' ip i
  local -a oct msk
    
  read -ra oct <<<"$1"
  read -ra msk <<<"$2"

  for i in ${!oct[@]}; do
    ip+=( "$(( oct[i] & msk[i] ))" )
  done
    
  echo "${ip[*]}"
}

# example: 
bcastcalc(){
  local IFS='.' ip i
  local -a oct msk
    
  read -ra oct <<<"$1"
  read -ra msk <<<"$2"

  for i in ${!oct[@]}; do
    ip+=( "$(( oct[i] + ( 255 - ( oct[i] | msk[i] ) ) ))" )
  done
  echo "${ip[*]}"
}


is_real_interface(){
  my_bool=1
  for var in "$@"
  do
    if [ "a$var" == "a" ]; then
      return 0
    fi
    if [ "a$var" == "anone" ]; then
      return 0
    fi
    IF=`cat /etc/udev/rules.d/70-persistent-net.rules | grep $var | sed 's/^.*NAME=//' | tr -d '"'`
    if [ "$IF" == "$var" ]; then
      if [ "a${var:0:3}" != "aeth" ]; then
        if [ "a${var:0:4}" != "awlan" ]; then
          if [ "a${var:0:4}" != "awifi" ]; then
            my_bool=0;
          fi
        fi
      fi
    fi
  done
  return $my_bool
}

is_virtual_interface(){
  my_bool=1
  for var in "$@"
  do
    if [ "a$var" == "a" ]; then
      return 0
    fi
    if [ "a$var" == "anone" ]; then
      return 0
    fi
    num=`expr index "$var" :`
    
    if [ $num -eq 0 ]; then
      my_bool=0;
    fi
  done
  return $my_bool
}

# arg1 = interface name
# arg2 = ipv4 addr cidr
set_interface_up(){
  interface=$1
  address=${2%/*} #part before '/'
  cidr_netmask=${2#*/} # part after '/'

  if [ "a${interface:0:4}" == "anone" ]; then
    return;
  fi
  echo "ifconfig  $interface up"
  $SUDO ifconfig  $interface up
  sync
  netmask=`cidr2mask $cidr_netmask`
  broadcast=`bcastcalc $address $netmask`
  echo "ip -4 addr add  $address/$cidr_netmask broadcast $broadcast dev $interface"
  $SUDO ip -4 addr add  $address/$cidr_netmask broadcast $broadcast dev $interface
  sync
}

# arg1 = interface name
# arg2 = ipv4 addr cidr
set_virtual_interface_up(){
  interface=$1
  address=${2%/*} #part before '/'
  cidr_netmask=${2#*/} # part after '/'

  if [ "a${interface:0:4}" == "anone" ]; then
    return;
  fi
  $SUDO ifconfig  $interface down > /dev/null 2>&1
  sync
  echo "ifconfig  $interface $address up"
  $SUDO ifconfig  $interface $address up
  sync
}

#arg1 is interface name
#arg2 is IP address (CIDR)
set_network_interface(){
  local interface_name=$1
  local ip_cidr=$2
  
  is_virtual_interface $interface_name
  if [ $? -eq 1 ]; then
    echo "$interface_name is virtual interface"
    set_virtual_interface_up $interface_name $ip_cidr
  else 
    is_real_interface $interface_name
    if [ $? -eq 1 ]; then
      echo "$interface_name is real interface"
      set_interface_up $interface_name $ip_cidr
    else
      echo_warning "$interface_name not handled, not configuring it"
      return
    fi
  fi
}

# arg1 is a 'libconfig-like' config file
set_epc_network_interfaces(){
  value="`cat $1 | cut -d "#" -f1 | grep 'ADDRESS\|INTERFACE' | tr -d " " | grep "="`"
  eval $value
  
  # check all var names are correct
  list_var_name="\
        ENB_INTERFACE_NAME_FOR_S1_MME         ENB_IPV4_ADDRESS_FOR_S1_MME \
        ENB_INTERFACE_NAME_FOR_S1U            ENB_IPV4_ADDRESS_FOR_S1U "
  for var_name in $list_var_name
  do
    if [ -n "$${var_name}" ]; then
      echo_success "Found ${var_name} = ${!var_name}"
    else
      echo_fatal "${var_name} does does not exist in your config file $1"
    fi
  done

  # configure interfaces
  set_network_interface  $ENB_INTERFACE_NAME_FOR_S1_MME         $ENB_IPV4_ADDRESS_FOR_S1_MME 
  set_network_interface  $ENB_INTERFACE_NAME_FOR_S1U            $ENB_IPV4_ADDRESS_FOR_S1U 
}
thomasl's avatar
thomasl committed
481

482

thomasl's avatar
thomasl committed
483
484
485
486
487
488
489
490
491

################################
# set_openair_env
###############################
set_openair_env(){
    fullpath=`readlink -f $BASH_SOURCE`
    [ -f "/.$fullpath" ] || fullpath=`readlink -f $PWD/$fullpath`
    openair_path=${fullpath%/cmake_targets/*}
    openair_path=${openair_path%/targets/*}
thomasl's avatar
thomasl committed
492
    openair_path=${openair_path%/openair[123]/*}    
thomasl's avatar
thomasl committed
493
494
495
496
497
498
499
    export OPENAIR_DIR=$openair_path
    export OPENAIR1_DIR=$openair_path/openair1
    export OPENAIR2_DIR=$openair_path/openair2
    export OPENAIR3_DIR=$openair_path/openair3
    export OPENAIR_TARGETS=$openair_path/targets
}