diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c index cd266d8a1d..44e01d4d04 100644 --- a/openair2/LAYER2/NR_MAC_UE/config_ue.c +++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c @@ -44,6 +44,28 @@ #include "oai_asn1.h" #include "executables/position_interface.h" +// Build the list of all the valid/transmitted SSBs according to the config +static void build_ssb_list(NR_UE_MAC_INST_t *mac) +{ + // Create the list of transmitted SSBs + free(mac->ssb_list.tx_ssb); + memset(&mac->ssb_list, 0, sizeof(ssb_list_info_t)); + ssb_list_info_t *ssb_list = &mac->ssb_list; + fapi_nr_config_request_t *cfg = &mac->phy_config.config_req; + ssb_list->nb_tx_ssb = 0; + + for (int ssb_index = 0; ssb_index < MAX_NB_SSB; ssb_index++) { + uint32_t curr_mask = cfg->ssb_table.ssb_mask_list[ssb_index / 32].ssb_mask; + // check if if current SSB is transmitted + if ((curr_mask >> (31 - (ssb_index % 32))) & 0x01) { + ssb_list->nb_ssb_per_index[ssb_index] = ssb_list->nb_tx_ssb; + ssb_list->nb_tx_ssb++; + } else + ssb_list->nb_ssb_per_index[ssb_index] = -1; + } + ssb_list->tx_ssb = calloc(ssb_list->nb_tx_ssb, sizeof(*ssb_list->tx_ssb)); +} + static void set_tdd_config_nr_ue(fapi_nr_tdd_table_t *tdd_table, const frame_structure_t *fs) { tdd_table->tdd_period_in_slots = fs->numb_slots_period; @@ -1744,14 +1766,16 @@ void nr_rrc_mac_config_req_sib1(module_id_t module_id, int cc_idP, NR_SIB1_t *si mac->n_ta_offset = get_ta_offset(scc->n_TimingAdvanceOffset); config_common_ue_sa(mac, scc, cc_idP); - configure_common_BWP_dl(mac, - 0, // bwp-id - &scc->downlinkConfigCommon.initialDownlinkBWP); + + // Build the list of all the valid/transmitted SSBs according to the config + LOG_D(NR_MAC, "Build SSB list\n"); + build_ssb_list(mac); + + int bwp_id = 0; + configure_common_BWP_dl(mac, bwp_id, &scc->downlinkConfigCommon.initialDownlinkBWP); if (scc->uplinkConfigCommon) { mac->timeAlignmentTimerCommon = scc->uplinkConfigCommon->timeAlignmentTimerCommon; - configure_common_BWP_ul(mac, - 0, // bwp-id - &scc->uplinkConfigCommon->initialUplinkBWP); + configure_common_BWP_ul(mac, bwp_id, &scc->uplinkConfigCommon->initialUplinkBWP); } // set current BWP only if coming from non-connected state // otherwise it is just a periodically update of the SIB1 content @@ -1816,6 +1840,10 @@ static void handle_reconfiguration_with_sync(NR_UE_MAC_INST_t *mac, mac->dmrs_TypeA_Position = scc->dmrs_TypeA_Position; UPDATE_IE(mac->tdd_UL_DL_ConfigurationCommon, scc->tdd_UL_DL_ConfigurationCommon, NR_TDD_UL_DL_ConfigCommon_t); config_common_ue(mac, scc, cc_idP); + // Build the list of all the valid/transmitted SSBs according to the config + LOG_D(NR_MAC,"Build SSB list\n"); + build_ssb_list(mac); + const int bwp_id = 0; if (scc->downlinkConfigCommon) configure_common_BWP_dl(mac, bwp_id, scc->downlinkConfigCommon->initialDownlinkBWP); diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h index 79fdb4c0d1..4a34fd3a5f 100644 --- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h @@ -577,7 +577,7 @@ typedef struct NR_UE_MAC_INST_s { NR_MIB_t *mib; si_schedInfo_t si_SchedInfo; - ssb_list_info_t ssb_list[MAX_NUM_BWP_UE]; + ssb_list_info_t ssb_list; prach_association_pattern_t prach_assoc_pattern[MAX_NUM_BWP_UE]; NR_UE_ServingCell_Info_t sc_info; diff --git a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c index 35167b6173..1b865a78eb 100644 --- a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c +++ b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c @@ -77,7 +77,7 @@ void nr_ue_init_mac(NR_UE_MAC_INST_t *mac) memset(&mac->ssb_measurements, 0, sizeof(mac->ssb_measurements)); memset(&mac->ul_time_alignment, 0, sizeof(mac->ul_time_alignment)); - memset(mac->ssb_list, 0, sizeof(mac->ssb_list)); + memset(&mac->ssb_list, 0, sizeof(mac->ssb_list)); memset(mac->prach_assoc_pattern, 0, sizeof(mac->prach_assoc_pattern)); for (int i = 0; i < NR_MAX_SR_ID; i++) @@ -302,3 +302,4 @@ void release_mac_configuration(NR_UE_MAC_INST_t *mac, NR_UE_MAC_reset_cause_t ca for (int i = mac->TAG_list.count; i > 0 ; i--) asn_sequence_del(&mac->TAG_list, i - 1, 1); } + diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c index 229a977be2..903b740f10 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c @@ -346,8 +346,7 @@ static void config_preamble_index(NR_UE_MAC_INST_t *mac) if (config_info.ssb_per_ro < 1) ra->ra_PreambleIndex = groupOffset + rand_preamb; else { - ssb_list_info_t *ssb_list = &mac->ssb_list[mac->current_DL_BWP->bwp_id]; - int ssb_pr_idx = ssb_list->nb_ssb_per_index[ra->ra_ssb] % (int)config_info.ssb_per_ro; + int ssb_pr_idx = mac->ssb_list.nb_ssb_per_index[ra->ra_ssb] % (int)config_info.ssb_per_ro; ra->ra_PreambleIndex = groupOffset + (ssb_pr_idx * config_info.preambles_per_ssb) + rand_preamb; } AssertFatal(ra->ra_PreambleIndex < nb_of_preambles, @@ -1190,8 +1189,6 @@ void free_rach_structures(NR_UE_MAC_INST_t *nr_mac, int bwp_id) for (int k = 0; k < MAX_NB_FRAME_IN_PRACH_CONF_PERIOD; k++) for (int l = 0; l < MAX_NB_SLOT_IN_FRAME; l++) free(nr_mac->prach_assoc_pattern[bwp_id].prach_conf_period_list[j].prach_occasion_slot_map[k][l].prach_occasion); - - free(nr_mac->ssb_list[bwp_id].tx_ssb); } void reset_ra(NR_UE_MAC_INST_t *nr_mac, bool free_prach) diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c index aeeab40b74..b2fcab87c3 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c @@ -442,8 +442,8 @@ bool search_space_monitoring_ocasion_other_si(NR_UE_MAC_INST_t *mac, get_monitoring_period_offset(ss, &period, &offset); for (int i = 0; i < duration; i++) { if (((frame * slots_per_frame + slot - offset - i) % period) == 0) { - int N = mac->ssb_list[bwp_id].nb_tx_ssb; - int K = mac->ssb_list->nb_ssb_per_index[mac->mib_ssb]; + int N = mac->ssb_list.nb_tx_ssb; + int K = mac->ssb_list.nb_ssb_per_index[mac->mib_ssb]; // numbering current frame and slot in terms of monitoring occasions in window int rel_slot = abs_slot - mac->si_SchedInfo.si_window_start; diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index ef6c902416..b2e1edd19e 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -1703,28 +1703,6 @@ static void build_ro_list(NR_UE_MAC_INST_t *mac) } // For every prach configuration periods in the maximum association pattern period (160ms) } -// Build the list of all the valid/transmitted SSBs according to the config -static void build_ssb_list(NR_UE_MAC_INST_t *mac) -{ - // Create the list of transmitted SSBs - const int bwp_id = mac->current_UL_BWP->bwp_id; - ssb_list_info_t *ssb_list = &mac->ssb_list[bwp_id]; - fapi_nr_config_request_t *cfg = &mac->phy_config.config_req; - ssb_list->nb_tx_ssb = 0; - - for (int ssb_index = 0; ssb_index < MAX_NB_SSB; ssb_index++) { - uint32_t curr_mask = cfg->ssb_table.ssb_mask_list[ssb_index / 32].ssb_mask; - // check if if current SSB is transmitted - if ((curr_mask >> (31 - (ssb_index % 32))) & 0x01) { - ssb_list->nb_ssb_per_index[ssb_index] = ssb_list->nb_tx_ssb; - ssb_list->nb_tx_ssb++; - } - else - ssb_list->nb_ssb_per_index[ssb_index] = -1; - } - ssb_list->tx_ssb = calloc(ssb_list->nb_tx_ssb, sizeof(*ssb_list->tx_ssb)); -} - static int get_ssb_idx_from_list(ssb_list_info_t *ssb_list, int idx) { for (int ssb_index = 0; ssb_index < MAX_NB_SSB; ssb_index++) { @@ -1758,7 +1736,7 @@ static void map_ssb_to_ro(NR_UE_MAC_INST_t *mac) LOG_D(NR_MAC,"SSB rach ratio %d, Multiple SSB per RO %d\n", ssb_rach_ratio, multiple_ssb_per_ro); const int bwp_id = mac->current_UL_BWP->bwp_id; - ssb_list_info_t *ssb_list = &mac->ssb_list[bwp_id]; + ssb_list_info_t *ssb_list = &mac->ssb_list; // Evaluate the number of PRACH configuration periods required to map all the SSBs and set the association period // WIP: Assumption for now is that all the PRACH configuration periods within a maximum association pattern period have the same @@ -2052,17 +2030,13 @@ void build_ssb_to_ro_map(NR_UE_MAC_INST_t *mac) // Clear all the lists and maps const int bwp_id = mac->current_UL_BWP->bwp_id; free_rach_structures(mac, bwp_id); - memset(&mac->ssb_list[bwp_id], 0, sizeof(ssb_list_info_t)); + memset(&mac->prach_assoc_pattern[bwp_id], 0, sizeof(prach_association_pattern_t)); // Build the list of all the valid RACH occasions in the maximum association pattern period according to the PRACH config LOG_D(NR_MAC,"Build RO list\n"); build_ro_list(mac); - // Build the list of all the valid/transmitted SSBs according to the config - LOG_D(NR_MAC,"Build SSB list\n"); - build_ssb_list(mac); - // Map the transmitted SSBs to the ROs and create the association pattern according to the config LOG_D(NR_MAC,"Map SSB to RO\n"); map_ssb_to_ro(mac); @@ -2575,7 +2549,7 @@ static void nr_ue_prach_scheduler(NR_UE_MAC_INST_t *mac, frame_t frameP, slot_t selected_gnb_ssb_idx, (int)frameP, (int)slotP, - &mac->ssb_list[bwp_id], + &mac->ssb_list, &prach_occasion_info_p); if (is_nr_prach_slot) {