- Fix: avoid infinite loop on mulitcast read thread if no data to read

Pre-ci test passed

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4000 818b1a75-f10b-46b9-bf7c-635c3b92a50f
This commit is contained in:
Cedric Roux
2013-06-25 09:05:02 +00:00
commit 56c66c09aa
4111 changed files with 2133103 additions and 0 deletions
@@ -0,0 +1,14 @@
all: oaisim nasmesh
oaisim:
(cd $(OPENAIR_TARGETS)/SIMU/USER && make oaisim NAS=1)
nasmesh:
(cd $(OPENAIR2_DIR) && make nasmesh_netlink.ko)
(cd $(OPENAIR2_DIR)/NAS/DRIVER/MESH/RB_TOOL/ && make)
one_eNB_one_UE: oaisim nasmesh
userclean: clean oaisim nasmesh
clean:
(cd $(OPENAIR_TARGETS)/SIMU/USER && make clean)
+27
View File
@@ -0,0 +1,27 @@
#!/bin/sh
echo "Bringup eNB interface"
sudo rmmod nasmesh
make all
sudo insmod $OPENAIR2_DIR/NAS/DRIVER/MESH/nasmesh.ko
#avoid conflict with reserved multicast addresses (224.0.0.11,224.0.0.13, 224.0.0.16)
#sudo route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0
sudo ip route add 239.0.0.160/28 dev eth0
sudo ifconfig oai0 10.0.1.1 netmask 255.255.255.0 broadcast 10.0.1.255
$OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL/rb_tool -a -c0 -i0 -z0 -s 10.0.1.1 -t 10.0.1.2 -r 3
echo "to see eNB stats, pleasae run : watch_enb script"
if [ -z $1 ]; then
echo "nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -u0 -M0 -p2 -g3 -l3 > /dev/null"
nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -u0 -M0 -p2 -g3 -l3 > /dev/null
else
if [ $1 = "all" ]; then
echo "nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -u0 -M0 -p2 -g3 -l7"
nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -u0 -M0 -p2 -g3 -l7
else
echo "nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -u0 -M0 -p2 -g3 -l7 | grep -i $1"
nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -u0 -M0 -p2 -g3 -l7 | grep -i $1
fi
fi
echo "End"
+28
View File
@@ -0,0 +1,28 @@
#!/bin/sh
echo "Bringup UE interface"
sudo rmmod nasmesh
make nasmesh all
sudo insmod $OPENAIR2_DIR/NAS/DRIVER/MESH/nasmesh.ko
#avoid conflict with reserved multicast addresses (224.0.0.11,224.0.0.13, 224.0.0.16)
#sudo route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0
sudo ip route add 239.0.0.160/28 dev eth0
sudo ifconfig oai0 10.0.1.2 netmask 255.255.255.0 broadcast 10.0.1.255
$OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL/rb_tool -a -c0 -i0 -z0 -s 10.0.1.2 -t 10.0.1.1 -r 3
echo "to see UE stats, pleasae run : watch_ue script"
if [ -z $1 ]; then
echo "nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -b0 -M1 -p2 -g3 -l3 > /dev/null"
nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -b0 -M1 -p2 -g3 -l3 > /dev/null
else
if [ $1 = "all" ]; then
echo "nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -b0 -M1 -p2 -g3 -l7"
nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -b0 -M1 -p2 -g3 -l7
else
echo "nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -b0 -M1 -p2 -g3 -l7 | grep -i $1"
nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -b0 -M1 -p2 -g3 -l7 | grep -i $1
fi
fi
echo "End"
@@ -0,0 +1,209 @@
#!/usr/bin/python
import os, sys, warnings
import serial
def sendToTTY(lineP):
sys.stdout.write("\nSend:\n" + lineP+"\n")
g_ser.write(lineP)
g_ser.flush()
g_ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
buffer = ''
while True:
buffer += g_ser.read(1)
#sys.stdout.write("buffer is now:\n" + buffer+"\n")
buffer = buffer.lstrip('\r')
if '\r' in buffer:
at_received, buffer = buffer.split('\r')[-2:]
at_received = at_received.strip('\n')
at_received = at_received.strip('\r')
if at_received == '\n' or at_received == '' or at_received == '\r':
break
else:
sys.stdout.write("Receive stripped:\n" + at_received+"\n")
# Q0 = enable codes
# Q1 = disable codes
if at_received == 'ATE0Q0V1':
sendToTTY('\rOK\r')
# ATS0, Automatic Answer
# This S-parameter controls the automatic answering feature of the modem
# 0 automatic answering is disabled
# 1 - 255 enable automatic answering on the ring number specified
# here value received is 0
elif at_received.startswith('ATS0='):
sendToTTY('\rOK\r')
# AT+CMEEReport mobile equipment error
#0 Disable +CME ERROR result code. Use ERROR instead.
#1 Enable +CME ERROR result code and use numeric<err> values
#2 Enable +CME ERROR result code and use verbose<err> values
# here value received is 1
elif at_received.startswith('AT+CMEE='):
sendToTTY('\rOK\r')
# Network registration events
# AT+CREGNetwork registration (ver. 2)
# Description:
# Controls the presentation of an unsolicited result code +CREG : <stat>
# when <n>=1 and there is a change in the ME network registration status or
# code +CREG: <stat>[,<lac>,<ci>] when <n>=2 and there is a change of thenetwork cell.
# Read command returns the status of result code presentation and an integer <stat>,
# which shows whether the network has currently indicated the registration of the ME.
# Location information elements <lac> and <ci> are returned only when <n>=2 and ME
# is registered in the network.
# <n>:
# 0 Disable network registration unsolicited result code. Default value
# 1 Enable network registration unsolicited result code,+CREG: <stat>
# 2 Enable network registration and location information unsolicited result code, +CREG:<stat>[,<lac>,<ci>]
# <stat>:
# 0 not registered new operator to registered and not searching
# 1 registered, home network
# 2 not registered, currently searching a new operator to register with
# 3 registration denied
# 4 unknown
# 5 registered, roaming
elif at_received == 'AT+CREG=2':
sendToTTY('\rOK\r')
sendToTTY('+CREG: 1,00C3,01021A02 \r')
elif at_received == 'AT+CREG=1':
sendToTTY('\rOK\r')
sendToTTY('+CREG: 1\r')
elif at_received == 'AT+CREG?':
sendToTTY('+CREG: 1,00C3,01021A02\r\nOK\r')
# GPRS registration events
# +CGREGNetwork registration reporting
# Packet domain network registration status AT+CGPADDRShow PDP address
# Description:
# Controls the presentation of the unsolicited result code +CGREG: <stat>
# when <n>='1' and there is a change in the ME GPRS network registration status or
# +CGREG: <stat>[,<lac>,<ci>] when <n>='2' and there is achange of the network cell.
# ---
# Note: If the GPRS MT also supports circuit mode services,
# AT+CREG and the +CREG result code apply to the registration status and location
# information for those services. The read command returns the status of result
# code presentation and an integer <stat> which shows whether the network has
# currently indicated the registration of the ME.
# Location information elements <lac> and <ci> are returned only when <n>=2
# and ME is registered in the network.
elif at_received == 'AT+CGREG=1':
sendToTTY('\rOK\r')
sendToTTY('+CGREG: 1\r')
elif at_received == 'AT+CGREG?':
sendToTTY('+CGREG: 0,1\r\nOK\r')
# Call Waiting notifications
elif at_received == 'AT+CCWA=1':
sendToTTY('\rOK\r')
# Alternating voice/data off
elif at_received == 'AT+CMOD=0':
sendToTTY('\rOK\r')
# +CSSU unsolicited supp service notifications
elif at_received == 'AT+CSSN=0,1':
sendToTTY('\rOK\r')
# no connected at_received identification
elif at_received == 'AT+COLP=0':
sendToTTY('+COLP:0\r\nOK\r')
# HEX character set
# AT+CSCSSelect TE character set (ver. 3)
elif at_received == 'AT+CSCS=\"HEX\"':
sendToTTY('\rOK\r')
# USSD unsolicited
# AT+CUSD Unstructured supplementary service data (ver. 2)
# <n>
# 0 Disable result code presentation in the TA.Defaultvalue
# 1 Enable result code presentation in the TA
# 2 Terminate (abort) USSD dialogue. This value is not applicable to the read command response. Notsupported
elif at_received == 'AT+CUSD=1':
sendToTTY('\rOK\r')
# Enable +CGEV GPRS event notifications, but don't buffer
# AT+CGEREPPacket domain event reporting (ver. 1)
elif at_received == 'AT+CGEREP=1,0':
sendToTTY('\rOK\r')
# SMS PDU mode
# AT+CMGF Message format (ver. 1)
elif at_received == 'AT+CMGF=0':
sendToTTY('\rOK\r')
elif at_received == 'AT+CPIN?':
sendToTTY('\r+CPIN: READY\r\nOK\r')
#sendToTTY('\rOK\r')
# AT+CFUNSet phone functionality (ver. 2)
# 0 Minimum functionality, that is, the phone is turnedoff. Default value
# 1 Full functionality, that is, the phone is turned on
# 2 Disable phone transmit RF circuits only. Notsupported
# 3 Disable phone receive RF circuits only. Notsupported
# 4 Disable phone transmit and receive RF circuits.Note: This is often referred to as "flight mode"
# 5 GSM only (WCDMA radio off)
# 6 WCDMA only (GSM radio off)
elif at_received == 'AT+CFUN?':
sendToTTY('+CFUN: 1\r\nOK\r')
elif at_received == 'AT+CFUN=1':
sendToTTY('\rOK\r')
# AT+CLCCList current calls
# Description:
# Returns the list of current calls. If command succeeds but no calls areavailable, no information response is sent to TE
elif at_received == 'AT+CLCC':
sendToTTY('+CLCC: \r\nOK\r')
# AT+COPSOperator selection (ver. 2)
# AT+COPS=[<mode>[,<format>[,<oper>[,AcT]]]]
#
# <mode> Description
# 0 Automatic (<oper> field is ignored.) Default value
# 1 Manual (<oper> field will be present)
# 2 Deregister from network. Not supported
# 3 Set only <format> (for read command +COPS?), donot attempt registration/deregistration (<oper> field is ignored).
# This value is not applicable in readcommand response
# 4 Manual/automatic (<oper> field will be present). Ifmanual selection fails, automatic mode (<mode>=0)is entered
elif at_received == 'AT+COPS=3,0;+COPS?;+COPS=3,1;+COPS?;+COPS=3,2;+COPS?':
sendToTTY('+COPS: 0,0, \"Free - Mobile\"\r\n+COPS: 0,1, \"Free\"\r\n+COPS: 0,2, \"310170\"\r\nOK\r')
elif at_received == 'AT+COPS?':
#sendToTTY('+COPS: 0,0, \"Free - Mobile\"\r\n+COPS: 0,1, \"Free\"\r\n+COPS: 0,2, \"310170\"\r\nOK\r')
sendToTTY('+COPS: 0,0, \"Free - Mobile\"\r\nOK\r')
elif at_received == 'AT+COPS=0':
#sendToTTY('+COPS: 0,0, \"Free - Mobile\"\r\n+COPS: 0,1, \"Free\"\r\n+COPS: 0,2, \"310170\"\r\nOK\r')
sendToTTY('+COPS: 0,0, \"Free - Mobile\"\r\nOK\r')
# IMEI
elif at_received == 'AT+CGSN':
sendToTTY('+CGSN:534500314160207\r\nOK\r')
# Signal quality (ver.1)
# Returns received signal strength indication <rssi> and channel bit errorrate <ber> from the phone.
elif at_received == 'AT+CSQ':
#31,7
sendToTTY('+CSQ:8,7\r\nOK\r')
else:
sendToTTY('\rOK\r')
@@ -0,0 +1,20 @@
all: oaisim naslite_netlink_ether
oaisim:
(cd $(OPENAIR_TARGETS)/SIMU/USER && make oaisim OAI_NW_DRIVER_TYPE_ETHERNET=1 NAS_NETLINK=1)
naslite_netlink_ether:
(cd $(OPENAIR2_DIR) && make naslite_netlink_ether.ko)
(cd $(OPENAIR2_DIR)/NAS/DRIVER/LITE/RB_TOOL/ && make)
remserial:
(cd $(OPENAIR3_DIR)/UTILS/REMSERIAL-1.4.UDP && make all)
(cp -upv $(OPENAIR3_DIR)/UTILS/REMSERIAL-1.4.UDP/remserial /usr/bin/remserial.udp)
one_eNB_one_UE: oaisim naslite_netlink_ether
userclean: clean oaisim naslite_netlink_ether
clean:
(cd $(OPENAIR_TARGETS)/SIMU/USER && make clean)
(cd $(OPENAIR2_DIR)/NAS/DRIVER/LITE && make clean)
(cd $(OPENAIR2_DIR) && make clean)
@@ -0,0 +1,86 @@
#!/bin/sh
echo "Bringup eNB interface"
ip link set oai0 down
rmmod nasmesh
make naslite_netlink_ether oaisim
insmod $OPENAIR2_DIR/NAS/DRIVER/LITE/nasmesh.ko nas_IMEI=3,9,1,8,3,6,6,2,0,0,0,0,0,0
#avoid conflict with reserved multicast addresses (224.0.0.11,224.0.0.13, 224.0.0.16)
#route add -net 224.0.0.0 netmask 240.0.0.0 dev eth2
#ip addr add dev eth1 192.168.14.145/24 broadcast 192.168.14.255
ip link set oai0 broadcast ff:ff:ff:ff:ff:ff
#ip route add 192.168.14.0/24 dev eth2
ip route add 224.0.0.160/28 dev eth1
ip link set oai0 up
sleep 1
EXTIF="eth0"
INTIF="oai0"
IPTABLES=/sbin/iptables
#IPTABLES=/usr/local/sbin/iptables
DEPMOD=/sbin/depmod
MODPROBE=/sbin/modprobe
echo " External Interface: $EXTIF"
echo " Internal Interface: $INTIF"
echo "----------------------------------------------------------------------"
echo -en "ip_tables, "
$MODPROBE ip_tables
echo -en "ip_conntrack, "
$MODPROBE ip_conntrack
echo -en "ip_conntrack_irc, "
$MODPROBE ip_conntrack_irc
echo -en "iptable_nat, "
$MODPROBE iptable_nat
echo -e " Done loading modules.\n"
echo " Enabling forwarding.."
echo "1" > /proc/sys/net/ipv4/ip_forward
echo " Enabling DynamicAddr.."
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
echo " Clearing any existing rules and setting default policy.."
$IPTABLES -P INPUT ACCEPT
$IPTABLES -F INPUT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -F OUTPUT
$IPTABLES -P FORWARD DROP
$IPTABLES -F FORWARD
$IPTABLES -t nat -F
$IPTABLES -t mangle -F
$IPTABLES -t filter -F
echo " FWD: Allow all connections OUT and only existing and related ones IN"
$IPTABLES -A FORWARD -i $EXTIF -o $INTIF -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -i $INTIF -o $EXTIF -j ACCEPT
#$IPTABLES -A FORWARD -j LOG
echo " Enabling SNAT (MASQUERADE) functionality on $EXTIF"
$IPTABLES -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE
ifconfig oai0 10.0.1.1 netmask 255.255.255.0 broadcast 10.0.1.255
sleep 1
#$OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL/rb_tool -a -c0 -i0 -z0 -s 10.0.1.1 -t 10.0.1.2 -r 3
ip addr add dev oai0 2001:1::1/64
# -a -> Add RB
# -d -> Delete RB
# -cxx -> lcr (uid of a cx_entity)
# -ixx -> instance
# -zxx -> dscp
# -fxxx -> classref (uid of a classifier entry) if fn is used , fn is used for send classifier and n+1 for receive classifier
# -sxxx -> source ipv4 address
# -txxx -> destination ipv4 address
# -x -> source ipv6 address
# -y -> destination ipv6 address
# -r -> radio bearer id
echo "rb_tool -a -c0 -i0 -f0 -z0 -x 2001:1::1/128 -y 2001:1::2/128 -r 3"
$OPENAIR2_DIR/NAS/DRIVER/LITE/RB_TOOL/rb_tool -a -c0 -i0 -f0 -z0 -x 2001:1::1/128 -y 2001:1::2/128 -r 3
echo "rb_tool -a -c0 -i0 -f2 -z63 -s 10.0.1.1/32 -t 10.0.1.2/32 -r 3"
$OPENAIR2_DIR/NAS/DRIVER/LITE/RB_TOOL/rb_tool -a -c0 -i0 -f2 -z64 -s 10.0.1.1/32 -t 10.0.1.2/32 -r 3
echo "rb_tool -a -c0 -i0 -f2 -z63 -s 10.0.1.1/32 -t 10.0.1.2/32 -r 3"
$OPENAIR2_DIR/NAS/DRIVER/LITE/RB_TOOL/rb_tool -a -c0 -i0 -f4 -z64 -s 0.0.0.0/32 -t 0.0.0.0/32 -r 3
echo "to see eNB stats, please run : watch_enb script"
echo "$OPENAIR_TARGETS/SIMU/USER/oaisim -u0 -M0 -p2 -g3 -l3 > /dev/null"
nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -u0 -M0 -p2 -g3 -l3 | grep RLC
echo "End"
@@ -0,0 +1,320 @@
#!/bin/bash
#
#------------------------------------------------
MAKE_IP_DRIVER_TARGET="naslite_netlink_ether"
MAKE_LTE_ACCESS_STRATUM_TARGET="oaisim"
IP_DRIVER_NAME=oai_nw_drv
###########################################################
# CONFIGURE OPTIONS
EMULIF="eth1"
LTEIF="oai0"
EXTIF="eth0"
INTIF=$LTEIF
#----------------------------------------------------------
LTE_NETWORK_CIDR="10.0.1.0/24"
ENB_IPv4="10.0.1.1"
ENB_IPv6="2001:1::1"
ENB_IPv6_CIDR=$ENB_IPv6"/64"
ENB_IPv4_CIDR=$ENB_IPv4"/24"
ENB_IF_ID="3,9,1,8,3,6,6,2,0,0,0,0,0,0"
#----------------------------------------------------------
UE_IPv4="10.0.1.2"
UE_IPv6="2001:1::2"
UE_IPv6_CIDR=$UE_IPv6"/64"
UE_IPv4_CIDR=$UE_IPv4"/24"
#----------------------------------------------------------
# +-------+ +-------+
# | eNB | EMULIF | UE |
# | +---------------------+ |
# | | | |
# | | | |
# | | | |
# | | | |
# | | | |
# | | | |
# | | LTEIF | |
# | +.................... + |
# | |ENB_IPv4 UE_IPv4_CIDR| |
# +-------+ LTE link over +-------+
# UDP over ethernet
###########################################################
IPTABLES=/sbin/iptables
THIS_SCRIPT_PATH=$(dirname $(readlink -f $0))
declare -x OPENAIR_DIR=""
declare -x OPENAIR1_DIR=""
declare -x OPENAIR2_DIR=""
declare -x OPENAIR3_DIR=""
declare -x OPENAIR_TARGETS=""
###########################################################
black='\E[30m'
red='\E[31m'
green='\E[32m'
yellow='\E[33m'
blue='\E[34m'
magenta='\E[35m'
cyan='\E[36m'
white='\E[37m'
ROOT_UID=0
E_NOTROOT=67
cecho() # Color-echo
# arg1 = message
# arg2 = color
{
local default_msg="No Message."
message=${1:-$default_msg}
color=${2:-$black}
echo -e "$color"
echo -n "$message"
tput sgr0
echo
return
}
echo_error() {
local my_string=""
until [ -z "$1" ]
do
my_string="$my_string$1"
shift
done
cecho "$my_string" $red
}
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
}
set_openair() {
path=`pwd`
declare -i length_path
declare -i index
length_path=${#path}
index=`echo $path | grep -b -o 'targets' | cut -d: -f1`
#echo ${path%$token*}
if [[ $index -lt $length_path && index -gt 0 ]]
then
declare -x OPENAIR_DIR
index=`expr $index - 1`
openair_path=`echo $path | cut -c1-$index`
#openair_path=`echo ${path:0:$index}`
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
return 0
fi
return -1
}
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
}
assert() {
# If condition false
# exit from script with error message
E_PARAM_ERR=98
E_PARAM_FAILED=99
if [ -z "$2" ] # Not enought parameters passed.
then
return $E_PARAM_ERR
fi
lineno=$2
if [ ! $1 ]
then
echo "Assertion failed: \"$1\""
echo "File \"$0\", line $lineno"
exit $E_ASSERT_FAILED
fi
}
#bash_exec "set_openair"
set_openair
cecho "OPENAIR_DIR = $OPENAIR_DIR" $green
cecho "OPENAIR1_DIR = $OPENAIR1_DIR" $green
cecho "OPENAIR2_DIR = $OPENAIR2_DIR" $green
cecho "OPENAIR3_DIR = $OPENAIR3_DIR" $green
cecho "OPENAIR_TARGETS = $OPENAIR_TARGETS" $green
echo "Bringup UE interface"
bash_exec "rmmod $IP_DRIVER_NAME"
cecho "make $MAKE_IP_DRIVER_TARGET $MAKE_LTE_ACCESS_STRATUM_TARGET....." $green
bash_exec "make $MAKE_IP_DRIVER_TARGET $MAKE_LTE_ACCESS_STRATUM_TARGET"
bash_exec "insmod $OPENAIR2_DIR/NAS/DRIVER/LITE/$IP_DRIVER_NAME.ko oai_nw_drv_IMEI=$ENB_IF_ID"
echo " Enabling proxy ARP.."
bash_exec "sysctl -w net.ipv4.conf.all.proxy_arp=1"
assert "`sysctl -n net.ipv4.conf.all.proxy_arp` -eq 1" $LINENO
echo " Enabling ipv4 forwarding.."
bash_exec "sysctl -w net.ipv4.ip_forward=1"
assert "`sysctl -n net.ipv4.ip_forward` -eq 1" $LINENO
bash_exec "sysctl -w net.ipv4.conf.all.forwarding=1"
assert "`sysctl -n net.ipv4.conf.all.forwarding` -eq 1" $LINENO
echo " Enabling ipv6 forwarding.."
bash_exec "sysctl -w net.ipv6.conf.all.forwarding=1"
assert "`sysctl -n net.ipv6.conf.all.forwarding` -eq 1" $LINENO
echo " Enabling DynamicAddr.."
bash_exec "sysctl -w net.ipv4.ip_dynaddr=1"
assert " `sysctl -n net.ipv4.ip_dynaddr` -eq 1" $LINENO
bash_exec "ip route flush cache"
bash_exec "ip route add 239.0.0.160/28 dev $EMULIF"
bash_exec "ip link set $LTEIF broadcast ff:ff:ff:ff:ff:ff"
bash_exec "ip link set $LTEIF up"
sleep 1
assert " -x $IPTABLES " $LINENO
bash_exec "$IPTABLES -P INPUT ACCEPT"
bash_exec "$IPTABLES -F INPUT"
bash_exec "$IPTABLES -P OUTPUT ACCEPT"
bash_exec "$IPTABLES -F OUTPUT"
bash_exec "$IPTABLES -P FORWARD DROP"
bash_exec "$IPTABLES -F FORWARD"
bash_exec "$IPTABLES -t nat -F"
bash_exec "$IPTABLES -t mangle -F"
bash_exec "$IPTABLES -t filter -F"
echo " External Interface: $EXTIF"
echo " Internal Interface: $INTIF"
bash_exec "modprobe ip_tables"
bash_exec "modprobe ip_conntrack"
bash_exec "modprobe ip_conntrack_ftp"
bash_exec "modprobe nf_conntrack_h323"
bash_exec "modprobe nf_conntrack_irc"
bash_exec "modprobe nf_conntrack_pptp"
bash_exec "modprobe nf_conntrack_proto_gre"
bash_exec "modprobe nf_conntrack_proto_sctp"
bash_exec "modprobe nf_conntrack_tftp"
bash_exec "modprobe nf_conntrack_sip"
bash_exec "modprobe iptable_nat"
bash_exec "modprobe x_tables"
bash_exec "sysctl -w net.ipv4.conf.all.log_martians=1"
assert " `sysctl -n net.ipv4.conf.all.log_martians` -eq 1" $LINENO
bash_exec "sysctl -w net.ipv4.conf.$LTEIF.log_martians=1"
assert " `sysctl -n net.ipv4.conf.$LTEIF.log_martians` -eq 1" $LINENO
bash_exec "sysctl -w net.ipv4.conf.$EXTIF.log_martians=1"
assert " `sysctl -n net.ipv4.conf.$EXTIF.log_martians` -eq 1" $LINENO
bash_exec "sysctl -w net.ipv4.conf.$INTIF.log_martians=1"
assert " `sysctl -n net.ipv4.conf.$INTIF.log_martians` -eq 1" $LINENO
echo " Disabling reverse path filtering"
bash_exec "sysctl -w net.ipv4.conf.all.rp_filter=0"
assert " `sysctl -n net.ipv4.conf.all.rp_filter` -eq 0" $LINENO
bash_exec "sysctl -w net.ipv4.conf.$LTEIF.rp_filter=0"
assert " `sysctl -n net.ipv4.conf.$LTEIF.rp_filter` -eq 0" $LINENO
bash_exec "sysctl -w net.ipv4.conf.$EXTIF.rp_filter=0"
assert " `sysctl -n net.ipv4.conf.$EXTIF.rp_filter` -eq 0" $LINENO
bash_exec "sysctl -w net.ipv4.conf.$INTIF.rp_filter=0"
assert " `sysctl -n net.ipv4.conf.$INTIF.rp_filter` -eq 0" $LINENO
bash_exec "$IPTABLES -A FORWARD -i $EXTIF -o $INTIF -m state --state ESTABLISHED,RELATED -j ACCEPT"
bash_exec "$IPTABLES -A FORWARD -i $INTIF -o $EXTIF -j ACCEPT"
bash_exec "$IPTABLES -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE"
bash_exec "ip route flush cache"
bash_exec "ip addr add dev $LTEIF $ENB_IPv4_CIDR"
sleep 1
bash_exec "ip addr add dev $LTEIF $ENB_IPv6_CIDR"
sleep 1
# -a -> Add RB
# -d -> Delete RB
# -cxx -> lcr
# -ixx -> instance
# -zxx -> dscp
# -fxxx -> classref (uid of a classifier entry) if fn is used , fn is used for send classifier and n+1 for receive classifier
# -sxxx -> source ipv4 address
# -txxx -> destination ipv4 address
# -x -> source ipv6 address
# -y -> destination ipv6 address
# -r -> radio bearer id
bash_exec "$OPENAIR2_DIR/NAS/DRIVER/LITE/RB_TOOL/rb_tool -a -c0 -f0 -i0 -z0 -x $ENB_IPv6 -y $UE_IPv6 -r 3"
bash_exec "$OPENAIR2_DIR/NAS/DRIVER/LITE/RB_TOOL/rb_tool -a -c0 -f2 -i0 -z64 -s $ENB_IPv4/32 -t $UE_IPv4/32 -r 3"
bash_exec "$OPENAIR2_DIR/NAS/DRIVER/LITE/RB_TOOL/rb_tool -a -c0 -f4 -i0 -z64 -s 0.0.0.0/32 -t 0.0.0.0/32 -r 3"
sleep 1
echo "#####################################################################"
echo "iptables -t nat -nvL"
echo "---------------------------------------------------------------------"
iptables -t nat -nvL
echo "#####################################################################"
echo "ip route show table main"
echo "---------------------------------------------------------------------"
ip route show table main
echo "$OPENAIR_TARGETS/SIMU/USER/oaisim -u0 -M0 -p2 -g3 -l3 > /dev/null"
nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -u0 -M0 -p2 -g3 -l3 > /dev/null
@@ -0,0 +1,259 @@
#!/bin/bash
#
#------------------------------------------------
MAKE_IP_DRIVER_TARGET="naslite_netlink_ether"
MAKE_LTE_ACCESS_STRATUM_TARGET="oaisim"
IP_DRIVER_NAME=oai_nw_drv
###########################################################
# CONFIGURE OPTIONS
EMULIF="eth0"
LTEIF="oai0"
#----------------------------------------------------------
LTE_NETWORK_CIDR="10.0.1.0/24"
ENB_IPv4="10.0.1.1"
ENB_IPv6="2001:1::1"
#----------------------------------------------------------
UE_IPv4="10.0.1.2"
UE_IPv6="2001:1::2"
UE_IPv6_CIDR=$UE_IPv6"/64"
UE_IPv4_CIDR=$UE_IPv4"/24"
UE_IMEI="3,9,1,8,3,6,7,3,0,0,0,0,0,0"
#----------------------------------------------------------
# +-------+ +-------+
# | eNB | EMULIF | UE |
# | +---------------------+ +
# | | | |
# | | | |
# | | | |
# | | | |
# | | | +
# | | | |
# | | LTEIF | |
# | +.................... + |
# | |ENB_IPv4 UE_IPv4_CIDR| |
# +-------+ LTE link over +-------+
###########################################################
IPTABLES=/sbin/iptables
THIS_SCRIPT_PATH=$(dirname $(readlink -f $0))
declare -x OPENAIR_DIR=""
declare -x OPENAIR1_DIR=""
declare -x OPENAIR2_DIR=""
declare -x OPENAIR3_DIR=""
declare -x OPENAIR_TARGETS=""
###########################################################
black='\E[30m'
red='\E[31m'
green='\E[32m'
yellow='\E[33m'
blue='\E[34m'
magenta='\E[35m'
cyan='\E[36m'
white='\E[37m'
ROOT_UID=0
E_NOTROOT=67
cecho() # Color-echo
# arg1 = message
# arg2 = color
{
local default_msg="No Message."
message=${1:-$default_msg}
color=${2:-$black}
echo -e "$color"
echo -n "$message"
tput sgr0
echo
return
}
echo_error() {
local my_string=""
until [ -z "$1" ]
do
my_string="$my_string$1"
shift
done
cecho "$my_string" $red
}
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
}
set_openair() {
path=`pwd`
declare -i length_path
declare -i index
length_path=${#path}
index=`echo $path | grep -b -o 'targets' | cut -d: -f1`
#echo ${path%$token*}
if [[ $index -lt $length_path && index -gt 0 ]]
then
declare -x OPENAIR_DIR
index=`expr $index - 1`
openair_path=`echo $path | cut -c1-$index`
#openair_path=`echo ${path:0:$index}`
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
return 0
fi
return -1
}
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
}
assert() {
# If condition false
# exit from script with error message
E_PARAM_ERR=98
E_PARAM_FAILED=99
if [ -z "$2" ] # Not enought parameters passed.
then
return $E_PARAM_ERR
fi
lineno=$2
if [ ! $1 ]
then
echo "Assertion failed: \"$1\""
echo "File \"$0\", line $lineno"
exit $E_ASSERT_FAILED
fi
}
ctrl_c() {
bash_exec "pkill oaisim"
bash_exec "ip link set $LTEIF down"
bash_exec "rmmod $IP_DRIVER_NAME"
bash_exec "$IPTABLES -P INPUT ACCEPT"
bash_exec "$IPTABLES -F INPUT"
bash_exec "$IPTABLES -P OUTPUT ACCEPT"
bash_exec "$IPTABLES -F OUTPUT"
bash_exec "$IPTABLES -P FORWARD ACCEPT"
bash_exec "$IPTABLES -F FORWARD"
bash_exec "$IPTABLES -t nat -F"
bash_exec "$IPTABLES -t mangle -F"
bash_exec "$IPTABLES -t filter -F"
bash_exec "ip route flush cache"
}
#bash_exec "set_openair"
set_openair
cecho "OPENAIR_DIR = $OPENAIR_DIR" $green
cecho "OPENAIR1_DIR = $OPENAIR1_DIR" $green
cecho "OPENAIR2_DIR = $OPENAIR2_DIR" $green
cecho "OPENAIR3_DIR = $OPENAIR3_DIR" $green
cecho "OPENAIR_TARGETS = $OPENAIR_TARGETS" $green
echo "Bringup UE interface"
bash_exec "rmmod $IP_DRIVER_NAME"
cecho "make $MAKE_IP_DRIVER_TARGET $MAKE_LTE_ACCESS_STRATUM_TARGET ....." $green
bash_exec "make $MAKE_IP_DRIVER_TARGET $MAKE_LTE_ACCESS_STRATUM_TARGET "
bash_exec "insmod $OPENAIR2_DIR/NAS/DRIVER/LITE/$IP_DRIVER_NAME.ko oai_nw_drv_IMEI=$UE_IMEI"
bash_exec "ip route flush cache"
bash_exec "ip route add 239.0.0.160/28 dev $EMULIF"
bash_exec "ip link set $LTEIF broadcast ff:ff:ff:ff:ff:ff"
bash_exec "ip link set $LTEIF up"
sleep 1
bash_exec "ip addr add dev $LTEIF $UE_IPv4_CIDR"
bash_exec "ip addr add dev $LTEIF $UE_IPv6_CIDR"
# -a -> Add RB
# -d -> Delete RB
# -cxx -> lcr
# -ixx -> instance
# -zxx -> dscp
# -fxxx -> classref (uid of a classifier entry) if fn is used , fn is used for send classifier and n+1 for receive classifier
# -sxxx -> source ipv4 address
# -txxx -> destination ipv4 address
# -x -> source ipv6 address
# -y -> destination ipv6 address
# -r -> radio bearer id
bash_exec "$OPENAIR2_DIR/NAS/DRIVER/LITE/RB_TOOL/rb_tool -a -c0 -f0 -i0 -z0 -x $UE_IPv6 -y $ENB_IPv6 -r 3"
bash_exec "$OPENAIR2_DIR/NAS/DRIVER/LITE/RB_TOOL/rb_tool -a -c0 -f2 -i0 -z64 -s $UE_IPv4/32 -t $ENB_IPv4/32 -r 3"
bash_exec "$OPENAIR2_DIR/NAS/DRIVER/LITE/RB_TOOL/rb_tool -a -c0 -f4 -i0 -z64 -s 0.0.0.0/32 -t 0.0.0.0/32 -r 3"
sleep 1
bash_exec "sysctl -w net.ipv4.conf.all.log_martians=1"
assert " `sysctl -n net.ipv4.conf.all.log_martians` -eq 1" $LINENO
echo " Disabling reverse path filtering"
bash_exec "sysctl -w net.ipv4.conf.all.rp_filter=0"
assert " `sysctl -n net.ipv4.conf.all.rp_filter` -eq 0" $LINENO
bash_exec "ip route flush cache"
echo "#####################################################################"
echo "ip route show table main"
echo "---------------------------------------------------------------------"
ip route show table main
trap ctrl_c INT
echo "to see UE stats, please run : watch_ue script"
echo "$OPENAIR_TARGETS/SIMU/USER/oaisim -b0 -M1 -p2 -g3 -l3 > /dev/null"
nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -b0 -M1 -p2 -g3 -l3 > /dev/null
#gdb $OPENAIR_TARGETS/SIMU/USER/oaisim
echo "End"
ctrl_c
@@ -0,0 +1,426 @@
#!/bin/bash
#
#------------------------------------------------
MAKE_IP_DRIVER_TARGET="naslite_netlink_ether"
MAKE_LTE_ACCESS_STRATUM_TARGET="oaisim"
MAKE_REMSERIAL_TARGET="remserial"
IP_DRIVER_NAME=oai_nw_drv
###########################################################
# CONFIGURE OPTIONS
EMULIF="eth0"
LTEIF="oai0"
INTIF="ppp0"
EXTIF=$LTEIF
#----------------------------------------------------------
LTE_NETWORK_CIDR="10.0.1.0/24"
ENB_IPv4="10.0.1.1"
ENB_IPv6="2001:1::1"
#----------------------------------------------------------
UE_IPv4="10.0.1.2"
UE_IPv6="2001:1::2"
UE_IPv6_CIDR=$UE_IPv6"/64"
UE_IPv4_CIDR=$UE_IPv4"/24"
UE_IMEI="3,9,1,8,3,6,7,3,0,0,0,0,0,0"
#----------------------------------------------------------
USE_PPP="yes"
PPP_OPTIONS="proxyarp passive nodetach ipcp-accept-remote"
PPP_DEVICE="ttyPPP_DROID"
PPP_SPEED="460800"
UE_PPP_IPv4="192.168.15.1"
TERMINAL_PPP_IPv4="192.168.15.175"
REMSERIAL_UDP_PORT="23001"
#----------------------------------------------------------
# +-------+ +-------+ +-------+
# | eNB | EMULIF | UE |INTIF |ANDROID|
# | +---------------------+ +---------------------+ TERMIN|
# | | | | ppp link over | AL |
# | | | | UDP over ethernet | |
# | | | | (remserial) | |
# | | | | | |
# | | | +---serial link-------+ |
# | | | | for AT commands | |
# | | LTEIF | | | |
# | +.................... + | | |
# | |ENB_IPv4 UE_IPv4_CIDR| | | |
# +-------+ LTE link over +-------+ +-------+
###########################################################
IPTABLES=/sbin/iptables
THIS_SCRIPT_PATH=$(dirname $(readlink -f $0))
declare -x OPENAIR_DIR=""
declare -x OPENAIR1_DIR=""
declare -x OPENAIR2_DIR=""
declare -x OPENAIR3_DIR=""
declare -x OPENAIR_TARGETS=""
###########################################################
black='\E[30m'
red='\E[31m'
green='\E[32m'
yellow='\E[33m'
blue='\E[34m'
magenta='\E[35m'
cyan='\E[36m'
white='\E[37m'
ROOT_UID=0
E_NOTROOT=67
cecho() # Color-echo
# arg1 = message
# arg2 = color
{
local default_msg="No Message."
message=${1:-$default_msg}
color=${2:-$black}
echo -e "$color"
echo -n "$message"
tput sgr0
echo
return
}
echo_error() {
local my_string=""
until [ -z "$1" ]
do
my_string="$my_string$1"
shift
done
cecho "$my_string" $red
}
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
}
set_openair() {
path=`pwd`
declare -i length_path
declare -i index
length_path=${#path}
index=`echo $path | grep -b -o 'targets' | cut -d: -f1`
#echo ${path%$token*}
if [[ $index -lt $length_path && index -gt 0 ]]
then
declare -x OPENAIR_DIR
index=`expr $index - 1`
openair_path=`echo $path | cut -c1-$index`
#openair_path=`echo ${path:0:$index}`
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
return 0
fi
return -1
}
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
}
assert() {
# If condition false
# exit from script with error message
E_PARAM_ERR=98
E_PARAM_FAILED=99
if [ -z "$2" ] # Not enought parameters passed.
then
return $E_PARAM_ERR
fi
lineno=$2
if [ ! $1 ]
then
echo "Assertion failed: \"$1\""
echo "File \"$0\", line $lineno"
exit $E_ASSERT_FAILED
fi
}
ctrl_c() {
bash_exec "pkill oaisim"
if [ "$USE_PPP"x = yesx ]; then
bash_exec "pkill remserial.bash"
bash_exec "pkill ppp_android.bash"
fi
bash_exec "pkill AT_serial_bouchon.py"
bash_exec "ip link set $LTEIF down"
bash_exec "ip route del default via $ENB_IPv4 dev $EXTIF table int2lte"
bash_exec "ip route flush table int2lte"
bash_exec "ip rule del prio 1000"
bash_exec "rmmod $IP_DRIVER_NAME"
bash_exec "$IPTABLES -P INPUT ACCEPT"
bash_exec "$IPTABLES -F INPUT"
bash_exec "$IPTABLES -P OUTPUT ACCEPT"
bash_exec "$IPTABLES -F OUTPUT"
bash_exec "$IPTABLES -P FORWARD ACCEPT"
bash_exec "$IPTABLES -F FORWARD"
bash_exec "$IPTABLES -t nat -F"
bash_exec "$IPTABLES -t mangle -F"
bash_exec "$IPTABLES -t filter -F"
bash_exec "ip route flush cache"
}
#bash_exec "set_openair"
set_openair
cecho "OPENAIR_DIR = $OPENAIR_DIR" $green
cecho "OPENAIR1_DIR = $OPENAIR1_DIR" $green
cecho "OPENAIR2_DIR = $OPENAIR2_DIR" $green
cecho "OPENAIR3_DIR = $OPENAIR3_DIR" $green
cecho "OPENAIR_TARGETS = $OPENAIR_TARGETS" $green
echo "Bringup UE interface"
bash_exec "rmmod $IP_DRIVER_NAME"
cecho "make $MAKE_IP_DRIVER_TARGET $MAKE_LTE_ACCESS_STRATUM_TARGET $MAKE_REMSERIAL_TARGET....." $green
bash_exec "make $MAKE_IP_DRIVER_TARGET $MAKE_LTE_ACCESS_STRATUM_TARGET $MAKE_REMSERIAL_TARGET"
bash_exec "insmod $OPENAIR2_DIR/NAS/DRIVER/LITE/$IP_DRIVER_NAME.ko oai_nw_drv_IMEI=$UE_IMEI"
echo " Enabling ipv4 forwarding.."
bash_exec "sysctl -w net.ipv4.ip_forward=1"
assert "`sysctl -n net.ipv4.ip_forward` -eq 1" $LINENO
bash_exec "sysctl -w net.ipv4.conf.all.forwarding=1"
assert "`sysctl -n net.ipv4.conf.all.forwarding` -eq 1" $LINENO
echo " Enabling ipv6 forwarding.."
bash_exec "sysctl -w net.ipv6.conf.all.forwarding=1"
assert "`sysctl -n net.ipv6.conf.all.forwarding` -eq 1" $LINENO
if [ "$USE_PPP"x = yesx ]; then
echo " PPP enabled.."
command -v pppd > /dev/null 2>&1 || { echo_error "pppd executable needed - please install it"; exit 1;}
command -v remserial.udp > /dev/null 2>&1 || { echo_error "remserial.udp executable needed - please install it"; exit 1;}
#generate pppd script
rm -f /tmp/ppp_android.bash
bash_exec "touch /tmp/ppp_android.bash"
if [ ! -f /tmp/ppp_android.bash ]; then
echo_error "Cannot generate /tmp/ppp_android.bash file, exiting"
exit 1
fi
echo "#!/bin/bash" >> /tmp/ppp_android.bash
echo "pppd $PPP_OPTIONS $UE_PPP_IPv4:$TERMINAL_PPP_IPv4 /dev/$PPP_DEVICE $PPP_SPEED" >> /tmp/ppp_android.bash
bash_exec "chmod 777 /tmp/ppp_android.bash"
assert " -x /tmp/ppp_android.bash " $LINENO
#generate remserial script
rm -f /tmp/remserial.bash
bash_exec "touch /tmp/remserial.bash"
if [ ! -f /tmp/remserial.bash ]; then
echo_error "Cannot generate /tmp/remserial.bash file, exiting"
exit 1
fi
echo "#!/bin/bash" >> /tmp/remserial.bash
echo "remserial.udp -s \"$PPP_SPEED raw\" -p $REMSERIAL_UDP_PORT -l /dev/$PPP_DEVICE /dev/ptmx" >> /tmp/remserial.bash
bash_exec "chmod 777 /tmp/remserial.bash"
assert " -x /tmp/remserial.bash " $LINENO
fi
xterm -e $THIS_SCRIPT_PATH/AT_serial_bouchon.py &
wait_process_started AT_serial_bouchon.py
if [ "$USE_PPP"x = yesx ]; then
xterm -e /tmp/remserial.bash &
wait_process_started remserial.bash
xterm -e /tmp/ppp_android.bash &
wait_process_started ppp_android.bash
fi
assert " -x $IPTABLES " $LINENO
bash_exec "ip route del default via $ENB_IPv4 dev $EXTIF table int2lte"
bash_exec "ip route flush table int2lte"
bash_exec "ip rule del prio 1000"
bash_exec "$IPTABLES -P INPUT ACCEPT"
bash_exec "$IPTABLES -F INPUT"
bash_exec "$IPTABLES -P OUTPUT ACCEPT"
bash_exec "$IPTABLES -F OUTPUT"
bash_exec "$IPTABLES -P FORWARD DROP"
bash_exec "$IPTABLES -F FORWARD"
bash_exec "$IPTABLES -t nat -F"
bash_exec "$IPTABLES -t mangle -F"
bash_exec "$IPTABLES -t filter -F"
bash_exec "ip route flush cache"
bash_exec "ip route add 239.0.0.160/28 dev $EMULIF"
bash_exec "ip link set $LTEIF broadcast ff:ff:ff:ff:ff:ff"
bash_exec "ip link set $LTEIF up"
sleep 1
bash_exec "ip addr add dev $LTEIF $UE_IPv4_CIDR"
bash_exec "ip addr add dev $LTEIF $UE_IPv6_CIDR"
echo " Enabling proxy ARP.."
bash_exec "sysctl -w net.ipv4.conf.all.proxy_arp=1"
assert "`sysctl -n net.ipv4.conf.all.proxy_arp` -eq 1" $LINENO
# -a -> Add RB
# -d -> Delete RB
# -cxx -> lcr
# -ixx -> instance
# -zxx -> dscp
# -fxxx -> classref (uid of a classifier entry) if fn is used , fn is used for send classifier and n+1 for receive classifier
# -sxxx -> source ipv4 address
# -txxx -> destination ipv4 address
# -x -> source ipv6 address
# -y -> destination ipv6 address
# -r -> radio bearer id
bash_exec "$OPENAIR2_DIR/NAS/DRIVER/LITE/RB_TOOL/rb_tool -a -c0 -f0 -i0 -z0 -x $UE_IPv6 -y $ENB_IPv6 -r 3"
bash_exec "$OPENAIR2_DIR/NAS/DRIVER/LITE/RB_TOOL/rb_tool -a -c0 -f2 -i0 -z64 -s $UE_IPv4/32 -t $ENB_IPv4/32 -r 3"
bash_exec "$OPENAIR2_DIR/NAS/DRIVER/LITE/RB_TOOL/rb_tool -a -c0 -f4 -i0 -z64 -s 0.0.0.0/32 -t 0.0.0.0/32 -r 3"
sleep 1
echo " External Interface: $EXTIF"
echo " Internal Interface: $INTIF"
bash_exec "modprobe ip_tables"
bash_exec "modprobe ip_conntrack"
bash_exec "modprobe ip_conntrack_ftp"
bash_exec "modprobe nf_conntrack_h323"
bash_exec "modprobe nf_conntrack_irc"
bash_exec "modprobe nf_conntrack_pptp"
bash_exec "modprobe nf_conntrack_proto_gre"
bash_exec "modprobe nf_conntrack_proto_sctp"
bash_exec "modprobe nf_conntrack_tftp"
bash_exec "modprobe nf_conntrack_sip"
bash_exec "modprobe iptable_nat"
bash_exec "modprobe x_tables"
echo " Enabling DynamicAddr.."
bash_exec "sysctl -w net.ipv4.ip_dynaddr=1"
assert " `sysctl -n net.ipv4.ip_dynaddr` -eq 1" $LINENO
bash_exec "sysctl -w net.ipv4.conf.all.log_martians=1"
assert " `sysctl -n net.ipv4.conf.all.log_martians` -eq 1" $LINENO
bash_exec "sysctl -w net.ipv4.conf.$LTEIF.log_martians=1"
assert " `sysctl -n net.ipv4.conf.$LTEIF.log_martians` -eq 1" $LINENO
bash_exec "sysctl -w net.ipv4.conf.$EMULIF.log_martians=1"
assert " `sysctl -n net.ipv4.conf.$EMULIF.log_martians` -eq 1" $LINENO
if [ ! "$USE_PPP"x = yesx ]; then
bash_exec "sysctl -w net.ipv4.conf.$INTIF.log_martians=1"
assert " `sysctl -n net.ipv4.conf.$INTIF.log_martians` -eq 1" $LINENO
fi
echo " Disabling reverse path filtering"
bash_exec "sysctl -w net.ipv4.conf.all.rp_filter=0"
assert " `sysctl -n net.ipv4.conf.all.rp_filter` -eq 0" $LINENO
bash_exec "sysctl -w net.ipv4.conf.$LTEIF.rp_filter=0"
assert " `sysctl -n net.ipv4.conf.$LTEIF.rp_filter` -eq 0" $LINENO
bash_exec "sysctl -w net.ipv4.conf.$EMULIF.rp_filter=0"
assert " `sysctl -n net.ipv4.conf.$EMULIF.rp_filter` -eq 0" $LINENO
if [ ! "$USE_PPP"x = yesx ]; then
bash_exec "sysctl -w net.ipv4.conf.$INTIF.rp_filter=0"
assert " `sysctl -n net.ipv4.conf.$INTIF.rp_filter` -eq 0" $LINENO
fi
bash_exec "$IPTABLES -t mangle -A PREROUTING -i $INTIF -j MARK --set-mark 22"
bash_exec "$IPTABLES -A FORWARD -i $EXTIF -o $INTIF -m state --state ESTABLISHED,RELATED -j ACCEPT"
bash_exec "$IPTABLES -A FORWARD -i $INTIF -o $EXTIF -j ACCEPT"
bash_exec "$IPTABLES -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE"
bash_exec "ip route add 127.0.0.0/8 dev lo table int2lte"
bash_exec "ip route add $LTE_NETWORK_CIDR dev $EXTIF table int2lte scope link"
bash_exec "ip route add default via $ENB_IPv4 dev $EXTIF table int2lte scope global"
bash_exec "ip route flush cache"
bash_exec "ip rule add fwmark 22 lookup int2lte prio 1000"
echo "#####################################################################"
echo "iptables -t nat -nvL"
echo "---------------------------------------------------------------------"
iptables -t nat -nvL
echo "#####################################################################"
echo "iptables -t mangle -nvL"
echo "---------------------------------------------------------------------"
iptables -t mangle -nvL
echo "#####################################################################"
echo "iptables -t filter -nvL"
echo "---------------------------------------------------------------------"
iptables -t filter -nvL
echo "#####################################################################"
echo "ip rule show"
echo "---------------------------------------------------------------------"
ip rule show
echo "#####################################################################"
echo "ip route show table int2lte"
echo "---------------------------------------------------------------------"
ip route show table int2lte
echo "#####################################################################"
echo "ip route show table main"
echo "---------------------------------------------------------------------"
ip route show table main
trap ctrl_c INT
echo "to see UE stats, please run : watch_ue script"
echo "$OPENAIR_TARGETS/SIMU/USER/oaisim -b0 -M1 -p2 -g3 -l3 > /dev/null"
nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -b0 -M1 -p2 -g3 -l3 > /dev/null
#gdb $OPENAIR_TARGETS/SIMU/USER/oaisim
echo "End"
ctrl_c
@@ -0,0 +1,13 @@
all: oaisim nasmesh
userclean: clean oaisim nasmesh
oaisim:
(cd $(OPENAIR_TARGETS)/SIMU/USER && make NAS=1 -j2)
nasmesh:
(cd $(OPENAIR2_DIR) && make nasmesh_netlink.ko)
(cd $(OPENAIR2_DIR)/NAS/DRIVER/MESH/RB_TOOL/ && make)
clean:
(cd $(OPENAIR_TARGETS)/SIMU/USER && make clean)
+34
View File
@@ -0,0 +1,34 @@
#!/bin/sh
echo "Bringup eNB interface"
sudo rmmod nasmesh
make all
sudo insmod $OPENAIR2_DIR/NAS/DRIVER/MESH/nasmesh.ko
#avoid conflict with reserved multicast addresses (224.0.0.11,224.0.0.13, 224.0.0.16)
#sudo route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0
sudo ip route add 239.0.0.160/28 dev eth0
sudo ifconfig oai0 10.0.1.1 netmask 255.255.255.0 broadcast 10.0.1.255
$OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL/rb_tool -a -c0 -i0 -z0 -s 10.0.1.1 -t 10.0.1.2 -r 3
$OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL/rb_tool -a -c1 -i0 -z0 -s 10.0.1.1 -t 10.0.1.3 -r 11
#xterm -T ENB -hold -e ping 10.0.1.2&
#xterm -T ENB -hold -e ping 10.0.1.3&
if [ -z $1 ]; then
echo "nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -u0 -M0 -p3 -g3 -l3 > /dev/null"
nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -u0 -M0 -p3 -g3 -l3 > /dev/null
else
if [ $1 = "all" ]; then
echo "nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -u0 -M0 -p3 -g3 -l7"
nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -u0 -M0 -p3 -g3 -l7
else
echo "nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -u0 -M0 -p3 -g3 -l7 | grep -i $1"
nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -u0 -M0 -p3 -g3 -l7 | grep -i $1
fi
fi
echo "End"
+31
View File
@@ -0,0 +1,31 @@
#!/bin/sh
echo "Bringup UE interface"
sudo rmmod nasmesh
make all
sudo insmod $OPENAIR2_DIR/NAS/DRIVER/MESH/nasmesh.ko
#avoid conflict with reserved multicast addresses (224.0.0.11,224.0.0.13, 224.0.0.16)
#sudo route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0
sudo ip route add 239.0.0.160/28 dev eth0
sudo ifconfig oai0 10.0.1.2 netmask 255.255.255.0 broadcast 10.0.1.255
$OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL/rb_tool -a -c0 -i0 -z0 -s 10.0.1.2 -t 10.0.1.1 -r 3
#xterm -T UE1 -hold -e ping 10.0.1.1&
if [ -z $1 ]; then
echo "nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -b0 -M1 -p3 -g3 -l3 > /dev/null"
nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -b0 -M1 -p3 -g3 -l3 > /dev/null
else
if [ $1 = "all" ]; then
echo "nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -b0 -M1 -p3 -g3 -l7"
nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -b0 -M1 -p3 -g3 -l7
else
echo "nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -b0 -M1 -p3 -g3 -l7 | grep -i $1"
nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -b0 -M1 -p3 -g3 -l7 | grep -i $1
fi
fi
echo "End"
+30
View File
@@ -0,0 +1,30 @@
#!/bin/sh
echo "Bringup UE interface"
sudo rmmod nasmesh
make all
sudo insmod $OPENAIR2_DIR/NAS/DRIVER/MESH/nasmesh.ko
#avoid conflict with reserved multicast addresses (224.0.0.11,224.0.0.13, 224.0.0.16)
#sudo route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0
sudo ip route add 239.0.0.160/28 dev eth0
sudo ifconfig oai0 10.0.1.3 netmask 255.255.255.0 broadcast 10.0.1.255
$OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL/rb_tool -a -c0 -i0 -z0 -s 10.0.1.3 -t 10.0.1.1 -r 3
#xterm -T UE2 -hold -e ping 10.0.1.1&
if [ -z $1 ]; then
echo "nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -b0 -M2 -p3 -g3 -l3 > /dev/null"
nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -b0 -M2 -p3 -g3 -l3 > /dev/null
else
if [ $1 = "all" ]; then
echo "nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -b0 -M2 -p3 -g3 -l7"
nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -b0 -M2 -p3 -g3 -l7
else
echo "nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -b0 -M2 -p3 -g3 -l7 | grep -i $1"
nice -10 $OPENAIR_TARGETS/SIMU/USER/oaisim -b0 -M2 -p3 -g3 -l7 | grep -i $1
fi
fi
echo "End"
+4
View File
@@ -0,0 +1,4 @@
This is the folder used by the OCG(openair config generation) to parse a xml-based scenario defined by the user in the WEBXML directory, and produce emulation results in the RESULTS directory.
Please make sure that you have correctly set the OPENAIR_TARGETS variables.
@@ -0,0 +1,143 @@
<OAI_EMULATION>
<ENVIRONMENT_SYSTEM_CONFIG>
<FADING>
<LARGE_SCALE>urban</LARGE_SCALE> <!-- OPTIONS: urban, rural, indoor -->
<FREE_SPACE_MODEL_PARAMETERS>
<PATHLOSS_EXPONENT>2.0</PATHLOSS_EXPONENT> <!-- OPTIONS: >1 -->
<PATHLOSS_0_dB>-50</PATHLOSS_0_dB>
</FREE_SPACE_MODEL_PARAMETERS>
<SMALL_SCALE>Rayleigh1</SMALL_SCALE> <!-- OPTIONS: SCM_A, SCM_B, SCM_C, SCM_D, EPA, EVA, ETU, Rayleigh8, Rayleigh1, Rayleigh1_corr, Rayleigh1_anticorr, Rice8, Rice1, Rice1_corr, Rice1_anticorr, AWGN -->
</FADING>
<WALL_PENETRATION_LOSS_dB>5</WALL_PENETRATION_LOSS_dB>
<SYSTEM_BANDWIDTH_MB>7.68</SYSTEM_BANDWIDTH_MB>
<UE_FREQUENCY_GHz>1.9</UE_FREQUENCY_GHz>
<ANTENNA>
<eNB_ANTENNA>
<RX_NOISE_LEVEL_dB>5</RX_NOISE_LEVEL_dB>
<NUMBER_OF_SECTORS>3</NUMBER_OF_SECTORS>
<BEAM_WIDTH_dB>1.13</BEAM_WIDTH_dB>
<ANTENNA_GAIN_dBi>16</ANTENNA_GAIN_dBi>
<TX_POWER_dBm>40</TX_POWER_dBm>
</eNB_ANTENNA>
<UE_ANTENNA>
<RX_NOISE_LEVEL_dB>1</RX_NOISE_LEVEL_dB>
<ANTENNA_GAIN_dBi>5</ANTENNA_GAIN_dBi>
<TX_POWER_dBm>20</TX_POWER_dBm>
</UE_ANTENNA>
</ANTENNA>
</ENVIRONMENT_SYSTEM_CONFIG>
<TOPOLOGY_CONFIG>
<AREA>
<X_km>1</X_km>
<Y_km>1</Y_km>
</AREA>
<NETWORK_TYPE>homogeneous</NETWORK_TYPE> <!-- OPTIONS: homogeneous, heterogeneous -->
<CELL_TYPE>macrocell</CELL_TYPE> <!-- OPTIONS: macrocell, microcell, picocell, femtocell -->
<RELAY></RELAY>
<MOBILITY>
<UE_MOBILITY>
<UE_INITIAL_DISTRIBUTION>random</UE_INITIAL_DISTRIBUTION> <!-- OPTIONS: random, concentrated, grid -->
<RANDOM_UE_DISTRIBUTION>
<NUMBER_OF_NODES>1</NUMBER_OF_NODES>
</RANDOM_UE_DISTRIBUTION>
<UE_MOBILITY_TYPE>fixed</UE_MOBILITY_TYPE> <!-- OPTIONS: fixed, random_waypoint, random_walk, grid_walk, trace, sumo -->
<UE_MOVING_DYNAMICS>
<MIN_SPEED_mps>1</MIN_SPEED_mps>
<MAX_SPEED_mps>200</MAX_SPEED_mps>
<MIN_SLEEP_ms>0.1</MIN_SLEEP_ms>
<MAX_SLEEP_ms>5.0</MAX_SLEEP_ms>
<MIN_JOURNEY_TIME_ms>0.1</MIN_JOURNEY_TIME_ms>
<MAX_JOURNEY_TIME_ms>10</MAX_JOURNEY_TIME_ms>
</UE_MOVING_DYNAMICS>
<SUMO_CONFIG> <!-- Simulation for Urban Mobility -->
<SUMO_CMD> sumo-gui </SUMO_CMD>
<SUMO_CONFIG_FILE>$OPENAIR2_DIR/UTIL/OMG/SUMO/SCENARIOS/scen.sumo.cfg</SUMO_CONFIG_FILE>
<SUMO_START> 0 </SUMO_START>
<SUMO_END> 10 </SUMO_END>
<SUMO_STEP> 10</SUMO_STEP>
<SUMO_HOST_IP> 127.0.1.1</SUMO_HOST_IP>
<SUMO_HOST_PORT> 8883</SUMO_HOST_PORT>
</SUMO_CONFIG>
</UE_MOBILITY>
<eNB_MOBILITY>
<eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION> <!-- OPTIONS: random, hexagonal, grid -->
<RANDOM_eNB_DISTRIBUTION>
<NUMBER_OF_CELLS>1</NUMBER_OF_CELLS>
</RANDOM_eNB_DISTRIBUTION>
<eNB_MOBILITY_TYPE>fixed</eNB_MOBILITY_TYPE> <!-- OPTIONS: fixed, mobile -->
</eNB_MOBILITY>
</MOBILITY>
</TOPOLOGY_CONFIG>
<APPLICATION_CONFIG>
<PREDEFINED_TRAFFIC>
<SOURCE_ID>0</SOURCE_ID>
<APPLICATION_TYPE>gaming_OA</APPLICATION_TYPE> <!-- OPTIONS: scbr, mcbr, bcbr, m2m_AP, m2m_BR, gaming_OA, gaming_TF, full_buffer -->
<DESTINATION_ID>1</DESTINATION_ID>
</PREDEFINED_TRAFFIC>
<CUSTOMIZED_TRAFFIC>
<PU> <!-- we are generating only one packet -->
<PROB_OFF_PU>0.9</PROB_OFF_PU> <!-- prob to transit from off to PU -->
<PROB_PU_ED>0.1</PROB_PU_ED> <!-- prob to transit from PU to ED -->
<HOLDING_TIME_OFF_PU>100</HOLDING_TIME_OFF_PU> <!-- in off state -->
</PU>
<ED> <!-- we are generating only one packet -->
<PROB_OFF_ED>0.1</PROB_OFF_ED> <!-- prob to transit from off to PU -->
<PROB_ED_PE>0.1</PROB_ED_PE> <!-- prob to transit from off to PU -->
<HOLDING_TIME_OFF_ED>10000</HOLDING_TIME_OFF_ED> <!-- in off state -->
</ED>
<PE>
<HOLDING_TIME_OFF_PE>100</HOLDING_TIME_OFF_PE> <!-- in off state, how much time we should generate traffic -->
</PE>
<SOURCE_ID>2</SOURCE_ID> <!-- <SOURCE_ID> 1:100 </SOURCE_ID> -->
<TRANSPORT_PROTOCOL>udp</TRANSPORT_PROTOCOL> <!-- OPTIONS: tcp (default), udp -->
<IP_VERSION>ipv6</IP_VERSION> <!-- OPTIONS: ipv4 (default), ipv6 -->
<DESTINATION_ID>0</DESTINATION_ID>
<IDT_DIST>uniform</IDT_DIST> <!-- OPTIONS: no_customized_traffic (default), uniform, poission, gaussian, exponential, fixed, weibull, pareto, gamma, cauchy -->
<IDT_MIN_ms>100</IDT_MIN_ms>
<IDT_MAX_ms>1000</IDT_MAX_ms>
<IDT_STANDARD_DEVIATION>1</IDT_STANDARD_DEVIATION>
<IDT_LAMBDA>7</IDT_LAMBDA>
<SIZE_DIST>gaussian</SIZE_DIST> <!-- OPTIONS: no_customized_traffic (default), uniform, poission, gaussian, exponential, fixed, weibull, pareto, gamma, cauchy -->
<SIZE_MIN_byte>200</SIZE_MIN_byte>
<SIZE_MAX_byte>500</SIZE_MAX_byte>
<SIZE_STANDARD_DEVIATION>5</SIZE_STANDARD_DEVIATION>
<SIZE_LAMBDA>4</SIZE_LAMBDA>
<DESTINATION_PORT>8080</DESTINATION_PORT>
</CUSTOMIZED_TRAFFIC>
</APPLICATION_CONFIG>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>5000</EMULATION_TIME_ms>
<PERFORMANCE>
<METRICS>
<THROUGHPUT>1</THROUGHPUT>
<LATENCY></LATENCY>
<SIGNALLING_OVERHEAD></SIGNALLING_OVERHEAD>
</METRICS>
<LAYER>
<MAC>1</MAC>
<RLC></RLC>
<PDCP></PDCP>
</LAYER>
<LOG_EMU>
<DEBUG>1</DEBUG>
</LOG_EMU>
<SEED>
<SEED_VALUE>1</SEED_VALUE>
</SEED>
</PERFORMANCE>
</EMULATION_CONFIG>
<PROFILE>EURECOM</PROFILE>
</OAI_EMULATION>
@@ -0,0 +1,12 @@
<OAI_EMULATION>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>500</EMULATION_TIME_ms>
<LOG> <!-- set the global log level -->
<LEVEL>debug</LEVEL>
</LOG>
</EMULATION_CONFIG>
<PROFILE>EMU-TEST</PROFILE>
</OAI_EMULATION>
@@ -0,0 +1,77 @@
<OAI_EMULATION>
<TOPOLOGY_CONFIG>
<AREA>
<X_m>5000</X_m>
<Y_m>5000</Y_m>
</AREA>
<MOBILITY>
<UE_MOBILITY>
<RANDOM_UE_DISTRIBUTION>
<NUMBER_OF_NODES>3</NUMBER_OF_NODES>
</RANDOM_UE_DISTRIBUTION>
<UE_MOBILITY_TYPE>STATIC</UE_MOBILITY_TYPE>
</UE_MOBILITY>
<eNB_MOBILITY>
<eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION>
<RANDOM_eNB_DISTRIBUTION>
<NUMBER_OF_CELLS>1</NUMBER_OF_CELLS>
</RANDOM_eNB_DISTRIBUTION>
<eNB_MOBILITY_TYPE>STATIC</eNB_MOBILITY_TYPE>
</eNB_MOBILITY>
</MOBILITY>
</TOPOLOGY_CONFIG>
<APPLICATION_CONFIG>
<PREDEFINED_TRAFFIC>
<SOURCE_ID>0</SOURCE_ID>
<APPLICATION_TYPE>random</APPLICATION_TYPE> <!-- OPTIONS: scbr,mcbr,bcbr, gaming_OA, gaming_TF, m2m_AP, m2m_BR, , random, ,full_buffer -->
<DESTINATION_ID>1:3</DESTINATION_ID>
</PREDEFINED_TRAFFIC>
<CUSTOMIZED_TRAFFIC>
<SOURCE_ID>1:2</SOURCE_ID> <!-- <SOURCE_ID> 1:100 </SOURCE_ID> -->
<TRANSPORT_PROTOCOL>udp</TRANSPORT_PROTOCOL> <!-- OPTIONS: tcp (default), udp -->
<IP_VERSION>ipv6</IP_VERSION> <!-- OPTIONS: ipv4 (default), ipv6 -->
<DESTINATION_ID>0</DESTINATION_ID>
<!-- available distributions: none (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gamma,-->
<IDT_DIST>poisson</IDT_DIST> <!-- similar for exponential, -->
<IDT_LAMBDA>7.3</IDT_LAMBDA>
<SIZE_DIST>unifrom</SIZE_DIST> <!-- OPTIONS: no_transmission (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gamma,-->
<SIZE_MIN_byte>100</SIZE_MIN_byte>
<SIZE_MAX_byte>500</SIZE_MAX_byte>
</CUSTOMIZED_TRAFFIC>
<CUSTOMIZED_TRAFFIC>
<SOURCE_ID>3</SOURCE_ID> <!-- <SOURCE_ID> 1:100 </SOURCE_ID> -->
<TRANSPORT_PROTOCOL>tcp</TRANSPORT_PROTOCOL> <!-- OPTIONS: tcp (default), udp -->
<IP_VERSION>ipv4</IP_VERSION> <!-- OPTIONS: ipv4 (default), ipv6 -->
<DESTINATION_ID>0</DESTINATION_ID>
<!-- available distributions: none (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gamma,-->
<IDT_DIST>fixed</IDT_DIST> <!---->
<IDT_MIN_ms>100</IDT_MIN_ms>
<SIZE_DIST>exponential</SIZE_DIST> <!-- OPTIONS: no_transmission (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gamma,-->
<SIZE_LAMBDA>2.2</SIZE_LAMBDA>
</CUSTOMIZED_TRAFFIC>
</APPLICATION_CONFIG>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>0</EMULATION_TIME_ms> <!--set to infinity-->
<PERFORMANCE_METRICS>
<THROUGHPUT>1</THROUGHPUT>
</PERFORMANCE_METRICS>
<LOG> <!-- set the global log level -->
<LEVEL>info</LEVEL>
<INTERVAL>1</INTERVAL>
</LOG>
<SEED_VALUE>1234</SEED_VALUE> <!-- value 0 means randomly generated by OAI -->
</EMULATION_CONFIG>
<PROFILE>OTG_3</PROFILE>
</OAI_EMULATION>
@@ -0,0 +1,123 @@
<OAI_EMULATION>
<ENVIRONMENT_SYSTEM_CONFIG>
<FADING>
<LARGE_SCALE>urban</LARGE_SCALE>
<FREE_SPACE_MODEL_PARAMETERS>
<PATHLOSS_EXPONENT>2.0</PATHLOSS_EXPONENT>
<PATHLOSS_0_dB>-50</PATHLOSS_0_dB>
</FREE_SPACE_MODEL_PARAMETERS>
<SMALL_SCALE>Rayleigh1</SMALL_SCALE>
</FADING>
<WALL_PENETRATION_LOSS_dB>5</WALL_PENETRATION_LOSS_dB>
<SYSTEM_BANDWIDTH_MB>7.68</SYSTEM_BANDWIDTH_MB>
<UE_FREQUENCY_GHz>1.9</UE_FREQUENCY_GHz>
<ANTENNA>
<eNB_ANTENNA>
<RX_NOISE_LEVEL_dB>5</RX_NOISE_LEVEL_dB>
<NUMBER_OF_SECTORS>3</NUMBER_OF_SECTORS>
<BEAM_WIDTH_dB>1.13</BEAM_WIDTH_dB>
<ANTENNA_GAIN_dBi>16</ANTENNA_GAIN_dBi>
<TX_POWER_dBm>40</TX_POWER_dBm>
</eNB_ANTENNA>
<UE_ANTENNA>
<RX_NOISE_LEVEL_dB>1</RX_NOISE_LEVEL_dB>
<ANTENNA_GAIN_dBi>5</ANTENNA_GAIN_dBi>
<TX_POWER_dBm>20</TX_POWER_dBm>
</UE_ANTENNA>
</ANTENNA>
</ENVIRONMENT_SYSTEM_CONFIG>
<TOPOLOGY_CONFIG>
<AREA>
<X_m>5000</X_m>
<Y_m>5000</Y_m>
</AREA>
<NETWORK_TYPE>homogeneous</NETWORK_TYPE>
<CELL_TYPE>macrocell</CELL_TYPE>
<RELAY></RELAY>
<MOBILITY>
<UE_MOBILITY>
<UE_INITIAL_DISTRIBUTION>random</UE_INITIAL_DISTRIBUTION>
<RANDOM_UE_DISTRIBUTION>
<NUMBER_OF_NODES>1</NUMBER_OF_NODES>
</RANDOM_UE_DISTRIBUTION>
<UE_MOBILITY_TYPE>STATIC</UE_MOBILITY_TYPE>
<UE_MOVING_DYNAMICS>
<MIN_SPEED_mps>1</MIN_SPEED_mps>
<MAX_SPEED_mps>200</MAX_SPEED_mps>
<MIN_SLEEP_ms>0.1</MIN_SLEEP_ms>
<MAX_SLEEP_ms>5.0</MAX_SLEEP_ms>
<MIN_JOURNEY_TIME_ms>0.1</MIN_JOURNEY_TIME_ms>
<MAX_JOURNEY_TIME_ms>10</MAX_JOURNEY_TIME_ms>
</UE_MOVING_DYNAMICS>
<SUMO_CONFIG>
<SUMO_CMD> sumo-gui </SUMO_CMD>
<SUMO_CONFIG_FILE>$OPENAIR2_DIR/UTIL/OMG/SUMO/SCENARIOS/scen.sumo.cfg</SUMO_CONFIG_FILE>
<SUMO_START> 0 </SUMO_START>
<SUMO_END> 10 </SUMO_END>
<SUMO_STEP> 10</SUMO_STEP>
<SUMO_HOST_IP> 127.0.1.1</SUMO_HOST_IP>
<SUMO_HOST_PORT> 8883</SUMO_HOST_PORT>
</SUMO_CONFIG>
</UE_MOBILITY>
<eNB_MOBILITY>
<eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION>
<RANDOM_eNB_DISTRIBUTION>
<NUMBER_OF_CELLS>1</NUMBER_OF_CELLS>
</RANDOM_eNB_DISTRIBUTION>
<eNB_MOBILITY_TYPE>STATIC</eNB_MOBILITY_TYPE>
</eNB_MOBILITY>
</MOBILITY>
</TOPOLOGY_CONFIG>
<APPLICATION_CONFIG>
<PREDEFINED_TRAFFIC>
<SOURCE_ID>1</SOURCE_ID>
<APPLICATION_TYPE>mcbr</APPLICATION_TYPE> <!-- OPTIONS: scbr,mcbr,bcbr, gaming_OA, gaming_TF, m2m_AP, m2m_BR, , random, ,full_buffer -->
<DESTINATION_ID>0</DESTINATION_ID>
</PREDEFINED_TRAFFIC>
<CUSTOMIZED_TRAFFIC>
<SOURCE_ID>0</SOURCE_ID> <!-- <SOURCE_ID> 1:100 </SOURCE_ID> -->
<TRANSPORT_PROTOCOL>udp</TRANSPORT_PROTOCOL> <!-- OPTIONS: tcp (default), udp -->
<IP_VERSION>ipv6</IP_VERSION> <!-- OPTIONS: ipv4 (default), ipv6 -->
<DESTINATION_ID>1</DESTINATION_ID>
<IDT_DIST>poisson</IDT_DIST> <!-- OPTIONS: no_transmission (default), uniform, poission, gaussian, exponential -->
<IDT_MIN_ms>100</IDT_MIN_ms>
<IDT_MAX_ms>1000</IDT_MAX_ms>
<IDT_STANDARD_DEVIATION>4.5</IDT_STANDARD_DEVIATION>
<IDT_LAMBDA>7.3</IDT_LAMBDA>
<IDT_SCALE>30</IDT_SCALE>
<IDT_SHAPE>15</IDT_SHAPE>
<SIZE_DIST>uniform</SIZE_DIST>
<SIZE_MIN_byte>100</SIZE_MIN_byte>
<SIZE_MAX_byte>500</SIZE_MAX_byte>
<SIZE_STANDARD_DEVIATION>5.3</SIZE_STANDARD_DEVIATION>
<SIZE_LAMBDA>2.2</SIZE_LAMBDA>
<SIZE_SCALE>0.5</SIZE_SCALE>
<SIZE_SHAPE>30</SIZE_SHAPE>
</CUSTOMIZED_TRAFFIC>
</APPLICATION_CONFIG>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>0</EMULATION_TIME_ms> <!--set to infinity-->
<PERFORMANCE_METRICS>
<THROUGHPUT>1</THROUGHPUT>
<LATENCY>1</LATENCY> <!-- include both OWD and RTT-->
<LOSS_RATE>1</LOSS_RATE>
</PERFORMANCE_METRICS>
<LOG> <!-- set the global log level -->
<LEVEL>warning</LEVEL>
<INTERVAL>1</INTERVAL>
</LOG>
<SEED_VALUE>1234</SEED_VALUE> <!-- value 0 means randomly generated by OAI -->
</EMULATION_CONFIG>
<PROFILE>OCM_OMG_OTG_1</PROFILE>
</OAI_EMULATION>
@@ -0,0 +1,66 @@
<OAI_EMULATION>
<TOPOLOGY_CONFIG>
<AREA>
<X_m>500</X_m>
<Y_m>500</Y_m>
</AREA>
<MOBILITY>
<UE_MOBILITY>
<RANDOM_UE_DISTRIBUTION>
<NUMBER_OF_NODES>3</NUMBER_OF_NODES>
</RANDOM_UE_DISTRIBUTION>
<UE_MOBILITY_TYPE>STATIC</UE_MOBILITY_TYPE> <!-- STATIC -->
</UE_MOBILITY>
<eNB_MOBILITY>
<eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION>
<RANDOM_eNB_DISTRIBUTION>
<NUMBER_OF_CELLS>1</NUMBER_OF_CELLS>
</RANDOM_eNB_DISTRIBUTION>
<eNB_MOBILITY_TYPE>STATIC</eNB_MOBILITY_TYPE>
</eNB_MOBILITY>
</MOBILITY>
</TOPOLOGY_CONFIG>
<APPLICATION_CONFIG>
<!-- Basic configuration of a customized traffic : one state-->
<CUSTOMIZED_TRAFFIC>
<SOURCE_ID>0</SOURCE_ID>
<TRANSPORT_PROTOCOL>tcp</TRANSPORT_PROTOCOL> <!-- OPTIONS: tcp (default), udp -->
<IP_VERSION>ipv4</IP_VERSION> <!-- OPTIONS: ipv4 (default), ipv6 -->
<DESTINATION_ID>1:3</DESTINATION_ID>
<BACKGROUND_TRAFFIC>disable</BACKGROUND_TRAFFIC> <!-- options: enable, disable. If enable, it generates a background traffic corresponding to the traffic direction-->
<AGGREGATION_LEVEL>1</AGGREGATION_LEVEL> <!-- options: default=1, the number of traffic to aggregate-->
<IDT_DIST>uniform</IDT_DIST> <!-- available distributions: none (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gammav-->
<IDT_MIN_ms>30</IDT_MIN_ms> <!--Minimum IDT values in milliseconds-->
<IDT_MAX_ms>50</IDT_MAX_ms> <!--MAximum IDT values in milliseconds-->
<SIZE_DIST>uniform</SIZE_DIST> <!-- available distributions: none (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gammav-->
<SIZE_MIN_byte>512</SIZE_MIN_byte> <!--Minimum PAYLOAD size values in bytes-->
<SIZE_MAX_byte>1024</SIZE_MAX_byte> <!--MAximum PAYLOAD size values in bytes-->
</CUSTOMIZED_TRAFFIC>
</APPLICATION_CONFIG>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>10000</EMULATION_TIME_ms> <!--if 0 set to infinity-->
<CURVE>disable</CURVE> <!-- option: enabled, disabled. If CURVE is enabled, graphes are ploted in real time (UL and DL) of WOD and throughput measurement for each packet -->
<BACKGROUND_STATS>enable</BACKGROUND_STATS> <!-- option: enable, disable. If enable, it allows to ptrint BACKGROUNS statistics: Nb packets, throughputs,etc-->
<PERFORMANCE_METRICS>
<THROUGHPUT>enable</THROUGHPUT> <!-- option: enable, disable. If enable, throughput measurements are plotted in real time-->
<LATENCY>enable</LATENCY> <!-- option: enable, disable. If enable, latency measurements are plotted in real time-->
<OWD_RADIO_ACCESS>enable</OWD_RADIO_ACCESS> <!-- option: enable, disable. If enable owd curve shows the one way radio access delay, else it shows end to end owd -->
</PERFORMANCE_METRICS>
<LOG> <!-- set the global log level -->
<LEVEL>trace</LEVEL>
<INTERVAL>1</INTERVAL>
</LOG>
<SEED_VALUE>1234</SEED_VALUE> <!-- value 0 means randomly generated by OAI -->
</EMULATION_CONFIG>
<PROFILE>OTG_2</PROFILE>
</OAI_EMULATION>
@@ -0,0 +1,67 @@
<OAI_EMULATION>
<TOPOLOGY_CONFIG>
<AREA>
<X_m>500</X_m>
<Y_m>500</Y_m>
</AREA>
<MOBILITY>
<UE_MOBILITY>
<RANDOM_UE_DISTRIBUTION>
<NUMBER_OF_NODES>1</NUMBER_OF_NODES>
</RANDOM_UE_DISTRIBUTION>
<UE_MOBILITY_TYPE>STATIC</UE_MOBILITY_TYPE> <!-- STATIC -->
</UE_MOBILITY>
<eNB_MOBILITY>
<eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION>
<RANDOM_eNB_DISTRIBUTION>
<NUMBER_OF_CELLS>1</NUMBER_OF_CELLS>
</RANDOM_eNB_DISTRIBUTION>
<eNB_MOBILITY_TYPE>STATIC</eNB_MOBILITY_TYPE>
</eNB_MOBILITY>
</MOBILITY>
</TOPOLOGY_CONFIG>
<APPLICATION_CONFIG>
<!-- Basic configuration of a customized traffic : one state-->
<CUSTOMIZED_TRAFFIC>
<SOURCE_ID>0</SOURCE_ID>
<TRANSPORT_PROTOCOL>tcp</TRANSPORT_PROTOCOL> <!-- OPTIONS: tcp (default), udp -->
<IP_VERSION>ipv4</IP_VERSION> <!-- OPTIONS: ipv4 (default), ipv6 -->
<DESTINATION_ID>1</DESTINATION_ID>
<BACKGROUND_TRAFFIC>disable</BACKGROUND_TRAFFIC> <!-- options: enable, disable. If enable, it generates a background traffic corresponding to the traffic direction-->
<AGGREGATION_LEVEL>1</AGGREGATION_LEVEL> <!-- options: default=1, the number of traffic to aggregate-->
<IDT_DIST>uniform</IDT_DIST> <!-- available distributions: none (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gammav-->
<IDT_MIN_ms>500</IDT_MIN_ms> <!--Minimum IDT values in milliseconds-->
<IDT_MAX_ms>500</IDT_MAX_ms> <!--Minimum IDT values in milliseconds-->
<SIZE_DIST>uniform</SIZE_DIST> <!-- available distributions: none (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gammav-->
<SIZE_MIN_byte>1000</SIZE_MIN_byte> <!--Minimum PAYLOAD size values in bytes-->
<SIZE_MAX_byte>1500</SIZE_MAX_byte> <!--MAximum PAYLOAD size values in bytes-->
</CUSTOMIZED_TRAFFIC>
</APPLICATION_CONFIG>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>0</EMULATION_TIME_ms> <!--if 0 set to infinity-->
<CURVE>enable</CURVE> <!-- option: enabled, disabled. If CURVE is enabled, graphes are ploted in real time (UL and DL) of WOD and throughput measurement for each packet -->
<BACKGROUND_STATS>enable</BACKGROUND_STATS> <!-- option: enable, disable. If enable, it allows to ptrint BACKGROUNS statistics: Nb packets, throughputs,etc-->
<PERFORMANCE_METRICS>
<THROUGHPUT>enable</THROUGHPUT> <!-- option: enable, disable. If enable, throughput measurements are plotted in real time-->
<LATENCY>enable</LATENCY> <!-- option: enable, disable. If enable, latency measurements are plotted in real time-->
<OWD_RADIO_ACCESS>disable</OWD_RADIO_ACCESS> <!-- option: enable, disable. If enable owd curve shows the one way radio access delay, else it shows end to end owd -->
</PERFORMANCE_METRICS>
<LOG> <!-- set the global log level -->
<LEVEL>trace</LEVEL>
<INTERVAL>1</INTERVAL>
</LOG>
<SEED_VALUE>1234</SEED_VALUE> <!-- value 0 means randomly generated by OAI -->
</EMULATION_CONFIG>
<PROFILE>OTG_2</PROFILE>
</OAI_EMULATION>
@@ -0,0 +1,84 @@
<OAI_EMULATION>
<TOPOLOGY_CONFIG>
<AREA>
<X_m>500</X_m>
<Y_m>500</Y_m>
</AREA>
<MOBILITY>
<UE_MOBILITY>
<RANDOM_UE_DISTRIBUTION>
<NUMBER_OF_NODES>1</NUMBER_OF_NODES>
</RANDOM_UE_DISTRIBUTION>
<UE_MOBILITY_TYPE>STATIC</UE_MOBILITY_TYPE> <!-- STATIC -->
</UE_MOBILITY>
<eNB_MOBILITY>
<eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION>
<RANDOM_eNB_DISTRIBUTION>
<NUMBER_OF_CELLS>1</NUMBER_OF_CELLS>
</RANDOM_eNB_DISTRIBUTION>
<eNB_MOBILITY_TYPE>STATIC</eNB_MOBILITY_TYPE>
</eNB_MOBILITY>
</MOBILITY>
</TOPOLOGY_CONFIG>
<APPLICATION_CONFIG>
<CUSTOMIZED_TRAFFIC>
<PROB_OFF_PE>0.6</PROB_OFF_PE> <!-- Probability threshold to move from OFF to PE state. -->
<HOLDING_TIME_OFF_PE>10</HOLDING_TIME_OFF_PE> <!--Holding time in OFF state before moving to PE -->
<HOLDING_TIME_PE_OFF>200</HOLDING_TIME_PE_OFF> <!--Holding time in PE state before moving to OFF -->
<SOURCE_ID>1</SOURCE_ID>
<TRANSPORT_PROTOCOL>tcp</TRANSPORT_PROTOCOL> <!-- OPTIONS: tcp (default), udp -->
<IP_VERSION>ipv4</IP_VERSION> <!-- OPTIONS: ipv4 (default), ipv6 -->
<DESTINATION_ID>0</DESTINATION_ID>
<BACKGROUND_TRAFFIC>enable</BACKGROUND_TRAFFIC> <!-- options: enable, disable. If enable, it generates a background traffic corresponding to the traffic direction-->
<AGGREGATION_LEVEL>1</AGGREGATION_LEVEL> <!-- options: default=1, the number of traffic to aggregate-->
<IDT_DIST>uniform</IDT_DIST> <!-- available distributions: none (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gammav-->
<IDT_MIN_ms>80</IDT_MIN_ms> <!--Minimum IDT values in milliseconds-->
<IDT_MAX_ms>100</IDT_MAX_ms> <!--MAximum IDT values in milliseconds-->
<SIZE_DIST>uniform</SIZE_DIST> <!-- available distributions: none (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gammav-->
<SIZE_MIN_byte>100</SIZE_MIN_byte> <!--Minimum PAYLOAD size values in bytes-->
<SIZE_MAX_byte>200</SIZE_MAX_byte> <!--MAximum PAYLOAD size values in bytes-->
</CUSTOMIZED_TRAFFIC>
<CUSTOMIZED_TRAFFIC>
<PROB_OFF_PE>0.6</PROB_OFF_PE> <!-- Probability threshold to move from OFF to PE state. -->
<HOLDING_TIME_OFF_PE>10</HOLDING_TIME_OFF_PE> <!--Holding time in OFF state before moving to PE -->
<HOLDING_TIME_PE_OFF>200</HOLDING_TIME_PE_OFF> <!--Holding time in PE state before moving to OFF -->
<SOURCE_ID>0</SOURCE_ID>
<TRANSPORT_PROTOCOL>tcp</TRANSPORT_PROTOCOL> <!-- OPTIONS: tcp (default), udp -->
<IP_VERSION>ipv4</IP_VERSION> <!-- OPTIONS: ipv4 (default), ipv6 -->
<DESTINATION_ID>1</DESTINATION_ID>
<BACKGROUND_TRAFFIC>enable</BACKGROUND_TRAFFIC> <!-- options: enable, disable. If enable, it generates a background traffic corresponding to the traffic direction-->
<AGGREGATION_LEVEL>1</AGGREGATION_LEVEL> <!-- options: default=1, the number of traffic to aggregate-->
<IDT_DIST>uniform</IDT_DIST> <!-- available distributions: none (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gammav-->
<IDT_MIN_ms>1000</IDT_MIN_ms> <!--Minimum IDT values in milliseconds-->
<IDT_MAX_ms>2000</IDT_MAX_ms> <!--MAximum IDT values in milliseconds-->
<SIZE_DIST>uniform</SIZE_DIST> <!-- available distributions: none (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gammav-->
<SIZE_MIN_byte>100</SIZE_MIN_byte> <!--Minimum PAYLOAD size values in bytes-->
<SIZE_MAX_byte>200</SIZE_MAX_byte> <!--MAximum PAYLOAD size values in bytes-->
</CUSTOMIZED_TRAFFIC>
</APPLICATION_CONFIG>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>100000</EMULATION_TIME_ms> <!--if 0 set to infinity-->
<CURVE>enable</CURVE> <!-- option: enabled, disabled. If CURVE is enabled, graphes are ploted in real time (UL and DL) of WOD and throughput measurement for each packet -->
<BACKGROUND_STATS>enable</BACKGROUND_STATS> <!-- option: enable, disable. If enable, it allows to ptrint BACKGROUNS statistics: Nb packets, throughputs,etc-->
<PERFORMANCE_METRICS>
<THROUGHPUT>enable</THROUGHPUT> <!-- option: enable, disable. If enable, throughput measurements are plotted in real time-->
<LATENCY>enable</LATENCY> <!-- option: enable, disable. If enable, latency measurements are plotted in real time-->
<OWD_RADIO_ACCESS>enable</OWD_RADIO_ACCESS> <!-- option: enable, disable. If enable owd curve shows the one way radio access delay, else it shows end to end owd -->
</PERFORMANCE_METRICS>
<LOG> <!-- set the global log level -->
<LEVEL>trace</LEVEL>
<INTERVAL>1</INTERVAL>
</LOG>
<SEED_VALUE>1234</SEED_VALUE> <!-- value 0 means randomly generated by OAI -->
</EMULATION_CONFIG>
<PROFILE>OTG_2</PROFILE>
</OAI_EMULATION>
@@ -0,0 +1,70 @@
<OAI_EMULATION>
<TOPOLOGY_CONFIG>
<AREA>
<X_m>500</X_m>
<Y_m>500</Y_m>
</AREA>
<MOBILITY>
<UE_MOBILITY>
<RANDOM_UE_DISTRIBUTION>
<NUMBER_OF_NODES>3</NUMBER_OF_NODES>
</RANDOM_UE_DISTRIBUTION>
<UE_MOBILITY_TYPE>STATIC</UE_MOBILITY_TYPE> <!-- STATIC -->
</UE_MOBILITY>
<eNB_MOBILITY>
<eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION>
<RANDOM_eNB_DISTRIBUTION>
<NUMBER_OF_CELLS>1</NUMBER_OF_CELLS>
</RANDOM_eNB_DISTRIBUTION>
<eNB_MOBILITY_TYPE>STATIC</eNB_MOBILITY_TYPE>
</eNB_MOBILITY>
</MOBILITY>
</TOPOLOGY_CONFIG>
<APPLICATION_CONFIG>
<!-- High complexity configuration of a customized traffic with 2 states: OFF, PU and PE-->
<!-- We configure OFF and PE holding time and off_pe, off_pu probabilities. They will be preconfigured automatically -->
<CUSTOMIZED_TRAFFIC>
<PU_SIZE_PKTS>70</PU_SIZE_PKTS> <!-- PU state packet size in bytes-->
<PROB_OFF_PU>0.1</PROB_OFF_PU> <!-- Probability threshold to move from OFF to PU state. -->
<PROB_OFF_PE>0.8</PROB_OFF_PE> <!-- Probability threshold to move from OFF to PE state. -->
<HOLDING_TIME_OFF_PU>50</HOLDING_TIME_OFF_PU> <!--Holding time in OFF state before moving to PU -->
<HOLDING_TIME_OFF_PE>13</HOLDING_TIME_OFF_PE> <!--Holding time in OFF state before moving to PE -->
<HOLDING_TIME_PE_OFF>230</HOLDING_TIME_PE_OFF> <!--Holding time in PE state before moving to OFF -->
<SOURCE_ID>1:3</SOURCE_ID>
<TRANSPORT_PROTOCOL>udp</TRANSPORT_PROTOCOL> <!-- OPTIONS: tcp (default), udp -->
<IP_VERSION>ipv6</IP_VERSION> <!-- OPTIONS: ipv4 (default), ipv6 -->
<DESTINATION_ID>0</DESTINATION_ID>
<BACKGROUND_TRAFFIC>enable</BACKGROUND_TRAFFIC> <!-- options: enable, disable. If enable, it generates a background traffic corresponding to the traffic direction-->
<AGGREGATION_LEVEL>1</AGGREGATION_LEVEL> <!-- options: default=1, the number of traffic to aggregate-->
<IDT_DIST>uniform</IDT_DIST> <!-- available distributions: none (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gammav-->
<IDT_STANDARD_DEVIATION>4.5</IDT_STANDARD_DEVIATION> <!-- Standard deviation-->
<SIZE_DIST>pareto</SIZE_DIST> <!-- available distributions: none (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gammav-->
<SIZE_SCALE>0.5</SIZE_SCALE> <!-- Scale-->
<SIZE_SHAPE>30</SIZE_SHAPE> <!-- Shape-->
</CUSTOMIZED_TRAFFIC>
</APPLICATION_CONFIG>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>1000</EMULATION_TIME_ms> <!--if 0 set to infinity-->
<CURVE>enable</CURVE> <!-- option: enabled, disabled. If CURVE is enabled, graphes are ploted in real time (UL and DL) of WOD and throughput measurement for each packet -->
<BACKGROUND_STATS>enable</BACKGROUND_STATS> <!-- option: enable, disable. If enable, it allows to ptrint BACKGROUNS statistics: Nb packets, throughputs,etc-->
<PERFORMANCE_METRICS>
<THROUGHPUT>enable</THROUGHPUT> <!-- option: enable, disable. If enable, throughput measurements are plotted in real time-->
<LATENCY>enable</LATENCY> <!-- option: enable, disable. If enable, latency measurements are plotted in real time-->
<OWD_RADIO_ACCESS>enable</OWD_RADIO_ACCESS> <!-- option: enable, disable. If enable owd curve shows the one way radio access delay, else it shows end to end owd -->
</PERFORMANCE_METRICS>
<LOG> <!-- set the global log level -->
<LEVEL>trace</LEVEL>
<INTERVAL>1</INTERVAL>
</LOG>
<SEED_VALUE>1234</SEED_VALUE> <!-- value 0 means randomly generated by OAI -->
</EMULATION_CONFIG>
<PROFILE>OTG_2</PROFILE>
</OAI_EMULATION>
@@ -0,0 +1,71 @@
<OAI_EMULATION>
<TOPOLOGY_CONFIG>
<AREA>
<X_m>500</X_m>
<Y_m>500</Y_m>
</AREA>
<MOBILITY>
<UE_MOBILITY>
<RANDOM_UE_DISTRIBUTION>
<NUMBER_OF_NODES>3</NUMBER_OF_NODES>
</RANDOM_UE_DISTRIBUTION>
<UE_MOBILITY_TYPE>STATIC</UE_MOBILITY_TYPE> <!-- STATIC -->
</UE_MOBILITY>
<eNB_MOBILITY>
<eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION>
<RANDOM_eNB_DISTRIBUTION>
<NUMBER_OF_CELLS>1</NUMBER_OF_CELLS>
</RANDOM_eNB_DISTRIBUTION>
<eNB_MOBILITY_TYPE>STATIC</eNB_MOBILITY_TYPE>
</eNB_MOBILITY>
</MOBILITY>
</TOPOLOGY_CONFIG>
<APPLICATION_CONFIG>
<!-- High complexity configuration of a customized traffic with 2 states: OFF, ED and PE-->
<!-- We configure OFF and PE holding time and off_pe, off_ED probabilities. They will be preconfigured automatically -->
<CUSTOMIZED_TRAFFIC>
<ED_SIZE_PKTS>70</ED_SIZE_PKTS>
<PROB_OFF_ED>0.1</PROB_OFF_ED>
<PROB_OFF_PE>0.2</PROB_OFF_PE> <!-- Probability threshold to move from OFF to PE state. -->
<HOLDING_TIME_OFF_ED>100</HOLDING_TIME_OFF_ED> <!--Holding time in OFF state before moving to ED -->
<HOLDING_TIME_OFF_PE>200</HOLDING_TIME_OFF_PE> <!--Holding time in OFF state before moving to PE -->
<HOLDING_TIME_PE_OFF>230</HOLDING_TIME_PE_OFF> <!--Holding time in PE state before moving to OFF -->
<SOURCE_ID>1:3</SOURCE_ID>
<TRANSPORT_PROTOCOL>udp</TRANSPORT_PROTOCOL> <!-- OPTIONS: tcp (default), udp -->
<IP_VERSION>ipv6</IP_VERSION> <!-- OPTIONS: ipv4 (default), ipv6 -->
<DESTINATION_ID>0</DESTINATION_ID>
<BACKGROUND_TRAFFIC>enable</BACKGROUND_TRAFFIC> <!-- options: enable, disable. If enable, it generates a background traffic corresponding to the traffic direction-->
<AGGREGATION_LEVEL>1</AGGREGATION_LEVEL> <!-- options: default=1, the number of traffic to aggregate-->
<IDT_DIST>uniform</IDT_DIST> <!-- available distributions: none (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gammav-->
<IDT_MIN_ms>100</IDT_MIN_ms> <!--Minimum IDT values in milliseconds-->
<IDT_MAX_ms>200</IDT_MAX_ms> <!--MAximum IDT values in milliseconds-->
<SIZE_DIST>pareto</SIZE_DIST> <!-- available distributions: none (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gammav-->
<SIZE_SCALE>0.5</SIZE_SCALE> <!-- Scale-->
<SIZE_SHAPE>30</SIZE_SHAPE> <!-- Shape-->
</CUSTOMIZED_TRAFFIC>
</APPLICATION_CONFIG>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>3000</EMULATION_TIME_ms> <!--if 0 set to infinity-->
<CURVE>enable</CURVE> <!-- option: enabled, disabled. If CURVE is enabled, graphes are ploted in real time (UL and DL) of WOD and throughput measurement for each packet -->
<BACKGROUND_STATS>enable</BACKGROUND_STATS> <!-- option: enable, disable. If enable, it allows to ptrint BACKGROUNS statistics: Nb packets, throughputs,etc-->
<PERFORMANCE_METRICS>
<THROUGHPUT>enable</THROUGHPUT> <!-- option: enable, disable. If enable, throughput measurements are plotted in real time-->
<LATENCY>enable</LATENCY> <!-- option: enable, disable. If enable, latency measurements are plotted in real time-->
<OWD_RADIO_ACCESS>enable</OWD_RADIO_ACCESS> <!-- option: enable, disable. If enable owd curve shows the one way radio access delay, else it shows end to end owd -->
</PERFORMANCE_METRICS>
<LOG> <!-- set the global log level -->
<LEVEL>trace</LEVEL>
<INTERVAL>1</INTERVAL>
</LOG>
<SEED_VALUE>1234</SEED_VALUE> <!-- value 0 means randomly generated by OAI -->
</EMULATION_CONFIG>
<PROFILE>OTG_2</PROFILE>
</OAI_EMULATION>
@@ -0,0 +1,55 @@
<OAI_EMULATION>
<TOPOLOGY_CONFIG>
<AREA>
<X_m>500</X_m>
<Y_m>500</Y_m>
</AREA>
<MOBILITY>
<UE_MOBILITY>
<RANDOM_UE_DISTRIBUTION>
<NUMBER_OF_NODES>3</NUMBER_OF_NODES>
</RANDOM_UE_DISTRIBUTION>
<UE_MOBILITY_TYPE>STATIC</UE_MOBILITY_TYPE> <!-- STATIC -->
</UE_MOBILITY>
<eNB_MOBILITY>
<eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION>
<RANDOM_eNB_DISTRIBUTION>
<NUMBER_OF_CELLS>1</NUMBER_OF_CELLS>
</RANDOM_eNB_DISTRIBUTION>
<eNB_MOBILITY_TYPE>STATIC</eNB_MOBILITY_TYPE>
</eNB_MOBILITY>
</MOBILITY>
</TOPOLOGY_CONFIG>
<APPLICATION_CONFIG>
<!-- Basic configuration of a preconfigured M2M traffic with 4 states: OFF, PU, ED and PE-->
<PREDEFINED_TRAFFIC>
<SOURCE_ID>0</SOURCE_ID>
<APPLICATION_TYPE>m2m_traffic</APPLICATION_TYPE> <!-- options: scbr,mcbr,bcbr, gaming_OA, gaming_TF, m2m_AP, m2m_BR ,m2m_traffic -->
<BACKGROUND_TRAFFIC>enable</BACKGROUND_TRAFFIC> <!-- options: enable, disable. If enable, it generates a background traffic corresponding to the traffic direction-->
<AGGREGATION_LEVEL>1</AGGREGATION_LEVEL> <!-- options: default=1, the number of traffic to aggregate-->
<DESTINATION_ID>1:3</DESTINATION_ID>
</PREDEFINED_TRAFFIC>
</APPLICATION_CONFIG>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>5000</EMULATION_TIME_ms> <!--if 0 set to infinity-->
<CURVE>enable</CURVE> <!-- option: enable, disable. If CURVE is enable, graphes are ploted in real time (UL and DL) of WOD and throughput measurement for each packet -->
<BACKGROUND_STATS>enable</BACKGROUND_STATS> <!-- option: enable, disable. If enable, it allows to ptrint BACKGROUNS statistics: Nb packets, throughputs,etc-->
<PERFORMANCE_METRICS>
<THROUGHPUT>enable</THROUGHPUT> <!-- option: enable, disable. If enable, throughput measurements are plotted in real time-->
<LATENCY>enable</LATENCY> <!-- option: enable, disable. If enable, latency measurements are plotted in real time-->
<OWD_RADIO_ACESS>enable</OWD_RADIO_ACESS> <!-- option: enable, disable. If enable owd curve shows the one way radio access delay, else it shows end to end owd -->
</PERFORMANCE_METRICS>
<LOG> <!-- set the global log level -->
<LEVEL>trace</LEVEL>
<INTERVAL>1</INTERVAL>
</LOG>
<SEED_VALUE>1234</SEED_VALUE> <!-- value 0 means randomly generated by OAI -->
</EMULATION_CONFIG>
<PROFILE>OTG_2</PROFILE>
</OAI_EMULATION>
@@ -0,0 +1,77 @@
<OAI_EMULATION>
<TOPOLOGY_CONFIG>
<AREA>
<X_m>500</X_m>
<Y_m>500</Y_m>
</AREA>
<MOBILITY>
<UE_MOBILITY>
<RANDOM_UE_DISTRIBUTION>
<NUMBER_OF_NODES>3</NUMBER_OF_NODES>
</RANDOM_UE_DISTRIBUTION>
<UE_MOBILITY_TYPE>STATIC</UE_MOBILITY_TYPE> <!-- STATIC -->
</UE_MOBILITY>
<eNB_MOBILITY>
<eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION>
<RANDOM_eNB_DISTRIBUTION>
<NUMBER_OF_CELLS>1</NUMBER_OF_CELLS>
</RANDOM_eNB_DISTRIBUTION>
<eNB_MOBILITY_TYPE>STATIC</eNB_MOBILITY_TYPE>
</eNB_MOBILITY>
</MOBILITY>
</TOPOLOGY_CONFIG>
<APPLICATION_CONFIG>
<!-- High complexity configuration of a customized traffic with 3 states: OFF, ED, PU and PE-->
<CUSTOMIZED_TRAFFIC>
<SOURCE_ID>0</SOURCE_ID>
<TRANSPORT_PROTOCOL>tcp</TRANSPORT_PROTOCOL>
<IP_VERSION>ipv4</IP_VERSION>
<DESTINATION_ID>1:3</DESTINATION_ID>
<BACKGROUND_TRAFFIC>enable</BACKGROUND_TRAFFIC> <!-- options: enable, disable. If enable, it generates a background traffic corresponding to the traffic direction-->
<AGGREGATION_LEVEL>1</AGGREGATION_LEVEL> <!-- options: default=1, the number of traffic to aggregate-->
<IDT_DIST>uniform</IDT_DIST> <!-- available distributions: none (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gammav-->
<IDT_MIN_ms>400</IDT_MIN_ms> <!--Minimum IDT values in milliseconds-->
<IDT_MAX_ms>500</IDT_MAX_ms> <!--Maximum IDT values in milliseconds-->
<SIZE_DIST>uniform</SIZE_DIST> <!-- available distributions: none (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gammav-->
<SIZE_MIN_byte>80</SIZE_MIN_byte> <!--Minimum PAYLOAD size in bytes-->
<SIZE_MAX_byte>150</SIZE_MAX_byte> <!--Maximum PAYLOAD size in bytes-->
<PU_SIZE_PKTS>60</PU_SIZE_PKTS> <!-- PU state packet size in bytes-->
<ED_SIZE_PKTS>70</ED_SIZE_PKTS> <!-- ED state packet size in bytes-->
<PROB_OFF_PU>0.2</PROB_OFF_PU> <!-- Probability threshold to move from OFF to PU state. -->
<PROB_OFF_ED>0.1</PROB_OFF_ED> <!-- Probability threshold to move from OFF to ED state. -->
<PROB_OFF_PE>0.2</PROB_OFF_PE> <!-- Probability threshold to move from OFF to PE state. -->
<PROB_PU_ED>0.1</PROB_PU_ED> <!-- Probability threshold to move from PU to ED state. -->
<PROB_PU_PE>0.3</PROB_PU_PE> <!-- Probability threshold to move from PU to PE state. -->
<PROB_ED_PE>0.1</PROB_ED_PE> <!-- Probability threshold to move from ED to PE state. -->
<PROB_ED_PU>0.2</PROB_ED_PU> <!-- Probability threshold to move from ED to PU state. -->
<HOLDING_TIME_OFF_ED>100</HOLDING_TIME_OFF_ED> <!--Holding time in OFF state before moving to ED -->
<HOLDING_TIME_OFF_PU>120</HOLDING_TIME_OFF_PU> <!--Holding time in OFF state before moving to PU -->
<HOLDING_TIME_OFF_PE>150</HOLDING_TIME_OFF_PE> <!--Holding time in OFF state before moving to PE -->
<HOLDING_TIME_PE_OFF>500</HOLDING_TIME_PE_OFF> <!--Holding time in PE state before moving to OFF -->
</CUSTOMIZED_TRAFFIC>
</APPLICATION_CONFIG>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>0</EMULATION_TIME_ms> <!--if0 set to infinity-->
<CURVE>enable</CURVE> <!-- option: enabled, disabled. If CURVE is enabled, graphes are ploted in real time (UL and DL) of WOD and throughput measurement for each packet -->
<BACKGROUND_STATS>enable</BACKGROUND_STATS>
<PERFORMANCE_METRICS>
<THROUGHPUT>enable</THROUGHPUT>
<LATENCY>enable</LATENCY>
<OWD_RADIO_ACCESS>enable</OWD_RADIO_ACCESS> <!-- option: 0, 1. If 1 owd curve shows the one way radio access delay,else shows end to end owd -->
</PERFORMANCE_METRICS>
<LOG> <!-- set the global log level -->
<LEVEL>debug</LEVEL>
<INTERVAL>1</INTERVAL>
</LOG>
<SEED_VALUE>1234</SEED_VALUE> <!-- value 0 means randomly generated by OAI -->
</EMULATION_CONFIG>
<PROFILE>OTG_2</PROFILE>
</OAI_EMULATION>
@@ -0,0 +1,56 @@
<OAI_EMULATION>
<ENVIRONMENT_SYSTEM_CONFIG>
<FADING>
<LARGE_SCALE>free_space</LARGE_SCALE>
<FREE_SPACE_MODEL_PARAMETERS>
<PATHLOSS_EXPONENT>2</PATHLOSS_EXPONENT>
<PATHLOSS_0_dB>-50</PATHLOSS_0_dB>
</FREE_SPACE_MODEL_PARAMETERS>
</FADING>
<ANTENNA>
<eNB_ANTENNA>
<RX_NOISE_LEVEL_dB>-90</RX_NOISE_LEVEL_dB>
</eNB_ANTENNA>
<UE_ANTENNA>
<RX_NOISE_LEVEL_dB>-90</RX_NOISE_LEVEL_dB>
</UE_ANTENNA>
</ANTENNA>
</ENVIRONMENT_SYSTEM_CONFIG>
<TOPOLOGY_CONFIG>
<AREA>
<X_m>1000</X_m>
<Y_m>1000</Y_m>
</AREA>
<MOBILITY>
<UE_MOBILITY>
<UE_INITIAL_DISTRIBUTION>random</UE_INITIAL_DISTRIBUTION>
<RANDOM_UE_DISTRIBUTION>
<NUMBER_OF_NODES>3</NUMBER_OF_NODES>
</RANDOM_UE_DISTRIBUTION>
<UE_MOBILITY_TYPE>RWP</UE_MOBILITY_TYPE>
</UE_MOBILITY>
<eNB_MOBILITY>
<eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION>
<RANDOM_eNB_DISTRIBUTION>
<NUMBER_OF_CELLS>1</NUMBER_OF_CELLS>
</RANDOM_eNB_DISTRIBUTION>
<eNB_MOBILITY_TYPE>STATIC</eNB_MOBILITY_TYPE>
</eNB_MOBILITY>
</MOBILITY>
</TOPOLOGY_CONFIG>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>5000</EMULATION_TIME_ms>
<LOG> <!-- set the global log level -->
<LEVEL>debug</LEVEL>
</LOG>
</EMULATION_CONFIG>
<PROFILE>OCM_OMG_1</PROFILE>
</OAI_EMULATION>
@@ -0,0 +1,86 @@
<OAI_EMULATION>
<ENVIRONMENT_SYSTEM_CONFIG>
<FADING>
<FREE_SPACE_MODEL_PARAMETERS>
<PATHLOSS_EXPONENT>2.0</PATHLOSS_EXPONENT>
</FREE_SPACE_MODEL_PARAMETERS>
<SMALL_SCALE>AWGN</SMALL_SCALE>
</FADING>
<UE_FREQUENCY_GHz>1.9</UE_FREQUENCY_GHz>
</ENVIRONMENT_SYSTEM_CONFIG>
<TOPOLOGY_CONFIG>
<AREA>
<X_m>500</X_m>
<Y_m>500</Y_m>
</AREA>
<MOBILITY>
<UE_MOBILITY>
<RANDOM_UE_DISTRIBUTION>
<NUMBER_OF_NODES>4</NUMBER_OF_NODES>
</RANDOM_UE_DISTRIBUTION>
<UE_MOBILITY_TYPE>STATIC</UE_MOBILITY_TYPE> <!-- STATIC -->
</UE_MOBILITY>
<eNB_MOBILITY>
<eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION>
<RANDOM_eNB_DISTRIBUTION>
<NUMBER_OF_CELLS>1</NUMBER_OF_CELLS>
</RANDOM_eNB_DISTRIBUTION>
<eNB_MOBILITY_TYPE>STATIC</eNB_MOBILITY_TYPE>
</eNB_MOBILITY>
</MOBILITY>
</TOPOLOGY_CONFIG>
<APPLICATION_CONFIG>
<!-- Basic configuration of a customized traffic : one state-->
<CUSTOMIZED_TRAFFIC>
<SOURCE_ID>0</SOURCE_ID>
<TRANSPORT_PROTOCOL>udp</TRANSPORT_PROTOCOL> <!-- OPTIONS: tcp (default), udp -->
<IP_VERSION>ipv6</IP_VERSION> <!-- OPTIONS: ipv4 (default), ipv6 -->
<DESTINATION_ID>1:3</DESTINATION_ID>
<BACKGROUND_TRAFFIC>disable</BACKGROUND_TRAFFIC> <!-- options: enable, disable. If enable, it generates a background traffic corresponding to the traffic direction-->
<IDT_DIST>uniform</IDT_DIST> <!-- available distributions: none (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gammav-->
<IDT_MIN_ms>40</IDT_MIN_ms> <!--Minimum IDT values in milliseconds-->
<IDT_MAX_ms>50</IDT_MAX_ms> <!--Minimum IDT values in milliseconds-->
<SIZE_DIST>fixed</SIZE_DIST> <!-- available distributions: none (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gammav-->
<SIZE_MIN_byte>1400</SIZE_MIN_byte> <!--Minimum PAYLOAD size values in bytes-->
<SIZE_MAX_byte>1400</SIZE_MAX_byte> <!--MAximum PAYLOAD size values in bytes-->
</CUSTOMIZED_TRAFFIC>
<CUSTOMIZED_TRAFFIC>
<SOURCE_ID>1:3</SOURCE_ID>
<TRANSPORT_PROTOCOL>udp</TRANSPORT_PROTOCOL> <!-- OPTIONS: tcp (default), udp -->
<IP_VERSION>ipv6</IP_VERSION> <!-- OPTIONS: ipv4 (default), ipv6 -->
<DESTINATION_ID>0</DESTINATION_ID>
<DURATION_ms>7000</DURATION_ms> <!-- indicates the start time of the app or the actual duration of the traffic-->
<BACKGROUND_TRAFFIC>disable</BACKGROUND_TRAFFIC> <!-- options: enable, disable. If enable, it generates a background traffic corresponding to the traffic direction-->
<IDT_DIST>fixed</IDT_DIST> <!-- available distributions: none (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gammav-->
<IDT_MIN_ms>40</IDT_MIN_ms> <!--Minimum IDT values in milliseconds-->
<IDT_MAX_ms>50</IDT_MAX_ms> <!--Minimum IDT values in milliseconds-->
<SIZE_DIST>uniform</SIZE_DIST> <!-- available distributions: none (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gammav-->
<SIZE_MIN_byte>256</SIZE_MIN_byte> <!--Minimum PAYLOAD size values in bytes-->
<SIZE_MAX_byte>768</SIZE_MAX_byte> <!--Maximum PAYLOAD size values in bytes-->
</CUSTOMIZED_TRAFFIC>
</APPLICATION_CONFIG>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>30000</EMULATION_TIME_ms> <!--if 0 set to infinity-->
<CURVE>disable</CURVE> <!-- option: enabled, disabled. If CURVE is enabled, graphes are ploted in real time (UL and DL) of WOD and throughput measurement for each packet -->
<PERFORMANCE_METRICS>
<THROUGHPUT>enable</THROUGHPUT> <!-- option: enable, disable. If enable, throughput measurements are plotted in real time-->
<LATENCY>enable</LATENCY> <!-- option: enable, disable. If enable, latency measurements are plotted in real time-->
<OWD_RADIO_ACCESS>enable</OWD_RADIO_ACCESS> <!-- option: enable, disable. If enable owd curve shows the one way radio access delay, else it shows end to end owd -->
</PERFORMANCE_METRICS>
<LOG> <!-- set the global log level -->
<LEVEL>info</LEVEL>
<VERBOSITY>low</VERBOSITY>
<INTERVAL>1</INTERVAL>
</LOG>
<SEED_VALUE>1234</SEED_VALUE> <!-- value 0 means randomly generated by OAI -->
</EMULATION_CONFIG>
<PROFILE>MEDIEVAL_OTG_1</PROFILE>
</OAI_EMULATION>
@@ -0,0 +1,55 @@
<OAI_EMULATION>
<TOPOLOGY_CONFIG>
<AREA>
<X_m>500</X_m>
<Y_m>500</Y_m>
</AREA>
<MOBILITY>
<UE_MOBILITY>
<RANDOM_UE_DISTRIBUTION>
<NUMBER_OF_NODES>1</NUMBER_OF_NODES>
</RANDOM_UE_DISTRIBUTION>
<UE_MOBILITY_TYPE>STATIC</UE_MOBILITY_TYPE> <!-- STATIC -->
</UE_MOBILITY>
<eNB_MOBILITY>
<eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION>
<RANDOM_eNB_DISTRIBUTION>
<NUMBER_OF_CELLS>1</NUMBER_OF_CELLS>
</RANDOM_eNB_DISTRIBUTION>
<eNB_MOBILITY_TYPE>STATIC</eNB_MOBILITY_TYPE>
</eNB_MOBILITY>
</MOBILITY>
</TOPOLOGY_CONFIG>
<APPLICATION_CONFIG>
<!-- Basic configuration of a preconfigured M2M traffic with 4 states: OFF, PU, ED and PE-->
<PREDEFINED_TRAFFIC>
<SOURCE_ID>1</SOURCE_ID>
<APPLICATION_TYPE>alarm_temperature</APPLICATION_TYPE> <!-- options: scbr,mcbr,bcbr, auto_pilot_l (LOW speed), auto_pilot_m (MEDIEUM speed), auto_pilot_h (HIGH speed), auto_pilot_e (EMERGENCY), virtual_race_l (LOW speed), virtual_race_m (MEDIUM speed), virtual_race_h (HIGH speed), virtual_race_f (FINISH speed), alarm_humidity, alarm_smoke, alarm_temperature -->
<BACKGROUND_TRAFFIC>disable</BACKGROUND_TRAFFIC> <!-- options: enable, disable. If enable, it generates a background traffic corresponding to the traffic direction-->
<AGGREGATION_LEVEL>1</AGGREGATION_LEVEL> <!-- options: default=1, the number of traffic to aggregate-->
<DESTINATION_ID>0</DESTINATION_ID>
</PREDEFINED_TRAFFIC>
</APPLICATION_CONFIG>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>10000</EMULATION_TIME_ms> <!--if 0 set to infinity-->
<CURVE>enable</CURVE> <!-- option: enable, disable. If CURVE is enable, graphes are ploted in real time (UL and DL) of WOD and throughput measurement for each packet -->
<BACKGROUND_STATS>enable</BACKGROUND_STATS> <!-- option: enable, disable. If enable, it allows to ptrint BACKGROUNS statistics: Nb packets, throughputs,etc-->
<PERFORMANCE_METRICS>
<THROUGHPUT>enable</THROUGHPUT> <!-- option: enable, disable. If enable, throughput measurements are plotted in real time-->
<LATENCY>enable</LATENCY> <!-- option: enable, disable. If enable, latency measurements are plotted in real time-->
<OWD_RADIO_ACCESS>enable</OWD_RADIO_ACCESS> <!-- option: enable, disable. If enable owd curve shows the one way radio access delay, else it shows end to end owd -->
</PERFORMANCE_METRICS>
<LOG> <!-- set the global log level -->
<LEVEL>trace</LEVEL>
<INTERVAL>1</INTERVAL>
</LOG>
<SEED_VALUE>1234</SEED_VALUE> <!-- value 0 means randomly generated by OAI -->
</EMULATION_CONFIG>
<PROFILE>OTG_2</PROFILE>
</OAI_EMULATION>
@@ -0,0 +1,85 @@
<OAI_EMULATION>
<ENVIRONMENT_SYSTEM_CONFIG>
<FADING>
<LARGE_SCALE>urban</LARGE_SCALE>
<FREE_SPACE_MODEL_PARAMETERS>
<PATHLOSS_EXPONENT>2</PATHLOSS_EXPONENT>
<PATHLOSS_0_dB>-50</PATHLOSS_0_dB><!--pathloss at 1km -->
</FREE_SPACE_MODEL_PARAMETERS>
<SMALL_SCALE>AWGN</SMALL_SCALE>
</FADING>
<WALL_PENETRATION_LOSS_dB>5</WALL_PENETRATION_LOSS_dB>
<SYSTEM_BANDWIDTH_MB>7.68</SYSTEM_BANDWIDTH_MB>
<UE_FREQUENCY_GHz>1.9</UE_FREQUENCY_GHz>
<ANTENNA>
<eNB_ANTENNA>
<RX_NOISE_LEVEL_dB>5</RX_NOISE_LEVEL_dB>
<NUMBER_OF_SECTORS>1</NUMBER_OF_SECTORS>
<BEAM_WIDTH_dB>1.13</BEAM_WIDTH_dB>
<ANTENNA_GAIN_dBi>16</ANTENNA_GAIN_dBi>
<TX_POWER_dBm>40</TX_POWER_dBm>
</eNB_ANTENNA>
<UE_ANTENNA>
<RX_NOISE_LEVEL_dB>1</RX_NOISE_LEVEL_dB>
<ANTENNA_GAIN_dBi>5</ANTENNA_GAIN_dBi>
<TX_POWER_dBm>20</TX_POWER_dBm>
</UE_ANTENNA>
</ANTENNA>
</ENVIRONMENT_SYSTEM_CONFIG>
<TOPOLOGY_CONFIG>
<AREA>
<X_m>500</X_m>
<Y_m>500</Y_m>
</AREA>
<MOBILITY>
<UE_MOBILITY>
<RANDOM_UE_DISTRIBUTION>
<NUMBER_OF_NODES>10</NUMBER_OF_NODES>
</RANDOM_UE_DISTRIBUTION>
<UE_MOBILITY_TYPE>STATIC</UE_MOBILITY_TYPE>
</UE_MOBILITY>
<eNB_MOBILITY>
<eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION>
<RANDOM_eNB_DISTRIBUTION>
<NUMBER_OF_CELLS>1</NUMBER_OF_CELLS>
</RANDOM_eNB_DISTRIBUTION>
<eNB_MOBILITY_TYPE>STATIC</eNB_MOBILITY_TYPE>
</eNB_MOBILITY>
</MOBILITY>
</TOPOLOGY_CONFIG>
<APPLICATION_CONFIG>
<!-- DL -->
<PREDEFINED_TRAFFIC>
<SOURCE_ID>0</SOURCE_ID> <!-- valid formats are "n:m" and "n,m" and "n" -->
<DURATION_ms>5000</DURATION_ms> <!-- start at -->
<APPLICATION_TYPE>scbr</APPLICATION_TYPE>
<DESTINATION_ID>1:9</DESTINATION_ID> <!-- valid formats are "n:m" and "n,m" and "n" -->
</PREDEFINED_TRAFFIC>
<!-- UL -->
<PREDEFINED_TRAFFIC>
<SOURCE_ID>1:9</SOURCE_ID> <!-- valid formats are "n:m" and "n,m" and "n" -->
<DURATION_ms>5000</DURATION_ms> <!-- start at -->
<APPLICATION_TYPE>scbr</APPLICATION_TYPE>
<DESTINATION_ID>0</DESTINATION_ID> <!-- valid formats are "n:m" and "n,m" and "n" -->
</PREDEFINED_TRAFFIC>
</APPLICATION_CONFIG>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>10000</EMULATION_TIME_ms> <!--set to infinity-->
<PERFORMANCE_METRICS>
<THROUGHPUT>1</THROUGHPUT>
<LATENCY>1</LATENCY>
</PERFORMANCE_METRICS>
<LOG> <!-- set the global log level -->
<LEVEL>debug</LEVEL>
<VERBOSITY>low</VERBOSITY>
</LOG>
<SEED_VALUE>0</SEED_VALUE> <!-- value 0 means randomly generated by OAI -->
</EMULATION_CONFIG>
<PROFILE>CBA_1</PROFILE>
</OAI_EMULATION>
@@ -0,0 +1,63 @@
<!-- how to configure: talk about the convention, range -->
<OAI_EMULATION>
<ENVIRONMENT_SYSTEM_CONFIG>
<FADING>
<LARGE_SCALE>free_space</LARGE_SCALE>
<FREE_SPACE_MODEL_PARAMETERS>
<PATHLOSS_EXPONENT>2</PATHLOSS_EXPONENT>
<PATHLOSS_0_dB>-50</PATHLOSS_0_dB>
</FREE_SPACE_MODEL_PARAMETERS>
<SMALL_SCALE>Rice1</SMALL_SCALE>
</FADING>
<WALL_PENETRATION_LOSS_dB>5</WALL_PENETRATION_LOSS_dB>
<SYSTEM_BANDWIDTH_MB>7.68</SYSTEM_BANDWIDTH_MB>
<UE_FREQUENCY_GHz>1.9</UE_FREQUENCY_GHz>
<ANTENNA>
<eNB_ANTENNA>
<RX_NOISE_LEVEL>-90</RX_NOISE_LEVEL>
</eNB_ANTENNA>
<UE_ANTENNA>
<RX_NOISE_LEVEL>-90</RX_NOISE_LEVEL>
</UE_ANTENNA>
</ANTENNA>
</ENVIRONMENT_SYSTEM_CONFIG>
<TOPOLOGY_CONFIG>
<AREA>
<X_m>500</X_m>
<Y_m>500</Y_m>
</AREA>
<MOBILITY>
<UE_MOBILITY>
<UE_INITIAL_DISTRIBUTION>random</UE_INITIAL_DISTRIBUTION> <!-- options, range -->
<RANDOM_UE_DISTRIBUTION>
<NUMBER_OF_NODES>1</NUMBER_OF_NODES>
</RANDOM_UE_DISTRIBUTION>
<UE_MOBILITY_TYPE>STATIC</UE_MOBILITY_TYPE>
</UE_MOBILITY>
<eNB_MOBILITY>
<eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION>
<RANDOM_eNB_DISTRIBUTION>
<NUMBER_OF_CELLS>1</NUMBER_OF_CELLS>
</RANDOM_eNB_DISTRIBUTION>
<eNB_MOBILITY_TYPE>STATIC</eNB_MOBILITY_TYPE>
</eNB_MOBILITY>
</MOBILITY>
</TOPOLOGY_CONFIG>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>5000</EMULATION_TIME_ms>
<LOG> <!-- set the global log level -->
<LEVEL>debug</LEVEL>
</LOG>
</EMULATION_CONFIG>
<PROFILE>OCM_OMG_2</PROFILE>
</OAI_EMULATION>
@@ -0,0 +1,93 @@
<OAI_EMULATION>
<TOPOLOGY_CONFIG>
<AREA>
<X_m>500</X_m>
<Y_m>500</Y_m>
</AREA>
<MOBILITY>
<UE_MOBILITY>
<RANDOM_UE_DISTRIBUTION>
<NUMBER_OF_NODES>1</NUMBER_OF_NODES>
</RANDOM_UE_DISTRIBUTION>
<UE_MOBILITY_TYPE>STATIC</UE_MOBILITY_TYPE> <!-- STATIC -->
</UE_MOBILITY>
<eNB_MOBILITY>
<eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION>
<RANDOM_eNB_DISTRIBUTION>
<NUMBER_OF_CELLS>1</NUMBER_OF_CELLS>
</RANDOM_eNB_DISTRIBUTION>
<eNB_MOBILITY_TYPE>STATIC</eNB_MOBILITY_TYPE>
</eNB_MOBILITY>
</MOBILITY>
</TOPOLOGY_CONFIG>
<APPLICATION_CONFIG>
<!-- M2M: MANGO AGGREGATED TRAFFIC -->
<!-- M2M: NEWSTEO AGGREGATED TRAFFIC-->
<!-- VOIP TRAFFICS: G729 + G711-->
<!-- 1st VOIP TRAFFICS: G729 bidirectional -->
<PREDEFINED_TRAFFIC>
<SOURCE_ID>0</SOURCE_ID>
<APPLICATION_TYPE>voip_g729</APPLICATION_TYPE>
<DESTINATION_ID>1</DESTINATION_ID>
</PREDEFINED_TRAFFIC>
<PREDEFINED_TRAFFIC>
<SOURCE_ID>1</SOURCE_ID>
<APPLICATION_TYPE>voip_g729</APPLICATION_TYPE>
<DESTINATION_ID>0</DESTINATION_ID>
</PREDEFINED_TRAFFIC>
<!-- 2nd VOIP TRAFFICS: G711 bidirectional-->
<PREDEFINED_TRAFFIC>
<SOURCE_ID>0</SOURCE_ID>
<APPLICATION_TYPE>voip_g711</APPLICATION_TYPE>
<DESTINATION_ID>1</DESTINATION_ID>
</PREDEFINED_TRAFFIC>
<PREDEFINED_TRAFFIC>
<SOURCE_ID>1</SOURCE_ID>
<APPLICATION_TYPE>voip_g711</APPLICATION_TYPE>
<DESTINATION_ID>0</DESTINATION_ID>
</PREDEFINED_TRAFFIC>
<!-- 1st M2M: MANGO AGGREGATED TRAFFIC bidirectional-->
<PREDEFINED_TRAFFIC>
<SOURCE_ID>1</SOURCE_ID>
<APPLICATION_TYPE>iqsim_mango</APPLICATION_TYPE>
<DESTINATION_ID>0</DESTINATION_ID>
<BACKGROUND_TRAFFIC>disable</BACKGROUND_TRAFFIC>
</PREDEFINED_TRAFFIC>
<PREDEFINED_TRAFFIC>
<SOURCE_ID>0</SOURCE_ID>
<APPLICATION_TYPE>iqsim_mango</APPLICATION_TYPE>
<DESTINATION_ID>1</DESTINATION_ID>
</PREDEFINED_TRAFFIC>
<!-- 2nd M2M: NEWSTEO AGGREGATED TRAFFIC bidirectional-->
<PREDEFINED_TRAFFIC>
<SOURCE_ID>1</SOURCE_ID>
<APPLICATION_TYPE>iqsim_newsteo</APPLICATION_TYPE>
<DESTINATION_ID>0</DESTINATION_ID>
</PREDEFINED_TRAFFIC>
<PREDEFINED_TRAFFIC>
<SOURCE_ID>0</SOURCE_ID>
<APPLICATION_TYPE>iqsim_newsteo</APPLICATION_TYPE>
<DESTINATION_ID>1</DESTINATION_ID>
</PREDEFINED_TRAFFIC>
</APPLICATION_CONFIG>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>10000</EMULATION_TIME_ms> <!--if 0 set to infinity-->
<CURVE>enable</CURVE> <!-- option: enabled, disabled. If CURVE is enabled, graphes are ploted in real time (UL and DL) of WOD and throughput measurement for each packet -->
<BACKGROUND_STATS>enable</BACKGROUND_STATS> <!-- option: enable, disable. If enable, it allows to ptrint BACKGROUND statistics: Nb packets, throughputs,etc-->
<PERFORMANCE_METRICS>
<THROUGHPUT>enable</THROUGHPUT> <!-- option: enable, disable. If enable, throughput measurements are plotted in real time-->
<LATENCY>enable</LATENCY> <!-- option: enable, disable. If enable, latency measurements are plotted in real time-->
<OWD_RADIO_ACCESS>disable</OWD_RADIO_ACCESS> <!-- option: enable, disable. If enable owd curve shows the one way radio access delay, else it shows end to end owd -->
</PERFORMANCE_METRICS>
<LOG> <!-- set the global log level -->
<LEVEL>info</LEVEL>
<INTERVAL>1</INTERVAL>
</LOG>
<SEED_VALUE>1234</SEED_VALUE> <!-- value 0 means randomly generated by OAI -->
</EMULATION_CONFIG>
<PROFILE>OTG_2</PROFILE>
</OAI_EMULATION>
@@ -0,0 +1,41 @@
<OAI_EMULATION>
<TOPOLOGY_CONFIG>
<AREA>
<X_m>100</X_m>
<Y_m>100</Y_m>
</AREA>
<MOBILITY>
<UE_MOBILITY>
<UE_INITIAL_DISTRIBUTION>random</UE_INITIAL_DISTRIBUTION>
<RANDOM_UE_DISTRIBUTION>
<NUMBER_OF_NODES>1</NUMBER_OF_NODES>
</RANDOM_UE_DISTRIBUTION>
<UE_MOBILITY_TYPE>RWP</UE_MOBILITY_TYPE>
<UE_MOVING_DYNAMICS>
<MIN_SPEED_mps>0.01</MIN_SPEED_mps>
<MAX_SPEED_mps>10</MAX_SPEED_mps>
<MIN_PAUSE_TIME_ms>0.01</MIN_PAUSE_TIME_ms>
<MAX_PAUSE_TIME_ms>10</MAX_PAUSE_TIME_ms>
<MIN_JOURNEY_TIME_ms>0.01</MIN_JOURNEY_TIME_ms>
<MAX_JOURNEY_TIME_ms>10</MAX_JOURNEY_TIME_ms>
</UE_MOVING_DYNAMICS>
</UE_MOBILITY>
<eNB_MOBILITY>
<eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION>
<RANDOM_eNB_DISTRIBUTION>
<NUMBER_OF_CELLS>1</NUMBER_OF_CELLS>
</RANDOM_eNB_DISTRIBUTION>
<eNB_MOBILITY_TYPE>STATIC</eNB_MOBILITY_TYPE>
</eNB_MOBILITY>
</MOBILITY>
<OMV>1</OMV>
</TOPOLOGY_CONFIG>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>1000</EMULATION_TIME_ms>
</EMULATION_CONFIG>
<PROFILE>OMG_OMV</PROFILE>
</OAI_EMULATION>
@@ -0,0 +1,84 @@
<OAI_EMULATION>
<ENVIRONMENT_SYSTEM_CONFIG>
<FADING>
<LARGE_SCALE>urban</LARGE_SCALE>
<FREE_SPACE_MODEL_PARAMETERS>
<PATHLOSS_EXPONENT>3.67</PATHLOSS_EXPONENT>
<PATHLOSS_0_dB>-128</PATHLOSS_0_dB><!--pathloss at 1km -->
</FREE_SPACE_MODEL_PARAMETERS>
<SMALL_SCALE>Rayleigh8</SMALL_SCALE>
</FADING>
<SYSTEM_BANDWIDTH_MB>7.68</SYSTEM_BANDWIDTH_MB>
<SYSTEM_FREQUENCY_GHz>1.9</SYSTEM_FREQUENCY_GHz>
<TRANSMISSION_MODE>2</TRANSMISSION_MODE> <!-- validavalue: 1, 2, 5, 6 -->
<ANTENNA>
<eNB_ANTENNA>
<RX_NOISE_LEVEL_dB>0</RX_NOISE_LEVEL_dB>
<NUMBER_OF_SECTORS>1</NUMBER_OF_SECTORS><!--this means we use an omnidirectional antenna and the following parameter is ignored-->
<BEAM_WIDTH_dB>0</BEAM_WIDTH_dB><!--3dB beam width per sector-->
<ANTENNA_GAIN_dBi>0</ANTENNA_GAIN_dBi>
<TX_POWER_dBm>43</TX_POWER_dBm>
</eNB_ANTENNA>
<UE_ANTENNA>
<RX_NOISE_LEVEL_dB>0</RX_NOISE_LEVEL_dB>
<ANTENNA_GAIN_dBi>0</ANTENNA_GAIN_dBi>
<TX_POWER_dBm>20</TX_POWER_dBm>
</UE_ANTENNA>
</ANTENNA>
</ENVIRONMENT_SYSTEM_CONFIG>
<TOPOLOGY_CONFIG>
<AREA>
<X_m>5000</X_m>
<Y_m>5000</Y_m>
</AREA>
<MOBILITY>
<UE_MOBILITY>
<UE_INITIAL_DISTRIBUTION>random</UE_INITIAL_DISTRIBUTION>
<RANDOM_UE_DISTRIBUTION>
<NUMBER_OF_NODES>1</NUMBER_OF_NODES>
</RANDOM_UE_DISTRIBUTION>
<UE_MOBILITY_TYPE>TRACE</UE_MOBILITY_TYPE>
<TRACE_MOBILITY_FILE>static_2ues.tr</TRACE_MOBILITY_FILE> <!-- file should be located at $(OPENAIR2)/UTIL/OMG/TRACE/, see README there-->
</UE_MOBILITY>
<eNB_MOBILITY>
<eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION>
<RANDOM_eNB_DISTRIBUTION>
<NUMBER_OF_CELLS>1</NUMBER_OF_CELLS>
</RANDOM_eNB_DISTRIBUTION>
<eNB_MOBILITY_TYPE>STATIC</eNB_MOBILITY_TYPE>
<!-- <TRACE_MOBILITY_FILE>static_1enb.tr</TRACE_MOBILITY_FILE> --> <!-- file should be located at $(OPENAIR2)/UTIL/OMG/TRACE/, see README there-->
</eNB_MOBILITY>
</MOBILITY>
</TOPOLOGY_CONFIG>
<APPLICATION_CONFIG>
<!--DL-->
<CUSTOMIZED_TRAFFIC>
<SOURCE_ID>0</SOURCE_ID>
<DESTINATION_ID>1</DESTINATION_ID>
<IDT_DIST>fixed</IDT_DIST> <!-- option: no_customized_traffic, uniform, gaussian, exponential, poisson, fixed, weibull, pareto, gamma, cauchy, log_normal -->
<IDT_MIN_ms>10</IDT_MIN_ms>
<SIZE_DIST>fixed</SIZE_DIST> <!-- option: no_customized_traffic, uniform, gaussian, exponential, poisson, fixed, weibull, pareto, gamma, cauchy, log_normal -->
<SIZE_MIN_byte>1000</SIZE_MIN_byte>
</CUSTOMIZED_TRAFFIC>
</APPLICATION_CONFIG>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>10000</EMULATION_TIME_ms>
<CURVE>disable</CURVE>
<PERFORMANCE_METRICS>
<THROUGHPUT>1</THROUGHPUT>
</PERFORMANCE_METRICS>
<LOG> <!-- set the global log level -->
<LEVEL>info</LEVEL>
<VERBOSITY>high</VERBOSITY> <!-- low, medium, high, full -->
<INTERVAL>1</INTERVAL>
</LOG>
<SEED_VALUE>7111</SEED_VALUE> <!-- value 0 means randomly generated by OAI -->
</EMULATION_CONFIG>
<PROFILE>OCM_OMG_OTG_REF_1</PROFILE>
</OAI_EMULATION>
@@ -0,0 +1,92 @@
<OAI_EMULATION>
<ENVIRONMENT_SYSTEM_CONFIG>
<FADING>
<LARGE_SCALE>urban</LARGE_SCALE>
<FREE_SPACE_MODEL_PARAMETERS>
<PATHLOSS_EXPONENT>3.67</PATHLOSS_EXPONENT>
<PATHLOSS_0_dB>-128</PATHLOSS_0_dB><!--pathloss at 1km -->
</FREE_SPACE_MODEL_PARAMETERS>
<SMALL_SCALE>AWGN</SMALL_SCALE>
</FADING>
<SYSTEM_BANDWIDTH_MB>7.68</SYSTEM_BANDWIDTH_MB>
<SYSTEM_FREQUENCY_GHz>1.9</SYSTEM_FREQUENCY_GHz>
<TRANSMISSION_MODE>1</TRANSMISSION_MODE> <!-- validavalue: 1, 2, 5, 6 -->
<ANTENNA>
<eNB_ANTENNA>
<RX_NOISE_LEVEL_dB>0</RX_NOISE_LEVEL_dB>
<NUMBER_OF_SECTORS>1</NUMBER_OF_SECTORS><!--this means we use an omnidirectional antenna and the following parameter is ignored-->
<BEAM_WIDTH_dB>0</BEAM_WIDTH_dB><!--3dB beam width per sector-->
<ANTENNA_GAIN_dBi>0</ANTENNA_GAIN_dBi>
<TX_POWER_dBm>43</TX_POWER_dBm>
</eNB_ANTENNA>
<UE_ANTENNA>
<RX_NOISE_LEVEL_dB>0</RX_NOISE_LEVEL_dB>
<ANTENNA_GAIN_dBi>0</ANTENNA_GAIN_dBi>
<TX_POWER_dBm>20</TX_POWER_dBm>
</UE_ANTENNA>
</ANTENNA>
</ENVIRONMENT_SYSTEM_CONFIG>
<TOPOLOGY_CONFIG>
<AREA>
<X_m>5000</X_m>
<Y_m>5000</Y_m>
</AREA>
<MOBILITY>
<UE_MOBILITY>
<UE_INITIAL_DISTRIBUTION>random</UE_INITIAL_DISTRIBUTION>
<RANDOM_UE_DISTRIBUTION>
<NUMBER_OF_NODES>1</NUMBER_OF_NODES>
</RANDOM_UE_DISTRIBUTION>
<UE_MOBILITY_TYPE>TRACE</UE_MOBILITY_TYPE>
<TRACE_MOBILITY_FILE>static_2ues.tr</TRACE_MOBILITY_FILE> <!-- file should be located at $(OPENAIR2)/UTIL/OMG/TRACE/, see README there-->
</UE_MOBILITY>
<eNB_MOBILITY>
<eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION>
<RANDOM_eNB_DISTRIBUTION>
<NUMBER_OF_CELLS>1</NUMBER_OF_CELLS>
</RANDOM_eNB_DISTRIBUTION>
<eNB_MOBILITY_TYPE>STATIC</eNB_MOBILITY_TYPE>
</eNB_MOBILITY>
</MOBILITY>
</TOPOLOGY_CONFIG>
<APPLICATION_CONFIG>
<!--DL-->
<CUSTOMIZED_TRAFFIC>
<SOURCE_ID>0</SOURCE_ID>
<DESTINATION_ID>1</DESTINATION_ID>
<IDT_DIST>fixed</IDT_DIST> <!-- option: no_customized_traffic, uniform, gaussian, exponential, poisson, fixed, weibull, pareto, gamma, cauchy, log_normal -->
<IDT_MIN_ms>10</IDT_MIN_ms>
<SIZE_DIST>fixed</SIZE_DIST> <!-- option: no_customized_traffic, uniform, gaussian, exponential, poisson, fixed, weibull, pareto, gamma, cauchy, log_normal -->
<SIZE_MIN_byte>1500</SIZE_MIN_byte>
</CUSTOMIZED_TRAFFIC>
<!--UL-->
<CUSTOMIZED_TRAFFIC>
<SOURCE_ID>1</SOURCE_ID>
<DESTINATION_ID>0</DESTINATION_ID>
<IDT_DIST>fixed</IDT_DIST> <!-- option: no_customized_traffic, uniform, gaussian, exponential, poisson, fixed, weibull, pareto, gamma, cauchy, log_normal -->
<IDT_MIN_ms>10</IDT_MIN_ms>
<SIZE_DIST>fixed</SIZE_DIST> <!-- option: no_customized_traffic, uniform, gaussian, exponential, poisson, fixed, weibull, pareto, gamma, cauchy, log_normal -->
<SIZE_MIN_byte>1000</SIZE_MIN_byte>
</CUSTOMIZED_TRAFFIC>
</APPLICATION_CONFIG>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>10000</EMULATION_TIME_ms>
<PERFORMANCE_METRICS>
<THROUGHPUT>1</THROUGHPUT>
</PERFORMANCE_METRICS>
<LOG> <!-- set the global log level -->
<LEVEL>info</LEVEL>
<VERBOSITY>medium</VERBOSITY> <!-- low, medium, high, full -->
<INTERVAL>1</INTERVAL>
</LOG>
<SEED_VALUE>7111</SEED_VALUE> <!-- value 0 means randomly generated by OAI -->
</EMULATION_CONFIG>
<PROFILE>OCM_OMG_OTG_REF_1</PROFILE>
</OAI_EMULATION>
@@ -0,0 +1,68 @@
<OAI_EMULATION>
<ENVIRONMENT_SYSTEM_CONFIG>
<FADING>
<LARGE_SCALE>urban</LARGE_SCALE>
<FREE_SPACE_MODEL_PARAMETERS>
<PATHLOSS_EXPONENT>3.67</PATHLOSS_EXPONENT>
<PATHLOSS_0_dB>-128</PATHLOSS_0_dB><!--pathloss at 1km -->
</FREE_SPACE_MODEL_PARAMETERS>
<SMALL_SCALE>AWGN</SMALL_SCALE>
</FADING>
<SYSTEM_BANDWIDTH_MB>7.68</SYSTEM_BANDWIDTH_MB>
<SYSTEM_FREQUENCY_GHz>1.9</SYSTEM_FREQUENCY_GHz>
<TRANSMISSION_MODE>1</TRANSMISSION_MODE> <!-- validavalue: 1, 2, 5, 6 -->
<ANTENNA>
<eNB_ANTENNA>
<RX_NOISE_LEVEL_dB>0</RX_NOISE_LEVEL_dB>
<NUMBER_OF_SECTORS>1</NUMBER_OF_SECTORS><!--this means we use an omnidirectional antenna and the following parameter is ignored-->
<BEAM_WIDTH_dB>0</BEAM_WIDTH_dB><!--3dB beam width per sector-->
<ANTENNA_GAIN_dBi>0</ANTENNA_GAIN_dBi>
<TX_POWER_dBm>15</TX_POWER_dBm><!--this is currently ignored and set in asn1_msg.c-->
</eNB_ANTENNA>
<UE_ANTENNA>
<RX_NOISE_LEVEL_dB>0</RX_NOISE_LEVEL_dB>
<ANTENNA_GAIN_dBi>0</ANTENNA_GAIN_dBi>
<TX_POWER_dBm>0</TX_POWER_dBm><!--this is ignored since UE TX power is controlled by eNB-->
</UE_ANTENNA>
</ANTENNA>
</ENVIRONMENT_SYSTEM_CONFIG>
<TOPOLOGY_CONFIG>
<AREA>
<X_m>5000</X_m>
<Y_m>5000</Y_m>
</AREA>
<MOBILITY>
<UE_MOBILITY>
<UE_INITIAL_DISTRIBUTION>random</UE_INITIAL_DISTRIBUTION>
<RANDOM_UE_DISTRIBUTION>
<NUMBER_OF_NODES>1</NUMBER_OF_NODES>
</RANDOM_UE_DISTRIBUTION>
<UE_MOBILITY_TYPE>TRACE</UE_MOBILITY_TYPE>
<TRACE_MOBILITY_FILE>handover.tr</TRACE_MOBILITY_FILE> <!-- file should be located at $(OPENAIR2)/UTIL/OMG/TRACE/, see README there-->
</UE_MOBILITY>
<eNB_MOBILITY>
<eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION>
<RANDOM_eNB_DISTRIBUTION>
<NUMBER_OF_CELLS>3</NUMBER_OF_CELLS>
</RANDOM_eNB_DISTRIBUTION>
<eNB_MOBILITY_TYPE>TRACE</eNB_MOBILITY_TYPE>
<TRACE_MOBILITY_FILE>hexagonal_eNBs.tr</TRACE_MOBILITY_FILE> <!-- file should be located at $(OPENAIR2)/UTIL/OMG/TRACE/, see README there-->
</eNB_MOBILITY>
</MOBILITY>
</TOPOLOGY_CONFIG>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>3000</EMULATION_TIME_ms>
<LOG> <!-- set the global log level -->
<LEVEL>debug</LEVEL>
<VERBOSITY>medium</VERBOSITY> <!-- low, medium, high, full -->
<INTERVAL>1</INTERVAL>
</LOG>
<SEED_VALUE>1234</SEED_VALUE> <!-- value 0 means randomly generated by OAI -->
</EMULATION_CONFIG>
<PROFILE>HO_1</PROFILE>
</OAI_EMULATION>
@@ -0,0 +1,92 @@
<OAI_EMULATION>
<ENVIRONMENT_SYSTEM_CONFIG>
<FADING>
<LARGE_SCALE>urban</LARGE_SCALE>
<FREE_SPACE_MODEL_PARAMETERS>
<PATHLOSS_EXPONENT>3.67</PATHLOSS_EXPONENT>
<PATHLOSS_0_dB>-128</PATHLOSS_0_dB><!--pathloss at 1km -->
</FREE_SPACE_MODEL_PARAMETERS>
<SMALL_SCALE>AWGN</SMALL_SCALE>
</FADING>
<WALL_PENETRATION_LOSS_dB>5</WALL_PENETRATION_LOSS_dB>
<SYSTEM_BANDWIDTH_MB>7.68</SYSTEM_BANDWIDTH_MB>
<UE_FREQUENCY_GHz>1.9</UE_FREQUENCY_GHz>
<ANTENNA>
<eNB_ANTENNA>
<RX_NOISE_LEVEL_dB>5</RX_NOISE_LEVEL_dB>
<NUMBER_OF_SECTORS>1</NUMBER_OF_SECTORS>
<BEAM_WIDTH_dB>1.13</BEAM_WIDTH_dB>
<ANTENNA_GAIN_dBi>16</ANTENNA_GAIN_dBi>
<TX_POWER_dBm>40</TX_POWER_dBm>
</eNB_ANTENNA>
<UE_ANTENNA>
<RX_NOISE_LEVEL_dB>1</RX_NOISE_LEVEL_dB>
<ANTENNA_GAIN_dBi>5</ANTENNA_GAIN_dBi>
<TX_POWER_dBm>20</TX_POWER_dBm>
</UE_ANTENNA>
</ANTENNA>
</ENVIRONMENT_SYSTEM_CONFIG>
<TOPOLOGY_CONFIG>
<AREA>
<X_m>500</X_m>
<Y_m>500</Y_m>
</AREA>
<MOBILITY>
<UE_MOBILITY>
<UE_INITIAL_DISTRIBUTION>random</UE_INITIAL_DISTRIBUTION>
<RANDOM_UE_DISTRIBUTION>
<NUMBER_OF_NODES>2</NUMBER_OF_NODES>
</RANDOM_UE_DISTRIBUTION>
<UE_MOBILITY_TYPE>STATIC</UE_MOBILITY_TYPE>
<UE_MOVING_DYNAMICS>
<MIN_SPEED_mps>1</MIN_SPEED_mps>
<MAX_SPEED_mps>200</MAX_SPEED_mps>
<MIN_SLEEP_ms>0.1</MIN_SLEEP_ms>
<MAX_SLEEP_ms>5.0</MAX_SLEEP_ms>
<MIN_JOURNEY_TIME_ms>0.1</MIN_JOURNEY_TIME_ms>
<MAX_JOURNEY_TIME_ms>10</MAX_JOURNEY_TIME_ms>
</UE_MOVING_DYNAMICS>
</UE_MOBILITY>
<eNB_MOBILITY>
<eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION>
<RANDOM_eNB_DISTRIBUTION>
<NUMBER_OF_CELLS>1</NUMBER_OF_CELLS>
</RANDOM_eNB_DISTRIBUTION>
<eNB_MOBILITY_TYPE>STATIC</eNB_MOBILITY_TYPE>
</eNB_MOBILITY>
</MOBILITY>
</TOPOLOGY_CONFIG>
<APPLICATION_CONFIG>
<PREDEFINED_TRAFFIC>
<SOURCE_ID>0</SOURCE_ID> <!-- valid formats are: -->
<APPLICATION_TYPE>scbr</APPLICATION_TYPE> <!-- OPTIONS: scbr,mcbr,bcbr, gaming_OA, gaming_TF, m2m_AP, m2m_BR, , random, ,full_buffer -->
<DESTINATION_ID>1:2</DESTINATION_ID> <!-- valid formats are: -->
</PREDEFINED_TRAFFIC>
<PREDEFINED_TRAFFIC>
<SOURCE_ID>1:2</SOURCE_ID> <!-- valid formats are: -->
<APPLICATION_TYPE>scbr</APPLICATION_TYPE> <!-- OPTIONS: scbr,mcbr,bcbr, gaming_OA, gaming_TF, m2m_AP, m2m_BR, , random, ,full_buffer -->
<DESTINATION_ID>0</DESTINATION_ID> <!-- valid formats are: -->
</PREDEFINED_TRAFFIC>
</APPLICATION_CONFIG>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>10000</EMULATION_TIME_ms> <!--set to infinity-->
<PERFORMANCE_METRICS>
<THROUGHPUT>1</THROUGHPUT>
</PERFORMANCE_METRICS>
<LOG> <!-- set the global log level -->
<LEVEL>debug</LEVEL>
<VERBOSITY>medium</VERBOSITY> <!-- low, medium, high, full -->
<INTERVAL>1</INTERVAL>
</LOG>
<SEED_VALUE>0</SEED_VALUE> <!-- value 0 means randomly generated by OAI -->
</EMULATION_CONFIG>
<PROFILE>OCM_OMG</PROFILE>
</OAI_EMULATION>
@@ -0,0 +1,43 @@
<!-- template for OAI CLI interface. To connect from local host: telnet 127.0.1.1 1352 from the remot: telnet ip@ 1352-->
<OAI_EMULATION>
<TOPOLOGY_CONFIG>
<AREA>
<X_m>5000</X_m>
<Y_m>5000</Y_m>
</AREA>
<MOBILITY>
<UE_MOBILITY>
<RANDOM_UE_DISTRIBUTION>
<NUMBER_OF_NODES>1</NUMBER_OF_NODES>
</RANDOM_UE_DISTRIBUTION>
<UE_MOBILITY_TYPE>STATIC</UE_MOBILITY_TYPE>
</UE_MOBILITY>
<eNB_MOBILITY>
<eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION>
<RANDOM_eNB_DISTRIBUTION>
<NUMBER_OF_CELLS>1</NUMBER_OF_CELLS>
</RANDOM_eNB_DISTRIBUTION>
<eNB_MOBILITY_TYPE>STATIC</eNB_MOBILITY_TYPE>
</eNB_MOBILITY>
</MOBILITY>
</TOPOLOGY_CONFIG>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>0</EMULATION_TIME_ms> <!--set to infinity-->
<LOG> <!-- set the global log level -->
<LEVEL>debug</LEVEL>
<VERBOSITY>high</VERBOSITY>
<INTERVAL>10</INTERVAL>
</LOG>
<SEED_VALUE>1234</SEED_VALUE> <!-- value 0 means randomly generated by OAI -->
<CLI> <!-- start the cli server, a simple TCP server -->
<START_ENB>1</START_ENB>
<START_UE>0</START_UE>
</CLI>
</EMULATION_CONFIG>
<PROFILE>CLI</PROFILE>
</OAI_EMULATION>
@@ -0,0 +1,56 @@
<!-- test OMG with sumo -->
<OAI_EMULATION>
<TOPOLOGY_CONFIG>
<AREA>
<X_m>700</X_m>
<Y_m>700</Y_m>
</AREA>
<MOBILITY>
<UE_MOBILITY>
<UE_INITIAL_DISTRIBUTION>random</UE_INITIAL_DISTRIBUTION>
<RANDOM_UE_DISTRIBUTION>
<NUMBER_OF_NODES>8</NUMBER_OF_NODES>
</RANDOM_UE_DISTRIBUTION>
<UE_MOBILITY_TYPE>SUMO</UE_MOBILITY_TYPE>
<UE_MOVING_DYNAMICS>
<MIN_SPEED_mps>1</MIN_SPEED_mps>
<MAX_SPEED_mps>20</MAX_SPEED_mps>
<MIN_SLEEP_ms>0.1</MIN_SLEEP_ms>
<MAX_SLEEP_ms>5.0</MAX_SLEEP_ms>
<MIN_JOURNEY_TIME_ms>0.1</MIN_JOURNEY_TIME_ms>
<MAX_JOURNEY_TIME_ms>10</MAX_JOURNEY_TIME_ms>
</UE_MOVING_DYNAMICS>
<SUMO_CONFIG>
<SUMO_CMD>sumo-gui</SUMO_CMD>
<SUMO_CONFIG_FILE>$OPENAIR2_DIR/UTIL/OMG/SUMO/SCENARIOS/traci.scen.sumo.cfg</SUMO_CONFIG_FILE>
<SUMO_START>0</SUMO_START>
<SUMO_END>10000</SUMO_END>
<SUMO_STEP>1</SUMO_STEP>
<SUMO_HOST_IP>127.0.1.1</SUMO_HOST_IP>
<SUMO_HOST_PORT>8890</SUMO_HOST_PORT>
</SUMO_CONFIG>
</UE_MOBILITY>
<eNB_MOBILITY>
<eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION>
<RANDOM_eNB_DISTRIBUTION>
<NUMBER_OF_CELLS>1</NUMBER_OF_CELLS>
</RANDOM_eNB_DISTRIBUTION>
<eNB_MOBILITY_TYPE>STATIC</eNB_MOBILITY_TYPE>
</eNB_MOBILITY>
</MOBILITY>
<!-- <OMV>1</OMV> -->
</TOPOLOGY_CONFIG>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>10000</EMULATION_TIME_ms> <!--set to infinity-->
<LOG> <!-- set the global log level -->
<LEVEL>info</LEVEL>
<INTERVAL>1</INTERVAL>
</LOG>
<SEED_VALUE>974930</SEED_VALUE> <!-- value 0 means randomly generated by OAI -->
</EMULATION_CONFIG>
<PROFILE>OMG_SUMO</PROFILE>
</OAI_EMULATION>
@@ -0,0 +1,52 @@
<OAI_EMULATION>
<TOPOLOGY_CONFIG>
<AREA>
<X_m>5000</X_m>
<Y_m>5000</Y_m>
</AREA>
<MOBILITY>
<UE_MOBILITY>
<RANDOM_UE_DISTRIBUTION>
<NUMBER_OF_NODES>4</NUMBER_OF_NODES>
</RANDOM_UE_DISTRIBUTION>
<UE_MOBILITY_TYPE>STATIC</UE_MOBILITY_TYPE>
</UE_MOBILITY>
<eNB_MOBILITY>
<eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION>
<RANDOM_eNB_DISTRIBUTION>
<NUMBER_OF_CELLS>1</NUMBER_OF_CELLS>
</RANDOM_eNB_DISTRIBUTION>
<eNB_MOBILITY_TYPE>STATIC</eNB_MOBILITY_TYPE>
</eNB_MOBILITY>
</MOBILITY>
</TOPOLOGY_CONFIG>
<APPLICATION_CONFIG>
<PREDEFINED_TRAFFIC>
<SOURCE_ID>0</SOURCE_ID> <!-- valid formats are: -->
<APPLICATION_TYPE>mcbr</APPLICATION_TYPE> <!-- OPTIONS: scbr,mcbr,bcbr, gaming_OA, gaming_TF, m2m_AP, m2m_BR, , random, ,full_buffer -->
<DESTINATION_ID>1:3</DESTINATION_ID> <!-- valid formats are: -->
</PREDEFINED_TRAFFIC>
<PREDEFINED_TRAFFIC>
<SOURCE_ID>1:3</SOURCE_ID> <!-- valid formats are: -->
<APPLICATION_TYPE>scbr</APPLICATION_TYPE> <!-- OPTIONS: scbr,mcbr,bcbr, gaming_OA, gaming_TF, m2m_AP, m2m_BR, , random, ,full_buffer -->
<DESTINATION_ID>0</DESTINATION_ID> <!-- valid formats are: -->
</PREDEFINED_TRAFFIC>
</APPLICATION_CONFIG>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>30000</EMULATION_TIME_ms> <!--set to infinity-->
<PERFORMANCE_METRICS>
<THROUGHPUT>1</THROUGHPUT>
</PERFORMANCE_METRICS>
<LOG> <!-- set the global log level -->
<LEVEL>debug</LEVEL>
<VERBOSITY>medium</VERBOSITY>
<INTERVAL>1</INTERVAL>
</LOG>
<SEED_VALUE>1234</SEED_VALUE> <!-- value 0 means randomly generated by OAI -->
</EMULATION_CONFIG>
<PROFILE>OTG_1</PROFILE>
</OAI_EMULATION>
@@ -0,0 +1,64 @@
<OAI_EMULATION>
<TOPOLOGY_CONFIG>
<AREA>
<X_m>5000</X_m>
<Y_m>5000</Y_m>
</AREA>
<MOBILITY>
<UE_MOBILITY>
<RANDOM_UE_DISTRIBUTION>
<NUMBER_OF_NODES>3</NUMBER_OF_NODES>
</RANDOM_UE_DISTRIBUTION>
<UE_MOBILITY_TYPE>STATIC</UE_MOBILITY_TYPE>
</UE_MOBILITY>
<eNB_MOBILITY>
<eNB_INITIAL_DISTRIBUTION>random</eNB_INITIAL_DISTRIBUTION>
<RANDOM_eNB_DISTRIBUTION>
<NUMBER_OF_CELLS>1</NUMBER_OF_CELLS>
</RANDOM_eNB_DISTRIBUTION>
<eNB_MOBILITY_TYPE>STATIC</eNB_MOBILITY_TYPE>
</eNB_MOBILITY>
</MOBILITY>
</TOPOLOGY_CONFIG>
<APPLICATION_CONFIG>
<PREDEFINED_TRAFFIC>
<SOURCE_ID>0</SOURCE_ID>
<APPLICATION_TYPE>gaming_OA</APPLICATION_TYPE> <!-- OPTIONS: scbr,mcbr,bcbr, gaming_OA, gaming_TF, m2m_AP, m2m_BR, , random, ,full_buffer -->
<DESTINATION_ID>3</DESTINATION_ID>
</PREDEFINED_TRAFFIC>
<CUSTOMIZED_TRAFFIC>
<SOURCE_ID>1:3</SOURCE_ID> <!-- <SOURCE_ID> 1:100 </SOURCE_ID> -->
<TRANSPORT_PROTOCOL>udp</TRANSPORT_PROTOCOL> <!-- OPTIONS: tcp (default), udp -->
<IP_VERSION>ipv6</IP_VERSION> <!-- OPTIONS: ipv4 (default), ipv6 -->
<DESTINATION_ID>0</DESTINATION_ID>
<IDT_DIST>gaussian</IDT_DIST> <!-- OPTIONS: no_transmission (default), uniform, poission, gaussian, exponential,pareto, cauchy,fixed, weibull, gamma,-->
<IDT_MIN_ms>100</IDT_MIN_ms>
<IDT_MAX_ms>1000</IDT_MAX_ms>
<IDT_STANDARD_DEVIATION>4.5</IDT_STANDARD_DEVIATION>
<SIZE_DIST>pareto</SIZE_DIST> <!-- similar for weibull and cauchy and gamma-->
<SIZE_SCALE>0.5</SIZE_SCALE>
<SIZE_SHAPE>30</SIZE_SHAPE>
</CUSTOMIZED_TRAFFIC>
</APPLICATION_CONFIG>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>5000</EMULATION_TIME_ms> <!--set to infinity-->
<PERFORMANCE_METRICS>
<THROUGHPUT>1</THROUGHPUT>
</PERFORMANCE_METRICS>
<LOG> <!-- set the global log level -->
<LEVEL>debug</LEVEL>
<INTERVAL>1</INTERVAL>
</LOG>
<SEED_VALUE>1234</SEED_VALUE> <!-- value 0 means randomly generated by OAI -->
</EMULATION_CONFIG>
<PROFILE>OTG_2</PROFILE>
</OAI_EMULATION>
@@ -0,0 +1,46 @@
#ifdef cygwin
#cyg=cygwin
#endif
help:
@echo "make one_eNB_two_UE_nas: compiles the code and performs a simulation with IP traffic between two virtual nodes (Linux only)"
@echo "make one_eNB_one_UE: compiles the code and performs a small simulation (30 frames) with 1 eNB and 1 UE and checks that RLC data is transported between the two nodes after the connection setup"
@echo "make one_eNB_four_UE: comples the code and performs a small simulation (60 frames) with 1 eNB and 4 UE and checks that all 4 UEs have established a complete connection (RRC output is traced)"
@echo "make clean: Removes all .o files"
all: help
oaisim:
(cd $(OPENAIR_TARGETS)/SIMU/USER && $(MAKE) all NAS=1 OAI_NW_DRIVER_TYPE_ETHERNET=1 )
oaisim_nas:
(cd $(OPENAIR_TARGETS)/SIMU/USER && $(MAKE) all OAI_NW_DRIVER_TYPE_ETHERNET=1 NAS=1)
nasmesh:
(cd $(OPENAIR2_DIR) && make nasmesh_netlink_address_fix.ko)
(cd $(OPENAIR2_DIR)/NAS/DRIVER/MESH/RB_TOOL && make)
one_eNB_one_UE_nas: oaisim_nas nasmesh
./start_one_eNB_multi_UE_nas 1
one_eNB_two_UE_nas: oaisim_nas nasmesh
./start_one_eNB_multi_UE_nas 2
one_eNB_three_UE_nas: oaisim_nas nasmesh
./start_one_eNB_multi_UE_nas 3
one_eNB_one_UE : oaisim
../../USER/oaisim -n30 | egrep SEND_SDU
one_eNB_four_UE : oaisim
../../USER/oaisim -n60 -u4 | egrep "\[RRC\]"
one_eNB_one_UE_PHY : oaisim_nas nasmesh
./start_one_eNB_two_UE_PHY_nas 2
clean:
(cd $(OPENAIR_TARGETS)/SIMU/USER && make clean)
echo_vars:
echo $(OPENAIR1_DIR)
echo $(OPENAIR2_DIR)
echo $(OPENAIR3_DIR)
echo $(OPENAIR_TARGETS)
@@ -0,0 +1,53 @@
#!/bin/sh
echo "Bringup eNB interface"
sudo rmmod nasmesh
sudo insmod $OPENAIR2_DIR/NAS/DRIVER/MESH/nasmesh.ko
#avoid conflict with reserved multicast addresses (224.0.0.11,224.0.0.13, 224.0.0.16)
#sudo route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0
sudo ip route add 224.0.0.160/28 dev eth0
echo "bring up oai0 interface for enb"
sudo ifconfig oai0 10.0.1.1 netmask 255.255.255.0 broadcast 10.0.1.255
echo "bring up oai1 interface for ue 1"
sudo ifconfig oai1 10.0.2.2 netmask 255.255.255.0 broadcast 10.0.2.255
# enb -> ue1
$OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL/rb_tool -a -c0 -i0 -z0 -s 10.0.1.1 -t 10.0.1.2 -r 3
# ue1 -> enb
$OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL/rb_tool -a -c0 -i1 -z0 -s 10.0.2.2 -t 10.0.2.1 -r 3
if [ $1 -ge 2 ]; then
echo "bring up oai2 interface for ue 2"
sudo ifconfig oai2 10.0.3.3 netmask 255.255.255.0 broadcast 10.0.3.255
# enb -> ue2
$OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL/rb_tool -a -c1 -i0 -z0 -s 10.0.1.1 -t 10.0.1.3 -r 11
# ue2 -> enb
$OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL/rb_tool -a -c1 -i2 -z0 -s 10.0.3.3 -t 10.0.3.1 -r 3
fi
if [ $1 -ge 3 ]; then
echo "bring up oai3 interface for ue 3"
sudo ifconfig oai3 10.0.4.4 netmask 255.255.255.0 broadcast 10.0.4.255
# enb -> ue2
$OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL/rb_tool -a -c2 -i0 -z0 -s 10.0.1.1 -t 10.0.1.4 -r 19
# ue2 -> enb
$OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL/rb_tool -a -c2 -i3 -z0 -s 10.0.4.4 -t 10.0.4.1 -r 3
fi
if [ $1 -ge 4 ]; then
echo "add oai interfaces for more UEs here"
fi
echo "start the emulation with 1eNB and" $1 "UE"
echo "$OPENAIR_TARGETS/SIMU/USER/oaisim -a -u" $1 ">/dev/null"
$OPENAIR_TARGETS/SIMU/USER/oaisim -a -u $1 > /dev/null
echo "End"
@@ -0,0 +1,53 @@
#!/bin/sh
echo "Bringup eNB interface"
sudo rmmod nasmesh
sudo insmod $OPENAIR2_DIR/NAS/DRIVER/MESH/nasmesh.ko
#avoid conflict with reserved multicast addresses (224.0.0.11,224.0.0.13, 224.0.0.16)
#sudo route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0
sudo ip route add 224.0.0.160/28 dev eth0
echo "bring up oai0 interface for enb"
sudo ifconfig oai0 10.0.1.1 netmask 255.255.255.0 broadcast 10.0.1.255
echo "bring up oai1 interface for ue 1"
sudo ifconfig oai1 10.0.2.2 netmask 255.255.255.0 broadcast 10.0.2.255
# enb -> ue1
$OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL/rb_tool -a -c0 -i0 -z0 -s 10.0.1.1 -t 10.0.1.2 -r 3
# ue1 -> enb
$OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL/rb_tool -a -c0 -i1 -z0 -s 10.0.2.2 -t 10.0.2.1 -r 3
if [ $1 -ge 2 ]; then
echo "bring up oai2 interface for ue 2"
sudo ifconfig oai2 10.0.3.3 netmask 255.255.255.0 broadcast 10.0.3.255
# enb -> ue2
$OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL/rb_tool -a -c1 -i0 -z0 -s 10.0.1.1 -t 10.0.1.3 -r 11
# ue2 -> enb
$OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL/rb_tool -a -c1 -i2 -z0 -s 10.0.3.3 -t 10.0.3.1 -r 3
fi
if [ $1 -ge 3 ]; then
echo "bring up oai3 interface for ue 3"
sudo ifconfig oai3 10.0.4.4 netmask 255.255.255.0 broadcast 10.0.4.255
# enb -> ue2
$OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL/rb_tool -a -c2 -i0 -z0 -s 10.0.1.1 -t 10.0.1.4 -r 19
# ue2 -> enb
$OPENAIR2_DIR/NAS/DRIVER/MESH/RB_TOOL/rb_tool -a -c2 -i3 -z0 -s 10.0.4.4 -t 10.0.4.1 -r 3
fi
if [ $1 -ge 4 ]; then
echo "add oai interfaces for more UEs here"
fi
echo "start the emulation with 1eNB and 2 UE"
echo "$OPENAIR_TARGETS/SIMU/USER/oaisim -c40 > /dev/null"
$OPENAIR_TARGETS/SIMU/USER/oaisim -c40 > /dev/null
echo "End"
+31
View File
@@ -0,0 +1,31 @@
all: oaisim naslite_netlink_ether
oaisim:
(cd $(OPENAIR_TARGETS)/SIMU/USER && $(MAKE) oaisim OAI_NW_DRIVER_TYPE_ETHERNET=1 NAS=1)
naslite_netlink_ether:
(cd $(OPENAIR2_DIR) && $(MAKE) naslite_netlink_ether.ko)
(cd $(OPENAIR2_DIR)/NAS/DRIVER/LITE/RB_TOOL/ && $(MAKE))
userclean: clean oaisim naslite_netlink_ether
one_eNB_one_UE_nas: oaisim naslite_netlink_ether
/bin/bash ./start_one_eNB_multi_UE_nas 1
one_eNB_two_UE_nas: oaisim naslite_netlink_ether
/bin/bash ./start_one_eNB_multi_UE_nas 2
one_eNB_three_UE_nas: oaisim naslite_netlink_ether
/bin/bash ./start_one_eNB_multi_UE_nas 3
clean:
(cd $(OPENAIR_TARGETS)/SIMU/USER && $(MAKE) clean)
(cd $(OPENAIR2_DIR)/NAS/DRIVER/LITE && $(MAKE) clean)
echo_vars:
echo $(OPENAIR1_DIR)
echo $(OPENAIR2_DIR)
echo $(OPENAIR3_DIR)
echo $(OPENAIR_TARGETS)
@@ -0,0 +1,531 @@
#!/bin/bash
echo "Bash version ${BASH_VERSION}..."
declare GENERATE_SEQ_DIAGRAM="no"
declare LOG_FILE_LTE="no"
#------------------------------------------------
declare MAKE_IP_DRIVER_TARGET="naslite_netlink_ether"
declare MAKE_LTE_ACCESS_STRATUM_TARGET="oaisim"
declare IP_DRIVER_NAME="oai_nw_drv"
#------------------------------------------------
declare -a NAS_IMEI=( 3 9 1 8 3 6 6 2 0 0 0 0 0 0 )
# first value is for ENB, then UE0, UE1, etc.
declare -a MARKING=( 1 2 3 4 5 6 7 8 9 10 11 12 14 15 16 )
# BE CAREFULL MAY NOT WORK WITH OTHER VALUES (TO DO)
declare -i NUM_ENB=1
#------------------------------------------------
# Notes:
# We would like to remove the ipv4 addresses swap in the IP driver code for oai virtualized.
# Let's say oai0 has ipv4 @ 10.0.1.1, oai1 has ipv4 @ 10.0.2.2 etc.
# In the past when we generated some local traffic on the computer and wanted to make it go
# through for example oai1 to oai0, the ipv4 destination address was 10.0.2.1
# meaning 10.0.2.2 wants to send a paquet to 10.0.1.1,
# so ip_destination[2] has the digit corresponding to the source
# so ip_destination[3] has the digit corresponding to the destination
# then in the driver we modified at the receiving side (oai0 here) the ip source and destination
# addresses in this way:
# Originating packet: SRC 10.0.X.X -> 10.0.2.1
# Resulting modified packet at the receiving side: SRC 10.0.1.2 -> 10.0.1.1
# So the packet could be accepted by the device (same dest @) and the fake source was was recorded (1.2).
# So the response to this packet could return to the interface by where the request was pulled.
# But this solution lead to recompute checksums of packets in the driver.
#
# So here we describe a solution where packets are not modified by the IP driver but by the kernel:
#
# +---------------+ +---------------+ +---------------+
# |APP "VIRTUALLY"| |APP "VIRTUALLY"| |APP "VIRTUALLY"| etc
# |running on eNB | |running on UE0 | |running on UE1 |
# |sending traffic| | | | |
# | to UE 1 | | | | |
# +---------------+ +---------------+ +---------------+
# | ^ | ^ | ^
# | | | | | |
# Tx packet (n1) | | | Tx packet (n2) |
# XXXX->10.0.1.3 | | | XXXX->10.0.1.3 |
# | | | | | |
# | Rx packet (n2) | | | Rx packet (n1)
# | 10.0.1.3->10.0.1.1 | | | 10.0.3.1->10.0.3.3
# V | V | V |
# +-----------------------------------------------------------------------------+
# | IPTABLES Table mangle chain OUTPUT TARGET MARK OPERATION setmark |
# | On packets coming from applications |
# |-----------------------------------------------------------------------------|
# | Example for packet n1: |
# | iptables -t mangle -A OUTPUT --dst 10.0.1.3 -j MARK --set-mark 0x0103 |
# +-----------------------------------------------------------------------------+
# | | | | | |
# Tx packet (n1) | | | | |
# XXXX->10.0.1.3 | | | | |
# mark 0x0103 | | | | |
# | | | | | |
# V | V | V |
# +-----------------------------------------------------------------------------+
# | IPTABLES Table nat chain POSTROUTING TARGET SNAT OPERATION --to Fake IP SRC|
# | On packets coming from applications |
# |-----------------------------------------------------------------------------|
# | Example for packet n1: |
# | iptables -t nat -A POSTROUTING -m mark --mark 0x0103 -j SNAT --to 10.0.3.1 |
# +-----------------------------------------------------------------------------+
# | | | | | |
# | | | | | Rx packet (n1)
# | | | | | 10.0.3.1->10.0.3.3
# | | | | | mark 0x0103
# | | | | | |
# +-----------------------------------------------------------------------------+
# | IPTABLES Table mangle chain PREROUTING TARGET MARK OPERATION setmark |
# | On packets coming from applications |
# |-----------------------------------------------------------------------------|
# | Example for packet n1: |
# | iptables -t nat -A PREROUTING -m mark --mark 0x0103 -j DNAT --to 10.0.3.3 |
# +-----------------------------------------------------------------------------+
# | ^ | ^ | ^
# | | | | | |
# Tx packet (n1) | | | | Rx packet (n1)
# 10.0.3.1->10.0.1.3 | | | 10.0.3.1->10.0.1.3
# mark 0x0103 | | | | mark 0x0103
# | | | | | |
# +-----------------------------------------------------------------------------+
# | IPTABLES Table mangle chain PREROUTING TARGET MARK OPERATION setmark |
# | On packets coming from applications |
# |-----------------------------------------------------------------------------|
# | Example for packet n1: |
# | iptables -t mangle -A PREROUTING --dst 10.0.1.3 -j MARK --set-mark 0x0103 |
# +-----------------------------------------------------------------------------+
# | ^ | ^ | ^
# | | | | | Rx packet (n1)
# | | | | | 10.0.3.1->10.0.1.3
# | | | | | |
# |10.0.1.1| |10.0.2.2| |10.0.3.3|
# V | V | V |
# +----------+ +----------+ +----------+
# | oai0 | | oai1 | | oai2 |
# | (eNB) | | (UE0) | | (UE1) |
# +----------+ +----------+ +----------+
####################################################################################
# HERE IS A DISPLAY OF THE CONTENT OF THE NAT TABLE FOR THE DESCRIBED SETTING
####################################################################################
# Chain PREROUTING (policy ACCEPT 1108 packets, 242K bytes)
# pkts bytes target prot opt in out source destination
# 0 0 DNAT all -- * * 0.0.0.0/0 0.0.0.0/0 mark match 0x102 to:10.0.2.2
# 0 0 DNAT all -- * * 0.0.0.0/0 0.0.0.0/0 mark match 0x103 to:10.0.3.3
# 0 0 DNAT all -- * * 0.0.0.0/0 0.0.0.0/0 mark match 0x201 to:10.0.1.1
# 0 0 DNAT all -- * * 0.0.0.0/0 0.0.0.0/0 mark match 0x203 to:10.0.3.3
# 0 0 DNAT all -- * * 0.0.0.0/0 0.0.0.0/0 mark match 0x301 to:10.0.1.1
# 0 0 DNAT all -- * * 0.0.0.0/0 0.0.0.0/0 mark match 0x302 to:10.0.2.2
#
# Chain POSTROUTING (policy ACCEPT 2118 packets, 175K bytes)
# pkts bytes target prot opt in out source destination
# 0 0 SNAT all -- * * 0.0.0.0/0 0.0.0.0/0 mark match 0x102 to:10.0.2.1
# 0 0 SNAT all -- * * 0.0.0.0/0 0.0.0.0/0 mark match 0x103 to:10.0.3.1
# 0 0 SNAT all -- * * 0.0.0.0/0 0.0.0.0/0 mark match 0x201 to:10.0.1.2
# 0 0 SNAT all -- * * 0.0.0.0/0 0.0.0.0/0 mark match 0x203 to:10.0.3.2
# 0 0 SNAT all -- * * 0.0.0.0/0 0.0.0.0/0 mark match 0x301 to:10.0.1.3
# 0 0 SNAT all -- * * 0.0.0.0/0 0.0.0.0/0 mark match 0x302 to:10.0.2.3
#
# Chain OUTPUT (policy ACCEPT 2133 packets, 186K bytes)
# pkts bytes target prot opt in out source destination
####################################################################################
# HERE IS A DISPLAY OF THE CONTENT OF THE MANGLE TABLE FOR THE DESCRIBED SETTING
####################################################################################
#root@hades:~# iptables -t mangle -nvL
# Chain PREROUTING (policy ACCEPT 2008K packets, 316M bytes)
# pkts bytes target prot opt in out source destination
# 0 0 MARK all -- * * 0.0.0.0/0 10.0.1.2 MARK xset 0x102/0xffffffff
# 0 0 MARK all -- * * 0.0.0.0/0 10.0.1.3 MARK xset 0x103/0xffffffff
# 0 0 MARK all -- * * 0.0.0.0/0 10.0.2.1 MARK xset 0x201/0xffffffff
# 0 0 MARK all -- * * 0.0.0.0/0 10.0.2.3 MARK xset 0x203/0xffffffff
# 0 0 MARK all -- * * 0.0.0.0/0 10.0.3.1 MARK xset 0x301/0xffffffff
# 0 0 MARK all -- * * 0.0.0.0/0 10.0.3.2 MARK xset 0x302/0xffffffff
#
# Chain INPUT (policy ACCEPT 2008K packets, 316M bytes)
# pkts bytes target prot opt in out source destination
#
# Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
# pkts bytes target prot opt in out source destination
#
# Chain OUTPUT (policy ACCEPT 1989K packets, 331M bytes)
# pkts bytes target prot opt in out source destination
# 0 0 MARK all -- * * 0.0.0.0/0 10.0.1.2 MARK xset 0x102/0xffffffff
# 0 0 MARK all -- * * 0.0.0.0/0 10.0.1.3 MARK xset 0x103/0xffffffff
# 0 0 MARK all -- * * 0.0.0.0/0 10.0.2.1 MARK xset 0x201/0xffffffff
# 0 0 MARK all -- * * 0.0.0.0/0 10.0.2.3 MARK xset 0x203/0xffffffff
# 0 0 MARK all -- * * 0.0.0.0/0 10.0.3.1 MARK xset 0x301/0xffffffff
# 0 0 MARK all -- * * 0.0.0.0/0 10.0.3.2 MARK xset 0x302/0xffffffff
#
# Chain POSTROUTING (policy ACCEPT 1990K packets, 331M bytes)
# pkts bytes target prot opt in out source destination
#
####################################################################################
# We also avoid the manipulation of ipv4 ARP packets by setting ourselves the neighbour cache:
####################################################################################
#root@hades:~# ip neigh show
#...
#10.0.3.1 dev oai1 lladdr 00:39:18:36:62:00 PERMANENT
#10.0.2.1 dev oai1 lladdr 00:39:18:36:62:00 PERMANENT
#10.0.1.1 dev oai1 lladdr 00:39:18:36:62:00 PERMANENT
#...
#10.0.1.2 dev oai0 lladdr 00:39:18:36:62:01 PERMANENT
#10.0.2.2 dev oai0 lladdr 00:39:18:36:62:01 PERMANENT
#10.0.3.2 dev oai0 lladdr 00:39:18:36:62:01 PERMANENT
#...
#10.0.1.3 dev oai0 lladdr 00:39:18:36:62:02 PERMANENT
#10.0.2.3 dev oai0 lladdr 00:39:18:36:62:02 PERMANENT
#10.0.3.3 dev oai0 lladdr 00:39:18:36:62:02 PERMANENT
#
###########################################################
IPTABLES=/sbin/iptables
THIS_SCRIPT_PATH=$(dirname $(readlink -f $0))
declare -x OPENAIR_DIR=""
declare -x OPENAIR1_DIR=""
declare -x OPENAIR2_DIR=""
declare -x OPENAIR3_DIR=""
declare -x OPENAIR_TARGETS=""
###########################################################
black='\E[30m'
red='\E[31m'
green='\E[32m'
yellow='\E[33m'
blue='\E[34m'
magenta='\E[35m'
cyan='\E[36m'
white='\E[37m'
ROOT_UID=0
E_NOTROOT=67
cecho() # Color-echo
# arg1 = message
# arg2 = color
{
local default_msg="No Message."
message=${1:-$default_msg}
color=${2:-$black}
echo -e "$color"
echo -n "$message"
tput sgr0
echo
return
}
echo_error() {
local my_string=""
until [ -z "$1" ]
do
my_string="$my_string$1"
shift
done
cecho "$my_string" $red
}
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
}
set_openair() {
path=`pwd`
declare -i length_path
declare -i index
length_path=${#path}
index=`echo $path | grep -b -o 'targets' | cut -d: -f1`
#echo ${path%$token*}
if [[ $index -lt $length_path && index -gt 0 ]]
then
declare -x OPENAIR_DIR
index=`expr $index - 1`
openair_path=`echo $path | cut -c1-$index`
#openair_path=`echo ${path:0:$index}`
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
return 0
fi
return -1
}
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
}
assert() {
# If condition false
# exit from script with error message
E_PARAM_ERR=98
E_PARAM_FAILED=99
if [ -z "$2" ] # Not enought parameters passed.
then
return $E_PARAM_ERR
fi
lineno=$2
if [ ! $1 ]
then
echo "Assertion failed: \"$1\""
echo "File \"$0\", line $lineno"
exit $E_ASSERT_FAILED
fi
}
ctrl_c() {
bash_exec "pkill oaisim"
bash_exec "ip link set $LTEIF down"
bash_exec "rmmod $IP_DRIVER_NAME"
bash_exec "$IPTABLES -P INPUT ACCEPT"
bash_exec "$IPTABLES -F INPUT"
bash_exec "$IPTABLES -P OUTPUT ACCEPT"
bash_exec "$IPTABLES -F OUTPUT"
bash_exec "$IPTABLES -P FORWARD ACCEPT"
bash_exec "$IPTABLES -F FORWARD"
bash_exec "$IPTABLES -t nat -F"
bash_exec "$IPTABLES -t mangle -F"
bash_exec "$IPTABLES -t filter -F"
bash_exec "ip route flush cache"
}
set_openair
cecho "OPENAIR_DIR = $OPENAIR_DIR" $green
cecho "OPENAIR1_DIR = $OPENAIR1_DIR" $green
cecho "OPENAIR2_DIR = $OPENAIR2_DIR" $green
cecho "OPENAIR3_DIR = $OPENAIR3_DIR" $green
cecho "OPENAIR_TARGETS = $OPENAIR_TARGETS" $green
declare -i NUM_MOBILES
declare -i INSTANCE
declare -i IP_SOURCE
declare -i IP_DEST
declare -i IP
declare -i RB_ID
declare -i CLASSIFIER_ID
trap ctrl_c INT
bash_exec "ip route flush cache"
bash_exec "$IPTABLES -P INPUT ACCEPT"
bash_exec "$IPTABLES -F INPUT"
bash_exec "$IPTABLES -P OUTPUT ACCEPT"
bash_exec "$IPTABLES -F OUTPUT"
bash_exec "$IPTABLES -P FORWARD DROP"
bash_exec "$IPTABLES -F FORWARD"
bash_exec "$IPTABLES -t nat -F"
bash_exec "$IPTABLES -t mangle -F"
bash_exec "$IPTABLES -t filter -F"
NUM_MOBILES=$1
for ((i=0 ; i < `expr $NUM_MOBILES + $NUM_ENB`; i++ ))
do
TEST_OAI=`/sbin/ifconfig | grep oai$i | awk '{print $1}'`
if [ "$TEST_OAI" = oai"$i"x ]; then
bash_exec "ip link set oai$i down"
fi
done
echo "Bringup OAI network interfaces"
bash_exec "rmmod $IP_DRIVER_NAME"
cecho "make $MAKE_IP_DRIVER_TARGET $MAKE_LTE_ACCESS_STRATUM_TARGET....." $green
bash_exec "make $MAKE_IP_DRIVER_TARGET $MAKE_LTE_ACCESS_STRATUM_TARGET"
bash_exec "insmod $OPENAIR2_DIR/NAS/DRIVER/LITE/$IP_DRIVER_NAME.ko oai_nw_drv_IMEI=${NAS_IMEI[0]},${NAS_IMEI[1]},${NAS_IMEI[2]},${NAS_IMEI[3]},${NAS_IMEI[4]},${NAS_IMEI[5]},${NAS_IMEI[6]},${NAS_IMEI[7]},${NAS_IMEI[8]},${NAS_IMEI[9]},${NAS_IMEI[10]},${NAS_IMEI[11]},${NAS_IMEI[12]},${NAS_IMEI[13]}"
NUM_MOBILES=$1
IP=1
########################
# #
# CONFIGURE OAI IF #
# #
########################
for ((i=0 ; i < `expr $NUM_MOBILES + $NUM_ENB`; i++ ))
do
bash_exec "ip link set oai$i broadcast ff:ff:ff:ff:ff:ff"
bash_exec "ip link set oai$i up"
sleep 1
bash_exec "ifconfig oai$i 10.0.$IP.$IP netmask 255.255.255.0 broadcast 10.0.$IP.255"
sleep 1
bash_exec "ip addr add dev oai$i 2001:$IP::$IP/64"
# avoid arp in virtualization
for ((j=0 ; j <= $NUM_MOBILES ; j++ ))
do
if [[ $i -ne $j ]]
then
bash_exec "ip neighbour add to 10.0.$IP.$IP lladdr 00:${NAS_IMEI[0]}${NAS_IMEI[1]}:${NAS_IMEI[2]}${NAS_IMEI[3]}:${NAS_IMEI[4]}${NAS_IMEI[5]}:${NAS_IMEI[6]}${NAS_IMEI[7]}:${NAS_IMEI[8]}$i nud permanent dev oai$j"
fi
done
let IP=IP+1
done
for ((src=0 ; src < `expr $NUM_ENB + $NUM_MOBILES` ; src++))
do
let IP_SRC=$src+1
for ((dst=0 ; dst < `expr $NUM_ENB + $NUM_MOBILES` ; dst++))
do
if [[ $src -ne $dst ]]
then
let IP_DST=$dst+1
let marksrc=${MARKING[$src]}
marksrc16=`printf '%02x' $marksrc`
let markdst=${MARKING[$dst]}
markdst16=`printf '%02x' $markdst`
bash_exec "iptables -t mangle -A OUTPUT --dst 10.0.$IP_SRC.$IP_DST -j MARK --set-mark 0x$marksrc16$markdst16"
bash_exec "iptables -t nat -A POSTROUTING -m mark --mark 0x$marksrc16$markdst16 -j SNAT --to 10.0.$IP_DST.$IP_SRC"
# we can use same mark since not same path (PREROUTING)
bash_exec "iptables -t mangle -A PREROUTING --dst 10.0.$IP_SRC.$IP_DST -j MARK --set-mark 0x$marksrc16$markdst16"
bash_exec "iptables -t nat -A PREROUTING -m mark --mark 0x$marksrc16$markdst16 -j DNAT --to 10.0.$IP_DST.$IP_DST"
fi
done
done
echo "########################################################################################"
echo "# IPTABLES MANGLE #"
echo "########################################################################################"
iptables -t mangle -nvL
echo "########################################################################################"
echo "# IPTABLES NAT #"
echo "########################################################################################"
iptables -t nat -nvL
########################
# #
# CONFIGURE RABS #
# #
########################
# Loop Cx 0 -> NUM_MOBILES - 1 for configuring default RABS on eNB
CLASSIFIER_ID=4
for ((instance=0 ; instance < $NUM_ENB ; instance++ ))
do
let IP_SRC=instance+1
for ((cx=0 ; cx < $NUM_MOBILES ; cx++ ))
do
let IP_DEST=cx+2
if [[ $IP_SRC -ne $IP_DEST ]]
then
# ON eNB
let RB_ID=(cx*8)+3
bash_exec "$OPENAIR2_DIR/NAS/DRIVER/LITE/RB_TOOL/rb_tool -a -c$cx -i$instance -f$CLASSIFIER_ID -z0 -s 10.0.$IP_DEST.$IP_SRC/32 -t 10.0.$IP_SRC.$IP_DEST/32 -r $RB_ID"
let CLASSIFIER_ID=CLASSIFIER_ID+2
# ON UE
let IP_SOURCE=instance+1
let instance_ue=cx+$NUM_ENB
RB_ID=3
bash_exec "$OPENAIR2_DIR/NAS/DRIVER/LITE/RB_TOOL/rb_tool -a -c$instance -i$instance_ue -f$CLASSIFIER_ID -z0 -s 10.0.$IP_SRC.$IP_DEST/32 -t 10.0.$IP_DEST.$IP_SRC/32 -r $RB_ID"
let CLASSIFIER_ID=CLASSIFIER_ID+2
# ON eNB
bash_exec "ip neighbour add to 10.0.$IP_SRC.$IP_DEST lladdr 00:${NAS_IMEI[0]}${NAS_IMEI[1]}:${NAS_IMEI[2]}${NAS_IMEI[3]}:${NAS_IMEI[4]}${NAS_IMEI[5]}:${NAS_IMEI[6]}${NAS_IMEI[7]}:${NAS_IMEI[8]}$instance_ue nud permanent dev oai$instance"
# ON UE
bash_exec "ip neighbour add to 10.0.$IP_DEST.$IP_SRC lladdr 00:${NAS_IMEI[0]}${NAS_IMEI[1]}:${NAS_IMEI[2]}${NAS_IMEI[3]}:${NAS_IMEI[4]}${NAS_IMEI[5]}:${NAS_IMEI[6]}${NAS_IMEI[7]}:${NAS_IMEI[8]}$instance nud permanent dev oai$instance_ue"
fi
done
done
IP=1
for ((i=0 ; i < `expr $NUM_MOBILES + $NUM_ENB`; i++ ))
do
# avoid arp in virtualization
for ((j=0 ; j <= $NUM_MOBILES ; j++ ))
do
if [[ $i -ne $j ]]
then
bash_exec "ip neighbour add to 10.0.$IP.$IP lladdr 00:${NAS_IMEI[0]}${NAS_IMEI[1]}:${NAS_IMEI[2]}${NAS_IMEI[3]}:${NAS_IMEI[4]}${NAS_IMEI[5]}:${NAS_IMEI[6]}${NAS_IMEI[7]}:${NAS_IMEI[8]}$i nud permanent dev oai$j"
fi
done
let IP=IP+1
done
# echo "start the emulation with 1eNB and" $1 "UE"
if [ "$GENERATE_SEQ_DIAGRAM"x = yesx ]; then
if [ -e /tmp/msc_log.txt ]; then
bash_exec "rm -f /tmp/msc_log.txt"
fi
if [ "$LOG_FILE_LTE"x = yesx ]; then
if [ -e /tmp/lte_log.txt ]; then
bash_exec "rm -f /tmp/lte_log.txt"
fi
$OPENAIR_TARGETS/SIMU/USER/oaisim -a -u $1 > /tmp/lte_log.txt
chmod 777 /tmp/lte_log.txt
cat /tmp/lte_log.txt | grep MSC_ > /tmp/msc_log.txt
else
$OPENAIR_TARGETS/SIMU/USER/oaisim -a -u $1 | grep MSC_ > /tmp/msc_log.txt
fi
chmod 777 /tmp/msc_log.txt
echo "End of emulation, now generating sequence diagrams..."
$OPENAIR_TARGETS/SCRIPTS/msc_gen.py /tmp/msc_log.txt
else
if [ "$LOG_FILE_LTE"x = yesx ]; then
if [ -e /tmp/lte_log.txt ]; then
bash_exec "rm -f /tmp/lte_log.txt"
fi
$OPENAIR_TARGETS/SIMU/USER/oaisim -a -u $1 > /tmp/lte_log.txt
chmod 777 /tmp/lte_log.txt
else
$OPENAIR_TARGETS/SIMU/USER/oaisim -a -u $1 -F > /tmp/lte_log.txt
fi
echo "End of emulation"
fi
+462
View File
@@ -0,0 +1,462 @@
#include <string.h>
#include <math.h>
#include <unistd.h>
#include <stdint.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include "SIMULATION/TOOLS/defs.h"
#include "SIMULATION/RF/defs.h"
#include "PHY/types.h"
#include "PHY/defs.h"
#include "PHY/extern.h"
#include "MAC_INTERFACE/extern.h"
#ifdef OPENAIR2
#include "LAYER2/MAC/defs.h"
#include "LAYER2/MAC/extern.h"
#include "PHY_INTERFACE/extern.h"
#endif
#include "../USER/oaisim.h"
#include "channel_sim_proc.h"
#include "interface.h"
#include "Tsync.h"
#include "Process.h"
#define FILENAMEMAX 255
//#define DEBUG_SIM
void Process_Func(int node_id,int port,double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,
node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms){
if(node_id<MAX_eNB)
eNB_Inst(node_id,port,r_re0,r_im0,r_re,r_im,s_re,s_im,enb_data,abstraction_flag,frame_parms);
else
UE_Inst(node_id,port,r_re0,r_im0,r_re,r_im,s_re,s_im,ue_data,abstraction_flag,frame_parms);
}
void UE_Inst(int node_id,int port,double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,
node_desc_t *ue_data[NUMBER_OF_UE_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms){
int next_slot,last_slot,slot=0,UE_id=0,eNB_id=0;
lte_subframe_t direction;
printf("UE [ %d ] Starts \n",node_id-MAX_eNB);
// init_mmap(node_id,frame_parms, &s_re, &s_im, &r_re, &r_im, &r_re0, &r_im0);
init_channel_vars (frame_parms, &s_re, &s_im, &r_re, &r_im, &r_re0, &r_im0);
mmap_ue(node_id,&PHY_vars_UE_g[0]->lte_ue_common_vars.txdata,&PHY_vars_UE_g[0]->lte_ue_common_vars.rxdata,frame_parms);
// Interface_init(port,node_id);
char p_input[FILENAMEMAX];
int fd_pipe;
int fd_channel;
mkfifo("/tmp/channel", 0666);
fd_channel=open("/tmp/channel",O_RDWR,0);
sprintf(p_input,"/tmp/pipe_%d",node_id);
mkfifo(p_input, 0666);
fd_pipe=open(p_input,O_RDWR,0);
// IntInitAll();
mac_xface->frame=0;
while(1){
// wait_4slot(&slot,&mac_xface->frame);
read(fd_pipe,&slot,sizeof(slot));
last_slot = (slot - 1)%20;
if (last_slot <0)
last_slot+=20;
next_slot = (slot + 1)%20;
direction = subframe_select(frame_parms,next_slot>>1);
#ifdef DEBUG_SIM
printf("\n\n[SIM] EMU PHY procedures UE %d for frame %d, slot %d (subframe %d)\n",
UE_id,mac_xface->frame, slot, (next_slot >> 1));
#endif
if (PHY_vars_UE_g[UE_id]->UE_mode[0] != NOT_SYNCHED) {
if ((mac_xface->frame)>0) {
phy_procedures_UE_lte ((last_slot),(next_slot), PHY_vars_UE_g[UE_id], 0, abstraction_flag);
}
}
else {
if (((mac_xface->frame)>0) && ((last_slot) == (SLOTS_PER_FRAME-1))) {
initial_sync(PHY_vars_UE_g[UE_id]);
}
}
if( direction == SF_UL || (direction == SF_S && next_slot%2!=0)){
do_OFDM_mod(PHY_vars_UE_g[UE_id]->lte_ue_common_vars.txdataF,PHY_vars_UE_g[UE_id]->lte_ue_common_vars.txdata,next_slot,&PHY_vars_UE_g[UE_id]->lte_frame_parms);
}
write(fd_channel,&node_id,sizeof(node_id));
// send_exec_complete(CHANNEL_PORT);
if(slot==19)
(mac_xface->frame)++;
}
}
void eNB_Inst(int node_id,int port,double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,
node_desc_t *enb_data[NUMBER_OF_eNB_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms){
int next_slot,last_slot,slot=0,UE_id=0,eNB_id=0;
lte_subframe_t direction;
printf("eNB [ %d ] Starts \n",node_id);
// init_mmap(node_id,frame_parms, &s_re, &s_im, &r_re, &r_im, &r_re0, &r_im0);
init_channel_vars (frame_parms, &s_re, &s_im, &r_re, &r_im, &r_re0, &r_im0);
mmap_enb(node_id,PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata,PHY_vars_eNB_g[0]->lte_eNB_common_vars.rxdata,frame_parms);
// Interface_init(port,node_id);
// IntInitAll();
char p_input[FILENAMEMAX];
int fd_pipe;
int fd_channel;
mkfifo("/tmp/channel", 0666);
fd_channel=open("/tmp/channel",O_RDWR,0);
sprintf(p_input,"/tmp/pipe_%d",node_id);
mkfifo(p_input, 0666);
fd_pipe=open(p_input, O_RDWR,0);
mac_xface->frame=0;
while(1){
// wait_4slot(&slot,&mac_xface->frame);
read(fd_pipe,&slot,sizeof(slot));
last_slot = (slot - 1)%20;
if (last_slot <0)
last_slot+=20;
next_slot = (slot + 1)%20;
direction = subframe_select(frame_parms,next_slot>>1);
#ifdef DEBUG_SIM
printf
("\n\n [SIM]EMU PHY procedures eNB %d for frame %d, slot %d (subframe %d) (rxdataF_ext %p) Nid_cell %d\n",
eNB_id, mac_xface->frame, slot, next_slot >> 1,
PHY_vars_eNB_g[0]->lte_eNB_ulsch_vars[0]->rxdataF_ext, PHY_vars_eNB_g[eNB_id]->lte_frame_parms.Nid_cell);
#endif
phy_procedures_eNB_lte (last_slot, next_slot, PHY_vars_eNB_g[eNB_id], abstraction_flag);
if( direction == SF_DL || (direction == SF_S && next_slot%2==0)){
do_OFDM_mod(PHY_vars_eNB_g[eNB_id]->lte_eNB_common_vars.txdataF[0],
PHY_vars_eNB_g[eNB_id]->lte_eNB_common_vars.txdata[0],
next_slot,
&PHY_vars_eNB_g[eNB_id]->lte_frame_parms);
}
write(fd_channel,&node_id,sizeof(node_id));
// send_exec_complete(CHANNEL_PORT);
if(slot==19)
(mac_xface->frame)++;
}
}
void Channel_Inst(int node_id,int port,double **s_re[MAX_eNB+MAX_UE],double **s_im[MAX_eNB+MAX_UE],double **r_re[MAX_eNB+MAX_UE],double **r_im[MAX_eNB+MAX_UE],double **r_re0,double **r_im0,
double **r_re0_d[MAX_UE][MAX_eNB],double **r_im0_d[MAX_UE][MAX_eNB],double **r_re0_u[MAX_eNB][MAX_UE],double **r_im0_u[MAX_eNB][MAX_UE],channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX],
channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX],node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms){
// Interface_init(port,node_id);
// IntInitAll();
mkfifo("/tmp/channel", 0666);
fd_channel=open("/tmp/channel", O_RDWR ,0);
int next_slot,last_slot,slot=0,UE_id=0,eNB_id=0;
lte_subframe_t direction;
char in_buffer[100];
int ci,ji=0;
for(ci=0;ci<NB_eNB_INST;ci++)
{
mmap_enb(ji,tx[ci],rx[ci],frame_parms);
init_channel_vars (frame_parms, &(s_re[ci]), &(s_im[ci]), &(r_re[ci]), &(r_im[ci]), &(r_re0), &(r_im0));
// init_mmap_channel(ji,frame_parms, &(s_re[ci]), &(s_im[ci]), &(r_re[ci]), &(r_im[ci]), &(r_re0), &(r_im0));
sprintf(in_buffer, "/tmp/pipe_%d",ji);
mkfifo(in_buffer, 0666);
fd_NB[ci]=open(in_buffer, O_RDWR ,0);
ji++;
}
ji=0;
for(ci=NB_eNB_INST;ci<(NB_eNB_INST+NB_UE_INST);ci++)
{
mmap_enb(MAX_eNB+ji,tx[ci],rx[ci],frame_parms);
init_channel_vars (frame_parms, &(s_re[ci]), &(s_im[ci]), &(r_re[ci]), &(r_im[ci]), &(r_re0), &(r_im0));
// init_mmap_channel(MAX_eNB+ji,frame_parms, &(s_re[ci]), &(s_im[ci]), &(r_re[ci]), &(r_im[ci]), &(r_re0), &(r_im0));
sprintf(in_buffer, "/tmp/pipe_%d",MAX_eNB+ji);
mkfifo(in_buffer, 0666);
fd_NB[ci]=open(in_buffer, O_RDWR ,0);
ji++;
}
for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) {
for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) {
init_rre(frame_parms,&(r_re0_u[eNB_id][UE_id]),&(r_im0_u[eNB_id][UE_id]));
init_rre(frame_parms,&(r_re0_d[UE_id][eNB_id]),&(r_im0_d[UE_id][eNB_id]));
}
}
for(eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++){
for(UE_id=0;UE_id<NB_UE_INST;UE_id++){
e2u_t[eNB_id][UE_id]=(ch_thread*)calloc(1,sizeof(ch_thread));
}
}
for(UE_id=0;UE_id<NB_UE_INST;UE_id++){
for(eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++){
u2e_t[UE_id][eNB_id]=(ch_thread*)calloc(1,sizeof(ch_thread));
}
}
pthread_t cthr_u[NB_eNB_INST][NB_UE_INST];
pthread_t cthr_d[NB_UE_INST][NB_eNB_INST];
pthread_mutex_init(&downlink_mutex_channel,NULL);
pthread_mutex_init(&uplink_mutex_channel,NULL);
pthread_mutex_init(&exclusive,NULL);
if (pthread_cond_init (&downlink_cond_channel, NULL)) exit(1);
if (pthread_cond_init (&uplink_cond_channel, NULL)) exit(1);
if (pthread_mutex_lock(&downlink_mutex_channel)) exit(1);
if (pthread_mutex_lock(&uplink_mutex_channel)) exit(1);
NUM_THREAD_DOWNLINK=0;
for (UE_id = 0; UE_id < (NB_UE_INST); UE_id++){
for (eNB_id=0;eNB_id<(NB_eNB_INST);eNB_id++) {
u2e_t[UE_id][eNB_id]->thread_id=NUM_THREAD_DOWNLINK;
u2e_t[UE_id][eNB_id]->eNB_id=eNB_id;
u2e_t[UE_id][eNB_id]->UE_id=UE_id;
u2e_t[UE_id][eNB_id]->r_re0=r_re0_d[UE_id][eNB_id];
u2e_t[UE_id][eNB_id]->r_im0=r_im0_d[UE_id][eNB_id];
u2e_t[UE_id][eNB_id]->r_re=r_re[NB_eNB_INST+UE_id];
u2e_t[UE_id][eNB_id]->r_im=r_im[NB_eNB_INST+UE_id];
u2e_t[UE_id][eNB_id]->s_im=s_im[eNB_id];
u2e_t[UE_id][eNB_id]->s_re=s_re[eNB_id];
u2e_t[UE_id][eNB_id]->eNB2UE=eNB2UE[eNB_id][UE_id];
u2e_t[UE_id][eNB_id]->UE2eNB=UE2eNB[UE_id][eNB_id];
u2e_t[UE_id][eNB_id]->enb_data=enb_data[eNB_id];
u2e_t[UE_id][eNB_id]->ue_data=ue_data[UE_id];
u2e_t[UE_id][eNB_id]->next_slot=&next_slot;
u2e_t[UE_id][eNB_id]->abstraction_flag=&abstraction_flag;
u2e_t[UE_id][eNB_id]->frame_parms=frame_parms;
u2e_t[UE_id][eNB_id]->tx_data[3]=tx[eNB_id][3];
u2e_t[UE_id][eNB_id]->rx_data[3]=rx[NB_eNB_INST+UE_id][3];
if(pthread_cond_init (&downlink_cond[eNB_id][UE_id], NULL)) exit(1);
if(pthread_mutex_lock(&downlink_mutex[eNB_id][UE_id])) exit(1);
pthread_create (&cthr_d[UE_id][eNB_id], NULL, do_DL_sig_channel_T,(void*)(u2e_t[UE_id][eNB_id]));
NUM_THREAD_DOWNLINK++;
}
}
NUM_THREAD_UPLINK=0;
for (eNB_id=0;eNB_id<(NB_eNB_INST);eNB_id++) {
for (UE_id = 0; UE_id < (NB_UE_INST); UE_id++){
e2u_t[eNB_id][UE_id]->thread_id=NUM_THREAD_UPLINK;
e2u_t[eNB_id][UE_id]->eNB_id=eNB_id;
e2u_t[eNB_id][UE_id]->UE_id=UE_id;
e2u_t[eNB_id][UE_id]->r_re=r_re[eNB_id];
e2u_t[eNB_id][UE_id]->r_im=r_im[eNB_id];
e2u_t[eNB_id][UE_id]->r_re0=r_re0_u[eNB_id][UE_id];
e2u_t[eNB_id][UE_id]->r_im0=r_im0_u[eNB_id][UE_id];
e2u_t[eNB_id][UE_id]->s_im=s_im[NB_eNB_INST+UE_id];
e2u_t[eNB_id][UE_id]->s_re=s_re[NB_eNB_INST+UE_id];
e2u_t[eNB_id][UE_id]->eNB2UE=eNB2UE[eNB_id][UE_id];
e2u_t[eNB_id][UE_id]->UE2eNB=UE2eNB[UE_id][eNB_id];
e2u_t[eNB_id][UE_id]->enb_data=enb_data[eNB_id];
e2u_t[eNB_id][UE_id]->ue_data=ue_data[UE_id];
e2u_t[eNB_id][UE_id]->next_slot=&next_slot;
e2u_t[eNB_id][UE_id]->abstraction_flag=&abstraction_flag;
e2u_t[eNB_id][UE_id]->frame_parms=frame_parms;
e2u_t[eNB_id][UE_id]->tx_data[3]=tx[NB_eNB_INST+UE_id][3];
e2u_t[eNB_id][UE_id]->rx_data[3]=rx[eNB_id][3];
if(pthread_cond_init (&uplink_cond[UE_id][eNB_id], NULL)) exit(1);
if(pthread_mutex_lock(&uplink_mutex[UE_id][eNB_id])) exit(1);
pthread_create (&cthr_u[eNB_id][UE_id], NULL, do_UL_sig_channel_T,(void*)e2u_t[eNB_id][UE_id]);
NUM_THREAD_UPLINK++;
}
}
}
void Channel_DL(double **s_re[MAX_eNB+MAX_UE],double **s_im[MAX_eNB+MAX_UE],double **r_re[MAX_eNB+MAX_UE],double **r_im[MAX_eNB+MAX_UE],double **r_re0,double **r_im0,
double **r_re0_d[MAX_UE][MAX_eNB],double **r_im0_d[MAX_UE][MAX_eNB],double **r_re0_u[MAX_eNB][MAX_UE],double **r_im0_u[MAX_eNB][MAX_UE],channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX],
channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX],node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,int slot){
int count=0;
int next_slot,last_slot,UE_id=0,eNB_id=0;
lte_subframe_t direction;
s32 **txdata,**rxdata;
double tx_pwr, rx_pwr;
s32 rx_pwr2;
u32 i;
u32 slot_offset;
for (eNB_id=0;eNB_id<(NB_eNB_INST);eNB_id++) {
write(fd_NB[eNB_id],&slot,sizeof(slot));
count++;
//send_exec_msg(mac_xface->frame,slot,eNB_PORT+eNB_id);
}
while(count--){
int dummy=1;
read(fd_channel,&dummy,sizeof(dummy));
//wait_4Msg();
}
for (eNB_id=0;eNB_id<(NB_eNB_INST);eNB_id++) {
frame_parms = &PHY_vars_eNB_g[eNB_id]->lte_frame_parms;
slot_offset = (nslot)*(frame_parms->samples_per_tti>>1);
txdata =tx[eNB_id][0];
tx_pwr = dac_fixed_gain(s_re[eNB_id],
s_im[eNB_id],
txdata,
slot_offset,
frame_parms->nb_antennas_tx,
frame_parms->samples_per_tti>>1,
14,
40);
printf("[SIM][DL] eNB %d: tx_pwr %f dB for slot %d (subframe %d)\n",eNB_id,10*log10(tx_pwr),nslot,nslot>>1);
}
_COT=0;
for (UE_id = 0; UE_id < (NB_UE_INST); UE_id++){
for (eNB_id=0;eNB_id<(NB_eNB_INST);eNB_id++) {
if(pthread_cond_signal(&downlink_cond[eNB_id][UE_id])) exit(1);
if(pthread_mutex_unlock(&downlink_mutex[eNB_id][UE_id])) exit(1);
}
}
if(pthread_cond_wait(&downlink_cond_channel, &downlink_mutex_channel)) exit(1);
for (UE_id = 0; UE_id < (NB_UE_INST); UE_id++){
Clean_Param(r_re[NB_eNB_INST+UE_id],r_im[NB_eNB_INST+UE_id],frame_parms);
for (eNB_id=0;eNB_id<(NB_eNB_INST);eNB_id++) {
Channel_Out(SF_DL,eNB_id,UE_id,r_re[NB_eNB_INST+UE_id],r_im[NB_eNB_INST+UE_id],r_re0_d[UE_id][eNB_id],r_im0_d[UE_id][eNB_id],frame_parms);
// adc_channel(eNB_id,UE_id,r_re[NB_eNB_INST+UE_id],r_im[NB_eNB_INST+UE_id]);
}
}
count=0;
for (UE_id = 0; UE_id < (NB_UE_INST); UE_id++)
if (mac_xface->frame >= (UE_id * 10)) {
write(fd_NB[NB_eNB_INST+UE_id],&slot,sizeof(slot));
//send_exec_msg(mac_xface->frame,slot,UE_PORT+UE_id);
count++;
}
while(count--){
int dummy=1;
read(fd_channel,&dummy,sizeof(dummy));
//wait_4Msg();
}
}
void Channel_UL(double **s_re[MAX_eNB+MAX_UE],double **s_im[MAX_eNB+MAX_UE],double **r_re[MAX_eNB+MAX_UE],double **r_im[MAX_eNB+MAX_UE],double **r_re0,double **r_im0,
double **r_re0_d[MAX_UE][MAX_eNB],double **r_im0_d[MAX_UE][MAX_eNB],double **r_re0_u[MAX_eNB][MAX_UE],double **r_im0_u[MAX_eNB][MAX_UE],channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX],
channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX],node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,int slot){
int count=0;
int next_slot,last_slot,UE_id=0,eNB_id=0;
lte_subframe_t direction;
s32 **txdata,**rxdata;
double tx_pwr, rx_pwr;
s32 rx_pwr2;
u32 i;
u32 slot_offset;
for (UE_id = 0; UE_id < (NB_UE_INST); UE_id++)
if (mac_xface->frame >= (UE_id * 10)) {
write(fd_NB[NB_eNB_INST+UE_id],&slot,sizeof(slot));
//send_exec_msg(mac_xface->frame,slot,UE_PORT+UE_id);
count++;
}
while(count--){
int dummy=1;
read(fd_channel,&dummy,sizeof(dummy));
//wait_4Msg();
}
for (UE_id = 0; UE_id < (NB_UE_INST); UE_id++){
frame_parms = &PHY_vars_UE_g[UE_id]->lte_frame_parms;
slot_offset = (nslot)*(frame_parms->samples_per_tti>>1);
txdata =tx[NB_eNB_INST+UE_id][0]; //PHY_vars_UE_g[UE_id]->lte_ue_common_vars.txdata;
tx_pwr = dac_fixed_gain(s_re[NB_eNB_INST+UE_id],
s_im[NB_eNB_INST+UE_id],
txdata,
slot_offset,
frame_parms->nb_antennas_tx,
frame_parms->samples_per_tti>>1,
14,
18);
printf("[SIM][UL] UE %d tx_pwr %f dB for slot %d (subframe %d)\n",UE_id,10*log10(tx_pwr),nslot,nslot>>1);
rx_pwr = signal_energy_fp(s_re[NB_eNB_INST+UE_id],s_im[NB_eNB_INST+UE_id],frame_parms->nb_antennas_rx,frame_parms->samples_per_tti>>1,0);
printf("[SIM][UL] UE %d tx_pwr %f dB for slot %d (subframe %d)\n",UE_id,10*log10(rx_pwr),nslot,nslot>>1);
}
_COT_U=0;
for (eNB_id=0;eNB_id<(NB_eNB_INST);eNB_id++) {
for (UE_id = 0; UE_id < (NB_UE_INST); UE_id++){
if ( pthread_cond_signal(&uplink_cond[UE_id][eNB_id])) exit(1);
if ( pthread_mutex_unlock(&uplink_mutex[UE_id][eNB_id])) exit(1);
}}
if ( pthread_cond_wait(&uplink_cond_channel, &uplink_mutex_channel)) exit(1);
for (eNB_id=0;eNB_id<(NB_eNB_INST);eNB_id++) {
Clean_Param(r_re[eNB_id],r_im[eNB_id],frame_parms);
for (UE_id = 0; UE_id < (NB_UE_INST); UE_id++){
Channel_Out(SF_UL,eNB_id,UE_id,r_re[eNB_id],r_im[eNB_id],r_re0_u[eNB_id][UE_id],r_im0_u[eNB_id][UE_id],frame_parms); printf("[SIM][DL] eNB %d: tx_pwr %f dB for slot %d (subframe %d)\n",eNB_id,10*log10(tx_pwr),next_slot,next_slot>>1);
}
}
count=0;
for (eNB_id=0;eNB_id<(NB_eNB_INST);eNB_id++) {
write(fd_NB[eNB_id],&slot,sizeof(slot));
// send_exec_msg(mac_xface->frame,slot,eNB_PORT+eNB_id);
count++;
}
while(count--){
int dummy=1;
read(fd_channel,&dummy,sizeof(dummy));
// wait_4Msg();
}
}
void Channel_Func(double **s_re[MAX_eNB+MAX_UE],double **s_im[MAX_eNB+MAX_UE],double **r_re[MAX_eNB+MAX_UE],double **r_im[MAX_eNB+MAX_UE],double **r_re0,double **r_im0,
double **r_re0_d[MAX_UE][MAX_eNB],double **r_im0_d[MAX_UE][MAX_eNB],double **r_re0_u[MAX_eNB][MAX_UE],double **r_im0_u[MAX_eNB][MAX_UE],channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX],
channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX],node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,int slot){
int last_slot;
lte_subframe_t direction;
last_slot = (slot - 1)%20;
if (last_slot <0)
last_slot+=20;
nslot = (slot + 1)%20;
direction = subframe_select(frame_parms,nslot>>1);
if( direction == SF_DL || (direction == SF_S && nslot%2==0)){
Channel_DL(s_re,s_im,r_re,r_im,r_re0,r_im0,r_re0_d,r_im0_d,r_re0_u,r_im0_u,eNB2UE,UE2eNB,enb_data,ue_data,abstraction_flag,frame_parms,slot);
}
else{
Channel_UL(s_re,s_im,r_re,r_im,r_re0,r_im0,r_re0_d,r_im0_d,r_re0_u,r_im0_u,eNB2UE,UE2eNB,enb_data,ue_data,abstraction_flag,frame_parms,slot);
}
}
+35
View File
@@ -0,0 +1,35 @@
#ifndef __PROCESS_H__
# define __PROCESS_H__
#include "interface.h"
s32 **tx[MAX_eNB+MAX_UE][3],**rx[MAX_eNB+MAX_UE][3];
int nslot;
void Process_Func(int node_id,int port,double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,
node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms);
void UE_Inst(int node_id,int port,double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,
node_desc_t *ue_data[NUMBER_OF_UE_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms);
void eNB_Inst(int node_id,int port,double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,
node_desc_t *enb_data[NUMBER_OF_eNB_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms);
void Channel_Inst(int node_id,int port,double **s_re[MAX_eNB+MAX_UE],double **s_im[MAX_eNB+MAX_UE],double **r_re[MAX_eNB+MAX_UE],double **r_im[MAX_eNB+MAX_UE],double **r_re0,double **r_im0,
double **r_re0_d[MAX_UE][MAX_eNB],double **r_im0_d[MAX_UE][MAX_eNB],double **r_re0_u[MAX_eNB][MAX_UE],double **r_im0_u[MAX_eNB][MAX_UE],channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX],
channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX],node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms);
void Channel_DL(double **s_re[MAX_eNB+MAX_UE],double **s_im[MAX_eNB+MAX_UE],double **r_re[MAX_eNB+MAX_UE],double **r_im[MAX_eNB+MAX_UE],double **r_re0,double **r_im0,
double **r_re0_d[MAX_UE][MAX_eNB],double **r_im0_d[MAX_UE][MAX_eNB],double **r_re0_u[MAX_eNB][MAX_UE],double **r_im0_u[MAX_eNB][MAX_UE],channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX],
channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX],node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,int slot);
void Channel_UL(double **s_re[MAX_eNB+MAX_UE],double **s_im[MAX_eNB+MAX_UE],double **r_re[MAX_eNB+MAX_UE],double **r_im[MAX_eNB+MAX_UE],double **r_re0,double **r_im0,
double **r_re0_d[MAX_UE][MAX_eNB],double **r_im0_d[MAX_UE][MAX_eNB],double **r_re0_u[MAX_eNB][MAX_UE],double **r_im0_u[MAX_eNB][MAX_UE],channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX],
channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX],node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,int slot);
void Channel_Func(double **s_re[MAX_eNB+MAX_UE],double **s_im[MAX_eNB+MAX_UE],double **r_re[MAX_eNB+MAX_UE],double **r_im[MAX_eNB+MAX_UE],double **r_re0,double **r_im0,
double **r_re0_d[MAX_UE][MAX_eNB],double **r_im0_d[MAX_UE][MAX_eNB],double **r_re0_u[MAX_eNB][MAX_UE],double **r_im0_u[MAX_eNB][MAX_UE],channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX],
channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX],node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,int slot);
#endif
+61
View File
@@ -0,0 +1,61 @@
#!/usr/bin/env python
import subprocess
import optparse
import re
OPT=" "
TERMINAL="gnome-terminal -x "
TIME="time"
def runBash(cmd):
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
out = p.stdout.read().strip()
return out
def main():
global OPT,TIME,TERMINAL
subprocess.call('ps | nawk \'/oaisim/ {system("kill " $1)}\'', shell=True)
p = optparse.OptionParser()
p.add_option('--eNB', '-b', default="1")
p.add_option('--UE', '-u', default="1")
p.add_option('--frame','-n', default="100")
p.add_option('--terminal','-t', default="1")
p.add_option('--time','--time', default="0")
options, arguments = p.parse_args()
print '---- Configuration ---- '
print 'Number of eNB : %s' % options.eNB
print 'Number of UE : %s' % options.UE
if(options.terminal=='1'):
OPT+=TERMINAL
if(options.time=='1'):
OPT+=TIME
#CHANNEL= 'valgrind --tool=callgrind --collect-bus=yes --branch-sim=yes $OPENAIR_TARGETS/SIMU/USER/oaisim -X0 -b%s -u%s -n%s' % (options.eNB,options.UE,options.frame)
CHANNEL= '$OPENAIR_TARGETS/SIMU/USER/oaisim -X0 -b%s -u%s -n%s' % (options.eNB,options.UE,options.frame)
#subprocess.call(CHANNEL, shell=True)
print CHANNEL
nb_enb=int(options.eNB)
nb_ue=int(options.UE)
frame=int(options.frame)
for x in xrange(0,nb_enb):
ENB='%s $OPENAIR_TARGETS/SIMU/USER/oaisim -X1 -i%s &' % (OPT,x)
print ENB
subprocess.call(ENB,shell=True)
subprocess.call('sleep 1', shell=True)
for x in xrange(0,nb_ue):
UE='%s $OPENAIR_TARGETS/SIMU/USER/oaisim -X2 -i%s &' % (OPT,x)
print UE
subprocess.call(UE,shell=True)
subprocess.call('sleep 1', shell=True)
# subprocess.call('sleep 2', shell=True)
subprocess.call(CHANNEL, shell=True)
# subprocess.call('ps | nawk \'/oaisim/ {system("kill " $1)}\'', shell=True)
if __name__ == '__main__':
main()
+42
View File
@@ -0,0 +1,42 @@
/*
* Tsync.h
*
*/
#include <pthread.h>
#ifndef TSYNC_H_
#define TSYNC_H_
#define COMPILER_BARRIER() __asm__ __volatile__ ("" ::: "memory")
int mycount;
pthread_mutex_t exclusive;
pthread_mutex_t downlink_mutex[MAX_eNB][MAX_UE];
pthread_mutex_t downlink_mutex_channel;
pthread_cond_t downlink_cond[MAX_eNB][MAX_UE];
pthread_cond_t downlink_cond_channel;
pthread_mutex_t uplink_mutex[MAX_UE][MAX_eNB];
pthread_mutex_t uplink_mutex_channel;
pthread_cond_t uplink_cond[MAX_UE][MAX_eNB];
pthread_cond_t uplink_cond_channel;
int COT;
int COT_U;
volatile int _COT;
volatile int _COT_U;
int NUM_THREAD_DOWNLINK;
int NUM_THREAD_UPLINK;
ch_thread *e2u_t[MAX_UE][MAX_eNB];
ch_thread *u2e_t[MAX_UE][MAX_eNB];
pthread_t cthr_u[MAX_eNB][MAX_UE];
pthread_t cthr_d[MAX_eNB][MAX_UE];
int fd_NB[MAX_eNB+MAX_UE];
int fd_channel;
#endif /* TSYNC_H_ */
+638
View File
@@ -0,0 +1,638 @@
#include <string.h>
#include <math.h>
#include <unistd.h>
#include <stdint.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include "SIMULATION/TOOLS/defs.h"
#include "SIMULATION/RF/defs.h"
#include "PHY/types.h"
#include "PHY/defs.h"
#include "PHY/extern.h"
#include "MAC_INTERFACE/extern.h"
#ifdef OPENAIR2
#include "LAYER2/MAC/defs.h"
#include "LAYER2/MAC/extern.h"
#include "UTIL/LOG/log_if.h"
#include "RRC/LITE/extern.h"
#include "PHY_INTERFACE/extern.h"
#endif
#include "../USER/oaisim.h"
#include "channel_sim_proc.h"
#include "interface.h"
#include "Tsync.h"
#include "Process.h"
#define RF
//#define DEBUG_SIM
void init_rre(LTE_DL_FRAME_PARMS *frame_parms,double ***r_re0,double ***r_im0) {
int i;
(*r_re0) = malloc(2*sizeof(double*));
(*r_im0) = malloc(2*sizeof(double*));
for (i=0;i<2;i++) {
(*r_re0)[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero((*r_re0)[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
(*r_im0)[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero((*r_im0)[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
}
}
void mmap_enb(int id,int **tx_data[3],int **rx_data[3],LTE_DL_FRAME_PARMS *frame_parms) {
int i;
int fd[20];
int result;
unsigned int FILESIZE;
FILESIZE=FRAME_LENGTH_COMPLEX_SAMPLES*(sizeof(s32));
char buffer[100];
int j=0,k=0;
char sect=1;
for(k=0;k<sect;k++){
(*(tx_data+k)) = malloc(2*sizeof(s32*));
(*(rx_data+k)) = malloc(2*sizeof(s32*));
}
for (k=0;k<sect;k++){
for (i=0;i<2;i++) {
sprintf(buffer,"/tmp/tx_data_%d_%d_%d.bin",id,k,i);
fd[j] = open(buffer, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
result = lseek(fd[j], FILESIZE-1, SEEK_SET);
result = write(fd[j], "", 1);
(*(tx_data+k))[i] = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd[j], 0);
j++;
sprintf(buffer,"/tmp/rx_data_%d_%d_%d.bin",id,k,i);
fd[j] = open(buffer, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
result = lseek(fd[j], FILESIZE-1, SEEK_SET);
result = write(fd[j], "", 1);
(*(rx_data+k))[i] = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd[j], 0);
j++;
}
}
}
void mmap_ue(int id,int ***tx_data,int ***rx_data,LTE_DL_FRAME_PARMS *frame_parms) {
int i;
int fd[20];
int result;
unsigned int FILESIZE;
FILESIZE=FRAME_LENGTH_COMPLEX_SAMPLES*(sizeof(s32));
char buffer[100];
int j=0,k=0;
(*tx_data) = malloc(2*sizeof(s32*));
(*rx_data) = malloc(2*sizeof(s32*));
for (i=0;i<2;i++) {
sprintf(buffer,"/tmp/tx_data_%d_%d_%d.bin",id,k,i);
fd[j] = open(buffer, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
result = lseek(fd[j], FILESIZE-1, SEEK_SET);
result = write(fd[j], "", 1);
(*tx_data)[i] = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd[j], 0);
j++;
sprintf(buffer,"/tmp/rx_data_%d_%d_%d.bin",id,k,i);
fd[j] = open(buffer, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
result = lseek(fd[j], FILESIZE-1, SEEK_SET);
result = write(fd[j], "", 1);
(*rx_data)[i] = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd[j], 0);
j++;
}
}
void do_DL_sig_channel_T(void *param){
ch_thread* cthread = (ch_thread*)param;
int count;
u8 eNB_i,UE_i;
int thread_id;
double **r_re0,**r_re,**r_im,**r_im0,**s_re,**s_im;
channel_desc_t *eNB2UE[3][8];
node_desc_t *enb_data[3];
node_desc_t *ue_data[8];
int *next_slot,abstraction_flag;
LTE_DL_FRAME_PARMS *frame_parms;
int **tx_data[3],**rx_data[3];
node_desc_t *enb_data_2[3];
eNB_i=(cthread->eNB_id);
UE_i=(cthread->UE_id);
r_re0=cthread->r_re0;
r_re=cthread->r_re;
r_im=cthread->r_im;
r_im0=cthread->r_im0;
s_im=cthread->s_im;
s_re=cthread->s_re;
eNB2UE[eNB_i][UE_i]=cthread->eNB2UE;
enb_data[0]=(cthread->enb_data);
enb_data_2[eNB_i]=cthread->enb_data;
ue_data[UE_i]=cthread->ue_data;
frame_parms=cthread->frame_parms;
next_slot=(cthread->next_slot);
abstraction_flag=*(cthread->abstraction_flag);
thread_id=(cthread->thread_id);
tx_data[3]=cthread->tx_data[3];
rx_data[3]=cthread->rx_data[3];
s32 att_eNB_id=-1;
s32 **txdata,**rxdata;
double tx_pwr, rx_pwr;
s32 rx_pwr2;
u32 i,aa;
u32 slot_offset;
while(1){
if(pthread_cond_wait(&downlink_cond[eNB_i][UE_i], &downlink_mutex[eNB_i][UE_i])) exit(1);
slot_offset = (nslot)*(frame_parms->samples_per_tti>>1);
// pthread_mutex_lock(&exclusive);
multipath_channel(eNB2UE[eNB_i][UE_i],s_re,s_im,r_re0,r_im0,
frame_parms->samples_per_tti>>1,0);
rx_pwr = signal_energy_fp2(eNB2UE[eNB_i][UE_i]->ch[0],eNB2UE[eNB_i][UE_i]->channel_length)*eNB2UE[eNB_i][UE_i]->channel_length;
printf("[SIM][DL] Channel eNB %d => UE %d : tx_power %f dBm, path_loss %f dB\n",
eNB_i,UE_i,
enb_data_2[eNB_i]->tx_power_dBm,
eNB2UE[eNB_i][UE_i]->path_loss_dB);
printf("[SIM][DL] Channel eNB %d => UE %d : Channel gain %f dB (%f)\n",eNB_i,UE_i,10*log10(rx_pwr),rx_pwr);
rx_pwr = signal_energy_fp(r_re0,r_im0,frame_parms->nb_antennas_rx,frame_parms->samples_per_tti>>1,0);
printf("[SIM][DL] UE %d : rx_pwr %f dB for slot %d (subframe %d)\n",UE_i,10*log10(rx_pwr),nslot,nslot>>1);
if (eNB2UE[eNB_i][UE_i]->first_run == 1)
eNB2UE[eNB_i][UE_i]->first_run = 0;
rf_rx(r_re0,
r_im0,
NULL,
NULL,
0,
frame_parms->nb_antennas_rx,
frame_parms->samples_per_tti>>1,
1e3/eNB2UE[eNB_i][UE_i]->BW, // sampling time (ns)
0.0, // freq offset (Hz) (-20kHz..20kHz)
0.0, // drift (Hz) NOT YET IMPLEMENTED
ue_data[UE_i]->rx_noise_level, // noise_figure NOT YET IMPLEMENTED
110.00 - 66.227, // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
200, // IP3_dBm (dBm)
&eNB2UE[eNB_i][UE_i]->ip, // initial phase
30.0e3, // pn_cutoff (kHz)
-500.0, // pn_amp (dBc) default: 50
0.0, // IQ imbalance (dB),
0.0); // IQ phase imbalance (rad)
rx_pwr = signal_energy_fp(r_re0,r_im0,frame_parms->nb_antennas_rx,frame_parms->samples_per_tti>>1,0);
printf("[SIM][DL] UE %d : ADC in (eNB %d) %f dB for slot %d (subframe %d)\n",UE_i,eNB_i,10*log10(rx_pwr),nslot,nslot>>1);
//count = __sync_add_and_fetch(&_COT, 1);
//COMPILER_BARRIER();
if (pthread_mutex_lock(&downlink_mutex_channel)) exit(1);
_COT++;
if(_COT==NUM_THREAD_DOWNLINK){
// if(count==NUM_THREAD_DOWNLINK){
if(pthread_cond_signal(&downlink_cond_channel)) exit(1);
}
if(pthread_mutex_unlock(&downlink_mutex_channel)) exit(1);
// pthread_mutex_unlock(&exclusive);
}
}
void do_UL_sig_channel_T(void *param){
ch_thread* cthread = (ch_thread*)param;
int count=0;
u8 eNB_i,UE_i;
double **r_re0,**r_re,**r_im,**r_im0,**s_re,**s_im;
channel_desc_t *UE2eNB[8][3];
node_desc_t *enb_data2[3];
node_desc_t *ue_data[8];
u16 next_slot,abstraction_flag;
LTE_DL_FRAME_PARMS *frame_parms;
int thread_id;
eNB_i=(cthread->eNB_id);
UE_i=(cthread->UE_id);
r_re0=cthread->r_re0;
r_re=cthread->r_re;
r_im=cthread->r_im;
r_im0=cthread->r_im0;
s_im=cthread->s_im;
s_re=cthread->s_re;
UE2eNB[UE_i][eNB_i]=cthread->UE2eNB;
enb_data2[eNB_i]=cthread->enb_data;
ue_data[UE_i]=cthread->ue_data;
next_slot=*(cthread->next_slot);
abstraction_flag=*(cthread->abstraction_flag);
frame_parms=cthread->frame_parms;
thread_id=(cthread->thread_id);
s32 **txdata,**rxdata;
u8 UE_id=0,eNB_id=0,aa;
double tx_pwr, rx_pwr;
s32 rx_pwr2;
u32 i;
u32 slot_offset;
double nf = 0; //currently unused
while(1){
slot_offset = (nslot)*(frame_parms->samples_per_tti>>1);
if(pthread_cond_wait(&uplink_cond[UE_i][eNB_i], &uplink_mutex[UE_i][eNB_i])) exit(1);//[UE_i][eNB_i]);
// pthread_mutex_lock(&exclusive);
multipath_channel(UE2eNB[UE_i][eNB_i],s_re,s_im,r_re0,r_im0,
frame_parms->samples_per_tti>>1,0);
printf("[SIM][UL] Channel UE %d => eNB %d : %f dB\n",UE_i,eNB_i,10*log10(rx_pwr));
rx_pwr = signal_energy_fp(r_re0,r_im0,frame_parms->nb_antennas_rx,frame_parms->samples_per_tti>>1,0);
printf("[SIM][UL] eNB %d : eNB out %f dB for slot %d (subframe %d), sptti %d\n",eNB_i,10*log10(rx_pwr),nslot,nslot>>1,frame_parms->samples_per_tti);
if (UE2eNB[UE_i][eNB_i]->first_run == 1)
UE2eNB[UE_i][eNB_i]->first_run = 0;
// RF model
rf_rx(r_re0,
r_im0,
NULL,
NULL,
0,
frame_parms->nb_antennas_rx,
frame_parms->samples_per_tti>>1,
(UE_id==0) ? (1.0/7.68e6 * 1e9) : 1e9, // sampling time (ns) + set noise bandwidth to 0 for UE>0 (i.e. no noise except for first UE)
0.0, // freq offset (Hz) (-20kHz..20kHz)
0.0, // drift (Hz) NOT YET IMPLEMENTED
nf, // noise_figure NOT YET IMPLEMENTED
150.00 - 66.227, // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
200, // IP3_dBm (dBm)
&UE2eNB[UE_i][eNB_i]->ip, // initial phase
30.0e3, // pn_cutoff (kHz)
-500.0, // pn_amp (dBc) default: 50
0.0, // IQ imbalance (dB),
0.0); // IQ phase imbalance (rad)
rx_pwr = signal_energy_fp(r_re,r_im,frame_parms->nb_antennas_rx,frame_parms->samples_per_tti>>1,0);
printf("[SIM][UL] rx_pwr (ADC in) %f dB for slot %d (subframe %d)\n",10*log10(rx_pwr),nslot,nslot>>1);
// count = __sync_add_and_fetch(&_COT_U, 1);
// COMPILER_BARRIER();
if (pthread_mutex_lock(&uplink_mutex_channel)) exit(1);
_COT_U++;
if(_COT_U==NUM_THREAD_UPLINK){
//if(count==NUM_THREAD_UPLINK){
if (pthread_cond_signal(&uplink_cond_channel)) exit(1);
}
if(pthread_mutex_unlock(&uplink_mutex_channel)) exit(1);
// pthread_mutex_unlock(&exclusive);
}
}
void Clean_Param(double **r_re,double **r_im,LTE_DL_FRAME_PARMS *frame_parms)
{
u32 i,aa;
for (i=0;i<(frame_parms->samples_per_tti>>1);i++) {
for (aa=0;aa<frame_parms->nb_antennas_rx;aa++) {
r_re[aa][i]=0.0;
r_im[aa][i]=0.0;
}
}
}
void Channel_Out(lte_subframe_t direction,int eNB_id,int UE_id,double **r_re,double **r_im,double **r_re0,double **r_im0,LTE_DL_FRAME_PARMS *frame_parms)
{
u32 i,aa;
double alpha=0.0;
u32 slot_offset;
frame_parms = &PHY_vars_UE_g[0]->lte_frame_parms;
slot_offset = (nslot)*(frame_parms->samples_per_tti>>1);
s32 rx_pwr2;
s32 **rxdata;
if(eNB_id==(UE_id % NB_eNB_INST))
alpha=1;
for (i=0;i<(frame_parms->samples_per_tti>>1);i++) {
for (aa=0;aa<frame_parms->nb_antennas_rx;aa++) {
r_re[aa][i]+=(r_re0[aa][i]*alpha);
r_im[aa][i]+=(r_im0[aa][i]*alpha);
}
}
rxdata=rx[eNB_id][0];
if (direction == SF_DL ) {
frame_parms = &PHY_vars_eNB_g[0]->lte_frame_parms;
slot_offset = (nslot)*(frame_parms->samples_per_tti>>1);
adc(r_re,
r_im,
0,
slot_offset,
rx[NB_eNB_INST+UE_id][0],
frame_parms->nb_antennas_rx,
frame_parms->samples_per_tti>>1,
12);
}
else{
frame_parms = &PHY_vars_UE_g[0]->lte_frame_parms;
slot_offset = (nslot)*(frame_parms->samples_per_tti>>1);
adc(r_re,
r_im,
0,
slot_offset,
rx[eNB_id][0],
frame_parms->nb_antennas_rx,
frame_parms->samples_per_tti>>1,
12);
}
rx_pwr2 = signal_energy(rxdata[0]+slot_offset,frame_parms->samples_per_tti>>1);
// printf("[SIM][DL/UL] UE/eNB %d : rx_pwr (ADC out) %f dB (%d) for slot %d (subframe %d), writing to %p\n",UE_id, 10*log10((double)rx_pwr2),rx_pwr2,nslot,nslot>>1,rxdata);
}
/*
void do_UL_sig_channel(u8 eNB_i,u8 UE_i,double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX],u16 next_slot,u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms) {
s32 **txdata,**rxdata;
u8 UE_id=0,eNB_id=0,aa;
double tx_pwr, rx_pwr;
s32 rx_pwr2;
u32 i;
u32 slot_offset;
double nf = 0; //currently unused
slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1);
multipath_channel(UE2eNB[UE_i][eNB_i],s_re,s_im,r_re0,r_im0,
frame_parms->samples_per_tti>>1,0);
rx_pwr = signal_energy_fp(r_re0,r_im0,frame_parms->nb_antennas_rx,frame_parms->samples_per_tti>>1,0);
if (UE2eNB[UE_i][eNB_i]->first_run == 1)
UE2eNB[UE_i][eNB_i]->first_run = 0;
// RF model
rf_rx(r_re0,
r_im0,
NULL,
NULL,
0,
frame_parms->nb_antennas_rx,
frame_parms->samples_per_tti>>1,
(UE_id==0) ? (1.0/7.68e6 * 1e9) : 1e9, // sampling time (ns) + set noise bandwidth to 0 for UE>0 (i.e. no noise except for first UE)
0.0, // freq offset (Hz) (-20kHz..20kHz)
0.0, // drift (Hz) NOT YET IMPLEMENTED
nf, // noise_figure NOT YET IMPLEMENTED
150.00 - 66.227, // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
200, // IP3_dBm (dBm)
&UE2eNB[UE_i][eNB_i]->ip, // initial phase
30.0e3, // pn_cutoff (kHz)
-500.0, // pn_amp (dBc) default: 50
0.0, // IQ imbalance (dB),
0.0); // IQ phase imbalance (rad)
rx_pwr = signal_energy_fp(r_re,r_im,frame_parms->nb_antennas_rx,frame_parms->samples_per_tti>>1,0);
printf("[SIM][UL] rx_pwr (ADC in) %f dB for slot %d (subframe %d)\n",10*log10(rx_pwr),next_slot,next_slot>>1);
}
*/
/*
void do_DL_sig_channel(u8 eNB_i,u8 UE_i,double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX],
node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX], u16 next_slot,u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms) {
s32 att_eNB_id=-1;
s32 **txdata,**rxdata;
u8 eNB_id=0,UE_id=0;
double tx_pwr, rx_pwr;
s32 rx_pwr2;
u32 i,aa;
u32 slot_offset;
multipath_channel(eNB2UE[eNB_i][UE_i],s_re,s_im,r_re0,r_im0,
frame_parms->samples_per_tti>>1,0);
rx_pwr = signal_energy_fp2(eNB2UE[eNB_i][UE_i]->ch[0],eNB2UE[eNB_i][UE_i]->channel_length)*eNB2UE[eNB_i][UE_i]->channel_length;
printf("[SIM][DL] Channel eNB %d => UE %d : tx_power %f dBm, path_loss %f dB\n",
eNB_i,UE_i,
enb_data[eNB_id]->tx_power_dBm,
eNB2UE[eNB_id][UE_id]->path_loss_dB);
printf("[SIM][DL] Channel eNB %d => UE %d : Channel gain %f dB (%f)\n",eNB_id,UE_id,10*log10(rx_pwr),rx_pwr);
rx_pwr = signal_energy_fp(r_re0,r_im0,frame_parms->nb_antennas_rx,frame_parms->samples_per_tti>>1,0);
printf("[SIM][DL] UE %d : rx_pwr %f dB for slot %d (subframe %d)\n",UE_id,10*log10(rx_pwr),next_slot,next_slot>>1);
if (eNB2UE[eNB_id][UE_id]->first_run == 1)
eNB2UE[eNB_id][UE_id]->first_run = 0;
rf_rx(r_re0,
r_im0,
NULL,
NULL,
0,
frame_parms->nb_antennas_rx,
frame_parms->samples_per_tti>>1,
1e3/eNB2UE[eNB_i][UE_i]->BW, // sampling time (ns)
0.0, // freq offset (Hz) (-20kHz..20kHz)
0.0, // drift (Hz) NOT YET IMPLEMENTED
ue_data[UE_id]->rx_noise_level, // noise_figure NOT YET IMPLEMENTED
110.00 - 66.227, // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
200, // IP3_dBm (dBm)
&eNB2UE[eNB_i][UE_i]->ip, // initial phase
30.0e3, // pn_cutoff (kHz)
-500.0, // pn_amp (dBc) default: 50
0.0, // IQ imbalance (dB),
0.0); // IQ phase imbalance (rad)
rx_pwr = signal_energy_fp(r_re0,r_im0,frame_parms->nb_antennas_rx,frame_parms->samples_per_tti>>1,0);
printf("[SIM][DL] UE %d : ADC in (eNB %d) %f dB for slot %d (subframe %d)\n",UE_id,eNB_id,10*log10(rx_pwr),next_slot,next_slot>>1);
}
*/
/*
void init_mmap_channel(int id,LTE_DL_FRAME_PARMS *frame_parms, double ***s_re,double ***s_im,double ***r_re,double ***r_im,double ***r_re0,double ***r_im0) {
int i;
int fd[20];
int result;
double *map;
unsigned int FILESIZE;
FILESIZE=FRAME_LENGTH_COMPLEX_SAMPLES*(sizeof(double));
(*s_re) = malloc(2*sizeof(double*));
(*s_im) = malloc(2*sizeof(double*));
(*r_re) = malloc(2*sizeof(double*));
(*r_im) = malloc(2*sizeof(double*));
(*r_re0) = malloc(2*sizeof(double*));
(*r_im0) = malloc(2*sizeof(double*));
char buffer[100];
int j=0;
for (i=0;i<2;i++) {
sprintf(buffer,"/tmp/s_re_%d_%d.bin",id,i);
fd[j] = open(buffer, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
result = lseek(fd[j], FILESIZE-1, SEEK_SET);
result = write(fd[j], "", 1);
(*s_re)[i] = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd[j], 0);
j++;
sprintf(buffer,"/tmp/s_im_%d_%d.bin",id,i);
fd[j] = open(buffer, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
result = lseek(fd[j], FILESIZE-1, SEEK_SET);
result = write(fd[j], "", 1);
(*s_im)[i] = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd[j], 0);
j++;
sprintf(buffer,"/tmp/r_re_%d_%d.bin",id,i);
fd[j] = open(buffer, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
result = lseek(fd[j], FILESIZE-1, SEEK_SET);
result = write(fd[j], "", 1);
(*r_re)[i] = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd[j], 0);
j++;
sprintf(buffer,"/tmp/r_im_%d_%d.bin",id,i);
fd[j] = open(buffer, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
result = lseek(fd[j], FILESIZE-1, SEEK_SET);
result = write(fd[j], "", 1);
(*r_im)[i] = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd[j], 0);
j++;
}
for (i=0;i<2;i++) {
(*r_re0)[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero((*r_re0)[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
(*r_im0)[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero((*r_im0)[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
}
}
void init_mmap(int id,LTE_DL_FRAME_PARMS *frame_parms, double ***s_re,double ***s_im,double ***r_re,double ***r_im,double ***r_re0,double ***r_im0) {
int i;
int fd[20];
int result;
double *map;
unsigned int FILESIZE;
FILESIZE=FRAME_LENGTH_COMPLEX_SAMPLES*(sizeof(double));
*s_re = malloc(2*sizeof(double*));
*s_im = malloc(2*sizeof(double*));
*r_re = malloc(2*sizeof(double*));
*r_im = malloc(2*sizeof(double*));
*r_re0 = malloc(2*sizeof(double*));
*r_im0 = malloc(2*sizeof(double*));
char buffer[100];
int j=0;
for (i=0;i<2;i++) {
sprintf(buffer,"/tmp/s_re_%d_%d.bin",id,i);
fd[j] = open(buffer, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
result = lseek(fd[j], FILESIZE-1, SEEK_SET);
result = write(fd[j], "", 1);
(*s_re)[i] = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd[j], 0);
j++;
sprintf(buffer,"/tmp/s_im_%d_%d.bin",id,i);
fd[j] = open(buffer, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
result = lseek(fd[j], FILESIZE-1, SEEK_SET);
result = write(fd[j], "", 1);
(*s_im)[i] = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd[j], 0);
j++;
sprintf(buffer,"/tmp/r_re_%d_%d.bin",id,i);
fd[j] = open(buffer, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
result = lseek(fd[j], FILESIZE-1, SEEK_SET);
result = write(fd[j], "", 1);
(*r_re)[i] = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd[j], 0);
j++;
sprintf(buffer,"/tmp/r_im_%d_%d.bin",id,i);
fd[j] = open(buffer, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
result = lseek(fd[j], FILESIZE-1, SEEK_SET);
result = write(fd[j], "", 1);
(*r_im)[i] = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd[j], 0);
j++;
}
for (i=0;i<2;i++) {
(*r_re0)[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero((*r_re0)[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
(*r_im0)[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero((*r_im0)[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
}
}
*/
+24
View File
@@ -0,0 +1,24 @@
/*
* channel_sim_proc.h
*
*/
#ifndef CHANNEL_SIM_PROC_H_
#define CHANNEL_SIM_PROC_H_
void mmap_enb(int id,int **tx_data[3],int **rx_data[3],LTE_DL_FRAME_PARMS *frame_parms);
void mmap_ue(int id,int ***tx_data,int ***rx_data,LTE_DL_FRAME_PARMS *frame_parms);
void Clean_Param(double **r_re,double **r_im,LTE_DL_FRAME_PARMS *frame_parms);
void do_DL_sig_channel_T(void *param);
void do_UL_sig_channel_T(void *param);
void init_rre(LTE_DL_FRAME_PARMS *frame_parms,double ***r_re0,double ***r_im0);
void Channel_Out(lte_subframe_t direction,int eNB_id,int UE_id,double **r_re,double **r_im,double **r_re0,double **r_im0,LTE_DL_FRAME_PARMS *frame_parms);
#endif /* CHANNEL_SIM_PROC_H_ */
+67
View File
@@ -0,0 +1,67 @@
#ifndef __INTERFACE_H__
# define __INTERFACE_H__
typedef struct {
void* pointer;
} memory_reference_t2;
typedef struct {
memory_reference_t2 mem_ref;
}obj_ref_t2;
typedef struct{
obj_ref_t2 *gm;
}HO;
typedef struct {
void* pointer;
int port;
int Exec_Msg_Flag;
int node_id;
int node_role ;
int next_slot;
int last_slot;
int frame;
int sub_frame;
int slot;
int Exec_FLAG;
int EResp_FLAG;
int ue_id;
}s_t;
HO Instance[3];
typedef struct{
int thread_id;
int eNB_id;
int UE_id;
double **s_re;
double **s_im;
double **r_re;
double **r_im;
double **r_re0;
double **r_im0;
struct channel_desc_t *eNB2UE;
struct channel_desc_t *UE2eNB;
struct node_desc_t *enb_data;
struct node_desc_t *ue_data;
int *next_slot;
int *abstraction_flag;
struct LTE_DL_FRAME_PARMS *frame_parms;
int **tx_data[3];
int **rx_data[3];
}ch_thread;
#define CHANNEL_PORT 37800
#define eNB_PORT 38800
#define UE_PORT 39800
#define MAX_eNB 20
#define MAX_UE 20
#endif
+436
View File
@@ -0,0 +1,436 @@
CC = gcc
MPICC = gcc #mpicc
CPUFLAGS = -mmmx -msse -msse2 -msse4.1 -march=native
# FORCE ssse3 for compilation of openair on User Mode Linux
CPUFLAGS += $(shell if grep --silent ssse3 /proc/cpuinfo ; then echo "-mssse3" ; else if grep --silent User\ Mode\ Linux /proc/cpuinfo ; then echo "-mssse3" ; else echo ""; fi; fi)
CPUFLAGS += $(shell if grep --silent sse4 /proc/cpuinfo ; then echo "-msse4" ; else echo ""; fi)
linux = $(shell if [ `uname` = "Linux" ] ; then echo "1" ; else echo "0" ; fi)
NUM_CORES=$(shell cat /proc/cpuinfo | grep processor | wc -l)
TOP_DIR = $(OPENAIR1_DIR)
OPENAIR1_TOP = $(OPENAIR1_DIR)
OPENAIR2_TOP = $(OPENAIR2_DIR)
OPENAIR3_TOP = $(OPENAIR3_DIR)
OPENAIR3 = $(OPENAIR3_DIR)
CFLAGS = -Wall -fno-strict-aliasing -DUSER_MODE -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -g -ggdb $(CPUFLAGS) -I/usr/include/X11 #-Wno-packed-bitfield-compat
# Check if GCC version is greater or equal to 4.4
GCCVERSIONGTEQ44 := $(shell expr `gcc -dumpversion | cut -f1,2 -d. --output-delimiter=""` \>= 44)
ifeq "$(GCCVERSIONGTEQ44)" "1"
CFLAGS += -Wno-packed-bitfield-compat
endif
ASN1_MSG_INC = $(OPENAIR2_DIR)/RRC/LITE/MESSAGES
CFLAGS += -DOPENAIR_LTE -DPUCCH #-DOFDMA_ULSCH -DIFFT_FPGA -DIFFT_FPGA_UE
CFLAGS += -DMAC_CONTEXT=1 -DPHY_CONTEXT=1 -DPHY_ABSTRACTION #-DPHY_ABSTRACTION_UL #-DRLC_UM_TEST_TRAFFIC=1
CFLAGS += -DNEW_FFT
#CFLAGS += -DLLR8
ifndef OPENAIR2
OPENAIR2=1
endif
ifndef OPENAIR_EMU
export OPENAIR_EMU=1
endif
ifdef EMOS
CFLAGS+=-DEMOS
endif
ifdef TRAFFIC_TM5
CFLAGS += -DRLC_UM_TEST_TRAFFIC=1 #-DFULL_BUFFER=1
endif
# activate OCG and libxml only under linux
ifeq ($(linux),1)
CFLAGS += -I/usr/include/libxml2 -L/usr/local/lib -I/usr/include/atlas -L/usr/X11R6/lib
OCG_FLAG = 1
cygwin=0
CFLAGS += -DLINUX
else
cygwin=1
OCG_FLAG = 0
endif
ifdef SMBV
CFLAGS += -DSMBV
endif
ifdef XFORMS
CFLAGS += -DXFORMS
endif
ifdef PRINT_STATS
CFLAGS += -DPRINT_STATS
endif
ifndef rrc_cellular
rrc_cellular = 0
rrc_cellular_eNB = 0
rrc_cellular_UE = 0
else
ifeq ($(eNB_flag),1)
rrc_cellular_eNB=1
endif
ifeq ($(UE_flag),1)
rrc_cellular_UE=1
endif
endif
ifdef DEBUG_PHY
CFLAGS += -DDEBUG_PHY
endif
ifdef JF
CFLAGS += -DJUMBO_FRAME
endif
ifdef LS
CFLAGS += -DLARGE_SCALE
endif
# ln -sf EUTRA-RRC-Definitions-a20.asn EUTRA-RRC-Definitions.asn
# make cleanasn1
#make all Rel10=1
#export IS_REL10=$(shell if [ -f $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/asn1c/ASN1_files/.lock-rel10 ] ; then echo "1" ; else echo "0" ; fi)
#export IS_REL8=$(shell if [ -f $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/asn1c/ASN1_files/.lock-rel8 ] ; then echo "1" ; else echo "0" ; fi)
ifdef CBA
CFLAGS += -DRel10
CFLAGS += -DCBA
@echo "Rel10=1 CBA=1"
else ifdef Rel10
CFLAGS += -DRel10
@echo "Rel10=1"
#ifeq ($(IS_REL10), 0)
# $(/bin/bash cd $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/asn1c/ASN1_files/ ; rm EUTRA-RRC-Definitions.asn ln -s EUTRA-RRC-Definitions-a20.asn EUTRA-RRC-Definitions.asn ; cd $(OPENAIR_TARGETS)/SIMU/USER/ ; rm -f $(ASN1_MSG_OBJS1) ; rm -f $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/Makefile.inc.generated ; rm -f $(L2_OBJS) ; rm -f *.o ; rm -f oaisim ; rm -f oaisim_pad; touch $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/asn1c/ASN1_files/.lock-rel10 ; rm $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/asn1c/ASN1_files/.lock-rel8 ; $(OPENAIR_TARGETS)/SCRIPTS/asn1_generate_rrc_messaging_c_code.bash )
#endif
else # default is rel 8
@echo "Rel8=1"
CFLAGS += -DRel8
#ifeq ($(IS_REL8), 0)
# $(/bin/bash cd $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/asn1c/ASN1_files/ ; rm EUTRA-RRC-Definitions.asn ln -s EUTRA-RRC-Definitions-86.asn EUTRA-RRC-Definitions.asn ; cd $(OPENAIR_TARGETS)/SIMU/USER/ ; rm -f $(ASN1_MSG_OBJS1) ; rm -f $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/Makefile.inc.generated ; rm -f $(L2_OBJS); rm -f *.o ; rm -f oaisim ; touch $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/asn1c/ASN1_files/.lock-rel8 ; rm $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/asn1c/ASN1_files/.lock-rel10 ; $(OPENAIR_TARGETS)/SCRIPTS/asn1_generate_rrc_messaging_c_code.bash )
#endif
endif
ifeq ($(NAS), 1)
CFLAGS += -DNAS_NETLINK -DLINUX
NAS_FLAG=1
endif
ifdef TEST_OMG
CFLAGS += -DTEST_OMG
#CFLAGS += -DDEBUG_OMG
endif
# after the execution, a profiling output "gmon.out" will be created,
#then we need to run "gprof ./oaisim > gmon.txt" in the same directory as "gmon.out"
# you could also use the script "grpof2dot.py gmon.txt" for visual diagrams
ifdef GPROF
CFLAGS += -pg
endif
#require kernel patch for oai driver to enable address autoconfiguration (IPv6 only)
ifdef ADDCONF
CFLAGS+=-DADDRCONF
endif
ifdef OAI_NW_DRIVER_TYPE_ETHERNET
CFLAGS+=-DOAI_NW_DRIVER_TYPE_ETHERNET
endif
CFLAGS += $(shell if [ `uname -o` = "Cygwin" ] ; then echo "-DCYGWIN" ;fi)
CFLAGS += -DENABLE_FXP -DOAI_EMU -DENABLE_USE_CPU_EXECUTION_TIME -DXER_PRINT
ifneq ($(USE_MME), R8)
UPDATE_RELEASE_9=1
endif
include $(OPENAIR1_DIR)/PHY/Makefile.inc
include $(OPENAIR1_DIR)/SCHED/Makefile.inc
include $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/Makefile.inc
include $(OPENAIR2_DIR)/LAYER2/Makefile.inc
include $(OPENAIR1_DIR)/SIMULATION/ETH_TRANSPORT/Makefile.inc
include $(OPENAIR2_DIR)/RRC/NAS/Makefile.inc
include $(OPENAIR2_DIR)/UTIL/Makefile.inc
include $(OPENAIR2_DIR)/S1AP/Makefile.inc
include $(OPENAIR2_DIR)/S1AP/MESSAGES/Makefile.inc
#LOG_OBJS += $(LOG_DIR)/vcd_signal_dumper.o
#LOG_OBJS += $(LOG_DIR)/log.o
CFLAGS += -DENB_MODE
S1AP_BUILT_OBJS=
ifdef USE_MME
CFLAGS += -DENABLE_USE_MME
CFLAGS_S1AP += -DENB_MODE -DENABLE_USE_MME -DEMIT_ASN_DEBUG=1 -DUSER_MODE
S1AP_BUILT_OBJS += $(S1AP_OBJS) $(addprefix $(OPENAIR2_DIR)/S1AP/MESSAGES/, $(S1AP_ASN_MODULE_SOURCES))
endif
SIMULATION_OBJS = $(TOP_DIR)/SIMULATION/TOOLS/gauss.o
SIMULATION_OBJS += $(TOP_DIR)/SIMULATION/TOOLS/random_channel.o
SIMULATION_OBJS += $(TOP_DIR)/SIMULATION/TOOLS/rangen_double.o
SIMULATION_OBJS += $(TOP_DIR)/SIMULATION/TOOLS/taus.o
SIMULATION_OBJS += $(TOP_DIR)/SIMULATION/TOOLS/multipath_channel.o
SIMULATION_OBJS += $(TOP_DIR)/SIMULATION/TOOLS/abstraction.o
SIMULATION_OBJS += $(TOP_DIR)/SIMULATION/RF/rf.o
SIMULATION_OBJS += $(TOP_DIR)/SIMULATION/RF/adc.o
SIMULATION_OBJS += $(TOP_DIR)/SIMULATION/RF/dac.o
ASN1_MSG_OBJS1=$(addprefix $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/, $(ASN1_MSG_OBJS))
#L2_OBJS =
#EXTRA_CFLAGS =
OAISIM_OBJS = channel_sim.o
OAISIM_OBJS += init_lte.o
OAISIM_OBJS += oaisim_config.o
OAISIM_OBJS += sinr_sim.o
OAISIM_OBJS += cor_SF_sim.o
#OAISIM_OBJS += phy_procedures_sim_form.o
OAISIM_OBJS += oaisim_functions.o
ifdef XFORMS
TOOLS_OBJS += $(OPENAIR1_DIR)/PHY/TOOLS/lte_phy_scope.o
endif
ifdef PAD
CFLAGS += -DPAD
endif
OAISIM_PAD_OBJS = discrete_event_generator.o
OAISIM_PAD_OBJS += threadpool.o
#deactivate the log offloading
ifndef LOG_THREAD
CFLAGS +=-DLOG_NO_THREAD
endif
ifdef PROC
INT_OBJS +=$(OPENAIR_TARGETS)/SIMU/PROC/channel_sim_proc.o
INT_OBJS +=$(OPENAIR_TARGETS)/SIMU/PROC/Process.o
CFLAGS +=-DPROC
endif
CFLAGS += -DENABLE_VCD_FIFO
# CFLAGS += -DENABLE_LOG_FIFO
OBJ = $(PHY_OBJS) $(SIMULATION_OBJS) $(ETHERNET_TRANSPORT_OBJS) $(TOOLS_OBJS) $(SCHED_OBJS) $(STATS_OBJS) $(OAISIM_OBJS) $(NAS_OBJS) $(INT_OBJS) $(UTIL_OBJ)
ifeq ($(OPENAIR2),1)
OBJ += $(L2_OBJS)
endif
all: oaisim
pad: oaisim_pad
userclean: cleanall oaisim
printvars:
@echo LINUX variable is $(linux)
@echo CYGWIN variable is $(cygwin)
@echo rrc_cellular variable is $(rrc_cellular)
@echo EXTRA_CFLAGS = $(EXTRA_CFLAGS)
@echo OAI Config generator is $(OCG_FLAG)
@echo OAI NETLINK FLAG is $(NAS_FLAG)
@echo SSE3 proc is $(SSE3PROC)
@echo L2 objs are $(L2_OBJS)
@echo eNB_flag is $(eNB_flag)
@echo UE_flag is $(UE_flag)
@echo $(S1AP_BUILT_OBJS)
ASN1RELDIR=R9.8
ifeq ($(USE_MME), R8)
ASN1RELDIR=R8.10
else
CFLAGS_S1AP += -DUPDATE_RELEASE_9
endif
S1AP_DIR=$(OPENAIR2_DIR)/S1AP
ASN1MESSAGESDIR=$(S1AP_DIR)/MESSAGES
ASN1DIR=$(ASN1MESSAGESDIR)/ASN1
-include $(OBJ:.o=.d)
-include $(ASN1_MSG_OBJS1:.o=.d)
$(OBJ) $(OAISIM_PAD_OBJS) $(ASN1_MSG_OBJS1) : %.o : %.c
@echo Compiling $<
@$(CC) -c $(CFLAGS) $(EXTRA_CFLAGS) -DPHY_CONTEXT=1 -I$(TOP_DIR) $(L2_incl) $(UTIL_incl) -I$(ASN1_MSG_INC) -o $@ $<
@$(CC) -MM $(CFLAGS) $(EXTRA_CFLAGS) -DPHY_CONTEXT=1 -I$(TOP_DIR) $(L2_incl) $(UTIL_incl) -I$(ASN1_MSG_INC) $*.c > $*.d
@mv -f $*.d $*.d.tmp
@sed -e 's|.*:|$*.o:|' < $*.d.tmp > $*.d
@sed -e 's/.*://' -e 's/\\$$//' < $*.d.tmp | fmt -1 | \
sed -e 's/^ *//' -e 's/$$/:/' >> $*.d
@rm -f $*.d.tmp
$(S1AP_BUILT_OBJS): %.o : %.c
@echo Compiling $<
@$(CC) -Wall -c $(CFLAGS_S1AP) $(S1AP_Incl) $(UTIL_incl) -o $@ $<
$(ASN1MESSAGESDIR)/s1ap_ieregen.stamp: $(ASN1DIR)/$(ASN1RELDIR)/S1AP-PDU-Contents.asn $(ASN1DIR)/asn1tostruct.py
echo Timestamp > $@
(cd $(ASN1DIR) && python $(ASN1DIR)/asn1tostruct.py -f$<)
$(ASN1MESSAGESDIR)/s1ap_asn1regen.stamp: $(ASN1DIR)/$(ASN1RELDIR)/S1AP-CommonDataTypes.asn $(ASN1DIR)/$(ASN1RELDIR)/S1AP-Constants.asn $(ASN1DIR)/$(ASN1RELDIR)/S1AP-IEs.asn $(ASN1DIR)/$(ASN1RELDIR)/S1AP-PDU.asn
echo Timestamp > $@
(cd $(ASN1MESSAGESDIR) && asn1c -gen-PER -fnative-types -fskeletons-copy $^)
$(S1AP_DIR)/libs1ap.a: $(ASN1MESSAGESDIR)/s1ap_ieregen.stamp $(ASN1MESSAGESDIR)/s1ap_asn1regen.stamp $(S1AP_BUILT_OBJS)
@echo Creating $@
$(AR) rcs $@ $^
$(LFDS_DIR)/bin/liblfds611.a:
$(MAKE) -C $(LFDS_DIR) -f makefile.linux
oaisim_pad : $(OBJ) $(OAISIM_PAD_OBJS) $(ASN1_MSG_OBJS1) oaisim_pad.c
@echo "Compiling oaisim_pad.c ..."
@$(MPICC) -I$(TOP_DIR) $(L2_incl) $(UTIL_incl) -I$(ASN1_MSG_INC) $(S1AP_Incl) -o oaisim_pad $(CFLAGS) $(EXTRA_CFLAGS) $^ \
-lm -lblas -lpthread -llapack_atlas -lforms -lxml2 -lX11 -lXpm -lrt
ifdef USE_MME
oaisim : $(ASN1_MSG_OBJS1) $(OBJ) $(S1AP_DIR)/libs1ap.a oaisim.c $(LFDS_DIR)/bin/liblfds611.a
else
oaisim : $(ASN1_MSG_OBJS1) $(OBJ) oaisim.c $(LFDS_DIR)/bin/liblfds611.a
endif
@echo "Compiling oaisim.c ..."
@$(CC) -I$(TOP_DIR) $(L2_incl) $(UTIL_incl) -I$(ASN1_MSG_INC) $(S1AP_Incl) -o oaisim $(CFLAGS) $(EXTRA_CFLAGS) $^ \
-lm -lblas -lpthread -llapack_atlas -lforms -lxml2 -lX11 -lXpm -lrt $(LFDS_DIR)/bin/liblfds611.a
ifeq ($(rrc_cellular_eNB),1)
mv oaisim oaisim_eNB
endif
ifeq ($(rrc_cellular_UE),1)
mv oaisim oaisim_UE
endif
oaisimCROWN : $(OBJ) $(ASN1_MSG_OBJS1) oaisimCROWN.c
@echo "Compiling oaisimCROWN.c ..."
@$(CC) oaisimCROWN.c -I$(TOP_DIR) $(L2_incl) $(UTIL_incl) -I$(ASN1_MSG_INC) $(S1AP_Incl) -o oaisimCROWN $(CFLAGS) $(EXTRA_CFLAGS) $(OBJ) $(ASN1_MSG_OBJS1) -lm -lblas -lpthread -llapack_atlas -lforms -lxml2 -lX11 -lXpm -lrt
test_nasmesh_fix:
(cd $(OPENAIR2_DIR)/NAS/DRIVER/MESH/RB_TOOL && make)
(cd $(OPENAIR2_DIR) && make nasmesh_netlink_address_fix.ko)
(cp $(OPENAIR2_DIR)/NAS/DRIVER/MESH/nasmesh.ko . )
nasmesh_fix:
(cd $(OPENAIR2_DIR)/NAS/DRIVER/MESH/RB_TOOL && make)
(cd $(OPENAIR2_DIR) && make nasmesh_netlink_address_fix.ko)
(sudo insmod $(OPENAIR2_DIR)/NAS/DRIVER/MESH/nasmesh.ko)
nasmesh_nl:
(cd $(OPENAIR2_DIR)/NAS/DRIVER/MESH/RB_TOOL && make)
(cd $(OPENAIR2_DIR) && make nasmesh_netlink.ko)
(sudo insmod $(OPENAIR2_DIR)/NAS/DRIVER/MESH/nasmesh.ko)
rb_tool:
(cd $(OPENAIR2_DIR)/NAS/DRIVER/MESH/RB_TOOL && make)
nasmesh_install:
(sudo rmmod nasmesh)
(sudo insmod $(OPENAIR2_DIR)/NAS/DRIVER/MESH/nasmesh.ko)
nas_sim_mt_cellular:
( cd $(OPENAIR2_DIR)/NAS/SIMU_CELLULAR && make nasmt_sim CELLULAR=1 NO_RRM=1)
nas_sim_rg_cellular:
( cd $(OPENAIR2_DIR)/NAS/SIMU_CELLULAR && make nasrg_sim MASTER=1 CELLULAR=1 NO_RRM=1)
rrm_std_cellular:
( cd $(OPENAIR2_DIR)/NAS/SIMU_CELLULAR && make cell_rrm CELL_RRM=1 CELLULAR=1 NO_RRM=1)
cleanall: clean cleanasn1 cleanmmeasn1
clean:
$(MAKE) -C $(LFDS_DIR) -f makefile.linux clean
rm -f oaisim
rm -f oaisim_pad
rm -f $(OBJ)
rm -f $(S1AP_BUILT_OBJS)
rm -f $(ASN1MESSAGESDIR)/libs1ap.a
rm -f *.o
rm -f *.exe*
rm -f $(ASN1_MSG_INC)/asn1_msg.o
rm -f $(OBJ:.o=.d) $(ASN1_MSG_OBJS1:.o=.d)
cleanl1:
rm -f oaisim
rm -f $(PHY_OBJS) $(SCHED_OBJS)
rm -f *.o
rm -f *.exe
cleanl2:
rm -f $(L2_OBJS)
rm $(ASN1_MSG_INC)/asn1_msg.o
cleanasn1:
rm -f $(ASN1_MSG_OBJS1)
$(shell cd $(OPENAIR2_DIR)/RRC/LITE/MESSAGES ; rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) *.o *.d )
rm -f $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/Makefile.am.sample
rm -f $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/Makefile.inc.generated
rm -f $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/asn1c/ASN1_files/.lock-rel10
rm -f $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/asn1c/ASN1_files/.lock-rel8
cleanmmeasn1:
rm -f $(S1AP_BUILT_OBJS)
rm -f $(S1AP_BUILT_OBJS:.o:.c)
rm -f $(ASN1MESSAGESDIR)/libs1ap.a
rm -f $(ASN1MESSAGESDIR)/s1ap_asn1regen.stamp
rm -f $(ASN1MESSAGESDIR)/s1ap_ieregen.stamp
cleancell:
rm -f $(OPENAIR2_DIR)/RRC/CELLULAR/*.o
rm -f $(OPENAIR2_DIR)/RRC/CELLULAR/*.d
rm -f $(OPENAIR2_DIR)/RRC/L2_INTERFACE/*.o
rm -f $(OPENAIR2_DIR)/RRC/L2_INTERFACE/*.d
rm -f $(OPENAIR2_DIR)/NAS/SIMU_CELLULAR/*.o
rm -f $(OPENAIR2_DIR)/NAS/SIMU_CELLULAR/*.d
print:
@echo $(cygwin)
@echo $(OCG_FLAG)
@echo $(CFLAGS)
@echo $(EXTRA_CFLAGS)
@echo $(OBJ)
@echo $(IS_REL10)
@echo $(IS_REL8)
showcflags:
@echo $(CFLAGS)
otg_all : otg_latency otg_gp
# need to check if the file exists before calling otgplot
otg_latency:
export TITLE="Application OWD(ms)"
cp /tmp/otg_latency.dat /tmp/onewaydelay.dat
$(OPENAIR2_DIR)/UTIL/OTG/OTGplot "/tmp/otg_latency.dat" "[$(COL1):$(COL2)]"
otg_latency_bg:
export TITLE="Background OWD(ms)"
$(OPENAIR2_DIR)/UTIL/OTG/OTGplot "/tmp/otg_latency_bg.dat" "[$(COL1):$(COL2)]"
otg_gp:
export TITLE="Application Goodput(Kb/s)"
cp /tmp/otg_GP.dat /tmp/goodput.dat
$(OPENAIR2_DIR)/UTIL/OTG/OTGplot "/tmp/goodput.dat" "[$(COL1):$(COL2)]"
otg_gp_bg:
export TITLE="Background Goodput(Kb/s)"
$(OPENAIR2_DIR)/UTIL/OTG/OTGplot "/tmp/otg_GP_bg.dat" "[$(COL1):$(COL2)]"
pexpect = $(shell if [ `dpkg -l | grep pexpect -c` = "0" ]; then echo "0" ; else echo "1" ; fi )
pre-ci:
@echo "Pre-commit check"
ifeq ($(pexpect), 1)
ifndef PW
@echo "Usage: make pre-ci PW=mypassword"
@echo "Password is used to access the local host through ssh."
python $(OPENAIR_TARGETS)/TEST/OAI/test01.py
else
python $(OPENAIR_TARGETS)/TEST/OAI/test01.py -w $(PW)
endif
else
@echo "Python pexpect package is missing, please install"
endif
+665
View File
@@ -0,0 +1,665 @@
#include <string.h>
#include <math.h>
#include <unistd.h>
#include <stdint.h>
#include <stdio.h>
#include <time.h>
#include "SIMULATION/TOOLS/defs.h"
#include "SIMULATION/RF/defs.h"
#include "PHY/types.h"
#include "PHY/defs.h"
#include "PHY/extern.h"
#include "MAC_INTERFACE/extern.h"
#ifdef OPENAIR2
#include "LAYER2/MAC/defs.h"
#include "LAYER2/MAC/extern.h"
#include "UTIL/LOG/log_if.h"
#include "UTIL/LOG/log_extern.h"
#include "RRC/LITE/extern.h"
#include "PHY_INTERFACE/extern.h"
#include "UTIL/OCG/OCG.h"
#include "UTIL/OPT/opt.h" // to test OPT
#endif
#include "ARCH/CBMIMO1/DEVICE_DRIVER/extern.h"
#include "UTIL/FIFO/types.h"
#ifdef IFFT_FPGA
#include "PHY/LTE_REFSIG/mod_table.h"
#endif
#include "SCHED/defs.h"
#include "SCHED/extern.h"
#ifdef XFORMS
#include "forms.h"
#include "phy_procedures_sim_form.h"
#endif
#include "oaisim.h"
#define RF
//#define DEBUG_SIM
int number_rb_ul;
int first_rbUL ;
extern Signal_buffers *signal_buffers_g;
void do_OFDM_mod(mod_sym_t **txdataF, s32 **txdata, uint32_t frame,u16 next_slot, LTE_DL_FRAME_PARMS *frame_parms) {
int aa, slot_offset, slot_offset_F;
slot_offset_F = (next_slot)*(frame_parms->ofdm_symbol_size)*((frame_parms->Ncp==1) ? 6 : 7);
slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1);
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
if (is_pmch_subframe(frame,next_slot>>1,frame_parms)) {
if ((next_slot%2)==0) {
printf("MBSFN eNB sim: Frame %d, subframe %d: Doing MBSFN modulation (slot_offset %d)\n",frame,next_slot>>1,slot_offset);
PHY_ofdm_mod(&txdataF[aa][slot_offset_F], // input
&txdata[aa][slot_offset], // output
frame_parms->log2_symbol_size, // log2_fft_size
12, // number of symbols
frame_parms->ofdm_symbol_size>>2, // number of prefix samples
frame_parms->twiddle_ifft, // IFFT twiddle factors
frame_parms->rev, // bit-reversal permutation
CYCLIC_PREFIX);
if (frame_parms->Ncp == EXTENDED)
PHY_ofdm_mod(&txdataF[aa][slot_offset_F], // input
&txdata[aa][slot_offset], // output
frame_parms->log2_symbol_size, // log2_fft_size
2, // number of symbols
frame_parms->nb_prefix_samples, // number of prefix samples
frame_parms->twiddle_ifft, // IFFT twiddle factors
frame_parms->rev, // bit-reversal permutation
CYCLIC_PREFIX);
else {
printf("MBSFN eNB sim: Frame %d, subframe %d: Doing PDCCH modulation\n",frame,next_slot>>1);
normal_prefix_mod(&txdataF[aa][slot_offset_F],
&txdata[aa][slot_offset],
2,
frame_parms);
}
}
}
else {
if (frame_parms->Ncp == EXTENDED)
PHY_ofdm_mod(&txdataF[aa][slot_offset_F], // input
&txdata[aa][slot_offset], // output
frame_parms->log2_symbol_size, // log2_fft_size
6, // number of symbols
frame_parms->nb_prefix_samples, // number of prefix samples
frame_parms->twiddle_ifft, // IFFT twiddle factors
frame_parms->rev, // bit-reversal permutation
CYCLIC_PREFIX);
else {
normal_prefix_mod(&txdataF[aa][slot_offset_F],
&txdata[aa][slot_offset],
7,
frame_parms);
}
}
}
}
void do_DL_sig(double **r_re0,double **r_im0,
double **r_re,double **r_im,
double **s_re,double **s_im,
channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX],
node_desc_t *enb_data[NUMBER_OF_eNB_MAX],
node_desc_t *ue_data[NUMBER_OF_UE_MAX],
u16 next_slot,u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,
u8 UE_id) {
s32 att_eNB_id=-1;
s32 **txdata,**rxdata;
u8 eNB_id=0;
double tx_pwr, rx_pwr;
s32 rx_pwr2;
u32 i,aa;
u32 slot_offset,slot_offset_meas;
double min_path_loss=-200;
u8 hold_channel=0;
// u8 aatx,aarx;
u8 nb_antennas_rx = eNB2UE[0][0]->nb_rx; // number of rx antennas at UE
u8 nb_antennas_tx = eNB2UE[0][0]->nb_tx; // number of tx antennas at eNB
if (next_slot==0)
hold_channel = 0;
else
hold_channel = 1;
if (abstraction_flag != 0) {
//for (UE_id=0;UE_id<NB_UE_INST;UE_id++) {
// calculate the random channel from each eNB
for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) {
random_channel(eNB2UE[eNB_id][UE_id]);
/*
for (i=0;i<eNB2UE[eNB_id][UE_id]->nb_taps;i++)
printf("eNB2UE[%d][%d]->a[0][%d] = (%f,%f)\n",eNB_id,UE_id,i,eNB2UE[eNB_id][UE_id]->a[0][i].x,eNB2UE[eNB_id][UE_id]->a[0][i].y);
*/
freq_channel(eNB2UE[eNB_id][UE_id], frame_parms->N_RB_DL,frame_parms->N_RB_DL*12+1);
}
// find out which eNB the UE is attached to
for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) {
if (find_ue(PHY_vars_UE_g[UE_id]->lte_ue_pdcch_vars[eNB_id]->crnti,PHY_vars_eNB_g[eNB_id])>=0) {
// UE with UE_id is connected to eNb with eNB_id
att_eNB_id=eNB_id;
LOG_D(OCM,"UE attached to eNB (UE%d->eNB%d)\n",UE_id,eNB_id);
}
}
// if UE is not attached yet, find assume its the eNB with the smallest pathloss
if (att_eNB_id<0) {
for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) {
if (min_path_loss<eNB2UE[eNB_id][UE_id]->path_loss_dB) {
min_path_loss = eNB2UE[eNB_id][UE_id]->path_loss_dB;
att_eNB_id=eNB_id;
LOG_D(OCM,"UE attached to eNB (UE%d->eNB%d)\n",UE_id,eNB_id);
}
}
}
if (att_eNB_id<0) {
LOG_E(OCM,"Cannot find eNB for UE %d, return\n",UE_id);
return; //exit(-1);
}
rx_pwr = signal_energy_fp2(eNB2UE[att_eNB_id][UE_id]->ch[0],
eNB2UE[att_eNB_id][UE_id]->channel_length)*eNB2UE[att_eNB_id][UE_id]->channel_length;
LOG_D(OCM,"Channel eNB %d => UE %d : tx_power %d dBm, path_loss %f dB\n",
att_eNB_id,UE_id,
PHY_vars_eNB_g[att_eNB_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower,
eNB2UE[att_eNB_id][UE_id]->path_loss_dB);
//dlsch_abstraction(PHY_vars_UE_g[UE_id]->sinr_dB, rb_alloc, 8);
// fill in perfect channel estimates
channel_desc_t *desc1 = eNB2UE[att_eNB_id][UE_id];
s32 **dl_channel_est = PHY_vars_UE_g[UE_id]->lte_ue_common_vars.dl_ch_estimates[0];
// double scale = pow(10.0,(enb_data[att_eNB_id]->tx_power_dBm + eNB2UE[att_eNB_id][UE_id]->path_loss_dB + (double) PHY_vars_UE_g[UE_id]->rx_total_gain_dB)/20.0);
double scale = pow(10.0,(PHY_vars_eNB_g[att_eNB_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower+eNB2UE[att_eNB_id][UE_id]->path_loss_dB + (double) PHY_vars_UE_g[UE_id]->rx_total_gain_dB)/20.0);
scale = scale * sqrt(512.0/300.0); //TODO: make this variable for all BWs
LOG_D(OCM,"scale =%lf (%d dB)\n",scale,(int) (20*log10(scale)));
// freq_channel(desc1,frame_parms->N_RB_DL,nb_samples);
//write_output("channel.m","ch",desc1->ch[0],desc1->channel_length,1,8);
//write_output("channelF.m","chF",desc1->chF[0],nb_samples,1,8);
int count,count1,a_rx,a_tx;
for(a_tx=0;a_tx<nb_antennas_tx;a_tx++)
{
for (a_rx=0;a_rx<nb_antennas_rx;a_rx++)
{
//for (count=0;count<frame_parms->symbols_per_tti/2;count++)
for (count=0;count<1;count++)
{
for (count1=0;count1<frame_parms->N_RB_DL*12;count1++)
{
((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count1+(count*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(s16)(desc1->chF[a_rx+(a_tx*nb_antennas_rx)][count1].x*scale);
((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count1+1+(count*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(s16)(desc1->chF[a_rx+(a_tx*nb_antennas_rx)][count1].y*scale) ;
}
}
}
}
if(PHY_vars_UE_g[UE_id]->transmission_mode[att_eNB_id]>=5)
{
/* lte_ue_measurements(PHY_vars_UE_g[UE_id],
((next_slot-1)>>1)*frame_parms->samples_per_tti,
1,
abstraction_flag);
*/
PHY_vars_eNB_g[att_eNB_id]->dlsch_eNB[0][0]->pmi_alloc = quantize_subband_pmi(&PHY_vars_UE_g[UE_id]->PHY_measurements,0);
// printf("pmi_alloc in channel sim: %d",PHY_vars_eNB_g[att_eNB_id]->dlsch_eNB[0][0]->pmi_alloc);
}
// calculate the SNR for the attached eNB
init_snr(eNB2UE[att_eNB_id][UE_id], enb_data[att_eNB_id], ue_data[UE_id], PHY_vars_UE_g[UE_id]->sinr_dB, &PHY_vars_UE_g[UE_id]->N0, PHY_vars_UE_g[UE_id]->transmission_mode[att_eNB_id], PHY_vars_eNB_g[att_eNB_id]->dlsch_eNB[UE_id][0]->pmi_alloc,PHY_vars_eNB_g[att_eNB_id]->mu_mimo_mode[UE_id].dl_pow_off);
// calculate sinr here
for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) {
if (att_eNB_id != eNB_id) {
calculate_sinr(eNB2UE[eNB_id][UE_id], enb_data[eNB_id], ue_data[UE_id], PHY_vars_UE_g[UE_id]->sinr_dB);
}
}
//} //UE_id
}
else { //abstraction_flag
/*
Call do_OFDM_mod from phy_procedures_eNB_TX function
*/
for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) {
do_OFDM_mod(PHY_vars_eNB_g[eNB_id]->lte_eNB_common_vars.txdataF[0],
PHY_vars_eNB_g[eNB_id]->lte_eNB_common_vars.txdata[0],
((next_slot==19) ? -1 : 0 ) + PHY_vars_eNB_g[eNB_id]->frame,next_slot,
&PHY_vars_eNB_g[eNB_id]->lte_frame_parms);
}
//for (UE_id=0;UE_id<NB_UE_INST;UE_id++) {
// Compute RX signal for UE = UE_id
/*
for (i=0;i<(frame_parms->samples_per_tti>>1);i++) {
for (aa=0;aa<nb_antennas_rx;aa++) {
r_re[aa][i]=0.0;
r_im[aa][i]=0.0;
}
}
*/
// printf("r_re[0] %p\n",r_re[0]);
for (aa=0;aa<nb_antennas_rx;aa++) {
memset((void*)r_re[aa],0,(frame_parms->samples_per_tti>>1)*sizeof(double));
memset((void*)r_im[aa],0,(frame_parms->samples_per_tti>>1)*sizeof(double));
}
/*
for (i=0;i<16;i++)
printf("%f, %X\n",r_re[aa][i],(unsigned long long)r_re[aa][i]);
*/
for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) {
// if (((double)PHY_vars_UE_g[UE_id]->tx_power_dBm +
// eNB2UE[eNB_id][UE_id]->path_loss_dB) <= -107.0)
// break;
frame_parms = &PHY_vars_eNB_g[eNB_id]->lte_frame_parms;
txdata = PHY_vars_eNB_g[eNB_id]->lte_eNB_common_vars.txdata[0];
slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1);
slot_offset_meas = ((next_slot&1)==0) ? slot_offset : (slot_offset-(frame_parms->samples_per_tti>>1));
tx_pwr = dac_fixed_gain(s_re,
s_im,
txdata,
slot_offset,
nb_antennas_tx,
frame_parms->samples_per_tti>>1,
slot_offset_meas,
frame_parms->ofdm_symbol_size,
14,
// enb_data[eNB_id]->tx_power_dBm);
PHY_vars_eNB_g[eNB_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower);
#ifdef DEBUG_SIM
LOG_D(OCM,"eNB %d: tx_pwr %f dBm, for slot %d (subframe %d)\n",
eNB_id,
10*log10(tx_pwr),
next_slot,
next_slot>>1);
#endif
//eNB2UE[eNB_id][UE_id]->path_loss_dB = 0;
multipath_channel(eNB2UE[eNB_id][UE_id],s_re,s_im,r_re0,r_im0,
frame_parms->samples_per_tti>>1,hold_channel);
#ifdef DEBUG_SIM
rx_pwr = signal_energy_fp2(eNB2UE[eNB_id][UE_id]->ch[0],
eNB2UE[eNB_id][UE_id]->channel_length)*eNB2UE[eNB_id][UE_id]->channel_length;
LOG_D(OCM,"Channel eNB %d => UE %d : Channel gain %f dB (%f)\n",eNB_id,UE_id,10*log10(rx_pwr),rx_pwr);
#endif
#ifdef DEBUG_SIM
for (i=0;i<eNB2UE[eNB_id][UE_id]->channel_length;i++)
printf("ch(%d,%d)[%d] : (%f,%f)\n",eNB_id,UE_id,i,eNB2UE[eNB_id][UE_id]->ch[0][i]);
#endif
LOG_D(OCM,"[SIM][DL] Channel eNB %d => UE %d : tx_power %f dBm, path_loss %f dB\n",
eNB_id,UE_id,
(double)PHY_vars_eNB_g[eNB_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower,
// enb_data[eNB_id]->tx_power_dBm,
eNB2UE[eNB_id][UE_id]->path_loss_dB);
#ifdef DEBUG_SIM
rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx,512,0);
printf("[SIM][DL] UE %d : rx_pwr %f dBm for slot %d (subframe %d)\n",UE_id,10*log10(rx_pwr),next_slot,next_slot>>1);
#endif
if (eNB2UE[eNB_id][UE_id]->first_run == 1)
eNB2UE[eNB_id][UE_id]->first_run = 0;
// RF model
#ifdef DEBUG_SIM
LOG_D(OCM,"[SIM][DL] UE %d : rx_gain %d dB for slot %d (subframe %d)\n",UE_id,PHY_vars_UE_g[UE_id]->rx_total_gain_dB,next_slot,next_slot>>1);
#endif
/*
rf_rx(r_re0,
r_im0,
NULL,
NULL,
0,
nb_antennas_rx,
frame_parms->samples_per_tti>>1,
1e3/eNB2UE[eNB_id][UE_id]->BW, // sampling time (ns)
0.0, // freq offset (Hz) (-20kHz..20kHz)
0.0, // drift (Hz) NOT YET IMPLEMENTED
ue_data[UE_id]->rx_noise_level, // noise_figure NOT YET IMPLEMENTED
(double)PHY_vars_UE_g[UE_id]->rx_total_gain_dB - 66.227, // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
200.0, // IP3_dBm (dBm)
&eNB2UE[eNB_id][UE_id]->ip, // initial phase
30.0e3, // pn_cutoff (kHz)
-500.0, // pn_amp (dBc) default: 50
0.0, // IQ imbalance (dB),
0.0); // IQ phase imbalance (rad)
*/
rf_rx_simple(r_re0,
r_im0,
nb_antennas_rx,
frame_parms->samples_per_tti>>1,
1e3/eNB2UE[eNB_id][UE_id]->BW, // sampling time (ns)
(double)PHY_vars_UE_g[UE_id]->rx_total_gain_dB - 66.227); // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx,frame_parms->ofdm_symbol_size,0);
#ifdef DEBUG_SIM
printf("[SIM][DL] UE %d : ADC in (eNB %d) %f dB for slot %d (subframe %d)\n",
UE_id,eNB_id,
10*log10(rx_pwr),next_slot,next_slot>>1);
#endif
for (i=0;i<(frame_parms->samples_per_tti>>1);i++) {
for (aa=0;aa<nb_antennas_rx;aa++) {
r_re[aa][i]+=r_re0[aa][i];
r_im[aa][i]+=r_im0[aa][i];
}
}
}
rx_pwr = signal_energy_fp(r_re,r_im,nb_antennas_rx,frame_parms->ofdm_symbol_size,0);
#ifdef DEBUG_SIM
printf("[SIM][DL] UE %d : ADC in %f dB for slot %d (subframe %d)\n",UE_id,10*log10(rx_pwr),next_slot,next_slot>>1);
#endif
rxdata = PHY_vars_UE_g[UE_id]->lte_ue_common_vars.rxdata;
slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1);
adc(r_re,
r_im,
0,
slot_offset,
rxdata,
nb_antennas_rx,
frame_parms->samples_per_tti>>1,
12);
rx_pwr2 = signal_energy(rxdata[0]+slot_offset,512);
#ifdef DEBUG_SIM
LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr (ADC out) %f dB (%d) for slot %d (subframe %d), writing to %p\n",UE_id, 10*log10((double)rx_pwr2),rx_pwr2,next_slot,next_slot>>1,rxdata);
#endif
//}// UE_index loop
}
}
void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX],node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],u16 next_slot,u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms, u32 frame) {
s32 **txdata,**rxdata;
s32 att_eNB_id=-1;
u8 eNB_id=0,UE_id=0;
u8 nb_antennas_rx = UE2eNB[0][0]->nb_rx; // number of rx antennas at eNB
u8 nb_antennas_tx = UE2eNB[0][0]->nb_tx; // number of tx antennas at UE
double tx_pwr, rx_pwr;
s32 rx_pwr2;
u32 i,aa;
u32 slot_offset,slot_offset_meas;
double min_path_loss=-200;
u16 ul_nb_rb=0 ;
u16 ul_fr_rb=0;
int ulnbrb2 ;
int ulfrrb2 ;
u8 harq_pid;
u8 hold_channel=0;
int subframe = (next_slot>>1);
// u8 aatx,aarx;
if (next_slot==4)
{
hold_channel = 0;
}
#ifdef PHY_ABSTRACTION_UL
if (abstraction_flag!=0)
{
for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++)
{
for (UE_id=0;UE_id<NB_UE_INST;UE_id++)
{
random_channel(UE2eNB[UE_id][eNB_id]);
freq_channel(UE2eNB[UE_id][eNB_id], frame_parms->N_RB_UL,frame_parms->N_RB_UL*12+1);
}
}
for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++)
{
//channel now is ready for uplink,now find out which UEs are connected to you
for (UE_id=0;UE_id<NB_UE_INST;UE_id++)
{
att_eNB_id=0;
// if UE is not attached yet, find assume its the eNB with the smallest pathloss
if (att_eNB_id >= 0)
{
for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++)
{
if (min_path_loss<UE2eNB[UE_id][eNB_id]->path_loss_dB)
{
min_path_loss = UE2eNB[UE_id][eNB_id]->path_loss_dB;
att_eNB_id=eNB_id;
LOG_D(OCM,"UE attached to eNB (UE%d->eNB%d)\n",UE_id,eNB_id);
}
}
}
if (att_eNB_id<0)
{
LOG_E(OCM,"Cannot find eNB for UE %d, return\n",UE_id);
return; //exit(-1);
}
// If the UE is attached to you, perform the uplink / abstraction procedure:
if(att_eNB_id >= 0)
{
//{ // REceived power at the eNB
rx_pwr = signal_energy_fp2(UE2eNB[UE_id][att_eNB_id]->ch[0],
UE2eNB[UE_id][att_eNB_id]->channel_length)*UE2eNB[UE_id][att_eNB_id]->channel_length; // calculate the rx power at the eNB
// write_output("SINRch.m","SINRch",PHY_vars_eNB_g[att_eNB_id]->sinr_dB_eNB,frame_parms->N_RB_UL*12+1,1,1);
if(subframe>1 && subframe <5)
{
harq_pid = subframe2harq_pid(frame_parms,frame,subframe);
ul_nb_rb = PHY_vars_eNB_g[att_eNB_id]->ulsch_eNB[(u8)UE_id]->harq_processes[harq_pid]->nb_rb;
ul_fr_rb = PHY_vars_eNB_g[att_eNB_id]->ulsch_eNB[(u8)UE_id]->harq_processes[harq_pid]->first_rb;
}
if(ul_nb_rb>1 && (ul_fr_rb < 25 && ul_fr_rb > -1))
{
number_rb_ul = ul_nb_rb;
first_rbUL = ul_fr_rb;
init_snr_up(UE2eNB[UE_id][att_eNB_id],enb_data[att_eNB_id], ue_data[UE_id],PHY_vars_eNB_g[att_eNB_id]->sinr_dB,&PHY_vars_UE_g[att_eNB_id]->N0,ul_nb_rb,ul_fr_rb);
}
} // If this UE is attached to you(means perform Uplink abstraction procedure)
} //uE_id
}
}
#else
if (abstraction_flag!=0) {
for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) {
for (UE_id=0;UE_id<NB_UE_INST;UE_id++) {
random_channel(UE2eNB[UE_id][eNB_id]);
freq_channel(UE2eNB[UE_id][eNB_id], frame_parms->N_RB_UL,2);
}
}
}
#endif
else { //without abstraction
/*
for (UE_id=0;UE_id<NB_UE_INST;UE_id++) {
do_OFDM_mod(PHY_vars_UE_g[UE_id]->lte_ue_common_vars.txdataF,PHY_vars_UE_g[UE_id]->lte_ue_common_vars.txdata,next_slot,&PHY_vars_UE_g[UE_id]->lte_frame_parms);
}
*/
for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) {
// Clear RX signal for eNB = eNB_id
for (i=0;i<(frame_parms->samples_per_tti>>1);i++) {
for (aa=0;aa<nb_antennas_rx;aa++) {
r_re[aa][i]=0.0;
r_im[aa][i]=0.0;
}
}
// Compute RX signal for eNB = eNB_id
for (UE_id=0;UE_id<NB_UE_INST;UE_id++){
txdata = PHY_vars_UE_g[UE_id]->lte_ue_common_vars.txdata;
frame_parms = &PHY_vars_UE_g[UE_id]->lte_frame_parms;
slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1);
slot_offset_meas = ((next_slot&1)==0) ? slot_offset : (slot_offset-(frame_parms->samples_per_tti>>1));
if (((double)PHY_vars_UE_g[UE_id]->tx_power_dBm +
UE2eNB[UE_id][eNB_id]->path_loss_dB) <= -125.0) {
// don't simulate a UE that is too weak
}
else {
tx_pwr = dac_fixed_gain(s_re,
s_im,
txdata,
slot_offset,
nb_antennas_tx,
frame_parms->samples_per_tti>>1,
slot_offset_meas,
frame_parms->ofdm_symbol_size,
14,
PHY_vars_UE_g[UE_id]->tx_power_dBm);
//ue_data[UE_id]->tx_power_dBm);
#ifdef DEBUG_SIM
printf("[SIM][UL] UE %d tx_pwr %f dBm (target %d dBm) for slot %d (subframe %d, slot_offset %d, slot_offset_meas %d)\n",UE_id,10*log10(tx_pwr),PHY_vars_UE_g[UE_id]->tx_power_dBm,next_slot,next_slot>>1,slot_offset,slot_offset_meas);
#endif
multipath_channel(UE2eNB[UE_id][eNB_id],s_re,s_im,r_re0,r_im0,
frame_parms->samples_per_tti>>1,hold_channel);
#ifdef DEBUG_SIM
rx_pwr = signal_energy_fp2(UE2eNB[UE_id][eNB_id]->ch[0],
UE2eNB[UE_id][eNB_id]->channel_length)*UE2eNB[UE_id][eNB_id]->channel_length;
printf("[SIM][UL] slot %d Channel UE %d => eNB %d : %f dB (hold %d)\n",next_slot,UE_id,eNB_id,10*log10(rx_pwr),hold_channel);
#endif
#ifdef DEBUG_SIM
rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx,frame_parms->samples_per_tti>>1,0);
printf("[SIM][UL] eNB %d : rx_pwr %f dB (%f) for slot %d (subframe %d), sptti %d\n",
eNB_id,10*log10(rx_pwr),rx_pwr,next_slot,next_slot>>1,frame_parms->samples_per_tti);
#endif
if (UE2eNB[UE_id][eNB_id]->first_run == 1)
UE2eNB[UE_id][eNB_id]->first_run = 0;
for (aa=0;aa<nb_antennas_rx;aa++) {
for (i=0;i<(frame_parms->samples_per_tti>>1);i++) {
r_re[aa][i]+=r_re0[aa][i];
r_im[aa][i]+=r_im0[aa][i];
}
}
}
} //UE_id
// RF model
/*
rf_rx(r_re0,
r_im0,
NULL,
NULL,
0,
frame_parms->nb_antennas_rx,
frame_parms->samples_per_tti>>1,
1e3/UE2eNB[UE_id][eNB_id]->BW, // sampling time (ns)
0.0, // freq offset (Hz) (-20kHz..20kHz)
0.0, // drift (Hz) NOT YET IMPLEMENTED
enb_data[eNB_id]->rx_noise_level, // noise_figure NOT YET IMPLEMENTED
(double)PHY_vars_eNB_g[eNB_id]->rx_total_gain_eNB_dB - 66.227, // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
200.0, // IP3_dBm (dBm)
&UE2eNB[UE_id][eNB_id]->ip, // initial phase
30.0e3, // pn_cutoff (kHz)
-500.0, // pn_amp (dBc) default: 50
0.0, // IQ imbalance (dB),
0.0); // IQ phase imbalance (rad)
*/
rf_rx_simple(r_re,
r_im,
nb_antennas_rx,
frame_parms->samples_per_tti>>1,
1e3/UE2eNB[0][eNB_id]->BW, // sampling time (ns)
(double)PHY_vars_eNB_g[eNB_id]->rx_total_gain_eNB_dB - 66.227); // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
rx_pwr = signal_energy_fp(r_re,r_im,nb_antennas_rx,frame_parms->samples_per_tti>>1,0);
#ifdef DEBUG_SIM
printf("[SIM][UL] rx_pwr (ADC in) %f dB for slot %d (subframe %d)\n",10*log10(rx_pwr),next_slot,next_slot>>1);
#endif
rxdata = PHY_vars_eNB_g[eNB_id]->lte_eNB_common_vars.rxdata[0];
slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1);
adc(r_re,
r_im,
0,
slot_offset,
rxdata,
nb_antennas_rx,
frame_parms->samples_per_tti>>1,
12);
rx_pwr2 = signal_energy(rxdata[0]+slot_offset,frame_parms->samples_per_tti>>1);
#ifdef DEBUG_SIM
printf("[SIM][UL] eNB %d rx_pwr (ADC out) %f dB (%d) for slot %d (subframe %d)\n",eNB_id,10*log10((double)rx_pwr2),rx_pwr2,next_slot,next_slot>>1);
#endif
} // eNB_id
} // abstraction_flag==0
}
void init_channel_vars(LTE_DL_FRAME_PARMS *frame_parms, double ***s_re,double ***s_im,double ***r_re,double ***r_im,double ***r_re0,double ***r_im0) {
int i;
*s_re = malloc(2*sizeof(double*));
*s_im = malloc(2*sizeof(double*));
*r_re = malloc(2*sizeof(double*));
*r_im = malloc(2*sizeof(double*));
*r_re0 = malloc(2*sizeof(double*));
*r_im0 = malloc(2*sizeof(double*));
for (i=0;i<2;i++) {
(*s_re)[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero((*s_re)[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
(*s_im)[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero((*s_im)[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
(*r_re)[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero((*r_re)[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
(*r_im)[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero((*r_im)[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
(*r_re0)[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero((*r_re0)[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
(*r_im0)[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
bzero((*r_im0)[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
}
}
+205
View File
@@ -0,0 +1,205 @@
#include "cor_SF_sim.h"
double ** createMat (int nbRow, int nbCol)
{
double **matrice;
int initcol, countr, countc;
matrice = malloc (nbRow * sizeof (double*));
for (initcol = 0; initcol < nbRow; initcol++)
{
matrice[initcol] = malloc(nbCol * sizeof(double));
}
for (countr = 0; countr < nbRow; countr++)
{
for (countc = 0; countc < nbCol; countc++)
{
matrice[countr][countc] = 0;
}
}
return matrice;
}
void destroyMat(double **mat1,int row,int col)
{
int i;
for (i = 0; i < row; i++)
free(mat1[i]);
free(mat1);
}
double **init_SF (int map_length, int map_height, double decor_dist,
double variance)
{
double **SF = createMat (map_length, map_height);
double **unc_SF = createMat (map_length, map_height);
/*
double **L1 = createMat (2, 2);
double **L2 = createMat (3, 3);
double **L3 = createMat (4, 4);
double **L4 = createMat (5, 5);
*/
double L1[2][2] = {{0.0}}, L2[3][3] = {{0.0}}, L3[4][4] = {{0.0}}, L4[5][5] = {{0.0}};
double temp[2] = { 0.0 }, temp1[2] = {0.0}, temp2[3] = {0.0}, temp21[2] = {0.0}, temp3[4] = {0.0}, temp31[3] = {0.0}, temp4[5] = {0.0}, temp41[4] = {0.0}, temp211[3] = {0.0}, temp311[4] = {0.0}, temp411[5] = {0.0};
int i, j, aa, b, c, d, k, l, m, dd, kk, ll, mm, ii, jj;
/*double L1[2][2] = {{1.0000,0.0},{0.9512,0.3085}};
double L2[3][3] = {{1.0000,0.0,0.0},{0.9512,0.3085,0},{0.9512,0.0872,0.2959}};
double L3[4][4] = {{1.0000,0.0,0.0,0.0},{0.9512,0.3085,0.0,0.0},{0.9512,0.0872,0.2959 ,0.0},{0.9317,0.2105,0.1574,0.2506}};
double L4[5][5] = {{1.0000,0.0,0.0,0.0,0.0},{0.9512,0.3085,0.0,0.0,0.0},{ 0.9048,0.2934,0.3085,0.0,0.0},{0.9512,0.0872,0.0257,0.2948,0.0},{0.9317,0.2105,0.0872, 0.1504,0.2394}};
*/
double r = exp (-1 / decor_dist); // decorrelation factor mostly equal to 20
double r1 = pow (r, sqrt (2));
double r2 = pow (r, 2);
double r3 = pow (r, sqrt (5));
double L11[2][2] = { {1, r}, {r, 1} };
double L21[3][3] = { {1, r, r}, {r, 1, r1}, {r, r1, 1} };
double L31[4][4] = { {1, r, r, r1}, {r, 1, r1, r}, {r, r1, 1, r}, {r1, r, r, 1} };
double L41[5][5] = { {1, r, r2, r, r1}, {r, 1, r, r1, r}, {r2, r, 1, r3, r1}, {r, r1,r3, 1, r},
{r1, r, r1, r, 1}
};
L1[0][0] = L11[0][0];
L1[0][1] = L11[0][1];
L1[1][0] = L11[1][0];
L1[1][1] = L11[1][1];
/*for (bb = 0; bb < 2; bb++)
{
for (cc = 0; cc < 2; cc++)
{
//Lt1[bb*2+cc] = L11[bb][cc];
L1[bb][cc]=L11[bb][cc];
}
}*/
for (dd = 0; dd < 3; dd++)
{
for (kk = 0; kk < 3; kk++)
{
L2[dd][kk]=L21[dd][kk];
}
}
for (ll = 0; ll < 4; ll++)
{
for (mm = 0; mm < 4; mm++)
{
L3[ll][mm]=L31[ll][mm];
}
}
for (ii = 0; ii < 5; ii++)
{
for (jj = 0; jj < 5; jj++)
{
L4[ii][jj]=L41[ii][jj];
}
}
clapack_dpotrf(CblasRowMajor,CblasLower,2,&L1[0][0],2);
clapack_dpotrf(CblasRowMajor,CblasLower,3,&L2[0][0],3);
clapack_dpotrf(CblasRowMajor,CblasLower,4,&L3[0][0],4);
clapack_dpotrf(CblasRowMajor,CblasLower,5,&L4[0][0],5);
randominit (0);
for (i = 0; i < map_length; i++)
{
for (j = 0; j < map_height; j++)
unc_SF[i][j] = gaussdouble (0.0, variance);
}
SF[0][0] = unc_SF[0][0];
//printf ("%f", SF[0][0]);
for (aa = 0; aa < 2; aa++)
{
temp[aa] = L1[1][aa];
}
for (k = 1; k < map_height; k++)
{
temp1[0] = SF[0][k - 1];
temp1[1] = unc_SF[0][k];
SF[0][k] = cblas_ddot (2, temp, 1, temp1, 1);
}
for (b = 0; b < 3; b++)
{
temp2[b] = L2[2][b];
}
for (c = 0; c < 4; c++)
{
temp3[c] = L3[3][c];
}
for (d = 0; d < 5; d++)
{
temp4[d] = L4[4][d];
}
for (l = 1; l < map_length; l++)
{
for (m = 0; m < map_height; m++)
{
if (m == 0)
{
temp21[0] = SF[l - 1][m];
temp21[1] = SF[l - 1][m + 1];
cblas_dtrsv (CblasRowMajor, CblasLower, CblasNoTrans,
CblasNonUnit, 2, &L1[0][0], 2, temp21, 1);
temp211[0] = temp21[0];
temp211[1] = temp21[1];
temp211[2] = unc_SF[l][m];
SF[l][m] = cblas_ddot (3, temp2, 1, temp211, 1);
}
else if (m == map_height - 1)
{
temp31[0] = SF[l - 1][m - 1];
temp31[1] = SF[l - 1][m];
temp31[2] = SF[l][m - 1];
cblas_dtrsv (CblasRowMajor, CblasLower, CblasNoTrans,
CblasNonUnit, 3, &L2[0][0], 3, temp31, 1);
temp311[0] = temp31[0];
temp311[1] = temp31[1];
temp311[2] = temp31[2];
temp311[3] = unc_SF[l][m];
SF[l][m] = cblas_ddot (4, temp3, 1, temp311, 1);
}
else
{
temp41[0] = SF[l - 1][m - 1];
temp41[1] = SF[l - 1][m];
temp41[2] = SF[l - 1][m + 1];
temp41[3] = SF[l][m - 1];
cblas_dtrsv (CblasRowMajor, CblasLower, CblasNoTrans,
CblasNonUnit, 4, &L3[0][0], 4, temp41, 1);
temp411[0] = temp41[0];
temp411[1] = temp41[1];
temp411[2] = temp41[2];
temp411[3] = temp41[3];
temp411[4] = unc_SF[l][m];
SF[l][m] = cblas_ddot (5, temp4, 1, temp411, 1);
}
}
}
destroyMat(unc_SF,map_length, map_height);
/*
destroyMat(L1,2,2);
destroyMat(L2,3,3);
destroyMat(L3,4,4);
destroyMat(L4,5,5);
*/
return SF;
}
+10
View File
@@ -0,0 +1,10 @@
#include<stdio.h>
#include<math.h>
#include<cblas.h>
//#include<atlas_lapack.h>
#include<clapack.h>
#include<oaisim.h>
double **init_SF (int map_length, int map_height, double decor_dist, double variance); //,double decor,double var);
double **createMat (int nbRow, int nbCol);
void destroyMat(double **mat1,int row,int col);
@@ -0,0 +1,331 @@
#include "discrete_event_generator.h"
#include <stdio.h>
#include <stdlib.h>
extern u32 frame;
End_Of_Sim_Event end_event; //Could later be a list of condition_events (if the end condition is more complicated)
Event_List event_list;
void add_event(struct Event event) {
Event_elt * counter = event_list.head;
Event_elt * previous = counter;
Event_elt * elt = malloc(sizeof(Event_elt));
while (counter != NULL) {
if ((counter->event).frame > event.frame) break;
//else if ((counter->event).next_slot > event.next_slot) break;
else {
previous = counter;
counter = counter->next;
}
}
elt->event = event;
if (event_list.head != NULL)
event_list_add_element(elt, previous, &event_list);
else
event_list_add_head(elt, &event_list);
}
void schedule(enum Event_Type type, int frame, char * key, void * value) {
Event event;
event.frame = frame;
if (key == NULL) { //Global model update
event.key = NULL;
} else { //Update of a single parameter
event.key = malloc (sizeof(char) * (strlen(key)+1));
strcpy(event.key, key);
}
event.value = value;
event.type = type;
add_event(event);
}
void schedule_end_of_simulation(End_Of_Sim_Event_Type type, int value) {
end_event.type = type;
end_event.value = value;
}
int end_of_simulation() {
switch (end_event.type) {
case FRAME:
if (frame == end_event.value)
return 1;
break;
/* default:
return 0;*/
}
return 0;
}
void update_omg_model(char * key, void * value) {
printf("\n\n\nA NEW MOB MODEL\n\n\n");
/*
if (key != NULL) { //Global model update
Mobility * new_mobility_model = (Mobility *) value;
sprintf(oai_emulation.topology_config.mobility.UE_mobility.UE_mobility_type.selected_option, "%s", new_mobility_model->UE_mobility.UE_mobility_type.selected_option);
oai_emulation.topology_config.mobility.UE_mobility.grid_walk.grid_map.horizontal_grid = new_mobility_model->UE_mobility.grid_walk.grid_map.horizontal_grid;
oai_emulation.topology_config.mobility.UE_mobility.grid_walk.grid_map.vertical_grid = new_mobility_model->UE_mobility.grid_walk.grid_map.vertical_grid;
sprintf(oai_emulation.topology_config.mobility.UE_mobility.grid_walk.grid_trip_type.selected_option, "%s", new_mobility_model->UE_mobility.grid_walk.grid_trip_type.selected_option);
sprintf(oai_emulation.topology_config.mobility.UE_mobility.UE_initial_distribution.selected_option, "%s", new_mobility_model->UE_mobility.UE_initial_distribution.selected_option);
oai_emulation.topology_config.mobility.UE_mobility.random_UE_distribution.number_of_nodes = new_mobility_model->UE_mobility.random_UE_distribution.number_of_nodes;
oai_emulation.topology_config.mobility.UE_mobility.concentrated_UE_distribution.number_of_nodes = new_mobility_model->UE_mobility.concentrated_UE_distribution.number_of_nodes;
oai_emulation.topology_config.mobility.UE_mobility.grid_UE_distribution.random_grid.number_of_nodes = new_mobility_model->UE_mobility.grid_UE_distribution.random_grid.number_of_nodes;
oai_emulation.topology_config.mobility.UE_mobility.grid_UE_distribution.border_grid.number_of_nodes = new_mobility_model->UE_mobility.grid_UE_distribution.border_grid.number_of_nodes;
oai_emulation.topology_config.mobility.UE_mobility.UE_moving_dynamics.min_speed_mps = new_mobility_model->UE_mobility.UE_moving_dynamics.min_speed_mps;
oai_emulation.topology_config.mobility.UE_mobility.UE_moving_dynamics.max_speed_mps = new_mobility_model->UE_mobility.UE_moving_dynamics.max_speed_mps;
oai_emulation.topology_config.mobility.UE_mobility.UE_moving_dynamics.min_sleep_ms = new_mobility_model->UE_mobility.UE_moving_dynamics.min_sleep_ms;
oai_emulation.topology_config.mobility.UE_mobility.UE_moving_dynamics.max_sleep_ms = new_mobility_model->UE_mobility.UE_moving_dynamics.max_sleep_ms;
oai_emulation.topology_config.mobility.UE_mobility.UE_moving_dynamics.min_journey_time_ms = new_mobility_model->UE_mobility.UE_moving_dynamics.min_journey_time_ms;
oai_emulation.topology_config.mobility.UE_mobility.UE_moving_dynamics.max_journey_time_ms = new_mobility_model->UE_mobility.UE_moving_dynamics.max_journey_time_ms;
sprintf(oai_emulation.topology_config.mobility.eNB_mobility.eNB_mobility_type.selected_option, "%s", new_mobility_model->eNB_mobility.eNB_mobility_type.selected_option);
sprintf(oai_emulation.topology_config.mobility.eNB_mobility.eNB_initial_distribution.selected_option, "%s", new_mobility_model->eNB_mobility.eNB_initial_distribution.selected_option);
oai_emulation.topology_config.mobility.eNB_mobility.random_eNB_distribution.number_of_cells = new_mobility_model->eNB_mobility.random_eNB_distribution.number_of_cells;
oai_emulation.topology_config.mobility.eNB_mobility.hexagonal_eNB_distribution.number_of_cells = new_mobility_model->eNB_mobility.hexagonal_eNB_distribution.number_of_cells;
oai_emulation.topology_config.mobility.eNB_mobility.hexagonal_eNB_distribution.inter_eNB_distance_km = new_mobility_model->eNB_mobility.hexagonal_eNB_distribution.inter_eNB_distance_km;
oai_emulation.topology_config.mobility.eNB_mobility.grid_eNB_distribution.number_of_grid_x = new_mobility_model->eNB_mobility.grid_eNB_distribution.number_of_grid_x;
oai_emulation.topology_config.mobility.eNB_mobility.grid_eNB_distribution.number_of_grid_y = new_mobility_model->eNB_mobility.grid_eNB_distribution.number_of_grid_y;
sprintf(oai_emulation.topology_config.mobility.eNB_mobility.trace_config.trace_mobility_file,"static_1enb.tr");
sprintf(oai_emulation.topology_config.mobility.UE_mobility.trace_config.trace_mobility_file,"static_2ues.tr");
sprintf(oai_emulation.topology_config.mobility.UE_mobility.sumo_config.command,"sumo");
sprintf(oai_emulation.topology_config.mobility.UE_mobility.sumo_config.file,"%s/UTIL/OMG/SUMO/SCENARIOS/scen.sumo.cfg",getenv("OPENAIR2_DIR"));
sprintf(oai_emulation.topology_config.mobility.UE_mobility.sumo_config.hip,"127.0.1.1");
oai_emulation.topology_config.mobility.UE_mobility.sumo_config.start = new_mobility_model->UE_mobility.sumo_config.start;
oai_emulation.topology_config.mobility.UE_mobility.sumo_config.end = new_mobility_model->UE_mobility.sumo_config.end;
oai_emulation.topology_config.mobility.UE_mobility.sumo_config.step = new_mobility_model->UE_mobility.sumo_config.step; // 1000ms
oai_emulation.topology_config.mobility.UE_mobility.sumo_config.hport = new_mobility_model->UE_mobility.sumo_config.hport;
} else { //Updating a single parameter::: Here I'll only put some examples
if (!strcmp((char *) key, "UE_mobility_type")) {
sprintf(oai_emulation.topology_config.mobility.UE_mobility.UE_mobility_type.selected_option, "%s", (char *) value);
} else if (!strcmp((char *) key, "eNB_mobility_type")) {
sprintf(oai_emulation.topology_config.mobility.eNB_mobility.eNB_mobility_type.selected_option, "%s", (char *) value);
} else if (!strcmp((char *) key, "grid_trip_type")) {
sprintf(oai_emulation.topology_config.mobility.UE_mobility.grid_walk.grid_trip_type.selected_option, "%s", (char *) value);
} else if (!strcmp((char *) key, "UE_moving_dynamics_min_speed_mps")) {
oai_emulation.topology_config.mobility.UE_mobility.UE_moving_dynamics.min_speed_mps = *((double *) value);
} else if (!strcmp((char *) key, "UE_moving_dynamics_max_speed_mps")) {
oai_emulation.topology_config.mobility.UE_mobility.UE_moving_dynamics.max_speed_mps = *((double *) value);
} else if (!strcmp((char *) key, "UE_moving_dynamics_min_sleep_ms")) {
oai_emulation.topology_config.mobility.UE_mobility.UE_moving_dynamics.min_sleep_ms = *((double *) value);
} else if (!strcmp((char *) key, "UE_moving_dynamics_max_sleep_ms")) {
oai_emulation.topology_config.mobility.UE_mobility.UE_moving_dynamics.max_sleep_ms = *((double *) value);
} else if (!strcmp((char *) key, "UE_moving_dynamics_min_journey_time_ms")) {
oai_emulation.topology_config.mobility.UE_mobility.UE_moving_dynamics.min_journey_time_ms = *((double *) value);
} else if (!strcmp((char *) key, "UE_moving_dynamics_max_journey_time_ms")) {
oai_emulation.topology_config.mobility.UE_mobility.UE_moving_dynamics.max_journey_time_ms = *((double *) value);
}
}
*/
}
void update_otg_model(char * key, void * value) {
printf("\n\n\nA NEW APP MODEL\n\n\n");
//int i;
/*
if (key != NULL) { //Global model update
Application_Config * new_application_model = (Application_Config *)value;
sprintf(oai_emulation.application_config.packet_gen_type, "%s", new_application_model->packet_gen_type);
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
sprintf(oai_emulation.application_config.predefined_traffic.source_id[i], "%s", new_application_model->predefined_traffic.source_id[i]);
sprintf(oai_emulation.application_config.predefined_traffic.application_type[i], "%s", new_application_model->predefined_traffic.application_type[i]);
sprintf(oai_emulation.application_config.predefined_traffic.background[i], "%s", new_application_model->predefined_traffic.background[i]);
oai_emulation.application_config.predefined_traffic.aggregation_level[i] = new_application_model->predefined_traffic.aggregation_level[i];
oai_emulation.application_config.predefined_traffic.destination_id[i] = new_application_model->predefined_traffic.destination_id[i];
sprintf(oai_emulation.application_config.customized_traffic.source_id[i], "%s", new_application_model->customized_traffic.source_id[i]);
sprintf(oai_emulation.application_config.customized_traffic.destination_id[i], "%s", new_application_model->customized_traffic.destination_id[i]);
sprintf(oai_emulation.application_config.customized_traffic.transport_protocol[i], "%s", new_application_model->customized_traffic.transport_protocol[i]);
sprintf(oai_emulation.application_config.customized_traffic.background[i], "%s", new_application_model->customized_traffic.background[i]);
sprintf(oai_emulation.application_config.customized_traffic.ip_version[i], "%s", new_application_model->customized_traffic.ip_version[i]);
oai_emulation.application_config.customized_traffic.aggregation_level[i] = new_application_model->customized_traffic.aggregation_level[i];
sprintf(oai_emulation.application_config.customized_traffic.idt_dist[i], "%s", new_application_model->customized_traffic.idt_dist[i]);
oai_emulation.application_config.customized_traffic.idt_min_ms[i] = new_application_model->customized_traffic.idt_min_ms[i];
oai_emulation.application_config.customized_traffic.idt_max_ms[i] = new_application_model->customized_traffic.idt_max_ms[i];
oai_emulation.application_config.customized_traffic.idt_standard_deviation[i] = new_application_model->customized_traffic.idt_standard_deviation[i];
oai_emulation.application_config.customized_traffic.idt_lambda[i] = new_application_model->customized_traffic.idt_lambda[i];
sprintf(oai_emulation.application_config.customized_traffic.size_dist[i], "%s", new_application_model->customized_traffic.size_dist[i]);
oai_emulation.application_config.customized_traffic.size_min_byte[i] = new_application_model->customized_traffic.size_min_byte[i];
oai_emulation.application_config.customized_traffic.size_max_byte[i] = new_application_model->customized_traffic.size_max_byte[i];
oai_emulation.application_config.customized_traffic.size_standard_deviation[i] = new_application_model->customized_traffic.size_standard_deviation[i];
oai_emulation.application_config.customized_traffic.size_lambda[i] = new_application_model->customized_traffic.size_lambda[i];
oai_emulation.application_config.customized_traffic.stream[i] = new_application_model->customized_traffic.stream[i];
oai_emulation.application_config.customized_traffic.destination_port[i] = new_application_model->customized_traffic.destination_port[i];
oai_emulation.application_config.customized_traffic.prob_off_pu[i]= new_application_model->customized_traffic.prob_off_pu[i];
oai_emulation.application_config.customized_traffic.prob_off_ed[i]= new_application_model->customized_traffic.prob_off_ed[i];
oai_emulation.application_config.customized_traffic.prob_off_pe[i]= new_application_model->customized_traffic.prob_off_pe[i];
oai_emulation.application_config.customized_traffic.prob_pu_ed[i]= new_application_model->customized_traffic.prob_pu_ed[i];
oai_emulation.application_config.customized_traffic.prob_pu_pe[i]= new_application_model->customized_traffic.prob_pu_pe[i];
oai_emulation.application_config.customized_traffic.prob_ed_pe[i]= new_application_model->customized_traffic.prob_ed_pe[i];
oai_emulation.application_config.customized_traffic.prob_ed_pu[i]= new_application_model->customized_traffic.prob_ed_pu[i];
oai_emulation.application_config.customized_traffic.holding_time_off_ed[i]= new_application_model->customized_traffic.holding_time_off_ed[i];
oai_emulation.application_config.customized_traffic.holding_time_off_pu[i]= new_application_model->customized_traffic.holding_time_off_pu[i];
oai_emulation.application_config.customized_traffic.holding_time_off_pe[i]= new_application_model->customized_traffic.holding_time_off_pe[i];
oai_emulation.application_config.customized_traffic.holding_time_pe_off[i]= new_application_model->customized_traffic.holding_time_pe_off[i];
oai_emulation.application_config.customized_traffic.pu_size_pkts[i]= new_application_model->customized_traffic.pu_size_pkts[i];
oai_emulation.application_config.customized_traffic.ed_size_pkts[i]= new_application_model->customized_traffic.ed_size_pkts[i];
}
} else { //Updating a single parameter::: Here I'll only put some examples
if (!strcmp((char *) key, "packet_gen_type")) {
sprintf(oai_emulation.application_config.packet_gen_type, "%s", (char *) value);
} else if (!strcmp((char *) key, "predefined_traffic_source_id")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
sprintf(oai_emulation.application_config.predefined_traffic.source_id[i], "%s", (char *) value);
}
} else if (!strcmp((char *) key, "predefined_traffic_application_type")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
sprintf(oai_emulation.application_config.predefined_traffic.application_type[i], "%s", (char *) value);
}
} else if (!strcmp((char *) key, "predefined_traffic_background")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
sprintf(oai_emulation.application_config.predefined_traffic.background[i], "%s", (char *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_source_id")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
sprintf(oai_emulation.application_config.customized_traffic.source_id[i], "%s", (char *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_destination_id")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
sprintf(oai_emulation.application_config.customized_traffic.destination_id[i], "%s", (char *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_transport_protocol")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
sprintf(oai_emulation.application_config.customized_traffic.transport_protocol[i], "%s", (char *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_background")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
sprintf(oai_emulation.application_config.customized_traffic.background[i], "%s", (char *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_ip_version")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
sprintf(oai_emulation.application_config.customized_traffic.ip_version[i], "%s", (char *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_idt_dist")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
sprintf(oai_emulation.application_config.customized_traffic.idt_dist[i], "%s", (char *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_size_dist")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
sprintf(oai_emulation.application_config.customized_traffic.size_dist[i], "%s", (char *) value);
}
} else if (!strcmp((char *) key, "predefined_traffic_aggregation_level")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
oai_emulation.application_config.predefined_traffic.aggregation_level[i] = *((int *) value);
}
} else if (!strcmp((char *) key, "predefined_traffic_destination_id")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
oai_emulation.application_config.predefined_traffic.destination_id[i] = *((int *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_aggregation_level")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
oai_emulation.application_config.customized_traffic.aggregation_level[i] = *((int *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_idt_min_ms")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
oai_emulation.application_config.customized_traffic.idt_min_ms[i] = *((int *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_idt_max_ms")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
oai_emulation.application_config.customized_traffic.idt_max_ms[i] = *((int *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_idt_standard_deviation")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
oai_emulation.application_config.customized_traffic.idt_standard_deviation[i] = *((int *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_idt_lambda")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
oai_emulation.application_config.customized_traffic.idt_lambda[i] = *((int *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_size_min_byte")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
oai_emulation.application_config.customized_traffic.size_min_byte[i] = *((int *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_size_max_byte")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
oai_emulation.application_config.customized_traffic.size_max_byte[i] = *((int *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_size_standard_deviation")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
oai_emulation.application_config.customized_traffic.size_standard_deviation[i] = *((int *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_size_lambda")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
oai_emulation.application_config.customized_traffic.size_lambda[i] = *((int *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_stream")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
oai_emulation.application_config.customized_traffic.stream[i] = *((int *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_destination_port")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
oai_emulation.application_config.customized_traffic.destination_port[i] = *((int *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_prob_off_pu")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
oai_emulation.application_config.customized_traffic.prob_off_pu[i] = *((int *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_prob_off_ed")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
oai_emulation.application_config.customized_traffic.prob_off_ed[i] = *((int *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_prob_off_pe")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
oai_emulation.application_config.customized_traffic.prob_off_pe[i] = *((int *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_prob_pu_ed")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
oai_emulation.application_config.customized_traffic.prob_pu_ed[i] = *((int *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_prob_pu_pe")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
oai_emulation.application_config.customized_traffic.prob_pu_pe[i] = *((int *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_prob_ed_pe")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
oai_emulation.application_config.customized_traffic.prob_ed_pe[i] = *((int *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_prob_ed_pu")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
oai_emulation.application_config.customized_traffic.prob_ed_pu[i] = *((int *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_holding_time_off_ed")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
oai_emulation.application_config.customized_traffic.holding_time_off_ed[i] = *((int *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_holding_time_off_pu")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
oai_emulation.application_config.customized_traffic.holding_time_off_pu[i] = *((int *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_holding_time_off_pe")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
oai_emulation.application_config.customized_traffic.holding_time_off_pe[i] = *((int *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_holding_time_pe_off")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
oai_emulation.application_config.customized_traffic.holding_time_pe_off[i] = *((int *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_pu_size_pkts")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
oai_emulation.application_config.customized_traffic.pu_size_pkts[i] = *((int *) value);
}
} else if (!strcmp((char *) key, "customized_traffic_ed_size_pkts")) {
for (i = 0; i < NUMBER_OF_eNB_MAX + NUMBER_OF_UE_MAX; i++) {
oai_emulation.application_config.customized_traffic.ed_size_pkts[i] = *((int *) value);
}
}
}
*/
}
@@ -0,0 +1,14 @@
#include "oaisim.h"
#include "UTIL/FIFO/pad_list.h"
void add_event(struct Event event);
void schedule(enum Event_Type type, int frame, char * key, void* value);
void schedule_end_of_simulation(End_Of_Sim_Event_Type type, int value);
int end_of_simulation();
void update_omg_model(char * key, void * value);
void update_otg_model(char * key, void * value);
+3
View File
@@ -0,0 +1,3 @@
-20,-19.8,-19.6,-19.4,-19.2,-19,-18.8,-18.6,-18.4,-18.2,-18,-17.8,-17.6,-17.4,-17.2,-17,-16.8,-16.6,-16.4,-16.2,-16,-15.8,-15.6,-15.4,-15.2,-15,-14.8,-14.6,-14.4,-14.2,-14,-13.8,-13.6,-13.4,-13.2,-13,-12.8,-12.6,-12.4,-12.2,-12,-11.8,-11.6,-11.4,-11.2,-11,-10.8,-10.6,-10.4,-10.2,-10,-9.8,-9.6,-9.4,-9.2,-9,-8.8,-8.6,-8.4,-8.2,-8,-7.8,-7.6,-7.4,-7.2,-7,-6.8,-6.6,-6.4,-6.2,-6,-5.8,-5.6,-5.4,-5.2,-5,-4.8,-4.6,-4.4,-4.2,-4,-3.8,-3.6,-3.4,-3.2,-3,-2.8,-2.6,-2.4,-2.2,-2,-1.8,-1.6,-1.4,-1.2,-1,-0.8,-0.6,-0.4,-0.2,0,0.2,0.4,0.6,0.8,1,1.2,1.4,1.6,1.8,2,2.2,2.4,2.6,2.8,3,3.2,3.4,3.6,3.8,4,4.2,4.4,4.6,4.8,5,5.2,5.4,5.6,5.8,6,6.2,6.4,6.6,6.8,7,7.2,7.4,7.6,7.8,8,8.2,8.4,8.6,8.8,9,9.2,9.4,9.6,9.8,10,10.2,10.4,10.6,10.8,11,11.2,11.4,11.6,11.8,12,12.2,12.4,12.6,12.8,13,13.2,13.4,13.6,13.8,14,14.2,14.4,14.6,14.8,15,15.2,15.4,15.6,15.8,16,16.2,16.4,16.6,16.8,17,17.2,17.4,17.6,17.8,18,18.2,18.4,18.6,18.8,19,19.2
0.014138,0.014992,0.015845,0.016699,0.017553,0.018407,0.01923,0.020054,0.020878,0.021701,0.022525,0.02368,0.024834,0.025989,0.027144,0.028299,0.029822,0.031346,0.03287,0.034393,0.035917,0.03769,0.039464,0.041237,0.043011,0.044784,0.047124,0.049465,0.051806,0.054146,0.056487,0.059209,0.061931,0.064654,0.067376,0.070098,0.073673,0.077247,0.080822,0.084396,0.087971,0.092295,0.09662,0.10094,0.10527,0.10959,0.11501,0.12043,0.12585,0.13127,0.13669,0.14362,0.15054,0.15747,0.1644,0.17133,0.17954,0.18776,0.19598,0.2042,0.21241,0.2223,0.23219,0.24208,0.25197,0.26186,0.27399,0.28613,0.29827,0.31041,0.32255,0.33706,0.35158,0.36609,0.38061,0.39513,0.41234,0.42955,0.44676,0.46397,0.48118,0.50187,0.52256,0.54325,0.56394,0.58463,0.60797,0.63131,0.65465,0.678,0.70134,0.72903,0.75673,0.78442,0.81212,0.83981,0.86994,0.90007,0.9302,0.96033,0.99047,1.0241,1.0577,1.0914,1.125,1.1587,1.1954,1.2321,1.2688,1.3054,1.3421,1.3818,1.4214,1.4611,1.5007,1.5404,1.5828,1.6253,1.6678,1.7102,1.7527,1.7968,1.8408,1.8849,1.929,1.9731,2.0189,2.0647,2.1105,2.1563,2.2022,2.2501,2.298,2.346,2.3939,2.4418,2.4901,2.5384,2.5867,2.6349,2.6832,2.7321,2.7811,2.83,2.8789,2.9279,2.9751,3.0224,3.0697,3.117,3.1643,3.2083,3.2524,3.2964,3.3404,3.3844,3.4235,3.4626,3.5017,3.5407,3.5798,3.6112,3.6426,3.674,3.7054,3.7368,3.7602,3.7835,3.8068,3.8302,3.8535,3.8685,3.8836,3.8986,3.9137,3.9288,3.9372,3.9456,3.954,3.9624,3.9708,3.9747,3.9786,3.9825,3.9864,3.9903,3.9918,3.9932,3.9947,3.9961,3.9975,3.9979,3.9983,3.9987,3.9991,3.9995,4
0.0035344,0.0037479,0.0039613,0.0041748,0.0043882,0.0046017,0.0048076,0.0050135,0.0052194,0.0054254,0.0056313,0.0059199,0.0062086,0.0064973,0.006786,0.0070746,0.0074556,0.0078365,0.0082174,0.0085983,0.0089792,0.0094226,0.0098659,0.010309,0.010753,0.011196,0.011781,0.012366,0.012951,0.013537,0.014122,0.014802,0.015483,0.016163,0.016844,0.017525,0.018418,0.019312,0.020205,0.021099,0.021993,0.023074,0.024155,0.025236,0.026317,0.027398,0.028753,0.030108,0.031463,0.032818,0.034173,0.035904,0.037636,0.039368,0.0411,0.042831,0.044886,0.04694,0.048994,0.051049,0.053103,0.055575,0.058047,0.06052,0.062992,0.065464,0.068498,0.071533,0.074568,0.077602,0.080637,0.084266,0.087895,0.091524,0.095153,0.098782,0.10308,0.10739,0.11169,0.11599,0.12029,0.12547,0.13064,0.13581,0.14098,0.14616,0.15199,0.15783,0.16366,0.1695,0.17533,0.18226,0.18918,0.19611,0.20303,0.20995,0.21749,0.22502,0.23255,0.24008,0.24762,0.25603,0.26444,0.27285,0.28126,0.28967,0.29884,0.30801,0.31719,0.32636,0.33554,0.34545,0.35536,0.36527,0.37518,0.3851,0.39571,0.40632,0.41694,0.42755,0.43817,0.44919,0.46021,0.47123,0.48226,0.49328,0.50473,0.51618,0.52763,0.53909,0.55054,0.56252,0.57451,0.58649,0.59847,0.61046,0.62253,0.6346,0.64667,0.65874,0.67081,0.68304,0.69527,0.7075,0.71973,0.73196,0.74379,0.75561,0.76743,0.77925,0.79108,0.80208,0.81309,0.8241,0.8351,0.84611,0.85588,0.86565,0.87541,0.88518,0.89495,0.9028,0.91065,0.9185,0.92635,0.93421,0.94004,0.94587,0.95171,0.95754,0.96337,0.96714,0.9709,0.97466,0.97843,0.98219,0.98429,0.98639,0.9885,0.9906,0.9927,0.99368,0.99465,0.99563,0.99661,0.99758,0.99794,0.9983,0.99866,0.99902,0.99938,0.99948,0.99958,0.99968,0.99978,0.99988,1
1 -20 -19.8 -19.6 -19.4 -19.2 -19 -18.8 -18.6 -18.4 -18.2 -18 -17.8 -17.6 -17.4 -17.2 -17 -16.8 -16.6 -16.4 -16.2 -16 -15.8 -15.6 -15.4 -15.2 -15 -14.8 -14.6 -14.4 -14.2 -14 -13.8 -13.6 -13.4 -13.2 -13 -12.8 -12.6 -12.4 -12.2 -12 -11.8 -11.6 -11.4 -11.2 -11 -10.8 -10.6 -10.4 -10.2 -10 -9.8 -9.6 -9.4 -9.2 -9 -8.8 -8.6 -8.4 -8.2 -8 -7.8 -7.6 -7.4 -7.2 -7 -6.8 -6.6 -6.4 -6.2 -6 -5.8 -5.6 -5.4 -5.2 -5 -4.8 -4.6 -4.4 -4.2 -4 -3.8 -3.6 -3.4 -3.2 -3 -2.8 -2.6 -2.4 -2.2 -2 -1.8 -1.6 -1.4 -1.2 -1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2 2.2 2.4 2.6 2.8 3 3.2 3.4 3.6 3.8 4 4.2 4.4 4.6 4.8 5 5.2 5.4 5.6 5.8 6 6.2 6.4 6.6 6.8 7 7.2 7.4 7.6 7.8 8 8.2 8.4 8.6 8.8 9 9.2 9.4 9.6 9.8 10 10.2 10.4 10.6 10.8 11 11.2 11.4 11.6 11.8 12 12.2 12.4 12.6 12.8 13 13.2 13.4 13.6 13.8 14 14.2 14.4 14.6 14.8 15 15.2 15.4 15.6 15.8 16 16.2 16.4 16.6 16.8 17 17.2 17.4 17.6 17.8 18 18.2 18.4 18.6 18.8 19 19.2
2 0.014138 0.014992 0.015845 0.016699 0.017553 0.018407 0.01923 0.020054 0.020878 0.021701 0.022525 0.02368 0.024834 0.025989 0.027144 0.028299 0.029822 0.031346 0.03287 0.034393 0.035917 0.03769 0.039464 0.041237 0.043011 0.044784 0.047124 0.049465 0.051806 0.054146 0.056487 0.059209 0.061931 0.064654 0.067376 0.070098 0.073673 0.077247 0.080822 0.084396 0.087971 0.092295 0.09662 0.10094 0.10527 0.10959 0.11501 0.12043 0.12585 0.13127 0.13669 0.14362 0.15054 0.15747 0.1644 0.17133 0.17954 0.18776 0.19598 0.2042 0.21241 0.2223 0.23219 0.24208 0.25197 0.26186 0.27399 0.28613 0.29827 0.31041 0.32255 0.33706 0.35158 0.36609 0.38061 0.39513 0.41234 0.42955 0.44676 0.46397 0.48118 0.50187 0.52256 0.54325 0.56394 0.58463 0.60797 0.63131 0.65465 0.678 0.70134 0.72903 0.75673 0.78442 0.81212 0.83981 0.86994 0.90007 0.9302 0.96033 0.99047 1.0241 1.0577 1.0914 1.125 1.1587 1.1954 1.2321 1.2688 1.3054 1.3421 1.3818 1.4214 1.4611 1.5007 1.5404 1.5828 1.6253 1.6678 1.7102 1.7527 1.7968 1.8408 1.8849 1.929 1.9731 2.0189 2.0647 2.1105 2.1563 2.2022 2.2501 2.298 2.346 2.3939 2.4418 2.4901 2.5384 2.5867 2.6349 2.6832 2.7321 2.7811 2.83 2.8789 2.9279 2.9751 3.0224 3.0697 3.117 3.1643 3.2083 3.2524 3.2964 3.3404 3.3844 3.4235 3.4626 3.5017 3.5407 3.5798 3.6112 3.6426 3.674 3.7054 3.7368 3.7602 3.7835 3.8068 3.8302 3.8535 3.8685 3.8836 3.8986 3.9137 3.9288 3.9372 3.9456 3.954 3.9624 3.9708 3.9747 3.9786 3.9825 3.9864 3.9903 3.9918 3.9932 3.9947 3.9961 3.9975 3.9979 3.9983 3.9987 3.9991 3.9995 4
3 0.0035344 0.0037479 0.0039613 0.0041748 0.0043882 0.0046017 0.0048076 0.0050135 0.0052194 0.0054254 0.0056313 0.0059199 0.0062086 0.0064973 0.006786 0.0070746 0.0074556 0.0078365 0.0082174 0.0085983 0.0089792 0.0094226 0.0098659 0.010309 0.010753 0.011196 0.011781 0.012366 0.012951 0.013537 0.014122 0.014802 0.015483 0.016163 0.016844 0.017525 0.018418 0.019312 0.020205 0.021099 0.021993 0.023074 0.024155 0.025236 0.026317 0.027398 0.028753 0.030108 0.031463 0.032818 0.034173 0.035904 0.037636 0.039368 0.0411 0.042831 0.044886 0.04694 0.048994 0.051049 0.053103 0.055575 0.058047 0.06052 0.062992 0.065464 0.068498 0.071533 0.074568 0.077602 0.080637 0.084266 0.087895 0.091524 0.095153 0.098782 0.10308 0.10739 0.11169 0.11599 0.12029 0.12547 0.13064 0.13581 0.14098 0.14616 0.15199 0.15783 0.16366 0.1695 0.17533 0.18226 0.18918 0.19611 0.20303 0.20995 0.21749 0.22502 0.23255 0.24008 0.24762 0.25603 0.26444 0.27285 0.28126 0.28967 0.29884 0.30801 0.31719 0.32636 0.33554 0.34545 0.35536 0.36527 0.37518 0.3851 0.39571 0.40632 0.41694 0.42755 0.43817 0.44919 0.46021 0.47123 0.48226 0.49328 0.50473 0.51618 0.52763 0.53909 0.55054 0.56252 0.57451 0.58649 0.59847 0.61046 0.62253 0.6346 0.64667 0.65874 0.67081 0.68304 0.69527 0.7075 0.71973 0.73196 0.74379 0.75561 0.76743 0.77925 0.79108 0.80208 0.81309 0.8241 0.8351 0.84611 0.85588 0.86565 0.87541 0.88518 0.89495 0.9028 0.91065 0.9185 0.92635 0.93421 0.94004 0.94587 0.95171 0.95754 0.96337 0.96714 0.9709 0.97466 0.97843 0.98219 0.98429 0.98639 0.9885 0.9906 0.9927 0.99368 0.99465 0.99563 0.99661 0.99758 0.99794 0.9983 0.99866 0.99902 0.99938 0.99948 0.99958 0.99968 0.99978 0.99988 1
+3
View File
@@ -0,0 +1,3 @@
-20;-19.8;-19.6;-19.4;-19.2;-19;-18.8;-18.6;-18.4;-18.2;-18;-17.8;-17.6;-17.4;-17.2;-17;-16.8;-16.6;-16.4;-16.2;-16;-15.8;-15.6;-15.4;-15.2;-15;-14.8;-14.6;-14.4;-14.2;-14;-13.8;-13.6;-13.4;-13.2;-13;-12.8;-12.6;-12.4;-12.2;-12;-11.8;-11.6;-11.4;-11.2;-11;-10.8;-10.6;-10.4;-10.2;-10;-9.8;-9.6;-9.4;-9.2;-9;-8.8;-8.6;-8.4;-8.2;-8;-7.8;-7.6;-7.4;-7.2;-7;-6.8;-6.6;-6.4;-6.2;-6;-5.8;-5.6;-5.4;-5.2;-5;-4.8;-4.6;-4.4;-4.2;-4;-3.8;-3.6;-3.4;-3.2;-3;-2.8;-2.6;-2.4;-2.2;-2;-1.8;-1.6;-1.4;-1.2;-1;-0.8;-0.6;-0.4;-0.2;0;0.2;0.4;0.6;0.8;1;1.2;1.4;1.6;1.8;2;2.2;2.4;2.6;2.8;3;3.2;3.4;3.6;3.8;4;4.2;4.4;4.6;4.8;5;5.2;5.4;5.6;5.8;6;6.2;6.4;6.6;6.8;7;7.2;7.4;7.6;7.8;8;8.2;8.4;8.6;8.8;9;9.2;9.4;9.6;9.8;10;10.2;10.4;10.6;10.8;11;11.2;11.4;11.6;11.8;12;12.2;12.4;12.6;12.8;13;13.2;13.4;13.6;13.8;14;14.2;14.4;14.6;14.8;15;15.2;15.4;15.6;15.8;16;16.2;16.4;16.6;16.8;17;17.2;17.4;17.6;17.8;18;18.2;18.4;18.6;18.8;19;19.2
0.014138;0.014992;0.015845;0.016699;0.017553;0.018407;0.01923;0.020054;0.020878;0.021701;0.022525;0.02368;0.024834;0.025989;0.027144;0.028299;0.029822;0.031346;0.03287;0.034393;0.035917;0.03769;0.039464;0.041237;0.043011;0.044784;0.047124;0.049465;0.051806;0.054146;0.056487;0.059209;0.061931;0.064654;0.067376;0.070098;0.073673;0.077247;0.080822;0.084396;0.087971;0.092295;0.09662;0.10094;0.10527;0.10959;0.11501;0.12043;0.12585;0.13127;0.13669;0.14362;0.15054;0.15747;0.1644;0.17133;0.17954;0.18776;0.19598;0.2042;0.21241;0.2223;0.23219;0.24208;0.25197;0.26186;0.27399;0.28613;0.29827;0.31041;0.32255;0.33706;0.35158;0.36609;0.38061;0.39513;0.41234;0.42955;0.44676;0.46397;0.48118;0.50187;0.52256;0.54325;0.56394;0.58463;0.60797;0.63131;0.65465;0.678;0.70134;0.72903;0.75673;0.78442;0.81212;0.83981;0.86994;0.90007;0.9302;0.96033;0.99047;1.0241;1.0577;1.0914;1.125;1.1587;1.1954;1.2321;1.2688;1.3054;1.3421;1.3818;1.4214;1.4611;1.5007;1.5404;1.5828;1.6253;1.6678;1.7102;1.7527;1.7968;1.8408;1.8849;1.929;1.9731;2.0189;2.0647;2.1105;2.1563;2.2022;2.2501;2.298;2.346;2.3939;2.4418;2.4901;2.5384;2.5867;2.6349;2.6832;2.7321;2.7811;2.83;2.8789;2.9279;2.9751;3.0224;3.0697;3.117;3.1643;3.2083;3.2524;3.2964;3.3404;3.3844;3.4235;3.4626;3.5017;3.5407;3.5798;3.6112;3.6426;3.674;3.7054;3.7368;3.7602;3.7835;3.8068;3.8302;3.8535;3.8685;3.8836;3.8986;3.9137;3.9288;3.9372;3.9456;3.954;3.9624;3.9708;3.9747;3.9786;3.9825;3.9864;3.9903;3.9918;3.9932;3.9947;3.9961;3.9975;3.9979;3.9983;3.9987;3.9991;3.9995;4
0.0035344;0.0037479;0.0039613;0.0041748;0.0043882;0.0046017;0.0048076;0.0050135;0.0052194;0.0054254;0.0056313;0.0059199;0.0062086;0.0064973;0.006786;0.0070746;0.0074556;0.0078365;0.0082174;0.0085983;0.0089792;0.0094226;0.0098659;0.010309;0.010753;0.011196;0.011781;0.012366;0.012951;0.013537;0.014122;0.014802;0.015483;0.016163;0.016844;0.017525;0.018418;0.019312;0.020205;0.021099;0.021993;0.023074;0.024155;0.025236;0.026317;0.027398;0.028753;0.030108;0.031463;0.032818;0.034173;0.035904;0.037636;0.039368;0.0411;0.042831;0.044886;0.04694;0.048994;0.051049;0.053103;0.055575;0.058047;0.06052;0.062992;0.065464;0.068498;0.071533;0.074568;0.077602;0.080637;0.084266;0.087895;0.091524;0.095153;0.098782;0.10308;0.10739;0.11169;0.11599;0.12029;0.12547;0.13064;0.13581;0.14098;0.14616;0.15199;0.15783;0.16366;0.1695;0.17533;0.18226;0.18918;0.19611;0.20303;0.20995;0.21749;0.22502;0.23255;0.24008;0.24762;0.25603;0.26444;0.27285;0.28126;0.28967;0.29884;0.30801;0.31719;0.32636;0.33554;0.34545;0.35536;0.36527;0.37518;0.3851;0.39571;0.40632;0.41694;0.42755;0.43817;0.44919;0.46021;0.47123;0.48226;0.49328;0.50473;0.51618;0.52763;0.53909;0.55054;0.56252;0.57451;0.58649;0.59847;0.61046;0.62253;0.6346;0.64667;0.65874;0.67081;0.68304;0.69527;0.7075;0.71973;0.73196;0.74379;0.75561;0.76743;0.77925;0.79108;0.80208;0.81309;0.8241;0.8351;0.84611;0.85588;0.86565;0.87541;0.88518;0.89495;0.9028;0.91065;0.9185;0.92635;0.93421;0.94004;0.94587;0.95171;0.95754;0.96337;0.96714;0.9709;0.97466;0.97843;0.98219;0.98429;0.98639;0.9885;0.9906;0.9927;0.99368;0.99465;0.99563;0.99661;0.99758;0.99794;0.9983;0.99866;0.99902;0.99938;0.99948;0.99958;0.99968;0.99978;0.99988;1
+3
View File
@@ -0,0 +1,3 @@
-20,-19.8,-19.6,-19.4,-19.2,-19,-18.8,-18.6,-18.4,-18.2,-18,-17.8,-17.6,-17.4,-17.2,-17,-16.8,-16.6,-16.4,-16.2,-16,-15.8,-15.6,-15.4,-15.2,-15,-14.8,-14.6,-14.4,-14.2,-14,-13.8,-13.6,-13.4,-13.2,-13,-12.8,-12.6,-12.4,-12.2,-12,-11.8,-11.6,-11.4,-11.2,-11,-10.8,-10.6,-10.4,-10.2,-10,-9.8,-9.6,-9.4,-9.2,-9,-8.8,-8.6,-8.4,-8.2,-8,-7.8,-7.6,-7.4,-7.2,-7,-6.8,-6.6,-6.4,-6.2,-6,-5.8,-5.6,-5.4,-5.2,-5,-4.8,-4.6,-4.4,-4.2,-4,-3.8,-3.6,-3.4,-3.2,-3,-2.8,-2.6,-2.4,-2.2,-2,-1.8,-1.6,-1.4,-1.2,-1,-0.8,-0.6,-0.4,-0.2,0,0.2,0.4,0.6,0.8,1,1.2,1.4,1.6,1.8,2,2.2,2.4,2.6,2.8,3,3.2,3.4,3.6,3.8,4,4.2,4.4,4.6,4.8,5,5.2,5.4,5.6,5.8,6,6.2,6.4,6.6,6.8,7,7.2,7.4,7.6,7.8,8,8.2,8.4,8.6,8.8,9,9.2,9.4,9.6,9.8,10,10.2,10.4,10.6,10.8,11,11.2,11.4,11.6,11.8,12,12.2
0.014938,0.015535,0.016131,0.016727,0.017324,0.01792,0.018791,0.019662,0.020533,0.021404,0.022276,0.023689,0.025102,0.026515,0.027928,0.029341,0.030588,0.031835,0.033082,0.034329,0.035575,0.03748,0.039384,0.041289,0.043193,0.045098,0.047475,0.049853,0.05223,0.054607,0.056985,0.059606,0.062228,0.06485,0.067472,0.070094,0.07367,0.077247,0.080824,0.0844,0.087977,0.092384,0.096792,0.1012,0.10561,0.11001,0.11567,0.12133,0.12699,0.13265,0.13831,0.14512,0.15193,0.15874,0.16555,0.17236,0.18045,0.18854,0.19663,0.20472,0.21282,0.22319,0.23357,0.24395,0.25433,0.26471,0.27602,0.28733,0.29863,0.30994,0.32125,0.33583,0.35041,0.36499,0.37957,0.39415,0.4114,0.42865,0.4459,0.46315,0.4804,0.50048,0.52055,0.54063,0.5607,0.58078,0.60421,0.62764,0.65107,0.6745,0.69793,0.72389,0.74984,0.7758,0.80176,0.82771,0.85656,0.88541,0.91425,0.9431,0.97194,1.0031,1.0343,1.0655,1.0967,1.1279,1.1592,1.1905,1.2218,1.2531,1.2845,1.3156,1.3467,1.3778,1.4089,1.44,1.4699,1.4999,1.5298,1.5598,1.5897,1.6156,1.6414,1.6672,1.6931,1.7189,1.7397,1.7606,1.7814,1.8022,1.823,1.839,1.8549,1.8708,1.8868,1.9027,1.9124,1.922,1.9317,1.9414,1.9511,1.9569,1.9628,1.9687,1.9745,1.9804,1.9831,1.9857,1.9884,1.991,1.9937,1.9947,1.9957,1.9967,1.9977,1.9986,1.9989,1.9991,1.9993,1.9996,1.9998,2
0.0074691,0.0077673,0.0080654,0.0083636,0.0086618,0.00896,0.0093955,0.0098311,0.010267,0.010702,0.011138,0.011844,0.012551,0.013257,0.013964,0.014671,0.015294,0.015917,0.016541,0.017164,0.017788,0.01874,0.019692,0.020644,0.021597,0.022549,0.023738,0.024926,0.026115,0.027304,0.028492,0.029803,0.031114,0.032425,0.033736,0.035047,0.036835,0.038623,0.040412,0.0422,0.043988,0.046192,0.048396,0.050599,0.052803,0.055007,0.057836,0.060666,0.063496,0.066325,0.069155,0.07256,0.075965,0.07937,0.082775,0.08618,0.090225,0.094271,0.098317,0.10236,0.10641,0.1116,0.11679,0.12198,0.12717,0.13235,0.13801,0.14366,0.14932,0.15497,0.16063,0.16792,0.17521,0.1825,0.18979,0.19708,0.2057,0.21433,0.22295,0.23158,0.2402,0.25024,0.26028,0.27031,0.28035,0.29039,0.3021,0.31382,0.32553,0.33725,0.34897,0.36194,0.37492,0.3879,0.40088,0.41386,0.42828,0.4427,0.45713,0.47155,0.48597,0.50156,0.51715,0.53275,0.54834,0.56393,0.57959,0.59525,0.61091,0.62657,0.64223,0.65779,0.67334,0.68889,0.70445,0.72,0.73497,0.74994,0.76492,0.77989,0.79486,0.80778,0.8207,0.83362,0.84654,0.85946,0.86987,0.88029,0.8907,0.90111,0.91152,0.91948,0.92745,0.93542,0.94338,0.95135,0.95619,0.96102,0.96586,0.9707,0.97554,0.97847,0.9814,0.98433,0.98727,0.9902,0.99153,0.99286,0.99419,0.99552,0.99685,0.99735,0.99784,0.99834,0.99883,0.99932,0.99944,0.99956,0.99967,0.99979,0.9999,1
1 -20 -19.8 -19.6 -19.4 -19.2 -19 -18.8 -18.6 -18.4 -18.2 -18 -17.8 -17.6 -17.4 -17.2 -17 -16.8 -16.6 -16.4 -16.2 -16 -15.8 -15.6 -15.4 -15.2 -15 -14.8 -14.6 -14.4 -14.2 -14 -13.8 -13.6 -13.4 -13.2 -13 -12.8 -12.6 -12.4 -12.2 -12 -11.8 -11.6 -11.4 -11.2 -11 -10.8 -10.6 -10.4 -10.2 -10 -9.8 -9.6 -9.4 -9.2 -9 -8.8 -8.6 -8.4 -8.2 -8 -7.8 -7.6 -7.4 -7.2 -7 -6.8 -6.6 -6.4 -6.2 -6 -5.8 -5.6 -5.4 -5.2 -5 -4.8 -4.6 -4.4 -4.2 -4 -3.8 -3.6 -3.4 -3.2 -3 -2.8 -2.6 -2.4 -2.2 -2 -1.8 -1.6 -1.4 -1.2 -1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2 2.2 2.4 2.6 2.8 3 3.2 3.4 3.6 3.8 4 4.2 4.4 4.6 4.8 5 5.2 5.4 5.6 5.8 6 6.2 6.4 6.6 6.8 7 7.2 7.4 7.6 7.8 8 8.2 8.4 8.6 8.8 9 9.2 9.4 9.6 9.8 10 10.2 10.4 10.6 10.8 11 11.2 11.4 11.6 11.8 12 12.2
2 0.014938 0.015535 0.016131 0.016727 0.017324 0.01792 0.018791 0.019662 0.020533 0.021404 0.022276 0.023689 0.025102 0.026515 0.027928 0.029341 0.030588 0.031835 0.033082 0.034329 0.035575 0.03748 0.039384 0.041289 0.043193 0.045098 0.047475 0.049853 0.05223 0.054607 0.056985 0.059606 0.062228 0.06485 0.067472 0.070094 0.07367 0.077247 0.080824 0.0844 0.087977 0.092384 0.096792 0.1012 0.10561 0.11001 0.11567 0.12133 0.12699 0.13265 0.13831 0.14512 0.15193 0.15874 0.16555 0.17236 0.18045 0.18854 0.19663 0.20472 0.21282 0.22319 0.23357 0.24395 0.25433 0.26471 0.27602 0.28733 0.29863 0.30994 0.32125 0.33583 0.35041 0.36499 0.37957 0.39415 0.4114 0.42865 0.4459 0.46315 0.4804 0.50048 0.52055 0.54063 0.5607 0.58078 0.60421 0.62764 0.65107 0.6745 0.69793 0.72389 0.74984 0.7758 0.80176 0.82771 0.85656 0.88541 0.91425 0.9431 0.97194 1.0031 1.0343 1.0655 1.0967 1.1279 1.1592 1.1905 1.2218 1.2531 1.2845 1.3156 1.3467 1.3778 1.4089 1.44 1.4699 1.4999 1.5298 1.5598 1.5897 1.6156 1.6414 1.6672 1.6931 1.7189 1.7397 1.7606 1.7814 1.8022 1.823 1.839 1.8549 1.8708 1.8868 1.9027 1.9124 1.922 1.9317 1.9414 1.9511 1.9569 1.9628 1.9687 1.9745 1.9804 1.9831 1.9857 1.9884 1.991 1.9937 1.9947 1.9957 1.9967 1.9977 1.9986 1.9989 1.9991 1.9993 1.9996 1.9998 2
3 0.0074691 0.0077673 0.0080654 0.0083636 0.0086618 0.00896 0.0093955 0.0098311 0.010267 0.010702 0.011138 0.011844 0.012551 0.013257 0.013964 0.014671 0.015294 0.015917 0.016541 0.017164 0.017788 0.01874 0.019692 0.020644 0.021597 0.022549 0.023738 0.024926 0.026115 0.027304 0.028492 0.029803 0.031114 0.032425 0.033736 0.035047 0.036835 0.038623 0.040412 0.0422 0.043988 0.046192 0.048396 0.050599 0.052803 0.055007 0.057836 0.060666 0.063496 0.066325 0.069155 0.07256 0.075965 0.07937 0.082775 0.08618 0.090225 0.094271 0.098317 0.10236 0.10641 0.1116 0.11679 0.12198 0.12717 0.13235 0.13801 0.14366 0.14932 0.15497 0.16063 0.16792 0.17521 0.1825 0.18979 0.19708 0.2057 0.21433 0.22295 0.23158 0.2402 0.25024 0.26028 0.27031 0.28035 0.29039 0.3021 0.31382 0.32553 0.33725 0.34897 0.36194 0.37492 0.3879 0.40088 0.41386 0.42828 0.4427 0.45713 0.47155 0.48597 0.50156 0.51715 0.53275 0.54834 0.56393 0.57959 0.59525 0.61091 0.62657 0.64223 0.65779 0.67334 0.68889 0.70445 0.72 0.73497 0.74994 0.76492 0.77989 0.79486 0.80778 0.8207 0.83362 0.84654 0.85946 0.86987 0.88029 0.8907 0.90111 0.91152 0.91948 0.92745 0.93542 0.94338 0.95135 0.95619 0.96102 0.96586 0.9707 0.97554 0.97847 0.9814 0.98433 0.98727 0.9902 0.99153 0.99286 0.99419 0.99552 0.99685 0.99735 0.99784 0.99834 0.99883 0.99932 0.99944 0.99956 0.99967 0.99979 0.9999 1
+3
View File
@@ -0,0 +1,3 @@
-20;-19.8;-19.6;-19.4;-19.2;-19;-18.8;-18.6;-18.4;-18.2;-18;-17.8;-17.6;-17.4;-17.2;-17;-16.8;-16.6;-16.4;-16.2;-16;-15.8;-15.6;-15.4;-15.2;-15;-14.8;-14.6;-14.4;-14.2;-14;-13.8;-13.6;-13.4;-13.2;-13;-12.8;-12.6;-12.4;-12.2;-12;-11.8;-11.6;-11.4;-11.2;-11;-10.8;-10.6;-10.4;-10.2;-10;-9.8;-9.6;-9.4;-9.2;-9;-8.8;-8.6;-8.4;-8.2;-8;-7.8;-7.6;-7.4;-7.2;-7;-6.8;-6.6;-6.4;-6.2;-6;-5.8;-5.6;-5.4;-5.2;-5;-4.8;-4.6;-4.4;-4.2;-4;-3.8;-3.6;-3.4;-3.2;-3;-2.8;-2.6;-2.4;-2.2;-2;-1.8;-1.6;-1.4;-1.2;-1;-0.8;-0.6;-0.4;-0.2;0;0.2;0.4;0.6;0.8;1;1.2;1.4;1.6;1.8;2;2.2;2.4;2.6;2.8;3;3.2;3.4;3.6;3.8;4;4.2;4.4;4.6;4.8;5;5.2;5.4;5.6;5.8;6;6.2;6.4;6.6;6.8;7;7.2;7.4;7.6;7.8;8;8.2;8.4;8.6;8.8;9;9.2;9.4;9.6;9.8;10;10.2;10.4;10.6;10.8;11;11.2;11.4;11.6;11.8;12;12.2
0.014938;0.015535;0.016131;0.016727;0.017324;0.01792;0.018791;0.019662;0.020533;0.021404;0.022276;0.023689;0.025102;0.026515;0.027928;0.029341;0.030588;0.031835;0.033082;0.034329;0.035575;0.03748;0.039384;0.041289;0.043193;0.045098;0.047475;0.049853;0.05223;0.054607;0.056985;0.059606;0.062228;0.06485;0.067472;0.070094;0.07367;0.077247;0.080824;0.0844;0.087977;0.092384;0.096792;0.1012;0.10561;0.11001;0.11567;0.12133;0.12699;0.13265;0.13831;0.14512;0.15193;0.15874;0.16555;0.17236;0.18045;0.18854;0.19663;0.20472;0.21282;0.22319;0.23357;0.24395;0.25433;0.26471;0.27602;0.28733;0.29863;0.30994;0.32125;0.33583;0.35041;0.36499;0.37957;0.39415;0.4114;0.42865;0.4459;0.46315;0.4804;0.50048;0.52055;0.54063;0.5607;0.58078;0.60421;0.62764;0.65107;0.6745;0.69793;0.72389;0.74984;0.7758;0.80176;0.82771;0.85656;0.88541;0.91425;0.9431;0.97194;1.0031;1.0343;1.0655;1.0967;1.1279;1.1592;1.1905;1.2218;1.2531;1.2845;1.3156;1.3467;1.3778;1.4089;1.44;1.4699;1.4999;1.5298;1.5598;1.5897;1.6156;1.6414;1.6672;1.6931;1.7189;1.7397;1.7606;1.7814;1.8022;1.823;1.839;1.8549;1.8708;1.8868;1.9027;1.9124;1.922;1.9317;1.9414;1.9511;1.9569;1.9628;1.9687;1.9745;1.9804;1.9831;1.9857;1.9884;1.991;1.9937;1.9947;1.9957;1.9967;1.9977;1.9986;1.9989;1.9991;1.9993;1.9996;1.9998;2
0.0074691;0.0077673;0.0080654;0.0083636;0.0086618;0.00896;0.0093955;0.0098311;0.010267;0.010702;0.011138;0.011844;0.012551;0.013257;0.013964;0.014671;0.015294;0.015917;0.016541;0.017164;0.017788;0.01874;0.019692;0.020644;0.021597;0.022549;0.023738;0.024926;0.026115;0.027304;0.028492;0.029803;0.031114;0.032425;0.033736;0.035047;0.036835;0.038623;0.040412;0.0422;0.043988;0.046192;0.048396;0.050599;0.052803;0.055007;0.057836;0.060666;0.063496;0.066325;0.069155;0.07256;0.075965;0.07937;0.082775;0.08618;0.090225;0.094271;0.098317;0.10236;0.10641;0.1116;0.11679;0.12198;0.12717;0.13235;0.13801;0.14366;0.14932;0.15497;0.16063;0.16792;0.17521;0.1825;0.18979;0.19708;0.2057;0.21433;0.22295;0.23158;0.2402;0.25024;0.26028;0.27031;0.28035;0.29039;0.3021;0.31382;0.32553;0.33725;0.34897;0.36194;0.37492;0.3879;0.40088;0.41386;0.42828;0.4427;0.45713;0.47155;0.48597;0.50156;0.51715;0.53275;0.54834;0.56393;0.57959;0.59525;0.61091;0.62657;0.64223;0.65779;0.67334;0.68889;0.70445;0.72;0.73497;0.74994;0.76492;0.77989;0.79486;0.80778;0.8207;0.83362;0.84654;0.85946;0.86987;0.88029;0.8907;0.90111;0.91152;0.91948;0.92745;0.93542;0.94338;0.95135;0.95619;0.96102;0.96586;0.9707;0.97554;0.97847;0.9814;0.98433;0.98727;0.9902;0.99153;0.99286;0.99419;0.99552;0.99685;0.99735;0.99784;0.99834;0.99883;0.99932;0.99944;0.99956;0.99967;0.99979;0.9999;1
+3
View File
@@ -0,0 +1,3 @@
-20,-19.8,-19.6,-19.4,-19.2,-19,-18.8,-18.6,-18.4,-18.2,-18,-17.8,-17.6,-17.4,-17.2,-17,-16.8,-16.6,-16.4,-16.2,-16,-15.8,-15.6,-15.4,-15.2,-15,-14.8,-14.6,-14.4,-14.2,-14,-13.8,-13.6,-13.4,-13.2,-13,-12.8,-12.6,-12.4,-12.2,-12,-11.8,-11.6,-11.4,-11.2,-11,-10.8,-10.6,-10.4,-10.2,-10,-9.8,-9.6,-9.4,-9.2,-9,-8.8,-8.6,-8.4,-8.2,-8,-7.8,-7.6,-7.4,-7.2,-7,-6.8,-6.6,-6.4,-6.2,-6,-5.8,-5.6,-5.4,-5.2,-5,-4.8,-4.6,-4.4,-4.2,-4,-3.8,-3.6,-3.4,-3.2,-3,-2.8,-2.6,-2.4,-2.2,-2,-1.8,-1.6,-1.4,-1.2,-1,-0.8,-0.6,-0.4,-0.2,0,0.2,0.4,0.6,0.8,1,1.2,1.4,1.6,1.8,2,2.2,2.4,2.6,2.8,3,3.2,3.4,3.6,3.8,4,4.2,4.4,4.6,4.8,5,5.2,5.4,5.6,5.8,6,6.2,6.4,6.6,6.8,7,7.2,7.4,7.6,7.8,8,8.2,8.4,8.6,8.8,9,9.2,9.4,9.6,9.8,10,10.2,10.4,10.6,10.8,11,11.2,11.4,11.6,11.8,12,12.2,12.4,12.6,12.8,13,13.2,13.4,13.6,13.8,14,14.2,14.4,14.6,14.8,15,15.2,15.4,15.6,15.8,16,16.2,16.4,16.6,16.8,17,17.2,17.4,17.6,17.8,18,18.2,18.4,18.6,18.8,19,19.2,19.4,19.6,19.8,20,20.2,20.4,20.6,20.8,21,21.2,21.4,21.6,21.8,22,22.2,22.4,22.6,22.8,23,23.2,23.4,23.6,23.8,24,24.2,24.4,24.6,24.8,25,25.2
0.014329,0.015063,0.015797,0.016531,0.017266,0.018,0.01893,0.01986,0.020791,0.021721,0.022651,0.023849,0.025047,0.026245,0.027443,0.028642,0.03008,0.031518,0.032957,0.034395,0.035834,0.037611,0.039388,0.041166,0.042943,0.04472,0.046979,0.049237,0.051496,0.053755,0.056013,0.058941,0.061869,0.064797,0.067725,0.070653,0.074193,0.077734,0.081274,0.084814,0.088355,0.092706,0.097057,0.10141,0.10576,0.11011,0.11555,0.121,0.12644,0.13188,0.13733,0.14408,0.15084,0.1576,0.16435,0.17111,0.17937,0.18763,0.19589,0.20415,0.21241,0.22245,0.23248,0.24252,0.25256,0.2626,0.27469,0.28678,0.29888,0.31097,0.32306,0.33766,0.35225,0.36685,0.38144,0.39604,0.41344,0.43084,0.44824,0.46564,0.48304,0.50338,0.52372,0.54407,0.56441,0.58475,0.60833,0.63192,0.6555,0.67908,0.70266,0.73007,0.75747,0.78488,0.81228,0.83969,0.86999,0.9003,0.9306,0.96091,0.99121,1.0254,1.0595,1.0937,1.1279,1.162,1.1993,1.2365,1.2737,1.3109,1.3482,1.3887,1.4293,1.4699,1.5104,1.551,1.5939,1.6368,1.6797,1.7226,1.7655,1.8112,1.8568,1.9025,1.9482,1.9938,2.041,2.0882,2.1353,2.1825,2.2296,2.2795,2.3293,2.3791,2.4289,2.4788,2.53,2.5813,2.6326,2.6839,2.7351,2.7877,2.8403,2.8929,2.9455,2.9981,3.0522,3.1063,3.1604,3.2145,3.2686,3.3237,3.3788,3.4339,3.489,3.5441,3.6003,3.6564,3.7125,3.7686,3.8247,3.8815,3.9384,3.9952,4.052,4.1089,4.1662,4.2235,4.2808,4.3381,4.3954,4.4527,4.5099,4.5671,4.6244,4.6816,4.7375,4.7934,4.8492,4.9051,4.961,5.0138,5.0666,5.1195,5.1723,5.2251,5.2722,5.3192,5.3662,5.4132,5.4603,5.4992,5.538,5.5769,5.6158,5.6547,5.684,5.7134,5.7427,5.772,5.8013,5.821,5.8408,5.8605,5.8803,5.9,5.9114,5.9229,5.9343,5.9458,5.9572,5.9628,5.9684,5.974,5.9796,5.9852,5.9874,5.9895,5.9917,5.9938,5.996,5.9967,5.9973,5.998,5.9986,5.9993,6
0.0023882,0.0025106,0.0026329,0.0027552,0.0028776,0.0029999,0.003155,0.00331,0.0034651,0.0036202,0.0037752,0.0039749,0.0041746,0.0043742,0.0045739,0.0047736,0.0050133,0.0052531,0.0054928,0.0057325,0.0059723,0.0062685,0.0065647,0.0068609,0.0071571,0.0074534,0.0078298,0.0082062,0.0085827,0.0089591,0.0093356,0.0098236,0.010312,0.0108,0.011288,0.011776,0.012366,0.012956,0.013546,0.014136,0.014726,0.015451,0.016176,0.016901,0.017627,0.018352,0.019259,0.020166,0.021073,0.02198,0.022888,0.024014,0.02514,0.026266,0.027392,0.028519,0.029895,0.031272,0.032648,0.034025,0.035401,0.037074,0.038747,0.04042,0.042094,0.043767,0.045782,0.047797,0.049813,0.051828,0.053844,0.056276,0.058709,0.061141,0.063574,0.066006,0.068906,0.071806,0.074706,0.077606,0.080506,0.083897,0.087287,0.090678,0.094068,0.097458,0.10139,0.10532,0.10925,0.11318,0.11711,0.12168,0.12625,0.13081,0.13538,0.13995,0.145,0.15005,0.1551,0.16015,0.1652,0.1709,0.17659,0.18228,0.18798,0.19367,0.19988,0.20608,0.21229,0.21849,0.22469,0.23146,0.23822,0.24498,0.25174,0.2585,0.26565,0.2728,0.27995,0.2871,0.29425,0.30186,0.30947,0.31708,0.32469,0.3323,0.34016,0.34803,0.35589,0.36375,0.37161,0.37991,0.38822,0.39652,0.40482,0.41313,0.42167,0.43022,0.43876,0.44731,0.45586,0.46462,0.47338,0.48215,0.49091,0.49968,0.50869,0.51771,0.52673,0.53575,0.54476,0.55395,0.56313,0.57232,0.58151,0.59069,0.60004,0.6094,0.61875,0.6281,0.63745,0.64692,0.6564,0.66587,0.67534,0.68481,0.69437,0.70392,0.71347,0.72302,0.73257,0.74211,0.75165,0.76119,0.77073,0.78026,0.78958,0.79889,0.80821,0.81752,0.82683,0.83564,0.84444,0.85325,0.86205,0.87085,0.87869,0.88653,0.89437,0.90221,0.91004,0.91653,0.92301,0.92949,0.93597,0.94245,0.94734,0.95223,0.95711,0.962,0.96688,0.97017,0.97346,0.97675,0.98004,0.98333,0.98524,0.98715,0.98906,0.99096,0.99287,0.9938,0.99474,0.99567,0.9966,0.99754,0.9979,0.99826,0.99862,0.99897,0.99933,0.99944,0.99955,0.99966,0.99977,0.99988,1
1 -20 -19.8 -19.6 -19.4 -19.2 -19 -18.8 -18.6 -18.4 -18.2 -18 -17.8 -17.6 -17.4 -17.2 -17 -16.8 -16.6 -16.4 -16.2 -16 -15.8 -15.6 -15.4 -15.2 -15 -14.8 -14.6 -14.4 -14.2 -14 -13.8 -13.6 -13.4 -13.2 -13 -12.8 -12.6 -12.4 -12.2 -12 -11.8 -11.6 -11.4 -11.2 -11 -10.8 -10.6 -10.4 -10.2 -10 -9.8 -9.6 -9.4 -9.2 -9 -8.8 -8.6 -8.4 -8.2 -8 -7.8 -7.6 -7.4 -7.2 -7 -6.8 -6.6 -6.4 -6.2 -6 -5.8 -5.6 -5.4 -5.2 -5 -4.8 -4.6 -4.4 -4.2 -4 -3.8 -3.6 -3.4 -3.2 -3 -2.8 -2.6 -2.4 -2.2 -2 -1.8 -1.6 -1.4 -1.2 -1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2 2.2 2.4 2.6 2.8 3 3.2 3.4 3.6 3.8 4 4.2 4.4 4.6 4.8 5 5.2 5.4 5.6 5.8 6 6.2 6.4 6.6 6.8 7 7.2 7.4 7.6 7.8 8 8.2 8.4 8.6 8.8 9 9.2 9.4 9.6 9.8 10 10.2 10.4 10.6 10.8 11 11.2 11.4 11.6 11.8 12 12.2 12.4 12.6 12.8 13 13.2 13.4 13.6 13.8 14 14.2 14.4 14.6 14.8 15 15.2 15.4 15.6 15.8 16 16.2 16.4 16.6 16.8 17 17.2 17.4 17.6 17.8 18 18.2 18.4 18.6 18.8 19 19.2 19.4 19.6 19.8 20 20.2 20.4 20.6 20.8 21 21.2 21.4 21.6 21.8 22 22.2 22.4 22.6 22.8 23 23.2 23.4 23.6 23.8 24 24.2 24.4 24.6 24.8 25 25.2
2 0.014329 0.015063 0.015797 0.016531 0.017266 0.018 0.01893 0.01986 0.020791 0.021721 0.022651 0.023849 0.025047 0.026245 0.027443 0.028642 0.03008 0.031518 0.032957 0.034395 0.035834 0.037611 0.039388 0.041166 0.042943 0.04472 0.046979 0.049237 0.051496 0.053755 0.056013 0.058941 0.061869 0.064797 0.067725 0.070653 0.074193 0.077734 0.081274 0.084814 0.088355 0.092706 0.097057 0.10141 0.10576 0.11011 0.11555 0.121 0.12644 0.13188 0.13733 0.14408 0.15084 0.1576 0.16435 0.17111 0.17937 0.18763 0.19589 0.20415 0.21241 0.22245 0.23248 0.24252 0.25256 0.2626 0.27469 0.28678 0.29888 0.31097 0.32306 0.33766 0.35225 0.36685 0.38144 0.39604 0.41344 0.43084 0.44824 0.46564 0.48304 0.50338 0.52372 0.54407 0.56441 0.58475 0.60833 0.63192 0.6555 0.67908 0.70266 0.73007 0.75747 0.78488 0.81228 0.83969 0.86999 0.9003 0.9306 0.96091 0.99121 1.0254 1.0595 1.0937 1.1279 1.162 1.1993 1.2365 1.2737 1.3109 1.3482 1.3887 1.4293 1.4699 1.5104 1.551 1.5939 1.6368 1.6797 1.7226 1.7655 1.8112 1.8568 1.9025 1.9482 1.9938 2.041 2.0882 2.1353 2.1825 2.2296 2.2795 2.3293 2.3791 2.4289 2.4788 2.53 2.5813 2.6326 2.6839 2.7351 2.7877 2.8403 2.8929 2.9455 2.9981 3.0522 3.1063 3.1604 3.2145 3.2686 3.3237 3.3788 3.4339 3.489 3.5441 3.6003 3.6564 3.7125 3.7686 3.8247 3.8815 3.9384 3.9952 4.052 4.1089 4.1662 4.2235 4.2808 4.3381 4.3954 4.4527 4.5099 4.5671 4.6244 4.6816 4.7375 4.7934 4.8492 4.9051 4.961 5.0138 5.0666 5.1195 5.1723 5.2251 5.2722 5.3192 5.3662 5.4132 5.4603 5.4992 5.538 5.5769 5.6158 5.6547 5.684 5.7134 5.7427 5.772 5.8013 5.821 5.8408 5.8605 5.8803 5.9 5.9114 5.9229 5.9343 5.9458 5.9572 5.9628 5.9684 5.974 5.9796 5.9852 5.9874 5.9895 5.9917 5.9938 5.996 5.9967 5.9973 5.998 5.9986 5.9993 6
3 0.0023882 0.0025106 0.0026329 0.0027552 0.0028776 0.0029999 0.003155 0.00331 0.0034651 0.0036202 0.0037752 0.0039749 0.0041746 0.0043742 0.0045739 0.0047736 0.0050133 0.0052531 0.0054928 0.0057325 0.0059723 0.0062685 0.0065647 0.0068609 0.0071571 0.0074534 0.0078298 0.0082062 0.0085827 0.0089591 0.0093356 0.0098236 0.010312 0.0108 0.011288 0.011776 0.012366 0.012956 0.013546 0.014136 0.014726 0.015451 0.016176 0.016901 0.017627 0.018352 0.019259 0.020166 0.021073 0.02198 0.022888 0.024014 0.02514 0.026266 0.027392 0.028519 0.029895 0.031272 0.032648 0.034025 0.035401 0.037074 0.038747 0.04042 0.042094 0.043767 0.045782 0.047797 0.049813 0.051828 0.053844 0.056276 0.058709 0.061141 0.063574 0.066006 0.068906 0.071806 0.074706 0.077606 0.080506 0.083897 0.087287 0.090678 0.094068 0.097458 0.10139 0.10532 0.10925 0.11318 0.11711 0.12168 0.12625 0.13081 0.13538 0.13995 0.145 0.15005 0.1551 0.16015 0.1652 0.1709 0.17659 0.18228 0.18798 0.19367 0.19988 0.20608 0.21229 0.21849 0.22469 0.23146 0.23822 0.24498 0.25174 0.2585 0.26565 0.2728 0.27995 0.2871 0.29425 0.30186 0.30947 0.31708 0.32469 0.3323 0.34016 0.34803 0.35589 0.36375 0.37161 0.37991 0.38822 0.39652 0.40482 0.41313 0.42167 0.43022 0.43876 0.44731 0.45586 0.46462 0.47338 0.48215 0.49091 0.49968 0.50869 0.51771 0.52673 0.53575 0.54476 0.55395 0.56313 0.57232 0.58151 0.59069 0.60004 0.6094 0.61875 0.6281 0.63745 0.64692 0.6564 0.66587 0.67534 0.68481 0.69437 0.70392 0.71347 0.72302 0.73257 0.74211 0.75165 0.76119 0.77073 0.78026 0.78958 0.79889 0.80821 0.81752 0.82683 0.83564 0.84444 0.85325 0.86205 0.87085 0.87869 0.88653 0.89437 0.90221 0.91004 0.91653 0.92301 0.92949 0.93597 0.94245 0.94734 0.95223 0.95711 0.962 0.96688 0.97017 0.97346 0.97675 0.98004 0.98333 0.98524 0.98715 0.98906 0.99096 0.99287 0.9938 0.99474 0.99567 0.9966 0.99754 0.9979 0.99826 0.99862 0.99897 0.99933 0.99944 0.99955 0.99966 0.99977 0.99988 1
+3
View File
@@ -0,0 +1,3 @@
-20;-19.8;-19.6;-19.4;-19.2;-19;-18.8;-18.6;-18.4;-18.2;-18;-17.8;-17.6;-17.4;-17.2;-17;-16.8;-16.6;-16.4;-16.2;-16;-15.8;-15.6;-15.4;-15.2;-15;-14.8;-14.6;-14.4;-14.2;-14;-13.8;-13.6;-13.4;-13.2;-13;-12.8;-12.6;-12.4;-12.2;-12;-11.8;-11.6;-11.4;-11.2;-11;-10.8;-10.6;-10.4;-10.2;-10;-9.8;-9.6;-9.4;-9.2;-9;-8.8;-8.6;-8.4;-8.2;-8;-7.8;-7.6;-7.4;-7.2;-7;-6.8;-6.6;-6.4;-6.2;-6;-5.8;-5.6;-5.4;-5.2;-5;-4.8;-4.6;-4.4;-4.2;-4;-3.8;-3.6;-3.4;-3.2;-3;-2.8;-2.6;-2.4;-2.2;-2;-1.8;-1.6;-1.4;-1.2;-1;-0.8;-0.6;-0.4;-0.2;0;0.2;0.4;0.6;0.8;1;1.2;1.4;1.6;1.8;2;2.2;2.4;2.6;2.8;3;3.2;3.4;3.6;3.8;4;4.2;4.4;4.6;4.8;5;5.2;5.4;5.6;5.8;6;6.2;6.4;6.6;6.8;7;7.2;7.4;7.6;7.8;8;8.2;8.4;8.6;8.8;9;9.2;9.4;9.6;9.8;10;10.2;10.4;10.6;10.8;11;11.2;11.4;11.6;11.8;12;12.2;12.4;12.6;12.8;13;13.2;13.4;13.6;13.8;14;14.2;14.4;14.6;14.8;15;15.2;15.4;15.6;15.8;16;16.2;16.4;16.6;16.8;17;17.2;17.4;17.6;17.8;18;18.2;18.4;18.6;18.8;19;19.2;19.4;19.6;19.8;20;20.2;20.4;20.6;20.8;21;21.2;21.4;21.6;21.8;22;22.2;22.4;22.6;22.8;23;23.2;23.4;23.6;23.8;24;24.2;24.4;24.6;24.8;25;25.2
0.014329;0.015063;0.015797;0.016531;0.017266;0.018;0.01893;0.01986;0.020791;0.021721;0.022651;0.023849;0.025047;0.026245;0.027443;0.028642;0.03008;0.031518;0.032957;0.034395;0.035834;0.037611;0.039388;0.041166;0.042943;0.04472;0.046979;0.049237;0.051496;0.053755;0.056013;0.058941;0.061869;0.064797;0.067725;0.070653;0.074193;0.077734;0.081274;0.084814;0.088355;0.092706;0.097057;0.10141;0.10576;0.11011;0.11555;0.121;0.12644;0.13188;0.13733;0.14408;0.15084;0.1576;0.16435;0.17111;0.17937;0.18763;0.19589;0.20415;0.21241;0.22245;0.23248;0.24252;0.25256;0.2626;0.27469;0.28678;0.29888;0.31097;0.32306;0.33766;0.35225;0.36685;0.38144;0.39604;0.41344;0.43084;0.44824;0.46564;0.48304;0.50338;0.52372;0.54407;0.56441;0.58475;0.60833;0.63192;0.6555;0.67908;0.70266;0.73007;0.75747;0.78488;0.81228;0.83969;0.86999;0.9003;0.9306;0.96091;0.99121;1.0254;1.0595;1.0937;1.1279;1.162;1.1993;1.2365;1.2737;1.3109;1.3482;1.3887;1.4293;1.4699;1.5104;1.551;1.5939;1.6368;1.6797;1.7226;1.7655;1.8112;1.8568;1.9025;1.9482;1.9938;2.041;2.0882;2.1353;2.1825;2.2296;2.2795;2.3293;2.3791;2.4289;2.4788;2.53;2.5813;2.6326;2.6839;2.7351;2.7877;2.8403;2.8929;2.9455;2.9981;3.0522;3.1063;3.1604;3.2145;3.2686;3.3237;3.3788;3.4339;3.489;3.5441;3.6003;3.6564;3.7125;3.7686;3.8247;3.8815;3.9384;3.9952;4.052;4.1089;4.1662;4.2235;4.2808;4.3381;4.3954;4.4527;4.5099;4.5671;4.6244;4.6816;4.7375;4.7934;4.8492;4.9051;4.961;5.0138;5.0666;5.1195;5.1723;5.2251;5.2722;5.3192;5.3662;5.4132;5.4603;5.4992;5.538;5.5769;5.6158;5.6547;5.684;5.7134;5.7427;5.772;5.8013;5.821;5.8408;5.8605;5.8803;5.9;5.9114;5.9229;5.9343;5.9458;5.9572;5.9628;5.9684;5.974;5.9796;5.9852;5.9874;5.9895;5.9917;5.9938;5.996;5.9967;5.9973;5.998;5.9986;5.9993;6
0.0023882;0.0025106;0.0026329;0.0027552;0.0028776;0.0029999;0.003155;0.00331;0.0034651;0.0036202;0.0037752;0.0039749;0.0041746;0.0043742;0.0045739;0.0047736;0.0050133;0.0052531;0.0054928;0.0057325;0.0059723;0.0062685;0.0065647;0.0068609;0.0071571;0.0074534;0.0078298;0.0082062;0.0085827;0.0089591;0.0093356;0.0098236;0.010312;0.0108;0.011288;0.011776;0.012366;0.012956;0.013546;0.014136;0.014726;0.015451;0.016176;0.016901;0.017627;0.018352;0.019259;0.020166;0.021073;0.02198;0.022888;0.024014;0.02514;0.026266;0.027392;0.028519;0.029895;0.031272;0.032648;0.034025;0.035401;0.037074;0.038747;0.04042;0.042094;0.043767;0.045782;0.047797;0.049813;0.051828;0.053844;0.056276;0.058709;0.061141;0.063574;0.066006;0.068906;0.071806;0.074706;0.077606;0.080506;0.083897;0.087287;0.090678;0.094068;0.097458;0.10139;0.10532;0.10925;0.11318;0.11711;0.12168;0.12625;0.13081;0.13538;0.13995;0.145;0.15005;0.1551;0.16015;0.1652;0.1709;0.17659;0.18228;0.18798;0.19367;0.19988;0.20608;0.21229;0.21849;0.22469;0.23146;0.23822;0.24498;0.25174;0.2585;0.26565;0.2728;0.27995;0.2871;0.29425;0.30186;0.30947;0.31708;0.32469;0.3323;0.34016;0.34803;0.35589;0.36375;0.37161;0.37991;0.38822;0.39652;0.40482;0.41313;0.42167;0.43022;0.43876;0.44731;0.45586;0.46462;0.47338;0.48215;0.49091;0.49968;0.50869;0.51771;0.52673;0.53575;0.54476;0.55395;0.56313;0.57232;0.58151;0.59069;0.60004;0.6094;0.61875;0.6281;0.63745;0.64692;0.6564;0.66587;0.67534;0.68481;0.69437;0.70392;0.71347;0.72302;0.73257;0.74211;0.75165;0.76119;0.77073;0.78026;0.78958;0.79889;0.80821;0.81752;0.82683;0.83564;0.84444;0.85325;0.86205;0.87085;0.87869;0.88653;0.89437;0.90221;0.91004;0.91653;0.92301;0.92949;0.93597;0.94245;0.94734;0.95223;0.95711;0.962;0.96688;0.97017;0.97346;0.97675;0.98004;0.98333;0.98524;0.98715;0.98906;0.99096;0.99287;0.9938;0.99474;0.99567;0.9966;0.99754;0.9979;0.99826;0.99862;0.99897;0.99933;0.99944;0.99955;0.99966;0.99977;0.99988;1
+200
View File
@@ -0,0 +1,200 @@
#include <string.h>
#include <math.h>
#include <unistd.h>
#include <stdint.h>
#include <stdio.h>
#include <time.h>
#include "init_lte.h"
#include "PHY/extern.h"
#include "MAC_INTERFACE/extern.h"
#ifdef OPENAIR2
#include "LAYER2/MAC/defs.h"
#include "LAYER2/MAC/extern.h"
#include "UTIL/LOG/log_if.h"
#include "PHY_INTERFACE/extern.h"
#endif
PHY_VARS_eNB* init_lte_eNB(LTE_DL_FRAME_PARMS *frame_parms,
u8 eNB_id,
u8 Nid_cell,
u8 cooperation_flag,
u8 transmission_mode,
u8 abstraction_flag) {
int i,j;
PHY_VARS_eNB* PHY_vars_eNB = malloc(sizeof(PHY_VARS_eNB));
memset(PHY_vars_eNB,0,sizeof(PHY_VARS_eNB));
PHY_vars_eNB->Mod_id=eNB_id;
PHY_vars_eNB->cooperation_flag=cooperation_flag;
memcpy(&(PHY_vars_eNB->lte_frame_parms), frame_parms, sizeof(LTE_DL_FRAME_PARMS));
PHY_vars_eNB->lte_frame_parms.Nid_cell = ((Nid_cell/3)*3)+((eNB_id+Nid_cell)%3);
PHY_vars_eNB->lte_frame_parms.nushift = PHY_vars_eNB->lte_frame_parms.Nid_cell%6;
phy_init_lte_eNB(PHY_vars_eNB,0,cooperation_flag,abstraction_flag);
LOG_I(PHY,"init eNB: Nid_cell %d\n", frame_parms->Nid_cell);
LOG_I(PHY,"init eNB: frame_type %d,tdd_config %d\n", frame_parms->frame_type,frame_parms->tdd_config);
LOG_I(PHY,"init eNB: number of ue max %d number of enb max %d number of harq pid max %d\n",
NUMBER_OF_UE_MAX, NUMBER_OF_eNB_MAX, NUMBER_OF_HARQ_PID_MAX);
for (i=0;i<NUMBER_OF_UE_MAX;i++) {
for (j=0;j<2;j++) {
PHY_vars_eNB->dlsch_eNB[i][j] = new_eNB_dlsch(1,NUMBER_OF_HARQ_PID_MAX,frame_parms->N_RB_DL,abstraction_flag);
if (!PHY_vars_eNB->dlsch_eNB[i][j]) {
LOG_E(PHY,"Can't get eNB dlsch structures for UE %d \n", i);
exit(-1);
}
else {
LOG_D(PHY,"dlsch_eNB[%d][%d] => %p\n",i,j,PHY_vars_eNB->dlsch_eNB[i][j]);
PHY_vars_eNB->dlsch_eNB[i][j]->rnti=0;
}
}
PHY_vars_eNB->ulsch_eNB[1+i] = new_eNB_ulsch(NUMBER_OF_HARQ_PID_MAX,MAX_TURBO_ITERATIONS, frame_parms->N_RB_UL, abstraction_flag);
if (!PHY_vars_eNB->ulsch_eNB[1+i]) {
LOG_E(PHY,"Can't get eNB ulsch structures\n");
exit(-1);
}
PHY_vars_eNB->dlsch_eNB_MCH = new_eNB_dlsch(1,NUMBER_OF_HARQ_PID_MAX,frame_parms->N_RB_DL, 0);
// this is the transmission mode for the signalling channels
// this will be overwritten with the real transmission mode by the RRC once the UE is connected
PHY_vars_eNB->transmission_mode[i] = transmission_mode;
}
// ULSCH for RA
PHY_vars_eNB->ulsch_eNB[0] = new_eNB_ulsch(NUMBER_OF_HARQ_PID_MAX,MAX_TURBO_ITERATIONS, frame_parms->N_RB_UL, abstraction_flag);
if (!PHY_vars_eNB->ulsch_eNB[0]) {
LOG_E(PHY,"Can't get eNB ulsch structures\n");
exit(-1);
}
PHY_vars_eNB->dlsch_eNB_SI = new_eNB_dlsch(1,1,frame_parms->N_RB_DL, abstraction_flag);
LOG_D(PHY,"eNB %d : SI %p\n",eNB_id,PHY_vars_eNB->dlsch_eNB_SI);
PHY_vars_eNB->dlsch_eNB_ra = new_eNB_dlsch(1,1,frame_parms->N_RB_DL, abstraction_flag);
LOG_D(PHY,"eNB %d : RA %p\n",eNB_id,PHY_vars_eNB->dlsch_eNB_ra);
PHY_vars_eNB->rx_total_gain_eNB_dB=140;
for(i=0;i<NUMBER_OF_UE_MAX;i++)
PHY_vars_eNB->mu_mimo_mode[i].dl_pow_off = 2;
PHY_vars_eNB->check_for_total_transmissions = 0;
PHY_vars_eNB->check_for_MUMIMO_transmissions = 0;
PHY_vars_eNB->FULL_MUMIMO_transmissions = 0;
PHY_vars_eNB->check_for_SUMIMO_transmissions = 0;
PHY_vars_eNB->lte_frame_parms.pucch_config_common.deltaPUCCH_Shift = 1;
return (PHY_vars_eNB);
}
PHY_VARS_UE* init_lte_UE(LTE_DL_FRAME_PARMS *frame_parms,
u8 UE_id,
u8 abstraction_flag,
u8 transmission_mode) {
int i,j;
PHY_VARS_UE* PHY_vars_UE = malloc(sizeof(PHY_VARS_UE));
memset(PHY_vars_UE,0,sizeof(PHY_VARS_UE));
PHY_vars_UE->Mod_id=UE_id;
memcpy(&(PHY_vars_UE->lte_frame_parms), frame_parms, sizeof(LTE_DL_FRAME_PARMS));
phy_init_lte_ue(PHY_vars_UE,1,abstraction_flag);
for (i=0;i<NUMBER_OF_CONNECTED_eNB_MAX;i++) {
for (j=0;j<2;j++) {
PHY_vars_UE->dlsch_ue[i][j] = new_ue_dlsch(1,NUMBER_OF_HARQ_PID_MAX,MAX_TURBO_ITERATIONS,frame_parms->N_RB_DL, abstraction_flag);
if (!PHY_vars_UE->dlsch_ue[i][j]) {
LOG_E(PHY,"Can't get ue dlsch structures\n");
exit(-1);
}
else
LOG_D(PHY,"dlsch_ue[%d][%d] => %p\n",UE_id,i,PHY_vars_UE->dlsch_ue[i][j]);
}
PHY_vars_UE->ulsch_ue[i] = new_ue_ulsch(NUMBER_OF_HARQ_PID_MAX,frame_parms->N_RB_UL, abstraction_flag);
if (!PHY_vars_UE->ulsch_ue[i]) {
LOG_E(PHY,"Can't get ue ulsch structures\n");
exit(-1);
}
PHY_vars_UE->dlsch_ue_SI[i] = new_ue_dlsch(1,1,MAX_TURBO_ITERATIONS,frame_parms->N_RB_DL, abstraction_flag);
PHY_vars_UE->dlsch_ue_ra[i] = new_ue_dlsch(1,1,MAX_TURBO_ITERATIONS,frame_parms->N_RB_DL, abstraction_flag);
PHY_vars_UE->transmission_mode[i] = transmission_mode;
}
PHY_vars_UE->lte_frame_parms.pucch_config_common.deltaPUCCH_Shift = 1;
PHY_vars_UE->dlsch_ue_MCH[0] = new_ue_dlsch(1,NUMBER_OF_HARQ_PID_MAX,MAX_TURBO_ITERATIONS_MBSFN,frame_parms->N_RB_DL,0);
return (PHY_vars_UE);
}
void init_lte_vars(LTE_DL_FRAME_PARMS **frame_parms,
u8 frame_type,
u8 tdd_config,
u8 tdd_config_S,
u8 extended_prefix_flag,
u8 N_RB_DL,
u16 Nid_cell,
u8 cooperation_flag,u8 transmission_mode,u8 abstraction_flag,
int nb_antennas_rx) {
u8 eNB_id,UE_id;
mac_xface = malloc(sizeof(MAC_xface));
LOG_I(PHY,"init lte parms: Nid_cell %d, Frame type %d, N_RB_DL %d\n",Nid_cell,frame_type,N_RB_DL);
*frame_parms = malloc(sizeof(LTE_DL_FRAME_PARMS));
(*frame_parms)->frame_type = frame_type;
(*frame_parms)->tdd_config = tdd_config;
(*frame_parms)->tdd_config_S = tdd_config_S;
(*frame_parms)->N_RB_DL = N_RB_DL;
(*frame_parms)->N_RB_UL = (*frame_parms)->N_RB_DL;
(*frame_parms)->phich_config_common.phich_resource = oneSixth;
(*frame_parms)->phich_config_common.phich_duration = normal;
(*frame_parms)->Ncp = extended_prefix_flag;
(*frame_parms)->Nid_cell = Nid_cell;
(*frame_parms)->nushift = (Nid_cell%6);
(*frame_parms)->nb_antennas_tx = (transmission_mode == 1) ? 1 : 2;
(*frame_parms)->nb_antennas_tx_eNB = (transmission_mode == 1) ? 1 : 2;
(*frame_parms)->nb_antennas_rx = (transmission_mode == 1) ? 1 : 2;
(*frame_parms)->mode1_flag = (transmission_mode == 1) ? 1 : 0;
init_frame_parms(*frame_parms,1);
(*frame_parms)->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = 0;//n_DMRS1 set to 0
(*frame_parms)->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 1;
(*frame_parms)->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0;
(*frame_parms)->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0;
init_ul_hopping(*frame_parms);
phy_init_top(*frame_parms);
phy_init_lte_top(*frame_parms);
PHY_vars_eNB_g = malloc(NB_eNB_INST*sizeof(PHY_VARS_eNB*));
for (eNB_id=0; eNB_id<NB_eNB_INST;eNB_id++){
PHY_vars_eNB_g[eNB_id] = init_lte_eNB(*frame_parms,eNB_id,Nid_cell,cooperation_flag,transmission_mode,abstraction_flag);
}
(*frame_parms)->nb_antennas_tx = 1;
(*frame_parms)->nb_antennas_rx = nb_antennas_rx;
PHY_vars_UE_g = malloc(NB_UE_INST*sizeof(PHY_VARS_UE*));
for (UE_id=0; UE_id<NB_UE_INST;UE_id++){ // begin navid
PHY_vars_UE_g[UE_id] = init_lte_UE(*frame_parms, UE_id,abstraction_flag,transmission_mode);
}
}
+27
View File
@@ -0,0 +1,27 @@
#include "PHY/types.h"
#include "PHY/defs.h"
PHY_VARS_eNB* init_lte_eNB(LTE_DL_FRAME_PARMS *frame_parms,
u8 eNB_id,
u8 Nid_cell,
u8 cooperation_flag,
u8 transmission_mode,
u8 abstraction_flag);
PHY_VARS_UE* init_lte_UE(LTE_DL_FRAME_PARMS *frame_parms,
u8 UE_id,
u8 abstraction_flag,
u8 transmission_mode);
void init_lte_vars(LTE_DL_FRAME_PARMS **frame_parms,
u8 frame_type,
u8 tdd_config,
u8 tdd_config_S,
u8 extended_prefix_flag,
u8 N_RB_DL,
u16 Nid_cell,
u8 cooperation_flag,
u8 transmission_mode,
u8 abstraction_flag,
int nb_antennas_rx);
File diff suppressed because it is too large Load Diff
+47
View File
@@ -0,0 +1,47 @@
#include <string.h>
#include <math.h>
#include <unistd.h>
#include <stdint.h>
#include <stdio.h>
#include <time.h>
#include "SIMULATION/TOOLS/defs.h"
#include "SIMULATION/RF/defs.h"
#include "PHY/types.h"
#include "PHY/defs.h"
#include "oaisim_config.h"
#include "init_lte.h"
#ifdef OPENAIR2
#include "LAYER2/MAC/defs.h"
#include "UTIL/OMV/structures.h"
#endif
void init_channel_vars(LTE_DL_FRAME_PARMS *frame_parms, double ***s_re,double ***s_im,double ***r_re,double ***r_im,double ***r_re0,double ***r_im0);
void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX],node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],u16 next_slot,u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms, u32);
void do_DL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX],node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],u16 next_slot,u8 abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,u8 UE_id);
void init_ue(node_desc_t *ue_data, UE_Antenna ue_ant);//Abstraction changes
void init_enb(node_desc_t *enb_data, eNB_Antenna enb_ant);//Abstraction changes
void extract_position(Node_list input_node_list, node_desc_t**, int nb_nodes);//Abstraction changes
void get_beta_map();//Abstraction changes
void get_MIESM_param(void);
void init_snr(channel_desc_t *, node_desc_t *, node_desc_t *, double*, double*, u8, u16, u8);//Abstraction changes
void init_snr_up(channel_desc_t *, node_desc_t *, node_desc_t *, double*, double*, u16, u16);//Abstraction changes
void calculate_sinr(channel_desc_t *, node_desc_t *, node_desc_t *, double *sinr_dB);//Abstraction changes
void get_beta_map(void);
int dlsch_abstraction_EESM(double* sinr_dB, u32 rb_alloc[4], u8 mcs, u8); //temporary testing for PHY abstraction
int dlsch_abstraction_MIESM(double* sinr_dB,u8 TM, u32 rb_alloc[4], u8 mcs,u8);
int ulsch_abstraction_MIESM(double* sinr_dB,u8 TM, u8 mcs,u16 nb_rb, u16 first_rb);
int ulsch_abstraction(double* sinr_dB,u8 TM, u8 mcs,u16 nb_rb, u16 first_rb);
void calc_path_loss(node_desc_t* node_tx, node_desc_t* node_rx, channel_desc_t *ch_desc, Environment_System_Config env_desc, double **SF);
void do_OFDM_mod(mod_sym_t **txdataF, s32 **txdata, uint32_t frame, u16 next_slot, LTE_DL_FRAME_PARMS *frame_parms);
#ifdef OPENAIR2
int omv_write (int pfd, Node_list enb_node_list, Node_list ue_node_list, Data_Flow_Unit omv_data);
void omv_end (int pfd, Data_Flow_Unit omv_data);
#endif
File diff suppressed because it is too large Load Diff
+89
View File
@@ -0,0 +1,89 @@
/*******************************************************************************
Eurecom OpenAirInterface 2
Copyright(c) 1999 - 2010 Eurecom
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
version 2, as published by the Free Software Foundation.
This program is distributed in the hope 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
this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
The full GNU General Public License is included in this distribution in
the file called "COPYING".
Contact Information
Openair Admin: openair_admin@eurecom.fr
Openair Tech : openair_tech@eurecom.fr
Forums : http://forums.eurecom.fsr/openairinterface
Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France
*******************************************************************************/
/*! \file oaisim_config.h
* \brief configure an emulation
* \author Lusheng Wang
* \date 2006-2010
* \version 4.0
* \company Eurecom
* \email: wangl@eurecom.fr
* \note this a note
* \bug this is a bug
* \warning this is a warning
*/
//-----------------------------------begin group-----------------------------
/** @defgroup _oaisim The sturcture of OAISIM
The current sturcture of oaisim is shown by the figure.
\image html new_OCG_structure.png "new_OCG_structure"
* @{*/
/* @}*/
#include "UTIL/LOG/log_if.h"
#include "UTIL/LOG/log_extern.h"
#include "UTIL/OCG/OCG.h"
#include "UTIL/OPT/opt.h" // to test OPT
#include "UTIL/OMG/omg.h"
#include "UTIL/CLI/cli_if.h"
#include "SIMULATION/ETH_TRANSPORT/defs.h"
/** @defgroup _init_oai Initial oaisim
* @ingroup _fn
* @brief Initialize all the parameters before start an emulation
* @{*/
void init_oai_emulation();
/* @}*/
/** @defgroup _config_oaisim All the configurations for an emulation
* @ingroup _fn
* @brief This is the function that calls all the other configuration functions
* @{*/
void oaisim_config();
/* @}*/
/** @defgroup _config_module Configuration functions for various modules
* @ingroup _fn
* @brief There are the functions to configure different various modules in the emulator
* @{*/
int olg_config();
int ocg_config_env();
int ocg_config_omg();
int ocg_config_topo();
int ocg_config_app();
int ocg_config_emu();
/* @}*/
+872
View File
@@ -0,0 +1,872 @@
#include <execinfo.h>
#include "oaisim_functions.h"
#include "PHY/extern.h"
#include "MAC_INTERFACE/extern.h"
#include "LAYER2/MAC/extern.h"
#include "LAYER2/PDCP_v10.1.0/pdcp.h"
#include "LAYER2/PDCP_v10.1.0/pdcp_primitives.h"
#include "RRC/LITE/extern.h"
#include "PHY_INTERFACE/extern.h"
#include "ARCH/CBMIMO1/DEVICE_DRIVER/extern.h"
#include "SCHED/extern.h"
#include "UTIL/OCG/OCG_extern.h"
#include "UTIL/LOG/vcd_signal_dumper.h"
#include "UTIL/OPT/opt.h"
#ifdef SMBV
extern u8 config_smbv;
extern char smbv_ip[16];
#endif
//constant for OAISIM soft realtime calibration
#define SF_DEVIATION_OFFSET_NS 100000 //= 0.1ms : should be as a number of UE
#define SLEEP_STEP_US 100 // = 0.01ms could be adaptive, should be as a number of UE
#define K 2 // averaging coefficient
#define TARGET_SF_TIME_NS 1000000 // 1ms = 1000000 ns
int otg_times = 0;
int if_times = 0;
int for_times = 0;
u16 Nid_cell = 0; //needed by init_lte_vars
int nb_antennas_rx=2; // //
u8 target_dl_mcs = 0;
u8 rate_adaptation_flag = 0;
u8 set_sinr=0;
double snr_dB, sinr_dB;
u8 set_seed=0;
u8 cooperation_flag; // for cooperative communication
u8 abstraction_flag = 0, ethernet_flag = 0;
double snr_step=1.0;
u8 ue_connection_test=0;
double forgetting_factor=0.0;
u8 beta_ACK=0,beta_RI=0,beta_CQI=2;
u8 target_ul_mcs = 2;
LTE_DL_FRAME_PARMS *frame_parms;
int map1,map2;
double **ShaF= NULL;
// pointers signal buffers (s = transmit, r,r0 = receive)
double **s_re, **s_im, **r_re, **r_im, **r_re0, **r_im0;
Node_list ue_node_list = NULL;
Node_list enb_node_list = NULL;
int pdcp_period, omg_period;
// time calibration for soft realtime mode
struct timespec time_spec;
unsigned long time_last, time_now;
int td, td_avg, sleep_time_us;
#ifdef OPENAIR2
// omv related info
//pid_t omv_pid;
char full_name[200];
int pfd[2]; // fd for omv : fixme: this could be a local var
char fdstr[10];
char frames[10];
char num_enb[10];
char num_ue[10];
//area_x, area_y and area_z for omv
char x_area[20];
char y_area[20];
char z_area[20];
char nb_antenna[20];
char frame_type[10];
char tdd_config[10];
#endif
Packet_OTG_List *otg_pdcp_buffer;
extern node_desc_t *enb_data[NUMBER_OF_eNB_MAX];
extern node_desc_t *ue_data[NUMBER_OF_UE_MAX];
extern channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX];
extern channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX];
extern mapping small_scale_names[];
extern pdcp_mbms_t pdcp_mbms_array[MAX_MODULES][16*29];
extern int eMBMS_active;
extern void help (void);
void get_simulation_options(int argc, char *argv[]) {
char c;
int option_index;
static struct option long_options[] = {
{"pdcp_period", 1, 0, 0},
{"omg_period", 1, 0, 0},
{NULL, 0, NULL, 0}
};
while ((c = getopt_long (argc, argv, "aA:b:B:c:C:d:eE:f:FGg:hi:IJ:k:l:m:M:n:N:O:p:P:rR:s:S:t:T:u:U:vVx:y:w:W:X:z:Z:", long_options, &option_index)) != -1) {
switch (c) {
case 0:
if (! strcmp(long_options[option_index].name, "pdcp_period")) {
if (optarg) {
pdcp_period = atoi(optarg);
printf("PDCP period is %d\n", pdcp_period);
}
} else if (! strcmp(long_options[option_index].name, "omg_period")) {
if (optarg) {
omg_period = atoi(optarg);
printf("OMG period is %d\n", omg_period);
}
}
break;
case 'L': // set FDD
flag_LA = atoi(optarg);
break;
case 'F': // set FDD
printf("Setting Frame to FDD\n");
oai_emulation.info.frame_type = 0;
break;
case 'C':
oai_emulation.info.tdd_config = atoi (optarg);
if (oai_emulation.info.tdd_config > 6) {
LOG_E(EMU,"Illegal tdd_config %d (should be 0-6)\n", oai_emulation.info.tdd_config);
exit (-1);
}
break;
case 'Q':
eMBMS_active=1;
break;
case 'R':
oai_emulation.info.N_RB_DL = atoi (optarg);
if ((oai_emulation.info.N_RB_DL != 6) && (oai_emulation.info.N_RB_DL != 15) && (oai_emulation.info.N_RB_DL != 25)
&& (oai_emulation.info.N_RB_DL != 50) && (oai_emulation.info.N_RB_DL != 75) && (oai_emulation.info.N_RB_DL != 100)) {
LOG_E(EMU,"Illegal N_RB_DL %d (should be one of 6,15,25,50,75,100)\n", oai_emulation.info.N_RB_DL);
exit (-1);
}
case 'N':
Nid_cell = atoi (optarg);
if (Nid_cell > 503) {
LOG_E(EMU,"Illegal Nid_cell %d (should be 0 ... 503)\n", Nid_cell);
exit(-1);
}
break;
case 'h':
help ();
exit (1);
case 'x':
oai_emulation.info.transmission_mode = atoi (optarg);
if ((oai_emulation.info.transmission_mode != 1) && (oai_emulation.info.transmission_mode != 2) && (oai_emulation.info.transmission_mode != 5) && (oai_emulation.info.transmission_mode != 6)) {
LOG_E(EMU, "Unsupported transmission mode %d\n",oai_emulation.info.transmission_mode);
exit(-1);
}
break;
case 'y':
nb_antennas_rx=atoi(optarg);
if (nb_antennas_rx>4) {
printf("Cannot have more than 4 antennas\n");
exit(-1);
}
break;
case 'm':
target_dl_mcs = atoi (optarg);
break;
case 'r':
rate_adaptation_flag = 1;
break;
case 'n':
oai_emulation.info.n_frames = atoi (optarg);
//n_frames = (n_frames >1024) ? 1024: n_frames; // adjust the n_frames if higher that 1024
oai_emulation.info.n_frames_flag = 1;
break;
case 's':
snr_dB = atoi (optarg);
// set_snr = 1;
oai_emulation.info.ocm_enabled=0;
break;
case 'S':
sinr_dB = atoi (optarg);
set_sinr = 1;
oai_emulation.info.ocm_enabled=0;
break;
case 'J':
ue_connection_test=1;
oai_emulation.info.ocm_enabled=0;
snr_step = atof(optarg);
break;
case 'k':
//ricean_factor = atof (optarg);
LOG_E(EMU,"[SIM] Option k is no longer supported on the command line. Please specify your channel model in the xml template\n");
exit(-1);
break;
case 't':
//Td = atof (optarg);
LOG_E(EMU,"[SIM] Option t is no longer supported on the command line. Please specify your channel model in the xml template\n");
exit(-1);
break;
case 'f':
forgetting_factor = atof (optarg);
break;
case 'z':
cooperation_flag = atoi (optarg);
break;
case 'u':
oai_emulation.info.nb_ue_local = atoi (optarg);
break;
case 'b':
oai_emulation.info.nb_enb_local = atoi (optarg);
break;
case 'a':
abstraction_flag = 1;
break;
case 'A':
//oai_emulation.info.ocm_enabled=1;
if (optarg == NULL)
oai_emulation.environment_system_config.fading.small_scale.selected_option="AWGN";
else
oai_emulation.environment_system_config.fading.small_scale.selected_option= optarg;
//awgn_flag = 1;
break;
case 'p':
oai_emulation.info.nb_master = atoi (optarg);
break;
case 'M':
abstraction_flag = 1;
ethernet_flag = 1;
oai_emulation.info.ethernet_id = atoi (optarg);
oai_emulation.info.master_id = oai_emulation.info.ethernet_id;
oai_emulation.info.ethernet_flag = 1;
break;
case 'e':
oai_emulation.info.extended_prefix_flag = 1;
break;
case 'l':
oai_emulation.info.g_log_level = atoi(optarg);
break;
case 'Y':
oai_emulation.info.g_log_verbosity = optarg;
break;
case 'c':
strcpy(oai_emulation.info.local_server, optarg);
oai_emulation.info.ocg_enabled=1;
break;
case 'g':
oai_emulation.info.multicast_group = atoi (optarg);
break;
case 'D':
oai_emulation.info.multicast_ifname = malloc (strlen(optarg) + 1);
strcpy(oai_emulation.info.multicast_ifname, optarg);
break;
case 'B':
oai_emulation.topology_config.mobility.eNB_mobility.eNB_mobility_type.selected_option = optarg;
//oai_emulation.info.omg_model_enb = atoi (optarg);
break;
case 'U':
oai_emulation.topology_config.mobility.UE_mobility.UE_mobility_type.selected_option = optarg;
break;
case 'T':
oai_emulation.info.otg_enabled = 1;
oai_emulation.info.otg_traffic = optarg;
break;
case 'P':
oai_emulation.info.opt_enabled = 1;
if (strcmp(optarg, "wireshark") == 0) {
opt_type = OPT_WIRESHARK;
printf("Enabling OPT for wireshark\n");
} else if (strcmp(optarg, "pcap") == 0) {
opt_type = OPT_PCAP;
printf("Enabling OPT for pcap\n");
} else {
printf("Unrecognized option for OPT module. -> Disabling it\n");
printf("Possible values are either wireshark or pcap\n");
opt_type = OPT_NONE;
oai_emulation.info.opt_enabled = 0;
}
oai_emulation.info.opt_mode = opt_type;
break;
case 'E':
set_seed = 1;
oai_emulation.info.seed = atoi (optarg);
break;
case 'I':
oai_emulation.info.cli_enabled = 1;
break;
case 'X':
#ifdef PROC
temp=atoi(optarg);
if(temp==0){
port=CHANNEL_PORT; Channel_Flag=1; Process_Flag=0; wgt=0;
}
else if(temp==1){
port=eNB_PORT; wgt=0;
}
else {
port=UE_PORT; wgt=MAX_eNB;
}
#endif
break;
case 'i':
#ifdef PROC
Process_Flag=1;
node_id = wgt+atoi(optarg);
port+=atoi(optarg);
#endif
break;
case 'v':
oai_emulation.info.omv_enabled = 1;
break;
case 'V':
ouput_vcd = 1;
oai_emulation.info.vcd_enabled = 1;
break;
case 'w':
oai_emulation.info.cba_group_active = atoi (optarg);
break;
case 'W':
#ifdef SMBV
config_smbv = 1;
if(atoi(optarg)!=0)
strcpy(smbv_ip,optarg);
#endif
break;
case 'G' :
oai_emulation.info.otg_bg_traffic_enabled = 1;
break;
case 'Z':
/* Sebastien ROUX: Reserved for future use (currently used in ltenow branch) */
break;
case 'O':
#if defined(ENABLE_USE_MME)
oai_emulation.info.mme_enabled = 1;
if (optarg == NULL) /* No IP address provided: use localhost */
{
memcpy(&oai_emulation.info.mme_ip_address[0], "127.0.0.1", 10);
} else {
u8 ip_length = strlen(optarg) + 1;
memcpy(&oai_emulation.info.mme_ip_address[0], optarg, ip_length > 16 ? 16 : ip_length);
}
#else
printf("You enabled MME mode without MME support...\n");
#endif
break;
default:
help ();
exit (-1);
break;
}
}
}
void check_and_adjust_params() {
s32 ret;
int i,j;
if (oai_emulation.info.nb_ue_local > NUMBER_OF_UE_MAX ) {
LOG_E(EMU,"Enter fewer than %d UEs for the moment or change the NUMBER_OF_UE_MAX\n", NUMBER_OF_UE_MAX);
exit (-1);
}
if (oai_emulation.info.nb_enb_local > NUMBER_OF_eNB_MAX) {
LOG_E(EMU,"Enter fewer than %d eNBs for the moment or change the NUMBER_OF_UE_MAX\n", NUMBER_OF_eNB_MAX);
exit (-1);
}
// fix ethernet and abstraction with RRC_CELLULAR Flag
#ifdef RRC_CELLULAR
abstraction_flag = 1;
ethernet_flag = 1;
#endif
if (set_sinr == 0)
sinr_dB = snr_dB - 20;
// setup netdevice interface (netlink socket)
LOG_I(EMU,"[INIT] Starting NAS netlink interface\n");
ret = netlink_init ();
if (ret < 0)
LOG_E(EMU,"[INIT] Netlink not available, careful ...\n");
if (ethernet_flag == 1) {
oai_emulation.info.master[oai_emulation.info.master_id].nb_ue = oai_emulation.info.nb_ue_local;
oai_emulation.info.master[oai_emulation.info.master_id].nb_enb = oai_emulation.info.nb_enb_local;
if (!oai_emulation.info.master_id)
oai_emulation.info.is_primary_master = 1;
j = 1;
for (i = 0; i < oai_emulation.info.nb_master; i++) {
if (i != oai_emulation.info.master_id)
oai_emulation.info.master_list = oai_emulation.info.master_list + j;
LOG_I (EMU, "Index of master id i=%d MASTER_LIST %d\n", i, oai_emulation.info.master_list);
j *= 2;
}
LOG_I (EMU, " Total number of master %d my master id %d\n", oai_emulation.info.nb_master, oai_emulation.info.master_id);
init_bypass ();
while (emu_tx_status != SYNCED_TRANSPORT) {
LOG_I (EMU, " Waiting for EMU Transport to be synced\n");
emu_transport_sync (); //emulation_tx_rx();
}
} // ethernet flag
NB_UE_INST = oai_emulation.info.nb_ue_local + oai_emulation.info.nb_ue_remote;
NB_eNB_INST = oai_emulation.info.nb_enb_local + oai_emulation.info.nb_enb_remote;
}
void init_omv() {
if (oai_emulation.info.omv_enabled == 1) {
if(pipe(pfd) == -1)
perror("pipe error \n");
sprintf(full_name, "%s/UTIL/OMV/OMV",getenv("OPENAIR2_DIR"));
LOG_I(EMU,"Stating the OMV path %s pfd[0] %d pfd[1] %d \n", full_name, pfd[0],pfd[1]);
switch(fork()) {
case -1 :
perror("fork failed \n");
break;
case 0 : /* child is going to be the omv, it is the reader */
if(close(pfd[1]) == -1 ) /* we close the write desc. */
perror("close on write\n" );
sprintf(fdstr, "%d", pfd[0] );
sprintf(num_enb, "%d", NB_eNB_INST);
sprintf(num_ue, "%d", NB_UE_INST);
sprintf(x_area, "%f", oai_emulation.topology_config.area.x_m );
sprintf(y_area, "%f", oai_emulation.topology_config.area.y_m );
sprintf(z_area, "%f", 200.0 );
sprintf(frames, "%d", oai_emulation.info.n_frames);
sprintf(nb_antenna, "%d", 4);
sprintf(frame_type, "%s", (oai_emulation.info.frame_type == 0) ? "FDD" : "TDD");
sprintf(tdd_config, "%d", oai_emulation.info.tdd_config);
/* execl is used to launch the visualisor */
execl(full_name,"OMV", fdstr, frames, num_enb, num_ue, x_area, y_area, z_area, nb_antenna, frame_type, tdd_config,NULL );
perror( "error in execl the OMV" );
}
//parent
if(close( pfd[0] ) == -1 ) /* we close the write desc. */
perror("close on read\n" );
}
}
void init_seed(u8 set_seed) {
if(set_seed) {
randominit (oai_emulation.info.seed);
set_taus_seed (oai_emulation.info.seed);
} else {
randominit (0);
set_taus_seed (0);
}
}
void init_openair1() {
s32 UE_id, eNB_id;
// change the nb_connected_eNB
init_lte_vars (&frame_parms, oai_emulation.info.frame_type, oai_emulation.info.tdd_config, oai_emulation.info.tdd_config_S,oai_emulation.info.extended_prefix_flag,oai_emulation.info.N_RB_DL, Nid_cell, cooperation_flag, oai_emulation.info.transmission_mode, abstraction_flag,nb_antennas_rx);
for (eNB_id=0; eNB_id<NB_eNB_INST;eNB_id++){
for (UE_id=0; UE_id<NB_UE_INST;UE_id++){
PHY_vars_eNB_g[eNB_id]->pusch_config_dedicated[UE_id].betaOffset_ACK_Index = beta_ACK;
PHY_vars_eNB_g[eNB_id]->pusch_config_dedicated[UE_id].betaOffset_RI_Index = beta_RI;
PHY_vars_eNB_g[eNB_id]->pusch_config_dedicated[UE_id].betaOffset_CQI_Index = beta_CQI;
PHY_vars_UE_g[UE_id]->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index = beta_ACK;
PHY_vars_UE_g[UE_id]->pusch_config_dedicated[eNB_id].betaOffset_RI_Index = beta_RI;
PHY_vars_UE_g[UE_id]->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index = beta_CQI;
((PHY_vars_UE_g[UE_id]->lte_frame_parms).pdsch_config_common).p_b = (frame_parms->nb_antennas_tx_eNB>1) ? 1 : 0; // rho_a = rhob
((PHY_vars_eNB_g[eNB_id]->lte_frame_parms).pdsch_config_common).p_b = (frame_parms->nb_antennas_tx_eNB>1) ? 1 : 0; // rho_a = rhob
}
}
printf ("AFTER init: Nid_cell %d\n", PHY_vars_eNB_g[0]->lte_frame_parms.Nid_cell);
printf ("AFTER init: frame_type %d,tdd_config %d\n",
PHY_vars_eNB_g[0]->lte_frame_parms.frame_type,
PHY_vars_eNB_g[0]->lte_frame_parms.tdd_config);
number_of_cards = 1;
openair_daq_vars.rx_rf_mode = 1;
openair_daq_vars.tdd = 1;
openair_daq_vars.rx_gain_mode = DAQ_AGC_ON;
openair_daq_vars.dlsch_transmission_mode = oai_emulation.info.transmission_mode;
openair_daq_vars.target_ue_dl_mcs = target_dl_mcs;
openair_daq_vars.target_ue_ul_mcs = target_ul_mcs;
openair_daq_vars.ue_dl_rb_alloc=0x1fff;
openair_daq_vars.ue_ul_nb_rb=6;
openair_daq_vars.dlsch_rate_adaptation = rate_adaptation_flag;
openair_daq_vars.use_ia_receiver = 0;
// init_ue_status();
for (UE_id=0; UE_id<NB_UE_INST;UE_id++) {
PHY_vars_UE_g[UE_id]->rx_total_gain_dB=130;
// update UE_mode for each eNB_id not just 0
if (abstraction_flag == 0)
PHY_vars_UE_g[UE_id]->UE_mode[0] = NOT_SYNCHED;
else {
// 0 is the index of the connected eNB
PHY_vars_UE_g[UE_id]->UE_mode[0] = PRACH;
}
PHY_vars_UE_g[UE_id]->lte_ue_pdcch_vars[0]->crnti = 0x1235 + UE_id;
PHY_vars_UE_g[UE_id]->current_dlsch_cqi[0] = 10;
LOG_I(EMU, "UE %d mode is initialized to %d\n", UE_id, PHY_vars_UE_g[UE_id]->UE_mode[0] );
}
}
void init_openair2() {
#ifdef OPENAIR2
s32 i;
s32 UE_id;
l2_init (&PHY_vars_eNB_g[0]->lte_frame_parms,eMBMS_active, oai_emulation.info.cba_group_active);
printf ("after L2 init: Nid_cell %d\n", PHY_vars_eNB_g[0]->lte_frame_parms.Nid_cell);
printf ("after L2 init: frame_type %d,tdd_config %d\n",
PHY_vars_eNB_g[0]->lte_frame_parms.frame_type,
PHY_vars_eNB_g[0]->lte_frame_parms.tdd_config);
for (i = 0; i < NB_eNB_INST; i++)
mac_xface->mrbch_phy_sync_failure (i, 0, i);
if (abstraction_flag == 1) {
for (UE_id = 0; UE_id < NB_UE_INST; UE_id++)
mac_xface->dl_phy_sync_success (UE_id, 0, 0,1); //UE_id%NB_eNB_INST);
}
mac_xface->macphy_exit = exit_fun;
#endif
}
void init_ocm() {
s32 UE_id, eNB_id;
/* Added for PHY abstraction */
if (abstraction_flag) {
if (0) { //the values of beta and awgn tables are hard coded in PHY/vars.h
get_beta_map();
#ifdef PHY_ABSTRACTION_UL
get_beta_map_up();
#endif
get_MIESM_param();
}
}
for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) {
enb_data[eNB_id] = (node_desc_t *)malloc(sizeof(node_desc_t));
init_enb(enb_data[eNB_id],oai_emulation.environment_system_config.antenna.eNB_antenna);
}
for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) {
ue_data[UE_id] = (node_desc_t *)malloc(sizeof(node_desc_t));
init_ue(ue_data[UE_id],oai_emulation.environment_system_config.antenna.UE_antenna);
}
if ((oai_emulation.info.ocm_enabled == 1)&& (ethernet_flag == 0 ) &&
(oai_emulation.environment_system_config.fading.shadowing.decorrelation_distance_m>0) &&
(oai_emulation.environment_system_config.fading.shadowing.variance_dB>0)) {
// init SF map here!!!
map1 =(int)oai_emulation.topology_config.area.x_m;
map2 =(int)oai_emulation.topology_config.area.y_m;
ShaF = init_SF(map1,map2,oai_emulation.environment_system_config.fading.shadowing.decorrelation_distance_m,oai_emulation.environment_system_config.fading.shadowing.variance_dB);
// size of area to generate shadow fading map
LOG_D(EMU,"Simulation area x=%f, y=%f\n",
oai_emulation.topology_config.area.x_m,
oai_emulation.topology_config.area.y_m);
}
if (abstraction_flag == 0)
init_channel_vars (frame_parms, &s_re, &s_im, &r_re, &r_im, &r_re0, &r_im0);
// initialize channel descriptors
for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) {
for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) {
LOG_D(OCM,"Initializing channel (%s, %d) from eNB %d to UE %d\n", oai_emulation.environment_system_config.fading.small_scale.selected_option,
map_str_to_int(small_scale_names,oai_emulation.environment_system_config.fading.small_scale.selected_option), eNB_id, UE_id);
/* if (oai_emulation.info.transmission_mode == 5)
eNB2UE[eNB_id][UE_id] = new_channel_desc_scm(PHY_vars_eNB_g[eNB_id]->lte_frame_parms.nb_antennas_tx,
PHY_vars_UE_g[UE_id]->lte_frame_parms.nb_antennas_rx,
(UE_id == 0)? Rice1_corr : Rice1_anticorr,
oai_emulation.environment_system_config.system_bandwidth_MB,
forgetting_factor,
0,
0);
else
*/
eNB2UE[eNB_id][UE_id] = new_channel_desc_scm(PHY_vars_eNB_g[eNB_id]->lte_frame_parms.nb_antennas_tx,
PHY_vars_UE_g[UE_id]->lte_frame_parms.nb_antennas_rx,
map_str_to_int(small_scale_names,oai_emulation.environment_system_config.fading.small_scale.selected_option),
oai_emulation.environment_system_config.system_bandwidth_MB,
forgetting_factor,
0,
0);
random_channel(eNB2UE[eNB_id][UE_id]);
LOG_D(OCM,"[SIM] Initializing channel (%s, %d) from UE %d to eNB %d\n", oai_emulation.environment_system_config.fading.small_scale.selected_option,
map_str_to_int(small_scale_names, oai_emulation.environment_system_config.fading.small_scale.selected_option),UE_id, eNB_id);
UE2eNB[UE_id][eNB_id] = new_channel_desc_scm(PHY_vars_UE_g[UE_id]->lte_frame_parms.nb_antennas_tx,
PHY_vars_eNB_g[eNB_id]->lte_frame_parms.nb_antennas_rx,
map_str_to_int(small_scale_names, oai_emulation.environment_system_config.fading.small_scale.selected_option),
oai_emulation.environment_system_config.system_bandwidth_MB,
forgetting_factor,
0,
0);
random_channel(UE2eNB[UE_id][eNB_id]);
}
}
// Not needed anymore, done automatically in init_freq_channel upon first call to the function
// if (abstraction_flag==1)
// init_freq_channel(eNB2UE[0][0],PHY_vars_UE_g[0]->lte_frame_parms.N_RB_DL,PHY_vars_UE_g[0]->lte_frame_parms.N_RB_DL*12+1);
freq_channel(eNB2UE[0][0],PHY_vars_UE_g[0]->lte_frame_parms.N_RB_DL,PHY_vars_UE_g[0]->lte_frame_parms.N_RB_DL*12+1);
}
void init_otg_pdcp_buffer() {
s32 i;
otg_pdcp_buffer = malloc((NB_UE_INST + NB_eNB_INST) * sizeof(Packet_OTG_List));
for (i = 0; i < NB_UE_INST + NB_eNB_INST; i++) {
pkt_list_init(&(otg_pdcp_buffer[i]));
//LOG_I(EMU,"HEAD of otg_pdcp_buffer[%d] is %p\n", i, pkt_list_get_head(&(otg_pdcp_buffer[i])));
}
}
void update_omg () {
s32 UE_id, eNB_id;
int new_omg_model;
if ((frame % omg_period) == 0 ) { // call OMG every 10ms
update_nodes(oai_emulation.info.time_s);
display_node_list(enb_node_list);
display_node_list(ue_node_list);
if (oai_emulation.info.omg_model_ue >= MAX_NUM_MOB_TYPES){ // mix mobility model
for(UE_id=oai_emulation.info.first_ue_local; UE_id<(oai_emulation.info.first_ue_local+oai_emulation.info.nb_ue_local);UE_id++){
new_omg_model = randomGen(STATIC,RWALK);
LOG_D(OMG, "[UE] Node of ID %d is changing mobility generator ->%d \n", UE_id, new_omg_model);
// reset the mobility model for a specific node
set_new_mob_type (UE_id, UE, new_omg_model, oai_emulation.info.time_s);
}
}
if (oai_emulation.info.omg_model_enb >= MAX_NUM_MOB_TYPES) { // mix mobility model
for (eNB_id = oai_emulation.info.first_enb_local; eNB_id < (oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local); eNB_id++) {
new_omg_model = randomGen (STATIC, RWALK);
LOG_D (OMG,"[eNB] Node of ID %d is changing mobility generator ->%d \n", UE_id, new_omg_model);
// reset the mobility model for a specific node
set_new_mob_type (eNB_id, eNB, new_omg_model, oai_emulation.info.time_s);
}
}
}
}
void update_omg_ocm() {
enb_node_list = get_current_positions(oai_emulation.info.omg_model_enb, eNB, oai_emulation.info.time_s);
ue_node_list = get_current_positions(oai_emulation.info.omg_model_ue, UE, oai_emulation.info.time_s);
}
void update_ocm() {
s32 UE_id, eNB_id;
for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++)
enb_data[eNB_id]->tx_power_dBm = PHY_vars_eNB_g[eNB_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower;
for (UE_id = 0; UE_id < NB_UE_INST; UE_id++)
ue_data[UE_id]->tx_power_dBm = PHY_vars_UE_g[UE_id]->tx_power_dBm;
/* check if the openair channel model is activated used for PHY abstraction : path loss*/
if ((oai_emulation.info.ocm_enabled == 1)&& (ethernet_flag == 0 )) {
//LOG_D(OMG," extracting position of eNb...\n");
extract_position(enb_node_list, enb_data, NB_eNB_INST);
//LOG_D(OMG," extracting position of UE...\n");
// if (oai_emulation.info.omg_model_ue == TRACE)
extract_position(ue_node_list, ue_data, NB_UE_INST);
for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) {
for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) {
calc_path_loss (enb_data[eNB_id], ue_data[UE_id], eNB2UE[eNB_id][UE_id], oai_emulation.environment_system_config,ShaF);
//calc_path_loss (enb_data[eNB_id], ue_data[UE_id], eNB2UE[eNB_id][UE_id], oai_emulation.environment_system_config,0);
UE2eNB[UE_id][eNB_id]->path_loss_dB = eNB2UE[eNB_id][UE_id]->path_loss_dB;
LOG_I(OCM,"Path loss between eNB %d at (%f,%f) and UE %d at (%f,%f) is %f, angle %f\n",
eNB_id,enb_data[eNB_id]->x,enb_data[eNB_id]->y,UE_id,ue_data[UE_id]->x,ue_data[UE_id]->y,
eNB2UE[eNB_id][UE_id]->path_loss_dB, eNB2UE[eNB_id][UE_id]->aoa);
}
}
}
else {
for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) {
for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) {
//UE2eNB[UE_id][eNB_id]->path_loss_dB = -105 + snr_dB;
if (eNB_id == (UE_id % NB_eNB_INST)) {
eNB2UE[eNB_id][UE_id]->path_loss_dB = -105 + snr_dB - PHY_vars_eNB_g[eNB_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower;
UE2eNB[UE_id][eNB_id]->path_loss_dB = -105 + snr_dB - PHY_vars_eNB_g[eNB_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower; //+20 to offset the difference in tx power of the UE wrt eNB
}
else {
eNB2UE[eNB_id][UE_id]->path_loss_dB = -105 + sinr_dB - PHY_vars_eNB_g[eNB_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower;
UE2eNB[UE_id][eNB_id]->path_loss_dB = -105 + sinr_dB - PHY_vars_eNB_g[eNB_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower;
}
LOG_I(OCM,"Path loss from eNB %d to UE %d => %f dB (eNB TX %d)\n",eNB_id,UE_id,eNB2UE[eNB_id][UE_id]->path_loss_dB,
PHY_vars_eNB_g[eNB_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower);
// printf("[SIM] Path loss from UE %d to eNB %d => %f dB\n",UE_id,eNB_id,UE2eNB[UE_id][eNB_id]->path_loss_dB);
}
}
}
}
void update_otg_eNB(int module_id, unsigned int ctime) {
#if defined(USER_MODE) && defined(OAI_EMU)
if (oai_emulation.info.otg_enabled ==1 ) {
int dst_id;
Packet_otg_elt *otg_pkt;
for (dst_id = 0; dst_id < NUMBER_OF_UE_MAX; dst_id++) {
for_times += 1;
// generate traffic if the ue is rrc reconfigured state
if (mac_get_rrc_status(module_id, 1/*eNB_flag*/, dst_id) > 2 /*RRC_CONNECTED*/ ) {
otg_pkt = malloc (sizeof(Packet_otg_elt));
if_times += 1;
(otg_pkt->otg_pkt).sdu_buffer = (u8*) packet_gen(module_id, dst_id + NB_eNB_INST, ctime, &((otg_pkt->otg_pkt).sdu_buffer_size));
if ((otg_pkt->otg_pkt).sdu_buffer != NULL) {
otg_times += 1;
(otg_pkt->otg_pkt).rb_id = dst_id * NB_RB_MAX + DTCH;
(otg_pkt->otg_pkt).module_id = module_id;
(otg_pkt->otg_pkt).dst_id = dst_id;
(otg_pkt->otg_pkt).mode = PDCP_DATA_PDU;
//Adding the packet to the OTG-PDCP buffer
pkt_list_add_tail_eurecom(otg_pkt, &(otg_pdcp_buffer[module_id]));
LOG_I(EMU, "[eNB %d] ADD pkt to OTG buffer for dst %d on rb_id %d\n", (otg_pkt->otg_pkt).module_id, (otg_pkt->otg_pkt).dst_id,(otg_pkt->otg_pkt).rb_id);
} else {
//LOG_I(EMU, "OTG returns null \n");
free(otg_pkt);
otg_pkt=NULL;
}
}
LOG_T(EMU,"[eNB %d] UE mod id %d is not connected\n", module_id, dst_id);
//LOG_I(EMU,"HEAD of otg_pdcp_buffer[%d] is %p\n", module_id, pkt_list_get_head(&(otg_pdcp_buffer[module_id])));
}
#ifdef Rel10
int service_id, session_id, rb_id;
// MBSM multicast traffic
for (service_id = 0; service_id < 2 ; service_id++) { //maxServiceCount
for (session_id = 0; session_id < 2; session_id++) { // maxSessionPerPMCH
if (pdcp_mbms_array[module_id][service_id*maxSessionPerPMCH + session_id].instanciated_instance== module_id + 1){ // this service/session is configured
otg_pkt = malloc (sizeof(Packet_otg_elt));
// LOG_T(OTG,"multicast packet gen for (service/mch %d, session/lcid %d)\n", service_id, session_id);
rb_id = pdcp_mbms_array[module_id][service_id*maxSessionPerPMCH + session_id].rb_id;
(otg_pkt->otg_pkt).sdu_buffer = (u8*) packet_gen_multicast(module_id, session_id, ctime, &((otg_pkt->otg_pkt).sdu_buffer_size));
if ((otg_pkt->otg_pkt).sdu_buffer != NULL) {
(otg_pkt->otg_pkt).rb_id = rb_id;
(otg_pkt->otg_pkt).module_id = module_id;
//(otg_pkt->otg_pkt).dst_id = session_id;
//Adding the packet to the OTG-PDCP buffer
(otg_pkt->otg_pkt).mode = PDCP_TM;
pkt_list_add_tail_eurecom(otg_pkt, &(otg_pdcp_buffer[module_id]));
LOG_I(EMU, "[eNB %d] ADD pkt to OTG buffer for dst %d on rb_id %d\n", (otg_pkt->otg_pkt).module_id, (otg_pkt->otg_pkt).dst_id,(otg_pkt->otg_pkt).rb_id);
} else {
//LOG_I(EMU, "OTG returns null \n");
free(otg_pkt);
otg_pkt=NULL;
}
}
}
}
#endif
//LOG_I(EMU, "[eNB %d] update OTG nb_elts = %d \n", module_id, otg_pdcp_buffer[module_id].nb_elements);
//free(otg_pkt);
//otg_pkt = NULL;
}
#else
if (otg_enabled==1) {
ctime = frame * 100;
for (dst_id = 0; dst_id < NUMBER_OF_UE_MAX; dst_id++) {
if (mac_get_rrc_status(eNB_index, eNB_flag, dst_id ) > 2) {
otg_pkt = malloc (sizeof(Packet_otg_elt));
(otg_pkt->otg_pkt).sdu_buffer = packet_gen(module_id, dst_id, ctime, &pkt_size);
if (otg_pkt != NULL) {
rb_id = dst_id * NB_RB_MAX + DTCH;
(otg_pkt->otg_pkt).rb_id = rb_id;
(otg_pkt->otg_pkt).module_id = module_id;
(otg_pkt->otg_pkt).mode = PDCP_DATA_PDU;
//Adding the packet to the OTG-PDCP buffer
pkt_list_add_tail_eurecom(otg_pkt, &(otg_pdcp_buffer[module_id]));
LOG_I(EMU, "[eNB %d] ADD pkt to OTG buffer for dst %d on rb_id %d\n", (otg_pkt->otg_pkt).module_id, (otg_pkt->otg_pkt).dst_id,(otg_pkt->otg_pkt).rb_id);
} else {
//LOG_I(EMU, "OTG returns null \n");
free(otg_pkt);
otg_pkt=NULL;
}
/*else {
LOG_I(OTG,"nothing generated (src %d, dst %d)\n",src_id, dst_id);
}*/
}
/*else {
LOG_I(OTG,"rrc_status (src %d, dst %d) = %d\n",src_id, dst_id, mac_get_rrc_status(src_id, eNB_flag, dst_id ));
}*/
}
}
#endif
}
void update_otg_UE(int module_id, unsigned int ctime) {
#if defined(USER_MODE) && defined(OAI_EMU)
if (oai_emulation.info.otg_enabled ==1 ) {
int dst_id, src_id;
int eNB_index = 0; //See how phy_procedures_UE_lte is called: 3rd parameter from the right = 0
src_id = module_id;
dst_id = eNB_index;
if (mac_get_rrc_status(module_id, 0/*eNB_flag*/, eNB_index ) > 2 /*RRC_CONNECTED*/) {
Packet_otg_elt *otg_pkt = malloc (sizeof(Packet_otg_elt));
// Manage to add this packet to the tail of your list
(otg_pkt->otg_pkt).sdu_buffer = (u8*) packet_gen(src_id, dst_id, ctime, &((otg_pkt->otg_pkt).sdu_buffer_size));
if ((otg_pkt->otg_pkt).sdu_buffer != NULL) {
(otg_pkt->otg_pkt).rb_id = eNB_index * NB_RB_MAX + DTCH;
(otg_pkt->otg_pkt).module_id = module_id;
//(otg_pkt->otg_pkt).dst_id = dst_id;
//Adding the packet to the OTG-PDCP buffer
(otg_pkt->otg_pkt).mode = PDCP_DATA_PDU;
pkt_list_add_tail_eurecom(otg_pkt, &(otg_pdcp_buffer[module_id]));
} else {
free(otg_pkt);
otg_pkt=NULL;
}
}
}
#endif
}
void exit_fun(const char* s)
{
void *array[10];
size_t size;
size = backtrace(array, 10);
backtrace_symbols_fd(array, size, 2);
fprintf(stderr, "Error: %s. Exiting!\n",s);
exit (-1);
}
void init_time() {
clock_gettime (CLOCK_REALTIME, &time_spec);
time_now = (unsigned long) time_spec.tv_nsec;
td_avg = 0;
sleep_time_us = SLEEP_STEP_US;
td_avg = TARGET_SF_TIME_NS;
}
+37
View File
@@ -0,0 +1,37 @@
#include "oaisim.h"
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include "UTIL/FIFO/pad_list.h"
void get_simulation_options(int argc, char *argv[]);
void check_and_adjust_params();
void init_omv();
void init_seed(u8 set_seed);
void init_openair1();
void init_openair2();
void init_ocm();
void init_otg_pdcp_buffer();
void update_omg();
void update_omg_ocm();
void update_ocm();
void update_otg_eNB(int module_id, unsigned int ctime);
void update_otg_UE(int module_id, unsigned int ctime);
void exit_fun(const char* s);
void init_pad();
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,27 @@
/* Form definition file generated with fdesign. */
#include <forms.h>
#include <stdlib.h>
#include "phy_procedures_sim_form.h"
FD_phy_procedures_sim *create_form_phy_procedures_sim(void)
{
FL_OBJECT *obj;
FD_phy_procedures_sim *fdui = (FD_phy_procedures_sim *) fl_calloc(1, sizeof(*fdui));
fdui->phy_procedures_sim = fl_bgn_form(FL_NO_BOX, 640, 320);
obj = fl_add_box(FL_UP_BOX,0,0,640,320,"");
fdui->pusch_constellation = obj = fl_add_xyplot(FL_POINTS_XYPLOT,50,30,220,190,"PUSCH constellation");
fl_set_object_color(obj,FL_BLACK,FL_YELLOW);
fdui->pdsch_constellation = obj = fl_add_xyplot(FL_POINTS_XYPLOT,370,30,220,190,"PDSCH constellation");
fl_set_object_color(obj,FL_BLACK,FL_YELLOW);
fdui->ch00 = obj = fl_add_xyplot(FL_IMPULSE_XYPLOT,370,240,210,60,"CH00");
fl_set_object_color(obj,FL_BLACK,FL_YELLOW);
fl_end_form();
fdui->phy_procedures_sim->fdui = fdui;
return fdui;
}
/*---------------------------------------*/
@@ -0,0 +1,88 @@
Magic: 13000
Internal Form Definition File
(do not change)
Number of forms: 1
Unit of measure: FL_COORD_PIXEL
=============== FORM ===============
Name: phy_procedures_sim
Width: 640
Height: 320
Number of Objects: 4
--------------------
class: FL_BOX
type: UP_BOX
box: 0 0 640 320
boxtype: FL_UP_BOX
colors: FL_COL1 FL_COL1
alignment: FL_ALIGN_CENTER
style: FL_NORMAL_STYLE
size: FL_DEFAULT_SIZE
lcol: FL_BLACK
label:
shortcut:
resize: FL_RESIZE_ALL
gravity: FL_NoGravity FL_NoGravity
name:
callback:
argument:
--------------------
class: FL_XYPLOT
type: POINTS_XYPLOT
box: 50 30 220 190
boxtype: FL_FLAT_BOX
colors: FL_BLACK FL_YELLOW
alignment: FL_ALIGN_BOTTOM
style: FL_NORMAL_STYLE
size: FL_TINY_SIZE
lcol: FL_BLACK
label: PUSCH constellation
shortcut:
resize: FL_RESIZE_ALL
gravity: FL_NoGravity FL_NoGravity
name: pusch_constellation
callback:
argument:
--------------------
class: FL_XYPLOT
type: POINTS_XYPLOT
box: 370 30 220 190
boxtype: FL_FLAT_BOX
colors: FL_BLACK FL_YELLOW
alignment: FL_ALIGN_BOTTOM
style: FL_NORMAL_STYLE
size: FL_TINY_SIZE
lcol: FL_BLACK
label: PDSCH constellation
shortcut:
resize: FL_RESIZE_ALL
gravity: FL_NoGravity FL_NoGravity
name: pdsch_constellation
callback:
argument:
--------------------
class: FL_XYPLOT
type: IMPULSE_XYPLOT
box: 370 240 210 60
boxtype: FL_FLAT_BOX
colors: FL_BLACK FL_YELLOW
alignment: FL_ALIGN_BOTTOM
style: FL_NORMAL_STYLE
size: FL_TINY_SIZE
lcol: FL_BLACK
label: CH00
shortcut:
resize: FL_RESIZE_ALL
gravity: FL_NoGravity FL_NoGravity
name: ch00
callback:
argument:
==============================
create_the_forms
@@ -0,0 +1,22 @@
/** Header file generated with fdesign on Tue Jul 27 16:31:42 2010.**/
#ifndef FD_phy_procedures_sim_h_
#define FD_phy_procedures_sim_h_
/** Callbacks, globals and object handlers **/
/**** Forms and Objects ****/
typedef struct {
FL_FORM *phy_procedures_sim;
void *vdata;
char *cdata;
long ldata;
FL_OBJECT *pusch_constellation;
FL_OBJECT *pdsch_constellation;
FL_OBJECT *ch00;
} FD_phy_procedures_sim;
extern FD_phy_procedures_sim * create_form_phy_procedures_sim(void);
#endif /* FD_phy_procedures_sim_h_ */
+57
View File
@@ -0,0 +1,57 @@
function plot_results(tm)
data_abs = dlmread(sprintf('eNB_stats_abs_th_tx%d.txt',tm));
data = dlmread(sprintf('eNB_stats_th_tx%d.txt',tm));
figure
plot(data(:,1),data(:,2))
hold on
plot(data_abs(:,1),data_abs(:,2),'r')
title(sprintf('Average Throughput of System for TM %d',tm))
xlabel('Frames')
ylabel('Throughput [kbps]')
legend('Full PHY','PHY ABSTRACTION')
hold off
%figure
%[f x]=ecdf(data(:,2));
%plot(x,f);
%hold on
%[f x]=ecdf(data_abs(:,2));
%plot(x,f);
%hold off
% figure
% cdfplot(data(:,2));
% hold on
% cdfplot(data_abs(:,2));
% hold off
%data0 = dlmread(sprintf('UE_stats_th0_tx%d.txt',tm));
%if(users>1)
%data1 = dlmread(sprintf('UE_stats_th1_tx%d.txt',tm));
%data1_abs = dlmread(sprintf('UE_stats_abs_th1_tx%d.txt',tm));
%end
%data0_abs = dlmread(sprintf('UE_stats_abs_th0_tx%d.txt',tm));
%figure
%plot(data0(:,1),data0(:,2))
%hold on;
%plot(data0_abs(:,1),data0_abs(:,2),'r')
%title(sprintf('Instanteneous Throughput of UE 1 for TM %d',tm))
%xlabel('Frames')
%ylabel('Throughput [kbps]')
%legend('Full PHY','PHY ABSTRACTION')
%hold off
% figure
% [f x]=ecdf(data0(:,2));
% plot(x,f);
% hold on
% [f x]=ecdf(data0_abs(:,2));
% plot(x,f);
% hold off
%if(users>1)
%figure
%plot(data1(:,1),data1(:,2))
%hold on;
%plot(data1_abs(:,1),data1_abs(:,2),'r')
%title(sprintf('Instanteneous Throughput of UE 2 for TM %d',tm))
%xlabel('Frames')
%ylabel('Throughput [kbps]')
%legend('Full PHY','PHY ABSTRACTION')
%hold off
%end
+677
View File
@@ -0,0 +1,677 @@
#include <string.h>
#include <math.h>
#include <unistd.h>
#include <stdint.h>
#include <stdio.h>
#include <time.h>
#include <cblas.h>
#include "SIMULATION/TOOLS/defs.h"
#include "SIMULATION/RF/defs.h"
#include "PHY/types.h"
#include "PHY/defs.h"
#include "PHY/extern.h"
#include "MAC_INTERFACE/extern.h"
#include "oaisim_config.h"
#ifdef OPENAIR2
#include "LAYER2/MAC/defs.h"
#include "LAYER2/MAC/extern.h"
#include "UTIL/LOG/log_if.h"
#include "UTIL/LOG/log_extern.h"
#include "RRC/LITE/extern.h"
#include "PHY_INTERFACE/extern.h"
#include "UTIL/OCG/OCG.h"
#include "UTIL/OMG/omg.h"
#include "UTIL/OPT/opt.h" // to test OPT
#endif
#include "ARCH/CBMIMO1/DEVICE_DRIVER/extern.h"
#include "SCHED/defs.h"
#include "SCHED/extern.h"
#include "oaisim.h"
#define PI 3.1416
#define Am 20
#define MCS_COUNT 24
#define MCL (-70) /*minimum coupling loss (MCL) in dB*/
//double sinr[NUMBER_OF_eNB_MAX][2*25];
/*
extern double sinr_bler_map[MCS_COUNT][2][16];
extern double sinr_bler_map_up[MCS_COUNT][2][16];
double SINRpost_eff[301];
extern double MI_map_4qam[3][162];
extern double MI_map_16qam[3][197];
extern double MI_map_64qam[3][227];
*/
// Extract the positions of UE and ENB from the mobility model
void extract_position (Node_list input_node_list, node_desc_t **node_data, int nb_nodes) {
int i;
for (i=0;i<nb_nodes;i++) {
if ((input_node_list != NULL) && (node_data[i] != NULL)) {
node_data[i]->x = input_node_list->node->X_pos;
if (node_data[i]->x <0.0)
node_data[i]->x = 0.0;
node_data[i]->y = input_node_list->node->Y_pos;
if (node_data[i]->y <0.0)
node_data[i]->y = 0.0;
LOG_D(OCM, "extract_position: added node_data %d with position X: %f and Y: %f \n", i,input_node_list->node->X_pos, input_node_list->node->Y_pos );
input_node_list = input_node_list->next;
}
else {
LOG_E(OCM, "extract_position: Null pointer!!!\n");
//exit(-1);
}
}
}
void extract_position_fixed_ue (node_desc_t **node_data, int nb_nodes, u32 frame){
int i;
if(frame<50)
for (i=0;i<nb_nodes;i++) {
if (i==0) {
node_data[i]->x = 2050;
node_data[i]->y = 1500;
}
else {
node_data[i]->x = 2150;
node_data[i]->y = 1500;
}
}
else
{
for (i=0;i<nb_nodes;i++) {
if (i==0) {
node_data[i]->x = 1856 - (frame - 49);
// if(node_data[i]->x > 2106)
// node_data[i]->x = 2106;
node_data[i]->y = 1813 + (frame - 49);
// if(node_data[i]->y < 1563)
// node_data[i]->y = 1563;
// if( node_data[i]->x == 2106)
// node_data[i]->x = 2106 - (frame - 49);
}
else {
node_data[i]->x = 2106 - (frame - 49);
// if(node_data[i]->x < 1856)
// node_data[i]->x = 1856;
node_data[i]->y = 1563 + (frame - 49);
// if(node_data[i]->y < 1813)
// node_data[i]->y = 1813;
}
}
}
}
void init_ue(node_desc_t *ue_data, UE_Antenna ue_ant) {//changed from node_struct
ue_data->n_sectors = 1;
ue_data->phi_rad = 2 * PI;
ue_data->ant_gain_dBi = ue_ant.antenna_gain_dBi;
ue_data->tx_power_dBm = ue_ant.tx_power_dBm;
ue_data->rx_noise_level = ue_ant.rx_noise_level_dB; //value in db
}
void init_enb(node_desc_t *enb_data, eNB_Antenna enb_ant) {//changed from node_struct
int i;
double sect_angle[3]={0,2*PI/3,4*PI/3};
enb_data->n_sectors = enb_ant.number_of_sectors;
for (i=0;i<enb_data->n_sectors;i++)
enb_data->alpha_rad[i] = sect_angle[i]; //enb_ant.alpha_rad[i];
enb_data->phi_rad = enb_ant.beam_width_dB;
enb_data->ant_gain_dBi = enb_ant.antenna_gain_dBi;
enb_data->tx_power_dBm = enb_ant.tx_power_dBm;
enb_data->rx_noise_level = enb_ant.rx_noise_level_dB;
}
void calc_path_loss(node_desc_t* enb_data, node_desc_t* ue_data, channel_desc_t *ch_desc, Environment_System_Config env_desc, double **Shad_Fad) {
double dist;
double path_loss;
double gain_max;
double gain_sec[3];
double alpha, theta;
int count;
dist = sqrt(pow((enb_data->x - ue_data->x), 2) + pow((enb_data->y - ue_data->y), 2));
path_loss = env_desc.fading.free_space_model_parameters.pathloss_0_dB -
10*env_desc.fading.free_space_model_parameters.pathloss_exponent * log10(dist/1000);
//printf("dist %f, Path loss %f\n",dist,ch_desc->path_loss_dB);
/* Calculating the angle in the range -pi to pi from the slope */
alpha = atan2((ue_data->x - enb_data->x), (ue_data->y - enb_data->y));
if (alpha < 0)
alpha += 2*PI;
//printf("angle in radians is %lf\n", ue_data[UE_id]->alpha_rad[eNB_id]);
ch_desc->aoa = alpha;
ch_desc->random_aoa = 0;
if (enb_data->n_sectors==1) //assume omnidirectional antenna
gain_max = 0;
else {
gain_max = -1000;
for(count = 0; count < enb_data->n_sectors; count++) {
theta = enb_data->alpha_rad[count] - alpha;
/* gain = -min(Am , 12 * (theta/theta_3dB)^2) */
gain_sec[count] = -(Am < (12 * pow((theta/enb_data->phi_rad),2)) ? Am : (12 * pow((theta/enb_data->phi_rad),2)));
if (gain_sec[count]>gain_max) //take the sector that we are closest too (or where the gain is maximum)
gain_max = gain_sec[count];
}
}
path_loss += enb_data->ant_gain_dBi + gain_max + ue_data->ant_gain_dBi;
if (Shad_Fad!=NULL)
path_loss += Shad_Fad[(int)ue_data->x][(int)ue_data->y];
ch_desc->path_loss_dB = MCL < path_loss ? MCL : path_loss;
//LOG_D(OCM,"x_coordinate\t%f\t,y_coordinate\t%f\t, path_loss %f\n",ue_data->x,ue_data->y,ch_desc->path_loss_dB);
}
void init_snr(channel_desc_t* eNB2UE, node_desc_t *enb_data, node_desc_t *ue_data, double* sinr_dB, double* N0, u8 transmission_mode, u16 q, u8 dl_power_off) {
int return_value;
u16 nb_rb = 25; //No. of resource blocks
double thermal_noise,abs_channel,channelx, channely,channelx_i, channely_i ;
int count;
int aarx,aatx;
u8 qq;
/* Thermal noise is calculated using 10log10(K*T*B) K = Boltzmann's constant T = room temperature B = bandwidth */
thermal_noise = -174 + 10*log10(eNB2UE->BW*1e6); //value in dBm
//for (aarx=0; aarx<eNB2UE->nb_rx; aarx++)
*N0 = thermal_noise + ue_data->rx_noise_level;//? all the element have the same noise level?????
LOG_D(OCM,"Path loss %lf, noise %lf, signal %lf, snr %lf\n",
eNB2UE->path_loss_dB,
thermal_noise + ue_data->rx_noise_level,
enb_data->tx_power_dBm + eNB2UE->path_loss_dB,
enb_data->tx_power_dBm + eNB2UE->path_loss_dB - (thermal_noise + ue_data->rx_noise_level));
if(transmission_mode == 5 && dl_power_off==1)
transmission_mode = 6;
switch(transmission_mode){
case 1:
//printf ("coupling factor is %lf\n", coupling);
for (count = 0; count < (12 * nb_rb); count++) {
sinr_dB[count] = enb_data->tx_power_dBm
+ eNB2UE->path_loss_dB
- (thermal_noise + ue_data->rx_noise_level)
+ 10 * log10 (pow(eNB2UE->chF[0][count].x, 2)
+ pow(eNB2UE->chF[0][count].y, 2));
//printf("sinr_dB[%d]: %1f\n",count,sinr_dB[count]);
//printf("Dl_link SNR for res. block %d is %lf\n", count, sinr[eNB_id][count]);
}
break;
case 2:
for (count = 0; count < (12 * nb_rb); count++) {
abs_channel=0;
for (aarx=0;aarx<eNB2UE->nb_rx;aarx++) {
for (aatx=0;aatx<eNB2UE->nb_tx;aatx++) {
abs_channel += (pow(eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].x, 2) + pow(eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].y, 2));
}
}
sinr_dB[count] = enb_data->tx_power_dBm
+ eNB2UE->path_loss_dB
- (thermal_noise + ue_data->rx_noise_level)
+ 10 * log10 (abs_channel/2);
// printf("sinr_dB[%d]: %1f\n",count,sinr_dB[count]);
}
break;
case 5:
for (count = 0; count < (12 * nb_rb); count++) {
channelx=0;
channely=0;
channelx_i=0;
channely_i=0;
qq = (q>>(((count/12)>>2)<<1))&3;
//printf("pmi_alloc %d: rb %d, pmi %d\n",q,count/12,qq);
// qq = q;
for (aarx=0;aarx<eNB2UE->nb_rx;aarx++) {
for (aatx=0;aatx<eNB2UE->nb_tx;aatx++) {
switch(qq){
case 0:
if (channelx==0 || channely==0){
channelx = eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].x;
channely = eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].y;
channelx_i = eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].x;
channely_i = eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].y;
}
else{
channelx += eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].x;
channely += eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].y;
channelx_i -= eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].x;
channely_i -= eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].y;
}
break;
case 1:
if (channelx==0 || channely==0){
channelx = eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].x;
channely = eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].y;
channelx_i = eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].x;
channely_i = eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].y;
}
else{
channelx -= eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].x;
channely -= eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].y;
channelx_i += eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].x;
channely_i += eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].y;
}
break;
case 2:
if (channelx==0 || channely==0){
channelx = eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].x;
channely = eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].y;
channelx_i = eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].x;
channely_i = eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].y;
}
else{
channelx -= eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].y;
channely += eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].x;
channelx_i += eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].y;
channely_i -= eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].x;
}
break;
case 3:
if (channelx==0 || channely==0){
channelx = eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].x;
channely = eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].y;
channelx_i = eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].x;
channely_i = eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].y;
}
else{
channelx += eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].y;
channely -= eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].x;
channelx_i -= eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].y;
channely_i += eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].x;
}
break;
default:
msg("Problem in SINR Calculation for TM5 \n");
break;
}//switch(q)
}//aatx
}//aarx
/* sinr_dB[count] = enb_data->tx_power_dBm
+ eNB2UE->path_loss_dB
- (thermal_noise + ue_data->rx_noise_level)
+ 10 * log10 ((pow(channelx,2) + pow(channely,2))/2) - 10 * log10 ((pow(channelx_i,2) + pow(channely_i,2))/2);
*/
sinr_dB[count] = enb_data->tx_power_dBm
+ eNB2UE->path_loss_dB
- (thermal_noise + ue_data->rx_noise_level)
+ 10 * log10 ((pow(channelx,2) + pow(channely,2))) - 10 * log10 ((pow(channelx_i,2) + pow(channely_i,2))) - 3; // 3dB is subtracted as the tx_power_dBm is to be adjusted on per user basis
// printf("sinr_dB[%d]: %1f\n",count,sinr_dB[count]);
}
break;
case 6:
for (count = 0; count < (12 * nb_rb); count++) {
channelx=0;
channely=0;
qq = (q>>(((count/12)>>2)<<1))&3;
//printf("pmi_alloc %d: rb %d, pmi %d\n",q,count/12,qq);
// qq = q;
for (aarx=0;aarx<eNB2UE->nb_rx;aarx++) {
for (aatx=0;aatx<eNB2UE->nb_tx;aatx++) {
switch(qq){
case 0:
if (channelx==0 || channely==0){
channelx = eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].x;
channely = eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].y;
}
else{
channelx += eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].x;
channely += eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].y;
}
break;
case 1:
if (channelx==0 || channely==0){
channelx = eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].x;
channely = eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].y;
}
else{
channelx -= eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].x;
channely -= eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].y;
}
break;
case 2:
if (channelx==0 || channely==0){
channelx = eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].x;
channely = eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].y;
}
else{
channelx -= eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].y;
channely += eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].x;
}
break;
case 3:
if (channelx==0 || channely==0){
channelx = eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].x;
channely = eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].y;
}
else{
channelx += eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].y;
channely -= eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][count].x;
}
break;
default:
msg("Problem in SINR Calculation for TM6 \n");
break;
}//switch(q)
}//aatx
}//aarx
sinr_dB[count] = enb_data->tx_power_dBm
+ eNB2UE->path_loss_dB
- (thermal_noise + ue_data->rx_noise_level)
+ 10 * log10 ((pow(channelx,2) + pow(channely,2))/2);
// printf("sinr_dB[%d]: %1f\n",count,sinr_dB[count]);
}
break;
default:
msg("Problem in SINR Initialization in sinr_sim.c\n");
break;
}//switch
}//function ends
#ifdef PHY_ABSTRACTION_UL
void init_snr_up(channel_desc_t* UE2eNB, node_desc_t *enb_data, node_desc_t *ue_data, double* sinr_dB, double* N0,u16 nb_rb,u16 fr_rb) {
int return_value;
double thermal_noise;
int count;
int aarx;
// nb_rb = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb;
/* Thermal noise is calculated using 10log10(K*T*B) K = Boltzmann's constant T = room temperature B = bandwidth */
thermal_noise = -174 + 10*log10(UE2eNB->BW*1e6); //value in dBm
*N0 = thermal_noise + enb_data->rx_noise_level;//? all the element have the same noise level?????
double lambda ;
double residual;
double sinrlin;
double residual_db;
residual = 0 ;
int ccc;
/*
for (count = (fr_rb*12) ; count < (12 * (fr_rb+nb_rb)); count++)
{
residual += ( 1 / ( pow((UE2eNB -> chF[0][count].x),2) + pow((UE2eNB -> chF[0][count].y),2)));
}
*///sinreff(nn) = ((sum((1/p).*(snrm(nn,:)./(snrm(nn,:)+1)),2).^(-1) )-1).^-1;
sinrlin = 0 ;
lambda = 0;
////First calculate SINRs of subcarriers just like OFDM
for (count = (fr_rb*12) ; count < (12 * (fr_rb+nb_rb)); count++)
{
sinr_dB[count] = ue_data->tx_power_dBm
+ UE2eNB->path_loss_dB
- (thermal_noise + enb_data->rx_noise_level)
+ 10 * log10 (pow(UE2eNB->chF[0][count].x, 2)
+ pow(UE2eNB->chF[0][count].y, 2));
}
//Then apply formula :
if(nb_rb > 0)
{
//calculate lambdas and fill the same with all but just use one of them when necessary for abstraction
for (count = fr_rb*12; count < (12 * (fr_rb+nb_rb)); count++)
{
sinrlin = pow((sinr_dB[count]/10),10); // convert SINR to linear
lambda += (sinrlin / (sinrlin + 1)) ;
}
for (count = fr_rb*12; count < (12 * (fr_rb+nb_rb)); count++)
{
sinr_dB[count] = pow(lambda,2) /(((nb_rb)*lambda)-pow(lambda,2)) ;
sinr_dB[count] = 10*log10(sinr_dB[count]) ; //save it in db
}
printf("tx_power %g, path_loss %g, sinr_dB[0] %g\n",ue_data->tx_power_dBm ,UE2eNB->path_loss_dB,sinr_dB[count-1]);
for (ccc = 0; ccc < 301 ; ccc++ )
{
SINRpost_eff[ccc] = 0;
SINRpost_eff[ccc] = sinr_dB[ccc];
}
}
}//function ends
#endif
void calculate_sinr(channel_desc_t* eNB2UE, node_desc_t *enb_data, node_desc_t *ue_data, double *sinr_dB) {
double sir, thermal_noise;
short nb_rb = 25; //No. of resource blocks
short count;
/* Thermal noise is calculated using 10log10(K*T*B) K = Boltzmann's constant T = room temperature B = bandwidth */
thermal_noise = -174 + 10*log10(eNB2UE->BW*1e6); //value in dBm
for (count = 0; count < 12 * nb_rb; count++) {
sir = enb_data->tx_power_dBm
+ eNB2UE->path_loss_dB
- (thermal_noise + ue_data->rx_noise_level)
+ 10 * log10 (pow(eNB2UE->chF[0][count].x, 2)
+ pow(eNB2UE->chF[0][count].y, 2));
if (sir > 0)
sinr_dB[count] -= sir;
//printf("*****sinr% lf \n",sinr_dB[count]);
}
}
void get_beta_map() {
char *file_path = NULL;
//int table_len = 0;
int t;
int mcs = 0;
char *sinr_bler;
char buffer[1000];
FILE *fp;
file_path = (char*) malloc(512);
for (mcs = 0; mcs < MCS_COUNT; mcs++) {
sprintf(file_path,"%s/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/awgn_abst/awgn_snr_bler_mcs%d.csv",getenv("OPENAIR1_DIR"),mcs);
fp = fopen(file_path,"r");
if (fp == NULL) {
LOG_W(OCM,"ERROR: Unable to open the file %s, try an alternative path\n", file_path);
memset(file_path, 0, 512);
sprintf(file_path,"AWGN/awgn_snr_bler_mcs%d.csv",mcs);
LOG_I(OCM,"Opening the alternative path %s\n", file_path);
fp = fopen(file_path,"r");
if (fp == NULL) {
LOG_E(OCM,"ERROR: Unable to open the file %s, exisitng\n", file_path);
exit(-1);
}
}
// else {
fgets(buffer, 1000, fp);
table_length[mcs]=0;
while (!feof(fp)) {
sinr_bler = strtok(buffer, ",");
sinr_bler_map[mcs][0][table_length[mcs]] = atof(sinr_bler);
sinr_bler = strtok(NULL,",");
sinr_bler_map[mcs][1][table_length[mcs]] = atof(sinr_bler);
table_length[mcs]++;
fgets(buffer, 1000, fp);
}
fclose(fp);
// }
LOG_D(OCM,"Print the table for mcs %d\n",mcs);
for (t = 0; t<table_length[mcs]; t++)
LOG_D(OCM,"%lf %lf \n ",sinr_bler_map[mcs][0][t],sinr_bler_map[mcs][1][t]);
}
free(file_path);
}
//this function reads and stores the Mutual information tables for the MIESM abstraction.
void get_MIESM_param() {
char *file_path = NULL;
char buffer[10000];
FILE *fp;
int qam[3] = {4,16,64};
int q,cnt;
char *result = NULL;
int table_len=0;
int t;
file_path = (char*) malloc(512);
for (q=0;q<3;q++)
{
sprintf(file_path,"%s/SIMU/USER/files/MI_%dqam.csv",getenv("OPENAIR_TARGETS"),qam[q]);
fp = fopen(file_path,"r");
if (fp == NULL) {
printf("ERROR: Unable to open the file %s\n", file_path);
exit(-1);
}
else {
cnt=-1;
switch(qam[q]) {
case 4:
while (!feof(fp)) {
table_len =0;
cnt++;
fgets(buffer, 10000, fp);
result = strtok(buffer, ",");
while (result != NULL) {
MI_map_4qam[cnt][table_len]= atof(result);
result = strtok(NULL, ",");
table_len++;
}
}
fclose(fp);
for (t = 0; t < 162; t++){
// MI_map_4Qam[0][t] = pow(10,0.1*(MI_map_4Qam[0][t]));
printf("MIESM 4QAM Table: %lf %lf %1f\n ",MI_map_4qam[0][t],MI_map_4qam[1][t], MI_map_4qam[2][t]);
}
break;
case 16:
while (!feof(fp)) {
table_len =0;
cnt++;
fgets(buffer, 10000, fp);
result = strtok(buffer, ",");
while (result != NULL) {
MI_map_16qam[cnt][table_len]= atof(result);
result = strtok(NULL, ",");
table_len++;
}
}
fclose(fp);
for (t = 0; t < 197; t++){
// MI_map_16Qam[0][t] = pow(10,0.1*(MI_map_16Qam[0][t]));
printf("MIESM 16 QAM Table: %lf %lf %1f\n ",MI_map_16qam[0][t],MI_map_16qam[1][t], MI_map_16qam[2][t]);
}
break;
case 64:
while (!feof(fp)) {
table_len=0;
cnt++;
if(cnt==3)
break;
fgets(buffer, 10000, fp);
result = strtok(buffer, ",");
while (result != NULL) {
MI_map_64qam[cnt][table_len]= atof(result);
result = strtok(NULL, ",");
table_len++;
}
}
fclose(fp);
for (t = 0; t < 227; t++){
//MI_map_64Qam[0][t] = pow(10,0.1*(MI_map_64Qam[0][t]));
printf("MIESM 64QAM Table: %lf %lf %1f\n ",MI_map_64qam[0][t],MI_map_64qam[1][t], MI_map_64qam[2][t]);
}
break;
default:
msg("Error, bad input, quitting\n");
break;
}
}
}
free(file_path);
}
#ifdef PHY_ABSTRACTION_UL
void get_beta_map_up() {
char *file_path = NULL;
int table_len = 0;
int mcs = 0;
char *sinr_bler;
char buffer[1000];
FILE *fp;
file_path = (char*) malloc(512);
for (mcs = 0; mcs < MCS_COUNT; mcs++) {
sprintf(file_path,"%s/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/awgn_abst/awgn_snr_bler_mcs%d_up.csv",getenv("OPENAIR1_DIR"),mcs);
fp = fopen(file_path,"r");
if (fp == NULL) {
LOG_W(OCM,"ERROR: Unable to open the file %s, try an alternative path\n", file_path);
memset(file_path, 0, 512);
sprintf(file_path,"AWGN/awgn_snr_bler_mcs%d.csv",mcs);
LOG_I(OCM,"Opening the alternative path %s\n", file_path);
fp = fopen(file_path,"r");
if (fp == NULL) {
LOG_E(OCM,"ERROR: Unable to open the file %s, exisitng\n", file_path);
exit(-1);
}
}
// else {
fgets(buffer, 1000, fp);
table_len=0;
while (!feof(fp)) {
sinr_bler = strtok(buffer, ",");
sinr_bler_map_up[mcs][0][table_len] = atof(sinr_bler);
sinr_bler = strtok(NULL,",");
sinr_bler_map_up[mcs][1][table_len] = atof(sinr_bler);
table_len++;
fgets(buffer, 1000, fp);
}
fclose(fp);
// }
LOG_D(OCM,"Print the table for mcs %d\n",mcs);
for (table_len = 0; table_len < 16; table_len++)
LOG_D(OCM,"%lf %lf \n ",sinr_bler_map_up[mcs][0][table_len],sinr_bler_map_up[mcs][1][table_len]);
}
free(file_path);
}
#endif
+330
View File
@@ -0,0 +1,330 @@
/*
* Copyright (c) 2011, Mathias Brossard <mathias@brossard.org>.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 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.
*
* 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
* HOLDER 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.
*/
/**
* @file threadpool.c
* @brief Threadpool implementation file
*/
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include "oaisim.h"
#include "UTIL/OCG/OCG_extern.h"
#include "UTIL/FIFO/pad_list.h"
#include "threadpool.h"
extern u8 abstraction_flag;
extern Signal_buffers *signal_buffers_g;
extern channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX];
extern channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX];
extern node_desc_t *enb_data[NUMBER_OF_eNB_MAX];
extern node_desc_t *ue_data[NUMBER_OF_UE_MAX];
extern LTE_DL_FRAME_PARMS *frame_parms;
/**
* @function void *threadpool_thread(void *threadpool)
* @brief the worker thread
* @param threadpool the pool which own the thread
*/
void *threadpool_thread(void *threadpool);
int threadpool_free(threadpool_t *pool);
threadpool_t *threadpool_create(int thread_count)
{
threadpool_t *pool;
int i;
/* TODO: Check for negative or otherwise very big input parameters */
if((pool = (threadpool_t *)malloc(sizeof(threadpool_t))) == NULL) {
goto err;
}
// memset
/* Initialize */
pool->thread_count = thread_count;
job_list_init(&(pool->job_queue));
pool->shutdown = pool->started = pool->active = 0;
/* Allocate thread and task queue */
pool->threads = (pthread_t *)malloc(sizeof (pthread_t) * thread_count);
// memset
/* Initialize mutex and conditional variable first */
if((pthread_mutex_init(&(pool->lock), NULL) != 0) ||
(pthread_mutex_init(&(pool->sync_lock), NULL) != 0) ||
(pthread_cond_init(&(pool->notify), NULL) != 0) ||
(pthread_cond_init(&(pool->sync_notify), NULL) != 0) ||
(pool->threads == NULL)) {
goto err;
}
/* Start worker threads */
for(i = 0; i < thread_count; i++) {
if(pthread_create(&(pool->threads[i]), NULL,
threadpool_thread, (void*)pool) != 0) {
threadpool_destroy(pool);
return NULL;
} else {
pool->started++;
}
}
return pool;
err:
if(pool) {
threadpool_free(pool);
}
return NULL;
}
int threadpool_add(threadpool_t *pool, Job_elt *job)
{
int err = 0;
if(pool == NULL || job == NULL) {
return threadpool_invalid;
}
if(pthread_mutex_lock(&(pool->lock)) != 0) {
return threadpool_lock_failure;
}
do {
/* Are we shutting down ? */
if(pool->shutdown) {
err = threadpool_shutdown;
break;
}
/* Add task to queue */
job_list_add_tail_eurecom(job, &(pool->job_queue));
/* pthread_cond_broadcast */
if(pthread_cond_signal(&(pool->notify)) != 0) {
err = threadpool_lock_failure;
break;
}
} while(0);
if(pthread_mutex_unlock(&pool->lock) != 0) {
err = threadpool_lock_failure;
}
return err;
}
int threadpool_destroy(threadpool_t *pool)
{
int i, err = 0;
if(pool == NULL) {
return threadpool_invalid;
}
if(pthread_mutex_lock(&(pool->lock)) != 0) {
return threadpool_lock_failure;
}
do {
/* Already shutting down */
if(pool->shutdown) {
err = threadpool_shutdown;
break;
}
pool->shutdown = 1;
/* Wake up all worker threads */
if((pthread_cond_broadcast(&(pool->notify)) != 0) ||
(pthread_mutex_unlock(&(pool->lock)) != 0)) {
err = threadpool_lock_failure;
break;
}
/* Join all worker thread */
for(i = 0; i < pool->thread_count; i++) {
if(pthread_join(pool->threads[i], NULL) != 0) {
err = threadpool_thread_failure;
}
}
} while(0);
if(pthread_mutex_unlock(&pool->lock) != 0) {
err = threadpool_lock_failure;
}
/* Only if everything went well do we deallocate the pool */
if(!err) {
threadpool_free(pool);
}
return err;
}
int threadpool_free(threadpool_t *pool)
{
if(pool == NULL || pool->started > 0) {
return -1;
}
/* Did we manage to allocate ? */
if(pool->threads) {
free(pool->threads);
job_list_free (&(pool->job_queue));
/* Because we allocate pool->threads after initializing the
mutex and condition variable, we're sure they're
initialized. Let's lock the mutex just in case. */
pthread_mutex_lock(&(pool->lock));
pthread_mutex_destroy(&(pool->lock));
pthread_mutex_destroy(&(pool->sync_lock));
pthread_cond_destroy(&(pool->notify));
pthread_cond_destroy(&(pool->sync_notify));
}
free(pool);
return 0;
}
void *threadpool_thread(void *threadpool)
{
threadpool_t *pool = (threadpool_t *)threadpool;
Job_elt * job_elt;
int err;
printf("The ID of this thread is: %u\n", (unsigned int)pthread_self());
for(;;) {
/* Lock must be taken to wait on conditional variable */
pthread_mutex_lock(&(pool->lock));
/* Wait on condition variable, check for spurious wakeups.
When returning from pthread_cond_wait(), we own the lock. */
while(((pool->job_queue).nb_elements == 0) && (!pool->shutdown)) {
pthread_cond_wait(&(pool->notify), &(pool->lock));
}
if(pool->shutdown) {
break;
}
/* Grab our task */
job_elt = job_list_remove_head(&(pool->job_queue));
if((err = pthread_mutex_lock(&(pool->sync_lock))) != 0) {
printf("Mutex Error \n");
return err;
}
pool->active++;
if((err = pthread_mutex_unlock(&pool->sync_lock)) != 0) {
printf("Mutex Error \n");
return err;
}
/* Unlock */
pthread_mutex_unlock(&(pool->lock));
/* Get to work */
switch((job_elt->job).type) {
case JT_OTG:
if ((job_elt->job).eNB_flag)
update_otg_eNB((job_elt->job).nid, (unsigned int) oai_emulation.info.time_ms);
else
update_otg_UE((job_elt->job).nid, (unsigned int) oai_emulation.info.time_ms);
break;
case JT_PDCP://do not forget adding flag enb
if ((job_elt->job).eNB_flag)
pdcp_run(frame, 1, 0, (job_elt->job).nid);
else
pdcp_run(frame, 0, (job_elt->job).nid, 0);
break;
case JT_PHY_MAC:
if ((job_elt->job).eNB_flag)
phy_procedures_eNB_lte ((job_elt->job).last_slot, (job_elt->job).next_slot, PHY_vars_eNB_g[(job_elt->job).nid], abstraction_flag);
else
phy_procedures_UE_lte ((job_elt->job).last_slot, (job_elt->job).next_slot, PHY_vars_UE_g[(job_elt->job).nid], 0, abstraction_flag, normal_txrx);
ue_data[(job_elt->job).nid]->tx_power_dBm = PHY_vars_UE_g[(job_elt->job).nid]->tx_power_dBm;
break;
case JT_INIT_SYNC:
initial_sync(PHY_vars_UE_g[(job_elt->job).nid],normal_txrx);
break;
case JT_DL:
do_DL_sig(signal_buffers_g[(job_elt->job).nid].r_re0,signal_buffers_g[(job_elt->job).nid].r_im0,signal_buffers_g[(job_elt->job).nid].r_re,signal_buffers_g[(job_elt->job).nid].r_im,
signal_buffers_g[(job_elt->job).nid].s_re,signal_buffers_g[(job_elt->job).nid].s_im,eNB2UE,enb_data,ue_data,(job_elt->job).next_slot,abstraction_flag,
frame_parms,(job_elt->job).nid);
break;
case JT_UL:
do_UL_sig(signal_buffers_g[(job_elt->job).nid].r_re0,signal_buffers_g[(job_elt->job).nid].r_im0,signal_buffers_g[(job_elt->job).nid].r_re,signal_buffers_g[(job_elt->job).nid].r_im,
signal_buffers_g[(job_elt->job).nid].s_re,signal_buffers_g[(job_elt->job).nid].s_im,UE2eNB,enb_data,ue_data,(job_elt->job).next_slot,abstraction_flag,
frame_parms,frame);
break;
}
if((err = pthread_mutex_lock(&(pool->sync_lock))) != 0) {
printf("Mutex Error \n");
return err;
}
pool->active--;
if ((pool->active <= 0) && ((pool->job_queue).nb_elements == 0)) {
pool->active=0;
if(pthread_cond_signal(&(pool->sync_notify)) != 0) {
printf("Condition Error \n");
break;
}
}
if((err = pthread_mutex_unlock(&pool->sync_lock)) != 0) {
printf("Mutex Error \n");
return err;
}
}
pool->started--;
pthread_mutex_unlock(&(pool->lock));
pthread_exit(NULL);
return(NULL);
}
+101
View File
@@ -0,0 +1,101 @@
/*
* Copyright (c) 2011, Mathias Brossard <mathias@brossard.org>.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 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.
*
* 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
* HOLDER 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.
*/
#ifndef _THREADPOOL_H_
#define _THREADPOOL_H_
/**
* @file threadpool.h
* @brief Threadpool Header file
*/
/**
* @struct threadpool
* @brief The threadpool struct
*
* @var notify Condition variable to notify worker threads.
* @var threads Array containing worker threads ID.
* @var thread_count Number of threads
* @var job_queue Array containing the task queue.
* @var shutdown Flag indicating if the pool is shutting down
*/
struct threadpool_t {
pthread_mutex_t lock; // used to get / put a job in the queue, protect job_queue
pthread_mutex_t sync_lock; // used when there is a dependancy between two consecutive jobs, protect active
pthread_cond_t notify; // wakup threads
pthread_cond_t sync_notify; // last worker sends this
pthread_t *threads;
Job_List job_queue;
int thread_count;
int count; // ????
int shutdown; // end of sim/emu
int started; // total number of thread started , after init: started == count
int active; // num active threads
};
typedef struct threadpool_t threadpool_t;
typedef enum {
threadpool_invalid = -1,
threadpool_lock_failure = -2,
threadpool_queue_full = -3,
threadpool_shutdown = -4,
threadpool_thread_failure = -5
} threadpool_error_t;
/**
* @function threadpool_create
* @brief Creates a threadpool_t object.
* @param thread_count Number of worker threads.
* @param queue_size Size of the queue.
* @param flags Unused parameter.
* @return a newly created thread pool or NULL
*/
threadpool_t *threadpool_create(int thread_count);
/**
* @function threadpool_add
* @brief add a new task in the queue of a thread pool
* @param pool Thread pool to which add the task.
* @param function Pointer to the function that will perform the task.
* @param argument Argument to be passed to the function.
* @param flags Unused parameter.
* @return 0 if all goes well, negative values in case of error (@see
* threadpool_error_t for codes).
*/
int threadpool_add(threadpool_t *pool, Job_elt *job);
/**
* @function threadpool_destroy
* @brief Stops and destroys a thread pool.
* @param pool Thread pool to destroy.
* @param flags Unused parameter.
*/
int threadpool_destroy(threadpool_t *pool);
#endif /* _THREADPOOL_H_ */