From fbc15ea7bfeac0ae2214614af9cdb099cc582f56 Mon Sep 17 00:00:00 2001 From: francescomani Date: Tue, 12 Dec 2023 17:38:14 +0100 Subject: [PATCH 1/3] adding function to handle reception of RRCSetup --- openair2/RRC/NR_UE/rrc_UE.c | 75 ++++++++++++++++++++++++++----------- 1 file changed, 53 insertions(+), 22 deletions(-) diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c index 98f67918d3..10fff1677a 100644 --- a/openair2/RRC/NR_UE/rrc_UE.c +++ b/openair2/RRC/NR_UE/rrc_UE.c @@ -877,6 +877,58 @@ static void rrc_ue_generate_RRCSetupComplete(instance_t instance, rnti_t rnti, c nr_pdcp_data_req_srb(rnti, srb_id, 0, size, buffer, deliver_pdu_srb_rlc, NULL); } +static void nr_rrc_process_rrcsetup(const instance_t instance, + const rnti_t rnti, + const uint8_t gNB_index, + const NR_RRCSetup_t *rrcSetup) +{ + NR_UE_RRC_INST_t *rrc = &NR_UE_rrc_inst[instance]; + + // if the RRCSetup is received in response to an RRCReestablishmentRequest + // or RRCResumeRequest or RRCResumeRequest1 + // TODO none of the procedures implemented yet + + // perform the cell group configuration procedure in accordance with the received masterCellGroup + rrc->rnti = rnti; + nr_rrc_ue_process_masterCellGroup(instance, + rnti, + rrc->perNB + gNB_index, + &rrcSetup->criticalExtensions.choice.rrcSetup->masterCellGroup, + NULL); + // perform the radio bearer configuration procedure in accordance with the received radioBearerConfig + nr_rrc_ue_process_RadioBearerConfig(rrc, + rnti, + rrc->perNB + gNB_index, + &rrcSetup->criticalExtensions.choice.rrcSetup->radioBearerConfig); + + // TODO (not handled) if stored, discard the cell reselection priority information provided by + // the cellReselectionPriorities or inherited from another RAT + + // stop timer T300, T301 or T319 if running; + NR_UE_Timers_Constants_t *timers = &rrc->timers_and_constants; + timers->T300_active = false; + timers->T300_cnt = 0; + timers->T301_active = false; + timers->T301_cnt = 0; + timers->T319_active = false; + timers->T319_cnt = 0; + timers->T320_active = false; + timers->T320_cnt = 0; + + // TODO if T390 and T302 are running (not implemented) + + // if the RRCSetup is received in response to an RRCResumeRequest, RRCResumeRequest1 or RRCSetupRequest + // enter RRC_CONNECTED + rrc->nrRrcState = RRC_STATE_CONNECTED_NR; + + // set the content of RRCSetupComplete message + // TODO procedues described in 5.3.3.4 seems more complex than what we actualy do + rrc_ue_generate_RRCSetupComplete(instance, + rnti, + rrcSetup->rrc_TransactionIdentifier, + rrc->selected_plmn_identity); +} + static int8_t nr_rrc_ue_decode_ccch(const instance_t instance, const rnti_t rnti, const NRRrcMacCcchDataInd *ind, @@ -915,28 +967,7 @@ static int8_t nr_rrc_ue_decode_ccch(const instance_t instance, case NR_DL_CCCH_MessageType__c1_PR_rrcSetup: LOG_I(NR_RRC, "[UE%ld][RAPROC] Logical Channel DL-CCCH (SRB0), Received NR_RRCSetup RNTI %x\n", instance, rnti); - - // Get configuration - // Release T300 timer - rrc->timers_and_constants.T300_active = 0; - rrc->rnti = rnti; - nr_rrc_ue_process_masterCellGroup( - instance, - rnti, - rrc->perNB + gNB_index, - &dl_ccch_msg->message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup->masterCellGroup, - NULL); - nr_rrc_ue_process_RadioBearerConfig( - rrc, - rnti, - rrc->perNB + gNB_index, - &dl_ccch_msg->message.choice.c1->choice.rrcSetup->criticalExtensions.choice.rrcSetup->radioBearerConfig); - rrc->nrRrcState = RRC_STATE_CONNECTED_NR; - - rrc_ue_generate_RRCSetupComplete(instance, - rnti, - dl_ccch_msg->message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier, - rrc->selected_plmn_identity); + nr_rrc_process_rrcsetup(instance, rnti, gNB_index, dl_ccch_msg->message.choice.c1->choice.rrcSetup); rval = 0; break; From 1d042eabb5682e1f98bcad5116318e42215cb2ae Mon Sep 17 00:00:00 2001 From: francescomani Date: Sat, 7 Oct 2023 11:01:18 +0200 Subject: [PATCH 2/3] T311 expiry --- openair2/RRC/NR_UE/rrc_UE.c | 3 +-- openair2/RRC/NR_UE/rrc_proto.h | 2 +- openair2/RRC/NR_UE/rrc_timers_and_constants.c | 11 ++++++++++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c index 10fff1677a..4d0af37fbe 100644 --- a/openair2/RRC/NR_UE/rrc_UE.c +++ b/openair2/RRC/NR_UE/rrc_UE.c @@ -1470,8 +1470,7 @@ void *rrc_nrue(void *notUsed) case NRRRC_FRAME_PROCESS: LOG_D(NR_RRC, "Received %s: frame %d\n", 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[instance].timers_and_constants; - nr_rrc_handle_timers(timers); + nr_rrc_handle_timers(rrc, instance); NR_UE_RRC_SI_INFO *SInfo = &NR_UE_rrc_inst[instance].perNB[NRRRC_FRAME_PROCESS(msg_p).gnb_id].SInfo; nr_rrc_SI_timers(SInfo); break; diff --git a/openair2/RRC/NR_UE/rrc_proto.h b/openair2/RRC/NR_UE/rrc_proto.h index 1b4df0d797..b9f0155d6d 100644 --- a/openair2/RRC/NR_UE/rrc_proto.h +++ b/openair2/RRC/NR_UE/rrc_proto.h @@ -105,7 +105,7 @@ void nr_mac_rrc_msg3_ind(const module_id_t mod_id, int rnti); void *rrc_nrue_task(void *args_p); void *rrc_nrue(void *args_p); -void nr_rrc_handle_timers(NR_UE_Timers_Constants_t *timers); +void nr_rrc_handle_timers(NR_UE_RRC_INST_t *rrc, instance_t instance); /**\brief RRC NSA UE task. \param void *args_p Pointer on arguments to start the task. */ diff --git a/openair2/RRC/NR_UE/rrc_timers_and_constants.c b/openair2/RRC/NR_UE/rrc_timers_and_constants.c index 0a7010850d..c4a4c20183 100644 --- a/openair2/RRC/NR_UE/rrc_timers_and_constants.c +++ b/openair2/RRC/NR_UE/rrc_timers_and_constants.c @@ -98,8 +98,9 @@ void nr_rrc_SI_timers(NR_UE_RRC_SI_INFO *SInfo) } } -void nr_rrc_handle_timers(NR_UE_Timers_Constants_t *timers) +void nr_rrc_handle_timers(NR_UE_RRC_INST_t *rrc, instance_t instance) { + NR_UE_Timers_Constants_t *timers = &rrc->timers_and_constants; // T304 if (timers->T304_active == true) { timers->T304_cnt += 10; @@ -120,6 +121,14 @@ void nr_rrc_handle_timers(NR_UE_Timers_Constants_t *timers) AssertFatal(false, "Radio link failure! Not handled yet!\n"); } } + if (timers->T311_active == true) { + timers->T311_cnt += 10; + if(timers->T311_cnt >= timers->T311_k) { + // Upon T311 expiry, the UE shall perform the actions upon going to RRC_IDLE + // with release cause 'RRC connection failure' + nr_rrc_going_to_IDLE(instance, RRC_CONNECTION_FAILURE, NULL); + } + } } void nr_rrc_set_T304(NR_UE_Timers_Constants_t *tac, NR_ReconfigurationWithSync_t *reconfigurationWithSync) From e930c7c7c623a7a1e67a35de43784050f748dbae Mon Sep 17 00:00:00 2001 From: francescomani Date: Tue, 12 Dec 2023 18:16:17 +0100 Subject: [PATCH 3/3] handling of T300 --- openair2/LAYER2/NR_MAC_UE/mac_defs.h | 1 + openair2/RRC/NR_UE/rrc_UE.c | 24 +++++++++++++++---- openair2/RRC/NR_UE/rrc_proto.h | 1 + openair2/RRC/NR_UE/rrc_timers_and_constants.c | 10 +++++++- 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h index d92e0c4fa7..4bcce17ec0 100644 --- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h @@ -167,6 +167,7 @@ typedef enum { typedef enum { GO_TO_IDLE, + T300_EXPIRY, RE_ESTABLISHMENT } NR_UE_MAC_reset_cause_t; diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c index 4d0af37fbe..78c1579e26 100644 --- a/openair2/RRC/NR_UE/rrc_UE.c +++ b/openair2/RRC/NR_UE/rrc_UE.c @@ -143,7 +143,7 @@ static void nr_rrc_ue_process_RadioBearerConfig(NR_UE_RRC_INST_t *ue_rrc, rnti_t rnti, rrcPerNB_t *rrcNB, NR_RadioBearerConfig_t *const radioBearerConfig); -static void nr_rrc_ue_generate_RRCSetupRequest(rnti_t rnti); +static void nr_rrc_ue_generate_RRCSetupRequest(NR_UE_RRC_INST_t *rrc, rnti_t rnti); static void nr_rrc_ue_generate_rrcReestablishmentComplete(NR_RRCReestablishment_t *rrcReestablishment); static void process_lte_nsa_msg(NR_UE_RRC_INST_t *rrc, nsa_msg_t *msg, int msg_len); static void nr_rrc_ue_process_rrcReconfiguration(const instance_t instance, @@ -575,12 +575,12 @@ static int nr_decode_SI(NR_UE_RRC_SI_INFO *SI_info, NR_SystemInformation_t *si) return 0; } -void nr_rrc_ue_generate_ra_msg(instance_t instance, RA_trigger_t trigger, rnti_t rnti) +void nr_rrc_ue_generate_ra_msg(NR_UE_RRC_INST_t *rrc, RA_trigger_t trigger, rnti_t rnti) { switch (trigger) { case INITIAL_ACCESS_FROM_RRC_IDLE: // After SIB1 is received, prepare RRCConnectionRequest - nr_rrc_ue_generate_RRCSetupRequest(rnti); + nr_rrc_ue_generate_RRCSetupRequest(rrc, rnti); break; case RRC_CONNECTION_REESTABLISHMENT: AssertFatal(1==0, "ra_trigger not implemented yet!\n"); @@ -609,8 +609,9 @@ void nr_rrc_ue_generate_ra_msg(instance_t instance, RA_trigger_t trigger, rnti_t } } -static void nr_rrc_ue_generate_RRCSetupRequest(rnti_t rnti) +static void nr_rrc_ue_generate_RRCSetupRequest(NR_UE_RRC_INST_t *rrc, rnti_t rnti) { + LOG_D(NR_RRC, "Generation of RRCSetupRequest\n"); uint8_t rv[6]; // Get RRCConnectionRequest, fill random for now // Generate random byte stream for contention resolution @@ -626,6 +627,10 @@ static void nr_rrc_ue_generate_RRCSetupRequest(rnti_t rnti) uint8_t buf[1024]; int len = do_RRCSetupRequest(buf, sizeof(buf), rv); + // start timer T300 + NR_UE_Timers_Constants_t *tac = &rrc->timers_and_constants; + tac->T300_active = true; + /* convention: RNTI for SRB0 is zero, as it changes all the time */ nr_rlc_srb_recv_sdu(rnti, 0, buf, len); } @@ -1476,7 +1481,7 @@ void *rrc_nrue(void *notUsed) break; case NR_RRC_MAC_MSG3_IND: - nr_rrc_ue_generate_ra_msg(instance, INITIAL_ACCESS_FROM_RRC_IDLE, NR_RRC_MAC_MSG3_IND(msg_p).rnti); + nr_rrc_ue_generate_ra_msg(rrc, INITIAL_ACCESS_FROM_RRC_IDLE, NR_RRC_MAC_MSG3_IND(msg_p).rnti); break; case NR_RRC_MAC_RA_IND: @@ -1981,6 +1986,15 @@ void nr_rrc_going_to_IDLE(instance_t instance, itti_send_msg_to_task(TASK_NAS_NRUE, instance, msg_p); } +void handle_t300_expiry(instance_t instance) +{ + // reset MAC, release the MAC configuration + NR_UE_MAC_reset_cause_t cause = T300_EXPIRY; + nr_rrc_mac_config_req_reset(instance, cause); + // TODO handle connEstFailureControl + // TODO inform upper layers about the failure to establish the RRC connection +} + void nr_ue_rrc_timer_trigger(int instance, int frame, int gnb_id) { MessageDef *message_p; diff --git a/openair2/RRC/NR_UE/rrc_proto.h b/openair2/RRC/NR_UE/rrc_proto.h index b9f0155d6d..08db8f6506 100644 --- a/openair2/RRC/NR_UE/rrc_proto.h +++ b/openair2/RRC/NR_UE/rrc_proto.h @@ -122,6 +122,7 @@ int get_from_lte_ue_fd(); void nr_rrc_SI_timers(NR_UE_RRC_SI_INFO *SInfo); void nr_ue_rrc_timer_trigger(int module_id, int frame, int gnb_id); +void handle_t300_expiry(instance_t instance); void reset_rlf_timers_and_constants(NR_UE_Timers_Constants_t *tac); void set_default_timers_and_constants(NR_UE_Timers_Constants_t *tac); diff --git a/openair2/RRC/NR_UE/rrc_timers_and_constants.c b/openair2/RRC/NR_UE/rrc_timers_and_constants.c index c4a4c20183..5b4823d03d 100644 --- a/openair2/RRC/NR_UE/rrc_timers_and_constants.c +++ b/openair2/RRC/NR_UE/rrc_timers_and_constants.c @@ -101,7 +101,15 @@ void nr_rrc_SI_timers(NR_UE_RRC_SI_INFO *SInfo) void nr_rrc_handle_timers(NR_UE_RRC_INST_t *rrc, instance_t instance) { NR_UE_Timers_Constants_t *timers = &rrc->timers_and_constants; - // T304 + + if (timers->T300_active == true) { + timers->T300_cnt += 10; + if(timers->T300_cnt >= timers->T300_k) { + timers->T300_active = false; + timers->T300_cnt = 0; + handle_t300_expiry(instance); + } + } if (timers->T304_active == true) { timers->T304_cnt += 10; if(timers->T304_cnt >= timers->T304_k) {