Merge branch 'NR_MAC_SSB_RO_GlobalEdge' of https://gitlab.eurecom.fr/oai/openairinterface5g into NR_MAC_SSB_RO_GlobalEdge
This commit is contained in:
@@ -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,
|
|||||||
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) {
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
&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,
|
|||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
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 @@
|
|||||||
#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 {
|
|||||||
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 {
|
|||||||
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 {
|
|||||||
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
|
||||||
|
|||||||
Reference in New Issue
Block a user