diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c index e0bc7ccb2a..018cfcb406 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c @@ -4277,33 +4277,6 @@ void get_type0_PDCCH_CSS_config_parameters(NR_Type0_PDCCH_CSS_config_t *type0_PD AssertFatal(type0_PDCCH_CSS_config->num_symbols != -1, "Type0 PDCCH coreset num_symbols undefined"); AssertFatal(type0_PDCCH_CSS_config->rb_offset != -1, "Type0 PDCCH coreset rb_offset undefined"); - - //uint32_t cell_id = 0; // obtain from L1 later - - //mac->type0_pdcch_dci_config.coreset.rb_start = rb_offset; - //mac->type0_pdcch_dci_config.coreset.rb_end = rb_offset + num_rbs - 1; - -// uint64_t mask = 0x0; -// uint8_t i; -// for(i=0; i<(type0_PDCCH_CSS_config->num_rbs/6); ++i){ // 38.331 Each bit corresponds a group of 6 RBs -// mask = mask >> 1; -// mask = mask | 0x100000000000; -// } - - //LOG_I(MAC,">>>>>>>>mask %x num_rbs %d rb_offset %d\n", mask, num_rbs, rb_offset); - -// mac->type0_pdcch_dci_config.coreset.frequency_domain_resource = mask; -// mac->type0_pdcch_dci_config.coreset.rb_offset = rb_offset; // additional parameter other than coreset -// -// //mac->type0_pdcch_dci_config.type0_pdcch_coreset.duration = num_symbols; -// mac->type0_pdcch_dci_config.coreset.cce_reg_mapping_type = CCE_REG_MAPPING_TYPE_INTERLEAVED; -// mac->type0_pdcch_dci_config.coreset.cce_reg_interleaved_reg_bundle_size = 6; // L 38.211 7.3.2.2 -// mac->type0_pdcch_dci_config.coreset.cce_reg_interleaved_interleaver_size = 2; // R 38.211 7.3.2.2 -// mac->type0_pdcch_dci_config.coreset.cce_reg_interleaved_shift_index = cell_id; -// mac->type0_pdcch_dci_config.coreset.precoder_granularity = PRECODER_GRANULARITY_SAME_AS_REG_BUNDLE; -// mac->type0_pdcch_dci_config.coreset.pdcch_dmrs_scrambling_id = cell_id; - - // type0-pdcch search space float big_o = 0.0f; float big_m = 0.0f; diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c index b7bfcb501e..ed2afb80f3 100644 --- a/openair2/LAYER2/NR_MAC_UE/config_ue.c +++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c @@ -1351,6 +1351,32 @@ static void configure_common_BWP_ul(NR_UE_MAC_INST_t *mac, int bwp_id, NR_BWP_Up } } +void nr_rrc_mac_config_req_reset(module_id_t module_id) +{ + NR_UE_MAC_INST_t *mac = get_mac_inst(module_id); + reset_mac_inst(mac); +} + +void nr_rrc_mac_config_req_release(module_id_t module_id) +{ + NR_UE_MAC_INST_t *mac = get_mac_inst(module_id); + + reset_ra(&mac->ra); + release_mac_configuration(mac); + + mac->first_sync_frame = -1; + mac->get_sib1 = false; + mac->phy_config_request_sent = false; + mac->state = UE_NOT_SYNC; + + // Sending to PHY a request to resync + // with no target cell ID + mac->synch_request.Mod_id = module_id; + mac->synch_request.CC_id = 0; + mac->synch_request.synch_req.target_Nid_cell = -1; + mac->if_module->synch_request(&mac->synch_request); +} + void nr_rrc_mac_config_req_sib1(module_id_t module_id, int cc_idP, NR_SI_SchedulingInfo_t *si_SchedulingInfo, diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h index 1fdeb06e09..d687ecf70e 100644 --- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h @@ -472,13 +472,6 @@ typedef struct { bool phy_config_request_sent; frame_type_t frame_type; - /// Type0-PDCCH seach space - fapi_nr_dl_config_dci_dl_pdu_rel15_t type0_pdcch_dci_config; - uint32_t type0_pdcch_ss_mux_pattern; - int type0_pdcch_ss_sfn_c; - uint32_t type0_pdcch_ss_n_c; - uint32_t type0_pdcch_consecutive_slots; - /* PDUs */ /// Outgoing CCCH pdu for PHY CCCH_PDU CCCH_pdu; diff --git a/openair2/LAYER2/NR_MAC_UE/mac_proto.h b/openair2/LAYER2/NR_MAC_UE/mac_proto.h index 7d200b9a22..599d90d54e 100644 --- a/openair2/LAYER2/NR_MAC_UE/mac_proto.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_proto.h @@ -136,6 +136,8 @@ void nr_ue_mac_default_configs(NR_UE_MAC_INST_t *mac); void nr_ue_decode_mib(module_id_t module_id, int cc_id); +void release_common_ss_cset(NR_BWP_PDCCH_t *pdcch); + /**\brief decode SIB1 and other SIs pdus in NR_UE, from if_module dl_ind \param module_id module id \param cc_id component carrier id @@ -168,6 +170,9 @@ void nr_rrc_mac_config_req_sib1(module_id_t module_id, NR_SI_SchedulingInfo_t *si_SchedulingInfo, NR_ServingCellConfigCommonSIB_t *scc); +void nr_rrc_mac_config_req_reset(module_id_t module_id); +void nr_rrc_mac_config_req_release(module_id_t module_id); + /**\brief initialization NR UE MAC instance(s), total number of MAC instance based on NB_NR_UE_MAC_INST*/ NR_UE_MAC_INST_t * nr_l2_init_ue(); @@ -176,6 +181,8 @@ NR_UE_MAC_INST_t * nr_l2_init_ue(); NR_UE_MAC_INST_t *get_mac_inst(module_id_t module_id); void reset_mac_inst(NR_UE_MAC_INST_t *nr_mac); +void reset_ra(RA_config_t *ra); +void release_mac_configuration(NR_UE_MAC_INST_t *mac); /**\brief called at each slot, slot length based on numerology. now use u=0, scs=15kHz, slot=1ms performs BSR/SR/PHR procedures, random access procedure handler and DLSCH/ULSCH procedures. diff --git a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c index 6b2f439823..89394200a3 100644 --- a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c +++ b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c @@ -60,27 +60,72 @@ void send_msg3_rrc_request(module_id_t mod_id, int rnti) nr_mac_rrc_msg3_ind(mod_id, rnti); } -NR_UE_MAC_INST_t * nr_l2_init_ue() +void nr_ue_init_mac(module_id_t module_idP) { - LOG_I(NR_MAC, "MAIN: init UE MAC functions \n"); - //init mac here - nr_ue_mac_inst = (NR_UE_MAC_INST_t *)calloc(NB_NR_UE_MAC_INST, sizeof(NR_UE_MAC_INST_t)); - - for (int j = 0; j < NB_NR_UE_MAC_INST; j++) - nr_ue_init_mac(j); - - if (get_softmodem_params()->sa) - ue_init_config_request(nr_ue_mac_inst, get_softmodem_params()->numerology); - - int rc = rlc_module_init(0); - AssertFatal(rc == 0, "%s: Could not initialize RLC layer\n", __FUNCTION__); - - return (nr_ue_mac_inst); + LOG_I(NR_MAC, "[UE%d] Applying default macMainConfig\n", module_idP); + NR_UE_MAC_INST_t *mac = get_mac_inst(module_idP); + nr_ue_mac_default_configs(mac); + mac->first_sync_frame = -1; + mac->get_sib1 = false; + mac->get_otherSI = false; + mac->phy_config_request_sent = false; + memset(&mac->phy_config, 0, sizeof(mac->phy_config)); + mac->state = UE_NOT_SYNC; + mac->si_window_start = -1; + mac->servCellIndex = 0; } -NR_UE_MAC_INST_t *get_mac_inst(module_id_t module_id) +void nr_ue_mac_default_configs(NR_UE_MAC_INST_t *mac) { - return &nr_ue_mac_inst[(int)module_id]; + // default values as defined in 38.331 sec 9.2.2 + mac->scheduling_info.retxBSR_Timer = NR_BSR_Config__retxBSR_Timer_sf10240; + mac->scheduling_info.periodicBSR_Timer = NR_BSR_Config__periodicBSR_Timer_infinity; + mac->scheduling_info.SR_COUNTER = 0; + mac->scheduling_info.SR_pending = 0; + mac->scheduling_info.sr_ProhibitTimer = 0; + mac->scheduling_info.sr_ProhibitTimer_Running = 0; + mac->scheduling_info.sr_id = -1; // invalid init value + + // set init value 0xFFFF, make sure periodic timer and retx time counters are NOT active, after bsr transmission set the value + // configured by the NW. + mac->scheduling_info.periodicBSR_SF = MAC_UE_BSR_TIMER_NOT_RUNNING; + mac->scheduling_info.retxBSR_SF = MAC_UE_BSR_TIMER_NOT_RUNNING; + mac->BSR_reporting_active = BSR_TRIGGER_NONE; + + for (int i = 0; i < NR_MAX_NUM_LCID; i++) { + LOG_D(NR_MAC, "Applying default logical channel config for LCGID %d\n", i); + mac->scheduling_info.lc_sched_info[i].Bj = -1; + mac->scheduling_info.lc_sched_info[i].bucket_size = -1; + mac->scheduling_info.lc_sched_info[i].LCGID = 0; // defaults to 0 irrespective of SRB or DRB + mac->scheduling_info.lc_sched_info[i].LCID_status = LCID_EMPTY; + mac->scheduling_info.lc_sched_info[i].LCID_buffer_remain = 0; + for (int k = 0; k < NR_MAX_HARQ_PROCESSES; k++) + mac->UL_ndi[k] = -1; // initialize to invalid value + } + + memset(&mac->ssb_measurements, 0, sizeof(mac->ssb_measurements)); + memset(&mac->ul_time_alignment, 0, sizeof(mac->ul_time_alignment)); +} + +NR_UE_MAC_INST_t *nr_l2_init_ue() +{ + //init mac here + nr_ue_mac_inst = (NR_UE_MAC_INST_t *)calloc(NB_NR_UE_MAC_INST, sizeof(NR_UE_MAC_INST_t)); + + for (int j = 0; j < NB_NR_UE_MAC_INST; j++) + nr_ue_init_mac(j); + + if (get_softmodem_params()->sa) + ue_init_config_request(nr_ue_mac_inst, get_softmodem_params()->numerology); + + int rc = rlc_module_init(0); + AssertFatal(rc == 0, "%s: Could not initialize RLC layer\n", __FUNCTION__); + + return (nr_ue_mac_inst); +} + +NR_UE_MAC_INST_t *get_mac_inst(module_id_t module_id) { + return &nr_ue_mac_inst[(int)module_id]; } void reset_mac_inst(NR_UE_MAC_INST_t *nr_mac) @@ -133,3 +178,28 @@ void reset_mac_inst(NR_UE_MAC_INST_t *nr_mac) // reset BFI_COUNTER // TODO beam failure procedure not implemented } + +void release_mac_configuration(NR_UE_MAC_INST_t *mac) +{ + if(mac->mib) + ASN_STRUCT_FREE(asn_DEF_NR_MIB, mac->mib); + for (int i = 0; i < 5; i++) { + NR_BWP_PDCCH_t *pdcch = &mac->config_BWP_PDCCH[5]; + release_common_ss_cset(pdcch); + for (int j = 0; j < pdcch->list_Coreset.count; j++) + asn_sequence_del(&pdcch->list_Coreset, j, 1); + for (int j = 0; j < pdcch->list_SS.count; j++) + asn_sequence_del(&pdcch->list_SS, j, 1); + } + + memset(&mac->ssb_measurements, 0, sizeof(mac->ssb_measurements)); + memset(&mac->csirs_measurements, 0, sizeof(mac->csirs_measurements)); + memset(&mac->ul_time_alignment, 0, sizeof(mac->ul_time_alignment)); +} + +void reset_ra(RA_config_t *ra) +{ + if(ra->rach_ConfigDedicated) + ASN_STRUCT_FREE(asn_DEF_NR_RACH_ConfigDedicated, ra->rach_ConfigDedicated); + memset(ra, 0, sizeof(RA_config_t)); +} diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 2eee621ace..91cc805d22 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -158,53 +158,6 @@ static uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac, dci_pdu_rel15_t *dci_pdu_rel15, int slot); -void nr_ue_init_mac(module_id_t module_idP) -{ - LOG_I(NR_MAC, "[UE%d] Applying default macMainConfig\n", module_idP); - NR_UE_MAC_INST_t *mac = get_mac_inst(module_idP); - nr_ue_mac_default_configs(mac); - mac->first_sync_frame = -1; - mac->get_sib1 = false; - mac->get_otherSI = false; - mac->phy_config_request_sent = false; - memset(&mac->phy_config, 0, sizeof(mac->phy_config)); - mac->state = UE_NOT_SYNC; - mac->si_window_start = -1; - mac->servCellIndex = 0; -} - -void nr_ue_mac_default_configs(NR_UE_MAC_INST_t *mac) -{ - // default values as defined in 38.331 sec 9.2.2 - mac->scheduling_info.retxBSR_Timer = NR_BSR_Config__retxBSR_Timer_sf10240; - mac->scheduling_info.periodicBSR_Timer = NR_BSR_Config__periodicBSR_Timer_infinity; - mac->scheduling_info.SR_COUNTER = 0; - mac->scheduling_info.SR_pending = 0; - mac->scheduling_info.sr_ProhibitTimer = 0; - mac->scheduling_info.sr_ProhibitTimer_Running = 0; - mac->scheduling_info.sr_id = -1; // invalid init value - - // set init value 0xFFFF, make sure periodic timer and retx time counters are NOT active, after bsr transmission set the value - // configured by the NW. - mac->scheduling_info.periodicBSR_SF = MAC_UE_BSR_TIMER_NOT_RUNNING; - mac->scheduling_info.retxBSR_SF = MAC_UE_BSR_TIMER_NOT_RUNNING; - mac->BSR_reporting_active = BSR_TRIGGER_NONE; - - for (int i = 0; i < NR_MAX_NUM_LCID; i++) { - LOG_D(NR_MAC, "Applying default logical channel config for LCGID %d\n", i); - mac->scheduling_info.lc_sched_info[i].Bj = -1; - mac->scheduling_info.lc_sched_info[i].bucket_size = -1; - mac->scheduling_info.lc_sched_info[i].LCGID = 0; // defaults to 0 irrespective of SRB or DRB - mac->scheduling_info.lc_sched_info[i].LCID_status = LCID_EMPTY; - mac->scheduling_info.lc_sched_info[i].LCID_buffer_remain = 0; - for (int k = 0; k < NR_MAX_HARQ_PROCESSES; k++) - mac->UL_ndi[k] = -1; // initialize to invalid value - } - - memset(&mac->ssb_measurements, 0, sizeof(mac->ssb_measurements)); - memset(&mac->ul_time_alignment, 0, sizeof(mac->ul_time_alignment)); -} - int get_rnti_type(NR_UE_MAC_INST_t *mac, uint16_t rnti) { diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c index 96444e5b10..2e96428dfb 100644 --- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c +++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c @@ -958,13 +958,11 @@ bool pdcp_remove_UE(const protocol_ctxt_t *const ctxt_pP) abort(); } -bool nr_pdcp_remove_UE(ue_id_t ue_id) +void nr_pdcp_remove_UE(ue_id_t ue_id) { nr_pdcp_manager_lock(nr_pdcp_ue_manager); nr_pdcp_manager_remove_ue(nr_pdcp_ue_manager, ue_id); nr_pdcp_manager_unlock(nr_pdcp_ue_manager); - - return 1; } /* hack: dummy function needed due to LTE dependencies */ diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h index ea88fbfb18..f3a89a2e43 100644 --- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h +++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h @@ -63,7 +63,7 @@ void add_drb(int is_gnb, void nr_DRB_preconfiguration(ue_id_t crntiMaybeUEid); -bool nr_pdcp_remove_UE(ue_id_t ue_id); +void nr_pdcp_remove_UE(ue_id_t ue_id); void nr_pdcp_reestablishment(ue_id_t ue_id, int rb_id, bool srb_flag); void nr_pdcp_suspend_srb(ue_id_t ue_id, int srb_id); diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c index 389f849b20..258510c29c 100644 --- a/openair2/RRC/NR_UE/rrc_UE.c +++ b/openair2/RRC/NR_UE/rrc_UE.c @@ -707,7 +707,6 @@ static int8_t nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message(instance_t instance, nr_rrc_configure_default_SI(SI_info, sib1); // configure timers and constant nr_rrc_set_sib1_timers_and_constants(&rrc->timers_and_constants, sib1); - // take ServingCellConfigCommon and configure L1/L2 nr_rrc_mac_config_req_sib1(instance, 0, sib1->si_SchedulingInfo, sib1->servingCellConfigCommon); break; case NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformation: @@ -1847,6 +1846,163 @@ static void process_lte_nsa_msg(NR_UE_RRC_INST_t *rrc, nsa_msg_t *msg, int msg_l } } +void nr_rrc_going_to_IDLE(instance_t instance, + NR_RRCRelease_t *RRCRelease) +{ + NR_UE_RRC_INST_t *rrc = &NR_UE_rrc_inst[instance]; + NR_UE_Timers_Constants_t *tac = &rrc->timers_and_constants; + // reset MAC + nr_rrc_mac_config_req_reset(instance); + // if going to RRC_IDLE was triggered by reception + // of the RRCRelease message including a waitTime + NR_RejectWaitTime_t *waitTime = NULL; + if (RRCRelease) { + struct NR_RRCRelease_IEs *rrcReleaseIEs = RRCRelease->criticalExtensions.choice.rrcRelease; + if(rrcReleaseIEs) { + waitTime = rrcReleaseIEs->nonCriticalExtension ? + rrcReleaseIEs->nonCriticalExtension->waitTime : NULL; + if (waitTime) { + if (tac->T302_active) + tac->T302_cnt = 0; // stop 302 + // start timer T302 with the value set to the waitTime + tac->T302_active = true; + tac->T302_k = *waitTime * 1000; // waitTime is in seconds + // inform upper layers that access barring is applicable + // for all access categories except categories '0' and '2'. + // TODO no idea what that means + LOG_E(NR_RRC,"Go to IDLE. Handling RRCRelease message including a waitTime not implemented\n"); + } + } + } + if (!waitTime) { + if (tac->T302_active) { + tac->T302_cnt = 0; + tac->T302_active = false; + // TODO barring alleviation as in 5.3.14.4 + // not implemented + LOG_E(NR_RRC,"Go to IDLE. Barring alleviation not implemented\n"); + } + } + if (tac->T390_active) { + tac->T390_cnt = 0; + tac->T390_active = false; + // TODO barring alleviation as in 5.3.14.4 + // not implemented + LOG_E(NR_RRC,"Go to IDLE. Barring alleviation not implemented\n"); + } + if (!RRCRelease && rrc->nrRrcState == RRC_STATE_INACTIVE_NR) { + // TODO discard the cell reselection priority information provided by the cellReselectionPriorities + // cell reselection priorities not implemented yet + if (tac->T320_active) { + tac->T320_cnt = 0; + tac->T320_active = false; + } + } + // Stop all the timers except T302, T320 and T325 + tac->T300_active = false; + tac->T300_cnt = 0; + tac->T301_active = false; + tac->T301_cnt = 0; + tac->T304_active = false; + tac->T304_cnt = 0; + tac->T310_active = false; + tac->T310_cnt = 0; + tac->T311_active = false; + tac->T311_cnt = 0; + tac->T319_active = false; + tac->T319_cnt = 0; + + // discard the UE Inactive AS context + // TODO there is no inactive AS context + + // release the suspendConfig + // TODO suspendConfig not handled yet + + // discard the keys (only kgnb is stored) + memset(rrc->kgnb, 0, sizeof(rrc->kgnb)); + + // TODO release all radio resources, including release of the RLC entity, + // the MAC configuration and the associated PDCP entity + // and SDAP for all established RBs + nr_pdcp_remove_UE(rrc->rnti); + nr_rlc_remove_ue(rrc->rnti); + + if(rrc->meas_config) { + ASN_STRUCT_FREE(asn_DEF_NR_MeasConfig, rrc->meas_config); + rrc->meas_config = NULL; + } + + for (int i = 0; i < NB_CNX_UE; i++) { + rrcPerNB_t *nb = &rrc->perNB[i]; + NR_UE_RRC_SI_INFO *SI_info = &nb->SInfo; + if(SI_info->sib1) { + ASN_STRUCT_FREE(asn_DEF_NR_SIB1, SI_info->sib1); + SI_info->sib1 = NULL; + } + if(SI_info->sib2) { + ASN_STRUCT_FREE(asn_DEF_NR_SIB2, SI_info->sib2); + SI_info->sib2 = NULL; + } + if(SI_info->sib3) { + ASN_STRUCT_FREE(asn_DEF_NR_SIB3, SI_info->sib3); + SI_info->sib3 = NULL; + } + if(SI_info->sib4) { + ASN_STRUCT_FREE(asn_DEF_NR_SIB4, SI_info->sib4); + SI_info->sib4 = NULL; + } + if(SI_info->sib5) { + ASN_STRUCT_FREE(asn_DEF_NR_SIB5, SI_info->sib5); + SI_info->sib5 = NULL; + } + if(SI_info->sib6) { + ASN_STRUCT_FREE(asn_DEF_NR_SIB6, SI_info->sib6); + SI_info->sib6 = NULL; + } + if(SI_info->sib7) { + ASN_STRUCT_FREE(asn_DEF_NR_SIB7, SI_info->sib7); + SI_info->sib7 = NULL; + } + if(SI_info->sib8) { + ASN_STRUCT_FREE(asn_DEF_NR_SIB8, SI_info->sib8); + SI_info->sib8 = NULL; + } + if(SI_info->sib9) { + ASN_STRUCT_FREE(asn_DEF_NR_SIB9, SI_info->sib9); + SI_info->sib9 = NULL; + } + if(SI_info->sib10) { + ASN_STRUCT_FREE(asn_DEF_NR_SIB10_r16, SI_info->sib10); + SI_info->sib10 = NULL; + } + if(SI_info->sib11) { + ASN_STRUCT_FREE(asn_DEF_NR_SIB11_r16, SI_info->sib11); + SI_info->sib11 = NULL; + } + if(SI_info->sib12) { + ASN_STRUCT_FREE(asn_DEF_NR_SIB12_r16, SI_info->sib12); + SI_info->sib12 = NULL; + } + if(SI_info->sib13) { + ASN_STRUCT_FREE(asn_DEF_NR_SIB13_r16, SI_info->sib13); + SI_info->sib13 = NULL; + } + if(SI_info->sib14) { + ASN_STRUCT_FREE(asn_DEF_NR_SIB14_r16, SI_info->sib14); + SI_info->sib14 = NULL; + } + } + + nr_rrc_mac_config_req_release(instance); + + // TODO indicate the release of the RRC connection to upper layers + // together with the release cause + + // enter RRC_IDLE + rrc->nrRrcState = RRC_STATE_IDLE_NR; + rrc->rnti = 0; +} + void nr_ue_rrc_timer_trigger(int instance, int frame, int gnb_id) { MessageDef *message_p; diff --git a/openair2/RRC/NR_UE/rrc_defs.h b/openair2/RRC/NR_UE/rrc_defs.h index 998f83e75c..6037d3f1b0 100644 --- a/openair2/RRC/NR_UE/rrc_defs.h +++ b/openair2/RRC/NR_UE/rrc_defs.h @@ -148,17 +148,25 @@ typedef struct NR_UE_Timers_Constants_s { // timers status bool T300_active; bool T301_active; + bool T302_active; bool T304_active; bool T310_active; bool T311_active; bool T319_active; + bool T320_active; + bool T325_active; + bool T390_active; // timers uint32_t T300_cnt; uint32_t T301_cnt; + uint32_t T302_cnt; uint32_t T304_cnt; uint32_t T310_cnt; uint32_t T311_cnt; uint32_t T319_cnt; + uint32_t T320_cnt; + uint32_t T325_cnt; + uint32_t T390_cnt; // counters uint32_t N310_cnt; uint32_t N311_cnt; @@ -167,10 +175,14 @@ typedef struct NR_UE_Timers_Constants_s { uint32_t N311_k; uint32_t T300_k; uint32_t T301_k; + uint32_t T302_k; uint32_t T304_k; uint32_t T310_k; uint32_t T311_k; uint32_t T319_k; + uint32_t T320_k; + uint32_t T325_k; + uint32_t T390_k; } NR_UE_Timers_Constants_t; typedef enum { @@ -210,7 +222,7 @@ typedef struct NR_UE_RRC_INST_s { NR_BWP_Id_t dl_bwp_id; NR_BWP_Id_t ul_bwp_id; - /* KeNB as computed from parameters within USIM card */ + /* KgNB as computed from parameters within USIM card */ uint8_t kgnb[32]; /* Used integrity/ciphering algorithms */ //RRC_LIST_TYPE(NR_SecurityAlgorithmConfig_t, NR_SecurityAlgorithmConfig) SecurityAlgorithmConfig_list;