diff --git a/executables/main-ocp.c b/executables/main-ocp.c index b3472f17cb27f94e5afa451de3d53bfee732f64b..cbd18c65413b8bbcda1ed1e8578a9265522da7cb 100644 --- a/executables/main-ocp.c +++ b/executables/main-ocp.c @@ -15,6 +15,7 @@ static int DEFENBS[] = {0}; #include <openair1/SCHED/fapi_l1.h> #include <openair1/PHY/INIT/phy_init.h> #include <openair2/LAYER2/MAC/mac_extern.h> +#include <openair1/PHY/LTE_REFSIG/lte_refsig.h> extern uint16_t sf_ahead; extern void oai_subframe_ind(uint16_t sfn, uint16_t sf); extern void fep_full(RU_t *ru); @@ -89,10 +90,6 @@ void init_RU_proc(RU_t *ru) { proc->frame_tx_unwrap = 0; for (i=0; i<10; i++) proc->symbol_mask[i]=0; - - pthread_mutex_init( &proc->mutex_synch,NULL); - pthread_cond_init( &proc->cond_synch,NULL); - pthread_cond_init( &proc->cond_eNBs, NULL); pthread_t t; threadCreate(&t, ru_thread, (void *)ru, "MainRu", -1, OAI_PRIORITY_RT_MAX); } @@ -166,6 +163,7 @@ void init_eNB_afterRU(void) { eNB = RC.eNB[inst][CC_id]; phy_init_lte_eNB(eNB,0,0); eNB->frame_parms.nb_antennas_rx = 0; + eNB->frame_parms.nb_antennas_tx = 0; eNB->prach_vars.rxsigF[0] = (int16_t **)malloc16(64*sizeof(int16_t *)); for (int ce_level=0; ce_level<4; ce_level++) { @@ -175,6 +173,7 @@ void init_eNB_afterRU(void) { for (ru_id=0,aa=0; ru_id<eNB->num_RU; ru_id++) { eNB->frame_parms.nb_antennas_rx += eNB->RU_list[ru_id]->nb_rx; + eNB->frame_parms.nb_antennas_tx += eNB->RU_list[ru_id]->nb_tx; AssertFatal(eNB->RU_list[ru_id]->common.rxdataF!=NULL, "RU %d : common.rxdataF is NULL\n", eNB->RU_list[ru_id]->idx); @@ -197,22 +196,9 @@ void init_eNB_afterRU(void) { * In monolithic mode, we come here with nb_antennas_rx == 0 * (not tested in other modes). */ - if (eNB->frame_parms.nb_antennas_rx < 1) { - LOG_I(PHY, "%s() ************* DJP ***** eNB->frame_parms.nb_antennas_rx:%d - GOING TO HARD CODE TO 1", __FUNCTION__, eNB->frame_parms.nb_antennas_rx); - eNB->frame_parms.nb_antennas_rx = 1; - } else { - //LOG_I(PHY," Delete code\n"); - } + AssertFatal( eNB->frame_parms.nb_antennas_rx > 0 && eNB->frame_parms.nb_antennas_rx < 4, ""); + AssertFatal( eNB->frame_parms.nb_antennas_tx > 0 && eNB->frame_parms.nb_antennas_rx < 4, ""); - if (eNB->frame_parms.nb_antennas_tx < 1) { - LOG_I(PHY, "%s() ************* DJP ***** eNB->frame_parms.nb_antennas_tx:%d - GOING TO HARD CODE TO 1", __FUNCTION__, eNB->frame_parms.nb_antennas_tx); - eNB->frame_parms.nb_antennas_tx = 1; - } else { - //LOG_I(PHY," Delete code\n"); - } - - AssertFatal(eNB->frame_parms.nb_antennas_rx >0, - "inst %d, CC_id %d : nb_antennas_rx %d\n",inst,CC_id,eNB->frame_parms.nb_antennas_rx); LOG_I(PHY,"inst %d, CC_id %d : nb_antennas_rx %d\n",inst,CC_id,eNB->frame_parms.nb_antennas_rx); init_transport(eNB); //init_precoding_weights(RC.eNB[inst][CC_id]); @@ -261,6 +247,7 @@ void stop_eNB(int nb_inst) { kill_eNB_proc(inst); } } + // this is for RU with local RF unit void fill_rf_config(RU_t *ru, char *rf_config_file) { int i; @@ -768,7 +755,7 @@ int stop_rf(RU_t *ru) { void set_function_spec_param(RU_t *ru) { switch (ru->if_south) { - case LOCAL_RF: { // this is an RU with integrated RF (RRU, eNB) + case LOCAL_RF: // this is an RU with integrated RF (RRU, eNB) ru->do_prach = 0; // no prach processing in RU ru->feprx = fep_full; ru->feptx_ofdm = feptx_ofdm; @@ -776,31 +763,16 @@ void set_function_spec_param(RU_t *ru) { ru->fh_north_in = NULL; // no incoming fronthaul from north ru->start_if = NULL; // no if interface ru->rfdevice.host_type = RAU_HOST; - } - - ru->fh_south_in = rx_rf; // local synchronous RF RX - ru->fh_south_out = tx_rf; // local synchronous RF TX - ru->start_rf = start_rf; // need to start the local RF interface - ru->stop_rf = stop_rf; - ru->eNB_top=eNB_top; - printf("configuring ru_id %d (start_rf %p)\n", ru->idx, start_rf); - /* - if (ru->function == eNodeB_3GPP) { // configure RF parameters only for 3GPP eNodeB, we need to get them from RAU otherwise - fill_rf_config(ru,rf_config_file); - init_frame_parms(&ru->frame_parms,1); - phy_init_RU(ru); - } - - ret = openair0_device_load(&ru->rfdevice,&ru->openair0_cfg); - if (setup_RU_buffers(ru)!=0) { - printf("Exiting, cannot initialize RU Buffers\n"); - exit(-1); - }*/ - break; - - default: - LOG_E(PHY,"RU with invalid or unknown southbound interface type %d\n",ru->if_south); + ru->fh_south_in = rx_rf; // local synchronous RF RX + ru->fh_south_out = tx_rf; // local synchronous RF TX + ru->start_rf = start_rf; // need to start the local RF interface + ru->stop_rf = stop_rf; + ru->eNB_top=eNB_top; break; + + default: + LOG_E(PHY,"RU with invalid or unknown southbound interface type %d\n",ru->if_south); + break; } // switch on interface type } diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 37e94de2b6f049c98d11ec51bc224bb6aae85dc7..de211376b22b607d0a06a56aa1fb35daaff0cc27 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -91,7 +91,6 @@ unsigned short config_frames[4] = {2,9,11,13}; #include "system.h" - #include "lte-softmodem.h" #include "NB_IoT_interface.h" @@ -163,7 +162,6 @@ extern void print_opp_meas(void); extern void init_eNB_afterRU(void); -extern void phy_free_RU(RU_t *); int transmission_mode=1; int emulate_rf = 0; @@ -296,11 +294,11 @@ static void get_options(void) { /* Read RC configuration file */ RCConfig(); NB_eNB_INST = RC.nb_inst; - LOG_I(ENB_APP,"Configuration: nb_rrc_inst %d, nb_L1_inst %d, nb_ru %d\n",NB_eNB_INST,RC.nb_L1_inst,RC.nb_RU); + printf("Configuration: nb_rrc_inst %d, nb_L1_inst %d, nb_ru %d\n",NB_eNB_INST,RC.nb_L1_inst,RC.nb_RU); if (!IS_SOFTMODEM_NONBIOT) { load_NB_IoT(); - LOG_I(ENB_APP," nb_nbiot_rrc_inst %d, nb_nbiot_L1_inst %d, nb_nbiot_macrlc_inst %d\n", + printf(" nb_nbiot_rrc_inst %d, nb_nbiot_L1_inst %d, nb_nbiot_macrlc_inst %d\n", RC.nb_nb_iot_rrc_inst, RC.nb_nb_iot_L1_inst, RC.nb_nb_iot_macrlc_inst); } else { printf("All Nb-IoT instances disabled\n"); @@ -532,25 +530,11 @@ int main( int argc, char **argv ) { } mode = normal_txrx; - + set_latency_target(); logInit(); printf("Reading in command-line options\n"); get_options (); - AssertFatal(!CONFIG_ISFLAGSET(CONFIG_ABORT),"Getting configuration failed\n"); - configure_linux(); - // to make a graceful exit when ctrl-c is pressed - signal(SIGSEGV, signal_handler); - signal(SIGINT, signal_handler); - signal(SIGTERM, signal_handler); - signal(SIGABRT, signal_handler); - cpuf=get_cpu_freq_GHz(); - - #ifndef PACKAGE_VERSION -# define PACKAGE_VERSION "UNKNOWN-EXPERIMENTAL" -#endif - LOG_I(HW, "OAI Version: %s\n", PACKAGE_VERSION); - if (is_nos1exec(argv[0]) ) set_softmodem_optmask(SOFTMODEM_NOS1_BIT); @@ -572,10 +556,30 @@ int main( int argc, char **argv ) { reset_opp_meas(); } + cpuf=get_cpu_freq_GHz(); + printf("ITTI init, useMME: %i\n",EPC_MODE_ENABLED); itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info); // allows to forward in wireshark L2 protocol for decoding + // initialize mscgen log after ITTI + if (get_softmodem_params()->start_msc) { + load_module_shlib("msc",NULL,0,&msc_interface); + } + + MSC_INIT(MSC_E_UTRAN, THREAD_MAX+TASK_MAX); init_opt(); + signal(SIGSEGV, signal_handler); + signal(SIGINT, signal_handler); + signal(SIGTERM, signal_handler); + signal(SIGABRT, signal_handler); + check_clock(); +#ifndef PACKAGE_VERSION +# define PACKAGE_VERSION "UNKNOWN-EXPERIMENTAL" +#endif + LOG_I(HW, "Version: %s\n", PACKAGE_VERSION); + printf("Runtime table\n"); + fill_modeled_runtime_table(runtime_phy_rx,runtime_phy_tx); + /* Read configuration */ if (RC.nb_inst > 0) { read_config_and_init(); @@ -596,7 +600,9 @@ int main( int argc, char **argv ) { } for (int enb_id = 0; enb_id < RC.nb_inst; enb_id++) { - openair_rrc_eNB_configuration(enb_id, &RC.rrc[enb_id]->configuration); + MessageDef *msg_p = itti_alloc_new_message (TASK_ENB_APP, RRC_CONFIGURATION_REQ); + RRC_CONFIGURATION_REQ(msg_p) = RC.rrc[enb_id]->configuration; + itti_send_msg_to_task (TASK_RRC_ENB, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p); } } else { printf("RC.nb_inst = 0, Initializing L1\n"); @@ -619,6 +625,7 @@ int main( int argc, char **argv ) { // init UE_PF_PO and mutex lock pthread_mutex_init(&ue_pf_po_mutex, NULL); memset (&UE_PF_PO[0][0], 0, sizeof(UE_PF_PO_t)*MAX_MOBILES_PER_ENB*MAX_NUM_CCs); + mlockall(MCL_CURRENT | MCL_FUTURE); pthread_cond_init(&sync_cond,NULL); pthread_mutex_init(&sync_mutex, NULL); @@ -648,11 +655,11 @@ 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); } + } - // no need to wait: openair_rrc_eNB_configuration() is called earlier from this thread - // openair_rrc_eNB_configuration()->init_SI()->rrc_mac_config_req_eNB ()->phy_config_request () sets the wait_eNBs() tested flag - // wait_eNBs(); - // printf("About to Init RU threads RC.nb_RU:%d\n", RC.nb_RU); + 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. @@ -664,7 +671,6 @@ int main( int argc, char **argv ) { 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; @@ -675,12 +681,13 @@ int main( int argc, char **argv ) { printf("wait RUs\n"); // end of CI modifications - // fixme: very weird usage of bitmask - // lack of mutex in: ru_thread_prach(),... + fflush(stdout); + fflush(stderr); // wait_RUs() is wrong and over complex! 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"); @@ -700,7 +707,6 @@ int main( int argc, char **argv ) { 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); @@ -726,6 +732,7 @@ int main( int argc, char **argv ) { * threads have been stopped (they partially use the same memory) */ for (int inst = 0; inst < NB_eNB_INST; inst++) { for (int cc_id = 0; cc_id < RC.nb_CC[inst]; cc_id++) { + free_transport(RC.eNB[inst][cc_id]); phy_free_lte_eNB(RC.eNB[inst][cc_id]); } }