diff --git a/ci-scripts/Jenkinsfile-tmp-ran b/ci-scripts/Jenkinsfile-tmp-ran
index 4db4ec0b2d..1277e0d483 100644
--- a/ci-scripts/Jenkinsfile-tmp-ran
+++ b/ci-scripts/Jenkinsfile-tmp-ran
@@ -31,6 +31,9 @@ def testXMLFile = params.pythonTestXmlFile
// Name of the test stage
def testStageName = params.pipelineTestStageName
+// Name of the phone resource
+def ciSmartPhoneResource = params.smartphonesResource
+
// Terminate Status
def termUE = 0
def termENB = 1
@@ -70,6 +73,7 @@ pipeline {
string(name: 'pythonTestXmlFile', defaultValue: 'enb_usrpB210_band7_50PRB.xml', description: 'Location of the Test XML to be run')
string(name: 'pipelineTestStageName', defaultValue: 'Test COTS-UE - OAI eNB - LTEBOX EPC', description: 'Naming of the Test Stage')
booleanParam(name: 'pipelineZipsConsoleLog', defaultValue: 'True', description: 'If true, the pipeline script retrieves the job console log, zips it and archives it as artifact')
+ string(name: 'smartphonesResource', defaultValue: 'CI-Bench-1-Phones', description: 'Lockeable Resource to prevent multiple jobs to run simultaneously with the same resource')
//eNB parameters
string(name: 'eNB_IPAddress', defaultValue: '192.168.XX.XX', description: 'IP Address of eNB')
@@ -112,6 +116,9 @@ pipeline {
testStageName = 'Template Test Stage'
}
+ if (params.smartphonesResource == null) {
+ allParametersPresent = false
+ }
if (params.eNB_IPAddress == null) {
allParametersPresent = false
}
@@ -178,6 +185,7 @@ pipeline {
steps {
script {
dir ('ci-scripts') {
+ lock (ciSmartPhoneResource) {
try {
echo "\u2705 \u001B[32m${testStageName}\u001B[0m"
withCredentials([
@@ -190,6 +198,7 @@ pipeline {
} catch (Exception e) {
currentBuild.result = 'FAILURE'
}
+ }
}
}
}
diff --git a/ci-scripts/checkCodingFormattingRules.sh b/ci-scripts/checkCodingFormattingRules.sh
index a18fc67c75..61cbf12560 100755
--- a/ci-scripts/checkCodingFormattingRules.sh
+++ b/ci-scripts/checkCodingFormattingRules.sh
@@ -120,21 +120,34 @@ echo "Source Branch is : $SOURCE_BRANCH"
echo "Target Branch is : $TARGET_BRANCH"
echo "Merged Commit is : $MERGE_COMMMIT"
echo "Target Init is : $TARGET_INIT_COMMIT"
+echo ""
+echo " ----------------------------------------------------------"
+echo ""
# Retrieve the list of modified files since the latest develop commit
MODIFIED_FILES=`git log $TARGET_INIT_COMMIT..$MERGE_COMMMIT --oneline --name-status | egrep "^M|^A" | sed -e "s@^M\t*@@" -e "s@^A\t*@@" | sort | uniq`
NB_TO_FORMAT=0
+if [ -f oai_rules_result_list.txt ]
+then
+ rm -f oai_rules_result_list.txt
+fi
for FULLFILE in $MODIFIED_FILES
do
- echo $FULLFILE
filename=$(basename -- "$FULLFILE")
EXT="${filename##*.}"
if [ $EXT = "c" ] || [ $EXT = "h" ] || [ $EXT = "cpp" ] || [ $EXT = "hpp" ]
then
TO_FORMAT=`astyle --dry-run --options=ci-scripts/astyle-options.txt $FULLFILE | grep -c Formatted `
NB_TO_FORMAT=$((NB_TO_FORMAT + TO_FORMAT))
+ if [ $TO_FORMAT -ne 0 ]
+ then
+ echo $FULLFILE
+ echo $FULLFILE >> ./oai_rules_result_list.txt
+ fi
fi
done
+echo ""
+echo " ----------------------------------------------------------"
echo "Nb Files that do NOT follow OAI rules: $NB_TO_FORMAT"
echo $NB_TO_FORMAT > ./oai_rules_result.txt
diff --git a/ci-scripts/conf_files/enb.band7.tm1.100PRB.usrpb210.conf b/ci-scripts/conf_files/enb.band7.tm1.100PRB.usrpb210.conf
index 37656de755..3d79fd0986 100644
--- a/ci-scripts/conf_files/enb.band7.tm1.100PRB.usrpb210.conf
+++ b/ci-scripts/conf_files/enb.band7.tm1.100PRB.usrpb210.conf
@@ -228,6 +228,15 @@ RUs = (
}
);
+THREAD_STRUCT = (
+ {
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+ }
+);
+
NETWORK_CONTROLLER :
{
FLEXRAN_ENABLED = "no";
diff --git a/ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf b/ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf
index 01c1ca1428..b4c20ba644 100644
--- a/ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf
+++ b/ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf
@@ -228,6 +228,15 @@ RUs = (
}
);
+THREAD_STRUCT = (
+ {
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+ }
+);
+
NETWORK_CONTROLLER :
{
FLEXRAN_ENABLED = "no";
diff --git a/ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf b/ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf
index eb5822cb22..a6ac1f8c14 100644
--- a/ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf
+++ b/ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf
@@ -228,6 +228,15 @@ RUs = (
}
);
+THREAD_STRUCT = (
+ {
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+ }
+);
+
NETWORK_CONTROLLER :
{
FLEXRAN_ENABLED = "no";
diff --git a/ci-scripts/conf_files/lte-basic-sim.conf b/ci-scripts/conf_files/lte-basic-sim.conf
index f0fab0bdcb..0b02e8f871 100644
--- a/ci-scripts/conf_files/lte-basic-sim.conf
+++ b/ci-scripts/conf_files/lte-basic-sim.conf
@@ -229,6 +229,15 @@ RUs = (
}
);
+THREAD_STRUCT = (
+ {
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_SINGLE_THREAD";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+ }
+);
+
NETWORK_CONTROLLER :
{
FLEXRAN_ENABLED = "no";
diff --git a/ci-scripts/main.py b/ci-scripts/main.py
index f210fd4518..589f389850 100644
--- a/ci-scripts/main.py
+++ b/ci-scripts/main.py
@@ -90,38 +90,50 @@ class SSHConnection():
self.htmlUEConnected = 0
def open(self, ipaddress, username, password):
- self.ssh = pexpect.spawn('ssh', [username + '@' + ipaddress], timeout = 5)
- self.sshresponse = self.ssh.expect(['Are you sure you want to continue connecting (yes/no)?', 'password:', 'Last login', pexpect.EOF, pexpect.TIMEOUT])
- if self.sshresponse == 0:
- self.ssh.sendline('yes')
- self.ssh.expect('password:')
- self.ssh.sendline(password)
- self.sshresponse = self.ssh.expect(['\$', 'Permission denied', 'password:', pexpect.EOF, pexpect.TIMEOUT])
+ count = 0
+ connect_status = False
+ while count < 4:
+ self.ssh = pexpect.spawn('ssh', [username + '@' + ipaddress], timeout = 5)
+ self.sshresponse = self.ssh.expect(['Are you sure you want to continue connecting (yes/no)?', 'password:', 'Last login', pexpect.EOF, pexpect.TIMEOUT])
if self.sshresponse == 0:
- pass
+ self.ssh.sendline('yes')
+ self.ssh.expect('password:')
+ self.ssh.sendline(password)
+ self.sshresponse = self.ssh.expect(['\$', 'Permission denied', 'password:', pexpect.EOF, pexpect.TIMEOUT])
+ if self.sshresponse == 0:
+ count = 10
+ connect_status = True
+ else:
+ logging.debug('self.sshresponse = ' + str(self.sshresponse))
+ elif self.sshresponse == 1:
+ self.ssh.sendline(password)
+ self.sshresponse = self.ssh.expect(['\$', 'Permission denied', 'password:', pexpect.EOF, pexpect.TIMEOUT])
+ if self.sshresponse == 0:
+ count = 10
+ connect_status = True
+ else:
+ logging.debug('self.sshresponse = ' + str(self.sshresponse))
+ elif self.sshresponse == 2:
+ # Checking if we are really on the remote client defined by its IP address
+ self.command('stdbuf -o0 ifconfig | egrep --color=never "inet addr:"', '\$', 5)
+ result = re.search(str(ipaddress), str(self.ssh.before))
+ if result is None:
+ self.close()
+ else:
+ count = 10
+ connect_status = True
else:
+ # debug output
+ logging.debug(str(self.ssh.before))
logging.debug('self.sshresponse = ' + str(self.sshresponse))
- sys.exit('SSH Connection Failed')
- elif self.sshresponse == 1:
- self.ssh.sendline(password)
- self.sshresponse = self.ssh.expect(['\$', 'Permission denied', 'password:', pexpect.EOF, pexpect.TIMEOUT])
- if self.sshresponse == 0:
- pass
- else:
- logging.debug('self.sshresponse = ' + str(self.sshresponse))
- sys.exit('SSH Connection Failed')
- elif self.sshresponse == 2:
- # Checking if we are really on the remote client defined by its IP address
- self.command('stdbuf -o0 ifconfig | egrep --color=never "inet addr:"', '\$', 5)
- result = re.search(str(ipaddress), str(self.ssh.before))
- if result is None:
- sys.exit('SSH Connection Failed: TIMEOUT !!!')
+ # adding a tempo when failure
+ if not connect_status:
+ time.sleep(1)
+ count += 1
+ if connect_status:
pass
else:
- # debug output
- logging.debug(str(self.ssh.before))
- logging.debug('self.sshresponse = ' + str(self.sshresponse))
- sys.exit('SSH Connection Failed!!!')
+ sys.exit('SSH Connection Failed')
def command(self, commandline, expectedline, timeout):
logging.debug(commandline)
diff --git a/ci-scripts/reportBuildLocally.sh b/ci-scripts/reportBuildLocally.sh
index 609af5f166..ea2cc5e44f 100755
--- a/ci-scripts/reportBuildLocally.sh
+++ b/ci-scripts/reportBuildLocally.sh
@@ -260,7 +260,7 @@ function sca_summary_table_footer {
echo " " >> ./build_results.html
echo " " >> ./build_results.html
echo "
Full details in zipped artifact (cppcheck/cppcheck.xml)
" >> ./build_results.html
- echo " Graphical Interface tool : cppcheck-gui -l cppcheck/cppcheck.xml
" >> ./build_results.html
+ echo " Graphical Interface tool : cppcheck-gui -l cppcheck/cppcheck.xml
" >> ./build_results.html
}
jb_checker=0
@@ -490,12 +490,20 @@ then
then
if [ $PU_TRIG -eq 1 ]; then echo " All files in repository follow OAI rules. | " >> ./build_results.html; fi
if [ $MR_TRIG -eq 1 ]; then echo " All modified files in Merge-Request follow OAI rules. | " >> ./build_results.html; fi
+ echo " " >> ./build_results.html
+ echo " " >> ./build_results.html
else
if [ $PU_TRIG -eq 1 ]; then echo " $NB_FILES files in repository DO NOT follow OAI rules. | " >> ./build_results.html; fi
if [ $MR_TRIG -eq 1 ]; then echo " $NB_FILES modified files in Merge-Request DO NOT follow OAI rules. | " >> ./build_results.html; fi
+ echo " " >> ./build_results.html
+ if [ -f ./oai_rules_result_list.txt ]
+ then
+ awk '{print " | "$1" |
"}' ./oai_rules_result_list.txt >> ./build_results.html
+ fi
+ echo " " >> ./build_results.html
+ echo " Please apply the following command to this(ese) file(s):
" >> ./build_results.html
+ echo " astyle --options=ci-scripts/astyle-options.txt filename(s)
" >> ./build_results.html
fi
- echo " " >> ./build_results.html
- echo " " >> ./build_results.html
fi
echo " Ubuntu 16.04 LTS -- Summary
" >> ./build_results.html
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 8683dfd2e1..5bf07dae01 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -474,12 +474,12 @@ include_directories ("${X2AP_DIR}")
add_library(X2AP_ENB
${X2AP_DIR}/x2ap_eNB.c
- # ${X2AP_DIR}/x2ap_eNB_decoder.c
- # ${X2AP_DIR}/x2ap_eNB_encoder.c
+ ${X2AP_DIR}/x2ap_eNB_decoder.c
+ ${X2AP_DIR}/x2ap_eNB_encoder.c
${X2AP_DIR}/x2ap_eNB_handler.c
- # ${X2AP_DIR}/x2ap_eNB_itti_messaging.c
+ ${X2AP_DIR}/x2ap_eNB_itti_messaging.c
${X2AP_DIR}/x2ap_eNB_management_procedures.c
- # ${X2AP_DIR}/x2ap_eNB_generate_messages.c
+ ${X2AP_DIR}/x2ap_eNB_generate_messages.c
)
# Hardware dependant options
diff --git a/common/utils/msc/msc.h b/common/utils/msc/msc.h
index 78eb6cdb08..e8a8a4a0e8 100644
--- a/common/utils/msc/msc.h
+++ b/common/utils/msc/msc.h
@@ -63,6 +63,8 @@ typedef enum {
MSC_S6A_MME,
MSC_HSS,
MAX_MSC_PROTOS,
+ MSC_X2AP_SRC_ENB,
+ MSC_X2AP_TARGET_ENB,
} msc_proto_t;
diff --git a/common/utils/ocp_itti/intertask_interface.cpp b/common/utils/ocp_itti/intertask_interface.cpp
index 931eb40c0f..5b8d1a430e 100644
--- a/common/utils/ocp_itti/intertask_interface.cpp
+++ b/common/utils/ocp_itti/intertask_interface.cpp
@@ -115,11 +115,15 @@ extern "C" {
task_list_t *t=&tasks[destination_task_id];
pthread_mutex_lock (&t->queue_cond_lock);
int ret=itti_send_msg_to_task_locked(destination_task_id, instance, message);
- pthread_mutex_unlock (&t->queue_cond_lock);
- while ( t->message_queue.size()>0 && t->admin.func != NULL )
+ while ( t->message_queue.size()>0 && t->admin.func != NULL ) {
+ if (t->message_queue.size()>1)
+ LOG_W(TMR,"queue in no thread mode is %ld\n", t->message_queue.size());
+ pthread_mutex_unlock (&t->queue_cond_lock);
t->admin.func(NULL);
-
+ pthread_mutex_lock (&t->queue_cond_lock);
+ }
+ pthread_mutex_unlock (&t->queue_cond_lock);
return ret;
}
@@ -193,6 +197,8 @@ extern "C" {
pthread_mutex_unlock(&t->queue_cond_lock);
LOG_D(TMR,"enter blocking wait for %s\n", itti_get_task_name(task_id));
t->nb_events = epoll_wait(t->epoll_fd,t->events,t->nb_fd_epoll, epoll_timeout);
+ if ( t->nb_events < 0 && (errno == EINTR || errno == EAGAIN ) )
+ pthread_mutex_lock(&t->queue_cond_lock);
} while (t->nb_events < 0 && (errno == EINTR || errno == EAGAIN ) );
AssertFatal (t->nb_events >=0,
@@ -278,6 +284,18 @@ extern "C" {
"Thread creation for task %d failed!\n", task_id);
pthread_setname_np( t->thread, itti_get_task_name(task_id) );
LOG_I(TMR,"Created Posix thread %s\n", itti_get_task_name(task_id) );
+#if 1 // BMC test RT prio
+ {
+ int policy;
+ struct sched_param sparam;
+ memset(&sparam, 0, sizeof(sparam));
+ sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-10;
+ policy = SCHED_FIFO ;
+ if (pthread_setschedparam(t->thread, policy, &sparam) != 0) {
+ LOG_E(TMR,"task %s : Failed to set pthread priority\n", itti_get_task_name(task_id) );
+ }
+ }
+#endif
return 0;
}
diff --git a/common/utils/ocp_itti/intertask_interface.h b/common/utils/ocp_itti/intertask_interface.h
index 7d07724cc1..227e9b0b3e 100644
--- a/common/utils/ocp_itti/intertask_interface.h
+++ b/common/utils/ocp_itti/intertask_interface.h
@@ -233,6 +233,11 @@ typedef struct IttiMsgText_s {
#include
//#include
+#include
+void *rrc_enb_process_itti_msg(void *);
+#include
+#include
+
/*
static const char *const messages_definition_xml = {
#include
diff --git a/openair1/PHY/INIT/lte_param_init.c b/openair1/PHY/INIT/lte_param_init.c
index 0830058a8f..dd8c2e54db 100644
--- a/openair1/PHY/INIT/lte_param_init.c
+++ b/openair1/PHY/INIT/lte_param_init.c
@@ -169,6 +169,13 @@ void lte_param_init(PHY_VARS_eNB **eNBp,
}
else ru->N_TA_offset=0;
+#if BASIC_SIMULATOR
+ /* this is required for the basic simulator in TDD mode
+ * TODO: find a proper cleaner solution
+ */
+ UE->N_TA_offset = 0;
+#endif
+
printf("Done lte_param_init\n");
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
index a766bb8202..ded0905388 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
@@ -57,8 +57,8 @@
uint64_t runtime,
uint64_t deadline,
uint64_t period);*/
+extern WORKER_CONF_t get_thread_worker_conf(void);
-extern int codingw;
void free_eNB_dlsch(LTE_eNB_DLSCH_t *dlsch)
{
@@ -615,8 +615,10 @@ int dlsch_encoding_all(PHY_VARS_eNB *eNB,
}
}
- if(C >= 8 && get_nprocs()>=16 && codingw)//one main three worker
+ if(get_thread_worker_conf() == WORKER_ENABLE)
{
+ if(C >= 8)//one main three worker
+ {
encoding_return =
dlsch_encoding_2threads(eNB,
a,
@@ -632,9 +634,9 @@ int dlsch_encoding_all(PHY_VARS_eNB *eNB,
te_wakeup_stats1,
i_stats,
3);
- }
- else if(C >= 6 && get_nprocs()>=8 && codingw)//one main two worker
- {
+ }
+ else if(C >= 6)//one main two worker
+ {
encoding_return =
dlsch_encoding_2threads(eNB,
a,
@@ -650,9 +652,9 @@ int dlsch_encoding_all(PHY_VARS_eNB *eNB,
te_wakeup_stats1,
i_stats,
2);
- }
- else if(C >= 4 && get_nprocs()>=4 && codingw)//one main one worker
- {
+ }
+ else if(C >= 4)//one main one worker
+ {
encoding_return =
dlsch_encoding_2threads(eNB,
a,
@@ -668,9 +670,9 @@ int dlsch_encoding_all(PHY_VARS_eNB *eNB,
te_wakeup_stats1,
i_stats,
1);
- }
- else
- {
+ }
+ else
+ {
encoding_return =
dlsch_encoding(eNB,
a,
@@ -681,7 +683,21 @@ int dlsch_encoding_all(PHY_VARS_eNB *eNB,
rm_stats,
te_stats,
i_stats);
- }
+ }
+ }
+ else
+ {
+ encoding_return =
+ dlsch_encoding(eNB,
+ a,
+ num_pdcch_symbols,
+ dlsch,
+ frame,
+ subframe,
+ rm_stats,
+ te_stats,
+ i_stats);
+ }
return encoding_return;
}
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
index 851bcfff5a..046e456916 100644
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
@@ -45,7 +45,7 @@
#include "targets/RT/USER/rt_wrapper.h"
#include "transport_proto.h"
-extern int codingw;
+extern WORKER_CONF_t get_thread_worker_conf(void);
void free_eNB_ulsch(LTE_eNB_ULSCH_t *ulsch)
{
@@ -723,7 +723,7 @@ int ulsch_decoding_data(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr8_flag)
int ulsch_decoding_data_all(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr8_flag)
{
int ret = 0;
- /*if(codingw)
+ /*if(get_thread_worker_conf() == WORKER_ENABLE)
{
ret = ulsch_decoding_data_2thread(eNB,UE_id,harq_pid,llr8_flag);
}
diff --git a/openair1/PHY/defs_common.h b/openair1/PHY/defs_common.h
index 03d83472f8..9a735b038f 100644
--- a/openair1/PHY/defs_common.h
+++ b/openair1/PHY/defs_common.h
@@ -862,7 +862,22 @@ typedef enum {
RESYNCH=4
} UE_MODE_t;
+/// Threading Parameter
+typedef enum {
+ PARALLEL_SINGLE_THREAD =0,
+ PARALLEL_RU_L1_SPLIT =1,
+ PARALLEL_RU_L1_TRX_SPLIT =2
+}PARALLEL_CONF_t;
+typedef enum {
+ WORKER_DISABLE =0,
+ WORKER_ENABLE =1
+}WORKER_CONF_t;
+
+typedef struct THREAD_STRUCT_s {
+ PARALLEL_CONF_t parallel_conf;
+ WORKER_CONF_t worker_conf;
+} THREAD_STRUCT;
typedef enum {SF_DL, SF_UL, SF_S} lte_subframe_t;
diff --git a/openair1/PHY/defs_eNB.h b/openair1/PHY/defs_eNB.h
index c58fffe0ef..f23485cad8 100644
--- a/openair1/PHY/defs_eNB.h
+++ b/openair1/PHY/defs_eNB.h
@@ -270,7 +270,6 @@ typedef enum {
REMOTE_IF4p5 =3,
REMOTE_IF1pp =4,
MAX_RU_IF_TYPES =5
- //EMULATE_RF =6
} RU_if_south_t;
typedef struct RU_t_s{
diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c
index a03ce34bca..3583c0f25e 100644
--- a/openair1/SIMULATION/LTE_PHY/dlsim.c
+++ b/openair1/SIMULATION/LTE_PHY/dlsim.c
@@ -82,7 +82,30 @@ double t_rx_min = 1000000000; /*!< \brief initial min process time for rx */
int n_tx_dropped = 0; /*!< \brief initial max process time for tx */
int n_rx_dropped = 0; /*!< \brief initial max process time for rx */
-int codingw = 0;
+char *parallel_config = NULL;
+char *worker_config = NULL;
+static THREAD_STRUCT thread_struct;
+void set_parallel_conf(char *parallel_conf)
+{
+ if(strcmp(parallel_conf,"PARALLEL_SINGLE_THREAD")==0) thread_struct.parallel_conf = PARALLEL_SINGLE_THREAD;
+ else if(strcmp(parallel_conf,"PARALLEL_RU_L1_SPLIT")==0) thread_struct.parallel_conf = PARALLEL_RU_L1_SPLIT;
+ else if(strcmp(parallel_conf,"PARALLEL_RU_L1_TRX_SPLIT")==0) thread_struct.parallel_conf = PARALLEL_RU_L1_TRX_SPLIT;
+ printf("[CONFIG] parallel conf is set to %d\n",thread_struct.parallel_conf);
+}
+void set_worker_conf(char *worker_conf)
+{
+ if(strcmp(worker_conf,"WORKER_DISABLE")==0) thread_struct.worker_conf = WORKER_DISABLE;
+ else if(strcmp(worker_conf,"WORKER_ENABLE")==0) thread_struct.worker_conf = WORKER_ENABLE;
+ printf("[CONFIG] worker conf is set to %d\n",thread_struct.worker_conf);
+}
+PARALLEL_CONF_t get_thread_parallel_conf(void)
+{
+ return thread_struct.parallel_conf;
+}
+WORKER_CONF_t get_thread_worker_conf(void)
+{
+ return thread_struct.worker_conf;
+}
int emulate_rf = 0;
@@ -1041,6 +1064,8 @@ int main(int argc, char **argv)
break;
}
}
+ set_parallel_conf("PARALLEL_RU_L1_TRX_SPLIT");
+ set_worker_conf("WORKER_ENABLE");
if (transmission_mode>1) pa=dBm3;
printf("dlsim: tmode %d, pa %d\n",transmission_mode,pa);
diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c
index 3fcb010685..89c0d09b1d 100644
--- a/openair1/SIMULATION/LTE_PHY/ulsim.c
+++ b/openair1/SIMULATION/LTE_PHY/ulsim.c
@@ -97,7 +97,30 @@ nfapi_tx_request_pdu_t tx_pdu_list[MAX_NUM_TX_REQUEST_PDU];
nfapi_tx_request_t TX_req;
Sched_Rsp_t sched_resp;
-int codingw = 0;
+char *parallel_config = NULL;
+char *worker_config = NULL;
+static THREAD_STRUCT thread_struct;
+void set_parallel_conf(char *parallel_conf)
+{
+ if(strcmp(parallel_conf,"PARALLEL_SINGLE_THREAD")==0) thread_struct.parallel_conf = PARALLEL_SINGLE_THREAD;
+ else if(strcmp(parallel_conf,"PARALLEL_RU_L1_SPLIT")==0) thread_struct.parallel_conf = PARALLEL_RU_L1_SPLIT;
+ else if(strcmp(parallel_conf,"PARALLEL_RU_L1_TRX_SPLIT")==0) thread_struct.parallel_conf = PARALLEL_RU_L1_TRX_SPLIT;
+ printf("[CONFIG] parallel conf is set to %d\n",thread_struct.parallel_conf);
+}
+void set_worker_conf(char *worker_conf)
+{
+ if(strcmp(worker_conf,"WORKER_DISABLE")==0) thread_struct.worker_conf = WORKER_DISABLE;
+ else if(strcmp(worker_conf,"WORKER_ENABLE")==0) thread_struct.worker_conf = WORKER_ENABLE;
+ printf("[CONFIG] worker conf is set to %d\n",thread_struct.worker_conf);
+}
+PARALLEL_CONF_t get_thread_parallel_conf(void)
+{
+ return thread_struct.parallel_conf;
+}
+WORKER_CONF_t get_thread_worker_conf(void)
+{
+ return thread_struct.worker_conf;
+}
void
fill_nfapi_ulsch_config_request(nfapi_ul_config_request_pdu_t *ul_config_pdu,
@@ -725,6 +748,8 @@ int main(int argc, char **argv)
break;
}
}
+ set_parallel_conf("PARALLEL_RU_L1_TRX_SPLIT");
+ set_worker_conf("WORKER_ENABLE");
RC.nb_L1_inst = 1;
RC.nb_RU = 1;
diff --git a/openair2/COMMON/gtpv1_u_messages_def.h b/openair2/COMMON/gtpv1_u_messages_def.h
index 9cc41a70ea..27723eec15 100644
--- a/openair2/COMMON/gtpv1_u_messages_def.h
+++ b/openair2/COMMON/gtpv1_u_messages_def.h
@@ -25,3 +25,4 @@ MESSAGE_DEF(GTPV1U_ENB_DELETE_TUNNEL_REQ, MESSAGE_PRIORITY_MED, gtpv1u_enb_del
MESSAGE_DEF(GTPV1U_ENB_DELETE_TUNNEL_RESP, MESSAGE_PRIORITY_MED, gtpv1u_enb_delete_tunnel_resp_t, Gtpv1uDeleteTunnelResp)
MESSAGE_DEF(GTPV1U_ENB_TUNNEL_DATA_IND, MESSAGE_PRIORITY_MED, gtpv1u_enb_tunnel_data_ind_t, Gtpv1uTunnelDataInd)
MESSAGE_DEF(GTPV1U_ENB_TUNNEL_DATA_REQ, MESSAGE_PRIORITY_MED, gtpv1u_enb_tunnel_data_req_t, Gtpv1uTunnelDataReq)
+MESSAGE_DEF(GTPV1U_ENB_S1_REQ, MESSAGE_PRIORITY_MED, Gtpv1uS1Req, gtpv1uS1Req)
diff --git a/openair2/COMMON/gtpv1_u_messages_types.h b/openair2/COMMON/gtpv1_u_messages_types.h
index 4d09062beb..0118a78f6d 100644
--- a/openair2/COMMON/gtpv1_u_messages_types.h
+++ b/openair2/COMMON/gtpv1_u_messages_types.h
@@ -33,6 +33,7 @@
#define GTPV1U_ENB_DELETE_TUNNEL_RESP(mSGpTR) (mSGpTR)->ittiMsg.Gtpv1uDeleteTunnelResp
#define GTPV1U_ENB_TUNNEL_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.Gtpv1uTunnelDataInd
#define GTPV1U_ENB_TUNNEL_DATA_REQ(mSGpTR) (mSGpTR)->ittiMsg.Gtpv1uTunnelDataReq
+#define GTPV1U_ENB_S1_REQ(mSGpTR) (mSGpTR)->ittiMsg.gtpv1uS1Req
#define GTPV1U_ALL_TUNNELS_TEID (teid_t)0xFFFFFFFF
@@ -98,4 +99,8 @@ typedef struct gtpv1u_enb_tunnel_data_req_s {
rb_id_t rab_id;
} gtpv1u_enb_tunnel_data_req_t;
+typedef struct {
+ in_addr_t enb_ip_address_for_S1u_S12_S4_up;
+ tcp_udp_port_t enb_port_for_S1u_S12_S4_up;
+} Gtpv1uS1Req;
#endif /* GTPV1_U_MESSAGES_TYPES_H_ */
diff --git a/openair2/COMMON/x2ap_messages_types.h b/openair2/COMMON/x2ap_messages_types.h
index 6c4031b981..c74a826ff8 100644
--- a/openair2/COMMON/x2ap_messages_types.h
+++ b/openair2/COMMON/x2ap_messages_types.h
@@ -63,17 +63,21 @@ typedef struct x2ap_register_enb_req_s {
uint8_t mnc_digit_length;
/*
- * EARFCN
+ * CC Params
*/
- uint16_t fdd_uL_EARFCN;
- uint16_t fdd_dL_EARFCN;
- uint16_t tdd_EARFCN;
-
-
- uint16_t fdd_uL_Transmission_Bandwidth;
- uint16_t fdd_dL_Transmission_Bandwidth;
- uint16_t tdd_Transmission_Bandwidth;
+ int16_t eutra_band[MAX_NUM_CCs];
+ uint32_t downlink_frequency[MAX_NUM_CCs];
+ int32_t uplink_frequency_offset[MAX_NUM_CCs];
+ uint32_t Nid_cell[MAX_NUM_CCs];
+ int16_t N_RB_DL[MAX_NUM_CCs];
+ lte_frame_type_t frame_type[MAX_NUM_CCs];
+ uint32_t fdd_earfcn_DL[MAX_NUM_CCs];
+ uint32_t fdd_earfcn_UL[MAX_NUM_CCs];
+ int num_cc;
+ /* To be considered for TDD */
+ //uint16_t tdd_EARFCN;
+ //uint16_t tdd_Transmission_Bandwidth;
/* The local eNB IP address to bind */
net_ip_address_t enb_x2_ip_address;
diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c
index 6d9b2edf82..2506a0a9dc 100644
--- a/openair2/ENB_APP/enb_config.c
+++ b/openair2/ENB_APP/enb_config.c
@@ -36,13 +36,13 @@
#include "UTIL/OTG/otg.h"
#include "UTIL/OTG/otg_externs.h"
#if defined(ENABLE_ITTI)
-# include "intertask_interface.h"
-# if defined(ENABLE_USE_MME)
-# include "s1ap_eNB.h"
-# include "sctp_eNB_task.h"
-# else
-# define EPC_MODE_ENABLED 0
-# endif
+ #include "intertask_interface.h"
+ #if defined(ENABLE_USE_MME)
+ #include "s1ap_eNB.h"
+ #include "sctp_eNB_task.h"
+ #else
+ #define EPC_MODE_ENABLED 0
+ #endif
#endif
#include "sctp_default_values.h"
#include "SystemInformationBlockType2.h"
@@ -61,23 +61,2133 @@
#include "enb_paramdef.h"
extern uint16_t sf_ahead;
+extern void set_parallel_conf(char* parallel_conf);
+extern void set_worker_conf(char* worker_conf);
+extern PARALLEL_CONF_t get_thread_parallel_conf(void);
+extern WORKER_CONF_t get_thread_worker_conf(void);
+extern uint32_t to_earfcn_DL(int eutra_bandP, uint32_t dl_CarrierFreq, uint32_t bw);
+extern uint32_t to_earfcn_UL(int eutra_bandP, uint32_t ul_CarrierFreq, uint32_t bw);
-void RCconfig_flexran()
-{
+void RCconfig_flexran() {
uint16_t i;
uint16_t num_enbs;
char aprefix[MAX_OPTNAME_SIZE*2 + 8];
/* this will possibly truncate the cell id (RRC assumes int32_t).
- * Both Nid_cell and enb_id are signed in RRC case, but we use unsigned for
- * the bitshifting to work properly */
+ Both Nid_cell and enb_id are signed in RRC case, but we use unsigned for
+ the bitshifting to work properly */
int32_t Nid_cell = 0;
uint16_t Nid_cell_tr = 0;
uint32_t enb_id = 0;
-
/*
- * the only reason for all these variables is, that they are "hard-encoded"
- * into the CCPARAMS_DESC macro and we need it for the Nid_cell variable ...
- */
+ the only reason for all these variables is, that they are "hard-encoded"
+ into the CCPARAMS_DESC macro and we need it for the Nid_cell variable ...
+ */
+ char *frame_type, *prefix_type, *pbch_repetition, *prach_high_speed,
+ *pusch_hoppingMode, *pusch_enable64QAM, *pusch_groupHoppingEnabled,
+ *pusch_sequenceHoppingEnabled, *phich_duration, *phich_resource,
+ *srs_enable, *srs_ackNackST, *srs_MaxUpPts, *pusch_alpha,
+ *pucch_deltaF_Format1, *pucch_deltaF_Format1b, *pucch_deltaF_Format2,
+ *pucch_deltaF_Format2a, *pucch_deltaF_Format2b,
+ *rach_preamblesGroupAConfig, *rach_messagePowerOffsetGroupB, *pcch_nB;
+ long long int downlink_frequency;
+ int32_t tdd_config, tdd_config_s, eutra_band, uplink_frequency_offset,
+ Nid_cell_mbsfn, N_RB_DL, nb_antenna_ports, prach_root, prach_config_index,
+ prach_zero_correlation, prach_freq_offset, pucch_delta_shift,
+ pucch_nRB_CQI, pucch_nCS_AN, pucch_n1_AN, pdsch_referenceSignalPower,
+ pdsch_p_b, pusch_n_SB, pusch_hoppingOffset, pusch_groupAssignment,
+ pusch_nDMRS1, srs_BandwidthConfig, srs_SubframeConfig, pusch_p0_Nominal,
+ pucch_p0_Nominal, msg3_delta_Preamble, rach_numberOfRA_Preambles,
+ rach_sizeOfRA_PreamblesGroupA, rach_messageSizeGroupA,
+ rach_powerRampingStep, rach_preambleInitialReceivedTargetPower,
+ rach_preambleTransMax, rach_raResponseWindowSize,
+ rach_macContentionResolutionTimer, rach_maxHARQ_Msg3Tx,
+ pcch_defaultPagingCycle, bcch_modificationPeriodCoeff,
+ ue_TimersAndConstants_t300, ue_TimersAndConstants_t301,
+ ue_TimersAndConstants_t310, ue_TimersAndConstants_t311,
+ ue_TimersAndConstants_n310, ue_TimersAndConstants_n311,
+ ue_TransmissionMode, ue_multiple_max;
+ const char *rxPool_sc_CP_Len;
+ const char *rxPool_sc_Period;
+ const char *rxPool_data_CP_Len;
+ libconfig_int rxPool_ResourceConfig_prb_Num;
+ libconfig_int rxPool_ResourceConfig_prb_Start;
+ libconfig_int rxPool_ResourceConfig_prb_End;
+ const char *rxPool_ResourceConfig_offsetIndicator_present;
+ libconfig_int rxPool_ResourceConfig_offsetIndicator_choice;
+ const char *rxPool_ResourceConfig_subframeBitmap_present;
+ char *rxPool_ResourceConfig_subframeBitmap_choice_bs_buf;
+ libconfig_int rxPool_ResourceConfig_subframeBitmap_choice_bs_size;
+ libconfig_int rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused;
+ //SIB19
+ //for discRxPool
+ const char *discRxPool_cp_Len;
+ const char *discRxPool_discPeriod;
+ libconfig_int discRxPool_numRetx;
+ libconfig_int discRxPool_numRepetition;
+ libconfig_int discRxPool_ResourceConfig_prb_Num;
+ libconfig_int discRxPool_ResourceConfig_prb_Start;
+ libconfig_int discRxPool_ResourceConfig_prb_End;
+ const char *discRxPool_ResourceConfig_offsetIndicator_present;
+ libconfig_int discRxPool_ResourceConfig_offsetIndicator_choice;
+ const char *discRxPool_ResourceConfig_subframeBitmap_present;
+ char *discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf;
+ libconfig_int discRxPool_ResourceConfig_subframeBitmap_choice_bs_size;
+ libconfig_int discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused;
+ //for discRxPoolPS
+ const char *discRxPoolPS_cp_Len;
+ const char *discRxPoolPS_discPeriod;
+ libconfig_int discRxPoolPS_numRetx;
+ libconfig_int discRxPoolPS_numRepetition;
+ libconfig_int discRxPoolPS_ResourceConfig_prb_Num;
+ libconfig_int discRxPoolPS_ResourceConfig_prb_Start;
+ libconfig_int discRxPoolPS_ResourceConfig_prb_End;
+ const char *discRxPoolPS_ResourceConfig_offsetIndicator_present;
+ libconfig_int discRxPoolPS_ResourceConfig_offsetIndicator_choice;
+ const char *discRxPoolPS_ResourceConfig_subframeBitmap_present;
+ char *discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_buf;
+ libconfig_int discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_size;
+ libconfig_int discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_bits_unused;
+ /* get number of eNBs */
+ paramdef_t ENBSParams[] = ENBSPARAMS_DESC;
+ config_get(ENBSParams, sizeof(ENBSParams)/sizeof(paramdef_t), NULL);
+ num_enbs = ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt;
+ /* for eNB ID */
+ paramdef_t ENBParams[] = ENBPARAMS_DESC;
+ paramlist_def_t ENBParamList = {ENB_CONFIG_STRING_ENB_LIST, NULL, 0};
+ /* for Nid_cell */
+ checkedparam_t config_check_CCparams[] = CCPARAMS_CHECK;
+ paramdef_t CCsParams[] = CCPARAMS_DESC;
+ paramlist_def_t CCsParamList = {ENB_CONFIG_STRING_COMPONENT_CARRIERS, NULL, 0};
+
+ /* map parameter checking array instances to parameter definition array instances */
+ for (int I = 0; I < (sizeof(CCsParams) / sizeof(paramdef_t)); I++) {
+ CCsParams[I].chkPptr = &(config_check_CCparams[I]);
+ }
+
+ paramdef_t flexranParams[] = FLEXRANPARAMS_DESC;
+ config_get(flexranParams, sizeof(flexranParams)/sizeof(paramdef_t), CONFIG_STRING_NETWORK_CONTROLLER_CONFIG);
+
+ if (!RC.flexran) {
+ RC.flexran = calloc(num_enbs, sizeof(flexran_agent_info_t *));
+ AssertFatal(RC.flexran,
+ "can't ALLOCATE %zu Bytes for %d flexran agent info with size %zu\n",
+ num_enbs * sizeof(flexran_agent_info_t *),
+ num_enbs, sizeof(flexran_agent_info_t *));
+ }
+
+ for (i = 0; i < num_enbs; i++) {
+ RC.flexran[i] = calloc(1, sizeof(flexran_agent_info_t));
+ AssertFatal(RC.flexran[i],
+ "can't ALLOCATE %zu Bytes for flexran agent info (iteration %d/%d)\n",
+ sizeof(flexran_agent_info_t), i + 1, num_enbs);
+ /* if config says "yes", enable Agent, in all other cases it's like "no" */
+ RC.flexran[i]->enabled = strcasecmp(*(flexranParams[FLEXRAN_ENABLED].strptr), "yes") == 0;
+
+ /* if not enabled, simply skip the rest, it is not needed anyway */
+ if (!RC.flexran[i]->enabled)
+ continue;
+
+ RC.flexran[i]->interface_name = strdup(*(flexranParams[FLEXRAN_INTERFACE_NAME_IDX].strptr));
+ //inet_ntop(AF_INET, &(enb_properties->properties[mod_id]->flexran_agent_ipv4_address), in_ip, INET_ADDRSTRLEN);
+ RC.flexran[i]->remote_ipv4_addr = strdup(*(flexranParams[FLEXRAN_IPV4_ADDRESS_IDX].strptr));
+ RC.flexran[i]->remote_port = *(flexranParams[FLEXRAN_PORT_IDX].uptr);
+ RC.flexran[i]->cache_name = strdup(*(flexranParams[FLEXRAN_CACHE_IDX].strptr));
+ RC.flexran[i]->node_ctrl_state = strcasecmp(*(flexranParams[FLEXRAN_AWAIT_RECONF_IDX].strptr), "yes") == 0 ? ENB_WAIT : ENB_NORMAL_OPERATION;
+ config_getlist(&ENBParamList, ENBParams, sizeof(ENBParams)/sizeof(paramdef_t),NULL);
+
+ /* eNB ID from configuration, as read in by RCconfig_RRC() */
+ if (!ENBParamList.paramarray[i][ENB_ENB_ID_IDX].uptr) {
+ // Calculate a default eNB ID
+ if (EPC_MODE_ENABLED)
+ enb_id = i + (s1ap_generate_eNB_id () & 0xFFFF8);
+ else
+ enb_id = i;
+ } else {
+ enb_id = *(ENBParamList.paramarray[i][ENB_ENB_ID_IDX].uptr);
+ }
+
+ /* cell ID */
+ sprintf(aprefix, "%s.[%i]", ENB_CONFIG_STRING_ENB_LIST, i);
+ config_getlist(&CCsParamList, NULL, 0, aprefix);
+
+ if (CCsParamList.numelt > 0) {
+ sprintf(aprefix, "%s.[%i].%s.[%i]", ENB_CONFIG_STRING_ENB_LIST, i, ENB_CONFIG_STRING_COMPONENT_CARRIERS, 0);
+ config_get(CCsParams, sizeof(CCsParams)/sizeof(paramdef_t), aprefix);
+ Nid_cell_tr = (uint16_t) Nid_cell;
+ }
+
+ RC.flexran[i]->mod_id = i;
+ RC.flexran[i]->agent_id = (((uint64_t)i) << 48) | (((uint64_t)enb_id) << 16) | ((uint64_t)Nid_cell_tr);
+ /* assume for the moment the monolithic case, i.e. agent can provide
+ information for all layers */
+ RC.flexran[i]->capability_mask = FLEXRAN_CAP_LOPHY | FLEXRAN_CAP_HIPHY
+ | FLEXRAN_CAP_LOMAC | FLEXRAN_CAP_HIMAC
+ | FLEXRAN_CAP_RLC | FLEXRAN_CAP_PDCP
+ | FLEXRAN_CAP_SDAP | FLEXRAN_CAP_RRC;
+ }
+}
+
+
+void RCconfig_L1(void) {
+ int i,j;
+ paramdef_t L1_Params[] = L1PARAMS_DESC;
+ paramlist_def_t L1_ParamList = {CONFIG_STRING_L1_LIST,NULL,0};
+
+ if (RC.eNB == NULL) {
+ RC.eNB = (PHY_VARS_eNB ***)malloc((1+NUMBER_OF_eNB_MAX)*sizeof(PHY_VARS_eNB **));
+ LOG_I(PHY,"RC.eNB = %p\n",RC.eNB);
+ memset(RC.eNB,0,(1+NUMBER_OF_eNB_MAX)*sizeof(PHY_VARS_eNB **));
+ RC.nb_L1_CC = malloc((1+RC.nb_L1_inst)*sizeof(int));
+ }
+
+ config_getlist( &L1_ParamList,L1_Params,sizeof(L1_Params)/sizeof(paramdef_t), NULL);
+
+ if (L1_ParamList.numelt > 0) {
+ for (j = 0; j < RC.nb_L1_inst; j++) {
+ RC.nb_L1_CC[j] = *(L1_ParamList.paramarray[j][L1_CC_IDX].uptr);
+
+ if (RC.eNB[j] == NULL) {
+ RC.eNB[j] = (PHY_VARS_eNB **)malloc((1+MAX_NUM_CCs)*sizeof(PHY_VARS_eNB *));
+ LOG_I(PHY,"RC.eNB[%d] = %p\n",j,RC.eNB[j]);
+ memset(RC.eNB[j],0,(1+MAX_NUM_CCs)*sizeof(PHY_VARS_eNB *));
+ }
+
+ for (i=0; iMod_id = j;
+ RC.eNB[j][i]->CC_id = i;
+ }
+ }
+
+ if (strcmp(*(L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "local_mac") == 0) {
+ sf_ahead = 4; // Need 4 subframe gap between RX and TX
+ } else if (strcmp(*(L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "nfapi") == 0) {
+ RC.eNB[j][0]->eth_params_n.local_if_name = strdup(*(L1_ParamList.paramarray[j][L1_LOCAL_N_IF_NAME_IDX].strptr));
+ RC.eNB[j][0]->eth_params_n.my_addr = strdup(*(L1_ParamList.paramarray[j][L1_LOCAL_N_ADDRESS_IDX].strptr));
+ RC.eNB[j][0]->eth_params_n.remote_addr = strdup(*(L1_ParamList.paramarray[j][L1_REMOTE_N_ADDRESS_IDX].strptr));
+ RC.eNB[j][0]->eth_params_n.my_portc = *(L1_ParamList.paramarray[j][L1_LOCAL_N_PORTC_IDX].iptr);
+ RC.eNB[j][0]->eth_params_n.remote_portc = *(L1_ParamList.paramarray[j][L1_REMOTE_N_PORTC_IDX].iptr);
+ RC.eNB[j][0]->eth_params_n.my_portd = *(L1_ParamList.paramarray[j][L1_LOCAL_N_PORTD_IDX].iptr);
+ RC.eNB[j][0]->eth_params_n.remote_portd = *(L1_ParamList.paramarray[j][L1_REMOTE_N_PORTD_IDX].iptr);
+ RC.eNB[j][0]->eth_params_n.transp_preference = ETH_UDP_MODE;
+ sf_ahead = 2; // Cannot cope with 4 subframes betweem RX and TX - set it to 2
+ RC.nb_macrlc_inst = 1; // This is used by mac_top_init_eNB()
+ // This is used by init_eNB_afterRU()
+ RC.nb_CC = (int *)malloc((1+RC.nb_inst)*sizeof(int));
+ RC.nb_CC[0]=1;
+ RC.nb_inst =1; // DJP - feptx_prec uses num_eNB but phy_init_RU uses nb_inst
+ LOG_I(PHY,"%s() NFAPI PNF mode - RC.nb_inst=1 this is because phy_init_RU() uses that to index and not RC.num_eNB - why the 2 similar variables?\n", __FUNCTION__);
+ LOG_I(PHY,"%s() NFAPI PNF mode - RC.nb_CC[0]=%d for init_eNB_afterRU()\n", __FUNCTION__, RC.nb_CC[0]);
+ LOG_I(PHY,"%s() NFAPI PNF mode - RC.nb_macrlc_inst:%d because used by mac_top_init_eNB()\n", __FUNCTION__, RC.nb_macrlc_inst);
+ //mac_top_init_eNB();
+ configure_nfapi_pnf(RC.eNB[j][0]->eth_params_n.remote_addr, RC.eNB[j][0]->eth_params_n.remote_portc, RC.eNB[j][0]->eth_params_n.my_addr, RC.eNB[j][0]->eth_params_n.my_portd, RC.eNB[j][0]->eth_params_n .remote_portd);
+ } else { // other midhaul
+ }
+ }// j=0..num_inst
+
+ printf("Initializing northbound interface for L1\n");
+ l1_north_init_eNB();
+ } else {
+ LOG_I(PHY,"No " CONFIG_STRING_L1_LIST " configuration found");
+ // DJP need to create some structures for VNF
+ j = 0;
+ RC.nb_L1_CC = malloc((1+RC.nb_L1_inst)*sizeof(int)); // DJP - 1 lot then???
+ RC.nb_L1_CC[j]=1; // DJP - hmmm
+
+ if (RC.eNB[j] == NULL) {
+ RC.eNB[j] = (PHY_VARS_eNB **)malloc((1+MAX_NUM_CCs)*sizeof(PHY_VARS_eNB **));
+ LOG_I(PHY,"RC.eNB[%d] = %p\n",j,RC.eNB[j]);
+ memset(RC.eNB[j],0,(1+MAX_NUM_CCs)*sizeof(PHY_VARS_eNB ***));
+ }
+
+ for (i=0; iMod_id = j;
+ RC.eNB[j][i]->CC_id = i;
+ }
+ }
+ }
+}
+
+void RCconfig_macrlc() {
+ int j;
+ paramdef_t MacRLC_Params[] = MACRLCPARAMS_DESC;
+ paramlist_def_t MacRLC_ParamList = {CONFIG_STRING_MACRLC_LIST,NULL,0};
+ config_getlist( &MacRLC_ParamList,MacRLC_Params,sizeof(MacRLC_Params)/sizeof(paramdef_t), NULL);
+
+ if ( MacRLC_ParamList.numelt > 0) {
+ RC.nb_macrlc_inst=MacRLC_ParamList.numelt;
+ mac_top_init_eNB();
+ RC.nb_mac_CC = (int *)malloc(RC.nb_macrlc_inst*sizeof(int));
+
+ for (j=0; jpuSch10xSnr = *(MacRLC_ParamList.paramarray[j][MACRLC_PUSCH10xSNR_IDX ].iptr);
+ RC.mac[j]->puCch10xSnr = *(MacRLC_ParamList.paramarray[j][MACRLC_PUCCH10xSNR_IDX ].iptr);
+ RC.nb_mac_CC[j] = *(MacRLC_ParamList.paramarray[j][MACRLC_CC_IDX].iptr);
+ //RC.mac[j]->phy_test = *(MacRLC_ParamList.paramarray[j][MACRLC_PHY_TEST_IDX].iptr);
+ //printf("PHY_TEST = %d,%d\n", RC.mac[j]->phy_test, j);
+
+ if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr), "local_RRC") == 0) {
+ // check number of instances is same as RRC/PDCP
+ } else if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr), "cudu") == 0) {
+ RC.mac[j]->eth_params_n.local_if_name = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_IF_NAME_IDX].strptr));
+ RC.mac[j]->eth_params_n.my_addr = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_ADDRESS_IDX].strptr));
+ RC.mac[j]->eth_params_n.remote_addr = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_ADDRESS_IDX].strptr));
+ RC.mac[j]->eth_params_n.my_portc = *(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_PORTC_IDX].iptr);
+ RC.mac[j]->eth_params_n.remote_portc = *(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_PORTC_IDX].iptr);
+ RC.mac[j]->eth_params_n.my_portd = *(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_PORTD_IDX].iptr);
+ RC.mac[j]->eth_params_n.remote_portd = *(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_PORTD_IDX].iptr);;
+ RC.mac[j]->eth_params_n.transp_preference = ETH_UDP_MODE;
+ } else { // other midhaul
+ AssertFatal(1==0,"MACRLC %d: %s unknown northbound midhaul\n",j, *(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr));
+ }
+
+ if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr), "local_L1") == 0) {
+ } else if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr), "nfapi") == 0) {
+ RC.mac[j]->eth_params_s.local_if_name = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_IF_NAME_IDX].strptr));
+ RC.mac[j]->eth_params_s.my_addr = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_ADDRESS_IDX].strptr));
+ RC.mac[j]->eth_params_s.remote_addr = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_ADDRESS_IDX].strptr));
+ RC.mac[j]->eth_params_s.my_portc = *(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_PORTC_IDX].iptr);
+ RC.mac[j]->eth_params_s.remote_portc = *(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_PORTC_IDX].iptr);
+ RC.mac[j]->eth_params_s.my_portd = *(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_PORTD_IDX].iptr);
+ RC.mac[j]->eth_params_s.remote_portd = *(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_PORTD_IDX].iptr);
+ RC.mac[j]->eth_params_s.transp_preference = ETH_UDP_MODE;
+ sf_ahead = 2; // Cannot cope with 4 subframes betweem RX and TX - set it to 2
+ printf("**************** vnf_port:%d\n", RC.mac[j]->eth_params_s.my_portc);
+ configure_nfapi_vnf(RC.mac[j]->eth_params_s.my_addr, RC.mac[j]->eth_params_s.my_portc);
+ printf("**************** RETURNED FROM configure_nfapi_vnf() vnf_port:%d\n", RC.mac[j]->eth_params_s.my_portc);
+ } else { // other midhaul
+ AssertFatal(1==0,"MACRLC %d: %s unknown southbound midhaul\n",j,*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr));
+ }
+
+ if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_SCHED_MODE_IDX].strptr), "default") == 0) {
+ global_scheduler_mode=SCHED_MODE_DEFAULT;
+ printf("sched mode = default %d [%s]\n",global_scheduler_mode,*(MacRLC_ParamList.paramarray[j][MACRLC_SCHED_MODE_IDX].strptr));
+ } else if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_SCHED_MODE_IDX].strptr), "fairRR") == 0) {
+ global_scheduler_mode=SCHED_MODE_FAIR_RR;
+ printf("sched mode = fairRR %d [%s]\n",global_scheduler_mode,*(MacRLC_ParamList.paramarray[j][MACRLC_SCHED_MODE_IDX].strptr));
+ } else {
+ global_scheduler_mode=SCHED_MODE_DEFAULT;
+ printf("sched mode = default %d [%s]\n",global_scheduler_mode,*(MacRLC_ParamList.paramarray[j][MACRLC_SCHED_MODE_IDX].strptr));
+ }
+ }// j=0..num_inst
+ } else {// MacRLC_ParamList.numelt > 0
+ AssertFatal (0,
+ "No " CONFIG_STRING_MACRLC_LIST " configuration found");
+ }
+}
+
+int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
+ int num_enbs = 0;
+ int j,k = 0;
+ int32_t enb_id = 0;
+ int nb_cc = 0;
+ char *frame_type = NULL;
+ int32_t tdd_config = 0;
+ int32_t tdd_config_s = 0;
+ char *prefix_type = NULL;
+ char *pbch_repetition = NULL;
+ int32_t eutra_band = 0;
+ long long int downlink_frequency = 0;
+ int32_t uplink_frequency_offset = 0;
+ int32_t Nid_cell = 0;
+ int32_t Nid_cell_mbsfn = 0;
+ int32_t N_RB_DL = 0;
+ int32_t nb_antenna_ports = 0;
+ int32_t prach_root = 0;
+ int32_t prach_config_index = 0;
+ char *prach_high_speed = NULL;
+ int32_t prach_zero_correlation = 0;
+ int32_t prach_freq_offset = 0;
+ int32_t pucch_delta_shift = 0;
+ int32_t pucch_nRB_CQI = 0;
+ int32_t pucch_nCS_AN = 0;
+ //#if (RRC_VERSION >= MAKE_VERSION(10, 0, 0))
+ int32_t pucch_n1_AN = 0;
+ //#endif
+ int32_t pdsch_referenceSignalPower = 0;
+ int32_t pdsch_p_b = 0;
+ int32_t pusch_n_SB = 0;
+ char *pusch_hoppingMode = NULL;
+ int32_t pusch_hoppingOffset = 0;
+ char *pusch_enable64QAM = NULL;
+ char *pusch_groupHoppingEnabled = NULL;
+ int32_t pusch_groupAssignment = 0;
+ char *pusch_sequenceHoppingEnabled = NULL;
+ int32_t pusch_nDMRS1 = 0;
+ char *phich_duration = NULL;
+ char *phich_resource = NULL;
+ char *srs_enable = NULL;
+ int32_t srs_BandwidthConfig = 0;
+ int32_t srs_SubframeConfig = 0;
+ char *srs_ackNackST = NULL;
+ char *srs_MaxUpPts = NULL;
+ int32_t pusch_p0_Nominal = 0;
+ char *pusch_alpha = NULL;
+ int32_t pucch_p0_Nominal = 0;
+ int32_t msg3_delta_Preamble = 0;
+ //int32_t ul_CyclicPrefixLength = 0;
+ char *pucch_deltaF_Format1 = NULL;
+ //const char* pucch_deltaF_Format1a = NULL;
+ char *pucch_deltaF_Format1b = NULL;
+ char *pucch_deltaF_Format2 = NULL;
+ char *pucch_deltaF_Format2a = NULL;
+ char *pucch_deltaF_Format2b = NULL;
+ int32_t rach_numberOfRA_Preambles = 0;
+ char *rach_preamblesGroupAConfig = NULL;
+ int32_t rach_sizeOfRA_PreamblesGroupA = 0;
+ int32_t rach_messageSizeGroupA = 0;
+ char *rach_messagePowerOffsetGroupB = NULL;
+ int32_t rach_powerRampingStep = 0;
+ int32_t rach_preambleInitialReceivedTargetPower = 0;
+ int32_t rach_preambleTransMax = 0;
+ int32_t rach_raResponseWindowSize = 10;
+ int32_t rach_macContentionResolutionTimer = 0;
+ int32_t rach_maxHARQ_Msg3Tx = 0;
+ int32_t pcch_defaultPagingCycle = 0;
+ char *pcch_nB = NULL;
+ int32_t bcch_modificationPeriodCoeff = 0;
+ int32_t ue_TimersAndConstants_t300 = 0;
+ int32_t ue_TimersAndConstants_t301 = 0;
+ int32_t ue_TimersAndConstants_t310 = 0;
+ int32_t ue_TimersAndConstants_t311 = 0;
+ int32_t ue_TimersAndConstants_n310 = 0;
+ int32_t ue_TimersAndConstants_n311 = 0;
+ int32_t ue_TransmissionMode = 0;
+ int32_t ue_multiple_max = 0;
+ //TTN - for D2D
+ //SIB18
+ const char *rxPool_sc_CP_Len = NULL;
+ const char *rxPool_sc_Period = NULL;
+ const char *rxPool_data_CP_Len = NULL;
+ libconfig_int rxPool_ResourceConfig_prb_Num = 0;
+ libconfig_int rxPool_ResourceConfig_prb_Start = 0;
+ libconfig_int rxPool_ResourceConfig_prb_End = 0;
+ const char *rxPool_ResourceConfig_offsetIndicator_present = NULL;
+ libconfig_int rxPool_ResourceConfig_offsetIndicator_choice = 0;
+ const char *rxPool_ResourceConfig_subframeBitmap_present = NULL;
+ char *rxPool_ResourceConfig_subframeBitmap_choice_bs_buf = NULL;
+ libconfig_int rxPool_ResourceConfig_subframeBitmap_choice_bs_size = 0;
+ libconfig_int rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
+ //SIB19
+ //For discRxPool
+ const char *discRxPool_cp_Len = NULL;
+ const char *discRxPool_discPeriod = NULL;
+ libconfig_int discRxPool_numRetx = 0;
+ libconfig_int discRxPool_numRepetition = 0;
+ libconfig_int discRxPool_ResourceConfig_prb_Num = 0;
+ libconfig_int discRxPool_ResourceConfig_prb_Start = 0;
+ libconfig_int discRxPool_ResourceConfig_prb_End = 0;
+ const char *discRxPool_ResourceConfig_offsetIndicator_present = NULL;
+ libconfig_int discRxPool_ResourceConfig_offsetIndicator_choice = 0;
+ const char *discRxPool_ResourceConfig_subframeBitmap_present = NULL;
+ char *discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf = NULL;
+ libconfig_int discRxPool_ResourceConfig_subframeBitmap_choice_bs_size = 0;
+ libconfig_int discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
+ //For discRxPoolPS
+ const char *discRxPoolPS_cp_Len = NULL;
+ const char *discRxPoolPS_discPeriod = NULL;
+ libconfig_int discRxPoolPS_numRetx = 0;
+ libconfig_int discRxPoolPS_numRepetition = 0;
+ libconfig_int discRxPoolPS_ResourceConfig_prb_Num = 0;
+ libconfig_int discRxPoolPS_ResourceConfig_prb_Start = 0;
+ libconfig_int discRxPoolPS_ResourceConfig_prb_End = 0;
+ const char *discRxPoolPS_ResourceConfig_offsetIndicator_present = NULL;
+ libconfig_int discRxPoolPS_ResourceConfig_offsetIndicator_choice = 0;
+ const char *discRxPoolPS_ResourceConfig_subframeBitmap_present = NULL;
+ char *discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_buf = NULL;
+ libconfig_int discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_size = 0;
+ libconfig_int discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
+ int32_t srb1_timer_poll_retransmit = 0;
+ int32_t srb1_timer_reordering = 0;
+ int32_t srb1_timer_status_prohibit = 0;
+ int32_t srb1_poll_pdu = 0;
+ int32_t srb1_poll_byte = 0;
+ int32_t srb1_max_retx_threshold = 0;
+ int32_t my_int;
+ // for no gcc warnings
+ (void)my_int;
+ paramdef_t ENBSParams[] = ENBSPARAMS_DESC;
+ paramdef_t ENBParams[] = ENBPARAMS_DESC;
+ paramlist_def_t ENBParamList = {ENB_CONFIG_STRING_ENB_LIST,NULL,0};
+ checkedparam_t config_check_CCparams[] = CCPARAMS_CHECK;
+ paramdef_t CCsParams[] = CCPARAMS_DESC;
+ paramlist_def_t CCsParamList = {ENB_CONFIG_STRING_COMPONENT_CARRIERS,NULL,0};
+ paramdef_t SRB1Params[] = SRB1PARAMS_DESC;
+
+ /* map parameter checking array instances to parameter definition array instances */
+ for (int I=0; I< ( sizeof(CCsParams)/ sizeof(paramdef_t) ) ; I++) {
+ CCsParams[I].chkPptr = &(config_check_CCparams[I]);
+ }
+
+ /* get global parameters, defined outside any section in the config file */
+ config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL);
+ num_enbs = ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt;
+ AssertFatal (i0) {
+ // Output a list of all eNBs.
+ config_getlist( &ENBParamList,ENBParams,sizeof(ENBParams)/sizeof(paramdef_t),NULL);
+
+ if (ENBParamList.paramarray[i][ENB_ENB_ID_IDX].uptr == NULL) {
+ // Calculate a default eNB ID
+ if (EPC_MODE_ENABLED) {
+ uint32_t hash;
+ hash = s1ap_generate_eNB_id ();
+ enb_id = i + (hash & 0xFFFF8);
+ } else {
+ enb_id = i;
+ }
+ } else {
+ enb_id = *(ENBParamList.paramarray[i][ENB_ENB_ID_IDX].uptr);
+ }
+
+ printf("RRC %d: Southbound Transport %s\n",i,*(ENBParamList.paramarray[i][ENB_TRANSPORT_S_PREFERENCE_IDX].strptr));
+
+ if (strcmp(*(ENBParamList.paramarray[i][ENB_TRANSPORT_S_PREFERENCE_IDX].strptr), "local_mac") == 0) {
+ } else if (strcmp(*(ENBParamList.paramarray[i][ENB_TRANSPORT_S_PREFERENCE_IDX].strptr), "cudu") == 0) {
+ rrc->eth_params_s.local_if_name = strdup(*(ENBParamList.paramarray[i][ENB_LOCAL_S_IF_NAME_IDX].strptr));
+ rrc->eth_params_s.my_addr = strdup(*(ENBParamList.paramarray[i][ENB_LOCAL_S_ADDRESS_IDX].strptr));
+ rrc->eth_params_s.remote_addr = strdup(*(ENBParamList.paramarray[i][ENB_REMOTE_S_ADDRESS_IDX].strptr));
+ rrc->eth_params_s.my_portc = *(ENBParamList.paramarray[i][ENB_LOCAL_S_PORTC_IDX].uptr);
+ rrc->eth_params_s.remote_portc = *(ENBParamList.paramarray[i][ENB_REMOTE_S_PORTC_IDX].uptr);
+ rrc->eth_params_s.my_portd = *(ENBParamList.paramarray[i][ENB_LOCAL_S_PORTD_IDX].uptr);
+ rrc->eth_params_s.remote_portd = *(ENBParamList.paramarray[i][ENB_REMOTE_S_PORTD_IDX].uptr);
+ rrc->eth_params_s.transp_preference = ETH_UDP_MODE;
+ } else { // other midhaul
+ }
+
+ // search if in active list
+
+ for (k=0; k cell_type = CELL_MACRO_ENB;
+ } else if (strcmp(cell_type, "CELL_HOME_ENB") == 0) {
+ enb_properties_loc.properties[enb_properties_loc_index]->cell_type = CELL_HOME_ENB;
+ } else {
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for cell_type choice: CELL_MACRO_ENB or CELL_HOME_ENB !\n",
+ lib_config_file_name_pP, i, cell_type);
+ }
+
+ enb_properties_loc.properties[enb_properties_loc_index]->eNB_name = strdup(enb_name);
+ */
+ RRC_CONFIGURATION_REQ (msg_p).tac = (uint16_t)atoi( *(ENBParamList.paramarray[i][ENB_TRACKING_AREA_CODE_IDX].strptr) );
+ RRC_CONFIGURATION_REQ (msg_p).mcc = (uint16_t)atoi( *(ENBParamList.paramarray[i][ENB_MOBILE_COUNTRY_CODE_IDX].strptr) );
+ RRC_CONFIGURATION_REQ (msg_p).mnc = (uint16_t)atoi( *(ENBParamList.paramarray[i][ENB_MOBILE_NETWORK_CODE_IDX].strptr) );
+ RRC_CONFIGURATION_REQ (msg_p).mnc_digit_length = strlen(*(ENBParamList.paramarray[i][ENB_MOBILE_NETWORK_CODE_IDX].strptr));
+ AssertFatal((RRC_CONFIGURATION_REQ (msg_p).mnc_digit_length == 2) ||
+ (RRC_CONFIGURATION_REQ (msg_p).mnc_digit_length == 3),
+ "BAD MNC DIGIT LENGTH %d",
+ RRC_CONFIGURATION_REQ (msg_p).mnc_digit_length);
+ // Parse optional physical parameters
+ sprintf(enbpath,"%s.[%i]",ENB_CONFIG_STRING_ENB_LIST,k),
+ config_getlist( &CCsParamList,NULL,0,enbpath);
+ LOG_I(RRC,"num component carriers %d \n",CCsParamList.numelt);
+
+ if ( CCsParamList.numelt> 0) {
+ char ccspath[MAX_OPTNAME_SIZE*2 + 16];
+
+ for (j = 0; j < CCsParamList.numelt ; j++) {
+ sprintf(ccspath,"%s.%s.[%i]",enbpath,ENB_CONFIG_STRING_COMPONENT_CARRIERS,j);
+ LOG_I(RRC, "enb_config::RCconfig_RRC() parameter number: %d, total number of parameters: %zd, ccspath: %s \n \n", j, sizeof(CCsParams)/sizeof(paramdef_t), ccspath);
+ config_get( CCsParams,sizeof(CCsParams)/sizeof(paramdef_t),ccspath);
+ //printf("Component carrier %d\n",component_carrier);
+ nb_cc++;
+ RRC_CONFIGURATION_REQ (msg_p).tdd_config[j] = tdd_config;
+ AssertFatal (tdd_config <= TDD_Config__subframeAssignment_sa6,
+ "Failed to parse eNB configuration file %s, enb %d illegal tdd_config %d (should be 0-%d)!",
+ RC.config_file_name, i, tdd_config, TDD_Config__subframeAssignment_sa6);
+ RRC_CONFIGURATION_REQ (msg_p).tdd_config_s[j] = tdd_config_s;
+ AssertFatal (tdd_config_s <= TDD_Config__specialSubframePatterns_ssp8,
+ "Failed to parse eNB configuration file %s, enb %d illegal tdd_config_s %d (should be 0-%d)!",
+ RC.config_file_name, i, tdd_config_s, TDD_Config__specialSubframePatterns_ssp8);
+
+ if (!prefix_type)
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d define %s: NORMAL,EXTENDED!\n",
+ RC.config_file_name, i, ENB_CONFIG_STRING_PREFIX_TYPE);
+ else if (strcmp(prefix_type, "NORMAL") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).prefix_type[j] = NORMAL;
+ } else if (strcmp(prefix_type, "EXTENDED") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).prefix_type[j] = EXTENDED;
+ } else {
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prefix_type choice: NORMAL or EXTENDED !\n",
+ RC.config_file_name, i, prefix_type);
+ }
+
+#if (RRC_VERSION >= MAKE_VERSION(14, 0, 0))
+
+ if (!pbch_repetition)
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d define %s: TRUE,FALSE!\n",
+ RC.config_file_name, i, ENB_CONFIG_STRING_PBCH_REPETITION);
+ else if (strcmp(pbch_repetition, "TRUE") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).pbch_repetition[j] = 1;
+ } else if (strcmp(pbch_repetition, "FALSE") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).pbch_repetition[j] = 0;
+ } else {
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pbch_repetition choice: TRUE or FALSE !\n",
+ RC.config_file_name, i, pbch_repetition);
+ }
+
+#endif
+ RRC_CONFIGURATION_REQ (msg_p).eutra_band[j] = eutra_band;
+ RRC_CONFIGURATION_REQ (msg_p).downlink_frequency[j] = (uint32_t) downlink_frequency;
+ RRC_CONFIGURATION_REQ (msg_p).uplink_frequency_offset[j] = (unsigned int) uplink_frequency_offset;
+ RRC_CONFIGURATION_REQ (msg_p).Nid_cell[j]= Nid_cell;
+
+ if (Nid_cell>503) {
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for Nid_cell choice: 0...503 !\n",
+ RC.config_file_name, i, Nid_cell);
+ }
+
+ RRC_CONFIGURATION_REQ (msg_p).N_RB_DL[j]= N_RB_DL;
+
+ if ((N_RB_DL!=6) && (N_RB_DL!=15) && (N_RB_DL!=25) && (N_RB_DL!=50) && (N_RB_DL!=75) && (N_RB_DL!=100)) {
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for N_RB_DL choice: 6,15,25,50,75,100 !\n",
+ RC.config_file_name, i, N_RB_DL);
+ }
+
+ if (strcmp(frame_type, "FDD") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).frame_type[j] = FDD;
+ } else if (strcmp(frame_type, "TDD") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).frame_type[j] = TDD;
+ } else {
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for frame_type choice: FDD or TDD !\n",
+ RC.config_file_name, i, frame_type);
+ }
+
+ RRC_CONFIGURATION_REQ (msg_p).tdd_config[j] = tdd_config;
+ AssertFatal (tdd_config <= TDD_Config__subframeAssignment_sa6,
+ "Failed to parse eNB configuration file %s, enb %d illegal tdd_config %d (should be 0-%d)!",
+ RC.config_file_name, i, tdd_config, TDD_Config__subframeAssignment_sa6);
+ RRC_CONFIGURATION_REQ (msg_p).tdd_config_s[j] = tdd_config_s;
+ AssertFatal (tdd_config_s <= TDD_Config__specialSubframePatterns_ssp8,
+ "Failed to parse eNB configuration file %s, enb %d illegal tdd_config_s %d (should be 0-%d)!",
+ RC.config_file_name, i, tdd_config_s, TDD_Config__specialSubframePatterns_ssp8);
+
+ if (!prefix_type)
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d define %s: NORMAL,EXTENDED!\n",
+ RC.config_file_name, i, ENB_CONFIG_STRING_PREFIX_TYPE);
+ else if (strcmp(prefix_type, "NORMAL") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).prefix_type[j] = NORMAL;
+ } else if (strcmp(prefix_type, "EXTENDED") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).prefix_type[j] = EXTENDED;
+ } else {
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prefix_type choice: NORMAL or EXTENDED !\n",
+ RC.config_file_name, i, prefix_type);
+ }
+
+ RRC_CONFIGURATION_REQ (msg_p).eutra_band[j] = eutra_band;
+ // printf( "\teutra band:\t%d\n",RRC_CONFIGURATION_REQ (msg_p).eutra_band);
+ RRC_CONFIGURATION_REQ (msg_p).downlink_frequency[j] = (uint32_t) downlink_frequency;
+ //printf( "\tdownlink freq:\t%u\n",RRC_CONFIGURATION_REQ (msg_p).downlink_frequency);
+ RRC_CONFIGURATION_REQ (msg_p).uplink_frequency_offset[j] = (unsigned int) uplink_frequency_offset;
+
+ if (config_check_band_frequencies(j,
+ RRC_CONFIGURATION_REQ (msg_p).eutra_band[j],
+ RRC_CONFIGURATION_REQ (msg_p).downlink_frequency[j],
+ RRC_CONFIGURATION_REQ (msg_p).uplink_frequency_offset[j],
+ RRC_CONFIGURATION_REQ (msg_p).frame_type[j])) {
+ AssertFatal(0, "error calling enb_check_band_frequencies\n");
+ }
+
+ if ((nb_antenna_ports <1) || (nb_antenna_ports > 2))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for nb_antenna_ports choice: 1..2 !\n",
+ RC.config_file_name, i, nb_antenna_ports);
+
+ RRC_CONFIGURATION_REQ (msg_p).nb_antenna_ports[j] = nb_antenna_ports;
+ RRC_CONFIGURATION_REQ (msg_p).prach_root[j] = prach_root;
+
+ if ((prach_root <0) || (prach_root > 1023))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_root choice: 0..1023 !\n",
+ RC.config_file_name, i, prach_root);
+
+ RRC_CONFIGURATION_REQ (msg_p).prach_config_index[j] = prach_config_index;
+
+ if ((prach_config_index <0) || (prach_config_index > 63))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_config_index choice: 0..1023 !\n",
+ RC.config_file_name, i, prach_config_index);
+
+ if (!prach_high_speed)
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n",
+ RC.config_file_name, i, ENB_CONFIG_STRING_PRACH_HIGH_SPEED);
+ else if (strcmp(prach_high_speed, "ENABLE") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).prach_high_speed[j] = TRUE;
+ } else if (strcmp(prach_high_speed, "DISABLE") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).prach_high_speed[j] = FALSE;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prach_config choice: ENABLE,DISABLE !\n",
+ RC.config_file_name, i, prach_high_speed);
+
+ RRC_CONFIGURATION_REQ (msg_p).prach_zero_correlation[j] =prach_zero_correlation;
+
+ if ((prach_zero_correlation <0) || (prach_zero_correlation > 15))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_zero_correlation choice: 0..15!\n",
+ RC.config_file_name, i, prach_zero_correlation);
+
+ RRC_CONFIGURATION_REQ (msg_p).prach_freq_offset[j] = prach_freq_offset;
+
+ if ((prach_freq_offset <0) || (prach_freq_offset > 94))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_freq_offset choice: 0..94!\n",
+ RC.config_file_name, i, prach_freq_offset);
+
+ RRC_CONFIGURATION_REQ (msg_p).pucch_delta_shift[j] = pucch_delta_shift-1;
+
+ if ((pucch_delta_shift <1) || (pucch_delta_shift > 3))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_delta_shift choice: 1..3!\n",
+ RC.config_file_name, i, pucch_delta_shift);
+
+ RRC_CONFIGURATION_REQ (msg_p).pucch_nRB_CQI[j] = pucch_nRB_CQI;
+
+ if ((pucch_nRB_CQI <0) || (pucch_nRB_CQI > 98))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_nRB_CQI choice: 0..98!\n",
+ RC.config_file_name, i, pucch_nRB_CQI);
+
+ RRC_CONFIGURATION_REQ (msg_p).pucch_nCS_AN[j] = pucch_nCS_AN;
+
+ if ((pucch_nCS_AN <0) || (pucch_nCS_AN > 7))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_nCS_AN choice: 0..7!\n",
+ RC.config_file_name, i, pucch_nCS_AN);
+
+ //#if (RRC_VERSION < MAKE_VERSION(10, 0, 0))
+ RRC_CONFIGURATION_REQ (msg_p).pucch_n1_AN[j] = pucch_n1_AN;
+
+ if ((pucch_n1_AN <0) || (pucch_n1_AN > 2047))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_n1_AN choice: 0..2047!\n",
+ RC.config_file_name, i, pucch_n1_AN);
+
+ //#endif
+ RRC_CONFIGURATION_REQ (msg_p).pdsch_referenceSignalPower[j] = pdsch_referenceSignalPower;
+
+ if ((pdsch_referenceSignalPower <-60) || (pdsch_referenceSignalPower > 50))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pdsch_referenceSignalPower choice:-60..50!\n",
+ RC.config_file_name, i, pdsch_referenceSignalPower);
+
+ RRC_CONFIGURATION_REQ (msg_p).pdsch_p_b[j] = pdsch_p_b;
+
+ if ((pdsch_p_b <0) || (pdsch_p_b > 3))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pdsch_p_b choice: 0..3!\n",
+ RC.config_file_name, i, pdsch_p_b);
+
+ RRC_CONFIGURATION_REQ (msg_p).pusch_n_SB[j] = pusch_n_SB;
+
+ if ((pusch_n_SB <1) || (pusch_n_SB > 4))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_n_SB choice: 1..4!\n",
+ RC.config_file_name, i, pusch_n_SB);
+
+ if (!pusch_hoppingMode)
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d define %s: interSubframe,intraAndInterSubframe!\n",
+ RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_HOPPINGMODE);
+ else if (strcmp(pusch_hoppingMode,"interSubFrame")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pusch_hoppingMode[j] = PUSCH_ConfigCommon__pusch_ConfigBasic__hoppingMode_interSubFrame;
+ } else if (strcmp(pusch_hoppingMode,"intraAndInterSubFrame")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pusch_hoppingMode[j] = PUSCH_ConfigCommon__pusch_ConfigBasic__hoppingMode_intraAndInterSubFrame;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_hoppingMode choice: interSubframe,intraAndInterSubframe!\n",
+ RC.config_file_name, i, pusch_hoppingMode);
+
+ RRC_CONFIGURATION_REQ (msg_p).pusch_hoppingOffset[j] = pusch_hoppingOffset;
+
+ if ((pusch_hoppingOffset<0) || (pusch_hoppingOffset>98))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_hoppingOffset choice: 0..98!\n",
+ RC.config_file_name, i, pusch_hoppingMode);
+
+ if (!pusch_enable64QAM)
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n",
+ RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_ENABLE64QAM);
+ else if (strcmp(pusch_enable64QAM, "ENABLE") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).pusch_enable64QAM[j] = TRUE;
+ } else if (strcmp(pusch_enable64QAM, "DISABLE") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).pusch_enable64QAM[j] = FALSE;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_enable64QAM choice: ENABLE,DISABLE!\n",
+ RC.config_file_name, i, pusch_enable64QAM);
+
+ if (!pusch_groupHoppingEnabled)
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n",
+ RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_GROUP_HOPPING_EN);
+ else if (strcmp(pusch_groupHoppingEnabled, "ENABLE") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).pusch_groupHoppingEnabled[j] = TRUE;
+ } else if (strcmp(pusch_groupHoppingEnabled, "DISABLE") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).pusch_groupHoppingEnabled[j] = FALSE;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_groupHoppingEnabled choice: ENABLE,DISABLE!\n",
+ RC.config_file_name, i, pusch_groupHoppingEnabled);
+
+ RRC_CONFIGURATION_REQ (msg_p).pusch_groupAssignment[j] = pusch_groupAssignment;
+
+ if ((pusch_groupAssignment<0)||(pusch_groupAssignment>29))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_groupAssignment choice: 0..29!\n",
+ RC.config_file_name, i, pusch_groupAssignment);
+
+ if (!pusch_sequenceHoppingEnabled)
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n",
+ RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_SEQUENCE_HOPPING_EN);
+ else if (strcmp(pusch_sequenceHoppingEnabled, "ENABLE") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).pusch_sequenceHoppingEnabled[j] = TRUE;
+ } else if (strcmp(pusch_sequenceHoppingEnabled, "DISABLE") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).pusch_sequenceHoppingEnabled[j] = FALSE;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_sequenceHoppingEnabled choice: ENABLE,DISABLE!\n",
+ RC.config_file_name, i, pusch_sequenceHoppingEnabled);
+
+ RRC_CONFIGURATION_REQ (msg_p).pusch_nDMRS1[j] = pusch_nDMRS1; //cyclic_shift in RRC!
+
+ if ((pusch_nDMRS1 <0) || (pusch_nDMRS1>7))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_nDMRS1 choice: 0..7!\n",
+ RC.config_file_name, i, pusch_nDMRS1);
+
+ if (strcmp(phich_duration,"NORMAL")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).phich_duration[j] = PHICH_Config__phich_Duration_normal;
+ } else if (strcmp(phich_duration,"EXTENDED")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).phich_duration[j] = PHICH_Config__phich_Duration_extended;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for phich_duration choice: NORMAL,EXTENDED!\n",
+ RC.config_file_name, i, phich_duration);
+
+ if (strcmp(phich_resource,"ONESIXTH")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_oneSixth ;
+ } else if (strcmp(phich_resource,"HALF")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_half;
+ } else if (strcmp(phich_resource,"ONE")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_one;
+ } else if (strcmp(phich_resource,"TWO")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_two;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for phich_resource choice: ONESIXTH,HALF,ONE,TWO!\n",
+ RC.config_file_name, i, phich_resource);
+
+ printf("phich.resource %ld (%s), phich.duration %ld (%s)\n",
+ RRC_CONFIGURATION_REQ (msg_p).phich_resource[j],phich_resource,
+ RRC_CONFIGURATION_REQ (msg_p).phich_duration[j],phich_duration);
+
+ if (strcmp(srs_enable, "ENABLE") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).srs_enable[j] = TRUE;
+ } else if (strcmp(srs_enable, "DISABLE") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).srs_enable[j] = FALSE;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n",
+ RC.config_file_name, i, srs_enable);
+
+ if (RRC_CONFIGURATION_REQ (msg_p).srs_enable[j] == TRUE) {
+ RRC_CONFIGURATION_REQ (msg_p).srs_BandwidthConfig[j] = srs_BandwidthConfig;
+
+ if ((srs_BandwidthConfig < 0) || (srs_BandwidthConfig >7))
+ AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value %d for srs_BandwidthConfig choice: 0...7\n",
+ RC.config_file_name, i, srs_BandwidthConfig);
+
+ RRC_CONFIGURATION_REQ (msg_p).srs_SubframeConfig[j] = srs_SubframeConfig;
+
+ if ((srs_SubframeConfig<0) || (srs_SubframeConfig>15))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for srs_SubframeConfig choice: 0..15 !\n",
+ RC.config_file_name, i, srs_SubframeConfig);
+
+ if (strcmp(srs_ackNackST, "ENABLE") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).srs_ackNackST[j] = TRUE;
+ } else if (strcmp(srs_ackNackST, "DISABLE") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).srs_ackNackST[j] = FALSE;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n",
+ RC.config_file_name, i, srs_ackNackST);
+
+ if (strcmp(srs_MaxUpPts, "ENABLE") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).srs_MaxUpPts[j] = TRUE;
+ } else if (strcmp(srs_MaxUpPts, "DISABLE") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).srs_MaxUpPts[j] = FALSE;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_MaxUpPts choice: ENABLE,DISABLE !\n",
+ RC.config_file_name, i, srs_MaxUpPts);
+ }
+
+ RRC_CONFIGURATION_REQ (msg_p).pusch_p0_Nominal[j] = pusch_p0_Nominal;
+
+ if ((pusch_p0_Nominal<-126) || (pusch_p0_Nominal>24))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_p0_Nominal choice: -126..24 !\n",
+ RC.config_file_name, i, pusch_p0_Nominal);
+
+#if (RRC_VERSION <= MAKE_VERSION(12, 0, 0))
+
+ if (strcmp(pusch_alpha,"AL0")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al0;
+ } else if (strcmp(pusch_alpha,"AL04")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al04;
+ } else if (strcmp(pusch_alpha,"AL05")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al05;
+ } else if (strcmp(pusch_alpha,"AL06")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al06;
+ } else if (strcmp(pusch_alpha,"AL07")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al07;
+ } else if (strcmp(pusch_alpha,"AL08")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al08;
+ } else if (strcmp(pusch_alpha,"AL09")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al09;
+ } else if (strcmp(pusch_alpha,"AL1")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al1;
+ }
+
+#endif
+#if (RRC_VERSION >= MAKE_VERSION(12, 0, 0))
+
+ if (strcmp(pusch_alpha,"AL0")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al0;
+ } else if (strcmp(pusch_alpha,"AL04")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al04;
+ } else if (strcmp(pusch_alpha,"AL05")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al05;
+ } else if (strcmp(pusch_alpha,"AL06")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al06;
+ } else if (strcmp(pusch_alpha,"AL07")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al07;
+ } else if (strcmp(pusch_alpha,"AL08")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al08;
+ } else if (strcmp(pusch_alpha,"AL09")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al09;
+ } else if (strcmp(pusch_alpha,"AL1")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al1;
+ }
+
+#endif
+ else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_Alpha choice: AL0,AL04,AL05,AL06,AL07,AL08,AL09,AL1!\n",
+ RC.config_file_name, i, pusch_alpha);
+
+ RRC_CONFIGURATION_REQ (msg_p).pucch_p0_Nominal[j] = pucch_p0_Nominal;
+
+ if ((pucch_p0_Nominal<-127) || (pucch_p0_Nominal>-96))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_p0_Nominal choice: -127..-96 !\n",
+ RC.config_file_name, i, pucch_p0_Nominal);
+
+ RRC_CONFIGURATION_REQ (msg_p).msg3_delta_Preamble[j] = msg3_delta_Preamble;
+
+ if ((msg3_delta_Preamble<-1) || (msg3_delta_Preamble>6))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for msg3_delta_Preamble choice: -1..6 !\n",
+ RC.config_file_name, i, msg3_delta_Preamble);
+
+ if (strcmp(pucch_deltaF_Format1,"deltaF_2")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF_2;
+ } else if (strcmp(pucch_deltaF_Format1,"deltaF0")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF0;
+ } else if (strcmp(pucch_deltaF_Format1,"deltaF2")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF2;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format1 choice: deltaF_2,dltaF0,deltaF2!\n",
+ RC.config_file_name, i, pucch_deltaF_Format1);
+
+ if (strcmp(pucch_deltaF_Format1b,"deltaF1")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF1;
+ } else if (strcmp(pucch_deltaF_Format1b,"deltaF3")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF3;
+ } else if (strcmp(pucch_deltaF_Format1b,"deltaF5")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF5;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format1b choice: deltaF1,dltaF3,deltaF5!\n",
+ RC.config_file_name, i, pucch_deltaF_Format1b);
+
+ if (strcmp(pucch_deltaF_Format2,"deltaF_2")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF_2;
+ } else if (strcmp(pucch_deltaF_Format2,"deltaF0")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF0;
+ } else if (strcmp(pucch_deltaF_Format2,"deltaF1")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF1;
+ } else if (strcmp(pucch_deltaF_Format2,"deltaF2")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF2;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format2 choice: deltaF_2,dltaF0,deltaF1,deltaF2!\n",
+ RC.config_file_name, i, pucch_deltaF_Format2);
+
+ if (strcmp(pucch_deltaF_Format2a,"deltaF_2")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2a[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF_2;
+ } else if (strcmp(pucch_deltaF_Format2a,"deltaF0")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2a[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF0;
+ } else if (strcmp(pucch_deltaF_Format2a,"deltaF2")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2a[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF2;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format2a choice: deltaF_2,dltaF0,deltaF2!\n",
+ RC.config_file_name, i, pucch_deltaF_Format2a);
+
+ if (strcmp(pucch_deltaF_Format2b,"deltaF_2")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF_2;
+ } else if (strcmp(pucch_deltaF_Format2b,"deltaF0")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF0;
+ } else if (strcmp(pucch_deltaF_Format2b,"deltaF2")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF2;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format2b choice: deltaF_2,dltaF0,deltaF2!\n",
+ RC.config_file_name, i, pucch_deltaF_Format2b);
+
+ RRC_CONFIGURATION_REQ (msg_p).rach_numberOfRA_Preambles[j] = (rach_numberOfRA_Preambles/4)-1;
+
+ if ((rach_numberOfRA_Preambles <4) || (rach_numberOfRA_Preambles>64) || ((rach_numberOfRA_Preambles&3)!=0))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_numberOfRA_Preambles choice: 4,8,12,...,64!\n",
+ RC.config_file_name, i, rach_numberOfRA_Preambles);
+
+ if (strcmp(rach_preamblesGroupAConfig, "ENABLE") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).rach_preamblesGroupAConfig[j] = TRUE;
+ RRC_CONFIGURATION_REQ (msg_p).rach_sizeOfRA_PreamblesGroupA[j] = (rach_sizeOfRA_PreamblesGroupA/4)-1;
+
+ if ((rach_numberOfRA_Preambles <4) || (rach_numberOfRA_Preambles>60) || ((rach_numberOfRA_Preambles&3)!=0))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_sizeOfRA_PreamblesGroupA choice: 4,8,12,...,60!\n",
+ RC.config_file_name, i, rach_sizeOfRA_PreamblesGroupA);
+
+ switch (rach_messageSizeGroupA) {
+ case 56:
+ RRC_CONFIGURATION_REQ (msg_p).rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b56;
+ break;
+
+ case 144:
+ RRC_CONFIGURATION_REQ (msg_p).rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b144;
+ break;
+
+ case 208:
+ RRC_CONFIGURATION_REQ (msg_p).rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b208;
+ break;
+
+ case 256:
+ RRC_CONFIGURATION_REQ (msg_p).rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b256;
+ break;
+
+ default:
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_messageSizeGroupA choice: 56,144,208,256!\n",
+ RC.config_file_name, i, rach_messageSizeGroupA);
+ break;
+ }
+
+ if (strcmp(rach_messagePowerOffsetGroupB,"minusinfinity")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_minusinfinity;
+ } else if (strcmp(rach_messagePowerOffsetGroupB,"dB0")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB0;
+ } else if (strcmp(rach_messagePowerOffsetGroupB,"dB5")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB5;
+ } else if (strcmp(rach_messagePowerOffsetGroupB,"dB8")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB8;
+ } else if (strcmp(rach_messagePowerOffsetGroupB,"dB10")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB10;
+ } else if (strcmp(rach_messagePowerOffsetGroupB,"dB12")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB12;
+ } else if (strcmp(rach_messagePowerOffsetGroupB,"dB15")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB15;
+ } else if (strcmp(rach_messagePowerOffsetGroupB,"dB18")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB18;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rach_messagePowerOffsetGroupB choice: minusinfinity,dB0,dB5,dB8,dB10,dB12,dB15,dB18!\n",
+ RC.config_file_name, i, rach_messagePowerOffsetGroupB);
+ } else if (strcmp(rach_preamblesGroupAConfig, "DISABLE") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).rach_preamblesGroupAConfig[j] = FALSE;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rach_preamblesGroupAConfig choice: ENABLE,DISABLE !\n",
+ RC.config_file_name, i, rach_preamblesGroupAConfig);
+
+ RRC_CONFIGURATION_REQ (msg_p).rach_preambleInitialReceivedTargetPower[j] = (rach_preambleInitialReceivedTargetPower+120)/2;
+
+ if ((rach_preambleInitialReceivedTargetPower<-120) || (rach_preambleInitialReceivedTargetPower>-90) || ((rach_preambleInitialReceivedTargetPower&1)!=0))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_preambleInitialReceivedTargetPower choice: -120,-118,...,-90 !\n",
+ RC.config_file_name, i, rach_preambleInitialReceivedTargetPower);
+
+ RRC_CONFIGURATION_REQ (msg_p).rach_powerRampingStep[j] = rach_powerRampingStep/2;
+
+ if ((rach_powerRampingStep<0) || (rach_powerRampingStep>6) || ((rach_powerRampingStep&1)!=0))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_powerRampingStep choice: 0,2,4,6 !\n",
+ RC.config_file_name, i, rach_powerRampingStep);
+
+ switch (rach_preambleTransMax) {
+#if (RRC_VERSION < MAKE_VERSION(14, 0, 0))
+
+ case 3:
+ RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n3;
+ break;
+
+ case 4:
+ RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n4;
+ break;
+
+ case 5:
+ RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n5;
+ break;
+
+ case 6:
+ RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n6;
+ break;
+
+ case 7:
+ RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n7;
+ break;
+
+ case 8:
+ RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n8;
+ break;
+
+ case 10:
+ RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n10;
+ break;
+
+ case 20:
+ RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n20;
+ break;
+
+ case 50:
+ RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n50;
+ break;
+
+ case 100:
+ RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n100;
+ break;
+
+ case 200:
+ RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n200;
+ break;
+#else
+
+ case 3:
+ RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n3;
+ break;
+
+ case 4:
+ RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n4;
+ break;
+
+ case 5:
+ RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n5;
+ break;
+
+ case 6:
+ RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n6;
+ break;
+
+ case 7:
+ RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n7;
+ break;
+
+ case 8:
+ RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n8;
+ break;
+
+ case 10:
+ RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n10;
+ break;
+
+ case 20:
+ RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n20;
+ break;
+
+ case 50:
+ RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n50;
+ break;
+
+ case 100:
+ RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n100;
+ break;
+
+ case 200:
+ RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n200;
+ break;
+#endif
+
+ default:
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_preambleTransMax choice: 3,4,5,6,7,8,10,20,50,100,200!\n",
+ RC.config_file_name, i, rach_preambleTransMax);
+ break;
+ }
+
+ RRC_CONFIGURATION_REQ (msg_p).rach_raResponseWindowSize[j] = (rach_raResponseWindowSize==10)?7:rach_raResponseWindowSize-2;
+
+ if ((rach_raResponseWindowSize<0)||(rach_raResponseWindowSize==9)||(rach_raResponseWindowSize>10))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_raResponseWindowSize choice: 2,3,4,5,6,7,8,10!\n",
+ RC.config_file_name, i, rach_preambleTransMax);
+
+ RRC_CONFIGURATION_REQ (msg_p).rach_macContentionResolutionTimer[j] = (rach_macContentionResolutionTimer/8)-1;
+
+ if ((rach_macContentionResolutionTimer<8) || (rach_macContentionResolutionTimer>64) || ((rach_macContentionResolutionTimer&7)!=0))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_macContentionResolutionTimer choice: 8,16,...,56,64!\n",
+ RC.config_file_name, i, rach_preambleTransMax);
+
+ RRC_CONFIGURATION_REQ (msg_p).rach_maxHARQ_Msg3Tx[j] = rach_maxHARQ_Msg3Tx;
+
+ if ((rach_maxHARQ_Msg3Tx<0) || (rach_maxHARQ_Msg3Tx>8))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_maxHARQ_Msg3Tx choice: 1..8!\n",
+ RC.config_file_name, i, rach_preambleTransMax);
+
+ switch (pcch_defaultPagingCycle) {
+ case 32:
+ RRC_CONFIGURATION_REQ (msg_p).pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf32;
+ break;
+
+ case 64:
+ RRC_CONFIGURATION_REQ (msg_p).pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf64;
+ break;
+
+ case 128:
+ RRC_CONFIGURATION_REQ (msg_p).pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf128;
+ break;
+
+ case 256:
+ RRC_CONFIGURATION_REQ (msg_p).pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf256;
+ break;
+
+ default:
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pcch_defaultPagingCycle choice: 32,64,128,256!\n",
+ RC.config_file_name, i, pcch_defaultPagingCycle);
+ break;
+ }
+
+ if (strcmp(pcch_nB, "fourT") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_fourT;
+ } else if (strcmp(pcch_nB, "twoT") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_twoT;
+ } else if (strcmp(pcch_nB, "oneT") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_oneT;
+ } else if (strcmp(pcch_nB, "halfT") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_halfT;
+ } else if (strcmp(pcch_nB, "quarterT") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_quarterT;
+ } else if (strcmp(pcch_nB, "oneEighthT") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_oneEighthT;
+ } else if (strcmp(pcch_nB, "oneSixteenthT") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_oneSixteenthT;
+ } else if (strcmp(pcch_nB, "oneThirtySecondT") == 0) {
+ RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_oneThirtySecondT;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pcch_nB choice: fourT,twoT,oneT,halfT,quarterT,oneighthT,oneSixteenthT,oneThirtySecondT !\n",
+ RC.config_file_name, i, pcch_defaultPagingCycle);
+
+ switch (bcch_modificationPeriodCoeff) {
+ case 2:
+ RRC_CONFIGURATION_REQ (msg_p).bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n2;
+ break;
+
+ case 4:
+ RRC_CONFIGURATION_REQ (msg_p).bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n4;
+ break;
+
+ case 8:
+ RRC_CONFIGURATION_REQ (msg_p).bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n8;
+ break;
+
+ case 16:
+ RRC_CONFIGURATION_REQ (msg_p).bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n16;
+ break;
+
+ default:
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for bcch_modificationPeriodCoeff choice: 2,4,8,16",
+ RC.config_file_name, i, bcch_modificationPeriodCoeff);
+ break;
+ }
+
+ RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = ue_TimersAndConstants_t300;
+ RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = ue_TimersAndConstants_t301;
+ RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310[j] = ue_TimersAndConstants_t310;
+ RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311[j] = ue_TimersAndConstants_t311;
+ RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = ue_TimersAndConstants_n310;
+ RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = ue_TimersAndConstants_n311;
+
+ switch (ue_TransmissionMode) {
+ case 1:
+ RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm1;
+ break;
+
+ case 2:
+ RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm2;
+ break;
+
+ case 3:
+ RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm3;
+ break;
+
+ case 4:
+ RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm4;
+ break;
+
+ case 5:
+ RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm5;
+ break;
+
+ case 6:
+ RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm6;
+ break;
+
+ case 7:
+ RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm7;
+ break;
+
+ default:
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TransmissionMode choice: 1,2,3,4,5,6,7",
+ RC.config_file_name, i, ue_TransmissionMode);
+ break;
+ }
+
+ RRC_CONFIGURATION_REQ (msg_p).ue_multiple_max[j] = ue_multiple_max;
+
+ switch (N_RB_DL) {
+ case 25:
+ if ((ue_multiple_max < 1) || (ue_multiple_max > 4))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_multiple_max choice: 1..4!\n",
+ RC.config_file_name, i, ue_multiple_max);
+
+ break;
+
+ case 50:
+ if ((ue_multiple_max < 1) || (ue_multiple_max > 8))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_multiple_max choice: 1..8!\n",
+ RC.config_file_name, i, ue_multiple_max);
+
+ break;
+
+ case 100:
+ if ((ue_multiple_max < 1) || (ue_multiple_max > 16))
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_multiple_max choice: 1..16!\n",
+ RC.config_file_name, i, ue_multiple_max);
+
+ break;
+
+ default:
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for N_RB_DL choice: 25,50,100 !\n",
+ RC.config_file_name, i, N_RB_DL);
+ break;
+ }
+
+ //TTN - for D2D
+ //SIB18
+ if (strcmp(rxPool_sc_CP_Len,"normal")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_CP_Len[j] = SL_CP_Len_r12_normal;
+ } else if (strcmp(rxPool_sc_CP_Len,"extended")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_CP_Len[j] = SL_CP_Len_r12_extended;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rxPool_sc_CP_Len choice: normal,extended!\n",
+ RC.config_file_name, i, rxPool_sc_CP_Len);
+
+ if (strcmp(rxPool_sc_Period,"sf40")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf40;
+ } else if (strcmp(rxPool_sc_Period,"sf60")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf60;
+ } else if (strcmp(rxPool_sc_Period,"sf70")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf70;
+ } else if (strcmp(rxPool_sc_Period,"sf80")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf80;
+ } else if (strcmp(rxPool_sc_Period,"sf120")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf120;
+ } else if (strcmp(rxPool_sc_Period,"sf140")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf140;
+ } else if (strcmp(rxPool_sc_Period,"sf160")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf160;
+ } else if (strcmp(rxPool_sc_Period,"sf240")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf240;
+ } else if (strcmp(rxPool_sc_Period,"sf280")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf280;
+ } else if (strcmp(rxPool_sc_Period,"sf320")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf320;
+ } else if (strcmp(rxPool_sc_Period,"spare6")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_spare6;
+ } else if (strcmp(rxPool_sc_Period,"spare5")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_spare5;
+ } else if (strcmp(rxPool_sc_Period,"spare4")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_spare4;
+ } else if (strcmp(rxPool_sc_Period,"spare3")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_spare3;
+ } else if (strcmp(rxPool_sc_Period,"spare2")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_spare2;
+ } else if (strcmp(rxPool_sc_Period,"spare")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_spare;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rxPool_sc_Period choice: sf40,sf60,sf70,sf80,sf120,sf140,sf160,sf240,sf280,sf320,spare6,spare5,spare4,spare3,spare2,spare!\n",
+ RC.config_file_name, i, rxPool_sc_Period);
+
+ if (strcmp(rxPool_data_CP_Len,"normal")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_data_CP_Len[j] = SL_CP_Len_r12_normal;
+ } else if (strcmp(rxPool_data_CP_Len,"extended")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_data_CP_Len[j] = SL_CP_Len_r12_extended;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rxPool_data_CP_Len choice: normal,extended!\n",
+ RC.config_file_name, i, rxPool_data_CP_Len);
+
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_prb_Num[j] = rxPool_ResourceConfig_prb_Num;
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_prb_Start[j] = rxPool_ResourceConfig_prb_Start;
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_prb_End[j] = rxPool_ResourceConfig_prb_End;
+
+ if (strcmp(rxPool_ResourceConfig_offsetIndicator_present,"prNothing")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_NOTHING;
+ } else if (strcmp(rxPool_ResourceConfig_offsetIndicator_present,"prSmall")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_small_r12;
+ } else if (strcmp(rxPool_ResourceConfig_offsetIndicator_present,"prLarge")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_large_r12;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rxPool_ResourceConfig_offsetIndicator_present choice: prNothing,prSmal,prLarge!\n",
+ RC.config_file_name, i, rxPool_ResourceConfig_offsetIndicator_present);
+
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_offsetIndicator_choice[j] = rxPool_ResourceConfig_offsetIndicator_choice;
+
+ if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prNothing")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_NOTHING;
+ } else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs4")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs4_r12;
+ } else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs8")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs8_r12;
+ } else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs12")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs12_r12;
+ } else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs16")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs16_r12;
+ } else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs30")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs30_r12;
+ } else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs40")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs40_r12;
+ } else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs42")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs42_r12;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rxPool_ResourceConfig_subframeBitmap_present choice: prNothing,prBs4,prBs8,prBs12,prBs16,prBs30,prBs40,prBs42!\n",
+ RC.config_file_name, i, rxPool_ResourceConfig_subframeBitmap_present);
+
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_choice_bs_buf[j] = rxPool_ResourceConfig_subframeBitmap_choice_bs_buf;
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_choice_bs_size[j] = rxPool_ResourceConfig_subframeBitmap_choice_bs_size;
+ RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused[j] = rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused;
+
+ //SIB19 - for discRxPool
+ if (strcmp(discRxPool_cp_Len,"normal")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_cp_Len[j] = SL_CP_Len_r12_normal;
+ } else if (strcmp(discRxPool_cp_Len,"extended")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_cp_Len[j] = SL_CP_Len_r12_extended;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPool_cp_Len choice: normal,extended!\n",
+ RC.config_file_name, i, discRxPool_cp_Len);
+
+ if (strcmp(discRxPool_discPeriod,"rf32")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf32;
+ } else if (strcmp(discRxPool_discPeriod,"rf64")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf64;
+ } else if (strcmp(discRxPool_discPeriod,"rf128")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf128;
+ } else if (strcmp(discRxPool_discPeriod,"rf256")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf256;
+ } else if (strcmp(discRxPool_discPeriod,"rf512")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf512;
+ } else if (strcmp(discRxPool_discPeriod,"rf1024")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf1024;
+ } else if (strcmp(discRxPool_discPeriod,"rf16")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf16_v1310;
+ } else if (strcmp(discRxPool_discPeriod,"spare")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_spare;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPool_discPeriod choice: rf32,rf64,rf128,rf512,rf1024,rf16,spare!\n",
+ RC.config_file_name, i, discRxPool_discPeriod);
+
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_numRetx[j] = discRxPool_numRetx;
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_numRepetition[j] = discRxPool_numRepetition;
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_prb_Num[j] = discRxPool_ResourceConfig_prb_Num;
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_prb_Start[j] = discRxPool_ResourceConfig_prb_Start;
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_prb_End[j] = discRxPool_ResourceConfig_prb_End;
+
+ if (strcmp(discRxPool_ResourceConfig_offsetIndicator_present,"prNothing")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_NOTHING;
+ } else if (strcmp(discRxPool_ResourceConfig_offsetIndicator_present,"prSmall")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_small_r12;
+ } else if (strcmp(discRxPool_ResourceConfig_offsetIndicator_present,"prLarge")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_large_r12;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPool_ResourceConfig_offsetIndicator_present choice: prNothing,prSmal,prLarge!\n",
+ RC.config_file_name, i, discRxPool_ResourceConfig_offsetIndicator_present);
+
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_offsetIndicator_choice[j] = discRxPool_ResourceConfig_offsetIndicator_choice;
+
+ if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prNothing")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_NOTHING;
+ } else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs4")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs4_r12;
+ } else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs8")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs8_r12;
+ } else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs12")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs12_r12;
+ } else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs16")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs16_r12;
+ } else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs30")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs30_r12;
+ } else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs40")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs40_r12;
+ } else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs42")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs42_r12;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPool_ResourceConfig_subframeBitmap_present choice: prNothing,prBs4,prBs8,prBs12,prBs16,prBs30,prBs40,prBs42!\n",
+ RC.config_file_name, i, discRxPool_ResourceConfig_subframeBitmap_present);
+
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf[j] = discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf;
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_choice_bs_size[j] = discRxPool_ResourceConfig_subframeBitmap_choice_bs_size;
+ RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused[j] = discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused;
+
+ //SIB19 - For discRxPoolPS
+ if (strcmp(discRxPoolPS_cp_Len,"normal")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_cp_Len[j] = SL_CP_Len_r12_normal;
+ } else if (strcmp(discRxPoolPS_cp_Len,"extended")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_cp_Len[j] = SL_CP_Len_r12_extended;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPoolPS_cp_Len choice: normal,extended!\n",
+ RC.config_file_name, i, discRxPoolPS_cp_Len);
+
+ if (strcmp(discRxPoolPS_discPeriod,"rf32")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf32;
+ } else if (strcmp(discRxPoolPS_discPeriod,"rf64")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf64;
+ } else if (strcmp(discRxPoolPS_discPeriod,"rf128")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf128;
+ } else if (strcmp(discRxPoolPS_discPeriod,"rf256")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf256;
+ } else if (strcmp(discRxPoolPS_discPeriod,"rf512")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf512;
+ } else if (strcmp(discRxPoolPS_discPeriod,"rf1024")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf1024;
+ } else if (strcmp(discRxPoolPS_discPeriod,"rf16")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf16_v1310;
+ } else if (strcmp(discRxPoolPS_discPeriod,"spare")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_spare;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPoolPS_discPeriod choice: rf32,rf64,rf128,rf512,rf1024,rf16,spare!\n",
+ RC.config_file_name, i, discRxPoolPS_discPeriod);
+
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_numRetx[j] = discRxPoolPS_numRetx;
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_numRepetition[j] = discRxPoolPS_numRepetition;
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_prb_Num[j] = discRxPoolPS_ResourceConfig_prb_Num;
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_prb_Start[j] = discRxPoolPS_ResourceConfig_prb_Start;
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_prb_End[j] = discRxPoolPS_ResourceConfig_prb_End;
+
+ if (strcmp(discRxPoolPS_ResourceConfig_offsetIndicator_present,"prNothing")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_NOTHING;
+ } else if (strcmp(discRxPoolPS_ResourceConfig_offsetIndicator_present,"prSmall")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_small_r12;
+ } else if (strcmp(discRxPoolPS_ResourceConfig_offsetIndicator_present,"prLarge")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_large_r12;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPoolPS_ResourceConfig_offsetIndicator_present choice: prNothing,prSmal,prLarge!\n",
+ RC.config_file_name, i, discRxPoolPS_ResourceConfig_offsetIndicator_present);
+
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_offsetIndicator_choice[j] = discRxPoolPS_ResourceConfig_offsetIndicator_choice;
+
+ if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prNothing")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_NOTHING;
+ } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs4")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs4_r12;
+ } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs8")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs8_r12;
+ } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs12")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs12_r12;
+ } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs16")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs16_r12;
+ } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs30")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs30_r12;
+ } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs40")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs40_r12;
+ } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs42")==0) {
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs42_r12;
+ } else
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPoolPS_ResourceConfig_subframeBitmap_present choice: prNothing,prBs4,prBs8,prBs12,prBs16,prBs30,prBs40,prBs42!\n",
+ RC.config_file_name, i, discRxPoolPS_ResourceConfig_subframeBitmap_present);
+
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_buf[j] = discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_buf;
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_size[j] = discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_size;
+ RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_bits_unused[j] = discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_bits_unused;
+ }
+ }
+
+ char srb1path[MAX_OPTNAME_SIZE*2 + 8];
+ sprintf(srb1path,"%s.%s",enbpath,ENB_CONFIG_STRING_SRB1);
+ int npar = config_get( SRB1Params,sizeof(SRB1Params)/sizeof(paramdef_t), srb1path);
+
+ if (npar == sizeof(SRB1Params)/sizeof(paramdef_t)) {
+ switch (srb1_max_retx_threshold) {
+ case 1:
+ rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t1;
+ break;
+
+ case 2:
+ rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t2;
+ break;
+
+ case 3:
+ rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t3;
+ break;
+
+ case 4:
+ rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t4;
+ break;
+
+ case 6:
+ rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t6;
+ break;
+
+ case 8:
+ rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t8;
+ break;
+
+ case 16:
+ rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t16;
+ break;
+
+ case 32:
+ rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t32;
+ break;
+
+ default:
+ AssertFatal (0,
+ "Bad config value when parsing eNB configuration file %s, enb %d srb1_max_retx_threshold %u!\n",
+ RC.config_file_name, i, srb1_max_retx_threshold);
+ }
+
+ switch (srb1_poll_pdu) {
+ case 4:
+ rrc->srb1_poll_pdu = PollPDU_p4;
+ break;
+
+ case 8:
+ rrc->srb1_poll_pdu = PollPDU_p8;
+ break;
+
+ case 16:
+ rrc->srb1_poll_pdu = PollPDU_p16;
+ break;
+
+ case 32:
+ rrc->srb1_poll_pdu = PollPDU_p32;
+ break;
+
+ case 64:
+ rrc->srb1_poll_pdu = PollPDU_p64;
+ break;
+
+ case 128:
+ rrc->srb1_poll_pdu = PollPDU_p128;
+ break;
+
+ case 256:
+ rrc->srb1_poll_pdu = PollPDU_p256;
+ break;
+
+ default:
+ if (srb1_poll_pdu >= 10000)
+ rrc->srb1_poll_pdu = PollPDU_pInfinity;
+ else
+ AssertFatal (0,
+ "Bad config value when parsing eNB configuration file %s, enb %d srb1_poll_pdu %u!\n",
+ RC.config_file_name, i, srb1_poll_pdu);
+ }
+
+ rrc->srb1_poll_byte = srb1_poll_byte;
+
+ switch (srb1_poll_byte) {
+ case 25:
+ rrc->srb1_poll_byte = PollByte_kB25;
+ break;
+
+ case 50:
+ rrc->srb1_poll_byte = PollByte_kB50;
+ break;
+
+ case 75:
+ rrc->srb1_poll_byte = PollByte_kB75;
+ break;
+
+ case 100:
+ rrc->srb1_poll_byte = PollByte_kB100;
+ break;
+
+ case 125:
+ rrc->srb1_poll_byte = PollByte_kB125;
+ break;
+
+ case 250:
+ rrc->srb1_poll_byte = PollByte_kB250;
+ break;
+
+ case 375:
+ rrc->srb1_poll_byte = PollByte_kB375;
+ break;
+
+ case 500:
+ rrc->srb1_poll_byte = PollByte_kB500;
+ break;
+
+ case 750:
+ rrc->srb1_poll_byte = PollByte_kB750;
+ break;
+
+ case 1000:
+ rrc->srb1_poll_byte = PollByte_kB1000;
+ break;
+
+ case 1250:
+ rrc->srb1_poll_byte = PollByte_kB1250;
+ break;
+
+ case 1500:
+ rrc->srb1_poll_byte = PollByte_kB1500;
+ break;
+
+ case 2000:
+ rrc->srb1_poll_byte = PollByte_kB2000;
+ break;
+
+ case 3000:
+ rrc->srb1_poll_byte = PollByte_kB3000;
+ break;
+
+ default:
+ if (srb1_poll_byte >= 10000)
+ rrc->srb1_poll_byte = PollByte_kBinfinity;
+ else
+ AssertFatal (0,
+ "Bad config value when parsing eNB configuration file %s, enb %d srb1_poll_byte %u!\n",
+ RC.config_file_name, i, srb1_poll_byte);
+ }
+
+ if (srb1_timer_poll_retransmit <= 250) {
+ rrc->srb1_timer_poll_retransmit = (srb1_timer_poll_retransmit - 5)/5;
+ } else if (srb1_timer_poll_retransmit <= 500) {
+ rrc->srb1_timer_poll_retransmit = (srb1_timer_poll_retransmit - 300)/50 + 50;
+ } else {
+ AssertFatal (0,
+ "Bad config value when parsing eNB configuration file %s, enb %d srb1_timer_poll_retransmit %u!\n",
+ RC.config_file_name, i, srb1_timer_poll_retransmit);
+ }
+
+ if (srb1_timer_status_prohibit <= 250) {
+ rrc->srb1_timer_status_prohibit = srb1_timer_status_prohibit/5;
+ } else if ((srb1_timer_poll_retransmit >= 300) && (srb1_timer_poll_retransmit <= 500)) {
+ rrc->srb1_timer_status_prohibit = (srb1_timer_status_prohibit - 300)/50 + 51;
+ } else {
+ AssertFatal (0,
+ "Bad config value when parsing eNB configuration file %s, enb %d srb1_timer_status_prohibit %u!\n",
+ RC.config_file_name, i, srb1_timer_status_prohibit);
+ }
+
+ switch (srb1_timer_reordering) {
+ case 0:
+ rrc->srb1_timer_reordering = T_Reordering_ms0;
+ break;
+
+ case 5:
+ rrc->srb1_timer_reordering = T_Reordering_ms5;
+ break;
+
+ case 10:
+ rrc->srb1_timer_reordering = T_Reordering_ms10;
+ break;
+
+ case 15:
+ rrc->srb1_timer_reordering = T_Reordering_ms15;
+ break;
+
+ case 20:
+ rrc->srb1_timer_reordering = T_Reordering_ms20;
+ break;
+
+ case 25:
+ rrc->srb1_timer_reordering = T_Reordering_ms25;
+ break;
+
+ case 30:
+ rrc->srb1_timer_reordering = T_Reordering_ms30;
+ break;
+
+ case 35:
+ rrc->srb1_timer_reordering = T_Reordering_ms35;
+ break;
+
+ case 40:
+ rrc->srb1_timer_reordering = T_Reordering_ms40;
+ break;
+
+ case 45:
+ rrc->srb1_timer_reordering = T_Reordering_ms45;
+ break;
+
+ case 50:
+ rrc->srb1_timer_reordering = T_Reordering_ms50;
+ break;
+
+ case 55:
+ rrc->srb1_timer_reordering = T_Reordering_ms55;
+ break;
+
+ case 60:
+ rrc->srb1_timer_reordering = T_Reordering_ms60;
+ break;
+
+ case 65:
+ rrc->srb1_timer_reordering = T_Reordering_ms65;
+ break;
+
+ case 70:
+ rrc->srb1_timer_reordering = T_Reordering_ms70;
+ break;
+
+ case 75:
+ rrc->srb1_timer_reordering = T_Reordering_ms75;
+ break;
+
+ case 80:
+ rrc->srb1_timer_reordering = T_Reordering_ms80;
+ break;
+
+ case 85:
+ rrc->srb1_timer_reordering = T_Reordering_ms85;
+ break;
+
+ case 90:
+ rrc->srb1_timer_reordering = T_Reordering_ms90;
+ break;
+
+ case 95:
+ rrc->srb1_timer_reordering = T_Reordering_ms95;
+ break;
+
+ case 100:
+ rrc->srb1_timer_reordering = T_Reordering_ms100;
+ break;
+
+ case 110:
+ rrc->srb1_timer_reordering = T_Reordering_ms110;
+ break;
+
+ case 120:
+ rrc->srb1_timer_reordering = T_Reordering_ms120;
+ break;
+
+ case 130:
+ rrc->srb1_timer_reordering = T_Reordering_ms130;
+ break;
+
+ case 140:
+ rrc->srb1_timer_reordering = T_Reordering_ms140;
+ break;
+
+ case 150:
+ rrc->srb1_timer_reordering = T_Reordering_ms150;
+ break;
+
+ case 160:
+ rrc->srb1_timer_reordering = T_Reordering_ms160;
+ break;
+
+ case 170:
+ rrc->srb1_timer_reordering = T_Reordering_ms170;
+ break;
+
+ case 180:
+ rrc->srb1_timer_reordering = T_Reordering_ms180;
+ break;
+
+ case 190:
+ rrc->srb1_timer_reordering = T_Reordering_ms190;
+ break;
+
+ case 200:
+ rrc->srb1_timer_reordering = T_Reordering_ms200;
+ break;
+
+ default:
+ AssertFatal (0,
+ "Bad config value when parsing eNB configuration file %s, enb %d srb1_timer_reordering %u!\n",
+ RC.config_file_name, i, srb1_timer_reordering);
+ }
+ } else {
+ rrc->srb1_timer_poll_retransmit = T_PollRetransmit_ms80;
+ rrc->srb1_timer_reordering = T_Reordering_ms35;
+ rrc->srb1_timer_status_prohibit = T_StatusProhibit_ms0;
+ rrc->srb1_poll_pdu = PollPDU_p4;
+ rrc->srb1_poll_byte = PollByte_kBinfinity;
+ rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t8;
+ }
+
+ /*
+ // Network Controller
+ subsetting = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_NETWORK_CONTROLLER_CONFIG);
+
+ if (subsetting != NULL) {
+ if ( (
+ config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_FLEXRAN_AGENT_INTERFACE_NAME,
+ (const char **)&flexran_agent_interface_name)
+ && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_FLEXRAN_AGENT_IPV4_ADDRESS,
+ (const char **)&flexran_agent_ipv4_address)
+ && config_setting_lookup_int(subsetting, ENB_CONFIG_STRING_FLEXRAN_AGENT_PORT,
+ &flexran_agent_port)
+ && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_FLEXRAN_AGENT_CACHE,
+ (const char **)&flexran_agent_cache)
+ )
+ ) {
+ enb_properties_loc.properties[enb_properties_loc_index]->flexran_agent_interface_name = strdup(flexran_agent_interface_name);
+ cidr = flexran_agent_ipv4_address;
+ address = strtok(cidr, "/");
+ //enb_properties_loc.properties[enb_properties_loc_index]->flexran_agent_ipv4_address = strdup(address);
+ if (address) {
+ IPV4_STR_ADDR_TO_INT_NWBO (address, enb_properties_loc.properties[enb_properties_loc_index]->flexran_agent_ipv4_address, "BAD IP ADDRESS FORMAT FOR eNB Agent !\n" );
+ }
+
+ enb_properties_loc.properties[enb_properties_loc_index]->flexran_agent_port = flexran_agent_port;
+ enb_properties_loc.properties[enb_properties_loc_index]->flexran_agent_cache = strdup(flexran_agent_cache);
+ }
+ }
+ */
+ break;
+ }
+ }
+ }
+
+ return 0;
+}
+
+int RCconfig_gtpu(void ) {
+ int num_enbs = 0;
+ char *enb_interface_name_for_S1U = NULL;
+ char *enb_ipv4_address_for_S1U = NULL;
+ uint32_t enb_port_for_S1U = 0;
+ char *address = NULL;
+ char *cidr = NULL;
+ char gtpupath[MAX_OPTNAME_SIZE*2 + 8];
+ paramdef_t ENBSParams[] = ENBSPARAMS_DESC;
+ paramdef_t GTPUParams[] = GTPUPARAMS_DESC;
+ LOG_I(GTPU,"Configuring GTPu\n");
+
+ /* get number of active eNodeBs */
+ config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL);
+ num_enbs = ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt;
+ AssertFatal (num_enbs >0,
+ "Failed to parse config file no active eNodeBs in %s \n", ENB_CONFIG_STRING_ACTIVE_ENBS);
+ sprintf(gtpupath,"%s.[%i].%s",ENB_CONFIG_STRING_ENB_LIST,0,ENB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG);
+ config_get( GTPUParams,sizeof(GTPUParams)/sizeof(paramdef_t),gtpupath);
+ cidr = enb_ipv4_address_for_S1U;
+ address = strtok(cidr, "/");
+
+ if (address) {
+ MessageDef *message;
+ AssertFatal((message = itti_alloc_new_message(TASK_ENB_APP, GTPV1U_ENB_S1_REQ))!=NULL,"");
+ IPV4_STR_ADDR_TO_INT_NWBO ( address, GTPV1U_ENB_S1_REQ(message).enb_ip_address_for_S1u_S12_S4_up, "BAD IP ADDRESS FORMAT FOR eNB S1_U !\n" );
+ LOG_I(GTPU,"Configuring GTPu address : %s -> %x\n",address,GTPV1U_ENB_S1_REQ(message).enb_ip_address_for_S1u_S12_S4_up);
+ GTPV1U_ENB_S1_REQ(message).enb_port_for_S1u_S12_S4_up = enb_port_for_S1U;
+ itti_send_msg_to_task (TASK_GTPV1_U, 0, message); // data model is wrong: gtpu doesn't have enb_id (or module_id)
+ } else
+ LOG_E(GTPU,"invalid address for S1U\n");
+
+ return 0;
+}
+
+
+int RCconfig_S1(MessageDef *msg_p, uint32_t i) {
+ int j,k = 0;
+ int enb_id;
+ int32_t my_int;
+ const char *active_enb[MAX_ENB];
+ char *address = NULL;
+ char *cidr = NULL;
+ // for no gcc warnings
+ (void)my_int;
+ memset((char *)active_enb, 0, MAX_ENB * sizeof(char *));
+ paramdef_t ENBSParams[] = ENBSPARAMS_DESC;
+ paramdef_t ENBParams[] = ENBPARAMS_DESC;
+ paramlist_def_t ENBParamList = {ENB_CONFIG_STRING_ENB_LIST,NULL,0};
+ /* get global parameters, defined outside any section in the config file */
+ config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL);
+ AssertFatal (i0) {
+ // Output a list of all eNBs.
+ config_getlist( &ENBParamList,ENBParams,sizeof(ENBParams)/sizeof(paramdef_t),NULL);
+
+ if (ENBParamList.numelt > 0) {
+ for (k = 0; k < ENBParamList.numelt; k++) {
+ if (ENBParamList.paramarray[k][ENB_ENB_ID_IDX].uptr == NULL) {
+ // Calculate a default eNB ID
+ if (EPC_MODE_ENABLED) {
+ uint32_t hash;
+ hash = s1ap_generate_eNB_id ();
+ enb_id = k + (hash & 0xFFFF8);
+ } else {
+ enb_id = k;
+ }
+ } else {
+ enb_id = *(ENBParamList.paramarray[k][ENB_ENB_ID_IDX].uptr);
+ }
+
+ // search if in active list
+ for (j=0; j < ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt; j++) {
+ if (strcmp(ENBSParams[ENB_ACTIVE_ENBS_IDX].strlistptr[j], *(ENBParamList.paramarray[k][ENB_ENB_NAME_IDX].strptr)) == 0) {
+ paramdef_t S1Params[] = S1PARAMS_DESC;
+ paramlist_def_t S1ParamList = {ENB_CONFIG_STRING_MME_IP_ADDRESS,NULL,0};
+ paramdef_t SCTPParams[] = SCTPPARAMS_DESC;
+ paramdef_t NETParams[] = NETPARAMS_DESC;
+ char aprefix[MAX_OPTNAME_SIZE*2 + 8];
+ S1AP_REGISTER_ENB_REQ (msg_p).eNB_id = enb_id;
+
+ if (strcmp(*(ENBParamList.paramarray[k][ENB_CELL_TYPE_IDX].strptr), "CELL_MACRO_ENB") == 0) {
+ S1AP_REGISTER_ENB_REQ (msg_p).cell_type = CELL_MACRO_ENB;
+ } else if (strcmp(*(ENBParamList.paramarray[k][ENB_CELL_TYPE_IDX].strptr), "CELL_HOME_ENB") == 0) {
+ S1AP_REGISTER_ENB_REQ (msg_p).cell_type = CELL_HOME_ENB;
+ } else {
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for cell_type choice: CELL_MACRO_ENB or CELL_HOME_ENB !\n",
+ RC.config_file_name, i, *(ENBParamList.paramarray[k][ENB_CELL_TYPE_IDX].strptr));
+ }
+
+ S1AP_REGISTER_ENB_REQ (msg_p).eNB_name = strdup(*(ENBParamList.paramarray[k][ENB_ENB_NAME_IDX].strptr));
+ S1AP_REGISTER_ENB_REQ (msg_p).tac = (uint16_t)atoi(*(ENBParamList.paramarray[k][ENB_TRACKING_AREA_CODE_IDX].strptr));
+ S1AP_REGISTER_ENB_REQ (msg_p).mcc = (uint16_t)atoi(*(ENBParamList.paramarray[k][ENB_MOBILE_COUNTRY_CODE_IDX].strptr));
+ S1AP_REGISTER_ENB_REQ (msg_p).mnc = (uint16_t)atoi(*(ENBParamList.paramarray[k][ENB_MOBILE_NETWORK_CODE_IDX].strptr));
+ S1AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length = strlen(*(ENBParamList.paramarray[k][ENB_MOBILE_NETWORK_CODE_IDX].strptr));
+ S1AP_REGISTER_ENB_REQ (msg_p).default_drx = 0;
+ AssertFatal((S1AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length == 2) ||
+ (S1AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length == 3),
+ "BAD MNC DIGIT LENGTH %d",
+ S1AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length);
+ sprintf(aprefix,"%s.[%i]",ENB_CONFIG_STRING_ENB_LIST,k);
+ config_getlist( &S1ParamList,S1Params,sizeof(S1Params)/sizeof(paramdef_t),aprefix);
+ S1AP_REGISTER_ENB_REQ (msg_p).nb_mme = 0;
+
+ for (int l = 0; l < S1ParamList.numelt; l++) {
+ S1AP_REGISTER_ENB_REQ (msg_p).nb_mme += 1;
+ strcpy(S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4_address,*(S1ParamList.paramarray[l][ENB_MME_IPV4_ADDRESS_IDX].strptr));
+ strcpy(S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6_address,*(S1ParamList.paramarray[l][ENB_MME_IPV6_ADDRESS_IDX].strptr));
+
+ if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv4") == 0) {
+ S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4 = 1;
+ } else if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv6") == 0) {
+ S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6 = 1;
+ } else if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "no") == 0) {
+ S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4 = 1;
+ S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6 = 1;
+ }
+ }
+
+ // SCTP SETTING
+ S1AP_REGISTER_ENB_REQ (msg_p).sctp_out_streams = SCTP_OUT_STREAMS;
+ S1AP_REGISTER_ENB_REQ (msg_p).sctp_in_streams = SCTP_IN_STREAMS;
+
+ if (EPC_MODE_ENABLED) {
+ sprintf(aprefix,"%s.[%i].%s",ENB_CONFIG_STRING_ENB_LIST,k,ENB_CONFIG_STRING_SCTP_CONFIG);
+ config_get( SCTPParams,sizeof(SCTPParams)/sizeof(paramdef_t),aprefix);
+ S1AP_REGISTER_ENB_REQ (msg_p).sctp_in_streams = (uint16_t)*(SCTPParams[ENB_SCTP_INSTREAMS_IDX].uptr);
+ S1AP_REGISTER_ENB_REQ (msg_p).sctp_out_streams = (uint16_t)*(SCTPParams[ENB_SCTP_OUTSTREAMS_IDX].uptr);
+ }
+
+ sprintf(aprefix,"%s.[%i].%s",ENB_CONFIG_STRING_ENB_LIST,k,ENB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG);
+ // NETWORK_INTERFACES
+ config_get( NETParams,sizeof(NETParams)/sizeof(paramdef_t),aprefix);
+ // S1AP_REGISTER_ENB_REQ (msg_p).enb_interface_name_for_S1U = strdup(enb_interface_name_for_S1U);
+ cidr = *(NETParams[ENB_IPV4_ADDRESS_FOR_S1_MME_IDX].strptr);
+ address = strtok(cidr, "/");
+ S1AP_REGISTER_ENB_REQ (msg_p).enb_ip_address.ipv6 = 0;
+ S1AP_REGISTER_ENB_REQ (msg_p).enb_ip_address.ipv4 = 1;
+ strcpy(S1AP_REGISTER_ENB_REQ (msg_p).enb_ip_address.ipv4_address, address);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+int RCconfig_X2(MessageDef *msg_p, uint32_t i) {
+ int I, J, j, k, l;
+ int enb_id;
+ char *address = NULL;
+ char *cidr = NULL;
+ paramdef_t ENBSParams[] = ENBSPARAMS_DESC;
+ paramdef_t ENBParams[] = ENBPARAMS_DESC;
+ paramlist_def_t ENBParamList = {ENB_CONFIG_STRING_ENB_LIST,NULL,0};
+ /* get global parameters, defined outside any section in the config file */
+ config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL);
+
+ /* define CC params */
+
+ int32_t Nid_cell = 0;
+
char *frame_type, *prefix_type, *pbch_repetition, *prach_high_speed,
*pusch_hoppingMode, *pusch_enable64QAM, *pusch_groupHoppingEnabled,
*pusch_sequenceHoppingEnabled, *phich_duration, *phich_resource,
@@ -147,2206 +2257,14 @@ void RCconfig_flexran()
libconfig_int discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_size;
libconfig_int discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_bits_unused;
- /* get number of eNBs */
- paramdef_t ENBSParams[] = ENBSPARAMS_DESC;
- config_get(ENBSParams, sizeof(ENBSParams)/sizeof(paramdef_t), NULL);
- num_enbs = ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt;
-
- /* for eNB ID */
- paramdef_t ENBParams[] = ENBPARAMS_DESC;
- paramlist_def_t ENBParamList = {ENB_CONFIG_STRING_ENB_LIST, NULL, 0};
-
- /* for Nid_cell */
checkedparam_t config_check_CCparams[] = CCPARAMS_CHECK;
paramdef_t CCsParams[] = CCPARAMS_DESC;
paramlist_def_t CCsParamList = {ENB_CONFIG_STRING_COMPONENT_CARRIERS, NULL, 0};
+
/* map parameter checking array instances to parameter definition array instances */
- for (int I = 0; I < (sizeof(CCsParams) / sizeof(paramdef_t)); I++) {
+ for (I = 0; I < (sizeof(CCsParams) / sizeof(paramdef_t)); I++) {
CCsParams[I].chkPptr = &(config_check_CCparams[I]);
}
-
- paramdef_t flexranParams[] = FLEXRANPARAMS_DESC;
- config_get(flexranParams, sizeof(flexranParams)/sizeof(paramdef_t), CONFIG_STRING_NETWORK_CONTROLLER_CONFIG);
-
- if (!RC.flexran) {
- RC.flexran = calloc(num_enbs, sizeof(flexran_agent_info_t*));
- AssertFatal(RC.flexran,
- "can't ALLOCATE %zu Bytes for %d flexran agent info with size %zu\n",
- num_enbs * sizeof(flexran_agent_info_t*),
- num_enbs, sizeof(flexran_agent_info_t*));
- }
-
- for (i = 0; i < num_enbs; i++) {
- RC.flexran[i] = calloc(1, sizeof(flexran_agent_info_t));
- AssertFatal(RC.flexran[i],
- "can't ALLOCATE %zu Bytes for flexran agent info (iteration %d/%d)\n",
- sizeof(flexran_agent_info_t), i + 1, num_enbs);
- /* if config says "yes", enable Agent, in all other cases it's like "no" */
- RC.flexran[i]->enabled = strcasecmp(*(flexranParams[FLEXRAN_ENABLED].strptr), "yes") == 0;
- /* if not enabled, simply skip the rest, it is not needed anyway */
- if (!RC.flexran[i]->enabled)
- continue;
- RC.flexran[i]->interface_name = strdup(*(flexranParams[FLEXRAN_INTERFACE_NAME_IDX].strptr));
- //inet_ntop(AF_INET, &(enb_properties->properties[mod_id]->flexran_agent_ipv4_address), in_ip, INET_ADDRSTRLEN);
- RC.flexran[i]->remote_ipv4_addr = strdup(*(flexranParams[FLEXRAN_IPV4_ADDRESS_IDX].strptr));
- RC.flexran[i]->remote_port = *(flexranParams[FLEXRAN_PORT_IDX].uptr);
- RC.flexran[i]->cache_name = strdup(*(flexranParams[FLEXRAN_CACHE_IDX].strptr));
- RC.flexran[i]->node_ctrl_state = strcasecmp(*(flexranParams[FLEXRAN_AWAIT_RECONF_IDX].strptr), "yes") == 0 ? ENB_WAIT : ENB_NORMAL_OPERATION;
-
- config_getlist(&ENBParamList, ENBParams, sizeof(ENBParams)/sizeof(paramdef_t),NULL);
- /* eNB ID from configuration, as read in by RCconfig_RRC() */
- if (!ENBParamList.paramarray[i][ENB_ENB_ID_IDX].uptr) {
- // Calculate a default eNB ID
- if (EPC_MODE_ENABLED)
- enb_id = i + (s1ap_generate_eNB_id () & 0xFFFF8);
- else
- enb_id = i;
- } else {
- enb_id = *(ENBParamList.paramarray[i][ENB_ENB_ID_IDX].uptr);
- }
-
- /* cell ID */
- sprintf(aprefix, "%s.[%i]", ENB_CONFIG_STRING_ENB_LIST, i);
- config_getlist(&CCsParamList, NULL, 0, aprefix);
- if (CCsParamList.numelt > 0) {
- sprintf(aprefix, "%s.[%i].%s.[%i]", ENB_CONFIG_STRING_ENB_LIST, i, ENB_CONFIG_STRING_COMPONENT_CARRIERS, 0);
- config_get(CCsParams, sizeof(CCsParams)/sizeof(paramdef_t), aprefix);
- Nid_cell_tr = (uint16_t) Nid_cell;
- }
-
- RC.flexran[i]->mod_id = i;
- RC.flexran[i]->agent_id = (((uint64_t)i) << 48) | (((uint64_t)enb_id) << 16) | ((uint64_t)Nid_cell_tr);
-
- /* assume for the moment the monolithic case, i.e. agent can provide
- * information for all layers */
- RC.flexran[i]->capability_mask = FLEXRAN_CAP_LOPHY | FLEXRAN_CAP_HIPHY
- | FLEXRAN_CAP_LOMAC | FLEXRAN_CAP_HIMAC
- | FLEXRAN_CAP_RLC | FLEXRAN_CAP_PDCP
- | FLEXRAN_CAP_SDAP | FLEXRAN_CAP_RRC;
- }
-}
-
-
-void RCconfig_L1(void) {
- int i,j;
- paramdef_t L1_Params[] = L1PARAMS_DESC;
- paramlist_def_t L1_ParamList = {CONFIG_STRING_L1_LIST,NULL,0};
-
-
- if (RC.eNB == NULL) {
- RC.eNB = (PHY_VARS_eNB ***)malloc((1+NUMBER_OF_eNB_MAX)*sizeof(PHY_VARS_eNB**));
- LOG_I(PHY,"RC.eNB = %p\n",RC.eNB);
- memset(RC.eNB,0,(1+NUMBER_OF_eNB_MAX)*sizeof(PHY_VARS_eNB**));
- RC.nb_L1_CC = malloc((1+RC.nb_L1_inst)*sizeof(int));
- }
-
- config_getlist( &L1_ParamList,L1_Params,sizeof(L1_Params)/sizeof(paramdef_t), NULL);
- if (L1_ParamList.numelt > 0) {
- for (j = 0; j < RC.nb_L1_inst; j++) {
- RC.nb_L1_CC[j] = *(L1_ParamList.paramarray[j][L1_CC_IDX].uptr);
-
- if (RC.eNB[j] == NULL) {
- RC.eNB[j] = (PHY_VARS_eNB **)malloc((1+MAX_NUM_CCs)*sizeof(PHY_VARS_eNB*));
- LOG_I(PHY,"RC.eNB[%d] = %p\n",j,RC.eNB[j]);
- memset(RC.eNB[j],0,(1+MAX_NUM_CCs)*sizeof(PHY_VARS_eNB*));
- }
-
- for (i=0;iMod_id = j;
- RC.eNB[j][i]->CC_id = i;
- }
- }
-
- if (strcmp(*(L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "local_mac") == 0) {
-
- sf_ahead = 4; // Need 4 subframe gap between RX and TX
- }
- else if (strcmp(*(L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "nfapi") == 0) {
- RC.eNB[j][0]->eth_params_n.local_if_name = strdup(*(L1_ParamList.paramarray[j][L1_LOCAL_N_IF_NAME_IDX].strptr));
- RC.eNB[j][0]->eth_params_n.my_addr = strdup(*(L1_ParamList.paramarray[j][L1_LOCAL_N_ADDRESS_IDX].strptr));
- RC.eNB[j][0]->eth_params_n.remote_addr = strdup(*(L1_ParamList.paramarray[j][L1_REMOTE_N_ADDRESS_IDX].strptr));
- RC.eNB[j][0]->eth_params_n.my_portc = *(L1_ParamList.paramarray[j][L1_LOCAL_N_PORTC_IDX].iptr);
- RC.eNB[j][0]->eth_params_n.remote_portc = *(L1_ParamList.paramarray[j][L1_REMOTE_N_PORTC_IDX].iptr);
- RC.eNB[j][0]->eth_params_n.my_portd = *(L1_ParamList.paramarray[j][L1_LOCAL_N_PORTD_IDX].iptr);
- RC.eNB[j][0]->eth_params_n.remote_portd = *(L1_ParamList.paramarray[j][L1_REMOTE_N_PORTD_IDX].iptr);
- RC.eNB[j][0]->eth_params_n.transp_preference = ETH_UDP_MODE;
-
- sf_ahead = 2; // Cannot cope with 4 subframes betweem RX and TX - set it to 2
-
- RC.nb_macrlc_inst = 1; // This is used by mac_top_init_eNB()
-
- // This is used by init_eNB_afterRU()
- RC.nb_CC = (int *)malloc((1+RC.nb_inst)*sizeof(int));
- RC.nb_CC[0]=1;
-
- RC.nb_inst =1; // DJP - feptx_prec uses num_eNB but phy_init_RU uses nb_inst
-
- LOG_I(PHY,"%s() NFAPI PNF mode - RC.nb_inst=1 this is because phy_init_RU() uses that to index and not RC.num_eNB - why the 2 similar variables?\n", __FUNCTION__);
- LOG_I(PHY,"%s() NFAPI PNF mode - RC.nb_CC[0]=%d for init_eNB_afterRU()\n", __FUNCTION__, RC.nb_CC[0]);
- LOG_I(PHY,"%s() NFAPI PNF mode - RC.nb_macrlc_inst:%d because used by mac_top_init_eNB()\n", __FUNCTION__, RC.nb_macrlc_inst);
-
- //mac_top_init_eNB();
-
- configure_nfapi_pnf(RC.eNB[j][0]->eth_params_n.remote_addr, RC.eNB[j][0]->eth_params_n.remote_portc, RC.eNB[j][0]->eth_params_n.my_addr, RC.eNB[j][0]->eth_params_n.my_portd, RC.eNB[j][0]->eth_params_n .remote_portd);
- }
- else { // other midhaul
- }
- }// j=0..num_inst
- printf("Initializing northbound interface for L1\n");
- l1_north_init_eNB();
- } else {
- LOG_I(PHY,"No " CONFIG_STRING_L1_LIST " configuration found");
-
- // DJP need to create some structures for VNF
-
- j = 0;
-
- RC.nb_L1_CC = malloc((1+RC.nb_L1_inst)*sizeof(int)); // DJP - 1 lot then???
-
- RC.nb_L1_CC[j]=1; // DJP - hmmm
-
- if (RC.eNB[j] == NULL) {
- RC.eNB[j] = (PHY_VARS_eNB **)malloc((1+MAX_NUM_CCs)*sizeof(PHY_VARS_eNB**));
- LOG_I(PHY,"RC.eNB[%d] = %p\n",j,RC.eNB[j]);
- memset(RC.eNB[j],0,(1+MAX_NUM_CCs)*sizeof(PHY_VARS_eNB***));
- }
-
- for (i=0;iMod_id = j;
- RC.eNB[j][i]->CC_id = i;
- }
- }
- }
-}
-
-void RCconfig_macrlc() {
- int j;
-
-
- paramdef_t MacRLC_Params[] = MACRLCPARAMS_DESC;
- paramlist_def_t MacRLC_ParamList = {CONFIG_STRING_MACRLC_LIST,NULL,0};
-
- config_getlist( &MacRLC_ParamList,MacRLC_Params,sizeof(MacRLC_Params)/sizeof(paramdef_t), NULL);
-
- if ( MacRLC_ParamList.numelt > 0) {
-
- RC.nb_macrlc_inst=MacRLC_ParamList.numelt;
- mac_top_init_eNB();
- RC.nb_mac_CC = (int*)malloc(RC.nb_macrlc_inst*sizeof(int));
-
- for (j=0;jpuSch10xSnr = *(MacRLC_ParamList.paramarray[j][MACRLC_PUSCH10xSNR_IDX ].iptr);
- RC.mac[j]->puCch10xSnr = *(MacRLC_ParamList.paramarray[j][MACRLC_PUCCH10xSNR_IDX ].iptr);
- RC.nb_mac_CC[j] = *(MacRLC_ParamList.paramarray[j][MACRLC_CC_IDX].iptr);
- //RC.mac[j]->phy_test = *(MacRLC_ParamList.paramarray[j][MACRLC_PHY_TEST_IDX].iptr);
- //printf("PHY_TEST = %d,%d\n", RC.mac[j]->phy_test, j);
-
- if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr), "local_RRC") == 0) {
- // check number of instances is same as RRC/PDCP
-
- } else if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr), "cudu") == 0) {
- RC.mac[j]->eth_params_n.local_if_name = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_IF_NAME_IDX].strptr));
- RC.mac[j]->eth_params_n.my_addr = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_ADDRESS_IDX].strptr));
- RC.mac[j]->eth_params_n.remote_addr = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_ADDRESS_IDX].strptr));
- RC.mac[j]->eth_params_n.my_portc = *(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_PORTC_IDX].iptr);
- RC.mac[j]->eth_params_n.remote_portc = *(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_PORTC_IDX].iptr);
- RC.mac[j]->eth_params_n.my_portd = *(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_PORTD_IDX].iptr);
- RC.mac[j]->eth_params_n.remote_portd = *(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_PORTD_IDX].iptr);;
- RC.mac[j]->eth_params_n.transp_preference = ETH_UDP_MODE;
- } else { // other midhaul
- AssertFatal(1==0,"MACRLC %d: %s unknown northbound midhaul\n",j, *(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr));
- }
-
- if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr), "local_L1") == 0) {
-
-
- } else if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr), "nfapi") == 0) {
- RC.mac[j]->eth_params_s.local_if_name = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_IF_NAME_IDX].strptr));
- RC.mac[j]->eth_params_s.my_addr = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_ADDRESS_IDX].strptr));
- RC.mac[j]->eth_params_s.remote_addr = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_ADDRESS_IDX].strptr));
- RC.mac[j]->eth_params_s.my_portc = *(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_PORTC_IDX].iptr);
- RC.mac[j]->eth_params_s.remote_portc = *(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_PORTC_IDX].iptr);
- RC.mac[j]->eth_params_s.my_portd = *(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_PORTD_IDX].iptr);
- RC.mac[j]->eth_params_s.remote_portd = *(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_PORTD_IDX].iptr);
- RC.mac[j]->eth_params_s.transp_preference = ETH_UDP_MODE;
-
- sf_ahead = 2; // Cannot cope with 4 subframes betweem RX and TX - set it to 2
-
- printf("**************** vnf_port:%d\n", RC.mac[j]->eth_params_s.my_portc);
- configure_nfapi_vnf(RC.mac[j]->eth_params_s.my_addr, RC.mac[j]->eth_params_s.my_portc);
- printf("**************** RETURNED FROM configure_nfapi_vnf() vnf_port:%d\n", RC.mac[j]->eth_params_s.my_portc);
- } else { // other midhaul
- AssertFatal(1==0,"MACRLC %d: %s unknown southbound midhaul\n",j,*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr));
- }
- if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_SCHED_MODE_IDX].strptr), "default") == 0){
- global_scheduler_mode=SCHED_MODE_DEFAULT;
- printf("sched mode = default %d [%s]\n",global_scheduler_mode,*(MacRLC_ParamList.paramarray[j][MACRLC_SCHED_MODE_IDX].strptr));
- }else if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_SCHED_MODE_IDX].strptr), "fairRR") == 0){
- global_scheduler_mode=SCHED_MODE_FAIR_RR;
- printf("sched mode = fairRR %d [%s]\n",global_scheduler_mode,*(MacRLC_ParamList.paramarray[j][MACRLC_SCHED_MODE_IDX].strptr));
- }else{
- global_scheduler_mode=SCHED_MODE_DEFAULT;
- printf("sched mode = default %d [%s]\n",global_scheduler_mode,*(MacRLC_ParamList.paramarray[j][MACRLC_SCHED_MODE_IDX].strptr));
- }
- }// j=0..num_inst
- } else {// MacRLC_ParamList.numelt > 0
- AssertFatal (0,
- "No " CONFIG_STRING_MACRLC_LIST " configuration found");
- }
-}
-
-int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
-
- int num_enbs = 0;
-
- int j,k = 0;
- int32_t enb_id = 0;
- int nb_cc = 0;
-
-
- char* frame_type = NULL;
- int32_t tdd_config = 0;
- int32_t tdd_config_s = 0;
-
- char* prefix_type = NULL;
- char* pbch_repetition = NULL;
-
- int32_t eutra_band = 0;
- long long int downlink_frequency = 0;
- int32_t uplink_frequency_offset = 0;
- int32_t Nid_cell = 0;
- int32_t Nid_cell_mbsfn = 0;
- int32_t N_RB_DL = 0;
- int32_t nb_antenna_ports = 0;
-
- int32_t prach_root = 0;
- int32_t prach_config_index = 0;
- char* prach_high_speed = NULL;
- int32_t prach_zero_correlation = 0;
- int32_t prach_freq_offset = 0;
- int32_t pucch_delta_shift = 0;
- int32_t pucch_nRB_CQI = 0;
- int32_t pucch_nCS_AN = 0;
-//#if (RRC_VERSION >= MAKE_VERSION(10, 0, 0))
- int32_t pucch_n1_AN = 0;
-//#endif
- int32_t pdsch_referenceSignalPower = 0;
- int32_t pdsch_p_b = 0;
- int32_t pusch_n_SB = 0;
- char * pusch_hoppingMode = NULL;
- int32_t pusch_hoppingOffset = 0;
- char* pusch_enable64QAM = NULL;
- char* pusch_groupHoppingEnabled = NULL;
- int32_t pusch_groupAssignment = 0;
- char* pusch_sequenceHoppingEnabled = NULL;
- int32_t pusch_nDMRS1 = 0;
- char* phich_duration = NULL;
- char* phich_resource = NULL;
- char* srs_enable = NULL;
- int32_t srs_BandwidthConfig = 0;
- int32_t srs_SubframeConfig = 0;
- char* srs_ackNackST = NULL;
- char* srs_MaxUpPts = NULL;
- int32_t pusch_p0_Nominal = 0;
- char* pusch_alpha = NULL;
- int32_t pucch_p0_Nominal = 0;
- int32_t msg3_delta_Preamble = 0;
- //int32_t ul_CyclicPrefixLength = 0;
- char* pucch_deltaF_Format1 = NULL;
- //const char* pucch_deltaF_Format1a = NULL;
- char* pucch_deltaF_Format1b = NULL;
- char* pucch_deltaF_Format2 = NULL;
- char* pucch_deltaF_Format2a = NULL;
- char* pucch_deltaF_Format2b = NULL;
- int32_t rach_numberOfRA_Preambles = 0;
- char* rach_preamblesGroupAConfig = NULL;
- int32_t rach_sizeOfRA_PreamblesGroupA = 0;
- int32_t rach_messageSizeGroupA = 0;
- char* rach_messagePowerOffsetGroupB = NULL;
- int32_t rach_powerRampingStep = 0;
- int32_t rach_preambleInitialReceivedTargetPower = 0;
- int32_t rach_preambleTransMax = 0;
- int32_t rach_raResponseWindowSize = 10;
- int32_t rach_macContentionResolutionTimer = 0;
- int32_t rach_maxHARQ_Msg3Tx = 0;
- int32_t pcch_defaultPagingCycle = 0;
- char* pcch_nB = NULL;
- int32_t bcch_modificationPeriodCoeff = 0;
- int32_t ue_TimersAndConstants_t300 = 0;
- int32_t ue_TimersAndConstants_t301 = 0;
- int32_t ue_TimersAndConstants_t310 = 0;
- int32_t ue_TimersAndConstants_t311 = 0;
- int32_t ue_TimersAndConstants_n310 = 0;
- int32_t ue_TimersAndConstants_n311 = 0;
- int32_t ue_TransmissionMode = 0;
-
- int32_t ue_multiple_max = 0;
-
- //TTN - for D2D
- //SIB18
- const char* rxPool_sc_CP_Len = NULL;
- const char* rxPool_sc_Period = NULL;
- const char* rxPool_data_CP_Len = NULL;
- libconfig_int rxPool_ResourceConfig_prb_Num = 0;
- libconfig_int rxPool_ResourceConfig_prb_Start = 0;
- libconfig_int rxPool_ResourceConfig_prb_End = 0;
- const char* rxPool_ResourceConfig_offsetIndicator_present = NULL;
- libconfig_int rxPool_ResourceConfig_offsetIndicator_choice = 0;
- const char* rxPool_ResourceConfig_subframeBitmap_present = NULL;
- char* rxPool_ResourceConfig_subframeBitmap_choice_bs_buf = NULL;
- libconfig_int rxPool_ResourceConfig_subframeBitmap_choice_bs_size = 0;
- libconfig_int rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
- //SIB19
- //For discRxPool
- const char* discRxPool_cp_Len = NULL;
- const char* discRxPool_discPeriod = NULL;
- libconfig_int discRxPool_numRetx = 0;
- libconfig_int discRxPool_numRepetition = 0;
-
- libconfig_int discRxPool_ResourceConfig_prb_Num = 0;
- libconfig_int discRxPool_ResourceConfig_prb_Start = 0;
- libconfig_int discRxPool_ResourceConfig_prb_End = 0;
- const char* discRxPool_ResourceConfig_offsetIndicator_present = NULL;
- libconfig_int discRxPool_ResourceConfig_offsetIndicator_choice = 0;
- const char* discRxPool_ResourceConfig_subframeBitmap_present = NULL;
- char* discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf = NULL;
- libconfig_int discRxPool_ResourceConfig_subframeBitmap_choice_bs_size = 0;
- libconfig_int discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
- //For discRxPoolPS
- const char* discRxPoolPS_cp_Len = NULL;
- const char* discRxPoolPS_discPeriod = NULL;
- libconfig_int discRxPoolPS_numRetx = 0;
- libconfig_int discRxPoolPS_numRepetition = 0;
-
- libconfig_int discRxPoolPS_ResourceConfig_prb_Num = 0;
- libconfig_int discRxPoolPS_ResourceConfig_prb_Start = 0;
- libconfig_int discRxPoolPS_ResourceConfig_prb_End = 0;
- const char* discRxPoolPS_ResourceConfig_offsetIndicator_present = NULL;
- libconfig_int discRxPoolPS_ResourceConfig_offsetIndicator_choice = 0;
- const char* discRxPoolPS_ResourceConfig_subframeBitmap_present = NULL;
- char* discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_buf = NULL;
- libconfig_int discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_size = 0;
- libconfig_int discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
-
- int32_t srb1_timer_poll_retransmit = 0;
- int32_t srb1_timer_reordering = 0;
- int32_t srb1_timer_status_prohibit = 0;
- int32_t srb1_poll_pdu = 0;
- int32_t srb1_poll_byte = 0;
- int32_t srb1_max_retx_threshold = 0;
-
- int32_t my_int;
-
- // for no gcc warnings
- (void)my_int;
- paramdef_t ENBSParams[] = ENBSPARAMS_DESC;
-
- paramdef_t ENBParams[] = ENBPARAMS_DESC;
- paramlist_def_t ENBParamList = {ENB_CONFIG_STRING_ENB_LIST,NULL,0};
-
- checkedparam_t config_check_CCparams[] = CCPARAMS_CHECK;
- paramdef_t CCsParams[] = CCPARAMS_DESC;
- paramlist_def_t CCsParamList = {ENB_CONFIG_STRING_COMPONENT_CARRIERS,NULL,0};
-
- paramdef_t SRB1Params[] = SRB1PARAMS_DESC;
-
-/* map parameter checking array instances to parameter definition array instances */
- for (int I=0; I< ( sizeof(CCsParams)/ sizeof(paramdef_t) ) ; I++) {
- CCsParams[I].chkPptr = &(config_check_CCparams[I]);
- }
-/* get global parameters, defined outside any section in the config file */
-
- config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL);
-
- num_enbs = ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt;
- AssertFatal (i0) {
- // Output a list of all eNBs.
- config_getlist( &ENBParamList,ENBParams,sizeof(ENBParams)/sizeof(paramdef_t),NULL);
-
-
-
-
- if (ENBParamList.paramarray[i][ENB_ENB_ID_IDX].uptr == NULL) {
- // Calculate a default eNB ID
- if (EPC_MODE_ENABLED) {
- uint32_t hash;
-
- hash = s1ap_generate_eNB_id ();
- enb_id = i + (hash & 0xFFFF8);
- } else {
- enb_id = i;
- }
- } else {
- enb_id = *(ENBParamList.paramarray[i][ENB_ENB_ID_IDX].uptr);
- }
-
-
- printf("RRC %d: Southbound Transport %s\n",i,*(ENBParamList.paramarray[i][ENB_TRANSPORT_S_PREFERENCE_IDX].strptr));
-
- if (strcmp(*(ENBParamList.paramarray[i][ENB_TRANSPORT_S_PREFERENCE_IDX].strptr), "local_mac") == 0) {
-
-
- }
- else if (strcmp(*(ENBParamList.paramarray[i][ENB_TRANSPORT_S_PREFERENCE_IDX].strptr), "cudu") == 0) {
- rrc->eth_params_s.local_if_name = strdup(*(ENBParamList.paramarray[i][ENB_LOCAL_S_IF_NAME_IDX].strptr));
- rrc->eth_params_s.my_addr = strdup(*(ENBParamList.paramarray[i][ENB_LOCAL_S_ADDRESS_IDX].strptr));
- rrc->eth_params_s.remote_addr = strdup(*(ENBParamList.paramarray[i][ENB_REMOTE_S_ADDRESS_IDX].strptr));
- rrc->eth_params_s.my_portc = *(ENBParamList.paramarray[i][ENB_LOCAL_S_PORTC_IDX].uptr);
- rrc->eth_params_s.remote_portc = *(ENBParamList.paramarray[i][ENB_REMOTE_S_PORTC_IDX].uptr);
- rrc->eth_params_s.my_portd = *(ENBParamList.paramarray[i][ENB_LOCAL_S_PORTD_IDX].uptr);
- rrc->eth_params_s.remote_portd = *(ENBParamList.paramarray[i][ENB_REMOTE_S_PORTD_IDX].uptr);
- rrc->eth_params_s.transp_preference = ETH_UDP_MODE;
- }
-
- else { // other midhaul
- }
-
- // search if in active list
-
-
-
-
-
-
- for (k=0; k cell_type = CELL_MACRO_ENB;
- } else if (strcmp(cell_type, "CELL_HOME_ENB") == 0) {
- enb_properties_loc.properties[enb_properties_loc_index]->cell_type = CELL_HOME_ENB;
- } else {
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for cell_type choice: CELL_MACRO_ENB or CELL_HOME_ENB !\n",
- lib_config_file_name_pP, i, cell_type);
- }
-
- enb_properties_loc.properties[enb_properties_loc_index]->eNB_name = strdup(enb_name);
- */
- RRC_CONFIGURATION_REQ (msg_p).tac = (uint16_t)atoi( *(ENBParamList.paramarray[i][ENB_TRACKING_AREA_CODE_IDX].strptr) );
- RRC_CONFIGURATION_REQ (msg_p).mcc = (uint16_t)atoi( *(ENBParamList.paramarray[i][ENB_MOBILE_COUNTRY_CODE_IDX].strptr) );
- RRC_CONFIGURATION_REQ (msg_p).mnc = (uint16_t)atoi( *(ENBParamList.paramarray[i][ENB_MOBILE_NETWORK_CODE_IDX].strptr) );
- RRC_CONFIGURATION_REQ (msg_p).mnc_digit_length = strlen(*(ENBParamList.paramarray[i][ENB_MOBILE_NETWORK_CODE_IDX].strptr));
- AssertFatal((RRC_CONFIGURATION_REQ (msg_p).mnc_digit_length == 2) ||
- (RRC_CONFIGURATION_REQ (msg_p).mnc_digit_length == 3),
- "BAD MNC DIGIT LENGTH %d",
- RRC_CONFIGURATION_REQ (msg_p).mnc_digit_length);
-
-
- // Parse optional physical parameters
- sprintf(enbpath,"%s.[%i]",ENB_CONFIG_STRING_ENB_LIST,k),
- config_getlist( &CCsParamList,NULL,0,enbpath);
-
- LOG_I(RRC,"num component carriers %d \n",CCsParamList.numelt);
- if ( CCsParamList.numelt> 0) {
- char ccspath[MAX_OPTNAME_SIZE*2 + 16];
-
- for (j = 0; j < CCsParamList.numelt ;j++) {
-
- sprintf(ccspath,"%s.%s.[%i]",enbpath,ENB_CONFIG_STRING_COMPONENT_CARRIERS,j);
- LOG_I(RRC, "enb_config::RCconfig_RRC() parameter number: %d, total number of parameters: %zd, ccspath: %s \n \n", j, sizeof(CCsParams)/sizeof(paramdef_t), ccspath);
- config_get( CCsParams,sizeof(CCsParams)/sizeof(paramdef_t),ccspath);
-
-
- //printf("Component carrier %d\n",component_carrier);
-
-
-
- nb_cc++;
-
-
- RRC_CONFIGURATION_REQ (msg_p).tdd_config[j] = tdd_config;
-
- AssertFatal (tdd_config <= TDD_Config__subframeAssignment_sa6,
- "Failed to parse eNB configuration file %s, enb %d illegal tdd_config %d (should be 0-%d)!",
- RC.config_file_name, i, tdd_config, TDD_Config__subframeAssignment_sa6);
-
- RRC_CONFIGURATION_REQ (msg_p).tdd_config_s[j] = tdd_config_s;
- AssertFatal (tdd_config_s <= TDD_Config__specialSubframePatterns_ssp8,
- "Failed to parse eNB configuration file %s, enb %d illegal tdd_config_s %d (should be 0-%d)!",
- RC.config_file_name, i, tdd_config_s, TDD_Config__specialSubframePatterns_ssp8);
-
- if (!prefix_type)
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d define %s: NORMAL,EXTENDED!\n",
- RC.config_file_name, i, ENB_CONFIG_STRING_PREFIX_TYPE);
- else if (strcmp(prefix_type, "NORMAL") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).prefix_type[j] = NORMAL;
- } else if (strcmp(prefix_type, "EXTENDED") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).prefix_type[j] = EXTENDED;
- } else {
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prefix_type choice: NORMAL or EXTENDED !\n",
- RC.config_file_name, i, prefix_type);
- }
-#if (RRC_VERSION >= MAKE_VERSION(14, 0, 0))
- if (!pbch_repetition)
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d define %s: TRUE,FALSE!\n",
- RC.config_file_name, i, ENB_CONFIG_STRING_PBCH_REPETITION);
- else if (strcmp(pbch_repetition, "TRUE") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).pbch_repetition[j] = 1;
- } else if (strcmp(pbch_repetition, "FALSE") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).pbch_repetition[j] = 0;
- } else {
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pbch_repetition choice: TRUE or FALSE !\n",
- RC.config_file_name, i, pbch_repetition);
- }
-#endif
-
- RRC_CONFIGURATION_REQ (msg_p).eutra_band[j] = eutra_band;
- RRC_CONFIGURATION_REQ (msg_p).downlink_frequency[j] = (uint32_t) downlink_frequency;
- RRC_CONFIGURATION_REQ (msg_p).uplink_frequency_offset[j] = (unsigned int) uplink_frequency_offset;
- RRC_CONFIGURATION_REQ (msg_p).Nid_cell[j]= Nid_cell;
-
- if (Nid_cell>503) {
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for Nid_cell choice: 0...503 !\n",
- RC.config_file_name, i, Nid_cell);
- }
-
- RRC_CONFIGURATION_REQ (msg_p).N_RB_DL[j]= N_RB_DL;
-
- if ((N_RB_DL!=6) && (N_RB_DL!=15) && (N_RB_DL!=25) && (N_RB_DL!=50) && (N_RB_DL!=75) && (N_RB_DL!=100)) {
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for N_RB_DL choice: 6,15,25,50,75,100 !\n",
- RC.config_file_name, i, N_RB_DL);
- }
-
- if (strcmp(frame_type, "FDD") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).frame_type[j] = FDD;
- } else if (strcmp(frame_type, "TDD") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).frame_type[j] = TDD;
- } else {
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for frame_type choice: FDD or TDD !\n",
- RC.config_file_name, i, frame_type);
- }
-
-
- RRC_CONFIGURATION_REQ (msg_p).tdd_config[j] = tdd_config;
- AssertFatal (tdd_config <= TDD_Config__subframeAssignment_sa6,
- "Failed to parse eNB configuration file %s, enb %d illegal tdd_config %d (should be 0-%d)!",
- RC.config_file_name, i, tdd_config, TDD_Config__subframeAssignment_sa6);
-
-
- RRC_CONFIGURATION_REQ (msg_p).tdd_config_s[j] = tdd_config_s;
- AssertFatal (tdd_config_s <= TDD_Config__specialSubframePatterns_ssp8,
- "Failed to parse eNB configuration file %s, enb %d illegal tdd_config_s %d (should be 0-%d)!",
- RC.config_file_name, i, tdd_config_s, TDD_Config__specialSubframePatterns_ssp8);
-
-
-
- if (!prefix_type)
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d define %s: NORMAL,EXTENDED!\n",
- RC.config_file_name, i, ENB_CONFIG_STRING_PREFIX_TYPE);
- else if (strcmp(prefix_type, "NORMAL") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).prefix_type[j] = NORMAL;
- } else if (strcmp(prefix_type, "EXTENDED") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).prefix_type[j] = EXTENDED;
- } else {
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prefix_type choice: NORMAL or EXTENDED !\n",
- RC.config_file_name, i, prefix_type);
- }
-
-
-
- RRC_CONFIGURATION_REQ (msg_p).eutra_band[j] = eutra_band;
- // printf( "\teutra band:\t%d\n",RRC_CONFIGURATION_REQ (msg_p).eutra_band);
-
-
-
- RRC_CONFIGURATION_REQ (msg_p).downlink_frequency[j] = (uint32_t) downlink_frequency;
- //printf( "\tdownlink freq:\t%u\n",RRC_CONFIGURATION_REQ (msg_p).downlink_frequency);
-
-
- RRC_CONFIGURATION_REQ (msg_p).uplink_frequency_offset[j] = (unsigned int) uplink_frequency_offset;
-
- if (config_check_band_frequencies(j,
- RRC_CONFIGURATION_REQ (msg_p).eutra_band[j],
- RRC_CONFIGURATION_REQ (msg_p).downlink_frequency[j],
- RRC_CONFIGURATION_REQ (msg_p).uplink_frequency_offset[j],
- RRC_CONFIGURATION_REQ (msg_p).frame_type[j])) {
- AssertFatal(0, "error calling enb_check_band_frequencies\n");
- }
-
- if ((nb_antenna_ports <1) || (nb_antenna_ports > 2))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for nb_antenna_ports choice: 1..2 !\n",
- RC.config_file_name, i, nb_antenna_ports);
-
- RRC_CONFIGURATION_REQ (msg_p).nb_antenna_ports[j] = nb_antenna_ports;
-
-
- RRC_CONFIGURATION_REQ (msg_p).prach_root[j] = prach_root;
-
- if ((prach_root <0) || (prach_root > 1023))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_root choice: 0..1023 !\n",
- RC.config_file_name, i, prach_root);
-
- RRC_CONFIGURATION_REQ (msg_p).prach_config_index[j] = prach_config_index;
-
- if ((prach_config_index <0) || (prach_config_index > 63))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_config_index choice: 0..1023 !\n",
- RC.config_file_name, i, prach_config_index);
-
- if (!prach_high_speed)
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n",
- RC.config_file_name, i, ENB_CONFIG_STRING_PRACH_HIGH_SPEED);
- else if (strcmp(prach_high_speed, "ENABLE") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).prach_high_speed[j] = TRUE;
- } else if (strcmp(prach_high_speed, "DISABLE") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).prach_high_speed[j] = FALSE;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prach_config choice: ENABLE,DISABLE !\n",
- RC.config_file_name, i, prach_high_speed);
-
- RRC_CONFIGURATION_REQ (msg_p).prach_zero_correlation[j] =prach_zero_correlation;
-
- if ((prach_zero_correlation <0) || (prach_zero_correlation > 15))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_zero_correlation choice: 0..15!\n",
- RC.config_file_name, i, prach_zero_correlation);
-
- RRC_CONFIGURATION_REQ (msg_p).prach_freq_offset[j] = prach_freq_offset;
- if ((prach_freq_offset <0) || (prach_freq_offset > 94))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_freq_offset choice: 0..94!\n",
- RC.config_file_name, i, prach_freq_offset);
-
- RRC_CONFIGURATION_REQ (msg_p).pucch_delta_shift[j] = pucch_delta_shift-1;
-
- if ((pucch_delta_shift <1) || (pucch_delta_shift > 3))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_delta_shift choice: 1..3!\n",
- RC.config_file_name, i, pucch_delta_shift);
-
- RRC_CONFIGURATION_REQ (msg_p).pucch_nRB_CQI[j] = pucch_nRB_CQI;
-
- if ((pucch_nRB_CQI <0) || (pucch_nRB_CQI > 98))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_nRB_CQI choice: 0..98!\n",
- RC.config_file_name, i, pucch_nRB_CQI);
-
- RRC_CONFIGURATION_REQ (msg_p).pucch_nCS_AN[j] = pucch_nCS_AN;
-
- if ((pucch_nCS_AN <0) || (pucch_nCS_AN > 7))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_nCS_AN choice: 0..7!\n",
- RC.config_file_name, i, pucch_nCS_AN);
-
-//#if (RRC_VERSION < MAKE_VERSION(10, 0, 0))
- RRC_CONFIGURATION_REQ (msg_p).pucch_n1_AN[j] = pucch_n1_AN;
-
- if ((pucch_n1_AN <0) || (pucch_n1_AN > 2047))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_n1_AN choice: 0..2047!\n",
- RC.config_file_name, i, pucch_n1_AN);
-
-//#endif
- RRC_CONFIGURATION_REQ (msg_p).pdsch_referenceSignalPower[j] = pdsch_referenceSignalPower;
-
- if ((pdsch_referenceSignalPower <-60) || (pdsch_referenceSignalPower > 50))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pdsch_referenceSignalPower choice:-60..50!\n",
- RC.config_file_name, i, pdsch_referenceSignalPower);
-
- RRC_CONFIGURATION_REQ (msg_p).pdsch_p_b[j] = pdsch_p_b;
-
- if ((pdsch_p_b <0) || (pdsch_p_b > 3))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pdsch_p_b choice: 0..3!\n",
- RC.config_file_name, i, pdsch_p_b);
-
- RRC_CONFIGURATION_REQ (msg_p).pusch_n_SB[j] = pusch_n_SB;
-
- if ((pusch_n_SB <1) || (pusch_n_SB > 4))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_n_SB choice: 1..4!\n",
- RC.config_file_name, i, pusch_n_SB);
-
- if (!pusch_hoppingMode)
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d define %s: interSubframe,intraAndInterSubframe!\n",
- RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_HOPPINGMODE);
- else if (strcmp(pusch_hoppingMode,"interSubFrame")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pusch_hoppingMode[j] = PUSCH_ConfigCommon__pusch_ConfigBasic__hoppingMode_interSubFrame;
- } else if (strcmp(pusch_hoppingMode,"intraAndInterSubFrame")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pusch_hoppingMode[j] = PUSCH_ConfigCommon__pusch_ConfigBasic__hoppingMode_intraAndInterSubFrame;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_hoppingMode choice: interSubframe,intraAndInterSubframe!\n",
- RC.config_file_name, i, pusch_hoppingMode);
-
- RRC_CONFIGURATION_REQ (msg_p).pusch_hoppingOffset[j] = pusch_hoppingOffset;
-
- if ((pusch_hoppingOffset<0) || (pusch_hoppingOffset>98))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_hoppingOffset choice: 0..98!\n",
- RC.config_file_name, i, pusch_hoppingMode);
-
- if (!pusch_enable64QAM)
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n",
- RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_ENABLE64QAM);
- else if (strcmp(pusch_enable64QAM, "ENABLE") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).pusch_enable64QAM[j] = TRUE;
- } else if (strcmp(pusch_enable64QAM, "DISABLE") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).pusch_enable64QAM[j] = FALSE;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_enable64QAM choice: ENABLE,DISABLE!\n",
- RC.config_file_name, i, pusch_enable64QAM);
-
- if (!pusch_groupHoppingEnabled)
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n",
- RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_GROUP_HOPPING_EN);
- else if (strcmp(pusch_groupHoppingEnabled, "ENABLE") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).pusch_groupHoppingEnabled[j] = TRUE;
- } else if (strcmp(pusch_groupHoppingEnabled, "DISABLE") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).pusch_groupHoppingEnabled[j] = FALSE;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_groupHoppingEnabled choice: ENABLE,DISABLE!\n",
- RC.config_file_name, i, pusch_groupHoppingEnabled);
-
-
- RRC_CONFIGURATION_REQ (msg_p).pusch_groupAssignment[j] = pusch_groupAssignment;
-
- if ((pusch_groupAssignment<0)||(pusch_groupAssignment>29))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_groupAssignment choice: 0..29!\n",
- RC.config_file_name, i, pusch_groupAssignment);
-
- if (!pusch_sequenceHoppingEnabled)
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n",
- RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_SEQUENCE_HOPPING_EN);
- else if (strcmp(pusch_sequenceHoppingEnabled, "ENABLE") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).pusch_sequenceHoppingEnabled[j] = TRUE;
- } else if (strcmp(pusch_sequenceHoppingEnabled, "DISABLE") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).pusch_sequenceHoppingEnabled[j] = FALSE;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_sequenceHoppingEnabled choice: ENABLE,DISABLE!\n",
- RC.config_file_name, i, pusch_sequenceHoppingEnabled);
-
- RRC_CONFIGURATION_REQ (msg_p).pusch_nDMRS1[j] = pusch_nDMRS1; //cyclic_shift in RRC!
-
- if ((pusch_nDMRS1 <0) || (pusch_nDMRS1>7))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_nDMRS1 choice: 0..7!\n",
- RC.config_file_name, i, pusch_nDMRS1);
-
- if (strcmp(phich_duration,"NORMAL")==0) {
- RRC_CONFIGURATION_REQ (msg_p).phich_duration[j] = PHICH_Config__phich_Duration_normal;
- } else if (strcmp(phich_duration,"EXTENDED")==0) {
- RRC_CONFIGURATION_REQ (msg_p).phich_duration[j] = PHICH_Config__phich_Duration_extended;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for phich_duration choice: NORMAL,EXTENDED!\n",
- RC.config_file_name, i, phich_duration);
-
- if (strcmp(phich_resource,"ONESIXTH")==0) {
- RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_oneSixth ;
- } else if (strcmp(phich_resource,"HALF")==0) {
- RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_half;
- } else if (strcmp(phich_resource,"ONE")==0) {
- RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_one;
- } else if (strcmp(phich_resource,"TWO")==0) {
- RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_two;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for phich_resource choice: ONESIXTH,HALF,ONE,TWO!\n",
- RC.config_file_name, i, phich_resource);
-
- printf("phich.resource %ld (%s), phich.duration %ld (%s)\n",
- RRC_CONFIGURATION_REQ (msg_p).phich_resource[j],phich_resource,
- RRC_CONFIGURATION_REQ (msg_p).phich_duration[j],phich_duration);
-
- if (strcmp(srs_enable, "ENABLE") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).srs_enable[j] = TRUE;
- } else if (strcmp(srs_enable, "DISABLE") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).srs_enable[j] = FALSE;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n",
- RC.config_file_name, i, srs_enable);
-
- if (RRC_CONFIGURATION_REQ (msg_p).srs_enable[j] == TRUE) {
-
- RRC_CONFIGURATION_REQ (msg_p).srs_BandwidthConfig[j] = srs_BandwidthConfig;
-
- if ((srs_BandwidthConfig < 0) || (srs_BandwidthConfig >7))
- AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value %d for srs_BandwidthConfig choice: 0...7\n",
- RC.config_file_name, i, srs_BandwidthConfig);
-
- RRC_CONFIGURATION_REQ (msg_p).srs_SubframeConfig[j] = srs_SubframeConfig;
-
- if ((srs_SubframeConfig<0) || (srs_SubframeConfig>15))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for srs_SubframeConfig choice: 0..15 !\n",
- RC.config_file_name, i, srs_SubframeConfig);
-
- if (strcmp(srs_ackNackST, "ENABLE") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).srs_ackNackST[j] = TRUE;
- } else if (strcmp(srs_ackNackST, "DISABLE") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).srs_ackNackST[j] = FALSE;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n",
- RC.config_file_name, i, srs_ackNackST);
-
- if (strcmp(srs_MaxUpPts, "ENABLE") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).srs_MaxUpPts[j] = TRUE;
- } else if (strcmp(srs_MaxUpPts, "DISABLE") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).srs_MaxUpPts[j] = FALSE;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_MaxUpPts choice: ENABLE,DISABLE !\n",
- RC.config_file_name, i, srs_MaxUpPts);
- }
-
- RRC_CONFIGURATION_REQ (msg_p).pusch_p0_Nominal[j] = pusch_p0_Nominal;
-
- if ((pusch_p0_Nominal<-126) || (pusch_p0_Nominal>24))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_p0_Nominal choice: -126..24 !\n",
- RC.config_file_name, i, pusch_p0_Nominal);
-
-#if (RRC_VERSION <= MAKE_VERSION(12, 0, 0))
- if (strcmp(pusch_alpha,"AL0")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al0;
- } else if (strcmp(pusch_alpha,"AL04")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al04;
- } else if (strcmp(pusch_alpha,"AL05")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al05;
- } else if (strcmp(pusch_alpha,"AL06")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al06;
- } else if (strcmp(pusch_alpha,"AL07")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al07;
- } else if (strcmp(pusch_alpha,"AL08")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al08;
- } else if (strcmp(pusch_alpha,"AL09")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al09;
- } else if (strcmp(pusch_alpha,"AL1")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al1;
- }
-#endif
-
-#if (RRC_VERSION >= MAKE_VERSION(12, 0, 0))
- if (strcmp(pusch_alpha,"AL0")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al0;
- } else if (strcmp(pusch_alpha,"AL04")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al04;
- } else if (strcmp(pusch_alpha,"AL05")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al05;
- } else if (strcmp(pusch_alpha,"AL06")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al06;
- } else if (strcmp(pusch_alpha,"AL07")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al07;
- } else if (strcmp(pusch_alpha,"AL08")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al08;
- } else if (strcmp(pusch_alpha,"AL09")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al09;
- } else if (strcmp(pusch_alpha,"AL1")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al1;
- }
-#endif
- else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_Alpha choice: AL0,AL04,AL05,AL06,AL07,AL08,AL09,AL1!\n",
- RC.config_file_name, i, pusch_alpha);
-
- RRC_CONFIGURATION_REQ (msg_p).pucch_p0_Nominal[j] = pucch_p0_Nominal;
-
- if ((pucch_p0_Nominal<-127) || (pucch_p0_Nominal>-96))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_p0_Nominal choice: -127..-96 !\n",
- RC.config_file_name, i, pucch_p0_Nominal);
-
- RRC_CONFIGURATION_REQ (msg_p).msg3_delta_Preamble[j] = msg3_delta_Preamble;
-
- if ((msg3_delta_Preamble<-1) || (msg3_delta_Preamble>6))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for msg3_delta_Preamble choice: -1..6 !\n",
- RC.config_file_name, i, msg3_delta_Preamble);
-
-
- if (strcmp(pucch_deltaF_Format1,"deltaF_2")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF_2;
- } else if (strcmp(pucch_deltaF_Format1,"deltaF0")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF0;
- } else if (strcmp(pucch_deltaF_Format1,"deltaF2")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF2;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format1 choice: deltaF_2,dltaF0,deltaF2!\n",
- RC.config_file_name, i, pucch_deltaF_Format1);
-
- if (strcmp(pucch_deltaF_Format1b,"deltaF1")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF1;
- } else if (strcmp(pucch_deltaF_Format1b,"deltaF3")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF3;
- } else if (strcmp(pucch_deltaF_Format1b,"deltaF5")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF5;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format1b choice: deltaF1,dltaF3,deltaF5!\n",
- RC.config_file_name, i, pucch_deltaF_Format1b);
-
-
- if (strcmp(pucch_deltaF_Format2,"deltaF_2")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF_2;
- } else if (strcmp(pucch_deltaF_Format2,"deltaF0")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF0;
- } else if (strcmp(pucch_deltaF_Format2,"deltaF1")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF1;
- } else if (strcmp(pucch_deltaF_Format2,"deltaF2")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF2;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format2 choice: deltaF_2,dltaF0,deltaF1,deltaF2!\n",
- RC.config_file_name, i, pucch_deltaF_Format2);
-
- if (strcmp(pucch_deltaF_Format2a,"deltaF_2")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2a[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF_2;
- } else if (strcmp(pucch_deltaF_Format2a,"deltaF0")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2a[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF0;
- } else if (strcmp(pucch_deltaF_Format2a,"deltaF2")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2a[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF2;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format2a choice: deltaF_2,dltaF0,deltaF2!\n",
- RC.config_file_name, i, pucch_deltaF_Format2a);
-
- if (strcmp(pucch_deltaF_Format2b,"deltaF_2")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF_2;
- } else if (strcmp(pucch_deltaF_Format2b,"deltaF0")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF0;
- } else if (strcmp(pucch_deltaF_Format2b,"deltaF2")==0) {
- RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF2;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format2b choice: deltaF_2,dltaF0,deltaF2!\n",
- RC.config_file_name, i, pucch_deltaF_Format2b);
-
-
-
-
- RRC_CONFIGURATION_REQ (msg_p).rach_numberOfRA_Preambles[j] = (rach_numberOfRA_Preambles/4)-1;
-
- if ((rach_numberOfRA_Preambles <4) || (rach_numberOfRA_Preambles>64) || ((rach_numberOfRA_Preambles&3)!=0))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_numberOfRA_Preambles choice: 4,8,12,...,64!\n",
- RC.config_file_name, i, rach_numberOfRA_Preambles);
-
- if (strcmp(rach_preamblesGroupAConfig, "ENABLE") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).rach_preamblesGroupAConfig[j] = TRUE;
-
-
- RRC_CONFIGURATION_REQ (msg_p).rach_sizeOfRA_PreamblesGroupA[j] = (rach_sizeOfRA_PreamblesGroupA/4)-1;
-
- if ((rach_numberOfRA_Preambles <4) || (rach_numberOfRA_Preambles>60) || ((rach_numberOfRA_Preambles&3)!=0))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_sizeOfRA_PreamblesGroupA choice: 4,8,12,...,60!\n",
- RC.config_file_name, i, rach_sizeOfRA_PreamblesGroupA);
-
-
- switch (rach_messageSizeGroupA) {
- case 56:
- RRC_CONFIGURATION_REQ (msg_p).rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b56;
- break;
-
- case 144:
- RRC_CONFIGURATION_REQ (msg_p).rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b144;
- break;
-
- case 208:
- RRC_CONFIGURATION_REQ (msg_p).rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b208;
- break;
-
- case 256:
- RRC_CONFIGURATION_REQ (msg_p).rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b256;
- break;
-
- default:
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_messageSizeGroupA choice: 56,144,208,256!\n",
- RC.config_file_name, i, rach_messageSizeGroupA);
- break;
- }
-
- if (strcmp(rach_messagePowerOffsetGroupB,"minusinfinity")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_minusinfinity;
- }
-
- else if (strcmp(rach_messagePowerOffsetGroupB,"dB0")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB0;
- }
-
- else if (strcmp(rach_messagePowerOffsetGroupB,"dB5")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB5;
- }
-
- else if (strcmp(rach_messagePowerOffsetGroupB,"dB8")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB8;
- }
-
- else if (strcmp(rach_messagePowerOffsetGroupB,"dB10")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB10;
- }
-
- else if (strcmp(rach_messagePowerOffsetGroupB,"dB12")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB12;
- }
-
- else if (strcmp(rach_messagePowerOffsetGroupB,"dB15")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB15;
- }
-
- else if (strcmp(rach_messagePowerOffsetGroupB,"dB18")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB18;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rach_messagePowerOffsetGroupB choice: minusinfinity,dB0,dB5,dB8,dB10,dB12,dB15,dB18!\n",
- RC.config_file_name, i, rach_messagePowerOffsetGroupB);
-
- } else if (strcmp(rach_preamblesGroupAConfig, "DISABLE") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).rach_preamblesGroupAConfig[j] = FALSE;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rach_preamblesGroupAConfig choice: ENABLE,DISABLE !\n",
- RC.config_file_name, i, rach_preamblesGroupAConfig);
-
- RRC_CONFIGURATION_REQ (msg_p).rach_preambleInitialReceivedTargetPower[j] = (rach_preambleInitialReceivedTargetPower+120)/2;
-
- if ((rach_preambleInitialReceivedTargetPower<-120) || (rach_preambleInitialReceivedTargetPower>-90) || ((rach_preambleInitialReceivedTargetPower&1)!=0))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_preambleInitialReceivedTargetPower choice: -120,-118,...,-90 !\n",
- RC.config_file_name, i, rach_preambleInitialReceivedTargetPower);
-
-
- RRC_CONFIGURATION_REQ (msg_p).rach_powerRampingStep[j] = rach_powerRampingStep/2;
-
- if ((rach_powerRampingStep<0) || (rach_powerRampingStep>6) || ((rach_powerRampingStep&1)!=0))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_powerRampingStep choice: 0,2,4,6 !\n",
- RC.config_file_name, i, rach_powerRampingStep);
-
-
-
- switch (rach_preambleTransMax) {
-#if (RRC_VERSION < MAKE_VERSION(14, 0, 0))
- case 3:
- RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n3;
- break;
-
- case 4:
- RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n4;
- break;
-
- case 5:
- RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n5;
- break;
-
- case 6:
- RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n6;
- break;
-
- case 7:
- RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n7;
- break;
-
- case 8:
- RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n8;
- break;
-
- case 10:
- RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n10;
- break;
-
- case 20:
- RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n20;
- break;
-
- case 50:
- RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n50;
- break;
-
- case 100:
- RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n100;
- break;
-
- case 200:
- RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n200;
- break;
-
-#else
-
- case 3:
- RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n3;
- break;
-
- case 4:
- RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n4;
- break;
-
- case 5:
- RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n5;
- break;
-
- case 6:
- RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n6;
- break;
-
- case 7:
- RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n7;
- break;
-
- case 8:
- RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n8;
- break;
-
- case 10:
- RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n10;
- break;
-
- case 20:
- RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n20;
- break;
-
- case 50:
- RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n50;
- break;
-
- case 100:
- RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n100;
- break;
-
- case 200:
- RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n200;
- break;
-#endif
-
- default:
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_preambleTransMax choice: 3,4,5,6,7,8,10,20,50,100,200!\n",
- RC.config_file_name, i, rach_preambleTransMax);
- break;
- }
-
- RRC_CONFIGURATION_REQ (msg_p).rach_raResponseWindowSize[j] = (rach_raResponseWindowSize==10)?7:rach_raResponseWindowSize-2;
-
- if ((rach_raResponseWindowSize<0)||(rach_raResponseWindowSize==9)||(rach_raResponseWindowSize>10))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_raResponseWindowSize choice: 2,3,4,5,6,7,8,10!\n",
- RC.config_file_name, i, rach_preambleTransMax);
-
-
- RRC_CONFIGURATION_REQ (msg_p).rach_macContentionResolutionTimer[j] = (rach_macContentionResolutionTimer/8)-1;
-
- if ((rach_macContentionResolutionTimer<8) || (rach_macContentionResolutionTimer>64) || ((rach_macContentionResolutionTimer&7)!=0))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_macContentionResolutionTimer choice: 8,16,...,56,64!\n",
- RC.config_file_name, i, rach_preambleTransMax);
-
- RRC_CONFIGURATION_REQ (msg_p).rach_maxHARQ_Msg3Tx[j] = rach_maxHARQ_Msg3Tx;
-
- if ((rach_maxHARQ_Msg3Tx<0) || (rach_maxHARQ_Msg3Tx>8))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_maxHARQ_Msg3Tx choice: 1..8!\n",
- RC.config_file_name, i, rach_preambleTransMax);
-
-
- switch (pcch_defaultPagingCycle) {
- case 32:
- RRC_CONFIGURATION_REQ (msg_p).pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf32;
- break;
-
- case 64:
- RRC_CONFIGURATION_REQ (msg_p).pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf64;
- break;
-
- case 128:
- RRC_CONFIGURATION_REQ (msg_p).pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf128;
- break;
-
- case 256:
- RRC_CONFIGURATION_REQ (msg_p).pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf256;
- break;
-
- default:
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pcch_defaultPagingCycle choice: 32,64,128,256!\n",
- RC.config_file_name, i, pcch_defaultPagingCycle);
- break;
- }
-
- if (strcmp(pcch_nB, "fourT") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_fourT;
- } else if (strcmp(pcch_nB, "twoT") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_twoT;
- } else if (strcmp(pcch_nB, "oneT") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_oneT;
- } else if (strcmp(pcch_nB, "halfT") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_halfT;
- } else if (strcmp(pcch_nB, "quarterT") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_quarterT;
- } else if (strcmp(pcch_nB, "oneEighthT") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_oneEighthT;
- } else if (strcmp(pcch_nB, "oneSixteenthT") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_oneSixteenthT;
- } else if (strcmp(pcch_nB, "oneThirtySecondT") == 0) {
- RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_oneThirtySecondT;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pcch_nB choice: fourT,twoT,oneT,halfT,quarterT,oneighthT,oneSixteenthT,oneThirtySecondT !\n",
- RC.config_file_name, i, pcch_defaultPagingCycle);
-
-
-
- switch (bcch_modificationPeriodCoeff) {
- case 2:
- RRC_CONFIGURATION_REQ (msg_p).bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n2;
- break;
-
- case 4:
- RRC_CONFIGURATION_REQ (msg_p).bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n4;
- break;
-
- case 8:
- RRC_CONFIGURATION_REQ (msg_p).bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n8;
- break;
-
- case 16:
- RRC_CONFIGURATION_REQ (msg_p).bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n16;
- break;
-
- default:
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for bcch_modificationPeriodCoeff choice: 2,4,8,16",
- RC.config_file_name, i, bcch_modificationPeriodCoeff);
-
- break;
- }
-
-
- RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = ue_TimersAndConstants_t300;
- RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = ue_TimersAndConstants_t301;
- RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310[j] = ue_TimersAndConstants_t310;
- RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311[j] = ue_TimersAndConstants_t311;
- RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = ue_TimersAndConstants_n310;
- RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = ue_TimersAndConstants_n311;
-
- switch (ue_TransmissionMode) {
- case 1:
- RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm1;
- break;
- case 2:
- RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm2;
- break;
- case 3:
- RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm3;
- break;
- case 4:
- RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm4;
- break;
- case 5:
- RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm5;
- break;
- case 6:
- RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm6;
- break;
- case 7:
- RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm7;
- break;
- default:
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TransmissionMode choice: 1,2,3,4,5,6,7",
- RC.config_file_name, i, ue_TransmissionMode);
- break;
- }
-
- RRC_CONFIGURATION_REQ (msg_p).ue_multiple_max[j] = ue_multiple_max;
-
- switch (N_RB_DL) {
- case 25:
- if ((ue_multiple_max < 1) || (ue_multiple_max > 4))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_multiple_max choice: 1..4!\n",
- RC.config_file_name, i, ue_multiple_max);
- break;
- case 50:
- if ((ue_multiple_max < 1) || (ue_multiple_max > 8))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_multiple_max choice: 1..8!\n",
- RC.config_file_name, i, ue_multiple_max);
- break;
- case 100:
- if ((ue_multiple_max < 1) || (ue_multiple_max > 16))
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_multiple_max choice: 1..16!\n",
- RC.config_file_name, i, ue_multiple_max);
- break;
- default:
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for N_RB_DL choice: 25,50,100 !\n",
- RC.config_file_name, i, N_RB_DL);
- break;
- }
-
- //TTN - for D2D
- //SIB18
- if (strcmp(rxPool_sc_CP_Len,"normal")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_CP_Len[j] = SL_CP_Len_r12_normal;
- } else if (strcmp(rxPool_sc_CP_Len,"extended")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_CP_Len[j] = SL_CP_Len_r12_extended;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rxPool_sc_CP_Len choice: normal,extended!\n",
- RC.config_file_name, i, rxPool_sc_CP_Len);
-
- if (strcmp(rxPool_sc_Period,"sf40")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf40;
- } else if (strcmp(rxPool_sc_Period,"sf60")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf60;
- } else if (strcmp(rxPool_sc_Period,"sf70")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf70;
- } else if (strcmp(rxPool_sc_Period,"sf80")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf80;
- } else if (strcmp(rxPool_sc_Period,"sf120")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf120;
- } else if (strcmp(rxPool_sc_Period,"sf140")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf140;
- } else if (strcmp(rxPool_sc_Period,"sf160")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf160;
- } else if (strcmp(rxPool_sc_Period,"sf240")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf240;
- } else if (strcmp(rxPool_sc_Period,"sf280")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf280;
- } else if (strcmp(rxPool_sc_Period,"sf320")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf320;
- } else if (strcmp(rxPool_sc_Period,"spare6")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_spare6;
- } else if (strcmp(rxPool_sc_Period,"spare5")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_spare5;
- } else if (strcmp(rxPool_sc_Period,"spare4")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_spare4;
- } else if (strcmp(rxPool_sc_Period,"spare3")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_spare3;
- } else if (strcmp(rxPool_sc_Period,"spare2")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_spare2;
- } else if (strcmp(rxPool_sc_Period,"spare")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_spare;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rxPool_sc_Period choice: sf40,sf60,sf70,sf80,sf120,sf140,sf160,sf240,sf280,sf320,spare6,spare5,spare4,spare3,spare2,spare!\n",
- RC.config_file_name, i, rxPool_sc_Period);
-
- if (strcmp(rxPool_data_CP_Len,"normal")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_data_CP_Len[j] = SL_CP_Len_r12_normal;
- } else if (strcmp(rxPool_data_CP_Len,"extended")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_data_CP_Len[j] = SL_CP_Len_r12_extended;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rxPool_data_CP_Len choice: normal,extended!\n",
- RC.config_file_name, i, rxPool_data_CP_Len);
-
- RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_prb_Num[j] = rxPool_ResourceConfig_prb_Num;
- RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_prb_Start[j] = rxPool_ResourceConfig_prb_Start;
- RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_prb_End[j] = rxPool_ResourceConfig_prb_End;
-
- if (strcmp(rxPool_ResourceConfig_offsetIndicator_present,"prNothing")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_NOTHING;
- } else if (strcmp(rxPool_ResourceConfig_offsetIndicator_present,"prSmall")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_small_r12;
- } else if (strcmp(rxPool_ResourceConfig_offsetIndicator_present,"prLarge")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_large_r12;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rxPool_ResourceConfig_offsetIndicator_present choice: prNothing,prSmal,prLarge!\n",
- RC.config_file_name, i, rxPool_ResourceConfig_offsetIndicator_present);
-
- RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_offsetIndicator_choice[j] = rxPool_ResourceConfig_offsetIndicator_choice;
-
- if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prNothing")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_NOTHING;
- } else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs4")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs4_r12;
- } else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs8")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs8_r12;
- } else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs12")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs12_r12;
- } else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs16")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs16_r12;
- } else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs30")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs30_r12;
- } else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs40")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs40_r12;
- } else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs42")==0) {
- RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs42_r12;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rxPool_ResourceConfig_subframeBitmap_present choice: prNothing,prBs4,prBs8,prBs12,prBs16,prBs30,prBs40,prBs42!\n",
- RC.config_file_name, i, rxPool_ResourceConfig_subframeBitmap_present);
-
- RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_choice_bs_buf[j] = rxPool_ResourceConfig_subframeBitmap_choice_bs_buf;
- RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_choice_bs_size[j] = rxPool_ResourceConfig_subframeBitmap_choice_bs_size;
- RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused[j] = rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused;
-
- //SIB19 - for discRxPool
- if (strcmp(discRxPool_cp_Len,"normal")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_cp_Len[j] = SL_CP_Len_r12_normal;
- } else if (strcmp(discRxPool_cp_Len,"extended")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_cp_Len[j] = SL_CP_Len_r12_extended;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPool_cp_Len choice: normal,extended!\n",
- RC.config_file_name, i, discRxPool_cp_Len);
-
-
- if (strcmp(discRxPool_discPeriod,"rf32")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf32;
- } else if (strcmp(discRxPool_discPeriod,"rf64")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf64;
- } else if (strcmp(discRxPool_discPeriod,"rf128")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf128;
- } else if (strcmp(discRxPool_discPeriod,"rf256")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf256;
- } else if (strcmp(discRxPool_discPeriod,"rf512")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf512;
- } else if (strcmp(discRxPool_discPeriod,"rf1024")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf1024;
- } else if (strcmp(discRxPool_discPeriod,"rf16")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf16_v1310;
- } else if (strcmp(discRxPool_discPeriod,"spare")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_spare;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPool_discPeriod choice: rf32,rf64,rf128,rf512,rf1024,rf16,spare!\n",
- RC.config_file_name, i, discRxPool_discPeriod);
-
-
-
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_numRetx[j] = discRxPool_numRetx;
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_numRepetition[j] = discRxPool_numRepetition;
-
-
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_prb_Num[j] = discRxPool_ResourceConfig_prb_Num;
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_prb_Start[j] = discRxPool_ResourceConfig_prb_Start;
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_prb_End[j] = discRxPool_ResourceConfig_prb_End;
-
- if (strcmp(discRxPool_ResourceConfig_offsetIndicator_present,"prNothing")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_NOTHING;
- } else if (strcmp(discRxPool_ResourceConfig_offsetIndicator_present,"prSmall")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_small_r12;
- } else if (strcmp(discRxPool_ResourceConfig_offsetIndicator_present,"prLarge")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_large_r12;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPool_ResourceConfig_offsetIndicator_present choice: prNothing,prSmal,prLarge!\n",
- RC.config_file_name, i, discRxPool_ResourceConfig_offsetIndicator_present);
-
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_offsetIndicator_choice[j] = discRxPool_ResourceConfig_offsetIndicator_choice;
-
- if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prNothing")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_NOTHING;
- } else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs4")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs4_r12;
- } else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs8")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs8_r12;
- } else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs12")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs12_r12;
- } else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs16")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs16_r12;
- } else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs30")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs30_r12;
- } else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs40")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs40_r12;
- } else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs42")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs42_r12;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPool_ResourceConfig_subframeBitmap_present choice: prNothing,prBs4,prBs8,prBs12,prBs16,prBs30,prBs40,prBs42!\n",
- RC.config_file_name, i, discRxPool_ResourceConfig_subframeBitmap_present);
-
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf[j] = discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf;
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_choice_bs_size[j] = discRxPool_ResourceConfig_subframeBitmap_choice_bs_size;
- RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused[j] = discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused;
-
- //SIB19 - For discRxPoolPS
- if (strcmp(discRxPoolPS_cp_Len,"normal")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_cp_Len[j] = SL_CP_Len_r12_normal;
- } else if (strcmp(discRxPoolPS_cp_Len,"extended")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_cp_Len[j] = SL_CP_Len_r12_extended;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPoolPS_cp_Len choice: normal,extended!\n",
- RC.config_file_name, i, discRxPoolPS_cp_Len);
-
-
- if (strcmp(discRxPoolPS_discPeriod,"rf32")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf32;
- } else if (strcmp(discRxPoolPS_discPeriod,"rf64")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf64;
- } else if (strcmp(discRxPoolPS_discPeriod,"rf128")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf128;
- } else if (strcmp(discRxPoolPS_discPeriod,"rf256")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf256;
- } else if (strcmp(discRxPoolPS_discPeriod,"rf512")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf512;
- } else if (strcmp(discRxPoolPS_discPeriod,"rf1024")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf1024;
- } else if (strcmp(discRxPoolPS_discPeriod,"rf16")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf16_v1310;
- } else if (strcmp(discRxPoolPS_discPeriod,"spare")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_spare;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPoolPS_discPeriod choice: rf32,rf64,rf128,rf512,rf1024,rf16,spare!\n",
- RC.config_file_name, i, discRxPoolPS_discPeriod);
-
-
-
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_numRetx[j] = discRxPoolPS_numRetx;
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_numRepetition[j] = discRxPoolPS_numRepetition;
-
-
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_prb_Num[j] = discRxPoolPS_ResourceConfig_prb_Num;
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_prb_Start[j] = discRxPoolPS_ResourceConfig_prb_Start;
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_prb_End[j] = discRxPoolPS_ResourceConfig_prb_End;
-
- if (strcmp(discRxPoolPS_ResourceConfig_offsetIndicator_present,"prNothing")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_NOTHING;
- } else if (strcmp(discRxPoolPS_ResourceConfig_offsetIndicator_present,"prSmall")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_small_r12;
- } else if (strcmp(discRxPoolPS_ResourceConfig_offsetIndicator_present,"prLarge")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_large_r12;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPoolPS_ResourceConfig_offsetIndicator_present choice: prNothing,prSmal,prLarge!\n",
- RC.config_file_name, i, discRxPoolPS_ResourceConfig_offsetIndicator_present);
-
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_offsetIndicator_choice[j] = discRxPoolPS_ResourceConfig_offsetIndicator_choice;
-
- if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prNothing")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_NOTHING;
- } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs4")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs4_r12;
- } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs8")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs8_r12;
- } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs12")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs12_r12;
- } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs16")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs16_r12;
- } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs30")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs30_r12;
- } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs40")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs40_r12;
- } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs42")==0) {
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs42_r12;
- } else
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPoolPS_ResourceConfig_subframeBitmap_present choice: prNothing,prBs4,prBs8,prBs12,prBs16,prBs30,prBs40,prBs42!\n",
- RC.config_file_name, i, discRxPoolPS_ResourceConfig_subframeBitmap_present);
-
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_buf[j] = discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_buf;
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_size[j] = discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_size;
- RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_bits_unused[j] = discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_bits_unused;
-
-
- }
- }
- char srb1path[MAX_OPTNAME_SIZE*2 + 8];
- sprintf(srb1path,"%s.%s",enbpath,ENB_CONFIG_STRING_SRB1);
- int npar = config_get( SRB1Params,sizeof(SRB1Params)/sizeof(paramdef_t), srb1path);
- if (npar == sizeof(SRB1Params)/sizeof(paramdef_t)) {
- switch (srb1_max_retx_threshold) {
- case 1:
- rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t1;
- break;
-
- case 2:
- rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t2;
- break;
-
- case 3:
- rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t3;
- break;
-
- case 4:
- rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t4;
- break;
-
- case 6:
- rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t6;
- break;
-
- case 8:
- rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t8;
- break;
-
- case 16:
- rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t16;
- break;
-
- case 32:
- rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t32;
- break;
-
- default:
- AssertFatal (0,
- "Bad config value when parsing eNB configuration file %s, enb %d srb1_max_retx_threshold %u!\n",
- RC.config_file_name, i, srb1_max_retx_threshold);
- }
-
-
- switch (srb1_poll_pdu) {
- case 4:
- rrc->srb1_poll_pdu = PollPDU_p4;
- break;
-
- case 8:
- rrc->srb1_poll_pdu = PollPDU_p8;
- break;
-
- case 16:
- rrc->srb1_poll_pdu = PollPDU_p16;
- break;
-
- case 32:
- rrc->srb1_poll_pdu = PollPDU_p32;
- break;
-
- case 64:
- rrc->srb1_poll_pdu = PollPDU_p64;
- break;
-
- case 128:
- rrc->srb1_poll_pdu = PollPDU_p128;
- break;
-
- case 256:
- rrc->srb1_poll_pdu = PollPDU_p256;
- break;
-
- default:
- if (srb1_poll_pdu >= 10000)
- rrc->srb1_poll_pdu = PollPDU_pInfinity;
- else
- AssertFatal (0,
- "Bad config value when parsing eNB configuration file %s, enb %d srb1_poll_pdu %u!\n",
- RC.config_file_name, i, srb1_poll_pdu);
- }
-
- rrc->srb1_poll_byte = srb1_poll_byte;
-
- switch (srb1_poll_byte) {
- case 25:
- rrc->srb1_poll_byte = PollByte_kB25;
- break;
-
- case 50:
- rrc->srb1_poll_byte = PollByte_kB50;
- break;
-
- case 75:
- rrc->srb1_poll_byte = PollByte_kB75;
- break;
-
- case 100:
- rrc->srb1_poll_byte = PollByte_kB100;
- break;
-
- case 125:
- rrc->srb1_poll_byte = PollByte_kB125;
- break;
-
- case 250:
- rrc->srb1_poll_byte = PollByte_kB250;
- break;
-
- case 375:
- rrc->srb1_poll_byte = PollByte_kB375;
- break;
-
- case 500:
- rrc->srb1_poll_byte = PollByte_kB500;
- break;
-
- case 750:
- rrc->srb1_poll_byte = PollByte_kB750;
- break;
-
- case 1000:
- rrc->srb1_poll_byte = PollByte_kB1000;
- break;
-
- case 1250:
- rrc->srb1_poll_byte = PollByte_kB1250;
- break;
-
- case 1500:
- rrc->srb1_poll_byte = PollByte_kB1500;
- break;
-
- case 2000:
- rrc->srb1_poll_byte = PollByte_kB2000;
- break;
-
- case 3000:
- rrc->srb1_poll_byte = PollByte_kB3000;
- break;
-
- default:
- if (srb1_poll_byte >= 10000)
- rrc->srb1_poll_byte = PollByte_kBinfinity;
- else
- AssertFatal (0,
- "Bad config value when parsing eNB configuration file %s, enb %d srb1_poll_byte %u!\n",
- RC.config_file_name, i, srb1_poll_byte);
- }
-
- if (srb1_timer_poll_retransmit <= 250) {
- rrc->srb1_timer_poll_retransmit = (srb1_timer_poll_retransmit - 5)/5;
- } else if (srb1_timer_poll_retransmit <= 500) {
- rrc->srb1_timer_poll_retransmit = (srb1_timer_poll_retransmit - 300)/50 + 50;
- } else {
- AssertFatal (0,
- "Bad config value when parsing eNB configuration file %s, enb %d srb1_timer_poll_retransmit %u!\n",
- RC.config_file_name, i, srb1_timer_poll_retransmit);
- }
-
- if (srb1_timer_status_prohibit <= 250) {
- rrc->srb1_timer_status_prohibit = srb1_timer_status_prohibit/5;
- } else if ((srb1_timer_poll_retransmit >= 300) && (srb1_timer_poll_retransmit <= 500)) {
- rrc->srb1_timer_status_prohibit = (srb1_timer_status_prohibit - 300)/50 + 51;
- } else {
- AssertFatal (0,
- "Bad config value when parsing eNB configuration file %s, enb %d srb1_timer_status_prohibit %u!\n",
- RC.config_file_name, i, srb1_timer_status_prohibit);
- }
-
- switch (srb1_timer_reordering) {
- case 0:
- rrc->srb1_timer_reordering = T_Reordering_ms0;
- break;
-
- case 5:
- rrc->srb1_timer_reordering = T_Reordering_ms5;
- break;
-
- case 10:
- rrc->srb1_timer_reordering = T_Reordering_ms10;
- break;
-
- case 15:
- rrc->srb1_timer_reordering = T_Reordering_ms15;
- break;
-
- case 20:
- rrc->srb1_timer_reordering = T_Reordering_ms20;
- break;
-
- case 25:
- rrc->srb1_timer_reordering = T_Reordering_ms25;
- break;
-
- case 30:
- rrc->srb1_timer_reordering = T_Reordering_ms30;
- break;
-
- case 35:
- rrc->srb1_timer_reordering = T_Reordering_ms35;
- break;
-
- case 40:
- rrc->srb1_timer_reordering = T_Reordering_ms40;
- break;
-
- case 45:
- rrc->srb1_timer_reordering = T_Reordering_ms45;
- break;
-
- case 50:
- rrc->srb1_timer_reordering = T_Reordering_ms50;
- break;
-
- case 55:
- rrc->srb1_timer_reordering = T_Reordering_ms55;
- break;
-
- case 60:
- rrc->srb1_timer_reordering = T_Reordering_ms60;
- break;
-
- case 65:
- rrc->srb1_timer_reordering = T_Reordering_ms65;
- break;
-
- case 70:
- rrc->srb1_timer_reordering = T_Reordering_ms70;
- break;
-
- case 75:
- rrc->srb1_timer_reordering = T_Reordering_ms75;
- break;
-
- case 80:
- rrc->srb1_timer_reordering = T_Reordering_ms80;
- break;
-
- case 85:
- rrc->srb1_timer_reordering = T_Reordering_ms85;
- break;
-
- case 90:
- rrc->srb1_timer_reordering = T_Reordering_ms90;
- break;
-
- case 95:
- rrc->srb1_timer_reordering = T_Reordering_ms95;
- break;
-
- case 100:
- rrc->srb1_timer_reordering = T_Reordering_ms100;
- break;
-
- case 110:
- rrc->srb1_timer_reordering = T_Reordering_ms110;
- break;
-
- case 120:
- rrc->srb1_timer_reordering = T_Reordering_ms120;
- break;
-
- case 130:
- rrc->srb1_timer_reordering = T_Reordering_ms130;
- break;
-
- case 140:
- rrc->srb1_timer_reordering = T_Reordering_ms140;
- break;
-
- case 150:
- rrc->srb1_timer_reordering = T_Reordering_ms150;
- break;
-
- case 160:
- rrc->srb1_timer_reordering = T_Reordering_ms160;
- break;
-
- case 170:
- rrc->srb1_timer_reordering = T_Reordering_ms170;
- break;
-
- case 180:
- rrc->srb1_timer_reordering = T_Reordering_ms180;
- break;
-
- case 190:
- rrc->srb1_timer_reordering = T_Reordering_ms190;
- break;
-
- case 200:
- rrc->srb1_timer_reordering = T_Reordering_ms200;
- break;
-
- default:
- AssertFatal (0,
- "Bad config value when parsing eNB configuration file %s, enb %d srb1_timer_reordering %u!\n",
- RC.config_file_name, i, srb1_timer_reordering);
- }
-
- } else {
- rrc->srb1_timer_poll_retransmit = T_PollRetransmit_ms80;
- rrc->srb1_timer_reordering = T_Reordering_ms35;
- rrc->srb1_timer_status_prohibit = T_StatusProhibit_ms0;
- rrc->srb1_poll_pdu = PollPDU_p4;
- rrc->srb1_poll_byte = PollByte_kBinfinity;
- rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t8;
- }
-
- /*
- // Network Controller
- subsetting = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_NETWORK_CONTROLLER_CONFIG);
-
- if (subsetting != NULL) {
- if ( (
- config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_FLEXRAN_AGENT_INTERFACE_NAME,
- (const char **)&flexran_agent_interface_name)
- && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_FLEXRAN_AGENT_IPV4_ADDRESS,
- (const char **)&flexran_agent_ipv4_address)
- && config_setting_lookup_int(subsetting, ENB_CONFIG_STRING_FLEXRAN_AGENT_PORT,
- &flexran_agent_port)
- && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_FLEXRAN_AGENT_CACHE,
- (const char **)&flexran_agent_cache)
- )
- ) {
- enb_properties_loc.properties[enb_properties_loc_index]->flexran_agent_interface_name = strdup(flexran_agent_interface_name);
- cidr = flexran_agent_ipv4_address;
- address = strtok(cidr, "/");
- //enb_properties_loc.properties[enb_properties_loc_index]->flexran_agent_ipv4_address = strdup(address);
- if (address) {
- IPV4_STR_ADDR_TO_INT_NWBO (address, enb_properties_loc.properties[enb_properties_loc_index]->flexran_agent_ipv4_address, "BAD IP ADDRESS FORMAT FOR eNB Agent !\n" );
- }
-
- enb_properties_loc.properties[enb_properties_loc_index]->flexran_agent_port = flexran_agent_port;
- enb_properties_loc.properties[enb_properties_loc_index]->flexran_agent_cache = strdup(flexran_agent_cache);
- }
- }
- */
- break;
- }
-
- }
- }
-return 0;
-}
-
-int RCconfig_gtpu(void ) {
-
- int num_enbs = 0;
-
-
-
- char* enb_interface_name_for_S1U = NULL;
- char* enb_ipv4_address_for_S1U = NULL;
- uint32_t enb_port_for_S1U = 0;
- char *address = NULL;
- char *cidr = NULL;
- char gtpupath[MAX_OPTNAME_SIZE*2 + 8];
-
-
- paramdef_t ENBSParams[] = ENBSPARAMS_DESC;
-
- paramdef_t GTPUParams[] = GTPUPARAMS_DESC;
- LOG_I(GTPU,"Configuring GTPu\n");
-
-/* get number of active eNodeBs */
- config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL);
- num_enbs = ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt;
- AssertFatal (num_enbs >0,
- "Failed to parse config file no active eNodeBs in %s \n", ENB_CONFIG_STRING_ACTIVE_ENBS);
-
-
- sprintf(gtpupath,"%s.[%i].%s",ENB_CONFIG_STRING_ENB_LIST,0,ENB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG);
- config_get( GTPUParams,sizeof(GTPUParams)/sizeof(paramdef_t),gtpupath);
-
-
-
- cidr = enb_ipv4_address_for_S1U;
- address = strtok(cidr, "/");
-
- if (address) {
- IPV4_STR_ADDR_TO_INT_NWBO ( address, RC.gtpv1u_data_g->enb_ip_address_for_S1u_S12_S4_up, "BAD IP ADDRESS FORMAT FOR eNB S1_U !\n" );
-
- LOG_I(GTPU,"Configuring GTPu address : %s -> %x\n",address,RC.gtpv1u_data_g->enb_ip_address_for_S1u_S12_S4_up);
-
- }
-
- RC.gtpv1u_data_g->enb_port_for_S1u_S12_S4_up = enb_port_for_S1U;
-return 0;
-}
-
-
-int RCconfig_S1(MessageDef *msg_p, uint32_t i) {
-
- int j,k = 0;
-
-
- int enb_id;
-
- int32_t my_int;
-
-
-
- const char* active_enb[MAX_ENB];
-
-
- char *address = NULL;
- char *cidr = NULL;
-
-
- // for no gcc warnings
-
- (void)my_int;
-
- memset((char*)active_enb, 0 , MAX_ENB * sizeof(char*));
-
- paramdef_t ENBSParams[] = ENBSPARAMS_DESC;
-
- paramdef_t ENBParams[] = ENBPARAMS_DESC;
- paramlist_def_t ENBParamList = {ENB_CONFIG_STRING_ENB_LIST,NULL,0};
-
-/* get global parameters, defined outside any section in the config file */
-
- config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL);
-
-
-
- AssertFatal (i0) {
- // Output a list of all eNBs.
- config_getlist( &ENBParamList,ENBParams,sizeof(ENBParams)/sizeof(paramdef_t),NULL);
-
-
-
-
-
- if (ENBParamList.numelt > 0) {
- for (k = 0; k < ENBParamList.numelt; k++) {
- if (ENBParamList.paramarray[k][ENB_ENB_ID_IDX].uptr == NULL) {
- // Calculate a default eNB ID
-
- if (EPC_MODE_ENABLED) {
- uint32_t hash;
-
- hash = s1ap_generate_eNB_id ();
- enb_id = k + (hash & 0xFFFF8);
- } else {
- enb_id = k;
- }
- } else {
- enb_id = *(ENBParamList.paramarray[k][ENB_ENB_ID_IDX].uptr);
- }
-
-
- // search if in active list
- for (j=0; j < ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt; j++) {
- if (strcmp(ENBSParams[ENB_ACTIVE_ENBS_IDX].strlistptr[j], *(ENBParamList.paramarray[k][ENB_ENB_NAME_IDX].strptr)) == 0) {
- paramdef_t S1Params[] = S1PARAMS_DESC;
- paramlist_def_t S1ParamList = {ENB_CONFIG_STRING_MME_IP_ADDRESS,NULL,0};
-
- paramdef_t SCTPParams[] = SCTPPARAMS_DESC;
- paramdef_t NETParams[] = NETPARAMS_DESC;
- char aprefix[MAX_OPTNAME_SIZE*2 + 8];
-
- S1AP_REGISTER_ENB_REQ (msg_p).eNB_id = enb_id;
-
- if (strcmp(*(ENBParamList.paramarray[k][ENB_CELL_TYPE_IDX].strptr), "CELL_MACRO_ENB") == 0) {
- S1AP_REGISTER_ENB_REQ (msg_p).cell_type = CELL_MACRO_ENB;
- } else if (strcmp(*(ENBParamList.paramarray[k][ENB_CELL_TYPE_IDX].strptr), "CELL_HOME_ENB") == 0) {
- S1AP_REGISTER_ENB_REQ (msg_p).cell_type = CELL_HOME_ENB;
- } else {
- AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for cell_type choice: CELL_MACRO_ENB or CELL_HOME_ENB !\n",
- RC.config_file_name, i, *(ENBParamList.paramarray[k][ENB_CELL_TYPE_IDX].strptr));
- }
-
- S1AP_REGISTER_ENB_REQ (msg_p).eNB_name = strdup(*(ENBParamList.paramarray[k][ENB_ENB_NAME_IDX].strptr));
- S1AP_REGISTER_ENB_REQ (msg_p).tac = (uint16_t)atoi(*(ENBParamList.paramarray[k][ENB_TRACKING_AREA_CODE_IDX].strptr));
- S1AP_REGISTER_ENB_REQ (msg_p).mcc = (uint16_t)atoi(*(ENBParamList.paramarray[k][ENB_MOBILE_COUNTRY_CODE_IDX].strptr));
- S1AP_REGISTER_ENB_REQ (msg_p).mnc = (uint16_t)atoi(*(ENBParamList.paramarray[k][ENB_MOBILE_NETWORK_CODE_IDX].strptr));
- S1AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length = strlen(*(ENBParamList.paramarray[k][ENB_MOBILE_NETWORK_CODE_IDX].strptr));
- S1AP_REGISTER_ENB_REQ (msg_p).default_drx = 0;
- AssertFatal((S1AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length == 2) ||
- (S1AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length == 3),
- "BAD MNC DIGIT LENGTH %d",
- S1AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length);
-
- sprintf(aprefix,"%s.[%i]",ENB_CONFIG_STRING_ENB_LIST,k);
- config_getlist( &S1ParamList,S1Params,sizeof(S1Params)/sizeof(paramdef_t),aprefix);
-
- S1AP_REGISTER_ENB_REQ (msg_p).nb_mme = 0;
-
- for (int l = 0; l < S1ParamList.numelt; l++) {
-
- S1AP_REGISTER_ENB_REQ (msg_p).nb_mme += 1;
-
- strcpy(S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4_address,*(S1ParamList.paramarray[l][ENB_MME_IPV4_ADDRESS_IDX].strptr));
- strcpy(S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6_address,*(S1ParamList.paramarray[l][ENB_MME_IPV6_ADDRESS_IDX].strptr));
-
-
- if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv4") == 0) {
- S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4 = 1;
- } else if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv6") == 0) {
- S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6 = 1;
- } else if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "no") == 0) {
- S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4 = 1;
- S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6 = 1;
- }
- }
-
-
- // SCTP SETTING
- S1AP_REGISTER_ENB_REQ (msg_p).sctp_out_streams = SCTP_OUT_STREAMS;
- S1AP_REGISTER_ENB_REQ (msg_p).sctp_in_streams = SCTP_IN_STREAMS;
- if (EPC_MODE_ENABLED) {
- sprintf(aprefix,"%s.[%i].%s",ENB_CONFIG_STRING_ENB_LIST,k,ENB_CONFIG_STRING_SCTP_CONFIG);
- config_get( SCTPParams,sizeof(SCTPParams)/sizeof(paramdef_t),aprefix);
- S1AP_REGISTER_ENB_REQ (msg_p).sctp_in_streams = (uint16_t)*(SCTPParams[ENB_SCTP_INSTREAMS_IDX].uptr);
- S1AP_REGISTER_ENB_REQ (msg_p).sctp_out_streams = (uint16_t)*(SCTPParams[ENB_SCTP_OUTSTREAMS_IDX].uptr);
- }
-
- sprintf(aprefix,"%s.[%i].%s",ENB_CONFIG_STRING_ENB_LIST,k,ENB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG);
- // NETWORK_INTERFACES
- config_get( NETParams,sizeof(NETParams)/sizeof(paramdef_t),aprefix);
-
- // S1AP_REGISTER_ENB_REQ (msg_p).enb_interface_name_for_S1U = strdup(enb_interface_name_for_S1U);
- cidr = *(NETParams[ENB_IPV4_ADDRESS_FOR_S1_MME_IDX].strptr);
- address = strtok(cidr, "/");
-
- S1AP_REGISTER_ENB_REQ (msg_p).enb_ip_address.ipv6 = 0;
- S1AP_REGISTER_ENB_REQ (msg_p).enb_ip_address.ipv4 = 1;
-
- strcpy(S1AP_REGISTER_ENB_REQ (msg_p).enb_ip_address.ipv4_address, address);
-
- break;
- }
- }
- }
- }
- }
-return 0;
-}
-
-int RCconfig_X2(MessageDef *msg_p, uint32_t i)
-{
- int j, k, l;
-
- int enb_id;
-
- char *address = NULL;
- char *cidr = NULL;
-
- paramdef_t ENBSParams[] = ENBSPARAMS_DESC;
- paramdef_t ENBParams[] = ENBPARAMS_DESC;
- paramlist_def_t ENBParamList = {ENB_CONFIG_STRING_ENB_LIST,NULL,0};
-
- /* get global parameters, defined outside any section in the config file */
- config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL);
/*#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME)
if (strcasecmp( *(ENBSParams[ENB_ASN1_VERBOSITY_IDX].strptr), ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE) == 0) {
asn_debug = 0;
@@ -2370,13 +2288,13 @@ int RCconfig_X2(MessageDef *msg_p, uint32_t i)
if (ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt > 0) {
// Output a list of all eNBs.
config_getlist( &ENBParamList,ENBParams,sizeof(ENBParams)/sizeof(paramdef_t),NULL);
+
if (ENBParamList.numelt > 0) {
for (k = 0; k < ENBParamList.numelt; k++) {
if (ENBParamList.paramarray[k][ENB_ENB_ID_IDX].uptr == NULL) {
// Calculate a default eNB ID
# if defined(ENABLE_USE_MME)
uint32_t hash;
-
hash = s1ap_generate_eNB_id ();
enb_id = k + (hash & 0xFFFF8);
# else
@@ -2389,16 +2307,14 @@ int RCconfig_X2(MessageDef *msg_p, uint32_t i)
// search if in active list
for (j = 0; j < ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt; j++) {
if (strcmp(ENBSParams[ENB_ACTIVE_ENBS_IDX].strlistptr[j], *(ENBParamList.paramarray[k][ENB_ENB_NAME_IDX].strptr)) == 0) {
-
paramdef_t X2Params[] = X2PARAMS_DESC;
paramlist_def_t X2ParamList = {ENB_CONFIG_STRING_TARGET_ENB_X2_IP_ADDRESS,NULL,0};
-
paramdef_t SCTPParams[] = SCTPPARAMS_DESC;
paramdef_t NETParams[] = NETPARAMS_DESC;
- char aprefix[MAX_OPTNAME_SIZE*2 + 8];
-
+ /* TODO: fix the size - if set lower we have a crash (MAX_OPTNAME_SIZE was 64 when this code was written) */
+ /* this is most probably a problem with the config module */
+ char aprefix[MAX_OPTNAME_SIZE*80 + 8];
/* Some default/random parameters */
-
X2AP_REGISTER_ENB_REQ (msg_p).eNB_id = enb_id;
if (strcmp(*(ENBParamList.paramarray[k][ENB_CELL_TYPE_IDX].strptr), "CELL_MACRO_ENB") == 0) {
@@ -2407,8 +2323,8 @@ int RCconfig_X2(MessageDef *msg_p, uint32_t i)
X2AP_REGISTER_ENB_REQ (msg_p).cell_type = CELL_HOME_ENB;
} else {
AssertFatal (0,
- "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for cell_type choice: CELL_MACRO_ENB or CELL_HOME_ENB !\n",
- RC.config_file_name, i, *(ENBParamList.paramarray[k][ENB_CELL_TYPE_IDX].strptr));
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for cell_type choice: CELL_MACRO_ENB or CELL_HOME_ENB !\n",
+ RC.config_file_name, i, *(ENBParamList.paramarray[k][ENB_CELL_TYPE_IDX].strptr));
}
X2AP_REGISTER_ENB_REQ (msg_p).eNB_name = strdup(*(ENBParamList.paramarray[k][ENB_ENB_NAME_IDX].strptr));
@@ -2416,24 +2332,72 @@ int RCconfig_X2(MessageDef *msg_p, uint32_t i)
X2AP_REGISTER_ENB_REQ (msg_p).mcc = (uint16_t)atoi(*(ENBParamList.paramarray[k][ENB_MOBILE_COUNTRY_CODE_IDX].strptr));
X2AP_REGISTER_ENB_REQ (msg_p).mnc = (uint16_t)atoi(*(ENBParamList.paramarray[k][ENB_MOBILE_NETWORK_CODE_IDX].strptr));
X2AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length = strlen(*(ENBParamList.paramarray[k][ENB_MOBILE_NETWORK_CODE_IDX].strptr));
-
AssertFatal((X2AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length == 2) ||
(X2AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length == 3),
"BAD MNC DIGIT LENGTH %d",
X2AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length);
+ /* CC params */
+ sprintf(aprefix, "%s.[%i]", ENB_CONFIG_STRING_ENB_LIST, k);
+ config_getlist(&CCsParamList, NULL, 0, aprefix);
+
+ X2AP_REGISTER_ENB_REQ (msg_p).num_cc = CCsParamList.numelt;
+
+ if (CCsParamList.numelt > 0) {
+
+ //char ccspath[MAX_OPTNAME_SIZE*2 + 16];
+
+ for (J = 0; J < CCsParamList.numelt ; J++) {
+
+ sprintf(aprefix, "%s.[%i].%s.[%i]", ENB_CONFIG_STRING_ENB_LIST, k, ENB_CONFIG_STRING_COMPONENT_CARRIERS, J);
+ config_get(CCsParams, sizeof(CCsParams)/sizeof(paramdef_t), aprefix);
+
+ X2AP_REGISTER_ENB_REQ (msg_p).eutra_band[J] = eutra_band;
+ X2AP_REGISTER_ENB_REQ (msg_p).downlink_frequency[J] = (uint32_t) downlink_frequency;
+ X2AP_REGISTER_ENB_REQ (msg_p).uplink_frequency_offset[J] = (unsigned int) uplink_frequency_offset;
+ X2AP_REGISTER_ENB_REQ (msg_p).Nid_cell[J]= Nid_cell;
+
+ if (Nid_cell>503) {
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for Nid_cell choice: 0...503 !\n",
+ RC.config_file_name, k, Nid_cell);
+ }
+
+ X2AP_REGISTER_ENB_REQ (msg_p).N_RB_DL[J]= N_RB_DL;
+
+ if ((N_RB_DL!=6) && (N_RB_DL!=15) && (N_RB_DL!=25) && (N_RB_DL!=50) && (N_RB_DL!=75) && (N_RB_DL!=100)) {
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for N_RB_DL choice: 6,15,25,50,75,100 !\n",
+ RC.config_file_name, k, N_RB_DL);
+ }
+
+ if (strcmp(frame_type, "FDD") == 0) {
+ X2AP_REGISTER_ENB_REQ (msg_p).frame_type[J] = FDD;
+ } else if (strcmp(frame_type, "TDD") == 0) {
+ X2AP_REGISTER_ENB_REQ (msg_p).frame_type[J] = TDD;
+ } else {
+ AssertFatal (0,
+ "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for frame_type choice: FDD or TDD !\n",
+ RC.config_file_name, k, frame_type);
+ }
+
+ X2AP_REGISTER_ENB_REQ (msg_p).fdd_earfcn_DL[J] = to_earfcn_DL(eutra_band, downlink_frequency, N_RB_DL);
+ X2AP_REGISTER_ENB_REQ (msg_p).fdd_earfcn_UL[J] = to_earfcn_UL(eutra_band, downlink_frequency + uplink_frequency_offset, N_RB_DL);
+ }
+ }
+
sprintf(aprefix,"%s.[%i]",ENB_CONFIG_STRING_ENB_LIST,k);
config_getlist( &X2ParamList,X2Params,sizeof(X2Params)/sizeof(paramdef_t),aprefix);
- if(X2ParamList.numelt>X2AP_MAX_NB_ENB_IP_ADDRESS){
- LOG_E(RRC,"value of X2ParamList.numelt %d must be lower than X2AP_MAX_NB_ENB_IP_ADDRESS %d value: reconsider to increase X2AP_MAX_NB_ENB_IP_ADDRESS\n",X2ParamList.numelt,X2AP_MAX_NB_ENB_IP_ADDRESS);
- exit(1);
- }
+ if(X2ParamList.numelt>X2AP_MAX_NB_ENB_IP_ADDRESS) {
+ LOG_E(RRC,"value of X2ParamList.numelt %d must be lower than X2AP_MAX_NB_ENB_IP_ADDRESS %d value: reconsider to increase X2AP_MAX_NB_ENB_IP_ADDRESS\n",X2ParamList.numelt,X2AP_MAX_NB_ENB_IP_ADDRESS);
+ exit(1);
+ }
X2AP_REGISTER_ENB_REQ (msg_p).nb_x2 = 0;
+
for (l = 0; l < X2ParamList.numelt; l++) {
X2AP_REGISTER_ENB_REQ (msg_p).nb_x2 += 1;
-
strcpy(X2AP_REGISTER_ENB_REQ (msg_p).target_enb_x2_ip_address[l].ipv4_address,*(X2ParamList.paramarray[l][ENB_X2_IPV4_ADDRESS_IDX].strptr));
strcpy(X2AP_REGISTER_ENB_REQ (msg_p).target_enb_x2_ip_address[l].ipv6_address,*(X2ParamList.paramarray[l][ENB_X2_IPV6_ADDRESS_IDX].strptr));
@@ -2456,12 +2420,9 @@ int RCconfig_X2(MessageDef *msg_p, uint32_t i)
X2AP_REGISTER_ENB_REQ (msg_p).sctp_in_streams = (uint16_t)*(SCTPParams[ENB_SCTP_INSTREAMS_IDX].uptr);
X2AP_REGISTER_ENB_REQ (msg_p).sctp_out_streams = (uint16_t)*(SCTPParams[ENB_SCTP_OUTSTREAMS_IDX].uptr);
#endif
-
sprintf(aprefix,"%s.[%i].%s",ENB_CONFIG_STRING_ENB_LIST,k,ENB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG);
-
// NETWORK_INTERFACES
config_get( NETParams,sizeof(NETParams)/sizeof(paramdef_t),aprefix);
-
X2AP_REGISTER_ENB_REQ (msg_p).enb_port_for_X2C = (uint32_t)*(NETParams[ENB_PORT_FOR_X2C_IDX].uptr);
if ((NETParams[ENB_IPV4_ADDR_FOR_X2C_IDX].strptr == NULL) || (X2AP_REGISTER_ENB_REQ (msg_p).enb_port_for_X2C == 0)) {
@@ -2471,36 +2432,66 @@ int RCconfig_X2(MessageDef *msg_p, uint32_t i)
cidr = *(NETParams[ENB_IPV4_ADDR_FOR_X2C_IDX].strptr);
address = strtok(cidr, "/");
-
X2AP_REGISTER_ENB_REQ (msg_p).enb_x2_ip_address.ipv6 = 0;
X2AP_REGISTER_ENB_REQ (msg_p).enb_x2_ip_address.ipv4 = 1;
-
strcpy(X2AP_REGISTER_ENB_REQ (msg_p).enb_x2_ip_address.ipv4_address, address);
}
}
}
}
}
-return 0;
+
+ return 0;
+}
+
+int RCconfig_parallel(void)
+{
+ char *parallel_conf = NULL;
+ char *worker_conf = NULL;
+ extern char *parallel_config;
+ extern char *worker_config;
+
+ paramdef_t ThreadParams[] = THREAD_CONF_DESC;
+ paramlist_def_t THREADParamList = {THREAD_CONFIG_STRING_THREAD_STRUCT,NULL,0};
+
+ config_getlist( &THREADParamList,NULL,0,NULL);
+
+ if(THREADParamList.numelt>0)
+ {
+ config_getlist( &THREADParamList,ThreadParams,sizeof(ThreadParams)/sizeof(paramdef_t),NULL);
+ parallel_conf = strdup(*(THREADParamList.paramarray[0][THREAD_PARALLEL_IDX].strptr));
+ }
+ else
+ {
+ parallel_conf = strdup("PARALLEL_RU_L1_TRX_SPLIT");
+ }
+ if(THREADParamList.numelt>0)
+ {
+ config_getlist( &THREADParamList,ThreadParams,sizeof(ThreadParams)/sizeof(paramdef_t),NULL);
+ worker_conf = strdup(*(THREADParamList.paramarray[0][THREAD_WORKER_IDX].strptr));
+ }
+ else
+ {
+ worker_conf = strdup("WORKER_ENABLE");
+ }
+
+
+ if(parallel_config == NULL) set_parallel_conf(parallel_conf);
+ if(worker_config == NULL) set_worker_conf(worker_conf);
+
+ return 0;
}
void RCConfig(void) {
-
paramlist_def_t MACRLCParamList = {CONFIG_STRING_MACRLC_LIST,NULL,0};
paramlist_def_t L1ParamList = {CONFIG_STRING_L1_LIST,NULL,0};
paramlist_def_t RUParamList = {CONFIG_STRING_RU_LIST,NULL,0};
paramdef_t ENBSParams[] = ENBSPARAMS_DESC;
paramlist_def_t CCsParamList = {ENB_CONFIG_STRING_COMPONENT_CARRIERS,NULL,0};
-
- char aprefix[MAX_OPTNAME_SIZE*2 + 8];
-
-
-
-/* get global parameters, defined outside any section in the config file */
-
+ char aprefix[MAX_OPTNAME_SIZE*2 + 8];
+ /* get global parameters, defined outside any section in the config file */
printf("Getting ENBSParams\n");
-
- config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL);
+ config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL);
# if defined(ENABLE_USE_MME)
EPC_MODE_ENABLED = ((*ENBSParams[ENB_NOS1_IDX].uptr) == 0);
#endif
@@ -2508,25 +2499,22 @@ void RCConfig(void) {
if (RC.nb_inst > 0) {
RC.nb_CC = (int *)malloc((1+RC.nb_inst)*sizeof(int));
- for (int i=0;i 68\n", eutra_bandP);
+ for (i = 0; i < 69 && eutra_bandtable[i].band != eutra_bandP; i++);
+
+ AssertFatal(dl_CarrierFreq_by_100k >= eutra_bandtable[i].dl_min,
+ "Band %d, bw %u : DL carrier frequency %lld Hz < %u\n",
+ eutra_bandP, bw, dl_CarrierFreq,
+ eutra_bandtable[i].dl_min);
+ AssertFatal(dl_CarrierFreq_by_100k <=
+ (eutra_bandtable[i].dl_max - bw_by_100),
+ "Band %d, bw %u : DL carrier frequency %lld Hz > %d\n",
+ eutra_bandP, bw, dl_CarrierFreq,
+ eutra_bandtable[i].dl_max - bw_by_100);
+
+
+ return (dl_CarrierFreq_by_100k - eutra_bandtable[i].dl_min +
+ (eutra_bandtable[i].N_OFFs_DL / 10));
+}
+
+uint32_t to_earfcn_UL(int eutra_bandP, long long int ul_CarrierFreq, uint32_t bw)
+{
+
+ uint32_t ul_CarrierFreq_by_100k = ul_CarrierFreq / 100000;
+ int bw_by_100 = bw / 100;
+
+ int i;
+
+ AssertFatal(eutra_bandP < 69, "eutra_band %d > 68\n", eutra_bandP);
+ for (i = 0; i < 69 && eutra_bandtable[i].band != eutra_bandP; i++);
+
+ AssertFatal(ul_CarrierFreq_by_100k >= eutra_bandtable[i].ul_min,
+ "Band %d, bw %u : UL carrier frequency %lld Hz < %u\n",
+ eutra_bandP, bw, ul_CarrierFreq,
+ eutra_bandtable[i].ul_min);
+ AssertFatal(ul_CarrierFreq_by_100k <=
+ (eutra_bandtable[i].ul_max - bw_by_100),
+ "Band %d, bw %u : UL carrier frequency %lld Hz > %d\n",
+ eutra_bandP, bw, ul_CarrierFreq,
+ eutra_bandtable[i].ul_max - bw_by_100);
+
+
+ return (ul_CarrierFreq_by_100k - eutra_bandtable[i].ul_min +
+ ((eutra_bandtable[i].N_OFFs_DL + 180000) / 10));
+}
+
uint32_t from_earfcn(int eutra_bandP, uint32_t dl_earfcn)
{
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_phytest.c b/openair2/LAYER2/MAC/eNB_scheduler_phytest.c
index 03def31172..81c418c123 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_phytest.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_phytest.c
@@ -71,7 +71,7 @@ schedule_ue_spec_phy_test(
uint16_t rnti = 0x1235;
uint32_t rb_alloc = 0x1FFFFF;
int32_t tpc = 1;
- int32_t mcs = 10;
+ int32_t mcs = 28;
int32_t cqi = 15;
int32_t ndi = (frameP*10+subframeP)/8;
int32_t dai = 0;
diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c
index e62596aed6..00f814b8b1 100644
--- a/openair2/RRC/LTE/rrc_eNB.c
+++ b/openair2/RRC/LTE/rrc_eNB.c
@@ -7201,29 +7201,24 @@ void rrc_eNB_reconfigure_DRBs (const protocol_ctxt_t* const ctxt_pP,
rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(ctxt_pP, ue_context_pP, 0);
}
-
//-----------------------------------------------------------------------------
-void*
-rrc_enb_task(
- void* args_p
-)
-//-----------------------------------------------------------------------------
-{
- MessageDef *msg_p;
- const char *msg_name_p;
- instance_t instance;
- int result;
- SRB_INFO *srb_info_p;
- int CC_id;
-
- protocol_ctxt_t ctxt;
-
+void rrc_enb_init(void) {
pthread_mutex_init(&lock_ue_freelist, NULL);
pthread_mutex_init(&rrc_release_freelist, NULL);
memset(&rrc_release_info,0,sizeof(RRC_release_list_t));
- itti_mark_task_ready(TASK_RRC_ENB);
- LOG_I(RRC,"Entering main loop of RRC message task\n");
- while (1) {
+}
+
+//-----------------------------------------------------------------------------
+void *rrc_enb_process_itti_msg(void *notUsed) {
+ MessageDef *msg_p;
+ const char *msg_name_p;
+ instance_t instance;
+ int result;
+ SRB_INFO *srb_info_p;
+ int CC_id;
+
+ protocol_ctxt_t ctxt;
+
// Wait for a message
itti_receive_msg(TASK_RRC_ENB, &msg_p);
@@ -7363,9 +7358,28 @@ rrc_enb_task(
result = itti_free(ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
if (result != EXIT_SUCCESS) {
LOG_I(RRC, "Failed to free memory (%d)!\n",result);
- continue;
}
msg_p = NULL;
+ return NULL;
+}
+
+//-----------------------------------------------------------------------------
+void*
+rrc_enb_task(
+ void* args_p
+)
+//-----------------------------------------------------------------------------
+{
+ rrc_enb_init();
+
+ itti_mark_task_ready(TASK_RRC_ENB);
+ LOG_I(RRC,"Entering main loop of RRC message task\n");
+
+
+ while (1) {
+
+ (void) rrc_enb_process_itti_msg(NULL);
+
}
}
#endif
diff --git a/openair2/RRC/LTE/rrc_proto.h b/openair2/RRC/LTE/rrc_proto.h
index e16391aef1..de16f45c2a 100644
--- a/openair2/RRC/LTE/rrc_proto.h
+++ b/openair2/RRC/LTE/rrc_proto.h
@@ -336,6 +336,10 @@ rrc_eNB_reconfigure_DRBs (const protocol_ctxt_t* const ctxt_pP,
rrc_eNB_ue_context_t* ue_context_pP);
#if defined(ENABLE_ITTI)
+
+void rrc_enb_init(void);
+void *rrc_enb_process_itti_msg(void *);
+
/**\brief RRC eNB task.
\param void *args_p Pointer on arguments to start the task. */
void *rrc_enb_task(void *args_p);
diff --git a/openair2/X2AP/x2ap_common.h b/openair2/X2AP/x2ap_common.h
index ceda1c8eb9..a2f903a737 100644
--- a/openair2/X2AP/x2ap_common.h
+++ b/openair2/X2AP/x2ap_common.h
@@ -28,12 +28,12 @@
#include "X2AP_InitiatingMessage.h"
#include "X2AP_SuccessfulOutcome.h"
#include "X2AP_UnsuccessfulOutcome.h"
-#include "X2AP_ProtocolIE-Field.h"
#include "X2AP_ProtocolIE-FieldPair.h"
#include "X2AP_ProtocolIE-ContainerPair.h"
#include "X2AP_ProtocolExtensionField.h"
#include "X2AP_ProtocolExtensionContainer.h"
#include "X2AP_asn_constant.h"
+#include "intertask_interface.h"
#ifndef X2AP_COMMON_H_
#define X2AP_COMMON_H_
@@ -87,15 +87,13 @@ extern int asn1_xer_print;
if (mandatory) DevAssert(ie != NULL); \
} while(0)
-//Forward declaration
-struct x2ap_message_s;
-
/** \brief Function callback prototype.
**/
typedef int (*x2ap_message_decoded_callback)(
+ instance_t instance,
uint32_t assocId,
uint32_t stream,
- struct x2ap_message_s *message);
+ X2AP_X2AP_PDU_t *pdu);
/** \brief Encode a successfull outcome message
\param buffer pointer to buffer in which data will be encoded
diff --git a/openair2/X2AP/x2ap_eNB.c b/openair2/X2AP/x2ap_eNB.c
index a1469509a9..d12dfa8819 100644
--- a/openair2/X2AP/x2ap_eNB.c
+++ b/openair2/X2AP/x2ap_eNB.c
@@ -31,6 +31,7 @@
#include "x2ap_eNB_defs.h"
#include "x2ap_eNB_management_procedures.h"
#include "x2ap_eNB_handler.h"
+#include "x2ap_eNB_generate_messages.h"
#include "x2ap_common.h"
#include "queue.h"
@@ -42,9 +43,9 @@ struct x2ap_eNB_data_s;
RB_PROTOTYPE(x2ap_enb_map, x2ap_eNB_data_s, entry, x2ap_eNB_compare_assoc_id);
-//static
-//void x2ap_eNB_handle_sctp_data_ind(instance_t instance,
- // sctp_data_ind_t *sctp_data_ind);
+static
+void x2ap_eNB_handle_sctp_data_ind(instance_t instance, sctp_data_ind_t *sctp_data_ind);
+
static
void x2ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp);
@@ -63,22 +64,21 @@ void x2ap_eNB_register_eNB(x2ap_eNB_instance_t *instance_p,
uint32_t enb_port_for_X2C,
int multi_sd);
-/*
+
static
-void x2ap_eNB_handle_sctp_data_ind(instance_t instance,
- sctp_data_ind_t *sctp_data_ind) {
+void x2ap_eNB_handle_sctp_data_ind(instance_t instance, sctp_data_ind_t *sctp_data_ind) {
int result;
DevAssert(sctp_data_ind != NULL);
- x2ap_eNB_handle_message(sctp_data_ind->assoc_id, sctp_data_ind->stream,
+ x2ap_eNB_handle_message(instance, sctp_data_ind->assoc_id, sctp_data_ind->stream,
sctp_data_ind->buffer, sctp_data_ind->buffer_length);
result = itti_free(TASK_UNKNOWN, sctp_data_ind->buffer);
AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
-}*/
+}
static
void x2ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp)
@@ -143,7 +143,7 @@ printf("x2ap_eNB_handle_sctp_association_resp at 4\n");
dump_trees();
/* Prepare new x2 Setup Request */
- //x2ap_eNB_generate_x2_setup_request(instance_p, x2ap_enb_data_p);
+ x2ap_eNB_generate_x2_setup_request(instance_p, x2ap_enb_data_p);
}
static
@@ -325,6 +325,19 @@ void x2ap_eNB_handle_register_eNB(instance_t instance,
new_instance->mnc = x2ap_register_eNB->mnc;
new_instance->mnc_digit_length = x2ap_register_eNB->mnc_digit_length;
+ new_instance->num_cc = x2ap_register_eNB->num_cc;
+
+ for (int i = 0; i< x2ap_register_eNB->num_cc; i++){
+ new_instance->eutra_band[i] = x2ap_register_eNB->eutra_band[i];
+ new_instance->downlink_frequency[i] = x2ap_register_eNB->downlink_frequency[i];
+ new_instance->uplink_frequency_offset[i] = x2ap_register_eNB->uplink_frequency_offset[i];
+ new_instance->Nid_cell[i] = x2ap_register_eNB->Nid_cell[i];
+ new_instance->N_RB_DL[i] = x2ap_register_eNB->N_RB_DL[i];
+ new_instance->frame_type[i] = x2ap_register_eNB->frame_type[i];
+ new_instance->fdd_earfcn_DL[i] = x2ap_register_eNB->fdd_earfcn_DL[i];
+ new_instance->fdd_earfcn_UL[i] = x2ap_register_eNB->fdd_earfcn_UL[i];
+ }
+
DevCheck(x2ap_register_eNB->nb_x2 <= X2AP_MAX_NB_ENB_IP_ADDRESS,
X2AP_MAX_NB_ENB_IP_ADDRESS, x2ap_register_eNB->nb_x2, 0);
memcpy(new_instance->target_enb_x2_ip_address,
@@ -432,8 +445,8 @@ void *x2ap_task(void *arg)
break;
case SCTP_DATA_IND:
- //x2ap_eNB_handle_sctp_data_ind(ITTI_MESSAGE_GET_INSTANCE(received_msg),
- // &received_msg->ittiMsg.sctp_data_ind);
+ x2ap_eNB_handle_sctp_data_ind(ITTI_MESSAGE_GET_INSTANCE(received_msg),
+ &received_msg->ittiMsg.sctp_data_ind);
break;
default:
diff --git a/openair2/X2AP/x2ap_eNB_decoder.c b/openair2/X2AP/x2ap_eNB_decoder.c
new file mode 100644
index 0000000000..f156d96d17
--- /dev/null
+++ b/openair2/X2AP/x2ap_eNB_decoder.c
@@ -0,0 +1,127 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1 (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ * contact@openairinterface.org
+ */
+
+#include
+
+#include "assertions.h"
+#include "intertask_interface.h"
+#include "x2ap_common.h"
+#include "x2ap_eNB_decoder.h"
+
+static int x2ap_eNB_decode_initiating_message(X2AP_X2AP_PDU_t *pdu)
+{
+ DevAssert(pdu != NULL);
+
+ switch(pdu->choice.initiatingMessage.procedureCode) {
+
+ case X2AP_ProcedureCode_id_x2Setup:
+ asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_X2AP_X2AP_PDU, pdu);
+ X2AP_INFO("x2ap_eNB_decode_initiating_message!\n");
+ break;
+
+ default:
+ X2AP_ERROR("Unknown procedure ID (%d) for initiating message\n",
+ (int)pdu->choice.initiatingMessage.procedureCode);
+ AssertFatal( 0, "Unknown procedure ID (%d) for initiating message\n",
+ (int)pdu->choice.initiatingMessage.procedureCode);
+ return -1;
+ }
+
+ return 0;
+}
+
+static int x2ap_eNB_decode_successful_outcome(X2AP_X2AP_PDU_t *pdu)
+{
+ DevAssert(pdu != NULL);
+
+ switch(pdu->choice.successfulOutcome.procedureCode) {
+ case X2AP_ProcedureCode_id_x2Setup:
+ asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_X2AP_X2AP_PDU, pdu);
+ X2AP_INFO("x2ap_eNB_decode_successfuloutcome_message!\n");
+ break;
+
+ default:
+ X2AP_ERROR("Unknown procedure ID (%d) for successfull outcome message\n",
+ (int)pdu->choice.successfulOutcome.procedureCode);
+ return -1;
+ }
+
+ return 0;
+}
+
+static int x2ap_eNB_decode_unsuccessful_outcome(X2AP_X2AP_PDU_t *pdu)
+{
+ DevAssert(pdu != NULL);
+
+ switch(pdu->choice.unsuccessfulOutcome.procedureCode) {
+ case X2AP_ProcedureCode_id_x2Setup:
+ asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_X2AP_X2AP_PDU, pdu);
+ X2AP_INFO("x2ap_eNB_decode_unsuccessfuloutcome_message!\n");
+ break;
+
+ default:
+ X2AP_ERROR("Unknown procedure ID (%d) for unsuccessfull outcome message\n",
+ (int)pdu->choice.unsuccessfulOutcome.procedureCode);
+ return -1;
+ }
+
+ return 0;
+}
+
+int x2ap_eNB_decode_pdu(X2AP_X2AP_PDU_t *pdu, const uint8_t *const buffer, uint32_t length)
+{
+ asn_dec_rval_t dec_ret;
+
+ DevAssert(buffer != NULL);
+
+ dec_ret = aper_decode(NULL,
+ &asn_DEF_X2AP_X2AP_PDU,
+ (void **)&pdu,
+ buffer,
+ length,
+ 0,
+ 0);
+
+ xer_fprint(stdout, &asn_DEF_X2AP_X2AP_PDU, pdu);
+
+ if (dec_ret.code != RC_OK) {
+ X2AP_ERROR("Failed to decode pdu\n");
+ return -1;
+ }
+
+ switch(pdu->present) {
+ case X2AP_X2AP_PDU_PR_initiatingMessage:
+ return x2ap_eNB_decode_initiating_message(pdu);
+
+ case X2AP_X2AP_PDU_PR_successfulOutcome:
+ return x2ap_eNB_decode_successful_outcome(pdu);
+
+ case X2AP_X2AP_PDU_PR_unsuccessfulOutcome:
+ return x2ap_eNB_decode_unsuccessful_outcome(pdu);
+
+ default:
+ X2AP_DEBUG("Unknown presence (%d) or not implemented\n", (int)pdu->present);
+ break;
+ }
+
+
+ return -1;
+}
diff --git a/openair2/X2AP/x2ap_eNB_decoder.h b/openair2/X2AP/x2ap_eNB_decoder.h
new file mode 100644
index 0000000000..9ce9ea3d40
--- /dev/null
+++ b/openair2/X2AP/x2ap_eNB_decoder.h
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1 (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ * contact@openairinterface.org
+ */
+
+#ifndef X2AP_ENB_DECODER_H_
+#define X2AP_ENB_DECODER_H_
+
+int x2ap_eNB_decode_pdu(X2AP_X2AP_PDU_t *pdu, const uint8_t *const buffer, uint32_t length)
+__attribute__ ((warn_unused_result));
+
+#endif /* X2AP_ENB_DECODER_H_ */
+
diff --git a/openair2/X2AP/x2ap_eNB_defs.h b/openair2/X2AP/x2ap_eNB_defs.h
index 11b4434dc0..3014290206 100644
--- a/openair2/X2AP/x2ap_eNB_defs.h
+++ b/openair2/X2AP/x2ap_eNB_defs.h
@@ -151,6 +151,17 @@ typedef struct x2ap_eNB_instance_s {
uint16_t mnc;
uint8_t mnc_digit_length;
+ /* CC params */
+ int16_t eutra_band[MAX_NUM_CCs];
+ uint32_t downlink_frequency[MAX_NUM_CCs];
+ int32_t uplink_frequency_offset[MAX_NUM_CCs];
+ uint32_t Nid_cell[MAX_NUM_CCs];
+ int16_t N_RB_DL[MAX_NUM_CCs];
+ lte_frame_type_t frame_type[MAX_NUM_CCs];
+ uint32_t fdd_earfcn_DL[MAX_NUM_CCs];
+ uint32_t fdd_earfcn_UL[MAX_NUM_CCs];
+ int num_cc;
+
net_ip_address_t target_enb_x2_ip_address[X2AP_MAX_NB_ENB_IP_ADDRESS];
uint8_t nb_x2;
net_ip_address_t enb_x2_ip_address;
diff --git a/openair2/X2AP/x2ap_eNB_encoder.c b/openair2/X2AP/x2ap_eNB_encoder.c
new file mode 100644
index 0000000000..1eb617a7f1
--- /dev/null
+++ b/openair2/X2AP/x2ap_eNB_encoder.c
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1 (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ * contact@openairinterface.org
+ */
+
+#include
+#include
+#include
+
+#include "assertions.h"
+#include "conversions.h"
+#include "intertask_interface.h"
+#include "x2ap_common.h"
+#include "x2ap_eNB_encoder.h"
+
+int x2ap_eNB_encode_pdu(X2AP_X2AP_PDU_t *pdu, uint8_t **buffer, uint32_t *len)
+{
+ ssize_t encoded;
+
+ DevAssert(pdu != NULL);
+ DevAssert(buffer != NULL);
+ DevAssert(len != NULL);
+
+ if (asn1_xer_print) {
+ xer_fprint(stdout, &asn_DEF_X2AP_X2AP_PDU, (void *)pdu);
+ }
+
+ encoded = aper_encode_to_new_buffer(&asn_DEF_X2AP_X2AP_PDU, 0, pdu, (void **)buffer);
+
+ if (encoded < 0) {
+ return -1;
+ }
+
+ *len = encoded;
+
+ ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_X2AP_X2AP_PDU, pdu);
+ return encoded;
+}
diff --git a/openair2/X2AP/x2ap_eNB_encoder.h b/openair2/X2AP/x2ap_eNB_encoder.h
new file mode 100644
index 0000000000..04c77583b4
--- /dev/null
+++ b/openair2/X2AP/x2ap_eNB_encoder.h
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1 (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ * contact@openairinterface.org
+ */
+
+#ifndef X2AP_ENB_ENCODER_H_
+#define X2AP_ENB_ENCODER_H_
+
+int x2ap_eNB_encode_pdu(X2AP_X2AP_PDU_t *pdu, uint8_t **buffer, uint32_t *len)
+__attribute__ ((warn_unused_result));
+
+#endif /* X2AP_ENB_ENCODER_H_ */
diff --git a/openair2/X2AP/x2ap_eNB_generate_messages.c b/openair2/X2AP/x2ap_eNB_generate_messages.c
new file mode 100644
index 0000000000..9c5a281506
--- /dev/null
+++ b/openair2/X2AP/x2ap_eNB_generate_messages.c
@@ -0,0 +1,405 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1 (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ * contact@openairinterface.org
+ */
+
+#include "intertask_interface.h"
+
+#include "x2ap_common.h"
+#include "x2ap_eNB.h"
+#include "x2ap_eNB_generate_messages.h"
+#include "x2ap_eNB_encoder.h"
+
+#include "x2ap_eNB_itti_messaging.h"
+
+#include "msc.h"
+#include "assertions.h"
+#include "conversions.h"
+
+int x2ap_eNB_generate_x2_setup_request(
+ x2ap_eNB_instance_t *instance_p, x2ap_eNB_data_t *x2ap_eNB_data_p)
+{
+ X2AP_X2AP_PDU_t pdu;
+ X2AP_X2SetupRequest_t *out;
+ X2AP_X2SetupRequest_IEs_t *ie;
+ X2AP_PLMN_Identity_t *plmn;
+ ServedCells__Member *servedCellMember;
+ X2AP_GU_Group_ID_t *gu;
+
+ uint8_t *buffer;
+ uint32_t len;
+ int ret = 0;
+
+ DevAssert(instance_p != NULL);
+ DevAssert(x2ap_eNB_data_p != NULL);
+
+ x2ap_eNB_data_p->state = X2AP_ENB_STATE_WAITING;
+
+ /* Prepare the X2AP message to encode */
+ memset(&pdu, 0, sizeof(pdu));
+ pdu.present = X2AP_X2AP_PDU_PR_initiatingMessage;
+ pdu.choice.initiatingMessage.procedureCode = X2AP_ProcedureCode_id_x2Setup;
+ pdu.choice.initiatingMessage.criticality = X2AP_Criticality_reject;
+ pdu.choice.initiatingMessage.value.present = X2AP_InitiatingMessage__value_PR_X2SetupRequest;
+ out = &pdu.choice.initiatingMessage.value.choice.X2SetupRequest;
+
+ /* mandatory */
+ ie = (X2AP_X2SetupRequest_IEs_t *)calloc(1, sizeof(X2AP_X2SetupRequest_IEs_t));
+ ie->id = X2AP_ProtocolIE_ID_id_GlobalENB_ID;
+ ie->criticality = X2AP_Criticality_reject;
+ ie->value.present = X2AP_X2SetupRequest_IEs__value_PR_GlobalENB_ID;
+ MCC_MNC_TO_PLMNID(instance_p->mcc, instance_p->mnc, instance_p->mnc_digit_length,
+ &ie->value.choice.GlobalENB_ID.pLMN_Identity);
+ ie->value.choice.GlobalENB_ID.eNB_ID.present = X2AP_ENB_ID_PR_macro_eNB_ID;
+ MACRO_ENB_ID_TO_BIT_STRING(instance_p->eNB_id,
+ &ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID);
+ X2AP_INFO("%d -> %02x%02x%02x\n", instance_p->eNB_id,
+ ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID.buf[0],
+ ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID.buf[1],
+ ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID.buf[2]);
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+ /* mandatory */
+ ie = (X2AP_X2SetupRequest_IEs_t *)calloc(1, sizeof(X2AP_X2SetupRequest_IEs_t));
+ ie->id = X2AP_ProtocolIE_ID_id_ServedCells;
+ ie->criticality = X2AP_Criticality_reject;
+ ie->value.present = X2AP_X2SetupRequest_IEs__value_PR_ServedCells;
+ {
+ for (int i = 0; inum_cc; i++){
+ servedCellMember = (ServedCells__Member *)calloc(1,sizeof(ServedCells__Member));
+ {
+ servedCellMember->servedCellInfo.pCI = instance_p->Nid_cell[i];
+
+ MCC_MNC_TO_PLMNID(instance_p->mcc, instance_p->mnc, instance_p->mnc_digit_length,
+ &servedCellMember->servedCellInfo.cellId.pLMN_Identity);
+ MACRO_ENB_ID_TO_CELL_IDENTITY(instance_p->eNB_id,0,
+ &servedCellMember->servedCellInfo.cellId.eUTRANcellIdentifier);
+
+ INT16_TO_OCTET_STRING(instance_p->tac, &servedCellMember->servedCellInfo.tAC);
+ plmn = (X2AP_PLMN_Identity_t *)calloc(1,sizeof(X2AP_PLMN_Identity_t));
+ {
+ MCC_MNC_TO_PLMNID(instance_p->mcc, instance_p->mnc, instance_p->mnc_digit_length, plmn);
+ ASN_SEQUENCE_ADD(&servedCellMember->servedCellInfo.broadcastPLMNs.list, plmn);
+ }
+
+ if (instance_p->frame_type[i] == FDD) {
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.present = X2AP_EUTRA_Mode_Info_PR_fDD;
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_EARFCN = instance_p->fdd_earfcn_DL[i];
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_EARFCN = instance_p->fdd_earfcn_UL[i];
+ switch (instance_p->N_RB_DL[i]) {
+ case 6:
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw6;
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw6;
+ break;
+ case 15:
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw15;
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw15;
+ break;
+ case 25:
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw25;
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw25;
+ break;
+ case 50:
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw50;
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw50;
+ break;
+ case 75:
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw75;
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw75;
+ break;
+ case 100:
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw100;
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw100;
+ break;
+ default:
+ AssertFatal(0,"Failed: Check value for N_RB_DL/N_RB_UL");
+ break;
+ }
+ }
+ else {
+ AssertFatal(0,"X2Setuprequest not supported for TDD!");
+ }
+ }
+ ASN_SEQUENCE_ADD(&ie->value.choice.ServedCells.list, servedCellMember);
+ }
+ }
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+ /* mandatory */
+ ie = (X2AP_X2SetupRequest_IEs_t *)calloc(1, sizeof(X2AP_X2SetupRequest_IEs_t));
+ ie->id = X2AP_ProtocolIE_ID_id_GUGroupIDList;
+ ie->criticality = X2AP_Criticality_reject;
+ ie->value.present = X2AP_X2SetupRequest_IEs__value_PR_GUGroupIDList;
+ {
+ gu = (X2AP_GU_Group_ID_t *)calloc(1, sizeof(X2AP_GU_Group_ID_t));
+ {
+ MCC_MNC_TO_PLMNID(instance_p->mcc, instance_p->mnc, instance_p->mnc_digit_length,
+ &gu->pLMN_Identity);
+ //@TODO: consider to update this value
+ INT16_TO_OCTET_STRING(0, &gu->mME_Group_ID);
+ }
+ ASN_SEQUENCE_ADD(&ie->value.choice.GUGroupIDList.list, gu);
+ }
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+ if (x2ap_eNB_encode_pdu(&pdu, &buffer, &len) < 0) {
+ X2AP_ERROR("Failed to encode X2 setup request\n");
+ return -1;
+ }
+
+ MSC_LOG_TX_MESSAGE (MSC_X2AP_SRC_ENB, MSC_X2AP_TARGET_ENB, NULL, 0, "0 X2Setup/initiatingMessage assoc_id %u", x2ap_eNB_data_p->assoc_id);
+
+ x2ap_eNB_itti_send_sctp_data_req(instance_p->instance, x2ap_eNB_data_p->assoc_id, buffer, len, 0);
+
+ return ret;
+}
+
+int x2ap_eNB_generate_x2_setup_response(x2ap_eNB_data_t *x2ap_eNB_data_p)
+{
+ X2AP_X2AP_PDU_t pdu;
+ X2AP_X2SetupResponse_t *out;
+ X2AP_X2SetupResponse_IEs_t *ie;
+ X2AP_PLMN_Identity_t *plmn;
+ ServedCells__Member *servedCellMember;
+ X2AP_GU_Group_ID_t *gu;
+
+ x2ap_eNB_instance_t *instance_p;
+
+ uint8_t *buffer;
+ uint32_t len;
+ int ret = 0;
+
+ DevAssert(x2ap_eNB_data_p != NULL);
+
+ /* get the eNB instance */
+ instance_p = x2ap_eNB_data_p->x2ap_eNB_instance;
+
+ DevAssert(instance_p != NULL);
+
+ /* Prepare the X2AP message to encode */
+ memset(&pdu, 0, sizeof(pdu));
+ pdu.present = X2AP_X2AP_PDU_PR_successfulOutcome;
+ pdu.choice.successfulOutcome.procedureCode = X2AP_ProcedureCode_id_x2Setup;
+ pdu.choice.successfulOutcome.criticality = X2AP_Criticality_reject;
+ pdu.choice.successfulOutcome.value.present = X2AP_SuccessfulOutcome__value_PR_X2SetupResponse;
+ out = &pdu.choice.successfulOutcome.value.choice.X2SetupResponse;
+
+ /* mandatory */
+ ie = (X2AP_X2SetupResponse_IEs_t *)calloc(1, sizeof(X2AP_X2SetupResponse_IEs_t));
+ ie->id = X2AP_ProtocolIE_ID_id_GlobalENB_ID;
+ ie->criticality = X2AP_Criticality_reject;
+ ie->value.present = X2AP_X2SetupResponse_IEs__value_PR_GlobalENB_ID;
+ MCC_MNC_TO_PLMNID(instance_p->mcc, instance_p->mnc, instance_p->mnc_digit_length,
+ &ie->value.choice.GlobalENB_ID.pLMN_Identity);
+ ie->value.choice.GlobalENB_ID.eNB_ID.present = X2AP_ENB_ID_PR_macro_eNB_ID;
+ MACRO_ENB_ID_TO_BIT_STRING(instance_p->eNB_id,
+ &ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID);
+ X2AP_INFO("%d -> %02x%02x%02x\n", instance_p->eNB_id,
+ ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID.buf[0],
+ ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID.buf[1],
+ ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID.buf[2]);
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+ /* mandatory */
+ ie = (X2AP_X2SetupResponse_IEs_t *)calloc(1, sizeof(X2AP_X2SetupResponse_IEs_t));
+ ie->id = X2AP_ProtocolIE_ID_id_ServedCells;
+ ie->criticality = X2AP_Criticality_reject;
+ ie->value.present = X2AP_X2SetupResponse_IEs__value_PR_ServedCells;
+ {
+ for (int i = 0; inum_cc; i++){
+ servedCellMember = (ServedCells__Member *)calloc(1,sizeof(ServedCells__Member));
+ {
+ servedCellMember->servedCellInfo.pCI = instance_p->Nid_cell[i];
+
+ MCC_MNC_TO_PLMNID(instance_p->mcc, instance_p->mnc, instance_p->mnc_digit_length,
+ &servedCellMember->servedCellInfo.cellId.pLMN_Identity);
+ MACRO_ENB_ID_TO_CELL_IDENTITY(instance_p->eNB_id,0,
+ &servedCellMember->servedCellInfo.cellId.eUTRANcellIdentifier);
+
+ INT16_TO_OCTET_STRING(instance_p->tac, &servedCellMember->servedCellInfo.tAC);
+ plmn = (X2AP_PLMN_Identity_t *)calloc(1,sizeof(X2AP_PLMN_Identity_t));
+ {
+ MCC_MNC_TO_PLMNID(instance_p->mcc, instance_p->mnc, instance_p->mnc_digit_length, plmn);
+ ASN_SEQUENCE_ADD(&servedCellMember->servedCellInfo.broadcastPLMNs.list, plmn);
+ }
+
+ if (instance_p->frame_type[i] == FDD) {
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.present = X2AP_EUTRA_Mode_Info_PR_fDD;
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_EARFCN = instance_p->fdd_earfcn_DL[i];
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_EARFCN = instance_p->fdd_earfcn_UL[i];
+ switch (instance_p->N_RB_DL[i]) {
+ case 6:
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw6;
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw6;
+ break;
+ case 15:
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw15;
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw15;
+ break;
+ case 25:
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw25;
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw25;
+ break;
+ case 50:
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw50;
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw50;
+ break;
+ case 75:
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw75;
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw75;
+ break;
+ case 100:
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw100;
+ servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw100;
+ break;
+ default:
+ AssertFatal(0,"Failed: Check value for N_RB_DL/N_RB_UL");
+ break;
+ }
+ }
+ else {
+ AssertFatal(0,"X2Setupresponse not supported for TDD!");
+ }
+ }
+ ASN_SEQUENCE_ADD(&ie->value.choice.ServedCells.list, servedCellMember);
+ }
+ }
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+ /* mandatory */
+ ie = (X2AP_X2SetupResponse_IEs_t *)calloc(1, sizeof(X2AP_X2SetupResponse_IEs_t));
+ ie->id = X2AP_ProtocolIE_ID_id_GUGroupIDList;
+ ie->criticality = X2AP_Criticality_reject;
+ ie->value.present = X2AP_X2SetupResponse_IEs__value_PR_GUGroupIDList;
+ {
+ gu = (X2AP_GU_Group_ID_t *)calloc(1, sizeof(X2AP_GU_Group_ID_t));
+ {
+ MCC_MNC_TO_PLMNID(instance_p->mcc, instance_p->mnc, instance_p->mnc_digit_length,
+ &gu->pLMN_Identity);
+ //@TODO: consider to update this value
+ INT16_TO_OCTET_STRING(0, &gu->mME_Group_ID);
+ }
+ ASN_SEQUENCE_ADD(&ie->value.choice.GUGroupIDList.list, gu);
+ }
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+ if (x2ap_eNB_encode_pdu(&pdu, &buffer, &len) < 0) {
+ X2AP_ERROR("Failed to encode X2 setup response\n");
+ return -1;
+ }
+
+ x2ap_eNB_data_p->state = X2AP_ENB_STATE_READY;
+
+ MSC_LOG_TX_MESSAGE (MSC_X2AP_SRC_ENB, MSC_X2AP_TARGET_ENB, NULL, 0, "0 X2Setup/successfulOutcome assoc_id %u", x2ap_eNB_data_p->assoc_id);
+
+ x2ap_eNB_itti_send_sctp_data_req(instance_p->instance, x2ap_eNB_data_p->assoc_id, buffer, len, 0);
+
+ return ret;
+}
+
+int x2ap_eNB_generate_x2_setup_failure(instance_t instance,
+ uint32_t assoc_id,
+ X2AP_Cause_PR cause_type,
+ long cause_value,
+ long time_to_wait)
+{
+ X2AP_X2AP_PDU_t pdu;
+ X2AP_X2SetupFailure_t *out;
+ X2AP_X2SetupFailure_IEs_t *ie;
+
+ uint8_t *buffer;
+ uint32_t len;
+ int ret = 0;
+
+ /* Prepare the X2AP message to encode */
+ memset(&pdu, 0, sizeof(pdu));
+ pdu.present = X2AP_X2AP_PDU_PR_unsuccessfulOutcome;
+ pdu.choice.unsuccessfulOutcome.procedureCode = X2AP_ProcedureCode_id_x2Setup;
+ pdu.choice.unsuccessfulOutcome.criticality = X2AP_Criticality_reject;
+ pdu.choice.unsuccessfulOutcome.value.present = X2AP_UnsuccessfulOutcome__value_PR_X2SetupFailure;
+ out = &pdu.choice.unsuccessfulOutcome.value.choice.X2SetupFailure;
+
+ /* mandatory */
+ ie = (X2AP_X2SetupFailure_IEs_t *)calloc(1, sizeof(X2AP_X2SetupFailure_IEs_t));
+ ie->id = X2AP_ProtocolIE_ID_id_Cause;
+ ie->criticality = X2AP_Criticality_ignore;
+ ie->value.present = X2AP_X2SetupFailure_IEs__value_PR_Cause;
+
+ x2ap_eNB_set_cause (&ie->value.choice.Cause, cause_type, cause_value);
+
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+ /* optional: consider to handle this later */
+ ie = (X2AP_X2SetupFailure_IEs_t *)calloc(1, sizeof(X2AP_X2SetupFailure_IEs_t));
+ ie->id = X2AP_ProtocolIE_ID_id_TimeToWait;
+ ie->criticality = X2AP_Criticality_ignore;
+ ie->value.present = X2AP_X2SetupFailure_IEs__value_PR_TimeToWait;
+
+ if (time_to_wait > -1) {
+ ie->value.choice.TimeToWait = time_to_wait;
+ }
+
+ ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+ if (x2ap_eNB_encode_pdu(&pdu, &buffer, &len) < 0) {
+ X2AP_ERROR("Failed to encode X2 setup failure\n");
+ return -1;
+ }
+
+ MSC_LOG_TX_MESSAGE (MSC_X2AP_SRC_ENB,
+ MSC_X2AP_TARGET_ENB, NULL, 0,
+ "0 X2Setup/unsuccessfulOutcome assoc_id %u cause %u value %u",
+ assoc_id, cause_type, cause_value);
+
+ x2ap_eNB_itti_send_sctp_data_req(instance, assoc_id, buffer, len, 0);
+
+ return ret;
+}
+
+int x2ap_eNB_set_cause (X2AP_Cause_t * cause_p,
+ X2AP_Cause_PR cause_type,
+ long cause_value)
+{
+
+ DevAssert (cause_p != NULL);
+ cause_p->present = cause_type;
+
+ switch (cause_type) {
+ case X2AP_Cause_PR_radioNetwork:
+ cause_p->choice.misc = cause_value;
+ break;
+
+ case X2AP_Cause_PR_transport:
+ cause_p->choice.misc = cause_value;
+ break;
+
+ case X2AP_Cause_PR_protocol:
+ cause_p->choice.misc = cause_value;
+ break;
+
+ case X2AP_Cause_PR_misc:
+ cause_p->choice.misc = cause_value;
+ break;
+
+ default:
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/openair2/X2AP/x2ap_eNB_generate_messages.h b/openair2/X2AP/x2ap_eNB_generate_messages.h
new file mode 100644
index 0000000000..a72b37e743
--- /dev/null
+++ b/openair2/X2AP/x2ap_eNB_generate_messages.h
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1 (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ * contact@openairinterface.org
+ */
+
+#ifndef X2AP_ENB_GENERATE_MESSAGES_H_
+#define X2AP_ENB_GENERATE_MESSAGES_H_
+
+#include "x2ap_eNB_defs.h"
+#include "x2ap_common.h"
+
+int x2ap_eNB_generate_x2_setup_request(x2ap_eNB_instance_t *instance_p,
+ x2ap_eNB_data_t *x2ap_enb_data_p);
+
+int x2ap_eNB_generate_x2_setup_response(x2ap_eNB_data_t *x2ap_enb_data_p);
+
+int x2ap_eNB_generate_x2_setup_failure(instance_t instance,
+ uint32_t assoc_id,
+ X2AP_Cause_PR cause_type,
+ long cause_value,
+ long time_to_wait);
+
+int x2ap_eNB_set_cause (X2AP_Cause_t * cause_p,
+ X2AP_Cause_PR cause_type,
+ long cause_value);
+
+#endif /* X2AP_ENB_GENERATE_MESSAGES_H_ */
+
diff --git a/openair2/X2AP/x2ap_eNB_handler.c b/openair2/X2AP/x2ap_eNB_handler.c
index 180535baa6..a16a3da5a8 100644
--- a/openair2/X2AP/x2ap_eNB_handler.c
+++ b/openair2/X2AP/x2ap_eNB_handler.c
@@ -27,12 +27,72 @@
#include "x2ap_common.h"
#include "x2ap_eNB_defs.h"
#include "x2ap_eNB_handler.h"
+#include "x2ap_eNB_decoder.h"
#include "x2ap_eNB_management_procedures.h"
+#include "x2ap_eNB_generate_messages.h"
+#include "msc.h"
#include "assertions.h"
#include "conversions.h"
+static
+int x2ap_eNB_handle_x2_setup_request (instance_t instance,
+ uint32_t assoc_id,
+ uint32_t stream,
+ X2AP_X2AP_PDU_t *pdu);
+static
+int x2ap_eNB_handle_x2_setup_response (instance_t instance,
+ uint32_t assoc_id,
+ uint32_t stream,
+ X2AP_X2AP_PDU_t *pdu);
+static
+int x2ap_eNB_handle_x2_setup_failure (instance_t instance,
+ uint32_t assoc_id,
+ uint32_t stream,
+ X2AP_X2AP_PDU_t *pdu);
+
+/* Handlers matrix. Only eNB related procedure present here */
+x2ap_message_decoded_callback x2ap_messages_callback[][3] = {
+ { 0, 0, 0 }, /* handoverPreparation */
+ { 0, 0, 0 }, /* handoverCancel */
+ { 0, 0, 0 }, /* loadIndication */
+ { 0, 0, 0 }, /* errorIndication */
+ { 0, 0, 0 }, /* snStatusTransfer */
+ { 0, 0, 0 }, /* uEContextRelease */
+ { x2ap_eNB_handle_x2_setup_request, x2ap_eNB_handle_x2_setup_response, x2ap_eNB_handle_x2_setup_failure }, /* x2Setup */
+ { 0, 0, 0 }, /* reset */
+ { 0, 0, 0 }, /* eNBConfigurationUpdate */
+ { 0, 0, 0 }, /* resourceStatusReportingInitiation */
+ { 0, 0, 0 }, /* resourceStatusReporting */
+ { 0, 0, 0 }, /* privateMessage */
+ { 0, 0, 0 }, /* mobilitySettingsChange */
+ { 0, 0, 0 }, /* rLFIndication */
+ { 0, 0, 0 }, /* handoverReport */
+ { 0, 0, 0 }, /* cellActivation */
+ { 0, 0, 0 }, /* x2Release */
+ { 0, 0, 0 }, /* x2APMessageTransfer */
+ { 0, 0, 0 }, /* x2Removal */
+ { 0, 0, 0 }, /* seNBAdditionPreparation */
+ { 0, 0, 0 }, /* seNBReconfigurationCompletion */
+ { 0, 0, 0 }, /* meNBinitiatedSeNBModificationPreparation */
+ { 0, 0, 0 }, /* seNBinitiatedSeNBModification */
+ { 0, 0, 0 }, /* meNBinitiatedSeNBRelease */
+ { 0, 0, 0 }, /* seNBinitiatedSeNBRelease */
+ { 0, 0, 0 }, /* seNBCounterCheck */
+ { 0, 0, 0 } /* retrieveUEContext */
+};
+
+char *x2ap_direction2String(int x2ap_dir) {
+static char *x2ap_direction_String[] = {
+ "", /* Nothing */
+ "Originating message", /* originating message */
+ "Successfull outcome", /* successfull outcome */
+ "UnSuccessfull outcome", /* successfull outcome */
+};
+return(x2ap_direction_String[x2ap_dir]);
+}
+
void x2ap_handle_x2_setup_message(x2ap_eNB_data_t *enb_desc_p, int sctp_shutdown)
{
if (sctp_shutdown) {
@@ -77,3 +137,296 @@ void x2ap_handle_x2_setup_message(x2ap_eNB_data_t *enb_desc_p, int sctp_shutdown
}
}
}
+
+
+int x2ap_eNB_handle_message(instance_t instance, uint32_t assoc_id, int32_t stream,
+ const uint8_t *const data, const uint32_t data_length)
+{
+ X2AP_X2AP_PDU_t pdu;
+ int ret;
+
+ DevAssert(data != NULL);
+
+ memset(&pdu, 0, sizeof(pdu));
+
+ if (x2ap_eNB_decode_pdu(&pdu, data, data_length) < 0) {
+ X2AP_ERROR("Failed to decode PDU\n");
+ return -1;
+ }
+
+ /* Checking procedure Code and direction of message */
+ if (pdu.choice.initiatingMessage.procedureCode > sizeof(x2ap_messages_callback) / (3 * sizeof(
+ x2ap_message_decoded_callback))
+ || (pdu.present > X2AP_X2AP_PDU_PR_unsuccessfulOutcome)) {
+ X2AP_ERROR("[SCTP %d] Either procedureCode %ld or direction %d exceed expected\n",
+ assoc_id, pdu.choice.initiatingMessage.procedureCode, pdu.present);
+ ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_X2AP_X2AP_PDU, &pdu);
+ return -1;
+ }
+
+ /* No handler present.
+ * This can mean not implemented or no procedure for eNB (wrong direction).
+ */
+ if (x2ap_messages_callback[pdu.choice.initiatingMessage.procedureCode][pdu.present - 1] == NULL) {
+ X2AP_ERROR("[SCTP %d] No handler for procedureCode %ld in %s\n",
+ assoc_id, pdu.choice.initiatingMessage.procedureCode,
+ x2ap_direction2String(pdu.present - 1));
+ ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_X2AP_X2AP_PDU, &pdu);
+ return -1;
+ }
+
+ /* Calling the right handler */
+ ret = (*x2ap_messages_callback[pdu.choice.initiatingMessage.procedureCode][pdu.present - 1])
+ (instance, assoc_id, stream, &pdu);
+ ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_X2AP_X2AP_PDU, &pdu);
+ return ret;
+}
+
+int
+x2ap_eNB_handle_x2_setup_request(instance_t instance,
+ uint32_t assoc_id,
+ uint32_t stream,
+ X2AP_X2AP_PDU_t *pdu)
+{
+
+ X2AP_X2SetupRequest_t *x2SetupRequest;
+ X2AP_X2SetupRequest_IEs_t *ie;
+
+ x2ap_eNB_data_t *x2ap_eNB_data;
+ uint32_t eNB_id = 0;
+
+ DevAssert (pdu != NULL);
+ x2SetupRequest = &pdu->choice.initiatingMessage.value.choice.X2SetupRequest;
+
+ /*
+ * We received a new valid X2 Setup Request on a stream != 0.
+ * * * * This should not happen -> reject eNB x2 setup request.
+ */
+
+ if (stream != 0) {
+ X2AP_ERROR("Received new x2 setup request on stream != 0\n");
+ /*
+ * Send a x2 setup failure with protocol cause unspecified
+ */
+ return x2ap_eNB_generate_x2_setup_failure (instance,
+ assoc_id,
+ X2AP_Cause_PR_protocol,
+ X2AP_CauseProtocol_unspecified,
+ -1);
+ }
+
+ X2AP_DEBUG("Received a new X2 setup request\n");
+
+ X2AP_FIND_PROTOCOLIE_BY_ID(X2AP_X2SetupRequest_IEs_t, ie, x2SetupRequest,
+ X2AP_ProtocolIE_ID_id_GlobalENB_ID, true);
+
+ if (ie->value.choice.GlobalENB_ID.eNB_ID.present == X2AP_ENB_ID_PR_home_eNB_ID) {
+ // Home eNB ID = 28 bits
+ uint8_t *eNB_id_buf = ie->value.choice.GlobalENB_ID.eNB_ID.choice.home_eNB_ID.buf;
+
+ if (ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID.size != 28) {
+ //TODO: handle case were size != 28 -> notify ? reject ?
+ }
+
+ eNB_id = (eNB_id_buf[0] << 20) + (eNB_id_buf[1] << 12) + (eNB_id_buf[2] << 4) + ((eNB_id_buf[3] & 0xf0) >> 4);
+ X2AP_DEBUG("Home eNB id: %07x\n", eNB_id);
+ } else {
+ // Macro eNB = 20 bits
+ uint8_t *eNB_id_buf = ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID.buf;
+
+ if (ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID.size != 20) {
+ //TODO: handle case were size != 20 -> notify ? reject ?
+ }
+
+ eNB_id = (eNB_id_buf[0] << 12) + (eNB_id_buf[1] << 4) + ((eNB_id_buf[2] & 0xf0) >> 4);
+ X2AP_DEBUG("macro eNB id: %05x\n", eNB_id);
+ }
+
+ X2AP_DEBUG("Adding eNB to the list of associated eNBs\n");
+
+ if ((x2ap_eNB_data = x2ap_is_eNB_id_in_list (eNB_id)) == NULL) {
+ /*
+ * eNB has not been found in list of associated eNB,
+ * * * * Add it to the tail of list and initialize data
+ */
+ if ((x2ap_eNB_data = x2ap_is_eNB_assoc_id_in_list (assoc_id)) == NULL) {
+ /*
+ * ??
+ */
+ return -1;
+ } else {
+ x2ap_eNB_data->state = X2AP_ENB_STATE_RESETTING;
+ x2ap_eNB_data->eNB_id = eNB_id;
+ }
+ } else {
+ x2ap_eNB_data->state = X2AP_ENB_STATE_RESETTING;
+ /*
+ * eNB has been found in list, consider the x2 setup request as a reset connection,
+ * * * * reseting any previous UE state if sctp association is != than the previous one
+ */
+ if (x2ap_eNB_data->assoc_id != assoc_id) {
+ /*
+ * ??: Send an overload cause...
+ */
+ X2AP_ERROR("Rejecting x2 setup request as eNB id %d is already associated to an active sctp association" "Previous known: %d, new one: %d\n", eNB_id, x2ap_eNB_data->assoc_id, assoc_id);
+
+ DevAssert(x2ap_eNB_data->x2ap_eNB_instance != NULL);
+ x2ap_eNB_generate_x2_setup_failure (x2ap_eNB_data->x2ap_eNB_instance->instance,
+ assoc_id,
+ X2AP_Cause_PR_protocol,
+ X2AP_CauseProtocol_unspecified,
+ -1);
+ return -1;
+ }
+ /*
+ * TODO: call the reset procedure
+ */
+ }
+
+ return x2ap_eNB_generate_x2_setup_response(x2ap_eNB_data);
+}
+
+static
+int x2ap_eNB_handle_x2_setup_response(instance_t instance,
+ uint32_t assoc_id,
+ uint32_t stream,
+ X2AP_X2AP_PDU_t *pdu)
+{
+
+ X2AP_X2SetupResponse_t *x2SetupResponse;
+ X2AP_X2SetupResponse_IEs_t *ie;
+
+ x2ap_eNB_data_t *x2ap_eNB_data;
+ uint32_t eNB_id = 0;
+
+ DevAssert (pdu != NULL);
+ x2SetupResponse = &pdu->choice.successfulOutcome.value.choice.X2SetupResponse;
+
+ /*
+ * We received a new valid X2 Setup Response on a stream != 0.
+ * * * * This should not happen -> reject eNB x2 setup response.
+ */
+
+ if (stream != 0) {
+ X2AP_ERROR("Received new x2 setup response on stream != 0\n");
+ }
+
+ if ((x2ap_eNB_data = x2ap_get_eNB(NULL, assoc_id, 0)) == NULL) {
+ X2AP_ERROR("[SCTP %d] Received X2 setup response for non existing "
+ "eNB context\n", assoc_id);
+ return -1;
+ }
+
+ X2AP_DEBUG("Received a new X2 setup response\n");
+
+ X2AP_FIND_PROTOCOLIE_BY_ID(X2AP_X2SetupResponse_IEs_t, ie, x2SetupResponse,
+ X2AP_ProtocolIE_ID_id_GlobalENB_ID, true);
+
+ if (ie->value.choice.GlobalENB_ID.eNB_ID.present == X2AP_ENB_ID_PR_home_eNB_ID) {
+ // Home eNB ID = 28 bits
+ uint8_t *eNB_id_buf = ie->value.choice.GlobalENB_ID.eNB_ID.choice.home_eNB_ID.buf;
+
+ if (ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID.size != 28) {
+ //TODO: handle case were size != 28 -> notify ? reject ?
+ }
+
+ eNB_id = (eNB_id_buf[0] << 20) + (eNB_id_buf[1] << 12) + (eNB_id_buf[2] << 4) + ((eNB_id_buf[3] & 0xf0) >> 4);
+ X2AP_DEBUG("Home eNB id: %07x\n", eNB_id);
+ } else {
+ // Macro eNB = 20 bits
+ uint8_t *eNB_id_buf = ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID.buf;
+
+ if (ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID.size != 20) {
+ //TODO: handle case were size != 20 -> notify ? reject ?
+ }
+
+ eNB_id = (eNB_id_buf[0] << 12) + (eNB_id_buf[1] << 4) + ((eNB_id_buf[2] & 0xf0) >> 4);
+ X2AP_DEBUG("macro eNB id: %05x\n", eNB_id);
+ }
+
+ X2AP_DEBUG("Adding eNB to the list of associated eNBs\n");
+
+ if ((x2ap_eNB_data = x2ap_is_eNB_id_in_list (eNB_id)) == NULL) {
+ /*
+ * eNB has not been found in list of associated eNB,
+ * * * * Add it to the tail of list and initialize data
+ */
+ if ((x2ap_eNB_data = x2ap_is_eNB_assoc_id_in_list (assoc_id)) == NULL) {
+ /*
+ * ??: Send an overload cause...
+ */
+ return -1;
+ } else {
+ x2ap_eNB_data->state = X2AP_ENB_STATE_RESETTING;
+ x2ap_eNB_data->eNB_id = eNB_id;
+ }
+ } else {
+ x2ap_eNB_data->state = X2AP_ENB_STATE_RESETTING;
+ /*
+ * TODO: call the reset procedure
+ */
+ }
+
+ /* Optionaly set the target eNB name */
+
+ /* The association is now ready as source and target eNBs know parameters of each other.
+ * Mark the association as connected.
+ */
+ x2ap_eNB_data->state = X2AP_ENB_STATE_READY;
+ x2ap_eNB_data->x2ap_eNB_instance->x2_target_enb_associated_nb ++;
+ x2ap_handle_x2_setup_message(x2ap_eNB_data, 0);
+
+ return 0;
+}
+
+static
+int x2ap_eNB_handle_x2_setup_failure(instance_t instance,
+ uint32_t assoc_id,
+ uint32_t stream,
+ X2AP_X2AP_PDU_t *pdu)
+{
+
+ X2AP_X2SetupFailure_t *x2SetupFailure;
+ X2AP_X2SetupFailure_IEs_t *ie;
+
+ x2ap_eNB_data_t *x2ap_eNB_data;
+
+ DevAssert(pdu != NULL);
+
+ x2SetupFailure = &pdu->choice.unsuccessfulOutcome.value.choice.X2SetupFailure;
+
+ /*
+ * We received a new valid X2 Setup Failure on a stream != 0.
+ * * * * This should not happen -> reject eNB x2 setup failure.
+ */
+
+ if (stream != 0) {
+ X2AP_WARN("[SCTP %d] Received x2 setup failure on stream != 0 (%d)\n",
+ assoc_id, stream);
+ }
+
+ if ((x2ap_eNB_data = x2ap_get_eNB (NULL, assoc_id, 0)) == NULL) {
+ X2AP_ERROR("[SCTP %d] Received X2 setup failure for non existing "
+ "eNB context\n", assoc_id);
+ return -1;
+ }
+
+ X2AP_DEBUG("Received a new X2 setup failure\n");
+
+ X2AP_FIND_PROTOCOLIE_BY_ID(X2AP_X2SetupFailure_IEs_t, ie, x2SetupFailure,
+ X2AP_ProtocolIE_ID_id_Cause, true);
+
+
+ // need a FSM to handle all cases
+ if ((ie->value.choice.Cause.present == X2AP_Cause_PR_misc) &&
+ (ie->value.choice.Cause.choice.misc == X2AP_CauseMisc_unspecified)) {
+ X2AP_WARN("Received X2 setup failure for eNB ... eNB is not ready\n");
+ } else {
+ X2AP_ERROR("Received x2 setup failure for eNB... please check your parameters\n");
+ }
+
+ x2ap_eNB_data->state = X2AP_ENB_STATE_WAITING;
+ x2ap_handle_x2_setup_message(x2ap_eNB_data, 0);
+
+ return 0;
+}
diff --git a/openair2/X2AP/x2ap_eNB_handler.h b/openair2/X2AP/x2ap_eNB_handler.h
index 6d65c25a0a..0f93859a84 100644
--- a/openair2/X2AP/x2ap_eNB_handler.h
+++ b/openair2/X2AP/x2ap_eNB_handler.h
@@ -24,10 +24,10 @@
#include "x2ap_eNB_defs.h"
-void x2ap_handle_x2_setup_message(x2ap_eNB_data_t *mme_desc_p, int sctp_shutdown);
+void x2ap_handle_x2_setup_message(x2ap_eNB_data_t *eNB_desc_p, int sctp_shutdown);
-//int x2ap_eNB_handle_message(uint32_t assoc_id, int32_t stream,
- // const uint8_t * const data, const uint32_t data_length);
+int x2ap_eNB_handle_message(instance_t instance, uint32_t assoc_id, int32_t stream,
+ const uint8_t * const data, const uint32_t data_length);
#endif /* X2AP_ENB_HANDLERS_H_ */
diff --git a/openair2/X2AP/x2ap_eNB_itti_messaging.c b/openair2/X2AP/x2ap_eNB_itti_messaging.c
new file mode 100644
index 0000000000..d8e1e19afe
--- /dev/null
+++ b/openair2/X2AP/x2ap_eNB_itti_messaging.c
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1 (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ * contact@openairinterface.org
+ */
+
+#include "intertask_interface.h"
+
+#include "x2ap_eNB_itti_messaging.h"
+
+void x2ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint8_t *buffer,
+ uint32_t buffer_length, uint16_t stream)
+{
+ MessageDef *message_p;
+ sctp_data_req_t *sctp_data_req;
+
+ message_p = itti_alloc_new_message(TASK_X2AP, SCTP_DATA_REQ);
+
+ sctp_data_req = &message_p->ittiMsg.sctp_data_req;
+
+ sctp_data_req->assoc_id = assoc_id;
+ sctp_data_req->buffer = buffer;
+ sctp_data_req->buffer_length = buffer_length;
+ sctp_data_req->stream = stream;
+
+ itti_send_msg_to_task(TASK_SCTP, instance, message_p);
+}
+
+
+void x2ap_eNB_itti_send_sctp_close_association(instance_t instance, int32_t assoc_id)
+{
+ MessageDef *message_p = NULL;
+ sctp_close_association_t *sctp_close_association_p = NULL;
+
+ message_p = itti_alloc_new_message(TASK_X2AP, SCTP_CLOSE_ASSOCIATION);
+ sctp_close_association_p = &message_p->ittiMsg.sctp_close_association;
+ sctp_close_association_p->assoc_id = assoc_id;
+
+ itti_send_msg_to_task(TASK_SCTP, instance, message_p);
+}
+
diff --git a/openair2/X2AP/x2ap_eNB_itti_messaging.h b/openair2/X2AP/x2ap_eNB_itti_messaging.h
new file mode 100644
index 0000000000..55bf58b660
--- /dev/null
+++ b/openair2/X2AP/x2ap_eNB_itti_messaging.h
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1 (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ * contact@openairinterface.org
+ */
+
+#ifndef X2AP_ENB_ITTI_MESSAGING_H_
+#define X2AP_ENB_ITTI_MESSAGING_H_
+
+void x2ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint8_t *buffer,
+ uint32_t buffer_length, uint16_t stream);
+
+
+void x2ap_eNB_itti_send_sctp_close_association(instance_t instance, int32_t assoc_id);
+
+
+#endif /* X2AP_ENB_ITTI_MESSAGING_H_ */
diff --git a/openair3/GTPV1-U/gtpv1u_eNB.c b/openair3/GTPV1-U/gtpv1u_eNB.c
index 20c104ad1f..1e2cd85710 100644
--- a/openair3/GTPV1-U/gtpv1u_eNB.c
+++ b/openair3/GTPV1-U/gtpv1u_eNB.c
@@ -49,120 +49,13 @@
#include "common/utils/LOG/vcd_signal_dumper.h"
#include "common/ran_context.h"
#include "gtpv1u_eNB_defs.h"
+#include "gtpv1u_eNB_task.h"
#undef GTP_DUMP_SOCKET
-/*
-extern boolean_t pdcp_data_req(
- const protocol_ctxt_t* const ctxt_pP,
- const srb_flag_t srb_flagP,
- const rb_id_t rb_idP,
- const mui_t muiP,
- const confirm_t confirmP,
- const sdu_size_t sdu_buffer_sizeP,
- unsigned char *const sdu_buffer_pP,
- const pdcp_transmission_mode_t modeP
-#if (RRC_VERSION >= MAKE_VERSION(14, 0, 0))
- ,const uint32_t * const sourceL2Id
- ,const uint32_t * const destinationL2Id
-#endif
- );
-
- const pdcp_transmission_mode_t modeP);
-*/
extern unsigned char NB_eNB_INST;
extern RAN_CONTEXT_t RC;
-static int
-gtpv1u_eNB_send_init_udp(
- uint16_t port_number);
-
-NwGtpv1uRcT
-gtpv1u_eNB_log_request(
- NwGtpv1uLogMgrHandleT hLogMgr,
- uint32_t logLevel,
- NwCharT *file,
- uint32_t line,
- NwCharT *logStr);
-
-NwGtpv1uRcT
-gtpv1u_eNB_send_udp_msg(
- NwGtpv1uUdpHandleT udpHandle,
- uint8_t *buffer,
- uint32_t buffer_len,
- uint32_t buffer_offset,
- uint32_t peerIpAddr,
- uint16_t peerPort);
-
-NwGtpv1uRcT
-gtpv1u_eNB_process_stack_req(
- NwGtpv1uUlpHandleT hUlp,
- NwGtpv1uUlpApiT *pUlpApi);
-
-int
-data_recv_callback(
- uint16_t portP,
- uint32_t address,
- uint8_t *buffer,
- uint32_t length,
- void *arg_p);
-//int
-//gtpv1u_create_tunnel_endpoint(
-// gtpv1u_data_t *gtpv1u_data_pP,
-// uint8_t ue_idP,
-// uint8_t rab_idP,
-// char *sgw_ip_addr_pP,
-// uint16_t portP);
-static NwGtpv1uRcT
-gtpv1u_start_timer_wrapper(
- NwGtpv1uTimerMgrHandleT tmrMgrHandle,
- uint32_t timeoutSec,
- uint32_t timeoutUsec,
- uint32_t tmrType,
- void *timeoutArg,
- NwGtpv1uTimerHandleT *hTmr);
-
-static NwGtpv1uRcT
-gtpv1u_stop_timer_wrapper(
- NwGtpv1uTimerMgrHandleT tmrMgrHandle,
- NwGtpv1uTimerHandleT hTmr);
-
-int
-gtpv1u_initial_req(
- gtpv1u_data_t *gtpv1u_data_pP,
- teid_t teidP,
- tcp_udp_port_t portP,
- uint32_t address);
-
-int
-gtpv1u_new_data_req(
- uint8_t enb_module_idP,
- rnti_t ue_rntiP,
- uint8_t rab_idP,
- uint8_t *buffer_pP,
- uint32_t buf_lenP,
- uint32_t buf_offsetP
-);
-
-int
-gtpv1u_create_s1u_tunnel(
- const instance_t instanceP,
- const gtpv1u_enb_create_tunnel_req_t * const create_tunnel_req_pP,
- gtpv1u_enb_create_tunnel_resp_t * const create_tunnel_resp_pP);
-
-static int
-gtpv1u_delete_s1u_tunnel(
- const instance_t instanceP,
- const gtpv1u_enb_delete_tunnel_req_t * const req_pP);
-
-static int
-gtpv1u_eNB_init(void);
-
-void *
-gtpv1u_eNB_task(void *args);
-
-//static gtpv1u_data_t gtpv1u_data_g;
-
#if defined(GTP_DUMP_SOCKET) && GTP_DUMP_SOCKET > 0
#include
static int gtpv1u_dump_socket_g;
@@ -215,11 +108,11 @@ static void gtpv1u_eNB_write_dump_socket(uint8_t *buffer_pP, uint32_t buffer_len
#endif
//-----------------------------------------------------------------------------
-static int gtpv1u_eNB_send_init_udp(uint16_t port_number)
+static int gtpv1u_eNB_send_init_udp(const Gtpv1uS1Req * req)
{
// Create and alloc new message
MessageDef *message_p;
- struct in_addr addr;
+ struct in_addr addr={0};
message_p = itti_alloc_new_message(TASK_GTPV1_U, UDP_INIT);
@@ -227,12 +120,10 @@ static int gtpv1u_eNB_send_init_udp(uint16_t port_number)
return -1;
}
- UDP_INIT(message_p).port = port_number;
- //LG UDP_INIT(message_p).address = "0.0.0.0"; //ANY address
-
- addr.s_addr = RC.gtpv1u_data_g->enb_ip_address_for_S1u_S12_S4_up;
+ UDP_INIT(message_p).port = req->enb_port_for_S1u_S12_S4_up;
+ addr.s_addr = req->enb_ip_address_for_S1u_S12_S4_up;
UDP_INIT(message_p).address = inet_ntoa(addr);
- LOG_I(GTPU, "Tx UDP_INIT IP addr %s (%x)\n", UDP_INIT(message_p).address,RC.gtpv1u_data_g->enb_ip_address_for_S1u_S12_S4_up);
+ LOG_I(GTPU, "Tx UDP_INIT IP addr %s (%x)\n", UDP_INIT(message_p).address,UDP_INIT(message_p).port);
MSC_LOG_EVENT(
MSC_GTPU_ENB,
@@ -242,6 +133,16 @@ static int gtpv1u_eNB_send_init_udp(uint16_t port_number)
return itti_send_msg_to_task(TASK_UDP, INSTANCE_DEFAULT, message_p);
}
+static int gtpv1u_s1_req(
+ const instance_t instanceP,
+ const Gtpv1uS1Req * const req) {
+ memcpy(&RC.gtpv1u_data_g->enb_ip_address_for_S1u_S12_S4_up,
+ &req->enb_ip_address_for_S1u_S12_S4_up,
+ sizeof (req->enb_ip_address_for_S1u_S12_S4_up));
+ gtpv1u_eNB_send_init_udp(req);
+ return 0;
+}
+
//-----------------------------------------------------------------------------
NwGtpv1uRcT gtpv1u_eNB_log_request(NwGtpv1uLogMgrHandleT hLogMgr,
uint32_t logLevel,
@@ -999,23 +900,17 @@ static int gtpv1u_delete_s1u_tunnel(
//-----------------------------------------------------------------------------
-static int gtpv1u_eNB_init(void)
+int gtpv1u_eNB_init(void)
{
- int ret;
NwGtpv1uRcT rc = NW_GTPV1U_FAILURE;
NwGtpv1uUlpEntityT ulp;
NwGtpv1uUdpEntityT udp;
NwGtpv1uLogMgrEntityT log;
NwGtpv1uTimerMgrEntityT tmr;
-
// enb_properties_p = enb_config_get()->properties[0];
- RC.gtpv1u_data_g = (gtpv1u_data_t*)malloc(sizeof(gtpv1u_data_t));
- memset(RC.gtpv1u_data_g, 0, sizeof(gtpv1u_data_t));
-
- RCconfig_gtpu();
-
-
+ RC.gtpv1u_data_g = (gtpv1u_data_t*)calloc(sizeof(gtpv1u_data_t),1);
+
LOG_I(GTPU, "Initializing GTPU stack %p\n",&RC.gtpv1u_data_g);
//gtpv1u_data_g.gtpv1u_stack;
/* Initialize UE hashtable */
@@ -1024,7 +919,6 @@ static int gtpv1u_eNB_init(void)
RC.gtpv1u_data_g->teid_mapping = hashtable_create (256, NULL, NULL);
AssertFatal(RC.gtpv1u_data_g->teid_mapping != NULL, " ERROR Initializing TASK_GTPV1_U task interface: in hashtable_create\n");
// RC.gtpv1u_data_g.enb_ip_address_for_S1u_S12_S4_up = enb_properties_p->enb_ipv4_address_for_S1U;
- RC.gtpv1u_data_g->ip_addr = NULL;
//gtpv1u_data_g.udp_data;
RC.gtpv1u_data_g->seq_num = 0;
@@ -1089,35 +983,21 @@ static int gtpv1u_eNB_init(void)
}
#endif
- ret = gtpv1u_eNB_send_init_udp(RC.gtpv1u_data_g->enb_port_for_S1u_S12_S4_up);
-
- if (ret < 0) {
- return ret;
- }
LOG_D(GTPU, "Initializing GTPV1U interface for eNB: DONE\n");
return 0;
}
-
//-----------------------------------------------------------------------------
-void *gtpv1u_eNB_task(void *args)
-{
- int rc = 0;
- instance_t instance;
- //const char *msg_name_p;
-
- rc = gtpv1u_eNB_init();
- AssertFatal(rc == 0, "gtpv1u_eNB_init Failed");
- itti_mark_task_ready(TASK_GTPV1_U);
- MSC_START_USE();
-
- while(1) {
+void *gtpv1u_eNB_process_itti_msg(void *notUsed) {
/* Trying to fetch a message from the message queue.
* If the queue is empty, this function will block till a
* message is sent to the task.
*/
+ instance_t instance;
MessageDef *received_message_p = NULL;
+ int rc = 0;
+
itti_receive_msg(TASK_GTPV1_U, &received_message_p);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GTPV1U_ENB_TASK, VCD_FUNCTION_IN);
DevAssert(received_message_p != NULL);
@@ -1127,6 +1007,9 @@ void *gtpv1u_eNB_task(void *args)
switch (ITTI_MSG_ID(received_message_p)) {
+ case GTPV1U_ENB_S1_REQ:
+ gtpv1u_s1_req(instance, &received_message_p->ittiMsg.gtpv1uS1Req);
+
case GTPV1U_ENB_DELETE_TUNNEL_REQ: {
gtpv1u_delete_s1u_tunnel(instance, &received_message_p->ittiMsg.Gtpv1uDeleteTunnelReq);
}
@@ -1258,6 +1141,22 @@ void *gtpv1u_eNB_task(void *args)
AssertFatal(rc == EXIT_SUCCESS, "Failed to free memory (%d)!\n", rc);
received_message_p = NULL;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GTPV1U_ENB_TASK, VCD_FUNCTION_OUT);
+
+ return NULL;
+}
+
+//-----------------------------------------------------------------------------
+void *gtpv1u_eNB_task(void *args)
+{
+ int rc = 0;
+
+ rc = gtpv1u_eNB_init();
+ AssertFatal(rc == 0, "gtpv1u_eNB_init Failed");
+ itti_mark_task_ready(TASK_GTPV1_U);
+ MSC_START_USE();
+
+ while(1) {
+ (void) gtpv1u_eNB_process_itti_msg (NULL);
}
return NULL;
diff --git a/openair3/GTPV1-U/gtpv1u_eNB_defs.h b/openair3/GTPV1-U/gtpv1u_eNB_defs.h
index ddd996625e..db928c4438 100644
--- a/openair3/GTPV1-U/gtpv1u_eNB_defs.h
+++ b/openair3/GTPV1-U/gtpv1u_eNB_defs.h
@@ -97,8 +97,6 @@ typedef struct gtpv1u_data_s {
//RB_HEAD(gtpv1u_ue_map, gtpv1u_ue_data_s) gtpv1u_ue_map_head;
/* Local IP address to use */
in_addr_t enb_ip_address_for_S1u_S12_S4_up;
- char *ip_addr;
- tcp_udp_port_t enb_port_for_S1u_S12_S4_up;
/* UDP internal data */
//udp_data_t udp_data;
diff --git a/openair3/GTPV1-U/gtpv1u_eNB_task.h b/openair3/GTPV1-U/gtpv1u_eNB_task.h
index 6afea103ef..9830ea6169 100644
--- a/openair3/GTPV1-U/gtpv1u_eNB_task.h
+++ b/openair3/GTPV1-U/gtpv1u_eNB_task.h
@@ -40,6 +40,8 @@ gtpv1u_new_data_req(
uint32_t buf_len,
uint32_t buf_offset);*/
+int gtpv1u_eNB_init(void);
+void *gtpv1u_eNB_process_itti_msg(void*);
void *gtpv1u_eNB_task(void *args);
int
diff --git a/openair3/S1AP/s1ap_eNB.c b/openair3/S1AP/s1ap_eNB.c
index 2a6db4a5ce..a617963686 100644
--- a/openair3/S1AP/s1ap_eNB.c
+++ b/openair3/S1AP/s1ap_eNB.c
@@ -286,19 +286,20 @@ void s1ap_eNB_handle_sctp_data_ind(sctp_data_ind_t *sctp_data_ind)
AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
}
-void *s1ap_eNB_task(void *arg)
+void s1ap_eNB_init(void)
{
- MessageDef *received_msg = NULL;
- int result;
-
S1AP_DEBUG("Starting S1AP layer\n");
s1ap_eNB_prepare_internal_data();
itti_mark_task_ready(TASK_S1AP);
MSC_START_USE();
+}
- while (1) {
+void *s1ap_eNB_process_itti_msg(void* notUsed)
+{
+ MessageDef *received_msg = NULL;
+ int result;
itti_receive_msg(TASK_S1AP, &received_msg);
switch (ITTI_MSG_ID(received_msg)) {
@@ -413,6 +414,16 @@ void *s1ap_eNB_task(void *arg)
AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
received_msg = NULL;
+ return NULL;
+}
+
+
+void *s1ap_eNB_task(void *arg)
+{
+ s1ap_eNB_init();
+
+ while (1) {
+ (void) s1ap_eNB_process_itti_msg(NULL);
}
return NULL;
diff --git a/openair3/S1AP/s1ap_eNB.h b/openair3/S1AP/s1ap_eNB.h
index e122703d82..2abbc53ec9 100644
--- a/openair3/S1AP/s1ap_eNB.h
+++ b/openair3/S1AP/s1ap_eNB.h
@@ -39,6 +39,8 @@ extern s1ap_eNB_config_t s1ap_config;
#define EPC_MODE_ENABLED s1ap_config.mme_enabled
+void *s1ap_eNB_process_itti_msg(void*);
+void s1ap_eNB_init(void);
void *s1ap_eNB_task(void *arg);
uint32_t s1ap_generate_eNB_id(void);
diff --git a/openair3/SCTP/sctp_eNB_task.c b/openair3/SCTP/sctp_eNB_task.c
index 6071b0da13..e7265d66d6 100644
--- a/openair3/SCTP/sctp_eNB_task.c
+++ b/openair3/SCTP/sctp_eNB_task.c
@@ -1039,15 +1039,9 @@ sctp_eNB_flush_sockets(
}
}
-
//------------------------------------------------------------------------------
-void *sctp_eNB_task(void *arg)
+void sctp_eNB_init(void)
{
- int nb_events;
- struct epoll_event *events;
- MessageDef *received_msg = NULL;
- int result;
-
SCTP_DEBUG("Starting SCTP layer\n");
STAILQ_INIT(&sctp_cnx_list);
@@ -1055,7 +1049,16 @@ void *sctp_eNB_task(void *arg)
itti_mark_task_ready(TASK_SCTP);
MSC_START_USE();
- while (1) {
+}
+
+//------------------------------------------------------------------------------
+void *sctp_eNB_process_itti_msg(void *notUsed)
+{
+ int nb_events;
+ struct epoll_event *events;
+ MessageDef *received_msg = NULL;
+ int result;
+
itti_receive_msg(TASK_SCTP, &received_msg);
/* Check if there is a packet to handle */
@@ -1142,6 +1145,17 @@ void *sctp_eNB_task(void *arg)
nb_events = itti_get_events(TASK_SCTP, &events);
/* Now handle notifications for other sockets */
sctp_eNB_flush_sockets(events, nb_events);
+
+ return NULL;
+}
+
+//------------------------------------------------------------------------------
+void *sctp_eNB_task(void *arg)
+{
+ sctp_eNB_init();
+
+ while (1) {
+ (void) sctp_eNB_process_itti_msg(NULL);
}
return NULL;
diff --git a/openair3/SCTP/sctp_eNB_task.h b/openair3/SCTP/sctp_eNB_task.h
index 31cb683102..e23e80675e 100644
--- a/openair3/SCTP/sctp_eNB_task.h
+++ b/openair3/SCTP/sctp_eNB_task.h
@@ -22,6 +22,8 @@
#ifndef SCTP_ENB_TASK_H_
#define SCTP_ENB_TASK_H_
+void sctp_eNB_init(void);
+void *sctp_eNB_process_itti_msg(void *);
void *sctp_eNB_task(void *arg);
#endif /* SCTP_ENB_TASK_H_ */
diff --git a/targets/ARCH/tcp_bridge/tcp_bridge_oai.c b/targets/ARCH/tcp_bridge/tcp_bridge_oai.c
index 4d7d49d9c7..32fddb9c2d 100644
--- a/targets/ARCH/tcp_bridge/tcp_bridge_oai.c
+++ b/targets/ARCH/tcp_bridge/tcp_bridge_oai.c
@@ -44,6 +44,7 @@ typedef struct {
int sock;
int samples_per_subframe;
uint64_t timestamp;
+ uint64_t next_tx_timestamp;
int is_enb;
} tcp_bridge_state_t;
@@ -141,11 +142,27 @@ int tcp_bridge_write(openair0_device *device, openair0_timestamp timestamp, void
{
if (cc != 1) { printf("tcp_bridge: only 1 antenna supported\n"); exit(1); }
tcp_bridge_state_t *t = device->priv;
+ /* deal with discontinuities in output (think: eNB in TDD mode) */
+ if (t->next_tx_timestamp && timestamp != t->next_tx_timestamp) {
+ uint32_t b[4096];
+ uint64_t to_send = timestamp - t->next_tx_timestamp;
+ memset(b, 0, 4096 * sizeof(uint32_t));
+ while (to_send) {
+ int len = to_send > 4096 ? 4096 : to_send;
+ int n = fullwrite(t->sock, b, len * 4);
+ if (n != len * 4) {
+ printf("tcp_bridge: write error ret %d error %s\n", n, strerror(errno));
+ abort();
+ }
+ to_send -= len;
+ }
+ }
int n = fullwrite(t->sock, buff[0], nsamps * 4);
if (n != nsamps * 4) {
printf("tcp_bridge: write error ret %d (wanted %d) error %s\n", n, nsamps*4, strerror(errno));
abort();
}
+ t->next_tx_timestamp = timestamp + nsamps;
return nsamps;
}
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.100PRB.usrpx310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.100PRB.usrpx310.conf
index bec9c2c6dd..2761fe5fdb 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.100PRB.usrpx310.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.100PRB.usrpx310.conf
@@ -156,6 +156,15 @@ eNBs =
ENB_PORT_FOR_X2C = 36422; # Spec 36422
};
+THREAD_STRUCT = (
+ {
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+ }
+);
+
log_config :
{
global_log_level ="debug";
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.usrpx310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.usrpx310.conf
index 834b6cf044..56b3c37c0a 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.usrpx310.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.usrpx310.conf
@@ -156,6 +156,15 @@ eNBs =
ENB_PORT_FOR_X2C = 36422; # Spec 36422
};
+THREAD_STRUCT = (
+ {
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+ }
+);
+
log_config :
{
global_log_level ="debug";
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf
index 6b3614f490..f088eda84f 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf
@@ -193,6 +193,15 @@ RUs = (
}
);
+THREAD_STRUCT = (
+ {
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+ }
+);
+
log_config :
{
global_log_level ="info";
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.replay.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.replay.conf
index fb184549c5..3bd4b1275a 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.replay.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.replay.conf
@@ -235,6 +235,15 @@ NETWORK_CONTROLLER :
FLEXRAN_CACHE = "/mnt/oai_agent_cache";
FLEXRAN_AWAIT_RECONF = "no";
};
+
+THREAD_STRUCT = (
+ {
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+ }
+);
/*
log_config :
{
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210-d2d.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210-d2d.conf
index c6ace3b68f..a419122846 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210-d2d.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210-d2d.conf
@@ -225,6 +225,15 @@ RUs = (
}
);
+THREAD_STRUCT = (
+ {
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+ }
+);
+
log_config :
{
global_log_level ="info";
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf
index c2f10e20ae..e08b83d58a 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf
@@ -238,6 +238,15 @@ NETWORK_CONTROLLER :
FLEXRAN_AWAIT_RECONF = "no";
};
+THREAD_STRUCT = (
+ {
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+ }
+);
+
log_config :
{
global_log_level ="info";
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210_ue_expansion.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210_ue_expansion.conf
index e46467598e..f0a3cb524a 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210_ue_expansion.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210_ue_expansion.conf
@@ -192,6 +192,15 @@ RUs = (
}
);
+THREAD_STRUCT = (
+ {
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+ }
+);
+
log_config :
{
global_log_level ="info";
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band38.tm1.if4p5.50PRB.lo.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band38.tm1.if4p5.50PRB.lo.conf
index a6efe74283..039f0c39c1 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band38.tm1.if4p5.50PRB.lo.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band38.tm1.if4p5.50PRB.lo.conf
@@ -199,6 +199,15 @@ RUs = (
}
);
+THREAD_STRUCT = (
+ {
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+ }
+);
+
log_config = {
global_log_level ="info";
global_log_verbosity ="medium";
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi-STUB.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi-STUB.conf
index fefb4b11de..8f6aac632b 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi-STUB.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi-STUB.conf
@@ -182,6 +182,15 @@ MACRLCs = (
}
);
+THREAD_STRUCT = (
+ {
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+ }
+);
+
log_config :
{
global_log_level ="debug";
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi.conf
index cd21fb935e..f4ac5a9aa3 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi.conf
@@ -210,6 +210,15 @@ MACRLCs = (
}
);
+THREAD_STRUCT = (
+ {
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+ }
+);
+
log_config =
{
global_log_level ="info";
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf
index 581012d7d3..ea205e44d1 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf
@@ -198,6 +198,15 @@ RUs = (
}
);
+THREAD_STRUCT = (
+ {
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+ }
+);
+
log_config = {
global_log_level ="info";
global_log_verbosity ="medium";
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.lo.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.lo.conf
index 5f9f8c4d7b..a2e97648c9 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.lo.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.lo.conf
@@ -197,6 +197,15 @@ RUs = (
}
);
+THREAD_STRUCT = (
+ {
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+ }
+);
+
log_config = {
global_log_level ="info";
global_log_verbosity ="medium";
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.oaisim.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.oaisim.conf
index 41b322fb55..ba2e7f1ada 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.oaisim.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.oaisim.conf
@@ -17,6 +17,15 @@ RUs = (
}
);
+THREAD_STRUCT = (
+ {
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+ }
+);
+
log_config = {
global_log_level ="info";
global_log_verbosity ="medium";
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.oaisim.tdd.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.oaisim.tdd.conf
index da1481ac7b..494086defd 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.oaisim.tdd.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.oaisim.tdd.conf
@@ -18,6 +18,15 @@ RUs = (
}
);
+THREAD_STRUCT = (
+ {
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+ }
+);
+
log_config = {
global_log_level ="info";
global_log_verbosity ="medium";
diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c
index 8c6f6dd766..91a3c2e479 100644
--- a/targets/RT/USER/lte-enb.c
+++ b/targets/RT/USER/lte-enb.c
@@ -151,7 +151,8 @@ void wakeup_prach_eNB(PHY_VARS_eNB *eNB,RU_t *ru,int frame,int subframe);
#if (RRC_VERSION >= MAKE_VERSION(14, 0, 0))
void wakeup_prach_eNB_br(PHY_VARS_eNB *eNB,RU_t *ru,int frame,int subframe);
#endif
-extern int codingw;
+extern PARALLEL_CONF_t get_thread_parallel_conf(void);
+extern WORKER_CONF_t get_thread_worker_conf(void);
extern uint8_t nfapi_mode;
extern void oai_subframe_ind(uint16_t sfn, uint16_t sf);
@@ -223,7 +224,7 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER , 1 );
- if(!eNB->single_thread_flag && get_nprocs() >= 8){
+ if(get_thread_parallel_conf() == PARALLEL_RU_L1_TRX_SPLIT){
if(wait_on_condition(&proc[1].mutex_rxtx,&proc[1].cond_rxtx,&proc[1].pipe_ready,"wakeup_tx")<0) {
LOG_E(PHY,"Frame %d, subframe %d: TX1 not ready\n",proc[1].frame_rx,proc[1].subframe_rx);
return(-1);
@@ -245,7 +246,7 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam
/* CONFLICT RESOLUTION: BEGIN */
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER , 0 );
if(oai_exit) return(-1);
- if(eNB->single_thread_flag || get_nprocs() <= 4){
+ if(get_thread_parallel_conf() == PARALLEL_SINGLE_THREAD){
#ifndef PHY_TX_THREAD
phy_procedures_eNB_TX(eNB, proc, 1);
#endif
@@ -421,8 +422,8 @@ static void* eNB_thread_rxtx( void* param ) {
}
pthread_mutex_unlock( &proc->mutex_rxtx );
if (nfapi_mode!=2){
- if(get_nprocs() >= 8) wakeup_tx(eNB,eNB->proc.ru_proc);
- else
+ if(get_thread_parallel_conf() == PARALLEL_RU_L1_TRX_SPLIT) wakeup_tx(eNB,eNB->proc.ru_proc);
+ else if(get_thread_parallel_conf() == PARALLEL_RU_L1_SPLIT)
{
phy_procedures_eNB_TX(eNB, proc, 1);
wakeup_txfh(proc,eNB->proc.ru_proc);
@@ -881,7 +882,7 @@ static void* process_stats_thread(void* param) {
void init_eNB_proc(int inst) {
- int i=0;
+ /*int i=0;*/
int CC_id;
PHY_VARS_eNB *eNB;
eNB_proc_t *proc;
@@ -953,7 +954,7 @@ void init_eNB_proc(int inst) {
// attr_te = &proc->attr_te;
#endif
- if(get_nprocs() > 2 && codingw)
+ if(get_thread_worker_conf() == WORKER_ENABLE)
{
init_te_thread(eNB);
init_td_thread(eNB);
@@ -962,7 +963,7 @@ void init_eNB_proc(int inst) {
LOG_I(PHY,"eNB->single_thread_flag:%d\n", eNB->single_thread_flag);
- if (eNB->single_thread_flag==0 && nfapi_mode!=2) {
+ if ((get_thread_parallel_conf() == PARALLEL_RU_L1_SPLIT || get_thread_parallel_conf() == PARALLEL_RU_L1_TRX_SPLIT) && nfapi_mode!=2) {
pthread_create( &proc_rxtx[0].pthread_rxtx, attr0, eNB_thread_rxtx, proc );
pthread_create( &proc_rxtx[1].pthread_rxtx, attr1, tx_thread, proc);
}
@@ -970,13 +971,13 @@ void init_eNB_proc(int inst) {
#if (RRC_VERSION >= MAKE_VERSION(14, 0, 0))
pthread_create( &proc->pthread_prach_br, attr_prach_br, eNB_thread_prach_br, eNB );
#endif
- char name[16];
+ /*char name[16];
if (eNB->single_thread_flag==0) {
snprintf( name, sizeof(name), "RXTX0 %d", i );
pthread_setname_np( proc_rxtx[0].pthread_rxtx, name );
snprintf( name, sizeof(name), "RXTX1 %d", i );
pthread_setname_np( proc_rxtx[1].pthread_rxtx, name );
- }
+ }*/
AssertFatal(proc->instance_cnt_prach == -1,"instance_cnt_prach = %d\n",proc->instance_cnt_prach);
@@ -1029,7 +1030,7 @@ void kill_eNB_proc(int inst) {
proc = &eNB->proc;
proc_rxtx = &proc->proc_rxtx[0];
- if(get_nprocs() > 2 && codingw) {
+ if(get_thread_worker_conf() == WORKER_ENABLE) {
kill_td_thread(eNB);
kill_te_thread(eNB);
}
@@ -1323,8 +1324,8 @@ void init_eNB(int single_thread_flag,int wait_for_sync) {
#endif
- eNB->td = ulsch_decoding_data_all;//(get_nprocs()<=4) ? ulsch_decoding_data : ulsch_decoding_data_2thread;
- eNB->te = dlsch_encoding_all;//(get_nprocs()<=4) ? dlsch_encoding : dlsch_encoding_2threads;
+ eNB->td = ulsch_decoding_data_all;
+ eNB->te = dlsch_encoding_all;
LOG_I(PHY,"Registering with MAC interface module\n");
diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c
index d20b614ad7..7002bc4ebd 100644
--- a/targets/RT/USER/lte-ru.c
+++ b/targets/RT/USER/lte-ru.c
@@ -119,10 +119,10 @@ static int DEFENBS[] = {0};
extern volatile int oai_exit;
extern int emulate_rf;
extern int numerology;
-extern int fepw;
-extern int single_thread_flag;
extern clock_source_t clock_source;
+extern PARALLEL_CONF_t get_thread_parallel_conf(void);
+extern WORKER_CONF_t get_thread_worker_conf(void);
extern void phy_init_RU(RU_t*);
extern void phy_free_RU(RU_t*);
@@ -1257,7 +1257,7 @@ void wakeup_eNBs(RU_t *ru) {
LOG_D(PHY,"wakeup_eNBs (num %d) for RU %d ru->eNB_top:%p\n",ru->num_eNB,ru->idx, ru->eNB_top);
- if (ru->num_eNB==1 && ru->eNB_top!=0 && (get_nprocs() <= 4 || single_thread_flag)) {
+ if (ru->num_eNB==1 && ru->eNB_top!=0 && get_thread_parallel_conf() == PARALLEL_SINGLE_THREAD) {
// call eNB function directly
char string[20];
@@ -1456,6 +1456,12 @@ int setup_RU_buffers(RU_t *ru) {
if (frame_parms->N_RB_DL == 100) ru->N_TA_offset = 624;
else if (frame_parms->N_RB_DL == 50) ru->N_TA_offset = 624/2;
else if (frame_parms->N_RB_DL == 25) ru->N_TA_offset = 624/4;
+#if BASIC_SIMULATOR
+ /* this is required for the basic simulator in TDD mode
+ * TODO: find a proper cleaner solution
+ */
+ ru->N_TA_offset = 0;
+#endif
}
if (ru->openair0_cfg.mmapped_dma == 1) {
// replace RX signal buffers with mmaped HW versions
@@ -1782,7 +1788,7 @@ static void* ru_thread( void* param ) {
if (ru->num_eNB>0) wakeup_eNBs(ru);
#ifndef PHY_TX_THREAD
- if(get_nprocs() <= 4 || ru->num_eNB==0 || single_thread_flag){
+ if(get_thread_parallel_conf() == PARALLEL_SINGLE_THREAD || ru->num_eNB==0){
// do TX front-end processing if needed (precoding and/or IDFTs)
if (ru->feptx_prec) ru->feptx_prec(ru);
@@ -2195,7 +2201,7 @@ void init_RU_proc(RU_t *ru) {
if(emulate_rf)
pthread_create( &proc->pthread_emulateRF, attr_emulateRF, emulatedRF_thread, (void*)proc );
- if (!single_thread_flag && get_nprocs() > 4)
+ if (get_thread_parallel_conf() == PARALLEL_RU_L1_SPLIT || get_thread_parallel_conf() == PARALLEL_RU_L1_TRX_SPLIT)
pthread_create( &proc->pthread_FH1, attr_FH1, ru_thread_tx, (void*)ru );
if (ru->function == NGFI_RRU_IF4p5) {
@@ -2222,7 +2228,7 @@ void init_RU_proc(RU_t *ru) {
pthread_create( &proc->pthread_prach, attr_prach, ru_thread_prach, (void*)ru );
}
- if (get_nprocs()> 2 && fepw) {
+ if (get_thread_worker_conf() == WORKER_ENABLE) {
init_fep_thread(ru,NULL);
init_feptx_thread(ru,NULL);
}
@@ -2260,7 +2266,7 @@ void kill_RU_proc(RU_t *ru)
pthread_cond_destroy( &proc->cond_rf_tx);
#endif
- if (get_nprocs() > 2 && fepw) {
+ if (get_thread_worker_conf() == WORKER_ENABLE) {
LOG_D(PHY, "killing FEP thread\n");
kill_fep_thread(ru);
LOG_D(PHY, "killing FEP TX thread\n");
@@ -2309,7 +2315,7 @@ void kill_RU_proc(RU_t *ru)
LOG_D(PHY, "Joining pthread_FH\n");
pthread_join(proc->pthread_FH, NULL);
- if (!single_thread_flag && get_nprocs() > 4) {
+ if (get_thread_parallel_conf() == PARALLEL_RU_L1_SPLIT || get_thread_parallel_conf() == PARALLEL_RU_L1_TRX_SPLIT) {
LOG_D(PHY, "Joining pthread_FHTX\n");
pthread_join(proc->pthread_FH1, NULL);
}
@@ -2583,8 +2589,8 @@ void set_function_spec_param(RU_t *ru)
ru->fh_north_out = fh_if4p5_north_out; // send_IF4p5 on reception
ru->fh_south_out = tx_rf; // send output to RF
ru->fh_north_asynch_in = fh_if4p5_north_asynch_in; // TX packets come asynchronously
- ru->feprx = (get_nprocs()<=2 || !fepw) ? fep_full :ru_fep_full_2thread; // RX DFTs
- ru->feptx_ofdm = (get_nprocs()<=2 || !fepw) ? feptx_ofdm : feptx_ofdm_2thread; // this is fep with idft only (no precoding in RRU)
+ ru->feprx = (get_thread_worker_conf() == WORKER_DISABLE) ? fep_full :ru_fep_full_2thread; // RX DFTs
+ ru->feptx_ofdm = (get_thread_worker_conf() == WORKER_DISABLE) ? feptx_ofdm : feptx_ofdm_2thread; // this is fep with idft only (no precoding in RRU)
ru->feptx_prec = NULL;
ru->start_if = start_if; // need to start the if interface for if4p5
ru->ifdevice.host_type = RRU_HOST;
@@ -2605,8 +2611,8 @@ void set_function_spec_param(RU_t *ru)
}
else if (ru->function == eNodeB_3GPP) {
ru->do_prach = 0; // no prach processing in RU
- ru->feprx = (get_nprocs()<=2 || !fepw) ? fep_full : ru_fep_full_2thread; // RX DFTs
- ru->feptx_ofdm = (get_nprocs()<=2 || !fepw) ? feptx_ofdm : feptx_ofdm_2thread; // this is fep with idft and precoding
+ ru->feprx = (get_thread_worker_conf() == WORKER_DISABLE) ? fep_full : ru_fep_full_2thread; // RX DFTs
+ ru->feptx_ofdm = (get_thread_worker_conf() == WORKER_DISABLE) ? feptx_ofdm : feptx_ofdm_2thread; // this is fep with idft and precoding
ru->feptx_prec = feptx_prec; // this is fep with idft and precoding
ru->fh_north_in = NULL; // no incoming fronthaul from north
ru->fh_north_out = NULL; // no outgoing fronthaul to north
@@ -2634,9 +2640,9 @@ void set_function_spec_param(RU_t *ru)
case REMOTE_IF5: // the remote unit is IF5 RRU
ru->do_prach = 0;
- ru->feprx = (get_nprocs()<=2 || !fepw) ? fep_full : fep_full; // this is frequency-shift + DFTs
+ ru->feprx = (get_thread_worker_conf() == WORKER_DISABLE) ? fep_full : fep_full; // this is frequency-shift + DFTs
ru->feptx_prec = feptx_prec; // need to do transmit Precoding + IDFTs
- ru->feptx_ofdm = (get_nprocs()<=2 || !fepw) ? feptx_ofdm : feptx_ofdm_2thread; // need to do transmit Precoding + IDFTs
+ ru->feptx_ofdm = (get_thread_worker_conf() == WORKER_DISABLE) ? feptx_ofdm : feptx_ofdm_2thread; // need to do transmit Precoding + IDFTs
if (ru->if_timing == synch_to_other) {
ru->fh_south_in = fh_slave_south_in; // synchronize to master
ru->fh_south_out = fh_if5_mobipass_south_out; // use send_IF5 for mobipass
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index 7990a48a14..9a93bc4cbc 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -219,8 +219,31 @@ extern void init_eNB_afterRU(void);
int transmission_mode=1;
int emulate_rf = 0;
int numerology = 0;
-int codingw = 0;
-int fepw = 0;
+char *parallel_config = NULL;
+char *worker_config = NULL;
+
+static THREAD_STRUCT thread_struct;
+void set_parallel_conf(char *parallel_conf)
+{
+ if(strcmp(parallel_conf,"PARALLEL_SINGLE_THREAD")==0) thread_struct.parallel_conf = PARALLEL_SINGLE_THREAD;
+ else if(strcmp(parallel_conf,"PARALLEL_RU_L1_SPLIT")==0) thread_struct.parallel_conf = PARALLEL_RU_L1_SPLIT;
+ else if(strcmp(parallel_conf,"PARALLEL_RU_L1_TRX_SPLIT")==0) thread_struct.parallel_conf = PARALLEL_RU_L1_TRX_SPLIT;
+ printf("[CONFIG] parallel conf is set to %d\n",thread_struct.parallel_conf);
+}
+void set_worker_conf(char *worker_conf)
+{
+ if(strcmp(worker_conf,"WORKER_DISABLE")==0) thread_struct.worker_conf = WORKER_DISABLE;
+ else if(strcmp(worker_conf,"WORKER_ENABLE")==0) thread_struct.worker_conf = WORKER_ENABLE;
+ printf("[CONFIG] worker conf is set to %d\n",thread_struct.worker_conf);
+}
+PARALLEL_CONF_t get_thread_parallel_conf(void)
+{
+ return thread_struct.parallel_conf;
+}
+WORKER_CONF_t get_thread_worker_conf(void)
+{
+ return thread_struct.worker_conf;
+}
@@ -321,7 +344,15 @@ void signal_handler(int sig) {
#define KBLU "\x1B[34m"
#define RESET "\033[0m"
-
+#if defined(ENABLE_ITTI)
+void signal_handler_itti(int sig) {
+ // Call exit function
+ char msg[256];
+ memset(msg, 0, 256);
+ sprintf(msg, "caught signal %s\n", strsignal(sig));
+ exit_function(__FILE__, __FUNCTION__, __LINE__, msg);
+}
+#endif
void exit_function(const char* file, const char* function, const int line, const char* s)
{
@@ -546,6 +577,8 @@ static void get_options(unsigned int *start_msc) {
RC.nb_nb_iot_rrc_inst=RC.nb_nb_iot_L1_inst=RC.nb_nb_iot_macrlc_inst=0;
}
}
+ if(parallel_config != NULL) set_parallel_conf(parallel_config);
+ if(worker_config != NULL) set_worker_conf(worker_config);
}
@@ -954,6 +987,11 @@ int main( int argc, char **argv )
signal(SIGINT, signal_handler);
#endif
+#if defined(ENABLE_ITTI)
+ signal(SIGINT, signal_handler_itti);
+ signal(SIGTERM, signal_handler_itti);
+ signal(SIGABRT, signal_handler_itti);
+#endif
check_clock();
diff --git a/targets/RT/USER/lte-softmodem.h b/targets/RT/USER/lte-softmodem.h
index b421181f37..2b087e5456 100644
--- a/targets/RT/USER/lte-softmodem.h
+++ b/targets/RT/USER/lte-softmodem.h
@@ -92,9 +92,9 @@
#define CONFIG_HLP_TNOFORK "to ease debugging with gdb\n"
#define CONFIG_HLP_NUMEROLOGY "adding numerology for 5G\n"
-#define CONFIG_HLP_CODINGW "coding worker thread enable(disable by defult)\n"
-#define CONFIG_HLP_FEPW "FEP worker thread enabled(disable by defult)\n"
#define CONFIG_HLP_EMULATE_RF "Emulated RF enabled(disable by defult)\n"
+#define CONFIG_HLP_PARALLEL_CMD "three config for level of parallelism 'PARALLEL_SINGLE_THREAD', 'PARALLEL_RU_L1_SPLIT', or 'PARALLEL_RU_L1_TRX_SPLIT'\n"
+#define CONFIG_HLP_WORKER_CMD "two option for worker 'WORKER_DISABLE' or 'WORKER_ENABLE'\n"
#define CONFIG_HLP_DISABLNBIOT "disable nb-iot, even if defined in config\n"
@@ -186,9 +186,9 @@
{"s" , CONFIG_HLP_SNR, 0, iptr:&snr_dB, defintval:25, TYPE_INT, 0}, \
{"numerology" , CONFIG_HLP_NUMEROLOGY, PARAMFLAG_BOOL, iptr:&numerology, defintval:0, TYPE_INT, 0}, \
{"emulate-rf" , CONFIG_HLP_EMULATE_RF, PARAMFLAG_BOOL, iptr:&emulate_rf, defintval:0, TYPE_INT, 0}, \
-{"codingw" , CONFIG_HLP_CODINGW, PARAMFLAG_BOOL, iptr:&codingw, defintval:0, TYPE_INT, 0}, \
-{"fepw" , CONFIG_HLP_FEPW, PARAMFLAG_BOOL, iptr:&fepw, defintval:0, TYPE_INT, 0}, \
-{"nbiot-disable", CONFIG_HLP_DISABLNBIOT, PARAMFLAG_BOOL, iptr:&nonbiotflag, defintval:0, TYPE_INT, 0} \
+{"parallel-config", CONFIG_HLP_PARALLEL_CMD,0, strptr:(char **)¶llel_config, defstrval:NULL, TYPE_STRING, 0}, \
+{"worker-config", CONFIG_HLP_WORKER_CMD, 0, strptr:(char **)&worker_config, defstrval:NULL, TYPE_STRING, 0}, \
+{"nbiot-disable", CONFIG_HLP_DISABLNBIOT, PARAMFLAG_BOOL, iptr:&nonbiotflag, defintval:0, TYPE_INT, 0} \
}
#define CONFIG_HLP_FLOG "Enable online log \n"
@@ -279,6 +279,10 @@ PHY_VARS_UE* init_ue_vars(LTE_DL_FRAME_PARMS *frame_parms,
uint8_t UE_id,
uint8_t abstraction_flag);
void init_eNB_afterRU(void);
+PARALLEL_CONF_t get_thread_parallel_conf(void);
+WORKER_CONF_t get_thread_worker_conf(void);
+void set_parallel_conf(char *parallel_conf);
+void set_worker_conf(char *worker_conf);
extern int stop_L1L2(module_id_t enb_id);
extern int restart_L1L2(module_id_t enb_id);
diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c
index 66107d79a4..c49a54b98a 100644
--- a/targets/RT/USER/lte-ue.c
+++ b/targets/RT/USER/lte-ue.c
@@ -333,6 +333,13 @@ void init_UE(int nb_inst,int eMBMS_active, int uecap_xer_in, int timing_correcti
}
else UE->N_TA_offset = 0;
+#if BASIC_SIMULATOR
+ /* this is required for the basic simulator in TDD mode
+ * TODO: find a proper cleaner solution
+ */
+ UE->N_TA_offset = 0;
+#endif
+
if (simL1flag == 1) init_ue_devices(UE);
LOG_I(PHY,"Intializing UE Threads for instance %d (%p,%p)...\n",inst,PHY_vars_UE_g[inst],PHY_vars_UE_g[inst][0]);
init_UE_threads(inst);
diff --git a/targets/RT/USER/lte-uesoftmodem.c b/targets/RT/USER/lte-uesoftmodem.c
index 2efcb496ac..c52fe130a1 100644
--- a/targets/RT/USER/lte-uesoftmodem.c
+++ b/targets/RT/USER/lte-uesoftmodem.c
@@ -220,8 +220,31 @@ int transmission_mode=1;
int emulate_rf = 0;
int numerology = 0;
-int codingw = 0;
-int fepw = 0;
+char *parallel_config = NULL;
+char *worker_config = NULL;
+
+static THREAD_STRUCT thread_struct;
+void set_parallel_conf(char *parallel_conf)
+{
+ if(strcmp(parallel_conf,"PARALLEL_SINGLE_THREAD")==0) thread_struct.parallel_conf = PARALLEL_SINGLE_THREAD;
+ else if(strcmp(parallel_conf,"PARALLEL_RU_L1_SPLIT")==0) thread_struct.parallel_conf = PARALLEL_RU_L1_SPLIT;
+ else if(strcmp(parallel_conf,"PARALLEL_RU_L1_TRX_SPLIT")==0) thread_struct.parallel_conf = PARALLEL_RU_L1_TRX_SPLIT;
+ printf("[CONFIG] parallel conf is set to %d\n",thread_struct.parallel_conf);
+}
+void set_worker_conf(char *worker_conf)
+{
+ if(strcmp(worker_conf,"WORKER_DISABLE")==0) thread_struct.worker_conf = WORKER_DISABLE;
+ else if(strcmp(worker_conf,"WORKER_ENABLE")==0) thread_struct.worker_conf = WORKER_ENABLE;
+ printf("[CONFIG] worker conf is set to %d\n",thread_struct.worker_conf);
+}
+PARALLEL_CONF_t get_thread_parallel_conf(void)
+{
+ return thread_struct.parallel_conf;
+}
+WORKER_CONF_t get_thread_worker_conf(void)
+{
+ return thread_struct.worker_conf;
+}
/* struct for ethernet specific parameters given in eNB conf file */
eth_params_t *eth_params;
@@ -583,6 +606,8 @@ static void get_options(unsigned int *start_msc) {
if(nfapi_mode!=3)
uecap_xer_in=1;
} *//* UE with config file */
+ if(parallel_config != NULL) set_parallel_conf(parallel_config);
+ if(worker_config != NULL) set_worker_conf(worker_config);
}
@@ -800,6 +825,8 @@ int main( int argc, char **argv )
for (int i=0;i 1 && simL1flag != 1) {