diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c index 39408f150c..395a69b0b3 100644 --- a/openair2/LAYER2/NR_MAC_UE/config_ue.c +++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c @@ -658,6 +658,8 @@ void configure_current_BWP(NR_UE_MAC_INST_t *mac, UL_BWP->configuredGrantConfig = spCellConfigDedicated->uplinkConfig->initialUplinkBWP->configuredGrantConfig ? spCellConfigDedicated->uplinkConfig->initialUplinkBWP->configuredGrantConfig->choice.setup : NULL; ul_genericParameters = bwp_ulcommon->genericParameters; + if (bwp_ulcommon->pucch_ConfigCommon) + UL_BWP->pucch_ConfigCommon = bwp_ulcommon->pucch_ConfigCommon->choice.setup; if (bwp_ulcommon->rach_ConfigCommon) UL_BWP->rach_ConfigCommon = bwp_ulcommon->rach_ConfigCommon->choice.setup; } @@ -749,8 +751,6 @@ void nr_rrc_mac_config_req_mcg(module_id_t module_id, mac->scheduling_info.periodicBSR_SF, mac->scheduling_info.retxBSR_SF); - configure_current_BWP(mac, NULL, cell_group_config); - RA_config_t *ra = &mac->ra; if (cell_group_config->spCellConfig && cell_group_config->spCellConfig->reconfigurationWithSync) { LOG_A(NR_MAC, "Received the reconfigurationWithSync in %s\n", __FUNCTION__); @@ -772,11 +772,13 @@ void nr_rrc_mac_config_req_mcg(module_id_t module_id, mac->synch_request.synch_req.target_Nid_cell = mac->physCellId; mac->if_module->synch_request(&mac->synch_request); } - config_common_ue(mac, module_id, cc_idP); mac->crnti = cell_group_config->spCellConfig->reconfigurationWithSync->newUE_Identity; - LOG_I(MAC, "Configuring CRNTI %x\n", mac->crnti); + LOG_I(NR_MAC, "Configuring CRNTI %x\n", mac->crnti); + configure_current_BWP(mac, NULL, cell_group_config); + config_common_ue(mac, module_id, cc_idP); nr_ue_mac_default_configs(mac); + if (!get_softmodem_params()->emulate_l1) { mac->if_module->phy_config_request(&mac->phy_config); mac->phy_config_request_sent = true; @@ -784,6 +786,8 @@ void nr_rrc_mac_config_req_mcg(module_id_t module_id, // Setup the SSB to Rach Occasions mapping according to the config build_ssb_to_ro_map(mac); + } else { + configure_current_BWP(mac, NULL, cell_group_config); } } diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 2cc400d2d2..71bb875af4 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -184,12 +184,6 @@ void nr_ue_mac_default_configs(NR_UE_MAC_INST_t *mac) mac->scheduling_info.retxBSR_SF = MAC_UE_BSR_TIMER_NOT_RUNNING; mac->BSR_reporting_active = BSR_TRIGGER_NONE; - mac->first_sync_frame = -1; - mac->get_sib1 = false; - mac->phy_config_request_sent = false; - mac->state = UE_NOT_SYNC; - memset(&mac->ssb_measurements, 0, sizeof(mac->ssb_measurements)); - 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.Bj[i] = -1; diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index 299d7c44c6..39f72831f4 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -98,7 +98,7 @@ static void process_rlcBearerConfig(struct NR_CellGroupConfig__rlc_BearerToAddMo } -void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_sched_ctrl_t *sched_ctrl) +void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_info_t *UE) { /* we assume that this function is mutex-protected from outside */ NR_SCHED_ENSURE_LOCKED(&RC.nrmac[0]->sched_lock); @@ -114,8 +114,8 @@ void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_sched_ctrl_t *sche //process_phr_Config(sched_ctrl,mac_CellGroupConfig->phr_Config); } - process_rlcBearerConfig(CellGroup->rlc_BearerToAddModList,CellGroup->rlc_BearerToReleaseList,sched_ctrl); - + nr_mac_prepare_ra_ue(RC.nrmac[0], UE->rnti, CellGroup); + process_rlcBearerConfig(CellGroup->rlc_BearerToAddModList, CellGroup->rlc_BearerToReleaseList, &UE->UE_sched_ctrl); } static void config_common(gNB_MAC_INST *nrmac, int pdsch_AntennaPorts, int pusch_AntennaPorts, NR_ServingCellConfigCommon_t *scc) @@ -570,7 +570,7 @@ bool nr_mac_add_test_ue(gNB_MAC_INST *nrmac, uint32_t rnti, NR_CellGroupConfig_t NR_UE_info_t* UE = add_new_nr_ue(nrmac, rnti, CellGroup); if (UE) { LOG_I(NR_MAC,"Force-added new UE %x with initial CellGroup\n", rnti); - process_CellGroup(CellGroup,&UE->UE_sched_ctrl); + process_CellGroup(CellGroup, UE); } else { LOG_E(NR_MAC,"Error adding UE %04x\n", rnti); } @@ -578,12 +578,11 @@ bool nr_mac_add_test_ue(gNB_MAC_INST *nrmac, uint32_t rnti, NR_CellGroupConfig_t return UE != NULL; } -bool nr_mac_prepare_ra_nsa_ue(gNB_MAC_INST *nrmac, uint32_t rnti, NR_CellGroupConfig_t *CellGroup) +bool nr_mac_prepare_ra_ue(gNB_MAC_INST *nrmac, uint32_t rnti, NR_CellGroupConfig_t *CellGroup) { DevAssert(nrmac != NULL); DevAssert(CellGroup != NULL); - DevAssert(!get_softmodem_params()->phy_test); - NR_SCHED_LOCK(&nrmac->sched_lock); + NR_SCHED_ENSURE_LOCKED(&nrmac->sched_lock); // NSA case: need to pre-configure CFRA const int CC_id = 0; @@ -599,32 +598,37 @@ bool nr_mac_prepare_ra_nsa_ue(gNB_MAC_INST *nrmac, uint32_t rnti, NR_CellGroupCo return false; } NR_RA_t *ra = &cc->ra[ra_index]; - ra->CellGroup = CellGroup; - AssertFatal(CellGroup->spCellConfig && CellGroup->spCellConfig->reconfigurationWithSync - && CellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated != NULL - && CellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra != NULL, - "invalid CellGroup for RNTI %04x, cannot create RA occasion\n", - rnti); - - ra->cfra = true; - ra->rnti = rnti; - struct NR_CFRA *cfra = CellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra; - uint8_t num_preamble = cfra->resources.choice.ssb->ssb_ResourceList.list.count; - AssertFatal(ra->preambles.num_preambles == 0 && ra->preambles.preamble_list == NULL, - "preamble_list already configured means logic bug, list is allocated here\n"); - ra->preambles.num_preambles = num_preamble; - ra->preambles.preamble_list = calloc(ra->preambles.num_preambles, sizeof(*ra->preambles.preamble_list)); - for (int i = 0; i < cc->num_active_ssb; i++) { - for (int j = 0; j < num_preamble; j++) { - if (cc->ssb_index[i] == cfra->resources.choice.ssb->ssb_ResourceList.list.array[j]->ssb) { - // one dedicated preamble for each beam - ra->preambles.preamble_list[i] = cfra->resources.choice.ssb->ssb_ResourceList.list.array[j]->ra_PreambleIndex; - break; + if (CellGroup->spCellConfig && CellGroup->spCellConfig->reconfigurationWithSync + && CellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated != NULL) { + if (CellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra != NULL) { + ra->cfra = true; + ra->rnti = rnti; + ra->CellGroup = CellGroup; + struct NR_CFRA *cfra = CellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra; + uint8_t num_preamble = cfra->resources.choice.ssb->ssb_ResourceList.list.count; + ra->preambles.num_preambles = num_preamble; + ra->preambles.preamble_list = calloc(ra->preambles.num_preambles, sizeof(*ra->preambles.preamble_list)); + for (int i = 0; i < cc->num_active_ssb; i++) { + for (int j = 0; j < num_preamble; j++) { + if (cc->ssb_index[i] == cfra->resources.choice.ssb->ssb_ResourceList.list.array[j]->ssb) { + // one dedicated preamble for each beam + ra->preambles.preamble_list[i] = cfra->resources.choice.ssb->ssb_ResourceList.list.array[j]->ra_PreambleIndex; + break; + } + } } } + } else { + ra->cfra = false; + ra->rnti = 0; + if (ra->preambles.preamble_list == NULL) { + ra->preambles.num_preambles = MAX_NUM_NR_PRACH_PREAMBLES; + ra->preambles.preamble_list = (uint8_t *)malloc(MAX_NUM_NR_PRACH_PREAMBLES * sizeof(uint8_t)); + for (int i = 0; i < MAX_NUM_NR_PRACH_PREAMBLES; i++) + ra->preambles.preamble_list[i] = i; + } } - LOG_I(NR_MAC,"Added new RA process for UE RNTI %04x with initial CellGroup\n", rnti); - NR_SCHED_UNLOCK(&nrmac->sched_lock); + LOG_I(NR_MAC, "Added new %s process for UE RNTI %04x with initial CellGroup\n", ra->cfra ? "CFRA" : "CBRA", rnti); return true; } @@ -649,7 +653,7 @@ bool nr_mac_update_cellgroup(gNB_MAC_INST *nrmac, uint32_t rnti, NR_CellGroupCon exit(1); } - process_CellGroup(CellGroup, &UE->UE_sched_ctrl); + process_CellGroup(CellGroup, UE); return true; } diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 902aef5439..d2b9f2331e 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -1791,9 +1791,10 @@ static void nr_generate_Msg3_dcch_dtch_response(module_id_t module_idP, (UE->enc_rval.encoded+7)/8, 0, 0); } - NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; - process_CellGroup(UE->CellGroup, sched_ctrl); + process_CellGroup(UE->CellGroup, UE); + // switching to initial BWP + NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; configure_UE_BWP(nr_mac, scc, sched_ctrl, NULL, UE, 0, 0); // Reset uplink failure flags/counters/timers at MAC so gNB will resume again scheduling resources for this UE diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c index ef46cc30d8..f60e79dd11 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c @@ -2820,9 +2820,8 @@ void nr_mac_update_timers(module_id_t module_id, NR_ServingCellConfigCommon_t *scc = RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon; LOG_I(NR_MAC,"Modified rnti %04x with CellGroup\n", UE->rnti); - process_CellGroup(cg,&UE->UE_sched_ctrl); + process_CellGroup(cg, UE); NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl; - configure_UE_BWP(RC.nrmac[module_id], scc, sched_ctrl, NULL, UE, -1, -1); if (get_softmodem_params()->sa) { diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index e777fa5e0f..0bc137f910 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -760,7 +760,7 @@ static void _nr_rx_sdu(const module_id_t gnb_mod_idP, reset_ul_harq_list(UE_scheduling_control); UE_msg3_stage->ra_timer = 0; nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra); - process_CellGroup(ra->CellGroup, UE_scheduling_control); + process_CellGroup(ra->CellGroup, UE_msg3_stage); } else { diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h index f01a47699a..10ba95928d 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h +++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h @@ -54,7 +54,7 @@ void nr_mac_config_scc(gNB_MAC_INST *nrmac, void nr_mac_config_mib(gNB_MAC_INST *nrmac, NR_BCCH_BCH_Message_t *mib); void nr_mac_config_sib1(gNB_MAC_INST *nrmac, NR_BCCH_DL_SCH_Message_t *sib1); bool nr_mac_add_test_ue(gNB_MAC_INST *nrmac, uint32_t rnti, NR_CellGroupConfig_t *CellGroup); -bool nr_mac_prepare_ra_nsa_ue(gNB_MAC_INST *nrmac, uint32_t rnti, NR_CellGroupConfig_t *CellGroup); +bool nr_mac_prepare_ra_ue(gNB_MAC_INST *nrmac, uint32_t rnti, NR_CellGroupConfig_t *CellGroup); bool nr_mac_update_cellgroup(gNB_MAC_INST *nrmac, uint32_t rnti, NR_CellGroupConfig_t *CellGroup); void clear_nr_nfapi_information(gNB_MAC_INST *gNB, @@ -433,7 +433,7 @@ void nr_sr_reporting(gNB_MAC_INST *nrmac, frame_t frameP, sub_frame_t slotP); size_t dump_mac_stats(gNB_MAC_INST *gNB, char *output, size_t strlen, bool reset_rsrp); -void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_sched_ctrl_t *sched_ctrl); +void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_info_t *UE); void prepare_initial_ul_rrc_message(gNB_MAC_INST *mac, NR_UE_info_t *UE); void send_initial_ul_rrc_message(gNB_MAC_INST *mac, int rnti, const uint8_t *sdu, sdu_size_t sdu_len, void *rawUE); diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c index 500755cff3..582420a0b4 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c +++ b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c @@ -147,7 +147,7 @@ void ue_context_setup_request(const f1ap_ue_context_setup_t *req) resp.du_to_cu_rrc_information->cellGroupConfig_length = (enc_rval.encoded + 7) >> 3; /* TODO: need to apply after UE context reconfiguration confirmed? */ - process_CellGroup(UE->CellGroup, &UE->UE_sched_ctrl); + process_CellGroup(UE->CellGroup, UE); NR_SCHED_UNLOCK(&mac->sched_lock); diff --git a/openair2/RRC/NR/rrc_gNB_nsa.c b/openair2/RRC/NR/rrc_gNB_nsa.c index 4096dfa0ca..656c7d0663 100644 --- a/openair2/RRC/NR/rrc_gNB_nsa.c +++ b/openair2/RRC/NR/rrc_gNB_nsa.c @@ -349,7 +349,9 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc, rrc_gNB_ue_context_t *ue_context_p, x2a // phytest mode: we don't set up RA, etc ret = nr_mac_add_test_ue(RC.nrmac[rrc->module_id] , ue_context_p->ue_context.rnti, ue_context_p->ue_context.secondaryCellGroup); } else { - ret = nr_mac_prepare_ra_nsa_ue(RC.nrmac[rrc->module_id], ue_context_p->ue_context.rnti, ue_context_p->ue_context.secondaryCellGroup); + NR_SCHED_LOCK(&RC.nrmac[rrc->module_id]->sched_lock); + ret = nr_mac_prepare_ra_ue(RC.nrmac[rrc->module_id], ue_context_p->ue_context.rnti, ue_context_p->ue_context.secondaryCellGroup); + NR_SCHED_UNLOCK(&RC.nrmac[rrc->module_id]->sched_lock); } AssertFatal(ret, "cannot add NSA UE in MAC, aborting\n");