diff --git a/common/utils/ocp_itti/intertask_interface.cpp b/common/utils/ocp_itti/intertask_interface.cpp index 941e4de6efe582ce490178da4c173c9fa03a7426..8c4da1d92cee309fe8af83bba0701235ec5c88ce 100644 --- a/common/utils/ocp_itti/intertask_interface.cpp +++ b/common/utils/ocp_itti/intertask_interface.cpp @@ -30,17 +30,19 @@ extern "C" { #include <intertask_interface.h> #include <common/utils/system.h> +#include "executables/softmodem-common.h" - typedef struct timer_elm_s { - timer_type_t type; ///< Timer type - long instance; - long duration; - uint64_t timeout; - void *timer_arg; ///< Optional argument that will be passed when timer expires - } timer_elm_t ; +typedef struct timer_elm_s { + timer_type_t type; ///< Timer type + long instance; + long duration; + uint64_t timeout; + void *timer_arg; ///< Optional argument that will be passed when timer expires +} timer_elm_t; typedef struct task_list_s { task_info_t admin; + ittiTask_parms_t task_parms; pthread_t thread; pthread_mutex_t queue_cond_lock; std::vector<MessageDef *> message_queue; @@ -162,12 +164,12 @@ extern "C" { pthread_mutex_lock (&t->queue_cond_lock); int ret=itti_send_msg_to_task_locked(destination_task_id, destinationInstance, message); - while ( t->message_queue.size()>0 && t->admin.func != NULL ) { + while (t->message_queue.size() > 0 && t->task_parms.shortcut_func != NULL) { if (t->message_queue.size()>1) LOG_W(ITTI,"queue in no thread mode is %ld\n", t->message_queue.size()); pthread_mutex_unlock (&t->queue_cond_lock); - t->admin.func(NULL); + t->task_parms.shortcut_func(NULL); pthread_mutex_lock (&t->queue_cond_lock); } @@ -327,11 +329,20 @@ extern "C" { pthread_mutex_unlock (&t->queue_cond_lock); } - int itti_create_task(task_id_t task_id, - void *(*start_routine)(void *), - void *args_p) { + int itti_create_task(const task_id_t task_id, void *(*start_routine)(void *), const ittiTask_parms_t *parms) + { task_list_t *t=tasks[task_id]; - threadCreate (&t->thread, start_routine, args_p, (char *)itti_get_task_name(task_id),-1,OAI_PRIORITY_RT); + if (get_softmodem_params()->no_itti && task_id < sizeofArray(tasks_info) && parms && parms->shortcut_func) { + LOG_W(ITTI, "not starting the thread for %s, the msg processing will be done in place\n", tasks_info[task_id].name); + t->task_parms.shortcut_func = parms->shortcut_func; + return 0; + } + threadCreate(&t->thread, + start_routine, + parms ? parms->args_to_start_routine : NULL, + (char *)itti_get_task_name(task_id), + -1, + OAI_PRIORITY_RT); LOG_I(ITTI,"Created Posix thread %s\n", itti_get_task_name(task_id) ); return 0; } @@ -353,6 +364,7 @@ extern "C" { AssertFatal(new_tasks != NULL, "could not realloc() tasks list"); tasks = new_tasks; tasks[newQueue]= new task_list_t; + tasks[newQueue]->task_parms = {0}; pthread_mutex_unlock (&lock_nb_queues); LOG_I(ITTI,"Starting itti queue: %s as task %d\n", taskInfo->name, newQueue); pthread_mutex_init(&tasks[newQueue]->queue_cond_lock, NULL); @@ -361,9 +373,6 @@ extern "C" { AssertFatal( ( tasks[newQueue]->sem_fd = eventfd(0, EFD_SEMAPHORE) ) >=0, ""); itti_subscribe_event_fd((task_id_t)newQueue, tasks[newQueue]->sem_fd); - if (tasks[newQueue]->admin.threadFunc != NULL) - itti_create_task((task_id_t)newQueue, tasks[newQueue]->admin.threadFunc, NULL); - return newQueue; } diff --git a/common/utils/ocp_itti/intertask_interface.h b/common/utils/ocp_itti/intertask_interface.h index 4d761cefe1f571e167a92768805857e37fdc017d..7756499039960a9fb84ad3b8275f77fb2d047125 100644 --- a/common/utils/ocp_itti/intertask_interface.h +++ b/common/utils/ocp_itti/intertask_interface.h @@ -484,9 +484,11 @@ void itti_poll_msg(task_id_t task_id, MessageDef **received_msg); \param args_p Optional argument to pass to the start routine @returns -1 on failure, 0 otherwise **/ -int itti_create_task(task_id_t task_id, - void *(*start_routine) (void *), - void *args_p); +typedef struct { + void *args_to_start_routine; + void *(*shortcut_func)(void *); +} ittiTask_parms_t; +int itti_create_task(const task_id_t task_id, void *(*start_routine)(void *), const ittiTask_parms_t *args_p); int itti_create_queue(const task_info_t *task_info); diff --git a/executables/create_tasks_ue.c b/executables/create_tasks_ue.c index 2172827b03bca0a580abf975c3eade0e5cca8d19..728e4546b56c14f3f379688756613380a2e23312 100644 --- a/executables/create_tasks_ue.c +++ b/executables/create_tasks_ue.c @@ -47,8 +47,8 @@ int create_tasks_ue(uint32_t ue_nb) { if (users == NULL) abort(); users->count = ue_nb; - - if (itti_create_task (TASK_NAS_UE, nas_ue_task, users) < 0) { + ittiTask_parms_t parms = {users, NULL}; + if (itti_create_task(TASK_NAS_UE, nas_ue_task, &parms) < 0) { LOG_E(NAS, "Create task for NAS UE failed\n"); return -1; } diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c index e5332e8e5effe5839ab27c4f351b8f84601dcbed..eee4072eeb25d603d5ffafdc2e380d51f6fa0b2b 100644 --- a/executables/nr-uesoftmodem.c +++ b/executables/nr-uesoftmodem.c @@ -197,7 +197,8 @@ int create_tasks_nrue(uint32_t ue_nb) { if (ue_nb > 0) { LOG_I(NR_RRC,"create TASK_RRC_NRUE \n"); - if (itti_create_task (TASK_RRC_NRUE, rrc_nrue_task, NULL) < 0) { + const ittiTask_parms_t parmsRRC = {NULL, rrc_nrue}; + if (itti_create_task(TASK_RRC_NRUE, rrc_nrue_task, &parmsRRC) < 0) { LOG_E(NR_RRC, "Create task for RRC UE failed\n"); return -1; } @@ -208,7 +209,8 @@ int create_tasks_nrue(uint32_t ue_nb) { return -1; } } - if (itti_create_task (TASK_NAS_NRUE, nas_nrue_task, NULL) < 0) { + const ittiTask_parms_t parmsNAS = {NULL, nas_nrue}; + if (itti_create_task(TASK_NAS_NRUE, nas_nrue_task, &parmsNAS) < 0) { LOG_E(NR_RRC, "Create task for NAS UE failed\n"); return -1; } diff --git a/executables/softmodem-common.h b/executables/softmodem-common.h index aa26dd1afcec794973fa492665c6915bb1adc2a8..90915f9983e9cb77cb6acbe4eb00a3ea17a57225 100644 --- a/executables/softmodem-common.h +++ b/executables/softmodem-common.h @@ -109,6 +109,7 @@ extern "C" #define CONFIG_HLP_SYNC_REF "Sync Reference in Sidelink\n" #define CONFIG_HLP_NID1 "Set NID1 value in Sidelink\n" #define CONFIG_HLP_NID2 "Set NID2 value in Sidelink\n" +#define CONFIG_HLP_NOITTI "Do not start itti threads, call queue processing in place, inside the caller thread" /*-----------------------------------------------------------------------------------------------------------------------------------------------------*/ /* command line parameters common to eNodeB and UE */ @@ -190,6 +191,7 @@ extern int usrp_tx_thread; {"disable-stats", CONFIG_HLP_STATS_DISABLE, PARAMFLAG_BOOL, .iptr=&stats_disabled, .defintval=0, TYPE_INT, 0}, \ {"nid1", CONFIG_HLP_NID1, 0, .iptr=&NID1, .defintval=10, TYPE_INT, 0}, \ {"nid2", CONFIG_HLP_NID2, 0, .iptr=&NID2, .defintval=1, TYPE_INT, 0}, \ + {"no-itti-threads", CONFIG_HLP_NOITTI, PARAMFLAG_BOOL, .iptr=&softmodem_params.no_itti, .defintval=0, TYPE_INT, 0}, \ } // clang-format on @@ -238,6 +240,7 @@ extern int usrp_tx_thread; { .s5 = { NULL } }, \ { .s5 = { NULL } }, \ { .s5 = { NULL } }, \ + { .s5 = { NULL } }, \ } // clang-format on @@ -349,6 +352,7 @@ typedef struct { int sync_ref; int nid1; int nid2; + int no_itti; } softmodem_params_t; extern uint64_t get_softmodem_optmask(void); diff --git a/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c b/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c index bf1a60faf8d41526f13d7c4d5089dc56cc1751f1..ed7282378975650f2ae54d38748d7edddce854ca 100644 --- a/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c +++ b/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c @@ -51,3 +51,7 @@ int8_t nr_mac_rrc_data_ind_ue(const module_id_t module_id, const channel_t channel, const uint8_t* pduP, const sdu_size_t pdu_len) { return 0; } +void *rrc_nrue(void *notUsed) +{ + return NULL; +} diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c index 709ffa50e4bae956ae2baafefc4a45055cc81d40..b8a55e71e3b44fbab02f22039409c070e751895e 100644 --- a/openair2/RRC/NR_UE/rrc_UE.c +++ b/openair2/RRC/NR_UE/rrc_UE.c @@ -1729,172 +1729,193 @@ void nr_rrc_handle_ra_indication(unsigned int mod_id, bool ra_succeeded) // reconfigurationWithSync is included in spCellConfig } } - void *rrc_nrue_task(void *args_p) { - MessageDef *msg_p; - instance_t instance; - unsigned int ue_mod_id; - int result; - protocol_ctxt_t ctxt; - itti_mark_task_ready(TASK_RRC_NRUE); - - while(1) { - // Wait for a message - itti_receive_msg (TASK_RRC_NRUE, &msg_p); - instance = ITTI_MSG_DESTINATION_INSTANCE (msg_p); - ue_mod_id = UE_INSTANCE_TO_MODULE_ID(instance); - - switch (ITTI_MSG_ID(msg_p)) { - case TERMINATE_MESSAGE: - LOG_W(NR_RRC, " *** Exiting RRC thread\n"); - itti_exit_task (); - break; - - case MESSAGE_TEST: - LOG_D(NR_RRC, "[UE %d] Received %s\n", ue_mod_id, ITTI_MSG_NAME (msg_p)); - break; - - case NR_RRC_MAC_SYNC_IND: - LOG_D(NR_RRC, "[UE %d] Received %s: frame %d\n", - ue_mod_id, - ITTI_MSG_NAME (msg_p), - NR_RRC_MAC_SYNC_IND (msg_p).frame); - nr_sync_msg_t sync_msg = NR_RRC_MAC_SYNC_IND (msg_p).in_sync ? - IN_SYNC : OUT_OF_SYNC; - NR_UE_Timers_Constants_t *tac = &NR_UE_rrc_inst[ue_mod_id].timers_and_constants; - handle_rlf_sync(tac, sync_msg); - break; - - case NRRRC_FRAME_PROCESS: - LOG_D(NR_RRC, "[UE %d] Received %s: frame %d\n", - ue_mod_id, ITTI_MSG_NAME (msg_p), NRRRC_FRAME_PROCESS (msg_p).frame); - // increase the timers every 10ms (every new frame) - NR_UE_Timers_Constants_t *timers = &NR_UE_rrc_inst[ue_mod_id].timers_and_constants; - nr_rrc_handle_timers(timers); - NR_UE_RRC_SI_INFO *SInfo = &NR_UE_rrc_inst[ue_mod_id].SInfo[NRRRC_FRAME_PROCESS (msg_p).gnb_id]; - nr_rrc_SI_timers(SInfo); - break; - - case NR_RRC_MAC_MSG3_IND: - PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, GNB_FLAG_NO, NR_RRC_MAC_MSG3_IND (msg_p).rnti, 0, 0); - LOG_D(NR_RRC, "[UE %d] Received %s for RNTI %d\n", - ue_mod_id, - ITTI_MSG_NAME (msg_p), - NR_RRC_MAC_MSG3_IND (msg_p).rnti); - nr_rrc_ue_generate_ra_msg(ue_mod_id, NR_RRC_MAC_MSG3_IND (msg_p).rnti); - break; - - case NR_RRC_MAC_RA_IND: - LOG_D(NR_RRC, "[UE %d] Received %s: frame %d RA %s\n", - ue_mod_id, - ITTI_MSG_NAME (msg_p), - NR_RRC_MAC_RA_IND (msg_p).frame, - NR_RRC_MAC_RA_IND (msg_p).RA_succeeded ? "successful" : "failed"); - nr_rrc_handle_ra_indication(ue_mod_id, NR_RRC_MAC_RA_IND (msg_p).RA_succeeded); - break; - - case NR_RRC_MAC_BCCH_DATA_IND: - LOG_D(NR_RRC, "[UE %d] Received %s: gNB %d\n", ue_mod_id, ITTI_MSG_NAME (msg_p), - NR_RRC_MAC_BCCH_DATA_IND (msg_p).gnb_index); - NRRrcMacBcchDataInd *bcch = &NR_RRC_MAC_BCCH_DATA_IND (msg_p); - PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, ue_mod_id, GNB_FLAG_NO, NOT_A_RNTI, bcch->frame, 0, bcch->gnb_index); - if (bcch->is_bch) - nr_rrc_ue_decode_NR_BCCH_BCH_Message(ue_mod_id, - bcch->gnb_index, - bcch->sdu, - bcch->sdu_size); - else - nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message(ctxt.module_id, - bcch->gnb_index, - bcch->sdu, - bcch->sdu_size, - bcch->rsrq, - bcch->rsrp); - break; + itti_mark_task_ready(TASK_RRC_NRUE); - case NR_RRC_MAC_CCCH_DATA_IND: - PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, GNB_FLAG_NO, NR_RRC_MAC_CCCH_DATA_IND (msg_p).rnti, 0, 0); - nr_rrc_ue_decode_ccch(&ctxt, - NR_RRC_MAC_CCCH_DATA_IND (msg_p).sdu, - NR_RRC_MAC_CCCH_DATA_IND (msg_p).sdu_size, - /* gNB_index = */ 0); - break; - - /* PDCP messages */ - case NR_RRC_DCCH_DATA_IND: - PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, - NR_RRC_DCCH_DATA_IND (msg_p).module_id, - GNB_FLAG_NO, - NR_RRC_DCCH_DATA_IND (msg_p).rnti, - NR_RRC_DCCH_DATA_IND (msg_p).frame, - 0, - NR_RRC_DCCH_DATA_IND (msg_p).gNB_index); - LOG_D(NR_RRC, "[UE %d] Received %s: frameP %d, DCCH %d, gNB %d\n", - NR_RRC_DCCH_DATA_IND (msg_p).module_id, - ITTI_MSG_NAME (msg_p), - NR_RRC_DCCH_DATA_IND (msg_p).frame, - NR_RRC_DCCH_DATA_IND (msg_p).dcch_index, - NR_RRC_DCCH_DATA_IND (msg_p).gNB_index); - LOG_D(NR_RRC, PROTOCOL_RRC_CTXT_UE_FMT"Received %s DCCH %d, gNB %d\n", - PROTOCOL_NR_RRC_CTXT_UE_ARGS(&ctxt), - ITTI_MSG_NAME (msg_p), - NR_RRC_DCCH_DATA_IND (msg_p).dcch_index, - NR_RRC_DCCH_DATA_IND (msg_p).gNB_index); - nr_rrc_ue_decode_dcch ( - &ctxt, - NR_RRC_DCCH_DATA_IND (msg_p).dcch_index, - NR_RRC_DCCH_DATA_IND (msg_p).sdu_p, - NR_RRC_DCCH_DATA_IND (msg_p).sdu_size, - NR_RRC_DCCH_DATA_IND (msg_p).gNB_index); - break; - - case NAS_KENB_REFRESH_REQ: - memcpy((void *)NR_UE_rrc_inst[ue_mod_id].kgnb, (void *)NAS_KENB_REFRESH_REQ(msg_p).kenb, sizeof(NR_UE_rrc_inst[ue_mod_id].kgnb)); - LOG_D(RRC, "[UE %d] Received %s: refreshed RRC::KgNB = " - "%02x%02x%02x%02x" - "%02x%02x%02x%02x" - "%02x%02x%02x%02x" - "%02x%02x%02x%02x" - "%02x%02x%02x%02x" - "%02x%02x%02x%02x" - "%02x%02x%02x%02x" - "%02x%02x%02x%02x\n", - ue_mod_id, ITTI_MSG_NAME (msg_p), - NR_UE_rrc_inst[ue_mod_id].kgnb[0], NR_UE_rrc_inst[ue_mod_id].kgnb[1], NR_UE_rrc_inst[ue_mod_id].kgnb[2], NR_UE_rrc_inst[ue_mod_id].kgnb[3], - NR_UE_rrc_inst[ue_mod_id].kgnb[4], NR_UE_rrc_inst[ue_mod_id].kgnb[5], NR_UE_rrc_inst[ue_mod_id].kgnb[6], NR_UE_rrc_inst[ue_mod_id].kgnb[7], - NR_UE_rrc_inst[ue_mod_id].kgnb[8], NR_UE_rrc_inst[ue_mod_id].kgnb[9], NR_UE_rrc_inst[ue_mod_id].kgnb[10], NR_UE_rrc_inst[ue_mod_id].kgnb[11], - NR_UE_rrc_inst[ue_mod_id].kgnb[12], NR_UE_rrc_inst[ue_mod_id].kgnb[13], NR_UE_rrc_inst[ue_mod_id].kgnb[14], NR_UE_rrc_inst[ue_mod_id].kgnb[15], - NR_UE_rrc_inst[ue_mod_id].kgnb[16], NR_UE_rrc_inst[ue_mod_id].kgnb[17], NR_UE_rrc_inst[ue_mod_id].kgnb[18], NR_UE_rrc_inst[ue_mod_id].kgnb[19], - NR_UE_rrc_inst[ue_mod_id].kgnb[20], NR_UE_rrc_inst[ue_mod_id].kgnb[21], NR_UE_rrc_inst[ue_mod_id].kgnb[22], NR_UE_rrc_inst[ue_mod_id].kgnb[23], - NR_UE_rrc_inst[ue_mod_id].kgnb[24], NR_UE_rrc_inst[ue_mod_id].kgnb[25], NR_UE_rrc_inst[ue_mod_id].kgnb[26], NR_UE_rrc_inst[ue_mod_id].kgnb[27], - NR_UE_rrc_inst[ue_mod_id].kgnb[28], NR_UE_rrc_inst[ue_mod_id].kgnb[29], NR_UE_rrc_inst[ue_mod_id].kgnb[30], NR_UE_rrc_inst[ue_mod_id].kgnb[31]); - break; - - case NAS_UPLINK_DATA_REQ: { - uint32_t length; - uint8_t *buffer; - LOG_I(NR_RRC, "[UE %d] Received %s: UEid %d\n", ue_mod_id, ITTI_MSG_NAME (msg_p), NAS_UPLINK_DATA_REQ (msg_p).UEid); - /* Create message for PDCP (ULInformationTransfer_t) */ - length = do_NR_ULInformationTransfer(&buffer, NAS_UPLINK_DATA_REQ (msg_p).nasMsg.length, NAS_UPLINK_DATA_REQ (msg_p).nasMsg.data); - /* Transfer data to PDCP */ - PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, ue_mod_id, GNB_FLAG_NO, NR_UE_rrc_inst[ue_mod_id].rnti, 0, 0,0); - // check if SRB2 is created, if yes request data_req on SRB2 - rb_id_t srb_id = NR_UE_rrc_inst[ue_mod_id].Srb[0][2].status == RB_ESTABLISHED ? 2 : 1; - nr_pdcp_data_req_srb(ctxt.rntiMaybeUEid, srb_id, nr_rrc_mui++, length, buffer, deliver_pdu_srb_rlc, NULL); - break; - } + while (1) { + rrc_nrue(NULL); + } +} - default: - LOG_E(NR_RRC, "[UE %d] Received unexpected message %s\n", ue_mod_id, ITTI_MSG_NAME (msg_p)); - break; +void *rrc_nrue(void *notUsed) +{ + protocol_ctxt_t ctxt; + + MessageDef *msg_p = NULL; + itti_receive_msg(TASK_RRC_NRUE, &msg_p); + instance_t instance = ITTI_MSG_DESTINATION_INSTANCE(msg_p); + unsigned int ue_mod_id = UE_INSTANCE_TO_MODULE_ID(instance); + + switch (ITTI_MSG_ID(msg_p)) { + case TERMINATE_MESSAGE: + LOG_W(NR_RRC, " *** Exiting RRC thread\n"); + itti_exit_task(); + break; + + case MESSAGE_TEST: + LOG_D(NR_RRC, "[UE %d] Received %s\n", ue_mod_id, ITTI_MSG_NAME(msg_p)); + break; + + case NR_RRC_MAC_SYNC_IND: + LOG_D(NR_RRC, "[UE %d] Received %s: frame %d\n", ue_mod_id, ITTI_MSG_NAME(msg_p), NR_RRC_MAC_SYNC_IND(msg_p).frame); + nr_sync_msg_t sync_msg = NR_RRC_MAC_SYNC_IND(msg_p).in_sync ? IN_SYNC : OUT_OF_SYNC; + NR_UE_Timers_Constants_t *tac = &NR_UE_rrc_inst[ue_mod_id].timers_and_constants; + handle_rlf_sync(tac, sync_msg); + break; + + case NRRRC_FRAME_PROCESS: + LOG_D(NR_RRC, "[UE %d] Received %s: frame %d\n", ue_mod_id, ITTI_MSG_NAME(msg_p), NRRRC_FRAME_PROCESS(msg_p).frame); + // increase the timers every 10ms (every new frame) + NR_UE_Timers_Constants_t *timers = &NR_UE_rrc_inst[ue_mod_id].timers_and_constants; + nr_rrc_handle_timers(timers); + NR_UE_RRC_SI_INFO *SInfo = &NR_UE_rrc_inst[ue_mod_id].SInfo[NRRRC_FRAME_PROCESS(msg_p).gnb_id]; + nr_rrc_SI_timers(SInfo); + break; + + case NR_RRC_MAC_MSG3_IND: + PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, GNB_FLAG_NO, NR_RRC_MAC_MSG3_IND(msg_p).rnti, 0, 0); + LOG_D(NR_RRC, "[UE %d] Received %s for RNTI %d\n", ue_mod_id, ITTI_MSG_NAME(msg_p), NR_RRC_MAC_MSG3_IND(msg_p).rnti); + nr_rrc_ue_generate_ra_msg(ue_mod_id, NR_RRC_MAC_MSG3_IND(msg_p).rnti); + break; + + case NR_RRC_MAC_RA_IND: + LOG_D(NR_RRC, + "[UE %d] Received %s: frame %d RA %s\n", + ue_mod_id, + ITTI_MSG_NAME(msg_p), + NR_RRC_MAC_RA_IND(msg_p).frame, + NR_RRC_MAC_RA_IND(msg_p).RA_succeeded ? "successful" : "failed"); + nr_rrc_handle_ra_indication(ue_mod_id, NR_RRC_MAC_RA_IND(msg_p).RA_succeeded); + break; + + case NR_RRC_MAC_BCCH_DATA_IND: + LOG_D(NR_RRC, "[UE %d] Received %s: gNB %d\n", ue_mod_id, ITTI_MSG_NAME(msg_p), NR_RRC_MAC_BCCH_DATA_IND(msg_p).gnb_index); + NRRrcMacBcchDataInd *bcch = &NR_RRC_MAC_BCCH_DATA_IND(msg_p); + PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, ue_mod_id, GNB_FLAG_NO, NOT_A_RNTI, bcch->frame, 0, bcch->gnb_index); + if (bcch->is_bch) + nr_rrc_ue_decode_NR_BCCH_BCH_Message(ue_mod_id, bcch->gnb_index, bcch->sdu, bcch->sdu_size); + else + nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message(ctxt.module_id, + bcch->gnb_index, + bcch->sdu, + bcch->sdu_size, + bcch->rsrq, + bcch->rsrp); + break; + + case NR_RRC_MAC_CCCH_DATA_IND: + PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, GNB_FLAG_NO, NR_RRC_MAC_CCCH_DATA_IND(msg_p).rnti, 0, 0); + nr_rrc_ue_decode_ccch(&ctxt, + NR_RRC_MAC_CCCH_DATA_IND(msg_p).sdu, + NR_RRC_MAC_CCCH_DATA_IND(msg_p).sdu_size, + /* gNB_index = */ 0); + break; + + /* PDCP messages */ + case NR_RRC_DCCH_DATA_IND: + PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, + NR_RRC_DCCH_DATA_IND(msg_p).module_id, + GNB_FLAG_NO, + NR_RRC_DCCH_DATA_IND(msg_p).rnti, + NR_RRC_DCCH_DATA_IND(msg_p).frame, + 0, + NR_RRC_DCCH_DATA_IND(msg_p).gNB_index); + LOG_D(NR_RRC, + "[UE %d] Received %s: frameP %d, DCCH %d, gNB %d\n", + NR_RRC_DCCH_DATA_IND(msg_p).module_id, + ITTI_MSG_NAME(msg_p), + NR_RRC_DCCH_DATA_IND(msg_p).frame, + NR_RRC_DCCH_DATA_IND(msg_p).dcch_index, + NR_RRC_DCCH_DATA_IND(msg_p).gNB_index); + LOG_D(NR_RRC, + PROTOCOL_RRC_CTXT_UE_FMT "Received %s DCCH %d, gNB %d\n", + PROTOCOL_NR_RRC_CTXT_UE_ARGS(&ctxt), + ITTI_MSG_NAME(msg_p), + NR_RRC_DCCH_DATA_IND(msg_p).dcch_index, + NR_RRC_DCCH_DATA_IND(msg_p).gNB_index); + nr_rrc_ue_decode_dcch(&ctxt, + NR_RRC_DCCH_DATA_IND(msg_p).dcch_index, + NR_RRC_DCCH_DATA_IND(msg_p).sdu_p, + NR_RRC_DCCH_DATA_IND(msg_p).sdu_size, + NR_RRC_DCCH_DATA_IND(msg_p).gNB_index); + break; + + case NAS_KENB_REFRESH_REQ: + memcpy((void *)NR_UE_rrc_inst[ue_mod_id].kgnb, + (void *)NAS_KENB_REFRESH_REQ(msg_p).kenb, + sizeof(NR_UE_rrc_inst[ue_mod_id].kgnb)); + LOG_D(RRC, + "[UE %d] Received %s: refreshed RRC::KgNB = " + "%02x%02x%02x%02x" + "%02x%02x%02x%02x" + "%02x%02x%02x%02x" + "%02x%02x%02x%02x" + "%02x%02x%02x%02x" + "%02x%02x%02x%02x" + "%02x%02x%02x%02x" + "%02x%02x%02x%02x\n", + ue_mod_id, + ITTI_MSG_NAME(msg_p), + NR_UE_rrc_inst[ue_mod_id].kgnb[0], + NR_UE_rrc_inst[ue_mod_id].kgnb[1], + NR_UE_rrc_inst[ue_mod_id].kgnb[2], + NR_UE_rrc_inst[ue_mod_id].kgnb[3], + NR_UE_rrc_inst[ue_mod_id].kgnb[4], + NR_UE_rrc_inst[ue_mod_id].kgnb[5], + NR_UE_rrc_inst[ue_mod_id].kgnb[6], + NR_UE_rrc_inst[ue_mod_id].kgnb[7], + NR_UE_rrc_inst[ue_mod_id].kgnb[8], + NR_UE_rrc_inst[ue_mod_id].kgnb[9], + NR_UE_rrc_inst[ue_mod_id].kgnb[10], + NR_UE_rrc_inst[ue_mod_id].kgnb[11], + NR_UE_rrc_inst[ue_mod_id].kgnb[12], + NR_UE_rrc_inst[ue_mod_id].kgnb[13], + NR_UE_rrc_inst[ue_mod_id].kgnb[14], + NR_UE_rrc_inst[ue_mod_id].kgnb[15], + NR_UE_rrc_inst[ue_mod_id].kgnb[16], + NR_UE_rrc_inst[ue_mod_id].kgnb[17], + NR_UE_rrc_inst[ue_mod_id].kgnb[18], + NR_UE_rrc_inst[ue_mod_id].kgnb[19], + NR_UE_rrc_inst[ue_mod_id].kgnb[20], + NR_UE_rrc_inst[ue_mod_id].kgnb[21], + NR_UE_rrc_inst[ue_mod_id].kgnb[22], + NR_UE_rrc_inst[ue_mod_id].kgnb[23], + NR_UE_rrc_inst[ue_mod_id].kgnb[24], + NR_UE_rrc_inst[ue_mod_id].kgnb[25], + NR_UE_rrc_inst[ue_mod_id].kgnb[26], + NR_UE_rrc_inst[ue_mod_id].kgnb[27], + NR_UE_rrc_inst[ue_mod_id].kgnb[28], + NR_UE_rrc_inst[ue_mod_id].kgnb[29], + NR_UE_rrc_inst[ue_mod_id].kgnb[30], + NR_UE_rrc_inst[ue_mod_id].kgnb[31]); + break; + + case NAS_UPLINK_DATA_REQ: { + uint32_t length; + uint8_t *buffer; + LOG_I(NR_RRC, "[UE %d] Received %s: UEid %d\n", ue_mod_id, ITTI_MSG_NAME(msg_p), NAS_UPLINK_DATA_REQ(msg_p).UEid); + /* Create message for PDCP (ULInformationTransfer_t) */ + length = + do_NR_ULInformationTransfer(&buffer, NAS_UPLINK_DATA_REQ(msg_p).nasMsg.length, NAS_UPLINK_DATA_REQ(msg_p).nasMsg.data); + /* Transfer data to PDCP */ + PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, ue_mod_id, GNB_FLAG_NO, NR_UE_rrc_inst[ue_mod_id].rnti, 0, 0, 0); + // check if SRB2 is created, if yes request data_req on SRB2 + rb_id_t srb_id = NR_UE_rrc_inst[ue_mod_id].Srb[0][2].status == RB_ESTABLISHED ? 2 : 1; + nr_pdcp_data_req_srb(ctxt.rntiMaybeUEid, srb_id, nr_rrc_mui++, length, buffer, deliver_pdu_srb_rlc, NULL); + break; } - LOG_D(NR_RRC, "[UE %d] RRC Status %d\n", ue_mod_id, NR_UE_rrc_inst[ue_mod_id].nrRrcState); - result = itti_free(ITTI_MSG_ORIGIN_ID(msg_p), msg_p); - AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); - msg_p = NULL; + + default: + LOG_E(NR_RRC, "[UE %d] Received unexpected message %s\n", ue_mod_id, ITTI_MSG_NAME(msg_p)); + break; } + LOG_D(NR_RRC, "[UE %d] RRC Status %d\n", ue_mod_id, NR_UE_rrc_inst[ue_mod_id].nrRrcState); + int result = itti_free(ITTI_MSG_ORIGIN_ID(msg_p), msg_p); + AssertFatal(result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); + return NULL; } + void nr_rrc_ue_process_sidelink_radioResourceConfig( module_id_t Mod_idP, uint8_t gNB_index, diff --git a/openair2/RRC/NR_UE/rrc_proto.h b/openair2/RRC/NR_UE/rrc_proto.h index 335b9ba84d92b48519f857320202fb257fe83280..69c2d1af822bf961529cfda2f21fa9c1b0d0bef0 100644 --- a/openair2/RRC/NR_UE/rrc_proto.h +++ b/openair2/RRC/NR_UE/rrc_proto.h @@ -114,6 +114,7 @@ int8_t nr_rrc_RA_succeeded(const module_id_t mod_id, const uint8_t gNB_index); /**\brief RRC UE task. \param void *args_p Pointer on arguments to start the task. */ void *rrc_nrue_task(void *args_p); +void *rrc_nrue(void *args_p); void nr_rrc_handle_timers(NR_UE_Timers_Constants_t *timers); diff --git a/openair3/NAS/NR_UE/nr_nas_msg_sim.c b/openair3/NAS/NR_UE/nr_nas_msg_sim.c index 59ff269edd0846028034c2bd33efdd8d928f6dcb..015b2a8f9e5dfa3fd115826b906e49226ba23434 100644 --- a/openair3/NAS/NR_UE/nr_nas_msg_sim.c +++ b/openair3/NAS/NR_UE/nr_nas_msg_sim.c @@ -57,7 +57,7 @@ uint8_t *registration_request_buf; uint32_t registration_request_len; extern char *baseNetAddress; extern uint16_t NB_UE_INST; -static nr_ue_nas_t nr_ue_nas; +static nr_ue_nas_t nr_ue_nas = {0}; static int nas_protected_security_header_encode( char *buffer, @@ -416,6 +416,8 @@ void derive_ue_keys(uint8_t *buf, nr_ue_nas_t *nas) { nr_ue_nas_t *get_ue_nas_info(module_id_t module_id) { DevAssert(module_id == 0); + if (!nr_ue_nas.uicc) + nr_ue_nas.uicc = checkUicc(0); return &nr_ue_nas; } @@ -912,97 +914,105 @@ static void send_nas_uplink_data_req(instance_t instance, const as_nas_info_t *i void *nas_nrue_task(void *args_p) { - MessageDef *msg_p; - instance_t instance; - int result; - uint8_t msg_type = 0; - uint8_t *pdu_buffer = NULL; - + nr_ue_nas.uicc = checkUicc(0); + while (1) { + nas_nrue(NULL); + } +} +void *nas_nrue(void *args_p) +{ + // Wait for a message or an event nr_ue_nas.uicc = checkUicc(0); - nr_ue_nas_t *nas = get_ue_nas_info(0); - itti_mark_task_ready (TASK_NAS_NRUE); - - while(1) { - // Wait for a message or an event - itti_receive_msg (TASK_NAS_NRUE, &msg_p); + MessageDef *msg_p; + itti_receive_msg(TASK_NAS_NRUE, &msg_p); - if (msg_p != NULL) { - instance = msg_p->ittiMsgHeader.originInstance; - AssertFatal(instance == 0, "cannot handle more than one UE!\n"); + if (msg_p != NULL) { + instance_t instance = msg_p->ittiMsgHeader.originInstance; + AssertFatal(instance == 0, "cannot handle more than one UE!\n"); - switch (ITTI_MSG_ID(msg_p)) { - case INITIALIZE_MESSAGE: + switch (ITTI_MSG_ID(msg_p)) { + case INITIALIZE_MESSAGE: - break; + break; - case TERMINATE_MESSAGE: - itti_exit_task(); - break; + case TERMINATE_MESSAGE: + itti_exit_task(); + break; - case MESSAGE_TEST: - break; + case MESSAGE_TEST: + break; - case NAS_CELL_SELECTION_CNF: - LOG_I(NAS, - "[UE %ld] Received %s: errCode %u, cellID %u, tac %u\n", - instance, - ITTI_MSG_NAME(msg_p), - NAS_CELL_SELECTION_CNF(msg_p).errCode, - NAS_CELL_SELECTION_CNF(msg_p).cellID, - NAS_CELL_SELECTION_CNF(msg_p).tac); - // as_stmsi_t s_tmsi={0, 0}; - // as_nas_info_t nas_info; - // plmn_t plmnID={0, 0, 0, 0}; - // generateRegistrationRequest(&nas_info); - // nr_nas_itti_nas_establish_req(0, AS_TYPE_ORIGINATING_SIGNAL, s_tmsi, plmnID, nas_info.data, nas_info.length, 0); - break; + case NAS_CELL_SELECTION_CNF: + LOG_I(NAS, + "[UE %ld] Received %s: errCode %u, cellID %u, tac %u\n", + instance, + ITTI_MSG_NAME(msg_p), + NAS_CELL_SELECTION_CNF(msg_p).errCode, + NAS_CELL_SELECTION_CNF(msg_p).cellID, + NAS_CELL_SELECTION_CNF(msg_p).tac); + // as_stmsi_t s_tmsi={0, 0}; + // as_nas_info_t nas_info; + // plmn_t plmnID={0, 0, 0, 0}; + // generateRegistrationRequest(&nas_info); + // nr_nas_itti_nas_establish_req(0, AS_TYPE_ORIGINATING_SIGNAL, s_tmsi, plmnID, nas_info.data, nas_info.length, 0); + break; - case NAS_CELL_SELECTION_IND: - LOG_I(NAS, "[UE %ld] Received %s: cellID %u, tac %u\n", instance, ITTI_MSG_NAME(msg_p), NAS_CELL_SELECTION_IND(msg_p).cellID, NAS_CELL_SELECTION_IND(msg_p).tac); + case NAS_CELL_SELECTION_IND: + LOG_I(NAS, + "[UE %ld] Received %s: cellID %u, tac %u\n", + instance, + ITTI_MSG_NAME(msg_p), + NAS_CELL_SELECTION_IND(msg_p).cellID, + NAS_CELL_SELECTION_IND(msg_p).tac); - /* TODO not processed by NAS currently */ - break; + /* TODO not processed by NAS currently */ + break; - case NAS_PAGING_IND: - LOG_I(NAS, "[UE %ld] Received %s: cause %u\n", instance, ITTI_MSG_NAME(msg_p), NAS_PAGING_IND(msg_p).cause); + case NAS_PAGING_IND: + LOG_I(NAS, "[UE %ld] Received %s: cause %u\n", instance, ITTI_MSG_NAME(msg_p), NAS_PAGING_IND(msg_p).cause); - /* TODO not processed by NAS currently */ - break; + /* TODO not processed by NAS currently */ + break; - case NAS_CONN_ESTABLI_CNF: { - LOG_I(NAS, "[UE %ld] Received %s: errCode %u, length %u\n", instance, ITTI_MSG_NAME(msg_p), NAS_CONN_ESTABLI_CNF(msg_p).errCode, NAS_CONN_ESTABLI_CNF(msg_p).nasMsg.length); + case NAS_CONN_ESTABLI_CNF: { + LOG_I(NAS, + "[UE %ld] Received %s: errCode %u, length %u\n", + instance, + ITTI_MSG_NAME(msg_p), + NAS_CONN_ESTABLI_CNF(msg_p).errCode, + NAS_CONN_ESTABLI_CNF(msg_p).nasMsg.length); - pdu_buffer = NAS_CONN_ESTABLI_CNF(msg_p).nasMsg.data; - msg_type = get_msg_type(pdu_buffer, NAS_CONN_ESTABLI_CNF(msg_p).nasMsg.length); + uint8_t *pdu_buffer = NAS_CONN_ESTABLI_CNF(msg_p).nasMsg.data; + int msg_type = get_msg_type(pdu_buffer, NAS_CONN_ESTABLI_CNF(msg_p).nasMsg.length); - if (msg_type == REGISTRATION_ACCEPT) { - LOG_I(NAS, "[UE] Received REGISTRATION ACCEPT message\n"); - decodeRegistrationAccept(pdu_buffer, NAS_CONN_ESTABLI_CNF(msg_p).nasMsg.length, nas); + if (msg_type == REGISTRATION_ACCEPT) { + LOG_I(NAS, "[UE] Received REGISTRATION ACCEPT message\n"); + nr_ue_nas_t *nas = get_ue_nas_info(0); + decodeRegistrationAccept(pdu_buffer, NAS_CONN_ESTABLI_CNF(msg_p).nasMsg.length, nas); - as_nas_info_t initialNasMsg = {0}; - generateRegistrationComplete(nas, &initialNasMsg, NULL); - if (initialNasMsg.length > 0) { - send_nas_uplink_data_req(instance, &initialNasMsg); - LOG_I(NAS, "Send NAS_UPLINK_DATA_REQ message(RegistrationComplete)\n"); - } + as_nas_info_t initialNasMsg = {0}; + generateRegistrationComplete(nas, &initialNasMsg, NULL); + if (initialNasMsg.length > 0) { + send_nas_uplink_data_req(instance, &initialNasMsg); + LOG_I(NAS, "Send NAS_UPLINK_DATA_REQ message(RegistrationComplete)\n"); + } - as_nas_info_t pduEstablishMsg = {0}; - generatePduSessionEstablishRequest(nas, &pduEstablishMsg); - if (pduEstablishMsg.length > 0) { - send_nas_uplink_data_req(instance, &pduEstablishMsg); - LOG_I(NAS, "Send NAS_UPLINK_DATA_REQ message(PduSessionEstablishRequest)\n"); - } - } else if (msg_type == FGS_PDU_SESSION_ESTABLISHMENT_ACC) { - capture_pdu_session_establishment_accept_msg(pdu_buffer, NAS_CONN_ESTABLI_CNF(msg_p).nasMsg.length); + as_nas_info_t pduEstablishMsg = {0}; + generatePduSessionEstablishRequest(nas, &pduEstablishMsg); + if (pduEstablishMsg.length > 0) { + send_nas_uplink_data_req(instance, &pduEstablishMsg); + LOG_I(NAS, "Send NAS_UPLINK_DATA_REQ message(PduSessionEstablishRequest)\n"); } + } else if (msg_type == FGS_PDU_SESSION_ESTABLISHMENT_ACC) { + capture_pdu_session_establishment_accept_msg(pdu_buffer, NAS_CONN_ESTABLI_CNF(msg_p).nasMsg.length); + } - break; + break; } case NAS_CONN_RELEASE_IND: - LOG_I(NAS, "[UE %ld] Received %s: cause %u\n", instance, ITTI_MSG_NAME (msg_p), - NAS_CONN_RELEASE_IND (msg_p).cause); + LOG_I(NAS, "[UE %ld] Received %s: cause %u\n", instance, ITTI_MSG_NAME(msg_p), NAS_CONN_RELEASE_IND(msg_p).cause); /* the following is not clean, but probably necessary: we need to give * time to RLC to Ack the SRB1 PDU which contained the RRC release * message. Hence, we just below wait some time, before finally @@ -1012,45 +1022,48 @@ void *nas_nrue_task(void *args_p) break; case NAS_UPLINK_DATA_CNF: - LOG_I(NAS, "[UE %ld] Received %s: UEid %u, errCode %u\n", instance, ITTI_MSG_NAME (msg_p), - NAS_UPLINK_DATA_CNF (msg_p).UEid, NAS_UPLINK_DATA_CNF (msg_p).errCode); + LOG_I(NAS, + "[UE %ld] Received %s: UEid %u, errCode %u\n", + instance, + ITTI_MSG_NAME(msg_p), + NAS_UPLINK_DATA_CNF(msg_p).UEid, + NAS_UPLINK_DATA_CNF(msg_p).errCode); break; case NAS_DEREGISTRATION_REQ: { - LOG_I(NAS, "[UE %ld] Received %s\n", instance, ITTI_MSG_NAME(msg_p)); - if (nas->guti) { - nas_deregistration_req_t *req = &NAS_DEREGISTRATION_REQ(msg_p); - as_nas_info_t initialNasMsg = {0}; - generateDeregistrationRequest(nas, &initialNasMsg, req); - send_nas_uplink_data_req(instance, &initialNasMsg); - } else { - LOG_E(NAS, "no GUTI, cannot trigger deregistration request\n"); - } + LOG_I(NAS, "[UE %ld] Received %s\n", instance, ITTI_MSG_NAME(msg_p)); + nr_ue_nas_t *nas = get_ue_nas_info(0); + if (nas->guti) { + nas_deregistration_req_t *req = &NAS_DEREGISTRATION_REQ(msg_p); + as_nas_info_t initialNasMsg = {0}; + generateDeregistrationRequest(nas, &initialNasMsg, req); + send_nas_uplink_data_req(instance, &initialNasMsg); + } else { + LOG_E(NAS, "no GUTI, cannot trigger deregistration request\n"); } - break; + } break; - case NAS_DOWNLINK_DATA_IND: - { + case NAS_DOWNLINK_DATA_IND: { LOG_I(NAS, "[UE %ld] Received %s: length %u , buffer %p\n", instance, ITTI_MSG_NAME(msg_p), NAS_DOWNLINK_DATA_IND(msg_p).nasMsg.length, NAS_DOWNLINK_DATA_IND(msg_p).nasMsg.data); - as_nas_info_t initialNasMsg={0}; - - pdu_buffer = NAS_DOWNLINK_DATA_IND(msg_p).nasMsg.data; - msg_type = get_msg_type(pdu_buffer, NAS_DOWNLINK_DATA_IND(msg_p).nasMsg.length); + as_nas_info_t initialNasMsg = {0}; - switch(msg_type){ + uint8_t *pdu_buffer = NAS_DOWNLINK_DATA_IND(msg_p).nasMsg.data; + int msg_type = get_msg_type(pdu_buffer, NAS_DOWNLINK_DATA_IND(msg_p).nasMsg.length); + nr_ue_nas_t *nas = get_ue_nas_info(0); + switch (msg_type) { case FGS_IDENTITY_REQUEST: generateIdentityResponse(&initialNasMsg, *(pdu_buffer + 3), nas->uicc); - break; + break; case FGS_AUTHENTICATION_REQUEST: - generateAuthenticationResp(nas, &initialNasMsg, pdu_buffer); - break; + generateAuthenticationResp(nas, &initialNasMsg, pdu_buffer); + break; case FGS_SECURITY_MODE_COMMAND: nas_itti_kgnb_refresh_req(nas->security.kgnb); generateSecurityModeComplete(nas, &initialNasMsg); @@ -1109,28 +1122,23 @@ void *nas_nrue_task(void *args_p) } offset++; } - } - break; + } break; default: - LOG_W(NR_RRC,"unknown message type %d\n",msg_type); - break; + LOG_W(NR_RRC, "unknown message type %d\n", msg_type); + break; } - if (initialNasMsg.length > 0) - send_nas_uplink_data_req(instance, &initialNasMsg); - } - break; + if (initialNasMsg.length > 0) + send_nas_uplink_data_req(instance, &initialNasMsg); + } break; default: - LOG_E(NAS, "[UE %ld] Received unexpected message %s\n", instance, ITTI_MSG_NAME (msg_p)); + LOG_E(NAS, "[UE %ld] Received unexpected message %s\n", instance, ITTI_MSG_NAME(msg_p)); break; - } - - result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p); - AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); - msg_p = NULL; } - } + int result = itti_free(ITTI_MSG_ORIGIN_ID(msg_p), msg_p); + AssertFatal(result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); + } return NULL; } diff --git a/openair3/NAS/NR_UE/nr_nas_msg_sim.h b/openair3/NAS/NR_UE/nr_nas_msg_sim.h index fbf0362949cbb21bdeb1a5305f8cdbcbdfff33a5..fa4911c738238ae4f1597c5c16770ae49490277e 100644 --- a/openair3/NAS/NR_UE/nr_nas_msg_sim.h +++ b/openair3/NAS/NR_UE/nr_nas_msg_sim.h @@ -174,6 +174,7 @@ typedef struct { nr_ue_nas_t *get_ue_nas_info(module_id_t module_id); void generateRegistrationRequest(as_nas_info_t *initialNasMsg, nr_ue_nas_t *nas); void *nas_nrue_task(void *args_p); +void *nas_nrue(void *args_p); #endif /* __NR_NAS_MSG_SIM_H__*/