From 923b2ec1880c12a7d592135609411b570da606df Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Fri, 28 Nov 2025 13:27:29 +0100 Subject: [PATCH] Correctly copy nFAPI messages All nFAPI message have copy helpers, so use that for "loading" nFAPI messages into the L1. This also fixes a bug/error message 2. 0 no corresponding tx_data.request for dl_tti.request index 11, dropping because the loop over DL_tti.request assumed that all messages are PDSCH PDUs, when we can have others such as PDCCH, etc. In other words, when looking up indices ("11" in the example above), we were checking also inside other messages for SSB, PDCCH, etc, which is of course wrong. That loop was an attempt to validate matching PDSCH PDUs with TX_data.requests. This check is already done inside phy_procedures_gNB_TX() through an assert, but this commit replaces with the equivalent check previously inside nr_pnf_p7_get_msgs(). This is ok, as the L1 cannot trust the scheduler (in monolithic) to provide the correct information, either. Fixes: eefb9da69a48 ("Reimplement nFAPI message exchange after msgDataTx removal") --- nfapi/open-nFAPI/pnf/src/pnf_p7.c | 43 ++++++----------------- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 22 ++++++++---- 2 files changed, 26 insertions(+), 39 deletions(-) diff --git a/nfapi/open-nFAPI/pnf/src/pnf_p7.c b/nfapi/open-nFAPI/pnf/src/pnf_p7.c index 197bac22b7..8b684261a7 100644 --- a/nfapi/open-nFAPI/pnf/src/pnf_p7.c +++ b/nfapi/open-nFAPI/pnf/src/pnf_p7.c @@ -728,34 +728,19 @@ int nr_pnf_p7_get_msgs(pnf_p7_t* pnf_p7, ret_dl_tti->SFN = sfn; ret_dl_tti->Slot = slot; ret_dl_tti->dl_tti_request_body.nPDUs = 0; + nfapi_nr_dl_tti_request_t* dl_tti_req = &tx_slot_buffer->dl_tti_req; + if (dl_tti_req->SFN == sfn && dl_tti_req->Slot == slot) { + copy_dl_tti_request(dl_tti_req, ret_dl_tti); + tx_slot_buffer->dl_tti_req.SFN = -1; + tx_slot_buffer->dl_tti_req.Slot = -1; + } + ret_tx_data->SFN = sfn; ret_tx_data->Slot = slot; ret_tx_data->Number_of_PDUs = 0; - nfapi_nr_dl_tti_request_t* dl_tti_req = &tx_slot_buffer->dl_tti_req; nfapi_nr_tx_data_request_t* txd = &tx_slot_buffer->tx_data_req; - if (dl_tti_req->SFN == sfn && dl_tti_req->Slot == slot && txd->SFN == sfn && txd->Slot == slot) { - nfapi_nr_dl_tti_request_body_t* p_tti = &dl_tti_req->dl_tti_request_body; - int ret_idx = 0; - for (int i = 0; i < p_tti->nPDUs; ++i) { - int tx_index = p_tti->dl_tti_pdu_list[i].pdsch_pdu.pdsch_pdu_rel15.pduIndex - 1; - if (tx_index >= txd->Number_of_PDUs) { - NFAPI_TRACE(NFAPI_TRACE_ERROR, - "%4d.%2d no corresponding tx_data.request for dl_tti.request index %d, dropping\n", - sfn, - slot, - tx_index); - continue; - } - ret_dl_tti->dl_tti_request_body.dl_tti_pdu_list[ret_idx] = p_tti->dl_tti_pdu_list[i]; - // TODO avoid huge copy - ret_tx_data->pdu_list[ret_idx] = txd->pdu_list[i]; - ret_idx++; - } - ret_dl_tti->dl_tti_request_body.nPDUs = ret_idx; - ret_tx_data->Number_of_PDUs = ret_idx; - - tx_slot_buffer->dl_tti_req.SFN = -1; - tx_slot_buffer->dl_tti_req.Slot = -1; + if (txd->SFN == sfn && txd->Slot == slot) { + copy_tx_data_request(txd, ret_tx_data); tx_slot_buffer->tx_data_req.SFN = -1; tx_slot_buffer->tx_data_req.Slot = -1; } @@ -764,10 +749,7 @@ int nr_pnf_p7_get_msgs(pnf_p7_t* pnf_p7, ret_ul_tti->Slot = slot; ret_ul_tti->n_pdus = 0; if (tx_slot_buffer->ul_tti_req.SFN == sfn && tx_slot_buffer->ul_tti_req.Slot == slot) { - nfapi_nr_ul_tti_request_t* p = &tx_slot_buffer->ul_tti_req; - ret_ul_tti->n_pdus = p->n_pdus; - for (int i = 0; i < p->n_pdus; ++i) - ret_ul_tti->pdus_list[i] = p->pdus_list[i]; + copy_ul_tti_request(&tx_slot_buffer->ul_tti_req, ret_ul_tti); tx_slot_buffer->ul_tti_req.SFN = -1; tx_slot_buffer->ul_tti_req.Slot = -1; } @@ -776,10 +758,7 @@ int nr_pnf_p7_get_msgs(pnf_p7_t* pnf_p7, ret_ul_dci->Slot = slot; ret_ul_dci->numPdus = 0; if (tx_slot_buffer->ul_dci_req.SFN == sfn && tx_slot_buffer->ul_dci_req.Slot == slot) { - nfapi_nr_ul_dci_request_t* p = &tx_slot_buffer->ul_dci_req; - ret_ul_dci->numPdus = p->numPdus; - for (int i = 0; i < p->numPdus; ++i) - ret_ul_dci->ul_dci_pdu_list[i] = p->ul_dci_pdu_list[i]; + copy_ul_dci_request(&tx_slot_buffer->ul_dci_req, ret_ul_dci); tx_slot_buffer->ul_dci_req.SFN = -1; tx_slot_buffer->ul_dci_req.Slot = -1; } diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index e9ff83cf40..6ea1a197e2 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -308,13 +308,21 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, break; case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE: { int tx_data_idx = dl_tti_pdu->pdsch_pdu.pdsch_pdu_rel15.pduIndex; - DevAssert(tx_data_idx < TX_req->Number_of_PDUs); - // reuse dlsch variables, as there are multiple very large memory - // buffers - gNB->dlsch[num_pdsch].pdsch_pdu = &dl_tti_pdu->pdsch_pdu; - gNB->dlsch[num_pdsch].pdu = (uint8_t *)TX_req->pdu_list[tx_data_idx].TLVs[0].value.direct; - DevAssert(num_pdsch < gNB->max_nb_pdsch); - num_pdsch++; + if (tx_data_idx < TX_req->Number_of_PDUs && TX_req->pdu_list[tx_data_idx].PDU_index == tx_data_idx) { + // reuse dlsch variables, as there are multiple very large memory + // buffers + gNB->dlsch[num_pdsch].pdsch_pdu = &dl_tti_pdu->pdsch_pdu; + gNB->dlsch[num_pdsch].pdu = (uint8_t *)TX_req->pdu_list[tx_data_idx].TLVs[0].value.direct; + DevAssert(num_pdsch < gNB->max_nb_pdsch); + num_pdsch++; + } else { + LOG_E(NR_PHY, + "%4d.%2d no corresponding tx_data.request for dl_tti.request index %d (out of %d)\n", + frame, + slot, + tx_data_idx, + TX_req->Number_of_PDUs); + } } break; } }