diff --git a/openair-cn/NAS/nas_ue_task.c b/openair-cn/NAS/nas_ue_task.c index f610c5caeea8c11629101806070f9555ff21b09d..71a67185a10a8afc0742b57f0c6aecc60f76c0af 100644 --- a/openair-cn/NAS/nas_ue_task.c +++ b/openair-cn/NAS/nas_ue_task.c @@ -40,15 +40,16 @@ # define NAS_UE_AUTOSTART 1 extern unsigned char NB_eNB_INST; +extern unsigned char NB_UE_INST; static int user_fd; -static int nas_ue_process_events(struct epoll_event *events, int nb_events, unsigned int Mod_id) +static int nas_ue_process_events(struct epoll_event *events, int nb_events) { int event; int exit_loop = FALSE; - LOG_I(NAS, "[UE %d] Received %d events\n", Mod_id, nb_events); + LOG_I(NAS, "[UE] Received %d events\n", nb_events); for (event = 0; event < nb_events; event++) { if (events[event].events != 0) @@ -57,7 +58,7 @@ static int nas_ue_process_events(struct epoll_event *events, int nb_events, unsi if (events[event].data.fd == user_fd) { exit_loop = nas_user_receive_and_process(&user_fd); } else { - LOG_E(NAS, "[UE %d] Received an event from an unknown fd %d!\n", Mod_id, events[event].data.fd); + LOG_E(NAS, "[UE] Received an event from an unknown fd %d!\n", events[event].data.fd); } } } @@ -92,6 +93,19 @@ void *nas_ue_task(void *args_p) { nas_user_initialize (&user_api_emm_callback, &user_api_esm_callback, FIRMWARE_VERSION); } + /* Set UE activation state */ + for (instance = NB_eNB_INST; instance < (NB_eNB_INST + NB_UE_INST); instance++) + { + MessageDef *message_p; + +#if (NAS_UE_AUTOSTART == 0) + message_p = itti_alloc_new_message(TASK_NAS_UE, DEACTIVATE_MESSAGE); +#else + message_p = itti_alloc_new_message(TASK_NAS_UE, ACTIVATE_MESSAGE); +#endif + itti_send_msg_to_task(TASK_L2L1, instance, message_p); + } + while(1) { // Wait for a message or an event itti_receive_msg (TASK_NAS_UE, &msg_p); @@ -104,8 +118,8 @@ void *nas_ue_task(void *args_p) { switch (ITTI_MSG_ID(msg_p)) { case INITIALIZE_MESSAGE: LOG_I(NAS, "[UE %d] Received %s\n", Mod_id, msg_name); - #if defined(NAS_UE_AUTOSTART) - #endif +#if (NAS_UE_AUTOSTART != 0) +#endif break; case TERMINATE_MESSAGE: @@ -132,8 +146,8 @@ void *nas_ue_task(void *args_p) { nb_events = itti_get_events(TASK_NAS_UE, &events); if ((nb_events > 0) && (events != NULL)) { - if (nas_ue_process_events(events, nb_events, Mod_id) == TRUE) { - LOG_E(NAS, "[UE %d] Received exit loop\n", Mod_id); + if (nas_ue_process_events(events, nb_events) == TRUE) { + LOG_E(NAS, "[UE] Received exit loop\n"); } } } diff --git a/openair2/RRC/LITE/defs.h b/openair2/RRC/LITE/defs.h index 52a26fa12d09e96a151d2ea1216eb17e157c1d70..ce673b22850fa5ceaf8bc493de85946ba14a9544 100644 --- a/openair2/RRC/LITE/defs.h +++ b/openair2/RRC/LITE/defs.h @@ -86,6 +86,10 @@ # include "intertask_interface.h" #endif +#if defined(ENABLE_USE_MME) +# include "commonDef.h" +#endif + /** @defgroup _rrc_impl_ RRC Layer Reference Implementation * @ingroup _ref_implementation_ * @{ @@ -347,6 +351,10 @@ typedef struct OAI_UECapability_s { typedef struct UE_RRC_INST_s { RRC_STATE_t RrcState; +# if defined(ENABLE_USE_MME) + plmn_t plmnID; + Byte_t rat; +# endif uint8_t *UECapability; uint8_t UECapability_size; UE_RRC_INFO Info[NB_SIG_CNX_UE]; diff --git a/openair2/RRC/LITE/rrc_UE.c b/openair2/RRC/LITE/rrc_UE.c index 725491f117ff17f7ca59427fcf84b02e8ec9e202..3c02b7301685fd9faa0249848c30d7c64e81811d 100644 --- a/openair2/RRC/LITE/rrc_UE.c +++ b/openair2/RRC/LITE/rrc_UE.c @@ -2508,12 +2508,25 @@ void *rrc_ue_task(void *args_p) { LOG_I(RRC, "[UE %d] Received %s: state %d, plmnID %d, rat %x\n", Mod_id, msg_name, UE_rrc_inst[Mod_id].RrcState, NAS_CELL_SELECTION_REQ (msg_p).plmnID, NAS_CELL_SELECTION_REQ (msg_p).rat); + /* Save cell selection criterion */ + { + UE_rrc_inst[Mod_id].plmnID = NAS_CELL_SELECTION_REQ (msg_p).plmnID; + UE_rrc_inst[Mod_id].rat = NAS_CELL_SELECTION_REQ (msg_p).rat; + } + switch (UE_rrc_inst[Mod_id].RrcState) { case RRC_STATE_INACTIVE: - /* Need to first activate lower layers */ + { + /* Need to first activate lower layers */ + MessageDef *message_p; - UE_rrc_inst[Mod_id].RrcState = RRC_STATE_IDLE; - break; + message_p = itti_alloc_new_message(TASK_RRC_UE, ACTIVATE_MESSAGE); + + itti_send_msg_to_task(TASK_L2L1, NB_eNB_INST + Mod_id, message_p); + + UE_rrc_inst[Mod_id].RrcState = RRC_STATE_IDLE; + break; + } case RRC_STATE_IDLE: /* Ask to layer 1 to find a cell matching the criterion */ @@ -2540,18 +2553,19 @@ void *rrc_ue_task(void *args_p) { case NAS_UPLINK_DATA_REQ: { - uint32_t length; - uint8_t *buffer; + uint32_t length; + uint8_t *buffer; - LOG_I(RRC, "[UE %d] Received %s: UEid %d\n", Mod_id, msg_name, NAS_UPLINK_DATA_REQ (msg_p).UEid); + LOG_I(RRC, "[UE %d] Received %s: UEid %d\n", Mod_id, msg_name, NAS_UPLINK_DATA_REQ (msg_p).UEid); - /* Create message for PDCP (ULInformationTransfer_t) */ - length = do_ULInformationTransfer(&buffer, NAS_UPLINK_DATA_REQ (msg_p).nasMsg.length, NAS_UPLINK_DATA_REQ (msg_p).nasMsg.data); + /* Create message for PDCP (ULInformationTransfer_t) */ + length = do_ULInformationTransfer(&buffer, NAS_UPLINK_DATA_REQ (msg_p).nasMsg.length, NAS_UPLINK_DATA_REQ (msg_p).nasMsg.data); - /* Transfer data to PDCP */ - pdcp_rrc_data_req (instance, 0 /* TODO put frame number ! */, 0, DCCH, rrc_mui++, 0, length, buffer, 1); - break; + /* Transfer data to PDCP */ + pdcp_rrc_data_req (instance, 0 /* TODO put frame number ! */, 0, DCCH, rrc_mui++, 0, length, buffer, 1); + break; } +# endif case RRC_RAL_SCAN_REQ: { @@ -2573,7 +2587,6 @@ void *rrc_ue_task(void *args_p) { { LOG_I(RRC, "[UE %d] Received %s\n", Mod_id, msg_name); } -# endif default: LOG_E(RRC, "[UE %d] Received unexpected message %s\n", Mod_id, msg_name); diff --git a/targets/SIMU/USER/oaisim.c b/targets/SIMU/USER/oaisim.c index 30c0398bd6f5d5111ac85f1d317df3ec204b48b6..d3fd6d19e29a4c85a46fdac1ca68895f31cd7a4d 100644 --- a/targets/SIMU/USER/oaisim.c +++ b/targets/SIMU/USER/oaisim.c @@ -285,6 +285,16 @@ int log_thread_finalize() { return err; } +#if defined(ENABLE_ITTI) +static void set_cli_start(uint8_t instance, uint8_t start) { + if (instance < NB_eNB_INST) { + oai_emulation.info.cli_start_enb[instance] = start; + } else { + oai_emulation.info.cli_start_ue[instance - NB_eNB_INST] = start; + } +} +#endif + #ifdef OPENAIR2 int omv_write(int pfd, Node_list enb_node_list, Node_list ue_node_list, Data_Flow_Unit omv_data) { int i, j; @@ -478,6 +488,14 @@ void *l2l1_task(void *args_p) { case INITIALIZE_MESSAGE: break; + case ACTIVATE_MESSAGE: + set_cli_start(ITTI_MSG_INSTANCE (message_p), 1); + break; + + case DEACTIVATE_MESSAGE: + set_cli_start(ITTI_MSG_INSTANCE (message_p), 0); + break; + case TERMINATE_MESSAGE: itti_exit_task (); break; @@ -500,6 +518,14 @@ void *l2l1_task(void *args_p) { if (message_p != NULL) { switch (ITTI_MSG_ID(message_p)) { + case ACTIVATE_MESSAGE: + set_cli_start(ITTI_MSG_INSTANCE (message_p), 1); + break; + + case DEACTIVATE_MESSAGE: + set_cli_start(ITTI_MSG_INSTANCE (message_p), 0); + break; + case TERMINATE_MESSAGE: itti_exit_task (); break; @@ -650,67 +676,69 @@ void *l2l1_task(void *args_p) { clear_UE_transport_info (oai_emulation.info.nb_ue_local); for (UE_id = oai_emulation.info.first_ue_local; - (UE_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local)) - && (oai_emulation.info.cli_start_ue[UE_id] == 1); UE_id++) { - if (frame >= (UE_id * 20)) { // activate UE only after 20*UE_id frames so that different UEs turn on separately - - LOG_D( - EMU, - "PHY procedures UE %d for frame %d, slot %d (subframe TX %d, RX %d)\n", UE_id, frame, slot, next_slot >> 1, last_slot>>1); + (UE_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local)); UE_id++) { + if (oai_emulation.info.cli_start_ue[UE_id] != 0) { +#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME) + { +#else + if (frame >= (UE_id * 20)) { // activate UE only after 20*UE_id frames so that different UEs turn on separately +#endif + LOG_D(EMU, "PHY procedures UE %d for frame %d, slot %d (subframe TX %d, RX %d)\n", UE_id, frame, slot, next_slot >> 1, last_slot>>1); - if (PHY_vars_UE_g[UE_id]->UE_mode[0] != NOT_SYNCHED) { - if (frame > 0) { - PHY_vars_UE_g[UE_id]->frame = frame; + if (PHY_vars_UE_g[UE_id]->UE_mode[0] != NOT_SYNCHED) { + if (frame > 0) { + PHY_vars_UE_g[UE_id]->frame = frame; #ifdef OPENAIR2 - //Application - update_otg_UE (UE_id, oai_emulation.info.time_ms); + //Application + update_otg_UE (UE_id, oai_emulation.info.time_ms); - //Access layer - pdcp_run (frame, 0, UE_id, 0); + //Access layer + pdcp_run (frame, 0, UE_id, 0); #endif - phy_procedures_UE_lte (last_slot, next_slot, PHY_vars_UE_g[UE_id], 0, abstraction_flag, normal_txrx, - no_relay, NULL); - ue_data[UE_id]->tx_power_dBm = PHY_vars_UE_g[UE_id]->tx_power_dBm; + phy_procedures_UE_lte (last_slot, next_slot, PHY_vars_UE_g[UE_id], 0, abstraction_flag, normal_txrx, + no_relay, NULL); + ue_data[UE_id]->tx_power_dBm = PHY_vars_UE_g[UE_id]->tx_power_dBm; + } } - } - else { - if (abstraction_flag == 1) { - LOG_E( - EMU, - "sync not supported in abstraction mode (UE%d,mode%d)\n", UE_id, PHY_vars_UE_g[UE_id]->UE_mode[0]); - exit (-1); - } - if ((frame > 0) && (last_slot == (LTE_SLOTS_PER_FRAME - 2))) { - initial_sync (PHY_vars_UE_g[UE_id], normal_txrx); - - /* - write_output("dlchan00.m","dlch00",&(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[0][0][0]),(6*(PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)),1,1); - if (PHY_vars_UE_g[0]->lte_frame_parms.nb_antennas_rx>1) - write_output("dlchan01.m","dlch01",&(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[0][1][0]),(6*(PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)),1,1); - write_output("dlchan10.m","dlch10",&(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[0][2][0]),(6*(PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)),1,1); - if (PHY_vars_UE_g[0]->lte_frame_parms.nb_antennas_rx>1) - write_output("dlchan11.m","dlch11",&(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[0][3][0]),(6*(PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)),1,1); - write_output("rxsig.m","rxs",PHY_vars_UE_g[0]->lte_ue_common_vars.rxdata[0],PHY_vars_UE_g[0]->lte_frame_parms.samples_per_tti*10,1,1); - write_output("rxsigF.m","rxsF",PHY_vars_UE_g[0]->lte_ue_common_vars.rxdataF[0],2*PHY_vars_UE_g[0]->lte_frame_parms.symbols_per_tti*PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size,2,1); - write_output("pbch_rxF_ext0.m","pbch_ext0",PHY_vars_UE_g[0]->lte_ue_pbch_vars[0]->rxdataF_ext[0],6*12*4,1,1); - write_output("pbch_rxF_comp0.m","pbch_comp0",PHY_vars_UE_g[0]->lte_ue_pbch_vars[0]->rxdataF_comp[0],6*12*4,1,1); - write_output("pbch_rxF_llr.m","pbch_llr",PHY_vars_UE_g[0]->lte_ue_pbch_vars[0]->llr,(frame_parms->Ncp==0) ? 1920 : 1728,1,4); - */ + else { + if (abstraction_flag == 1) { + LOG_E( + EMU, + "sync not supported in abstraction mode (UE%d,mode%d)\n", UE_id, PHY_vars_UE_g[UE_id]->UE_mode[0]); + exit (-1); + } + if ((frame > 0) && (last_slot == (LTE_SLOTS_PER_FRAME - 2))) { + initial_sync (PHY_vars_UE_g[UE_id], normal_txrx); + + /* + write_output("dlchan00.m","dlch00",&(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[0][0][0]),(6*(PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)),1,1); + if (PHY_vars_UE_g[0]->lte_frame_parms.nb_antennas_rx>1) + write_output("dlchan01.m","dlch01",&(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[0][1][0]),(6*(PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)),1,1); + write_output("dlchan10.m","dlch10",&(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[0][2][0]),(6*(PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)),1,1); + if (PHY_vars_UE_g[0]->lte_frame_parms.nb_antennas_rx>1) + write_output("dlchan11.m","dlch11",&(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[0][3][0]),(6*(PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)),1,1); + write_output("rxsig.m","rxs",PHY_vars_UE_g[0]->lte_ue_common_vars.rxdata[0],PHY_vars_UE_g[0]->lte_frame_parms.samples_per_tti*10,1,1); + write_output("rxsigF.m","rxsF",PHY_vars_UE_g[0]->lte_ue_common_vars.rxdataF[0],2*PHY_vars_UE_g[0]->lte_frame_parms.symbols_per_tti*PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size,2,1); + write_output("pbch_rxF_ext0.m","pbch_ext0",PHY_vars_UE_g[0]->lte_ue_pbch_vars[0]->rxdataF_ext[0],6*12*4,1,1); + write_output("pbch_rxF_comp0.m","pbch_comp0",PHY_vars_UE_g[0]->lte_ue_pbch_vars[0]->rxdataF_comp[0],6*12*4,1,1); + write_output("pbch_rxF_llr.m","pbch_llr",PHY_vars_UE_g[0]->lte_ue_pbch_vars[0]->llr,(frame_parms->Ncp==0) ? 1920 : 1728,1,4); + */ + } } - } #ifdef PRINT_STATS - if(last_slot==2 && frame%10==0) - if (UE_stats_th[UE_id]) - fprintf(UE_stats_th[UE_id],"%d %d\n",frame, PHY_vars_UE_g[UE_id]->bitrate[0]/1000); - if (UE_stats[UE_id]) { - len = dump_ue_stats (PHY_vars_UE_g[UE_id], stats_buffer, 0, normal_txrx, 0); - rewind (UE_stats[UE_id]); - fwrite (stats_buffer, 1, len, UE_stats[UE_id]); - fflush(UE_stats[UE_id]); - } + if(last_slot==2 && frame%10==0) + if (UE_stats_th[UE_id]) + fprintf(UE_stats_th[UE_id],"%d %d\n",frame, PHY_vars_UE_g[UE_id]->bitrate[0]/1000); + if (UE_stats[UE_id]) { + len = dump_ue_stats (PHY_vars_UE_g[UE_id], stats_buffer, 0, normal_txrx, 0); + rewind (UE_stats[UE_id]); + fwrite (stats_buffer, 1, len, UE_stats[UE_id]); + fflush(UE_stats[UE_id]); + } #endif + } } } #ifdef Rel10