From 026b42aa1aa64f7a8eca8d6f713f49fef7324c12 Mon Sep 17 00:00:00 2001 From: francescomani Date: Sat, 15 Feb 2025 16:51:19 +0100 Subject: [PATCH] FeedbackDisabled is sent in RRCSetup, the UE doesn't have it during MSG4 reception, it can't be used the standard in 213 8.4 says: "In response to the PDSCH reception with the UE contention resolution identity, the UE transmits HARQ-ACK information in a PUCCH." --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 74 ++++++------------- 1 file changed, 23 insertions(+), 51 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 6e776b123a..f2fcd72c97 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -2148,6 +2148,16 @@ static void nr_generate_Msg4_MsgB(module_id_t module_idP, return; } + const int delta_PRI = 0; + int r_pucch = nr_get_pucch_resource(coreset, ra->UL_BWP.pucch_Config, CCEIndex); + LOG_D(NR_MAC, "Msg4 r_pucch %d (CCEIndex %d, delta_PRI %d)\n", r_pucch, CCEIndex, delta_PRI); + int alloc = nr_acknack_scheduling(nr_mac, UE, frameP, slotP, ra->beam_id, r_pucch, 1); + if (alloc < 0) { + LOG_D(NR_MAC,"Couldn't find a pucch allocation for ack nack (msg4) in frame %d slot %d\n", frameP, slotP); + reset_beam_status(&nr_mac->beam_info, frameP, slotP, ra->beam_id, n_slots_frame, beam.new_beam); + return; + } + // HARQ management if (current_harq_pid < 0) { AssertFatal(sched_ctrl->available_dl_harq.head >= 0, @@ -2156,39 +2166,16 @@ static void nr_generate_Msg4_MsgB(module_id_t module_idP, remove_front_nr_list(&sched_ctrl->available_dl_harq); } - const int delta_PRI = 0; - - int alloc = -1; - if (!get_FeedbackDisabled(UE->sc_info.downlinkHARQ_FeedbackDisabled_r17, current_harq_pid)) { - int r_pucch = nr_get_pucch_resource(coreset, ra->UL_BWP.pucch_Config, CCEIndex); - - LOG_D(NR_MAC, "Msg4 r_pucch %d (CCEIndex %d, delta_PRI %d)\n", r_pucch, CCEIndex, delta_PRI); - - alloc = nr_acknack_scheduling(nr_mac, UE, frameP, slotP, ra->beam_id, r_pucch, 1); - if (alloc < 0) { - LOG_D(NR_MAC,"Couldn't find a pucch allocation for ack nack (msg4) in frame %d slot %d\n", frameP, slotP); - reset_beam_status(&nr_mac->beam_info, frameP, slotP, ra->beam_id, n_slots_frame, beam.new_beam); - return; - } - } - NR_UE_harq_t *harq = &sched_ctrl->harq_processes[current_harq_pid]; - NR_sched_pucch_t *pucch = NULL; + NR_sched_pucch_t *pucch = &sched_ctrl->sched_pucch[alloc]; DevAssert(!harq->is_waiting); - if (alloc < 0) { - finish_nr_dl_harq(sched_ctrl, current_harq_pid); - } else { - pucch = &sched_ctrl->sched_pucch[alloc]; - add_tail_nr_list(&sched_ctrl->feedback_dl_harq, current_harq_pid); - harq->feedback_slot = pucch->ul_slot; - harq->feedback_frame = pucch->frame; - harq->is_waiting = true; - } + add_tail_nr_list(&sched_ctrl->feedback_dl_harq, current_harq_pid); + harq->feedback_slot = pucch->ul_slot; + harq->feedback_frame = pucch->frame; + harq->is_waiting = true; ra->harq_pid = current_harq_pid; UE->mac_stats.dl.rounds[harq->round]++; - harq->tb_size = tb_size; - uint8_t *buf = allocate_transportBlock_buffer(&harq->transportBlock, tb_size); // Bytes to be transmitted if (harq->round == 0) { @@ -2293,29 +2280,14 @@ static void nr_generate_Msg4_MsgB(module_id_t module_idP, vrb_map[BWPStart + rb + rbStart] |= SL_to_bitmap(msg4_tda.startSymbolIndex, msg4_tda.nrOfSymbols); } - if (pucch == NULL) { - LOG_A(NR_MAC, "(UE RNTI 0x%04x) Skipping Ack of RA-Msg4. CBRA procedure succeeded!\n", ra->rnti); - UE->Msg4_MsgB_ACKed = true; - - // Pause scheduling according to: - // 3GPP TS 38.331 Section 12 Table 12.1-1: UE performance requirements for RRC procedures for UEs - // Msg4 may transmit a RRCReconfiguration, for example when UE sends RRCReestablishmentComplete and MAC CE for C-RNTI in Msg3. - // In that case, gNB will generate a RRCReconfiguration that will be transmitted in Msg4, so we need to apply CellGroup after the Ack, - // UE->reconfigCellGroup was already set when processing RRCReestablishment message - int delay = nr_mac_get_reconfig_delay_slots(UE->current_UL_BWP.scs); - nr_mac_interrupt_ue_transmission(nr_mac, UE, UE->interrupt_action, delay); - - nr_clear_ra_proc(ra); - } else { - ra->ra_state = nrRA_WAIT_Msg4_MsgB_ACK; - LOG_I(NR_MAC, - "UE %04x Generate %s: feedback at %4d.%2d, payload %d bytes, next state nrRA_WAIT_Msg4_MsgB_ACK\n", - ra->rnti, - ra_type_str, - pucch->frame, - pucch->ul_slot, - harq->tb_size); - } + ra->ra_state = nrRA_WAIT_Msg4_MsgB_ACK; + LOG_I(NR_MAC, + "UE %04x Generate %s: feedback at %4d.%2d, payload %d bytes, next state nrRA_WAIT_Msg4_MsgB_ACK\n", + ra->rnti, + ra_type_str, + pucch->frame, + pucch->ul_slot, + harq->tb_size); } }