Commit d94fc128 authored by hardy's avatar hardy

Merge remote-tracking branch 'origin/NR_RA_updates' into integration_2020_wk42

parents 639d957e 62dbda5c
...@@ -367,12 +367,18 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP, ...@@ -367,12 +367,18 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
NR_RA_t *ra = &RC.nrmac[Mod_idP]->common_channels[CC_id].ra[0]; NR_RA_t *ra = &RC.nrmac[Mod_idP]->common_channels[CC_id].ra[0];
ra->state = RA_IDLE; ra->state = RA_IDLE;
ra->secondaryCellGroup = secondaryCellGroup; ra->secondaryCellGroup = secondaryCellGroup;
ra->crnti = rnti; if (secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated!=NULL) {
uint8_t num_preamble = secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list.count; if (secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra != NULL) {
ra->preambles.num_preambles = num_preamble; ra->cfra = true;
ra->preambles.preamble_list = (uint8_t *) malloc(num_preamble*sizeof(uint8_t)); ra->rnti = rnti;
for (int i = 0; i < num_preamble; i++) struct NR_CFRA cfra = *secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra;
ra->preambles.preamble_list[i] = secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list.array[i]->ra_PreambleIndex; uint8_t num_preamble = cfra.resources.choice.ssb->ssb_ResourceList.list.count;
ra->preambles.num_preambles = num_preamble;
ra->preambles.preamble_list = (uint8_t *) malloc(num_preamble*sizeof(uint8_t));
for (int i = 0; i < num_preamble; i++)
ra->preambles.preamble_list[i] = cfra.resources.choice.ssb->ssb_ResourceList.list.array[i]->ra_PreambleIndex;
}
}
LOG_I(PHY,"Added new RA process for UE RNTI %04x with initial secondaryCellGroup\n", rnti); LOG_I(PHY,"Added new RA process for UE RNTI %04x with initial secondaryCellGroup\n", rnti);
} else { // secondaryCellGroup has been updated } else { // secondaryCellGroup has been updated
const int UE_id = find_nr_UE_id(Mod_idP,rnti); const int UE_id = find_nr_UE_id(Mod_idP,rnti);
......
...@@ -308,16 +308,17 @@ void nr_initiate_ra_proc(module_id_t module_idP, ...@@ -308,16 +308,17 @@ void nr_initiate_ra_proc(module_id_t module_idP,
LOG_D(MAC, "%s() Msg2[%04d%d] SFN/SF:%04d%d\n", __FUNCTION__, ra->Msg2_frame, ra->Msg2_slot, frameP, slotP); LOG_D(MAC, "%s() Msg2[%04d%d] SFN/SF:%04d%d\n", __FUNCTION__, ra->Msg2_frame, ra->Msg2_slot, frameP, slotP);
do { if (!ra->cfra) {
ra->rnti = (taus() % 65518) + 1; do {
loop++; ra->rnti = (taus() % 65518) + 1;
} loop++;
while (loop != 100 && !(find_nr_UE_id(module_idP, ra->rnti) == -1 && ra->rnti >= 1 && ra->rnti <= 65519)); }
if (loop == 100) { while (loop != 100 && !(find_nr_UE_id(module_idP, ra->rnti) == -1 && ra->rnti >= 1 && ra->rnti <= 65519));
LOG_E(MAC,"%s:%d:%s: [RAPROC] initialisation random access aborted\n", __FILE__, __LINE__, __FUNCTION__); if (loop == 100) {
abort(); LOG_E(MAC,"%s:%d:%s: [RAPROC] initialisation random access aborted\n", __FILE__, __LINE__, __FUNCTION__);
abort();
}
} }
ra->RA_rnti = ra_rnti; ra->RA_rnti = ra_rnti;
ra->preamble_index = preamble_index; ra->preamble_index = preamble_index;
......
...@@ -864,7 +864,8 @@ void schedule_fapi_ul_pdu(int Mod_idP, ...@@ -864,7 +864,8 @@ void schedule_fapi_ul_pdu(int Mod_idP,
* conditions might exclude each other and never be true */ * conditions might exclude each other and never be true */
const int slot_idx = (slotP + K2) % num_slots_per_tdd; const int slot_idx = (slotP + K2) % num_slots_per_tdd;
if (is_xlsch_in_slot(ulsch_in_slot_bitmap, slot_idx) if (is_xlsch_in_slot(ulsch_in_slot_bitmap, slot_idx)
&& (!get_softmodem_params()->phy_test || slot_idx == 8)) { && (!get_softmodem_params()->phy_test || slot_idx == 8)) {
nfapi_nr_ul_dci_request_t *UL_dci_req = &RC.nrmac[Mod_idP]->UL_dci_req[0]; nfapi_nr_ul_dci_request_t *UL_dci_req = &RC.nrmac[Mod_idP]->UL_dci_req[0];
UL_dci_req->SFN = frameP; UL_dci_req->SFN = frameP;
UL_dci_req->Slot = slotP; UL_dci_req->Slot = slotP;
......
...@@ -1684,6 +1684,7 @@ void mac_remove_nr_ue(module_id_t mod_id, rnti_t rnti) ...@@ -1684,6 +1684,7 @@ void mac_remove_nr_ue(module_id_t mod_id, rnti_t rnti)
NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info; NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info;
for (i = 0; i < MAX_MOBILES_PER_GNB; i++) { for (i = 0; i < MAX_MOBILES_PER_GNB; i++) {
if (UE_info->active[i] != TRUE) if (UE_info->active[i] != TRUE)
continue; continue;
if (UE_info->rnti[i] != rnti) if (UE_info->rnti[i] != rnti)
......
...@@ -322,6 +322,41 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, ...@@ -322,6 +322,41 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
UE_info = &gNB_mac->UE_info; UE_info = &gNB_mac->UE_info;
int target_snrx10 = gNB_mac->pusch_target_snrx10; int target_snrx10 = gNB_mac->pusch_target_snrx10;
NR_RA_t *ra = &gNB_mac->common_channels[CC_idP].ra[0];
// random access pusch with TC-RNTI
if (ra->state == WAIT_Msg3) {
if (sduP != NULL) { // if the CRC passed
if (ra->rnti != current_rnti) {
LOG_E(MAC,
"expected TC-RNTI %04x to match current RNTI %04x\n",
ra->rnti,
current_rnti);
return;
}
free(ra->preambles.preamble_list);
ra->state = RA_IDLE;
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->rnti);
UE_info->secondaryCellGroup[UE_id] = ra->secondaryCellGroup;
struct NR_ServingCellConfig__downlinkBWP_ToAddModList *bwpList = ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList;
AssertFatal(bwpList->list.count == 1,
"downlinkBWP_ToAddModList has %d BWP!\n",
bwpList->list.count);
const int bwp_id = 1;
UE_info->UE_sched_ctrl[UE_id].active_bwp = bwpList->list.array[bwp_id - 1];
LOG_I(MAC,
"[gNB %d][RAPROC] PUSCH with TC_RNTI %x received correctly, "
"adding UE MAC Context UE_id %d/RNTI %04x\n",
gnb_mod_idP,
current_rnti,
UE_id,
ra->rnti);
}
return;
}
if (UE_id != -1) { if (UE_id != -1) {
UE_scheduling_control = &(UE_info->UE_sched_ctrl[UE_id]); UE_scheduling_control = &(UE_info->UE_sched_ctrl[UE_id]);
...@@ -366,44 +401,5 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, ...@@ -366,44 +401,5 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
} }
} }
else if (sduP != NULL) { // if the CRC passed
// random access pusch with TC-RNTI
NR_RA_t *ra = &gNB_mac->common_channels[CC_idP].ra[0];
if (ra->state != WAIT_Msg3) {
LOG_E(MAC,
"expected RA state WAIT_Msg3/%d (but is %d) for RA-RNTI %04x\n",
WAIT_Msg3,
ra->state,
ra->rnti);
return;
}
if (ra->rnti != current_rnti) {
LOG_E(MAC,
"expected RA-RNTI %04x (C-RNTI %04x) to match current RNTI %04x\n",
ra->rnti,
ra->crnti,
current_rnti);
return;
}
free(ra->preambles.preamble_list);
ra->state = RA_IDLE;
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);
UE_info->secondaryCellGroup[UE_id] = ra->secondaryCellGroup;
struct NR_ServingCellConfig__downlinkBWP_ToAddModList *bwpList =
ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList;
AssertFatal(bwpList->list.count == 1,
"downlinkBWP_ToAddModList has %d BWP!\n",
bwpList->list.count);
const int bwp_id = 1;
UE_info->UE_sched_ctrl[UE_id].active_bwp = bwpList->list.array[bwp_id - 1];
LOG_W(MAC,
"[gNB %d][RAPROC] PUSCH with TC_RNTI %x received correctly, "
"adding UE MAC Context UE_id %d/RNTI %04x\n",
gnb_mod_idP,
current_rnti,
UE_id,
ra->crnti);
}
} }
...@@ -152,6 +152,8 @@ typedef struct { ...@@ -152,6 +152,8 @@ typedef struct {
NR_preamble_ue_t preambles; NR_preamble_ue_t preambles;
/// NSA: the UEs C-RNTI to use /// NSA: the UEs C-RNTI to use
rnti_t crnti; rnti_t crnti;
/// CFRA flag
bool cfra;
} NR_RA_t; } NR_RA_t;
/*! \brief gNB common channels */ /*! \brief gNB common channels */
......
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