|
|
|
@@ -90,22 +90,8 @@ unsigned short config_frames[4] = {2,9,11,13};
|
|
|
|
|
|
|
|
|
|
#include "system.h"
|
|
|
|
|
|
|
|
|
|
#ifdef XFORMS
|
|
|
|
|
#include "PHY/TOOLS/lte_phy_scope.h"
|
|
|
|
|
#include "stats.h"
|
|
|
|
|
#endif
|
|
|
|
|
#include "lte-softmodem.h"
|
|
|
|
|
#include "NB_IoT_interface.h"
|
|
|
|
|
#ifdef XFORMS
|
|
|
|
|
// current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0)
|
|
|
|
|
// at eNB 0, an UL scope for every UE
|
|
|
|
|
FD_lte_phy_scope_ue *form_ue[NUMBER_OF_UE_MAX];
|
|
|
|
|
FD_lte_phy_scope_enb *form_enb[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
|
|
|
|
|
FD_stats_form *form_stats=NULL,*form_stats_l2=NULL;
|
|
|
|
|
char title[255];
|
|
|
|
|
unsigned char scope_enb_num_ue = 2;
|
|
|
|
|
static pthread_t forms_thread; //xforms
|
|
|
|
|
#endif //XFORMS
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pthread_cond_t nfapi_sync_cond;
|
|
|
|
@@ -163,12 +149,7 @@ char channels[128] = "0";
|
|
|
|
|
|
|
|
|
|
int rx_input_level_dBm;
|
|
|
|
|
|
|
|
|
|
#ifdef XFORMS
|
|
|
|
|
extern int otg_enabled;
|
|
|
|
|
#else
|
|
|
|
|
int otg_enabled;
|
|
|
|
|
#endif
|
|
|
|
|
//int number_of_cards = 1;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uint8_t exit_missed_slots=1;
|
|
|
|
@@ -301,76 +282,6 @@ void exit_function(const char *file, const char *function, const int line, const
|
|
|
|
|
exit(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef XFORMS
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void reset_stats(FL_OBJECT *button, long arg) {
|
|
|
|
|
int i,j,k;
|
|
|
|
|
PHY_VARS_eNB *phy_vars_eNB = RC.eNB[0][0];
|
|
|
|
|
|
|
|
|
|
for (i=0; i<NUMBER_OF_UE_MAX; i++) {
|
|
|
|
|
for (k=0; k<8; k++) { //harq_processes
|
|
|
|
|
for (j=0; j<phy_vars_eNB->dlsch[i][0]->Mlimit; j++) {
|
|
|
|
|
phy_vars_eNB->UE_stats[i].dlsch_NAK[k][j]=0;
|
|
|
|
|
phy_vars_eNB->UE_stats[i].dlsch_ACK[k][j]=0;
|
|
|
|
|
phy_vars_eNB->UE_stats[i].dlsch_trials[k][j]=0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
phy_vars_eNB->UE_stats[i].dlsch_l2_errors[k]=0;
|
|
|
|
|
phy_vars_eNB->UE_stats[i].ulsch_errors[k]=0;
|
|
|
|
|
phy_vars_eNB->UE_stats[i].ulsch_consecutive_errors=0;
|
|
|
|
|
phy_vars_eNB->UE_stats[i].dlsch_sliding_cnt=0;
|
|
|
|
|
phy_vars_eNB->UE_stats[i].dlsch_NAK_round0=0;
|
|
|
|
|
phy_vars_eNB->UE_stats[i].dlsch_mcs_offset=0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void *scope_thread(void *arg) {
|
|
|
|
|
# ifdef ENABLE_XFORMS_WRITE_STATS
|
|
|
|
|
FILE *eNB_stats;
|
|
|
|
|
# endif
|
|
|
|
|
struct sched_param sched_param;
|
|
|
|
|
int UE_id, CC_id;
|
|
|
|
|
int ue_cnt=0;
|
|
|
|
|
sched_param.sched_priority = sched_get_priority_min(SCHED_FIFO)+1;
|
|
|
|
|
sched_setscheduler(0, SCHED_FIFO,&sched_param);
|
|
|
|
|
printf("Scope thread has priority %d\n",sched_param.sched_priority);
|
|
|
|
|
# ifdef ENABLE_XFORMS_WRITE_STATS
|
|
|
|
|
eNB_stats = fopen("eNB_stats.txt", "w");
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
while (!oai_exit) {
|
|
|
|
|
ue_cnt=0;
|
|
|
|
|
|
|
|
|
|
for(UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) {
|
|
|
|
|
for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
|
|
|
|
if ((ue_cnt<scope_enb_num_ue)) {
|
|
|
|
|
phy_scope_eNB(form_enb[CC_id][ue_cnt],
|
|
|
|
|
RC.eNB[0][CC_id],
|
|
|
|
|
UE_id);
|
|
|
|
|
ue_cnt++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sleep(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// printf("%s",stats_buffer);
|
|
|
|
|
# ifdef ENABLE_XFORMS_WRITE_STATS
|
|
|
|
|
|
|
|
|
|
if (eNB_stats) {
|
|
|
|
|
rewind (eNB_stats);
|
|
|
|
|
fwrite (stats_buffer, 1, len, eNB_stats);
|
|
|
|
|
fclose (eNB_stats);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# endif
|
|
|
|
|
pthread_exit((void *)arg);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void get_options(void) {
|
|
|
|
|
CONFIG_SETRTFLAG(CONFIG_NOEXITONHELP);
|
|
|
|
@@ -575,6 +486,25 @@ int restart_L1L2(module_id_t enb_id) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void init_pdcp(void) {
|
|
|
|
|
if (!NODE_IS_DU(RC.rrc[0]->node_type)) {
|
|
|
|
|
pdcp_layer_init();
|
|
|
|
|
uint32_t pdcp_initmask = (IS_SOFTMODEM_NOS1) ?
|
|
|
|
|
(PDCP_USE_NETLINK_BIT | LINK_ENB_PDCP_TO_IP_DRIVER_BIT) : LINK_ENB_PDCP_TO_GTPV1U_BIT;
|
|
|
|
|
if (IS_SOFTMODEM_NOS1)
|
|
|
|
|
pdcp_initmask = pdcp_initmask | ENB_NAS_USE_TUN_BIT | SOFTMODEM_NOKRNMOD_BIT ;
|
|
|
|
|
pdcp_module_init(pdcp_initmask);
|
|
|
|
|
|
|
|
|
|
if (NODE_IS_CU(RC.rrc[0]->node_type)) {
|
|
|
|
|
pdcp_set_rlc_data_req_func((send_rlc_data_req_func_t)proto_agent_send_rlc_data_req);
|
|
|
|
|
} else {
|
|
|
|
|
pdcp_set_rlc_data_req_func((send_rlc_data_req_func_t) rlc_data_req);
|
|
|
|
|
pdcp_set_pdcp_data_ind_func((pdcp_data_ind_func_t) pdcp_data_ind);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
pdcp_set_pdcp_data_ind_func((pdcp_data_ind_func_t) proto_agent_send_pdcp_data_ind);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void wait_nfapi_init(char *thread_name) {
|
|
|
|
|
printf( "waiting for NFAPI PNF connection and population of global structure (%s)\n",thread_name);
|
|
|
|
@@ -589,14 +519,8 @@ static void wait_nfapi_init(char *thread_name) {
|
|
|
|
|
|
|
|
|
|
int main( int argc, char **argv ) {
|
|
|
|
|
int i;
|
|
|
|
|
#if defined (XFORMS)
|
|
|
|
|
void *status;
|
|
|
|
|
#endif
|
|
|
|
|
int CC_id;
|
|
|
|
|
int CC_id = 0;
|
|
|
|
|
int ru_id;
|
|
|
|
|
#if defined (XFORMS)
|
|
|
|
|
int ret;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
if ( load_configmodule(argc,argv,0) == NULL) {
|
|
|
|
|
exit_fun("[SOFTMODEM] Error, configuration module init failed\n");
|
|
|
|
@@ -654,24 +578,19 @@ int main( int argc, char **argv ) {
|
|
|
|
|
fill_modeled_runtime_table(runtime_phy_rx,runtime_phy_tx);
|
|
|
|
|
|
|
|
|
|
/* Read configuration */
|
|
|
|
|
if (RC.nb_inst > 0)
|
|
|
|
|
if (RC.nb_inst > 0) {
|
|
|
|
|
read_config_and_init();
|
|
|
|
|
|
|
|
|
|
/* Start the agent. If it is turned off in the configuration, it won't start */
|
|
|
|
|
RCconfig_flexran();
|
|
|
|
|
/* Start the agent. If it is turned off in the configuration, it won't start */
|
|
|
|
|
RCconfig_flexran();
|
|
|
|
|
for (i = 0; i < RC.nb_inst; i++) {
|
|
|
|
|
flexran_agent_start(i);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < RC.nb_inst; i++) {
|
|
|
|
|
flexran_agent_start(i);
|
|
|
|
|
}
|
|
|
|
|
/* initializes PDCP and sets correct RLC Request/PDCP Indication callbacks
|
|
|
|
|
* for monolithic/F1 modes */
|
|
|
|
|
init_pdcp();
|
|
|
|
|
|
|
|
|
|
uint32_t pdcp_initmask = ( IS_SOFTMODEM_NOS1 )? ( PDCP_USE_NETLINK_BIT | LINK_ENB_PDCP_TO_IP_DRIVER_BIT) : LINK_ENB_PDCP_TO_GTPV1U_BIT;
|
|
|
|
|
|
|
|
|
|
if ( IS_SOFTMODEM_NOS1)
|
|
|
|
|
pdcp_initmask = pdcp_initmask | ENB_NAS_USE_TUN_BIT | SOFTMODEM_NOKRNMOD_BIT ;
|
|
|
|
|
|
|
|
|
|
pdcp_module_init(pdcp_initmask);
|
|
|
|
|
|
|
|
|
|
if (RC.nb_inst > 0) {
|
|
|
|
|
if (create_tasks(1) < 0) {
|
|
|
|
|
printf("cannot create ITTI tasks\n");
|
|
|
|
|
exit(-1);
|
|
|
|
@@ -683,7 +602,7 @@ int main( int argc, char **argv ) {
|
|
|
|
|
itti_send_msg_to_task (TASK_RRC_ENB, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
printf("No ITTI, Initializing L1\n");
|
|
|
|
|
printf("RC.nb_inst = 0, Initializing L1\n");
|
|
|
|
|
RCconfig_L1();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -695,7 +614,7 @@ int main( int argc, char **argv ) {
|
|
|
|
|
ctxt.enb_flag = 1;
|
|
|
|
|
pdcp_run(&ctxt);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* start threads if only L1 or not a CU */
|
|
|
|
|
if (RC.nb_inst == 0 || !NODE_IS_CU(RC.rrc[0]->node_type)) {
|
|
|
|
|
// init UE_PF_PO and mutex lock
|
|
|
|
@@ -704,43 +623,7 @@ int main( int argc, char **argv ) {
|
|
|
|
|
mlockall(MCL_CURRENT | MCL_FUTURE);
|
|
|
|
|
pthread_cond_init(&sync_cond,NULL);
|
|
|
|
|
pthread_mutex_init(&sync_mutex, NULL);
|
|
|
|
|
#ifdef XFORMS
|
|
|
|
|
int UE_id;
|
|
|
|
|
printf("XFORMS\n");
|
|
|
|
|
|
|
|
|
|
if (get_softmodem_params()->do_forms==1) {
|
|
|
|
|
fl_initialize (&argc, argv, NULL, 0, 0);
|
|
|
|
|
form_stats_l2 = create_form_stats_form();
|
|
|
|
|
fl_show_form (form_stats_l2->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "l2 stats");
|
|
|
|
|
form_stats = create_form_stats_form();
|
|
|
|
|
fl_show_form (form_stats->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "stats");
|
|
|
|
|
|
|
|
|
|
for(UE_id=0; UE_id<scope_enb_num_ue; UE_id++) {
|
|
|
|
|
for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
|
|
|
|
form_enb[CC_id][UE_id] = create_lte_phy_scope_enb();
|
|
|
|
|
sprintf (title, "LTE UL SCOPE eNB for CC_id %d, UE %d",CC_id,UE_id);
|
|
|
|
|
fl_show_form (form_enb[CC_id][UE_id]->lte_phy_scope_enb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
|
|
|
|
|
|
|
|
|
|
if (otg_enabled) {
|
|
|
|
|
fl_set_button(form_enb[CC_id][UE_id]->button_0,1);
|
|
|
|
|
fl_set_object_label(form_enb[CC_id][UE_id]->button_0,"DL Traffic ON");
|
|
|
|
|
} else {
|
|
|
|
|
fl_set_button(form_enb[CC_id][UE_id]->button_0,0);
|
|
|
|
|
fl_set_object_label(form_enb[CC_id][UE_id]->button_0,"DL Traffic OFF");
|
|
|
|
|
}
|
|
|
|
|
} // CC_id
|
|
|
|
|
} // UE_id
|
|
|
|
|
|
|
|
|
|
ret = pthread_create(&forms_thread, NULL, scope_thread, NULL);
|
|
|
|
|
|
|
|
|
|
if (ret == 0)
|
|
|
|
|
pthread_setname_np( forms_thread, "xforms" );
|
|
|
|
|
|
|
|
|
|
printf("Scope thread created, ret=%d\n",ret);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rt_sleep_ns(10*100000000ULL);
|
|
|
|
|
|
|
|
|
|
if (NFAPI_MODE!=NFAPI_MONOLITHIC) {
|
|
|
|
@@ -767,57 +650,63 @@ int main( int argc, char **argv ) {
|
|
|
|
|
// for (inst=0;inst<RC.nb_L1_inst;inst++)
|
|
|
|
|
// for (CC_id=0;CC_id<RC.nb_L1_CC[inst];CC_id++) phy_init_lte_eNB(RC.eNB[inst][CC_id],0,0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
printf("wait_eNBs()\n");
|
|
|
|
|
wait_eNBs();
|
|
|
|
|
printf("About to Init RU threads RC.nb_RU:%d\n", RC.nb_RU);
|
|
|
|
|
|
|
|
|
|
// RU thread and some L1 procedure aren't necessary in VNF or L2 FAPI simulator.
|
|
|
|
|
// but RU thread deals with pre_scd and this is necessary in VNF and simulator.
|
|
|
|
|
// some initialization is necessary and init_ru_vnf do this.
|
|
|
|
|
if (RC.nb_RU >0 && NFAPI_MODE!=NFAPI_MODE_VNF) {
|
|
|
|
|
printf("Initializing RU threads\n");
|
|
|
|
|
init_RU(get_softmodem_params()->rf_config_file,get_softmodem_params()->clock_source,get_softmodem_params()->timing_source,get_softmodem_params()->send_dmrs_sync);
|
|
|
|
|
|
|
|
|
|
printf("wait_eNBs()\n");
|
|
|
|
|
wait_eNBs();
|
|
|
|
|
printf("About to Init RU threads RC.nb_RU:%d\n", RC.nb_RU);
|
|
|
|
|
|
|
|
|
|
// RU thread and some L1 procedure aren't necessary in VNF or L2 FAPI simulator.
|
|
|
|
|
// but RU thread deals with pre_scd and this is necessary in VNF and simulator.
|
|
|
|
|
// some initialization is necessary and init_ru_vnf do this.
|
|
|
|
|
if (RC.nb_RU >0 && NFAPI_MODE!=NFAPI_MODE_VNF) {
|
|
|
|
|
printf("Initializing RU threads\n");
|
|
|
|
|
init_RU(get_softmodem_params()->rf_config_file,get_softmodem_params()->clock_source,get_softmodem_params()->timing_source,get_softmodem_params()->send_dmrs_sync);
|
|
|
|
|
|
|
|
|
|
for (ru_id=0; ru_id<RC.nb_RU; ru_id++) {
|
|
|
|
|
RC.ru[ru_id]->rf_map.card=0;
|
|
|
|
|
RC.ru[ru_id]->rf_map.chain=CC_id+(get_softmodem_params()->chain_offset);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
config_sync_var=0;
|
|
|
|
|
|
|
|
|
|
if (NFAPI_MODE==NFAPI_MODE_PNF) { // PNF
|
|
|
|
|
wait_nfapi_init("main?");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
printf("wait RUs\n");
|
|
|
|
|
fflush(stdout);
|
|
|
|
|
fflush(stderr);
|
|
|
|
|
wait_RUs();
|
|
|
|
|
LOG_I(ENB_APP,"RC.nb_RU:%d\n", RC.nb_RU);
|
|
|
|
|
// once all RUs are ready intiailize the rest of the eNBs ((dependence on final RU parameters after configuration)
|
|
|
|
|
printf("ALL RUs ready - init eNBs\n");
|
|
|
|
|
|
|
|
|
|
if (NFAPI_MODE!=NFAPI_MODE_PNF && NFAPI_MODE!=NFAPI_MODE_VNF) {
|
|
|
|
|
LOG_I(ENB_APP,"Not NFAPI mode - call init_eNB_afterRU()\n");
|
|
|
|
|
init_eNB_afterRU();
|
|
|
|
|
} else {
|
|
|
|
|
LOG_I(ENB_APP,"NFAPI mode - DO NOT call init_eNB_afterRU()\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
LOG_UI(ENB_APP,"ALL RUs ready - ALL eNBs ready\n");
|
|
|
|
|
// connect the TX/RX buffers
|
|
|
|
|
sleep(1); /* wait for thread activation */
|
|
|
|
|
LOG_I(ENB_APP,"Sending sync to all threads\n");
|
|
|
|
|
pthread_mutex_lock(&sync_mutex);
|
|
|
|
|
sync_var=0;
|
|
|
|
|
pthread_cond_broadcast(&sync_cond);
|
|
|
|
|
pthread_mutex_unlock(&sync_mutex);
|
|
|
|
|
config_check_unknown_cmdlineopt(CONFIG_CHECKALLSECTIONS);
|
|
|
|
|
for (ru_id=0; ru_id<RC.nb_RU; ru_id++) {
|
|
|
|
|
RC.ru[ru_id]->rf_map.card=0;
|
|
|
|
|
RC.ru[ru_id]->rf_map.chain=CC_id+(get_softmodem_params()->chain_offset);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
config_sync_var=0;
|
|
|
|
|
|
|
|
|
|
if (NFAPI_MODE==NFAPI_MODE_PNF) { // PNF
|
|
|
|
|
wait_nfapi_init("main?");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
printf("wait RUs\n");
|
|
|
|
|
// CI -- Flushing the std outputs for the previous marker to show on the eNB / RRU log file
|
|
|
|
|
fflush(stdout);
|
|
|
|
|
fflush(stderr);
|
|
|
|
|
// end of CI modifications
|
|
|
|
|
wait_RUs();
|
|
|
|
|
LOG_I(ENB_APP,"RC.nb_RU:%d\n", RC.nb_RU);
|
|
|
|
|
// once all RUs are ready intiailize the rest of the eNBs ((dependence on final RU parameters after configuration)
|
|
|
|
|
printf("ALL RUs ready - init eNBs\n");
|
|
|
|
|
|
|
|
|
|
if (NFAPI_MODE!=NFAPI_MODE_PNF && NFAPI_MODE!=NFAPI_MODE_VNF) {
|
|
|
|
|
LOG_I(ENB_APP,"Not NFAPI mode - call init_eNB_afterRU()\n");
|
|
|
|
|
init_eNB_afterRU();
|
|
|
|
|
} else {
|
|
|
|
|
LOG_I(ENB_APP,"NFAPI mode - DO NOT call init_eNB_afterRU()\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
LOG_UI(ENB_APP,"ALL RUs ready - ALL eNBs ready\n");
|
|
|
|
|
// connect the TX/RX buffers
|
|
|
|
|
sleep(1); /* wait for thread activation */
|
|
|
|
|
LOG_I(ENB_APP,"Sending sync to all threads\n");
|
|
|
|
|
pthread_mutex_lock(&sync_mutex);
|
|
|
|
|
sync_var=0;
|
|
|
|
|
pthread_cond_broadcast(&sync_cond);
|
|
|
|
|
pthread_mutex_unlock(&sync_mutex);
|
|
|
|
|
config_check_unknown_cmdlineopt(CONFIG_CHECKALLSECTIONS);
|
|
|
|
|
}
|
|
|
|
|
// wait for end of program
|
|
|
|
|
LOG_UI(ENB_APP,"TYPE <CTRL-C> TO TERMINATE\n");
|
|
|
|
|
// CI -- Flushing the std outputs for the previous marker to show on the eNB / DU / CU log file
|
|
|
|
|
fflush(stdout);
|
|
|
|
|
fflush(stderr);
|
|
|
|
|
// end of CI modifications
|
|
|
|
|
//getchar();
|
|
|
|
|
itti_wait_tasks_end();
|
|
|
|
|
oai_exit=1;
|
|
|
|
@@ -826,24 +715,6 @@ int main( int argc, char **argv ) {
|
|
|
|
|
|
|
|
|
|
if (RC.nb_inst == 0 || !NODE_IS_CU(RC.rrc[0]->node_type)) {
|
|
|
|
|
int UE_id;
|
|
|
|
|
#ifdef XFORMS
|
|
|
|
|
printf("waiting for XFORMS thread\n");
|
|
|
|
|
|
|
|
|
|
if (get_softmodem_params()->do_forms==1) {
|
|
|
|
|
pthread_join(forms_thread,&status);
|
|
|
|
|
fl_hide_form(form_stats->stats_form);
|
|
|
|
|
fl_free_form(form_stats->stats_form);
|
|
|
|
|
fl_hide_form(form_stats_l2->stats_form);
|
|
|
|
|
fl_free_form(form_stats_l2->stats_form);
|
|
|
|
|
|
|
|
|
|
for(UE_id=0; UE_id<scope_enb_num_ue; UE_id++) {
|
|
|
|
|
for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
|
|
|
|
fl_hide_form(form_enb[CC_id][UE_id]->lte_phy_scope_enb);
|
|
|
|
|
fl_free_form(form_enb[CC_id][UE_id]->lte_phy_scope_enb);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
LOG_I(ENB_APP,"stopping MODEM threads\n");
|
|
|
|
|
stop_eNB(NB_eNB_INST);
|
|
|
|
|
stop_RU(RC.nb_RU);
|
|
|
|
@@ -881,7 +752,7 @@ int main( int argc, char **argv ) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
terminate_opt();
|
|
|
|
|
logClean();
|
|
|
|
|
printf("Bye.\n");
|
|
|
|
|