diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c index 9b83548995..a84903c912 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c @@ -1131,7 +1131,8 @@ int get_nr_prach_info_from_index(uint8_t index, uint8_t *N_t_slot, uint8_t *N_dur, uint16_t *RA_sfn_index, - uint8_t *N_RA_slot) { + uint8_t *N_RA_slot, + uint8_t *config_period) { int x,y; int64_t s_map; @@ -1161,6 +1162,7 @@ int get_nr_prach_info_from_index(uint8_t index, return 0; // no prach in even slots @ 120kHz for 1 prach per 60khz slot } if (start_symbol != NULL && N_t_slot != NULL && N_dur != NULL && format != NULL){ + *config_period = x; *start_symbol = table_6_3_3_2_4_prachConfig_Index[index][6]; *N_t_slot = table_6_3_3_2_4_prachConfig_Index[index][8]; *N_dur = table_6_3_3_2_4_prachConfig_Index[index][9]; @@ -1209,6 +1211,7 @@ int get_nr_prach_info_from_index(uint8_t index, return 0; // no prach in even slots @ 30kHz for 1 prach per subframe } if (start_symbol != NULL && N_t_slot != NULL && N_dur != NULL && format != NULL){ + *config_period = x; *start_symbol = table_6_3_3_2_3_prachConfig_Index[index][5]; *N_t_slot = table_6_3_3_2_3_prachConfig_Index[index][7]; *N_dur = table_6_3_3_2_3_prachConfig_Index[index][8]; diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h index 3b57ba133f..30fe34fda6 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h @@ -100,7 +100,8 @@ int get_nr_prach_info_from_index(uint8_t index, uint8_t *N_t_slot, uint8_t *N_dur, uint16_t *RA_sfn_index, - uint8_t *N_RA_slot); + uint8_t *N_RA_slot, + uint8_t *config_period); int get_nr_prach_occasion_info_from_index(uint8_t index, uint32_t pointa, diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 4e751ce7ff..41a3ae77f9 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -73,6 +73,7 @@ int16_t ssb_index_from_prach(module_id_t module_idP, uint16_t start_symbol_index = 0; uint8_t mu,N_dur,N_t_slot,start_symbol = 0, temp_start_symbol = 0, N_RA_slot; uint16_t format,RA_sfn_index = -1; + uint8_t config_period = 0; uint16_t prach_occasion_id = -1; uint8_t num_active_ssb = cc->num_active_ssb; @@ -92,7 +93,8 @@ int16_t ssb_index_from_prach(module_id_t module_idP, &N_t_slot, &N_dur, &RA_sfn_index, - &N_RA_slot); + &N_RA_slot, + &config_period); uint8_t index = 0,slot_index = 0; for (slot_index = 0;slot_index < N_RA_slot; slot_index++) { if (N_RA_slot <= 1) { //1 PRACH slot in a subframe @@ -113,7 +115,7 @@ int16_t ssb_index_from_prach(module_id_t module_idP, } // prach_occasion_id = subframe_index * N_t_slot * N_RA_slot * fdm + N_RA_slot_index * N_t_slot * fdm + freq_index + fdm * start_symbol_index; - prach_occasion_id = (RA_sfn_index + slot_index) * N_t_slot * fdm + start_symbol_index * fdm + freq_index; + prach_occasion_id = (((frameP % (cc->max_association_period * config_period))/config_period)*cc->total_prach_occasions_per_config_period) + (RA_sfn_index + slot_index) * N_t_slot * fdm + start_symbol_index * fdm + freq_index; //one RO is shared by one or more SSB if(num_ssb_per_RO <= 1 ) index = (int) (prach_occasion_id / (int)(1/num_ssb_per_RO)) % num_active_ssb; @@ -173,13 +175,15 @@ void find_SSB_and_RO_available(module_id_t module_idP) { } } - for(int i = 0; (1 << i) < max_association_period;i++) { + for(int i = 1; (1 << (i-1)) <= max_association_period;i++) { if(total_RA_occasions >= (int) (num_active_ssb/num_ssb_per_RO)) { - repetition = (uint16_t)((total_RA_occasions * num_ssb_per_RO )/num_active_ssb); - break; + repetition = (uint16_t)((total_RA_occasions * num_ssb_per_RO )/num_active_ssb); + break; + } + else { + total_RA_occasions = total_RA_occasions * i; + cc->max_association_period = i; } - else - total_RA_occasions = total_RA_occasions * i; } unused_RA_occasion = total_RA_occasions - (int)((num_active_ssb * repetition)/num_ssb_per_RO); @@ -201,6 +205,7 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, sub_frame_t slotP uint8_t config_index = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.prach_ConfigurationIndex; uint8_t mu,N_dur,N_t_slot,start_symbol = 0,temp_start_symbol = 0,N_RA_slot; uint16_t RA_sfn_index = -1; + uint8_t config_period = 0; uint16_t format; int slot_index = 0; uint16_t prach_occasion_id = -1; @@ -223,7 +228,8 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, sub_frame_t slotP &N_t_slot, &N_dur, &RA_sfn_index, - &N_RA_slot) ) { + &N_RA_slot, + &config_period) ) { uint16_t format0 = format&0xff; // first column of format from table uint16_t format1 = (format>>8)&0xff; // second column of format from table @@ -251,7 +257,7 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, sub_frame_t slotP UL_tti_req->Slot = slotP; for (int n=0; n < fdm; n++) { // one structure per frequency domain occasion - prach_occasion_id = (RA_sfn_index + slot_index) * N_t_slot * fdm + index * fdm + n; + prach_occasion_id = (((frameP % (cc->max_association_period * config_period))/config_period)*cc->total_prach_occasions_per_config_period) + (RA_sfn_index + slot_index) * N_t_slot * fdm + index * fdm + n; if(prach_occasion_id < cc->total_prach_occasions){ UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE; diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h index 3425302467..a5f0ce6a12 100644 --- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h +++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h @@ -181,8 +181,12 @@ typedef struct { uint8_t num_sf_allocation_pattern; ///Number of active SSBs uint8_t num_active_ssb; + //Total available prach occasions per configuration period + uint32_t total_prach_occasions_per_config_period; //Total available prach occasions uint32_t total_prach_occasions; + //Max Association period + uint8_t max_association_period; } NR_COMMON_channels_t; diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c index 129881d3d4..6fa3997a87 100644 --- a/openair2/RRC/NR/rrc_gNB_reconfig.c +++ b/openair2/RRC/NR/rrc_gNB_reconfig.c @@ -157,7 +157,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb = calloc(1,sizeof(struct NR_CFRA__resources__ssb)); secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ra_ssb_OccasionMaskIndex = 0; struct NR_CFRA_SSB_Resource *ssbElem[8]; - for(int i = 0; i < 8; i++) { + for(int i = 0; i < 1; i++) { ssbElem[i] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource)); ssbElem[i]->ssb = i; ssbElem[i]->ra_PreambleIndex = 63;