From b215a60a3b5b85b50643566597a62efe99e8d340 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=BAben=20Soares=20da=20Silva?= Date: Fri, 17 May 2024 13:56:42 +0100 Subject: [PATCH 1/7] Fix memory leak related to fapi_phy_api_msg fapi_msg --- nfapi/oai_integration/aerial/fapi_nvIPC.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/nfapi/oai_integration/aerial/fapi_nvIPC.c b/nfapi/oai_integration/aerial/fapi_nvIPC.c index e080e51031..dea1b4edb0 100644 --- a/nfapi/oai_integration/aerial/fapi_nvIPC.c +++ b/nfapi/oai_integration/aerial/fapi_nvIPC.c @@ -116,15 +116,15 @@ static int ipc_handle_rx_msg(nv_ipc_t *ipc, nv_ipc_msg_t *msg) // unpack FAPI messages and handle them if (vnf_config != 0) { // first, unpack the header - fapi_phy_api_msg *fapi_msg = calloc(1, sizeof(fapi_phy_api_msg)); - if (!(pull8(&pReadPackedMessage, &fapi_msg->num_msg, end) && pull8(&pReadPackedMessage, &fapi_msg->opaque_handle, end) - && pull16(&pReadPackedMessage, &fapi_msg->message_id, end) - && pull32(&pReadPackedMessage, &fapi_msg->message_length, end))) { + fapi_phy_api_msg fapi_msg; + if (!(pull8(&pReadPackedMessage, &fapi_msg.num_msg, end) && pull8(&pReadPackedMessage, &fapi_msg.opaque_handle, end) + && pull16(&pReadPackedMessage, &fapi_msg.message_id, end) + && pull32(&pReadPackedMessage, &fapi_msg.message_length, end))) { NFAPI_TRACE(NFAPI_TRACE_ERROR, "FAPI message header unpack failed\n"); return -1; } - switch (fapi_msg->message_id) { + switch (fapi_msg.message_id) { case NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE: if (vnf_config->nr_param_resp) { @@ -210,8 +210,8 @@ static int ipc_handle_rx_msg(nv_ipc_t *ipc, nv_ipc_msg_t *msg) case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION: { nfapi_nr_rx_data_indication_t ind; - ind.header.message_id = fapi_msg->message_id; - ind.header.message_length = fapi_msg->message_length; + ind.header.message_id = fapi_msg.message_id; + ind.header.message_length = fapi_msg.message_length; aerial_unpack_nr_rx_data_indication( &pReadPackedMessage, end, @@ -228,8 +228,8 @@ static int ipc_handle_rx_msg(nv_ipc_t *ipc, nv_ipc_msg_t *msg) case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION: { nfapi_nr_crc_indication_t crc_ind; - crc_ind.header.message_id = fapi_msg->message_id; - crc_ind.header.message_length = fapi_msg->message_length; + crc_ind.header.message_id = fapi_msg.message_id; + crc_ind.header.message_length = fapi_msg.message_length; aerial_unpack_nr_crc_indication(&pReadPackedMessage, end, &crc_ind, @@ -279,7 +279,7 @@ static int ipc_handle_rx_msg(nv_ipc_t *ipc, nv_ipc_msg_t *msg) } default: { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s P5 Unknown message ID %d\n", __FUNCTION__, fapi_msg->message_id); + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s P5 Unknown message ID %d\n", __FUNCTION__, fapi_msg.message_id); break; } From 8a8b38ae70d4dc59f08c01a57615ae100630eb79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=BAben=20Soares=20da=20Silva?= Date: Fri, 17 May 2024 13:57:37 +0100 Subject: [PATCH 2/7] Fix memory leak related to SLOT.response message --- nfapi/oai_integration/aerial/fapi_vnf_p5.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/nfapi/oai_integration/aerial/fapi_vnf_p5.c b/nfapi/oai_integration/aerial/fapi_vnf_p5.c index 57ef1ddc11..155d89f81f 100644 --- a/nfapi/oai_integration/aerial/fapi_vnf_p5.c +++ b/nfapi/oai_integration/aerial/fapi_vnf_p5.c @@ -752,11 +752,8 @@ int oai_fapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req) int oai_fapi_send_end_request(int cell, uint32_t frame, uint32_t slot){ nfapi_vnf_p7_config_t *p7_config = aerial_vnf.p7_vnfs[0].config; - nfapi_nr_slot_indication_scf_t *nr_slot_resp = CALLOC(1, sizeof(*nr_slot_resp)); - nr_slot_resp->header.message_id = 0x8F; - nr_slot_resp->sfn = frame; - nr_slot_resp->slot = slot; - int retval = fapi_nr_pack_and_send_p7_message((vnf_p7_t *)p7_config, &nr_slot_resp->header); + nfapi_nr_slot_indication_scf_t nr_slot_resp = {.header.message_id = 0x8F, .sfn = frame, .slot = slot}; + int retval = fapi_nr_pack_and_send_p7_message((vnf_p7_t *)p7_config, &nr_slot_resp.header); if (retval != 0) { LOG_E(PHY, "%s() Problem sending retval:%d\n", __FUNCTION__, retval); } From a516a632d4853040f955a6ad6f954c639c22a69f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=BAben=20Soares=20da=20Silva?= Date: Fri, 17 May 2024 13:58:21 +0100 Subject: [PATCH 3/7] Fix memory leak related to RX_DATA.indication message --- nfapi/oai_integration/aerial/fapi_nvIPC.c | 4 ++++ nfapi/oai_integration/aerial/fapi_vnf_p7.c | 6 +++--- openair2/NR_PHY_INTERFACE/NR_IF_Module.c | 3 +++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/nfapi/oai_integration/aerial/fapi_nvIPC.c b/nfapi/oai_integration/aerial/fapi_nvIPC.c index dea1b4edb0..062bb911fc 100644 --- a/nfapi/oai_integration/aerial/fapi_nvIPC.c +++ b/nfapi/oai_integration/aerial/fapi_nvIPC.c @@ -222,6 +222,10 @@ static int ipc_handle_rx_msg(nv_ipc_t *ipc, nv_ipc_msg_t *msg) NFAPI_TRACE(NFAPI_TRACE_INFO, "%s: Handling RX Indication\n", __FUNCTION__); if (((vnf_info *)vnf_config->user_data)->p7_vnfs->config->nr_rx_data_indication) { (((vnf_info *)vnf_config->user_data)->p7_vnfs->config->nr_rx_data_indication)(&ind); + for (int i = 0; i < ind.number_of_pdus; ++i) { + free(ind.pdu_list[i].pdu); + } + free(ind.pdu_list); } break; } diff --git a/nfapi/oai_integration/aerial/fapi_vnf_p7.c b/nfapi/oai_integration/aerial/fapi_vnf_p7.c index 1d85113956..605550740b 100644 --- a/nfapi/oai_integration/aerial/fapi_vnf_p7.c +++ b/nfapi/oai_integration/aerial/fapi_vnf_p7.c @@ -358,7 +358,8 @@ int aerial_phy_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind) rx_ind->pdu_list[j].ul_cqi = ind->pdu_list[j].ul_cqi; rx_ind->pdu_list[j].timing_advance = ind->pdu_list[j].timing_advance; rx_ind->pdu_list[j].rssi = ind->pdu_list[j].rssi; - rx_ind->pdu_list[j].pdu = ind->pdu_list[j].pdu; + rx_ind->pdu_list[j].pdu = calloc(rx_ind->pdu_list[j].pdu_length, sizeof(uint8_t)); + memcpy(rx_ind->pdu_list[j].pdu,ind->pdu_list[j].pdu,ind->pdu_list[j].pdu_length); LOG_D(NR_MAC, "(%d.%d) Handle %d for index %d, RNTI, %04x, HARQID %d\n", ind->sfn, @@ -920,8 +921,7 @@ static uint8_t aerial_unpack_nr_rx_data_indication_body(nfapi_nr_rx_data_pdu_t * } // Allocate space for the pdu to be unpacked later - uint32_t length = value->pdu_length; - value->pdu = nfapi_p7_allocate(sizeof(*value->pdu) * length, config); + value->pdu = nfapi_p7_allocate(sizeof(*value->pdu) * value->pdu_length, config); return 1; } diff --git a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c index a2d508531c..869c0f9882 100644 --- a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c @@ -267,6 +267,9 @@ static void free_unqueued_nfapi_indications(nfapi_nr_rach_indication_t *rach_ind } if (rx_ind && rx_ind->number_of_pdus > 0) { + for (int i = 0; i < rx_ind->number_of_pdus; ++i) { + free_and_zero(rx_ind->pdu_list[i].pdu); + } free_and_zero(rx_ind->pdu_list); free_and_zero(rx_ind); } From 48ed7fba0dc47d0d4ca93852515ff3c848225dd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=BAben=20Soares=20da=20Silva?= Date: Fri, 17 May 2024 16:18:47 +0100 Subject: [PATCH 4/7] Fix memory leak related to CRC.indication and RACH.indication --- nfapi/oai_integration/aerial/fapi_nvIPC.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nfapi/oai_integration/aerial/fapi_nvIPC.c b/nfapi/oai_integration/aerial/fapi_nvIPC.c index 062bb911fc..020b91aba1 100644 --- a/nfapi/oai_integration/aerial/fapi_nvIPC.c +++ b/nfapi/oai_integration/aerial/fapi_nvIPC.c @@ -240,6 +240,7 @@ static int ipc_handle_rx_msg(nv_ipc_t *ipc, nv_ipc_msg_t *msg) &((vnf_p7_t *)((vnf_info *)vnf_config->user_data)->p7_vnfs->config)->_public.codec_config); if (((vnf_info *)vnf_config->user_data)->p7_vnfs->config->nr_crc_indication) { (((vnf_info *)vnf_config->user_data)->p7_vnfs->config->nr_crc_indication)(&crc_ind); + free(crc_ind.crc_list); } break; } @@ -278,6 +279,7 @@ static int ipc_handle_rx_msg(nv_ipc_t *ipc, nv_ipc_msg_t *msg) &((vnf_p7_t *)((vnf_info *)vnf_config->user_data)->p7_vnfs->config)->_public.codec_config); if (((vnf_info *)vnf_config->user_data)->p7_vnfs->config->nr_rach_indication) { (((vnf_info *)vnf_config->user_data)->p7_vnfs->config->nr_rach_indication)(&ind); + free(ind.pdu_list); } break; } From f6a039f38b864ae31102e437d102afa0c9ee675e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=BAben=20Soares=20da=20Silva?= Date: Fri, 17 May 2024 16:20:19 +0100 Subject: [PATCH 5/7] Fix memory leak related to UCI.indication and RACH.indication --- nfapi/oai_integration/aerial/fapi_nvIPC.c | 18 ++++++++++++++++++ nfapi/oai_integration/aerial/fapi_vnf_p7.c | 6 +++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/nfapi/oai_integration/aerial/fapi_nvIPC.c b/nfapi/oai_integration/aerial/fapi_nvIPC.c index 020b91aba1..de6aae93dc 100644 --- a/nfapi/oai_integration/aerial/fapi_nvIPC.c +++ b/nfapi/oai_integration/aerial/fapi_nvIPC.c @@ -254,6 +254,24 @@ static int ipc_handle_rx_msg(nv_ipc_t *ipc, nv_ipc_msg_t *msg) if (((vnf_info *)vnf_config->user_data)->p7_vnfs->config->nr_uci_indication) { (((vnf_info *)vnf_config->user_data)->p7_vnfs->config->nr_uci_indication)(&ind); + for (int i = 0; i < ind.num_ucis; i++) { + if (ind.uci_list[i].pdu_type == NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE) { + if (ind.uci_list[i].pucch_pdu_format_2_3_4.sr.sr_payload) { + free(ind.uci_list[i].pucch_pdu_format_2_3_4.sr.sr_payload); + } + if(ind.uci_list[i].pucch_pdu_format_2_3_4.harq.harq_payload){ + free(ind.uci_list[i].pucch_pdu_format_2_3_4.harq.harq_payload); + } + if(ind.uci_list[i].pucch_pdu_format_2_3_4.csi_part1.csi_part1_payload){ + free(ind.uci_list[i].pucch_pdu_format_2_3_4.csi_part1.csi_part1_payload); + } + if(ind.uci_list[i].pucch_pdu_format_2_3_4.csi_part2.csi_part2_payload){ + free(ind.uci_list[i].pucch_pdu_format_2_3_4.csi_part2.csi_part2_payload); + } + } + } + free(ind.uci_list); + ind.uci_list = NULL; } break; diff --git a/nfapi/oai_integration/aerial/fapi_vnf_p7.c b/nfapi/oai_integration/aerial/fapi_vnf_p7.c index 605550740b..b223cfc6ae 100644 --- a/nfapi/oai_integration/aerial/fapi_vnf_p7.c +++ b/nfapi/oai_integration/aerial/fapi_vnf_p7.c @@ -473,19 +473,19 @@ int aerial_phy_nr_uci_indication(nfapi_nr_uci_indication_t *ind) uci_ind_pdu->sr.sr_payload = CALLOC(1, sizeof(*uci_ind_pdu->sr.sr_payload)); AssertFatal(uci_ind_pdu->sr.sr_payload != NULL, "Memory not allocated for uci_ind_pdu->sr.sr_payload in phy_nr_uci_indication."); - *uci_ind_pdu->sr.sr_payload = *ind_pdu->sr.sr_payload; + memcpy(uci_ind_pdu->sr.sr_payload,ind_pdu->sr.sr_payload,sizeof(*uci_ind_pdu->sr.sr_payload)); } if (ind_pdu->csi_part1.csi_part1_payload) { uci_ind_pdu->csi_part1.csi_part1_payload = CALLOC(1, sizeof(*uci_ind_pdu->csi_part1.csi_part1_payload)); AssertFatal(uci_ind_pdu->csi_part1.csi_part1_payload != NULL, "Memory not allocated for uci_ind_pdu->csi_part1.csi_part1_payload in phy_nr_uci_indication."); - *uci_ind_pdu->csi_part1.csi_part1_payload = *ind_pdu->csi_part1.csi_part1_payload; + memcpy(uci_ind_pdu->csi_part1.csi_part1_payload,ind_pdu->csi_part1.csi_part1_payload,sizeof(*uci_ind_pdu->csi_part1.csi_part1_payload)); } if (ind_pdu->csi_part2.csi_part2_payload) { uci_ind_pdu->csi_part2.csi_part2_payload = CALLOC(1, sizeof(*uci_ind_pdu->csi_part2.csi_part2_payload)); AssertFatal(uci_ind_pdu->csi_part2.csi_part2_payload != NULL, "Memory not allocated for uci_ind_pdu->csi_part2.csi_part2_payload in phy_nr_uci_indication."); - *uci_ind_pdu->csi_part2.csi_part2_payload = *ind_pdu->csi_part2.csi_part2_payload; + memcpy(uci_ind_pdu->csi_part2.csi_part2_payload,ind_pdu->csi_part2.csi_part2_payload,sizeof(*uci_ind_pdu->csi_part2.csi_part2_payload)); } break; } From d27d19333957e57ea2a0c2573d944f43a7485244 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=BAben=20Soares=20da=20Silva?= Date: Fri, 24 May 2024 14:36:42 +0100 Subject: [PATCH 6/7] Fix P5 messages memory leaks ( CONFIG.request / CONFIG.response ) --- nfapi/oai_integration/aerial/fapi_vnf_p5.c | 4 +--- nfapi/open-nFAPI/vnf/src/vnf.c | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/nfapi/oai_integration/aerial/fapi_vnf_p5.c b/nfapi/oai_integration/aerial/fapi_vnf_p5.c index 155d89f81f..e3af58537f 100644 --- a/nfapi/oai_integration/aerial/fapi_vnf_p5.c +++ b/nfapi/oai_integration/aerial/fapi_vnf_p5.c @@ -351,12 +351,10 @@ int aerial_nr_send_config_request(nfapi_vnf_config_t *config, int p5_idx) nfapi_p4_p5_message_header_t *msg = &req->header; uint16_t msg_len = sizeof(nfapi_nr_config_request_scf_t); - nfapi_p4_p5_message_header_t *msgFAPI = calloc(1, msg_len); - memcpy(msgFAPI, &req->header, msg_len); uint8_t tx_messagebufferFAPI[sizeof(_this->tx_message_buffer)]; int packedMessageLengthFAPI = -1; packedMessageLengthFAPI = - fapi_nr_p5_message_pack(msgFAPI, msg_len, tx_messagebufferFAPI, sizeof(tx_messagebufferFAPI), &_this->_public.codec_config); + fapi_nr_p5_message_pack(msg, msg_len, tx_messagebufferFAPI, sizeof(tx_messagebufferFAPI), &_this->_public.codec_config); aerial_send_P5_msg(tx_messagebufferFAPI, packedMessageLengthFAPI, msg); diff --git a/nfapi/open-nFAPI/vnf/src/vnf.c b/nfapi/open-nFAPI/vnf/src/vnf.c index 44683d752a..6a769acd77 100644 --- a/nfapi/open-nFAPI/vnf/src/vnf.c +++ b/nfapi/open-nFAPI/vnf/src/vnf.c @@ -1529,13 +1529,11 @@ int vnf_nr_pack_and_send_p5_message(vnf_t* vnf, uint16_t p5_idx, nfapi_p4_p5_mes #ifdef ENABLE_AERIAL // In case it is a FAPI message, create 2 messages, one with nFAPI header for OAI PNF and one with no nFAPI header for Aerial // L1 - nfapi_p4_p5_message_header_t *msgFAPI = calloc(1, msg_len); - memcpy(msgFAPI, msg, msg_len); // create FAPI tx_buffer uint8_t tx_messagebufferFAPI[sizeof(vnf->tx_message_buffer)]; int packedMessageLengthFAPI = -1; packedMessageLengthFAPI = - fapi_nr_p5_message_pack(msgFAPI, msg_len, tx_messagebufferFAPI, sizeof(tx_messagebufferFAPI), &vnf->_public.codec_config); + fapi_nr_p5_message_pack(msg, msg_len, tx_messagebufferFAPI, sizeof(tx_messagebufferFAPI), &vnf->_public.codec_config); return aerial_send_P5_msg(tx_messagebufferFAPI, packedMessageLengthFAPI, msg); #else return 0; From dd931819517d3f79bd8be7b1e1d58e850447e584 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=BAben=20Soares=20da=20Silva?= Date: Fri, 24 May 2024 14:44:44 +0100 Subject: [PATCH 7/7] Replace unneeded memcpy for sr_payload Set appropriate length for csi payload calloc and memcpy, according to bit_len --- nfapi/oai_integration/aerial/fapi_vnf_p7.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/nfapi/oai_integration/aerial/fapi_vnf_p7.c b/nfapi/oai_integration/aerial/fapi_vnf_p7.c index b223cfc6ae..35d63515ed 100644 --- a/nfapi/oai_integration/aerial/fapi_vnf_p7.c +++ b/nfapi/oai_integration/aerial/fapi_vnf_p7.c @@ -473,19 +473,22 @@ int aerial_phy_nr_uci_indication(nfapi_nr_uci_indication_t *ind) uci_ind_pdu->sr.sr_payload = CALLOC(1, sizeof(*uci_ind_pdu->sr.sr_payload)); AssertFatal(uci_ind_pdu->sr.sr_payload != NULL, "Memory not allocated for uci_ind_pdu->sr.sr_payload in phy_nr_uci_indication."); - memcpy(uci_ind_pdu->sr.sr_payload,ind_pdu->sr.sr_payload,sizeof(*uci_ind_pdu->sr.sr_payload)); + //SCF222.10.02 sr_bit_len values from 1 to 8, payload always just one byte + uci_ind_pdu->sr.sr_payload[0] = ind_pdu->sr.sr_payload[0]; } if (ind_pdu->csi_part1.csi_part1_payload) { - uci_ind_pdu->csi_part1.csi_part1_payload = CALLOC(1, sizeof(*uci_ind_pdu->csi_part1.csi_part1_payload)); + uint8_t byte_len = (ind_pdu->csi_part1.csi_part1_bit_len / 8) + 1; + uci_ind_pdu->csi_part1.csi_part1_payload = calloc(byte_len, sizeof(uint8_t)); AssertFatal(uci_ind_pdu->csi_part1.csi_part1_payload != NULL, "Memory not allocated for uci_ind_pdu->csi_part1.csi_part1_payload in phy_nr_uci_indication."); - memcpy(uci_ind_pdu->csi_part1.csi_part1_payload,ind_pdu->csi_part1.csi_part1_payload,sizeof(*uci_ind_pdu->csi_part1.csi_part1_payload)); + memcpy(uci_ind_pdu->csi_part1.csi_part1_payload,ind_pdu->csi_part1.csi_part1_payload,byte_len); } if (ind_pdu->csi_part2.csi_part2_payload) { - uci_ind_pdu->csi_part2.csi_part2_payload = CALLOC(1, sizeof(*uci_ind_pdu->csi_part2.csi_part2_payload)); + uint8_t byte_len = (ind_pdu->csi_part2.csi_part2_bit_len / 8) + 1; + uci_ind_pdu->csi_part2.csi_part2_payload = calloc(byte_len, sizeof(uint8_t)); AssertFatal(uci_ind_pdu->csi_part2.csi_part2_payload != NULL, "Memory not allocated for uci_ind_pdu->csi_part2.csi_part2_payload in phy_nr_uci_indication."); - memcpy(uci_ind_pdu->csi_part2.csi_part2_payload,ind_pdu->csi_part2.csi_part2_payload,sizeof(*uci_ind_pdu->csi_part2.csi_part2_payload)); + memcpy(uci_ind_pdu->csi_part2.csi_part2_payload,ind_pdu->csi_part2.csi_part2_payload,byte_len); } break; }