diff --git a/lib/gtp/gtp_xact.c b/lib/gtp/gtp_xact.c index ebd9d6108..79e560756 100644 --- a/lib/gtp/gtp_xact.c +++ b/lib/gtp/gtp_xact.c @@ -63,14 +63,16 @@ status_t gtp_xact_init(gtp_xact_ctx_t *context, status_t gtp_xact_final(void) { - if (gtp_xact_pool_initialized == 1) + if (gtp_xact_pool_initialized == 1 && + pool_size(>p_xact_pool) == pool_avail(>p_xact_pool)) { - d_print("%d not freed in gtp_xact_pool[%d] of S11/S5-SM\n", + d_print("%d not freed in gtp_xact_pool[%d] of GTP Transaction\n", pool_size(>p_xact_pool) - pool_avail(>p_xact_pool), pool_size(>p_xact_pool)); index_final(>p_xact_pool); + + gtp_xact_pool_initialized = 0; } - gtp_xact_pool_initialized = 0; return CORE_OK; } @@ -175,6 +177,24 @@ gtp_xact_t *gtp_xact_remote_create(gtp_xact_ctx_t *context, GTP_XACT_REMOTE_DURATION, GTP_XACT_REMOTE_RETRY_COUNT); } +void gtp_xact_delete_all(gtp_node_t *gnode) +{ + gtp_xact_t *xact = NULL; + + xact = list_first(&gnode->local_list); + while(xact) + { + gtp_xact_delete(xact); + xact = list_next(xact); + } + xact = list_first(&gnode->remote_list); + while(xact) + { + gtp_xact_delete(xact); + xact = list_next(xact); + } +} + status_t gtp_xact_commit(gtp_xact_t *xact, c_uint8_t type, c_uint32_t teid, pkbuf_t *pkbuf) { diff --git a/lib/gtp/gtp_xact.h b/lib/gtp/gtp_xact.h index a727186e1..8b56eaa4e 100644 --- a/lib/gtp/gtp_xact.h +++ b/lib/gtp/gtp_xact.h @@ -53,10 +53,11 @@ CORE_DECLARE(status_t) gtp_xact_init(gtp_xact_ctx_t *context, tm_service_t *tm_service, c_uintptr_t event); CORE_DECLARE(status_t) gtp_xact_final(void); -CORE_DECLARE(gtp_xact_t *)gtp_xact_local_create(gtp_xact_ctx_t *context, +CORE_DECLARE(gtp_xact_t *) gtp_xact_local_create(gtp_xact_ctx_t *context, net_sock_t *sock, gtp_node_t *gnode); CORE_DECLARE(gtp_xact_t *) gtp_xact_remote_create(gtp_xact_ctx_t *context, net_sock_t *sock, gtp_node_t *gnode, c_uint32_t sqn); +CORE_DECLARE(void) gtp_xact_delete_all(gtp_node_t *gnode); CORE_DECLARE(status_t) gtp_xact_commit( gtp_xact_t *xact, c_uint8_t type, c_uint32_t teid, pkbuf_t *pkbuf); diff --git a/src/mme/mme_context.c b/src/mme/mme_context.c index e0bb07c86..72fb2188b 100644 --- a/src/mme/mme_context.c +++ b/src/mme/mme_context.c @@ -133,6 +133,8 @@ status_t mme_sgw_remove(mme_sgw_t *sgw) { d_assert(sgw, return CORE_ERROR, "Null param"); + gtp_xact_delete_all(&sgw->gnode); + list_remove(&self.sgw_list, sgw); pool_free_node(&mme_sgw_pool, sgw); diff --git a/src/mme/mme_init.c b/src/mme/mme_init.c index 196d29267..2252d8e14 100644 --- a/src/mme/mme_init.c +++ b/src/mme/mme_init.c @@ -34,6 +34,8 @@ void mme_terminate(void) mme_s6a_final(); mme_context_final(); + + gtp_xact_final(); } void *THREAD_FUNC mme_sm_main(thread_id id, void *data) @@ -86,7 +88,6 @@ void *THREAD_FUNC mme_sm_main(thread_id id, void *data) fsm_final(&mme_sm, 0); fsm_clear(&mme_sm); - gtp_xact_final(); event_delete(mme_self()->queue_id); return NULL; diff --git a/src/mme/mme_s11_build.c b/src/mme/mme_s11_build.c index 42a9f72e4..ef3542ba1 100644 --- a/src/mme/mme_s11_build.c +++ b/src/mme/mme_s11_build.c @@ -88,11 +88,12 @@ status_t mme_s11_build_create_session_req(pkbuf_t **pkbuf, mme_esm_t *esm) req->pgw_s5_s8_address_for_control_plane_or_pmip.len = GTP_F_TEID_IPV4_LEN; req->access_point_name.presence = 1; - req->access_point_name.data = "cellwire.com"; - req->access_point_name.len = strlen(req->access_point_name.data); + req->access_point_name.data = pdn->apn; + req->access_point_name.len = strlen(pdn->apn); req->selection_mode.presence = 1; - req->selection_mode.u8 = GTP_SELECTION_MODE_MS_OR_NETWORK_PROVIDED_APN | 0xfc; + req->selection_mode.u8 = + GTP_SELECTION_MODE_MS_OR_NETWORK_PROVIDED_APN | 0xfc; req->pdn_type.presence = 1; req->pdn_type.u8 = GTP_PDN_TYPE_IPV4; diff --git a/src/pgw/pgw_context.c b/src/pgw/pgw_context.c index aea8d4a17..aeff052e3 100644 --- a/src/pgw/pgw_context.c +++ b/src/pgw/pgw_context.c @@ -46,6 +46,9 @@ status_t pgw_context_final() d_assert(context_initiaized == 1, return CORE_ERROR, "HyperCell context already has been finalized"); + gtp_xact_delete_all(&self.s5c_node); + pgw_sess_remove_all(); + d_print("%d not freed in pgw_sess_pool[%d] in PGW-Context\n", index_size(&pgw_sess_pool) - pool_avail(&pgw_sess_pool), index_size(&pgw_sess_pool)); diff --git a/src/pgw/pgw_init.c b/src/pgw/pgw_init.c index aa906358a..fcfbd0bc3 100644 --- a/src/pgw/pgw_init.c +++ b/src/pgw/pgw_init.c @@ -27,6 +27,8 @@ void pgw_terminate(void) thread_delete(pgw_sm_thread); pgw_context_final(); + + gtp_xact_final(); } void *THREAD_FUNC pgw_sm_main(thread_id id, void *data) @@ -79,7 +81,6 @@ void *THREAD_FUNC pgw_sm_main(thread_id id, void *data) fsm_final(&pgw_sm, 0); fsm_clear(&pgw_sm); - gtp_xact_final(); event_delete(pgw_self()->queue_id); return NULL; diff --git a/src/sgw/sgw_context.c b/src/sgw/sgw_context.c index b85c5ced4..58629e2f9 100644 --- a/src/sgw/sgw_context.c +++ b/src/sgw/sgw_context.c @@ -54,6 +54,11 @@ status_t sgw_context_final() d_assert(context_initialized == 1, return CORE_ERROR, "HyperCell context already has been finalized"); + gtp_xact_delete_all(&self.s11_node); + gtp_xact_delete_all(&self.s5c_node); + + sgw_sess_remove_all(); + d_print("%d not freed in sgw_sess_pool[%d] in SGW-Context\n", index_size(&sgw_sess_pool) - pool_avail(&sgw_sess_pool), index_size(&sgw_sess_pool)); diff --git a/src/sgw/sgw_init.c b/src/sgw/sgw_init.c index f1db6854f..b29a7b167 100644 --- a/src/sgw/sgw_init.c +++ b/src/sgw/sgw_init.c @@ -27,6 +27,8 @@ void sgw_terminate(void) thread_delete(sgw_sm_thread); sgw_context_final(); + + gtp_xact_final(); } void *THREAD_FUNC sgw_sm_main(thread_id id, void *data) @@ -79,7 +81,6 @@ void *THREAD_FUNC sgw_sm_main(thread_id id, void *data) fsm_final(&sgw_sm, 0); fsm_clear(&sgw_sm); - gtp_xact_final(); event_delete(sgw_self()->queue_id); return NULL;