From f993b075f87c3d671ec489c65470502d4d5e010a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=BAben=20Soares=20da=20Silva?= Date: Tue, 7 Nov 2023 10:35:11 +0000 Subject: [PATCH] Change Prach PDU Beamforming allocation for pack/unpack procedures --- nfapi/open-nFAPI/nfapi/src/nfapi_p7.c | 43 ++++++++++++++------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c index 952e9c06f9..7a8d88c4d7 100644 --- a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c +++ b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c @@ -940,16 +940,19 @@ static uint8_t pack_ul_tti_request_prach_pdu(nfapi_nr_prach_pdu_t *prach_pdu, ui prach_pdu->beamforming.prg_size = 0; prach_pdu->beamforming.dig_bf_interface = 0; - if (prach_pdu->beamforming.prgs_list == NULL) { - prach_pdu->beamforming.prgs_list = calloc(prach_pdu->beamforming.num_prgs == 0 ? 1 : prach_pdu->beamforming.num_prgs, - sizeof(*prach_pdu->beamforming.prgs_list)); + if (prach_pdu->beamforming.prgs_list == NULL && prach_pdu->beamforming.num_prgs > 0) { + prach_pdu->beamforming.prgs_list = calloc(prach_pdu->beamforming.num_prgs, sizeof(*prach_pdu->beamforming.prgs_list)); + // If the first one is NULL, the other indexes, if existing, are most likely also NULL + if (prach_pdu->beamforming.prgs_list[0].dig_bf_interface_list == NULL && prach_pdu->beamforming.dig_bf_interface > 0) { + for (int prg_idx = 0; prg_idx < prach_pdu->beamforming.num_prgs; prg_idx++) { + prach_pdu->beamforming.prgs_list[prg_idx].dig_bf_interface_list = + calloc(prach_pdu->beamforming.dig_bf_interface, sizeof(*prach_pdu->beamforming.prgs_list[0].dig_bf_interface_list)); + for (int dbi_idx = 0; dbi_idx < prach_pdu->beamforming.dig_bf_interface; dbi_idx++) { + prach_pdu->beamforming.prgs_list[prg_idx].dig_bf_interface_list[dbi_idx].beam_idx = 0; + } + } + } } - if (prach_pdu->beamforming.prgs_list[0].dig_bf_interface_list == NULL) { - prach_pdu->beamforming.prgs_list[0].dig_bf_interface_list = - calloc(prach_pdu->beamforming.dig_bf_interface == 0 ? 1 : prach_pdu->beamforming.dig_bf_interface, - sizeof(*prach_pdu->beamforming.prgs_list[0].dig_bf_interface_list)); - } - prach_pdu->beamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx = 0; // Pack RX Beamforming PDU if (!(push16(prach_pdu->beamforming.num_prgs, ppWritePackedMsg, end) @@ -4771,22 +4774,22 @@ static uint8_t unpack_ul_tti_request_prach_pdu(void *tlv, uint8_t **ppReadPacked && pull8(ppReadPackedMsg, &prach_pdu->prach_start_symbol, end) && pull16(ppReadPackedMsg, &prach_pdu->num_cs, end))) { return 0; } - // TODO: ignoring beamforming tlv for now - if (prach_pdu->beamforming.prgs_list == NULL) { - prach_pdu->beamforming.prgs_list = calloc(prach_pdu->beamforming.num_prgs == 0 ? 1 : prach_pdu->beamforming.num_prgs, - sizeof(*prach_pdu->beamforming.prgs_list)); - } - if (prach_pdu->beamforming.prgs_list[0].dig_bf_interface_list == NULL) { - prach_pdu->beamforming.prgs_list[0].dig_bf_interface_list = - calloc(prach_pdu->beamforming.dig_bf_interface == 0 ? 1 : prach_pdu->beamforming.dig_bf_interface, - sizeof(*prach_pdu->beamforming.prgs_list[0].dig_bf_interface_list)); - } - // Pack RX Beamforming PDU + // Unpack RX Beamforming PDU if (!(pull16(ppReadPackedMsg, &prach_pdu->beamforming.num_prgs, end) && pull16(ppReadPackedMsg, &prach_pdu->beamforming.prg_size, end) && pull8(ppReadPackedMsg, &prach_pdu->beamforming.dig_bf_interface, end))) { return 0; } + // TODO: ignoring beamforming tlv for now + if (prach_pdu->beamforming.num_prgs > 0) { + prach_pdu->beamforming.prgs_list = calloc(prach_pdu->beamforming.num_prgs, sizeof(*prach_pdu->beamforming.prgs_list)); + if (prach_pdu->beamforming.dig_bf_interface > 0) { + for(int prg_idx = 0; prg_idx < prach_pdu->beamforming.num_prgs;prg_idx++){ + prach_pdu->beamforming.prgs_list[prg_idx].dig_bf_interface_list = + calloc(prach_pdu->beamforming.dig_bf_interface, sizeof(*prach_pdu->beamforming.prgs_list[0].dig_bf_interface_list)); + } + } + } for (int prg = 0; prg < prach_pdu->beamforming.num_prgs; prg++) { for (int digBFInterface = 0; digBFInterface < prach_pdu->beamforming.dig_bf_interface; digBFInterface++) { if (!pull16(ppReadPackedMsg, &prach_pdu->beamforming.prgs_list[prg].dig_bf_interface_list[digBFInterface].beam_idx, end)) {