forked from acouzens/open5gs
[SGsAP] fix the bug in handling memory
This commit is contained in:
parent
fa454209a9
commit
f53e80eec7
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue