diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c index b858945018..a327abb2d0 100644 --- a/openair1/SIMULATION/NR_PHY/dlsim.c +++ b/openair1/SIMULATION/NR_PHY/dlsim.c @@ -953,7 +953,7 @@ printf("%d\n", slot); //Configure UE NR_BCCH_BCH_Message_t *mib = get_new_MIB_NR(scc); - nr_rrc_mac_config_req_mib(0, 0, mib->message.choice.mib, false); + nr_rrc_mac_config_req_mib(0, 0, mib->message.choice.mib, false, false); nr_rrc_mac_config_req_cg(0, 0, UE_CellGroup, UE_Capability_nr); asn1cFreeStruc(asn_DEF_NR_CellGroupConfig, UE_CellGroup); diff --git a/openair2/COMMON/rrc_messages_types.h b/openair2/COMMON/rrc_messages_types.h index 094fd0fa40..1d35619ecc 100644 --- a/openair2/COMMON/rrc_messages_types.h +++ b/openair2/COMMON/rrc_messages_types.h @@ -486,6 +486,7 @@ typedef struct { typedef struct { NR_BCCH_BCH_Message_t *bcch; int get_sib; + bool access_barred; } nr_mac_rrc_config_mib_t; typedef struct { NR_SIB1_t *sib1; diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c index 9bdbeebe10..8624766bd1 100644 --- a/openair2/LAYER2/NR_MAC_UE/config_ue.c +++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c @@ -955,7 +955,7 @@ static void update_mib_conf(NR_MIB_t *target, NR_MIB_t *source) target->intraFreqReselection = source->intraFreqReselection; } -void nr_rrc_mac_config_req_mib(module_id_t module_id, int cc_idP, NR_MIB_t *mib, int sched_sib) +void nr_rrc_mac_config_req_mib(module_id_t module_id, int cc_idP, NR_MIB_t *mib, int sched_sib, bool barred) { NR_UE_MAC_INST_t *mac = get_mac_inst(module_id); int ret = pthread_mutex_lock(&mac->if_mutex); @@ -963,6 +963,13 @@ void nr_rrc_mac_config_req_mib(module_id_t module_id, int cc_idP, NR_MIB_t *mib, AssertFatal(mib, "MIB should not be NULL\n"); if (!mac->mib) mac->mib = calloc(1, sizeof(*mac->mib)); + if (barred) + mac->state = UE_BARRED; + else if (mac->state == UE_BARRED) { + // it is synched as we received MIB + // nr_ue_decode_mib is transitionining to the correct state + mac->state = UE_NOT_SYNC; + } update_mib_conf(mac->mib, mib); mac->phy_config.Mod_id = module_id; mac->phy_config.CC_id = cc_idP; diff --git a/openair2/LAYER2/NR_MAC_UE/mac_proto.h b/openair2/LAYER2/NR_MAC_UE/mac_proto.h index 0a7365ef5d..aacbbdcab2 100644 --- a/openair2/LAYER2/NR_MAC_UE/mac_proto.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_proto.h @@ -87,7 +87,7 @@ void nr_rrc_mac_config_req_cg(module_id_t module_id, NR_CellGroupConfig_t *cell_group_config, NR_UE_NR_Capability_t *ue_Capability); -void nr_rrc_mac_config_req_mib(module_id_t module_id, int cc_idP, NR_MIB_t *mibP, int sched_sib1); +void nr_rrc_mac_config_req_mib(module_id_t module_id, int cc_idP, NR_MIB_t *mibP, int sched_sib1, bool barred); void nr_rrc_mac_config_req_sib1(module_id_t module_id, int cc_idP, NR_SIB1_t *sib1, bool can_start_ra); diff --git a/openair2/RRC/NR_UE/L2_interface_ue.c b/openair2/RRC/NR_UE/L2_interface_ue.c index fe2eb2cfed..6271957f4f 100644 --- a/openair2/RRC/NR_UE/L2_interface_ue.c +++ b/openair2/RRC/NR_UE/L2_interface_ue.c @@ -133,7 +133,11 @@ void process_msg_rcc_to_mac(MessageDef *msg) asn1cFreeStruc(asn_DEF_NR_CellGroupConfig, NR_MAC_RRC_CONFIG_CG(msg).cellGroupConfig); break; case NR_MAC_RRC_CONFIG_MIB: - nr_rrc_mac_config_req_mib(ue_id, 0, NR_MAC_RRC_CONFIG_MIB(msg).bcch->message.choice.mib, NR_MAC_RRC_CONFIG_MIB(msg).get_sib); + nr_rrc_mac_config_req_mib(ue_id, + 0, + NR_MAC_RRC_CONFIG_MIB(msg).bcch->message.choice.mib, + NR_MAC_RRC_CONFIG_MIB(msg).get_sib, + NR_MAC_RRC_CONFIG_MIB(msg).access_barred); ASN_STRUCT_FREE(asn_DEF_NR_BCCH_BCH_Message, NR_MAC_RRC_CONFIG_MIB(msg).bcch); break; case NR_MAC_RRC_CONFIG_SIB1: { diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c index af0c1350c1..f858a10599 100644 --- a/openair2/RRC/NR_UE/rrc_UE.c +++ b/openair2/RRC/NR_UE/rrc_UE.c @@ -749,6 +749,7 @@ NR_UE_RRC_INST_t* nr_rrc_init_ue(char* uecap_file, int nb_inst, int num_ant_tx) rrc->reconfig_after_reestab = false; /* 5G-S-TMSI */ rrc->fiveG_S_TMSI = UINT64_MAX; + rrc->access_barred = false; FILE *f = NULL; if (uecap_file) @@ -959,11 +960,12 @@ static void nr_rrc_ue_decode_NR_BCCH_BCH_Message(NR_UE_RRC_INST_t *rrc, } NR_UE_RRC_SI_INFO *SI_info = &rrc->perNB[gNB_index].SInfo; + bool barred = rrc->access_barred || bcch_message->message.choice.mib->cellBarred == NR_MIB__cellBarred_barred; int get_sib = 0; if (IS_SA_MODE(get_softmodem_params()) && !SI_info->sib_pending && bcch_message->message.present == NR_BCCH_BCH_MessageType_PR_mib - && bcch_message->message.choice.mib->cellBarred == NR_MIB__cellBarred_notBarred + && !barred && rrc->nrRrcState != RRC_STATE_DETACH_NR) { // to schedule MAC to get SI if required get_sib = check_si_status(SI_info); @@ -975,6 +977,7 @@ static void nr_rrc_ue_decode_NR_BCCH_BCH_Message(NR_UE_RRC_INST_t *rrc, // mac will manage the pointer NR_MAC_RRC_CONFIG_MIB(msg).bcch = bcch_message; NR_MAC_RRC_CONFIG_MIB(msg).get_sib = get_sib; + NR_MAC_RRC_CONFIG_MIB(msg).access_barred = barred; itti_send_msg_to_task(TASK_MAC_UE, rrc->ue_id, msg); } else { LOG_E(NR_RRC, "RRC-received BCCH message is not a MIB\n"); @@ -1376,7 +1379,11 @@ static void nr_rrc_process_rrcsetup(NR_UE_RRC_INST_t *rrc, const NR_RRCSetup_t * nr_timer_stop(&timers->T319); nr_timer_stop(&timers->T320); - // TODO if T390 and T302 are running (not implemented) + // if T390 (not implemented) and T302 are running + // stop timer + // perform the actions as specified in 5.3.14.4 + nr_timer_stop(&timers->T302); + handle_302_expired_stopped(rrc); // if the RRCSetup is received in response to an RRCResumeRequest, RRCResumeRequest1 or RRCSetupRequest // enter RRC_CONNECTED @@ -1417,6 +1424,7 @@ static void nr_rrc_process_rrcreject(NR_UE_RRC_INST_t *rrc, const NR_RRCReject_t if (waitTime) { nr_timer_setup(&timers->T302, *waitTime * 1000, 10); nr_timer_start(&timers->T302); + rrc->access_barred = true; } else { LOG_W(RRC, "Error: waitTime should be always included in RRCReject message\n"); } @@ -1458,7 +1466,7 @@ static int8_t nr_rrc_ue_decode_ccch(NR_UE_RRC_INST_t *rrc, const NRRrcMacCcchDat break; case NR_DL_CCCH_MessageType__c1_PR_rrcReject: - LOG_I(NR_RRC, "[UE%ld] Logical Channel DL-CCCH (SRB0), Received RRCReject \n", rrc->ue_id); + LOG_W(NR_RRC, "[UE%ld] Logical Channel DL-CCCH (SRB0), Received RRCReject \n", rrc->ue_id); nr_rrc_process_rrcreject(rrc, dl_ccch_msg->message.choice.c1->choice.rrcReject); rval = 0; break; @@ -2777,17 +2785,16 @@ void nr_rrc_going_to_IDLE(NR_UE_RRC_INST_t *rrc, nr_timer_setup(&tac->T302, target, 10); nr_timer_start(&tac->T302); // TODO inform upper layers that access barring is applicable - // for all access categories except categories '0' and '2'. - LOG_E(NR_RRC,"Go to IDLE. Handling RRCRelease message including a waitTime not implemented\n"); + // for all access categories except categories '0' and '2'. + // for now we just set the access barred in RRC + rrc->access_barred = true; } } } if (!waitTime) { if (nr_timer_is_active(&tac->T302)) { nr_timer_stop(&tac->T302); - // TODO barring alleviation as in 5.3.14.4 - // not implemented - LOG_E(NR_RRC,"Go to IDLE. Barring alleviation not implemented\n"); + handle_302_expired_stopped(rrc); } } if (nr_timer_is_active(&tac->T390)) { @@ -2897,6 +2904,13 @@ void nr_rrc_going_to_IDLE(NR_UE_RRC_INST_t *rrc, itti_send_msg_to_task(TASK_NAS_NRUE, rrc->ue_id, msg_p); } +void handle_302_expired_stopped(NR_UE_RRC_INST_t *rrc) +{ + // for each Access Category for which T390 (TODO not implemented) is not running + // consider the barring for this Access Category to be alleviated + rrc->access_barred = false; +} + void handle_t300_expiry(NR_UE_RRC_INST_t *rrc) { rrc->ra_trigger = RRC_CONNECTION_SETUP; diff --git a/openair2/RRC/NR_UE/rrc_defs.h b/openair2/RRC/NR_UE/rrc_defs.h index 960dc1aaa0..c71f7697a2 100644 --- a/openair2/RRC/NR_UE/rrc_defs.h +++ b/openair2/RRC/NR_UE/rrc_defs.h @@ -205,7 +205,7 @@ typedef struct rrcPerNB { typedef struct NR_UE_RRC_INST_s { instance_t ue_id; rrcPerNB_t perNB[NB_CNX_UE]; - + bool access_barred; rnti_t rnti; uint32_t phyCellID; long arfcn_ssb; diff --git a/openair2/RRC/NR_UE/rrc_proto.h b/openair2/RRC/NR_UE/rrc_proto.h index 7c5f749fa0..bc7f7001af 100644 --- a/openair2/RRC/NR_UE/rrc_proto.h +++ b/openair2/RRC/NR_UE/rrc_proto.h @@ -64,6 +64,7 @@ void *rrc_nrue(void *args_p); void nr_rrc_handle_timers(NR_UE_RRC_INST_t *rrc); void handle_rlf_detection(NR_UE_RRC_INST_t *rrc); +void handle_302_expired_stopped(NR_UE_RRC_INST_t *rrc); /**\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 9286494f0b..57f6be2eb6 100644 --- a/openair2/RRC/NR_UE/rrc_timers_and_constants.c +++ b/openair2/RRC/NR_UE/rrc_timers_and_constants.c @@ -144,6 +144,14 @@ void nr_rrc_handle_timers(NR_UE_RRC_INST_t *rrc) nr_rrc_going_to_IDLE(rrc, RRC_CONNECTION_FAILURE, NULL); } + bool t302_expired = nr_timer_tick(&timers->T302); + // 5.3.14.4 in 38.331 + // consider the barring for this Access Category to be alleviated + if (t302_expired) { + LOG_W(NR_RRC, "Timer T302 expired! Access barring alleviated!\n"); + handle_302_expired_stopped(rrc); + } + bool t304_expired = nr_timer_tick(&timers->T304); if(t304_expired) { LOG_W(NR_RRC, "Timer T304 expired\n");