mirror of
https://github.com/open5gs/open5gs.git
synced 2025-11-15 19:31:26 +00:00
[SGsAP] fix the bug in handling memory
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user