From f53e80eec7f2b7b8e4d61c79655059bbca51ab4c Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Mon, 17 Jun 2019 10:36:44 +0900 Subject: [PATCH] [SGsAP] fix the bug in handling memory --- src/mme/mme-context.c | 35 ++++++++++++++++++++++++++++++----- src/mme/mme-context.h | 8 +++++++- src/mme/sgsap-lkpath.c | 2 +- src/mme/sgsap-sm.c | 11 ++++++----- 4 files changed, 44 insertions(+), 12 deletions(-) diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index a0475cb71..bea34fbef 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -1519,18 +1519,17 @@ ogs_sockaddr_t *mme_pgw_addr_find_by_apn( return NULL; } -mme_vlr_t *mme_vlr_add(ogs_sockaddr_t *addr) +mme_vlr_t *mme_vlr_add(ogs_sockaddr_t *sa_list) { mme_vlr_t *vlr = NULL; - ogs_assert(addr); + ogs_assert(sa_list); ogs_pool_alloc(&mme_vlr_pool, &vlr); ogs_assert(vlr); memset(vlr, 0, sizeof *vlr); - vlr->node = ogs_socknode_new(addr); - ogs_assert(vlr->node); + vlr->sa_list = sa_list; ogs_list_add(&self.vlr_list, vlr); @@ -1543,7 +1542,10 @@ void mme_vlr_remove(mme_vlr_t *vlr) ogs_list_remove(&self.vlr_list, vlr); - ogs_socknode_free(vlr->node); + if (vlr->node) + mme_vlr_free_node(vlr); + + ogs_freeaddrinfo(vlr->sa_list); ogs_pool_free(&mme_vlr_pool, vlr); } @@ -1556,6 +1558,29 @@ void mme_vlr_remove_all() mme_vlr_remove(vlr); } +ogs_socknode_t *mme_vlr_new_node(mme_vlr_t *vlr) +{ + ogs_sockaddr_t *addr = NULL; + ogs_assert(vlr); + + ogs_copyaddrinfo(&addr, vlr->sa_list); + + ogs_assert(vlr->node == NULL); + vlr->node = ogs_socknode_new(addr); + ogs_assert(vlr->node); + + return vlr->node; +} + +void mme_vlr_free_node(mme_vlr_t *vlr) +{ + ogs_assert(vlr); + ogs_assert(vlr->node); + + ogs_socknode_free(vlr->node); + vlr->node = NULL; +} + mme_vlr_t *mme_vlr_find_by_addr(ogs_sockaddr_t *addr) { mme_vlr_t *vlr = NULL; diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index 0b5dcbf64..a1a0c784c 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -181,8 +181,10 @@ typedef struct mme_vlr_s { uint16_t max_num_of_ostreams; /* SCTP Max num of outbound streams */ + ogs_sockaddr_t *sa_list; /* VLR SGsAP Socket Address List */ + ogs_socknode_t *node; /* VLR SGsAP Node */ - ogs_sockaddr_t *addr; /* VLR SGsAP Address */ + ogs_sockaddr_t *addr; /* VLR SGsAP Connected Socket Address */ } mme_vlr_t; typedef struct mme_enb_s { @@ -557,6 +559,10 @@ ogs_sockaddr_t *mme_pgw_addr_find_by_apn( mme_vlr_t *mme_vlr_add(ogs_sockaddr_t *addr); void mme_vlr_remove(mme_vlr_t *vlr); void mme_vlr_remove_all(); + +ogs_socknode_t *mme_vlr_new_node(mme_vlr_t *vlr); +void mme_vlr_free_node(mme_vlr_t *vlr); + mme_vlr_t *mme_vlr_find_by_addr(ogs_sockaddr_t *addr); mme_vlr_t *mme_vlr_find_by_tai(nas_tai_t *tai); mme_vlr_t *mme_vlr_find_by_lai(nas_lai_t *lai); diff --git a/src/mme/sgsap-lkpath.c b/src/mme/sgsap-lkpath.c index f24ca32f4..f66803d50 100644 --- a/src/mme/sgsap-lkpath.c +++ b/src/mme/sgsap-lkpath.c @@ -32,7 +32,7 @@ ogs_sock_t *sgsap_client(mme_vlr_t *vlr) ogs_socknode_t *node = NULL; ogs_sock_t *sock = NULL; - node = vlr->node; + node = mme_vlr_new_node(vlr); ogs_assert(node); ogs_socknode_sctp_option(node, &context_self()->config.sockopt); diff --git a/src/mme/sgsap-sm.c b/src/mme/sgsap-sm.c index 5cc7df51c..32da71960 100644 --- a/src/mme/sgsap-sm.c +++ b/src/mme/sgsap-sm.c @@ -71,7 +71,6 @@ void sgsap_state_will_connect(ogs_fsm_t *s, mme_event_t *e) ogs_assert(vlr); ogs_assert(vlr->t_conn); - ogs_assert(vlr->node); switch (e->id) { case OGS_FSM_ENTRY_SIG: @@ -92,17 +91,22 @@ void sgsap_state_will_connect(ogs_fsm_t *s, mme_event_t *e) void sgsap_state_connected(ogs_fsm_t *s, mme_event_t *e) { + mme_vlr_t *vlr = NULL; ogs_assert(s); ogs_assert(e); mme_sm_debug(e); + vlr = e->vlr; + ogs_assert(vlr); + switch (e->id) { case OGS_FSM_ENTRY_SIG: break; case OGS_FSM_EXIT_SIG: break; case MME_EVT_SGSAP_LO_CONNREFUSED: + mme_vlr_free_node(vlr); OGS_FSM_TRAN(s, sgsap_state_will_connect); break; case MME_EVT_SGSAP_MESSAGE: @@ -151,10 +155,7 @@ static void sgsap_connect_timeout(void *data) ogs_assert(vlr->t_conn); ogs_timer_start(vlr->t_conn, mme_self()->t_conn_value); - if (vlr->node->sock) - ogs_sctp_destroy(vlr->node->sock); - - ogs_assert(vlr->node); + mme_vlr_free_node(vlr); sgsap_client(vlr); }