move function to build ssb list after common configuration (reception of SSB information)
also removed unnecessary BWP dependence
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user