Commit 0d555854 authored by Florian Kaltenberger's avatar Florian Kaltenberger

Merge branch 'NR_MAC_SSB_RO_GlobalEdge' of...

Merge branch 'NR_MAC_SSB_RO_GlobalEdge' of https://gitlab.eurecom.fr/oai/openairinterface5g into NR_MAC_SSB_RO_GlobalEdge
parents 18ae5acc 2cad2b93
...@@ -57,7 +57,7 @@ int16_t ssb_index_from_prach(module_id_t module_idP, ...@@ -57,7 +57,7 @@ int16_t ssb_index_from_prach(module_id_t module_idP,
uint8_t symbol) { uint8_t symbol) {
gNB_MAC_INST *gNB = RC.nrmac[module_idP]; gNB_MAC_INST *gNB = RC.nrmac[module_idP];
NR_COMMON_channels_t *cc = gNB->common_channels; NR_COMMON_channels_t *cc = &gNB->common_channels[0];
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
nfapi_nr_config_request_scf_t *cfg = &RC.nrmac[module_idP]->config[0]; nfapi_nr_config_request_scf_t *cfg = &RC.nrmac[module_idP]->config[0];
...@@ -134,7 +134,7 @@ int16_t ssb_index_from_prach(module_id_t module_idP, ...@@ -134,7 +134,7 @@ int16_t ssb_index_from_prach(module_id_t module_idP,
void find_SSB_and_RO_available(module_id_t module_idP) { void find_SSB_and_RO_available(module_id_t module_idP) {
gNB_MAC_INST *gNB = RC.nrmac[module_idP]; gNB_MAC_INST *gNB = RC.nrmac[module_idP];
NR_COMMON_channels_t *cc = gNB->common_channels; NR_COMMON_channels_t *cc = &gNB->common_channels[0];
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
nfapi_nr_config_request_scf_t *cfg = &RC.nrmac[module_idP]->config[0]; nfapi_nr_config_request_scf_t *cfg = &RC.nrmac[module_idP]->config[0];
...@@ -167,14 +167,12 @@ void find_SSB_and_RO_available(module_id_t module_idP) { ...@@ -167,14 +167,12 @@ void find_SSB_and_RO_available(module_id_t module_idP) {
uint64_t L_ssb = (((uint64_t) cfg->ssb_table.ssb_mask_list[0].ssb_mask.value)<<32) | cfg->ssb_table.ssb_mask_list[1].ssb_mask.value ; uint64_t L_ssb = (((uint64_t) cfg->ssb_table.ssb_mask_list[0].ssb_mask.value)<<32) | cfg->ssb_table.ssb_mask_list[1].ssb_mask.value ;
uint32_t total_RA_occasions = N_RA_sfn * N_t_slot * N_RA_slot * fdm; uint32_t total_RA_occasions = N_RA_sfn * N_t_slot * N_RA_slot * fdm;
/* for(int i = 0;i < 64;i++) {
for(int i = 0;i < 64;i++) { if ((L_ssb >> (63-i)) & 0x01) { // only if the bit of L_ssb at current ssb index is 1
if ((L_ssb >> (63-i)) & 0x01) { // only if the bit of L_ssb at current ssb index is 1 cc->ssb_index[num_active_ssb] = i;
gNB->SSB_list[num_active_ssb].ssb_index = i; num_active_ssb++;
num_active_ssb++; }
} }
}
*/
for(int i = 1; (1 << (i-1)) <= 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)) { if(total_RA_occasions >= (int) (num_active_ssb/num_ssb_per_RO)) {
...@@ -430,8 +428,7 @@ void nr_initiate_ra_proc(module_id_t module_idP, ...@@ -430,8 +428,7 @@ void nr_initiate_ra_proc(module_id_t module_idP,
gNB_MAC_INST *nr_mac = RC.nrmac[module_idP]; gNB_MAC_INST *nr_mac = RC.nrmac[module_idP];
NR_COMMON_channels_t *cc = &nr_mac->common_channels[CC_id]; NR_COMMON_channels_t *cc = &nr_mac->common_channels[CC_id];
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon; NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
NR_RA_t *ra = &cc->ra[0]; NR_RA_t *ra = &cc->ra[0];
// if the preamble received correspond to one of the listed // if the preamble received correspond to one of the listed
// the UE sent a RACH either for starting RA procedure or RA procedure failed and UE retries // the UE sent a RACH either for starting RA procedure or RA procedure failed and UE retries
int pr_found=0; int pr_found=0;
...@@ -446,7 +443,6 @@ void nr_initiate_ra_proc(module_id_t module_idP, ...@@ -446,7 +443,6 @@ void nr_initiate_ra_proc(module_id_t module_idP,
module_idP, preamble_index); module_idP, preamble_index);
return; // if the PRACH preamble does not correspond to any of the ones sent through RRC abort RA proc return; // if the PRACH preamble does not correspond to any of the ones sent through RRC abort RA proc
} }
// This should be handled differently when we use the initialBWP for RA // This should be handled differently when we use the initialBWP for RA
ra->bwp_id=1; ra->bwp_id=1;
NR_BWP_Downlink_t *bwp=ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id-1]; NR_BWP_Downlink_t *bwp=ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id-1];
...@@ -457,13 +453,12 @@ void nr_initiate_ra_proc(module_id_t module_idP, ...@@ -457,13 +453,12 @@ void nr_initiate_ra_proc(module_id_t module_idP,
if (ra->state == RA_IDLE) { if (ra->state == RA_IDLE) {
uint8_t index = ssb_index_from_prach(module_idP, uint8_t beam_index = ssb_index_from_prach(module_idP,
frameP, frameP,
slotP, slotP,
preamble_index, preamble_index,
freq_index, freq_index,
symbol); symbol);
int loop = 0; int loop = 0;
LOG_D(MAC, "Frame %d, Slot %d: Activating RA process \n", frameP, slotP); LOG_D(MAC, "Frame %d, Slot %d: Activating RA process \n", frameP, slotP);
ra->state = Msg2; ra->state = Msg2;
...@@ -485,13 +480,13 @@ void nr_initiate_ra_proc(module_id_t module_idP, ...@@ -485,13 +480,13 @@ void nr_initiate_ra_proc(module_id_t module_idP,
&monitoring_slot_period, &monitoring_slot_period,
&monitoring_offset); &monitoring_offset);
nr_schedule_msg2(frameP, slotP, &msg2_frame, &msg2_slot, scc, monitoring_slot_period, monitoring_offset,index,cc->num_active_ssb); nr_schedule_msg2(frameP, slotP, &msg2_frame, &msg2_slot, scc, monitoring_slot_period, monitoring_offset,beam_index,cc->num_active_ssb);
ra->Msg2_frame = msg2_frame; ra->Msg2_frame = msg2_frame;
ra->Msg2_slot = msg2_slot; ra->Msg2_slot = msg2_slot;
LOG_I(MAC, "%s() Msg2[%04d%d] SFN/SF:%04d%d\n", __FUNCTION__, ra->Msg2_frame, ra->Msg2_slot, frameP, slotP); LOG_I(MAC, "%s() Msg2[%04d%d] SFN/SF:%04d%d\n", __FUNCTION__, ra->Msg2_frame, ra->Msg2_slot, frameP, slotP);
if(pr_found)
do { do {
ra->rnti = (taus() % 65518) + 1; ra->rnti = (taus() % 65518) + 1;
loop++; loop++;
...@@ -504,16 +499,16 @@ void nr_initiate_ra_proc(module_id_t module_idP, ...@@ -504,16 +499,16 @@ void nr_initiate_ra_proc(module_id_t module_idP,
ra->RA_rnti = ra_rnti; ra->RA_rnti = ra_rnti;
ra->preamble_index = preamble_index; ra->preamble_index = preamble_index;
ra->ssb_id = index; ra->beam_id = beam_index;
LOG_I(MAC,"[gNB %d][RAPROC] CC_id %d Frame %d Activating Msg2 generation in frame %d, slot %d using RA rnti %x SSB index %u\n", LOG_I(MAC,"[gNB %d][RAPROC] CC_id %d Frame %d Activating Msg2 generation in frame %d, slot %d using RA rnti %x SSB index %u\n",
module_idP, module_idP,
CC_id, CC_id,
frameP, frameP,
ra->Msg2_frame, ra->Msg2_frame,
ra->Msg2_slot, ra->Msg2_slot,
ra->RA_rnti, ra->RA_rnti,
ra->ssb_id); cc->ssb_index[beam_index]);
return; return;
} }
...@@ -728,8 +723,8 @@ void nr_generate_Msg2(module_id_t module_idP, ...@@ -728,8 +723,8 @@ void nr_generate_Msg2(module_id_t module_idP,
int dci_formats[2], rnti_types[2], mcsIndex; int dci_formats[2], rnti_types[2], mcsIndex;
int startSymbolAndLength = 0, StartSymbolIndex = -1, NrOfSymbols = 14, StartSymbolIndex_tmp, NrOfSymbols_tmp, x_Overhead, time_domain_assignment = 0; int startSymbolAndLength = 0, StartSymbolIndex = -1, NrOfSymbols = 14, StartSymbolIndex_tmp, NrOfSymbols_tmp, x_Overhead, time_domain_assignment = 0;
gNB_MAC_INST *nr_mac = RC.nrmac[module_idP]; gNB_MAC_INST *nr_mac = RC.nrmac[module_idP];
NR_COMMON_channels_t *cc = &nr_mac->common_channels[0]; NR_COMMON_channels_t *cc = &nr_mac->common_channels[CC_id];
NR_RA_t *ra = &cc->ra[0]; NR_RA_t *ra = &cc->ra[CC_id];
NR_SearchSpace_t *ss = ra->ra_ss; NR_SearchSpace_t *ss = ra->ra_ss;
uint16_t RA_rnti = ra->RA_rnti; uint16_t RA_rnti = ra->RA_rnti;
......
...@@ -389,8 +389,8 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, ...@@ -389,8 +389,8 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
ra->state = RA_IDLE; ra->state = RA_IDLE;
LOG_I(MAC, "reset RA state information for RA-RNTI %04x\n", ra->rnti); LOG_I(MAC, "reset RA state information for RA-RNTI %04x\n", ra->rnti);
const int UE_id = add_new_nr_ue(gnb_mod_idP, ra->crnti); const int UE_id = add_new_nr_ue(gnb_mod_idP, ra->crnti);
UE_info->UE_ssb_index[UE_id] = ra->ssb_id;
UE_info->secondaryCellGroup[UE_id] = ra->secondaryCellGroup; UE_info->secondaryCellGroup[UE_id] = ra->secondaryCellGroup;
UE_info->UE_beam_index[UE_id] = ra->beam_id;
struct NR_ServingCellConfig__downlinkBWP_ToAddModList *bwpList = struct NR_ServingCellConfig__downlinkBWP_ToAddModList *bwpList =
ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList; ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList;
AssertFatal(bwpList->list.count == 1, AssertFatal(bwpList->list.count == 1,
......
...@@ -74,6 +74,7 @@ ...@@ -74,6 +74,7 @@
#define MAX_NUM_CCE 90 #define MAX_NUM_CCE 90
/*!\brief Maximum number of random access process */ /*!\brief Maximum number of random access process */
#define NR_NB_RA_PROC_MAX 4 #define NR_NB_RA_PROC_MAX 4
#define MAX_NUM_OF_SSB 64
typedef enum { typedef enum {
RA_IDLE = 0, RA_IDLE = 0,
...@@ -146,8 +147,8 @@ typedef struct { ...@@ -146,8 +147,8 @@ typedef struct {
int msg4_mcs; int msg4_mcs;
/// RA search space /// RA search space
NR_SearchSpace_t *ra_ss; NR_SearchSpace_t *ra_ss;
// SSB id // Beam index
uint8_t ssb_id; uint8_t beam_id;
/// secondaryCellGroup for UE in NSA that is to come /// secondaryCellGroup for UE in NSA that is to come
NR_CellGroupConfig_t *secondaryCellGroup; NR_CellGroupConfig_t *secondaryCellGroup;
/// Preambles for contention-free access /// Preambles for contention-free access
...@@ -190,14 +191,16 @@ typedef struct { ...@@ -190,14 +191,16 @@ typedef struct {
uint8_t vrb_map_UL[275]; uint8_t vrb_map_UL[275];
/// number of subframe allocation pattern available for MBSFN sync area /// number of subframe allocation pattern available for MBSFN sync area
uint8_t num_sf_allocation_pattern; uint8_t num_sf_allocation_pattern;
///Number of active SSBs ///Number of active SSBs
uint8_t num_active_ssb; uint8_t num_active_ssb;
//Total available prach occasions per configuration period //Total available prach occasions per configuration period
uint32_t total_prach_occasions_per_config_period; uint32_t total_prach_occasions_per_config_period;
//Total available prach occasions //Total available prach occasions
uint32_t total_prach_occasions; uint32_t total_prach_occasions;
//Max Association period //Max Association period
uint8_t max_association_period; uint8_t max_association_period;
//SSB index
uint8_t ssb_index[MAX_NUM_OF_SSB];
} NR_COMMON_channels_t; } NR_COMMON_channels_t;
...@@ -390,25 +393,10 @@ typedef struct { ...@@ -390,25 +393,10 @@ typedef struct {
bool active[MAX_MOBILES_PER_GNB]; bool active[MAX_MOBILES_PER_GNB];
rnti_t rnti[MAX_MOBILES_PER_GNB]; rnti_t rnti[MAX_MOBILES_PER_GNB];
NR_CellGroupConfig_t *secondaryCellGroup[MAX_MOBILES_PER_GNB]; NR_CellGroupConfig_t *secondaryCellGroup[MAX_MOBILES_PER_GNB];
uint8_t UE_ssb_index[MAX_MOBILES_PER_GNB]; // UE selected beam index
uint8_t UE_beam_index[MAX_MOBILES_PER_GNB];
} NR_UE_info_t; } NR_UE_info_t;
/*
typedef struct {
rnti_t rnti;
rnti_t tc_rnti;
boolean_t active;
} NR_SSB_UE_list_t;
#define MAX_NUM_OF_SSB 64
typedef struct {
uint8_t ssb_index;
int num_UEs;
NR_SSB_UE_list_t SSB_UE_list[MAX_MOBILES_PER_GNB];
} NR_SSB_list_t;
*/
/*! \brief top level eNB MAC structure */ /*! \brief top level eNB MAC structure */
typedef struct gNB_MAC_INST_s { typedef struct gNB_MAC_INST_s {
/// Ethernet parameters for northbound midhaul interface /// Ethernet parameters for northbound midhaul interface
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment