[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;
}
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;

View File

@ -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);

View File

@ -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);

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->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);
}