Fix handle_nr_ul_harq() for CFRA in SA
This commit is contained in:
@@ -478,14 +478,29 @@ void abort_nr_ul_harq(NR_UE_info_t *UE, int8_t harq_pid)
|
|||||||
sched_ctrl->sched_ul_bytes = 0;
|
sched_ctrl->sched_ul_bytes = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool get_UE_waiting_CFRA_msg3(const gNB_MAC_INST *gNB_mac, const int CC_id, const frame_t frame, const sub_frame_t slot)
|
||||||
|
{
|
||||||
|
bool UE_waiting_CFRA_msg3 = false;
|
||||||
|
for (int i = 0; i < NR_NB_RA_PROC_MAX; i++) {
|
||||||
|
const NR_RA_t *ra = &gNB_mac->common_channels[CC_id].ra[i];
|
||||||
|
if (ra->cfra == true && ra->state == WAIT_Msg3 && frame == ra->Msg3_frame && slot == ra->Msg3_slot) {
|
||||||
|
UE_waiting_CFRA_msg3 = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return UE_waiting_CFRA_msg3;
|
||||||
|
}
|
||||||
|
|
||||||
void handle_nr_ul_harq(const int CC_idP,
|
void handle_nr_ul_harq(const int CC_idP,
|
||||||
module_id_t mod_id,
|
module_id_t mod_id,
|
||||||
frame_t frame,
|
frame_t frame,
|
||||||
sub_frame_t slot,
|
sub_frame_t slot,
|
||||||
const nfapi_nr_crc_t *crc_pdu)
|
const nfapi_nr_crc_t *crc_pdu)
|
||||||
{
|
{
|
||||||
NR_UE_info_t* UE = find_nr_UE(&RC.nrmac[mod_id]->UE_info, crc_pdu->rnti);
|
NR_UE_info_t *UE = find_nr_UE(&RC.nrmac[mod_id]->UE_info, crc_pdu->rnti);
|
||||||
if (!UE) {
|
bool UE_waiting_CFRA_msg3 = get_UE_waiting_CFRA_msg3(RC.nrmac[mod_id], CC_idP, frame, slot);
|
||||||
|
|
||||||
|
if (!UE || UE_waiting_CFRA_msg3 == true) {
|
||||||
LOG_W(NR_MAC, "handle harq for rnti %04x, in RA process\n", crc_pdu->rnti);
|
LOG_W(NR_MAC, "handle harq for rnti %04x, in RA process\n", crc_pdu->rnti);
|
||||||
for (int i = 0; i < NR_NB_RA_PROC_MAX; ++i) {
|
for (int i = 0; i < NR_NB_RA_PROC_MAX; ++i) {
|
||||||
NR_RA_t *ra = &RC.nrmac[mod_id]->common_channels[CC_idP].ra[i];
|
NR_RA_t *ra = &RC.nrmac[mod_id]->common_channels[CC_idP].ra[i];
|
||||||
@@ -569,8 +584,11 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
|
|||||||
const int target_snrx10 = gNB_mac->pusch_target_snrx10;
|
const int target_snrx10 = gNB_mac->pusch_target_snrx10;
|
||||||
const int pusch_failure_thres = gNB_mac->pusch_failure_thres;
|
const int pusch_failure_thres = gNB_mac->pusch_failure_thres;
|
||||||
|
|
||||||
NR_UE_info_t* UE = find_nr_UE(&gNB_mac->UE_info, current_rnti);
|
NR_UE_info_t *UE = find_nr_UE(&gNB_mac->UE_info, current_rnti);
|
||||||
if (UE) {
|
bool UE_waiting_CFRA_msg3 = get_UE_waiting_CFRA_msg3(gNB_mac, CC_idP, frameP, slotP);
|
||||||
|
|
||||||
|
if (UE && UE_waiting_CFRA_msg3 == false) {
|
||||||
|
|
||||||
NR_UE_sched_ctrl_t *UE_scheduling_control = &UE->UE_sched_ctrl;
|
NR_UE_sched_ctrl_t *UE_scheduling_control = &UE->UE_sched_ctrl;
|
||||||
const int8_t harq_pid = UE_scheduling_control->feedback_ul_harq.head;
|
const int8_t harq_pid = UE_scheduling_control->feedback_ul_harq.head;
|
||||||
|
|
||||||
@@ -700,18 +718,19 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
NR_UE_info_t *UE = add_new_nr_ue(gNB_mac, ra->rnti, ra->CellGroup);
|
NR_UE_info_t *UE_msg3_stage = UE ? UE : add_new_nr_ue(gNB_mac, ra->rnti, ra->CellGroup);
|
||||||
if (!UE) {
|
if (!UE_msg3_stage) {
|
||||||
LOG_W(NR_MAC, "Random Access %i discarded at state %i (TC_RNTI %04x RNTI %04x): max number of users achieved!\n", i, ra->state,ra->rnti,current_rnti);
|
LOG_W(NR_MAC, "Random Access %i discarded at state %i (TC_RNTI %04x RNTI %04x): max number of users achieved!\n", i, ra->state, ra->rnti, current_rnti);
|
||||||
|
|
||||||
nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
|
nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
|
||||||
nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
|
nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
UE->UE_beam_index = ra->beam_id;
|
UE_msg3_stage->UE_beam_index = ra->beam_id;
|
||||||
|
|
||||||
// re-initialize ta update variables after RA procedure completion
|
// re-initialize ta update variables after RA procedure completion
|
||||||
UE->UE_sched_ctrl.ta_frame = frameP;
|
UE_msg3_stage->UE_sched_ctrl.ta_frame = frameP;
|
||||||
|
|
||||||
LOG_D(NR_MAC,
|
LOG_D(NR_MAC,
|
||||||
"reset RA state information for RA-RNTI 0x%04x/index %d\n",
|
"reset RA state information for RA-RNTI 0x%04x/index %d\n",
|
||||||
@@ -725,18 +744,22 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
|
|||||||
current_rnti,
|
current_rnti,
|
||||||
ra->rnti);
|
ra->rnti);
|
||||||
|
|
||||||
NR_UE_sched_ctrl_t *UE_scheduling_control = &UE->UE_sched_ctrl;
|
NR_UE_sched_ctrl_t *UE_scheduling_control = &UE_msg3_stage->UE_sched_ctrl;
|
||||||
|
|
||||||
UE_scheduling_control->tpc0 = nr_get_tpc(target_snrx10,ul_cqi,30);
|
UE_scheduling_control->tpc0 = nr_get_tpc(target_snrx10, ul_cqi, 30);
|
||||||
if (timing_advance != 0xffff)
|
if (timing_advance != 0xffff)
|
||||||
UE_scheduling_control->ta_update = timing_advance;
|
UE_scheduling_control->ta_update = timing_advance;
|
||||||
UE_scheduling_control->raw_rssi = rssi;
|
UE_scheduling_control->raw_rssi = rssi;
|
||||||
UE_scheduling_control->pusch_snrx10 = ul_cqi * 5 - 640;
|
UE_scheduling_control->pusch_snrx10 = ul_cqi * 5 - 640;
|
||||||
LOG_D(NR_MAC, "[UE %04x] PUSCH TPC %d and TA %d\n",UE->rnti,UE_scheduling_control->tpc0,UE_scheduling_control->ta_update);
|
LOG_D(NR_MAC, "[UE %04x] PUSCH TPC %d and TA %d\n", UE_msg3_stage->rnti, UE_scheduling_control->tpc0, UE_scheduling_control->ta_update);
|
||||||
if(ra->cfra) {
|
if (ra->cfra) {
|
||||||
|
|
||||||
LOG_A(NR_MAC, "(rnti 0x%04x) CFRA procedure succeeded!\n", ra->rnti);
|
LOG_A(NR_MAC, "(rnti 0x%04x) CFRA procedure succeeded!\n", ra->rnti);
|
||||||
UE->ra_timer = 0;
|
nr_mac_gNB_rrc_ul_failure_reset(gnb_mod_idP, frameP, slotP, ra->rnti);
|
||||||
|
reset_dl_harq_list(UE_scheduling_control);
|
||||||
|
reset_ul_harq_list(UE_scheduling_control);
|
||||||
|
UE_scheduling_control->pusch_consecutive_dtx_cnt = 0;
|
||||||
|
UE_scheduling_control->ul_failure = 0;
|
||||||
|
UE_msg3_stage->ra_timer = 0;
|
||||||
nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
|
nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
|
||||||
nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
|
nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
|
||||||
process_CellGroup(ra->CellGroup, UE_scheduling_control);
|
process_CellGroup(ra->CellGroup, UE_scheduling_control);
|
||||||
@@ -755,7 +778,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
|
|||||||
memcpy(ra->cont_res_id, &sduP[1], sizeof(uint8_t) * 6);
|
memcpy(ra->cont_res_id, &sduP[1], sizeof(uint8_t) * 6);
|
||||||
// harq_pid set a non valid value because it is not used in this call
|
// harq_pid set a non valid value because it is not used in this call
|
||||||
// the function is only called to decode the contention resolution sub-header
|
// the function is only called to decode the contention resolution sub-header
|
||||||
if (nr_process_mac_pdu(gnb_mod_idP, UE, CC_idP, frameP, slotP, sduP, sdu_lenP, -1) == 0) {
|
if (nr_process_mac_pdu(gnb_mod_idP, UE_msg3_stage, CC_idP, frameP, slotP, sduP, sdu_lenP, -1) == 0) {
|
||||||
|
|
||||||
if (ra->state == Msg3_dcch_dtch) {
|
if (ra->state == Msg3_dcch_dtch) {
|
||||||
// Check if the UE identified by C-RNTI still exists at the gNB
|
// Check if the UE identified by C-RNTI still exists at the gNB
|
||||||
|
|||||||
Reference in New Issue
Block a user