From 54cc2e0bb57d1536c439f18918f5f40a44435bd4 Mon Sep 17 00:00:00 2001 From: francescomani Date: Wed, 12 Jun 2024 08:45:37 +0200 Subject: [PATCH] preventing UE assertion on number of layers = 0 by rejecting TB earlier if that happens --- openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c | 13 +++++++------ openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 4 ++-- openair1/SCHED_NR_UE/fapi_nr_ue_l1.c | 12 ++++++++++-- openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c | 7 ++++++- 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c index f37a905ca2..b882828cd6 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c @@ -47,16 +47,17 @@ uint32_t nr_get_G(uint16_t nb_rb, return(G); } -uint32_t nr_get_E(uint32_t G, uint8_t C, uint8_t Qm, uint8_t Nl, uint8_t r) { +uint32_t nr_get_E(uint32_t G, uint8_t C, uint8_t Qm, uint8_t Nl, uint8_t r) +{ uint32_t E; uint8_t Cprime = C; //assume CBGTI not present - AssertFatal(Nl>0,"Nl is 0\n"); - AssertFatal(Qm>0,"Qm is 0\n"); - if (r <= Cprime - ((G/(Nl*Qm))%Cprime) - 1) - E = Nl*Qm*(G/(Nl*Qm*Cprime)); + AssertFatal(Nl > 0, "Nl is 0\n"); + AssertFatal(Qm > 0, "Qm is 0\n"); + if (r <= Cprime - ((G / (Nl * Qm)) % Cprime) - 1) + E = Nl * Qm * (G / (Nl * Qm * Cprime)); else - E = Nl*Qm*((G/(Nl*Qm*Cprime))+1); + E = Nl * Qm * ((G / (Nl * Qm * Cprime)) + 1); LOG_D(PHY,"nr_get_E : (G %d, C %d, Qm %d, Nl %d, r %d), E %d\n",G, C, Qm, Nl, r, E); return E; diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index ddb69bab23..1d842e5414 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -375,7 +375,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, &harq_process->F, decParams.BG); - if (harq_process->C>MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER*dlsch->Nl) { + if (harq_process->C > MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER * dlsch->Nl) { LOG_E(PHY, "nr_segmentation.c: too many segments %d, A %d\n", harq_process->C, A); return(-1); } @@ -392,7 +392,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, decParams.numMaxIter = dlsch->max_ldpc_iterations; decParams.outMode = 0; r_offset = 0; - uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER*dlsch->Nl; //number of segments to be allocated + uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER * dlsch->Nl; //number of segments to be allocated if (nb_rb != 273) { a_segments = a_segments*nb_rb; diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c index e47a3f6b7b..fbdd36dcb3 100644 --- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c +++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c @@ -298,7 +298,15 @@ static void configure_dlsch(NR_UE_DLSCH_t *dlsch0, //get nrOfLayers from DCI info uint8_t Nl = 0; for (int i = 0; i < 12; i++) { // max 12 ports - if ((dlsch_config_pdu->dmrs_ports>>i)&0x01) Nl += 1; + if ((dlsch_config_pdu->dmrs_ports >> i) & 0x01) + Nl += 1; + } + if (Nl == 0) { + LOG_E(PHY, "Invalid number of layers %d for DLSCH\n", Nl); + // setting NACK for this TB + dlsch0->active = false; + update_harq_status(mac, current_harq_pid, 0); + return; } dlsch0->Nl = Nl; if (dlsch_config_pdu->new_data_indicator) { @@ -456,7 +464,7 @@ static void nr_ue_scheduled_response_ul(PHY_VARS_NR_UE *phy, fapi_nr_ul_config_r NR_UL_UE_HARQ_t *harq_process_ul_ue = &phy->ul_harq_processes[current_harq_pid]; nfapi_nr_ue_pusch_pdu_t *pusch_pdu = &phy_data->ulsch.pusch_pdu; LOG_D(PHY, - "copy pusch_config_pdu nrOfLayers:%d, num_dmrs_cdm_grps_no_data:%d \n", + "copy pusch_config_pdu nrOfLayers: %d, num_dmrs_cdm_grps_no_data: %d\n", pdu->pusch_config_pdu.nrOfLayers, pdu->pusch_config_pdu.num_dmrs_cdm_grps_no_data); diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index 2b59755ef4..cb450c0d19 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -682,7 +682,12 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac, ul_layers_config(mac, pusch_config_pdu, dci, dci_format); ul_ports_config(mac, &dmrslength, pusch_config_pdu, dci, dci_format); } else { - LOG_E(NR_MAC, "In %s: UL grant from DCI format %d is not handled...\n", __FUNCTION__, dci_format); + LOG_E(NR_MAC, "UL grant from DCI format %d is not handled...\n", dci_format); + return -1; + } + + if (pusch_config_pdu->nrOfLayers < 1) { + LOG_E(NR_MAC, "Invalid UL number of layers %d from DCI\n", pusch_config_pdu->nrOfLayers); return -1; }