From 163c8de371099247a62597d769665face012cac2 Mon Sep 17 00:00:00 2001 From: Teodora Date: Tue, 28 Oct 2025 16:20:52 +0100 Subject: [PATCH] Do not use ru_session_list on the stack This struct is used in multiple source files. Previously, when stopping the nr-softmodem, the ru_session_list "disappears" and the M-plane wasn't terminated properly (num_rus = 0 even though DU connected to at least one RU). --- radio/fhi_72/oran_isolate.c | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/radio/fhi_72/oran_isolate.c b/radio/fhi_72/oran_isolate.c index 8a2ac0ae46..7860b61354 100644 --- a/radio/fhi_72/oran_isolate.c +++ b/radio/fhi_72/oran_isolate.c @@ -85,6 +85,7 @@ int trx_oran_stop(openair0_device *device) #ifdef OAI_MPLANE printf("[MPLANE] Stopping M-plane.\n"); disconnect_mplane(s->mplane_priv); + free(s->mplane_priv); #endif return (0); } @@ -308,40 +309,41 @@ __attribute__((__visibility__("default"))) int transport_init(openair0_device *d bool success = false; #ifdef OAI_MPLANE - ru_session_list_t ru_session_list = {0}; - success = init_mplane(&ru_session_list); + ru_session_list_t *ru_session_list = calloc(1, sizeof(*ru_session_list)); + assert(ru_session_list != NULL && "Memory exhausted"); + success = init_mplane(ru_session_list); AssertFatal(success, "[MPLANE] Cannot initialize M-plane.\n"); - bool ru_configured[ru_session_list.num_rus]; - for (size_t i = 0; i < ru_session_list.num_rus; i++) { - ru_session_t *ru_session = &ru_session_list.ru_session[i]; + bool ru_configured[ru_session_list->num_rus]; + for (size_t i = 0; i < ru_session_list->num_rus; i++) { + ru_session_t *ru_session = &ru_session_list->ru_session[i]; ru_configured[i] = connect_mplane(ru_session); if (!ru_configured[i]) { continue; } - ru_configured[i] = manage_ru(ru_session, openair0_cfg, ru_session_list.num_rus); + ru_configured[i] = manage_ru(ru_session, openair0_cfg, ru_session_list->num_rus); } bool all_ok = true; - bool ru_ready[ru_session_list.num_rus]; - for (size_t i = 0; i < ru_session_list.num_rus; i++) { + bool ru_ready[ru_session_list->num_rus]; + for (size_t i = 0; i < ru_session_list->num_rus; i++) { if (!ru_configured[i]) { - MP_LOG_I("RU with IP %s couldn't be configured.\n", ru_session_list.ru_session[i].ru_ip_add); + MP_LOG_I("RU with IP %s couldn't be configured.\n", ru_session_list->ru_session[i].ru_ip_add); all_ok = false; } ru_ready[i] = false; } if (!all_ok) { - disconnect_mplane((void *)&ru_session_list); + disconnect_mplane(ru_session_list); AssertFatal(false, "[MPLANE] Stopping M-plane.\n"); } while (true) { sleep(1); bool all_rus_ready = true; - for (int i = 0; i < ru_session_list.num_rus; i++) { - ru_session_t *ru_session = &ru_session_list.ru_session[i]; + for (int i = 0; i < ru_session_list->num_rus; i++) { + ru_session_t *ru_session = &ru_session_list->ru_session[i]; if (!ru_ready[i] && ru_session->ru_notif.config_change && !ru_session->ru_notif.rx_carrier_state && !ru_session->ru_notif.tx_carrier_state) { MP_LOG_I("RU \"%s\" is now ready.\n", ru_session->ru_ip_add); ru_ready[i] = true; @@ -360,9 +362,9 @@ __attribute__((__visibility__("default"))) int transport_init(openair0_device *d } } - eth->mplane_priv = (void *)&ru_session_list; + eth->mplane_priv = ru_session_list; - success = get_xran_config((void *)&ru_session_list, openair0_cfg, &fh_init, fh_config); + success = get_xran_config(ru_session_list, openair0_cfg, &fh_init, fh_config); AssertFatal(success, "[MPLANE] Cannot configure xran with M-plane info.\n"); #else success = get_xran_config(NULL, openair0_cfg, &fh_init, fh_config);