[SGsAP] fix the bug in handling memory

This commit is contained in:
Sukchan Lee
2019-06-17 10:36:44 +09:00
parent fa454209a9
commit f53e80eec7
4 changed files with 44 additions and 12 deletions

View File

@@ -1519,18 +1519,17 @@ ogs_sockaddr_t *mme_pgw_addr_find_by_apn(
return NULL; 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; mme_vlr_t *vlr = NULL;
ogs_assert(addr); ogs_assert(sa_list);
ogs_pool_alloc(&mme_vlr_pool, &vlr); ogs_pool_alloc(&mme_vlr_pool, &vlr);
ogs_assert(vlr); ogs_assert(vlr);
memset(vlr, 0, sizeof *vlr); memset(vlr, 0, sizeof *vlr);
vlr->node = ogs_socknode_new(addr); vlr->sa_list = sa_list;
ogs_assert(vlr->node);
ogs_list_add(&self.vlr_list, vlr); 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_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); ogs_pool_free(&mme_vlr_pool, vlr);
} }
@@ -1556,6 +1558,29 @@ void mme_vlr_remove_all()
mme_vlr_remove(vlr); 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 *mme_vlr_find_by_addr(ogs_sockaddr_t *addr)
{ {
mme_vlr_t *vlr = NULL; mme_vlr_t *vlr = NULL;

View File

@@ -181,8 +181,10 @@ typedef struct mme_vlr_s {
uint16_t max_num_of_ostreams; /* SCTP Max num of outbound streams */ 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_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; } mme_vlr_t;
typedef struct mme_enb_s { 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); mme_vlr_t *mme_vlr_add(ogs_sockaddr_t *addr);
void mme_vlr_remove(mme_vlr_t *vlr); void mme_vlr_remove(mme_vlr_t *vlr);
void mme_vlr_remove_all(); 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_addr(ogs_sockaddr_t *addr);
mme_vlr_t *mme_vlr_find_by_tai(nas_tai_t *tai); mme_vlr_t *mme_vlr_find_by_tai(nas_tai_t *tai);
mme_vlr_t *mme_vlr_find_by_lai(nas_lai_t *lai); mme_vlr_t *mme_vlr_find_by_lai(nas_lai_t *lai);

View File

@@ -32,7 +32,7 @@ ogs_sock_t *sgsap_client(mme_vlr_t *vlr)
ogs_socknode_t *node = NULL; ogs_socknode_t *node = NULL;
ogs_sock_t *sock = NULL; ogs_sock_t *sock = NULL;
node = vlr->node; node = mme_vlr_new_node(vlr);
ogs_assert(node); ogs_assert(node);
ogs_socknode_sctp_option(node, &context_self()->config.sockopt); ogs_socknode_sctp_option(node, &context_self()->config.sockopt);

View File

@@ -71,7 +71,6 @@ void sgsap_state_will_connect(ogs_fsm_t *s, mme_event_t *e)
ogs_assert(vlr); ogs_assert(vlr);
ogs_assert(vlr->t_conn); ogs_assert(vlr->t_conn);
ogs_assert(vlr->node);
switch (e->id) { switch (e->id) {
case OGS_FSM_ENTRY_SIG: 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) void sgsap_state_connected(ogs_fsm_t *s, mme_event_t *e)
{ {
mme_vlr_t *vlr = NULL;
ogs_assert(s); ogs_assert(s);
ogs_assert(e); ogs_assert(e);
mme_sm_debug(e); mme_sm_debug(e);
vlr = e->vlr;
ogs_assert(vlr);
switch (e->id) { switch (e->id) {
case OGS_FSM_ENTRY_SIG: case OGS_FSM_ENTRY_SIG:
break; break;
case OGS_FSM_EXIT_SIG: case OGS_FSM_EXIT_SIG:
break; break;
case MME_EVT_SGSAP_LO_CONNREFUSED: case MME_EVT_SGSAP_LO_CONNREFUSED:
mme_vlr_free_node(vlr);
OGS_FSM_TRAN(s, sgsap_state_will_connect); OGS_FSM_TRAN(s, sgsap_state_will_connect);
break; break;
case MME_EVT_SGSAP_MESSAGE: case MME_EVT_SGSAP_MESSAGE:
@@ -151,10 +155,7 @@ static void sgsap_connect_timeout(void *data)
ogs_assert(vlr->t_conn); ogs_assert(vlr->t_conn);
ogs_timer_start(vlr->t_conn, mme_self()->t_conn_value); ogs_timer_start(vlr->t_conn, mme_self()->t_conn_value);
if (vlr->node->sock) mme_vlr_free_node(vlr);
ogs_sctp_destroy(vlr->node->sock);
ogs_assert(vlr->node);
sgsap_client(vlr); sgsap_client(vlr);
} }