From 887a0a10d3bd55b0d1bed5784da948e85b42ebae Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Tue, 1 Sep 2020 23:04:35 -0400 Subject: [PATCH] Fixing the problem of the test program --- lib/app/ogs-context.c | 11 +++++----- lib/core/ogs-pool.h | 36 +++++++++++++++++++++++++------- lib/pfcp/context.c | 20 +++++++++--------- src/mme/emm-build.c | 2 +- src/mme/emm-handler.c | 1 + src/mme/esm-build.c | 20 +++++++++--------- src/mme/esm-sm.c | 22 ++++++++++---------- src/mme/mme-context.c | 35 ++++++++++++++++++++++--------- src/mme/mme-context.h | 8 +++---- src/mme/mme-gtp-path.c | 2 +- src/mme/mme-s11-build.c | 16 +++++++------- src/mme/mme-sm.c | 4 ++-- src/mme/s1ap-build.c | 20 +++++++++--------- src/mme/s1ap-handler.c | 8 +++---- src/smf/context.c | 29 +++++++++++--------------- src/smf/context.h | 5 +++-- src/smf/gsm-build.c | 4 ++-- src/smf/ngap-build.c | 2 +- tests/app/5gc-init.c | 30 ++++++++++++++------------- tests/app/app-init.c | 46 +++++++++++++++++++++++------------------ tests/app/epc-init.c | 24 ++++++++++++--------- 21 files changed, 195 insertions(+), 150 deletions(-) diff --git a/lib/app/ogs-context.c b/lib/app/ogs-context.c index 4e23f9957..0cb9b84d9 100644 --- a/lib/app/ogs-context.c +++ b/lib/app/ogs-context.c @@ -23,12 +23,16 @@ static ogs_app_context_t self; static int initialized = 0; +static void app_context_prepare(void); + int ogs_app_context_init(void) { ogs_assert(initialized == 0); memset(&self, 0, sizeof(ogs_app_context_t)); + app_context_prepare(); + initialized = 1; return OGS_OK; @@ -164,7 +168,7 @@ static void regenerate_all_timer_duration(void) #endif } -static int app_context_prepare(void) +static void app_context_prepare(void) { #define USRSCTP_LOCAL_UDP_PORT 9899 self.usrsctp.udp_port = USRSCTP_LOCAL_UDP_PORT; @@ -196,8 +200,6 @@ static int app_context_prepare(void) self.time.message.duration = ogs_time_from_sec(2); regenerate_all_timer_duration(); - - return OGS_OK; } static int app_context_validation(void) @@ -230,9 +232,6 @@ int ogs_app_context_parse_config(void) document = self.document; ogs_assert(document); - rv = app_context_prepare(); - if (rv != OGS_OK) return rv; - ogs_yaml_iter_init(&root_iter, document); while (ogs_yaml_iter_next(&root_iter)) { const char *root_key = ogs_yaml_iter_key(&root_iter); diff --git a/lib/core/ogs-pool.h b/lib/core/ogs-pool.h index cdc12852e..94ded03a8 100644 --- a/lib/core/ogs-pool.h +++ b/lib/core/ogs-pool.h @@ -55,17 +55,13 @@ typedef unsigned int ogs_index_t; } \ } while (0) -#define ogs_pool_final_skip_mem_checks(pool) do { \ - free((pool)->free); \ - free((pool)->array); \ - free((pool)->index); \ -} while (0) - #define ogs_pool_final(pool) do { \ if (((pool)->size != (pool)->avail)) \ ogs_error("%d in '%s[%d]' were not released.", \ (pool)->size - (pool)->avail, (pool)->name, (pool)->size); \ - ogs_pool_final_skip_mem_checks(pool); \ + free((pool)->free); \ + free((pool)->array); \ + free((pool)->index); \ } while (0) #define ogs_pool_index(pool, node) (((node) - (pool)->array)+1) @@ -97,6 +93,32 @@ typedef unsigned int ogs_index_t; #define ogs_pool_size(pool) ((pool)->size) #define ogs_pool_avail(pool) ((pool)->avail) +#define ogs_index_init(pool, _size) do { \ + int i; \ + (pool)->name = #pool; \ + (pool)->free = ogs_malloc(sizeof(*(pool)->free) * _size); \ + ogs_assert((pool)->free); \ + (pool)->array = ogs_malloc(sizeof(*(pool)->array) * _size); \ + ogs_assert((pool)->array); \ + (pool)->index = ogs_malloc(sizeof(*(pool)->index) * _size); \ + ogs_assert((pool)->index); \ + (pool)->size = (pool)->avail = _size; \ + (pool)->head = (pool)->tail = 0; \ + for (i = 0; i < _size; i++) { \ + (pool)->free[i] = &((pool)->array[i]); \ + (pool)->index[i] = NULL; \ + } \ +} while (0) + +#define ogs_index_final(pool) do { \ + if (((pool)->size != (pool)->avail)) \ + ogs_error("%d in '%s[%d]' were not released.", \ + (pool)->size - (pool)->avail, (pool)->name, (pool)->size); \ + ogs_free((pool)->free); \ + ogs_free((pool)->array); \ + ogs_free((pool)->index); \ +} while (0) + #ifdef __cplusplus } #endif diff --git a/lib/pfcp/context.c b/lib/pfcp/context.c index d58b922e3..7782de8cf 100644 --- a/lib/pfcp/context.c +++ b/lib/pfcp/context.c @@ -1505,17 +1505,17 @@ void ogs_pfcp_subnet_remove_all(void) void ogs_pfcp_pool_init(ogs_pfcp_sess_t *sess) { - ogs_pool_init(&sess->pdr_pool, OGS_MAX_NUM_OF_PDR); - ogs_pool_init(&sess->far_pool, OGS_MAX_NUM_OF_FAR); - ogs_pool_init(&sess->urr_pool, OGS_MAX_NUM_OF_URR); - ogs_pool_init(&sess->qer_pool, OGS_MAX_NUM_OF_QER); - ogs_pool_init(&sess->bar_pool, OGS_MAX_NUM_OF_BAR); + ogs_index_init(&sess->pdr_pool, OGS_MAX_NUM_OF_PDR); + ogs_index_init(&sess->far_pool, OGS_MAX_NUM_OF_FAR); + ogs_index_init(&sess->urr_pool, OGS_MAX_NUM_OF_URR); + ogs_index_init(&sess->qer_pool, OGS_MAX_NUM_OF_QER); + ogs_index_init(&sess->bar_pool, OGS_MAX_NUM_OF_BAR); } void ogs_pfcp_pool_final(ogs_pfcp_sess_t *sess) { - ogs_pool_final(&sess->pdr_pool); - ogs_pool_final(&sess->far_pool); - ogs_pool_final(&sess->urr_pool); - ogs_pool_final(&sess->qer_pool); - ogs_pool_final(&sess->bar_pool); + ogs_index_final(&sess->pdr_pool); + ogs_index_final(&sess->far_pool); + ogs_index_final(&sess->urr_pool); + ogs_index_final(&sess->qer_pool); + ogs_index_final(&sess->bar_pool); } diff --git a/src/mme/emm-build.c b/src/mme/emm-build.c index b05b6e0ce..0dde516db 100644 --- a/src/mme/emm-build.c +++ b/src/mme/emm-build.c @@ -404,7 +404,7 @@ ogs_pkbuf_t *emm_build_tau_accept(mme_ue_t *mme_ue) while (sess) { mme_bearer_t *bearer = mme_bearer_first(sess); while (bearer) { - switch (*(bearer->ebi)) { + switch (bearer->ebi) { case 5: tau_accept->eps_bearer_context_status.ebi5 = 1; break; case 6: tau_accept->eps_bearer_context_status.ebi6 = 1; break; case 7: tau_accept->eps_bearer_context_status.ebi7 = 1; break; diff --git a/src/mme/emm-handler.c b/src/mme/emm-handler.c index 9872ed288..07ac3201d 100644 --- a/src/mme/emm-handler.c +++ b/src/mme/emm-handler.c @@ -80,6 +80,7 @@ int emm_handle_attach_request(mme_ue_t *mme_ue, */ CLEAR_MME_UE_ALL_TIMERS(mme_ue); + CLEAR_EPS_BEARER_ID(mme_ue); CLEAR_SERVICE_INDICATOR(mme_ue); if (SECURITY_CONTEXT_IS_VALID(mme_ue)) { ogs_kdf_kenb(mme_ue->kasme, mme_ue->ul_count.i32, mme_ue->kenb); diff --git a/src/mme/esm-build.c b/src/mme/esm-build.c index f44e5aa15..03c900e7d 100644 --- a/src/mme/esm-build.c +++ b/src/mme/esm-build.c @@ -74,7 +74,7 @@ ogs_pkbuf_t *esm_build_information_request(mme_bearer_t *bearer) ogs_debug("[ESM] ESM information request"); ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", - mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); + mme_ue->imsi_bcd, sess->pti, bearer->ebi); memset(&message, 0, sizeof(message)); message.h.security_header_type = @@ -130,7 +130,7 @@ ogs_pkbuf_t *esm_build_activate_default_bearer_context_request( ogs_debug("[ESM] Activate default bearer context request"); ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", - mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); + mme_ue->imsi_bcd, sess->pti, bearer->ebi); memset(&message, 0, sizeof(message)); if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_registered)) { @@ -138,7 +138,7 @@ ogs_pkbuf_t *esm_build_activate_default_bearer_context_request( OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED; message.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM; } - message.esm.h.eps_bearer_identity = *(bearer->ebi); + message.esm.h.eps_bearer_identity = bearer->ebi; message.esm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM; message.esm.h.procedure_transaction_identity = sess->pti; message.esm.h.message_type = @@ -278,19 +278,19 @@ ogs_pkbuf_t *esm_build_activate_dedicated_bearer_context_request( ogs_debug("[ESM] Activate dedicated bearer context request"); ogs_debug(" IMSI[%s] EBI[%d] Linked-EBI[%d]", - mme_ue->imsi_bcd, *(bearer->ebi), *(linked_bearer->ebi)); + mme_ue->imsi_bcd, bearer->ebi, linked_bearer->ebi); memset(&message, 0, sizeof(message)); message.h.security_header_type = OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED; message.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM; - message.esm.h.eps_bearer_identity = *(bearer->ebi); + message.esm.h.eps_bearer_identity = bearer->ebi; message.esm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM; message.esm.h.procedure_transaction_identity = 0; message.esm.h.message_type = OGS_NAS_EPS_ACTIVATE_DEDICATED_EPS_BEARER_CONTEXT_REQUEST; - linked_ebi->eps_bearer_identity = *(linked_bearer->ebi); + linked_ebi->eps_bearer_identity = linked_bearer->ebi; eps_qos_build(eps_qos, bearer->qos.qci, bearer->qos.mbr.downlink, bearer->qos.mbr.uplink, bearer->qos.gbr.downlink, bearer->qos.gbr.uplink); @@ -326,13 +326,13 @@ ogs_pkbuf_t *esm_build_modify_bearer_context_request( ogs_debug("[ESM] Modify bearer context request"); ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", - mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); + mme_ue->imsi_bcd, sess->pti, bearer->ebi); memset(&message, 0, sizeof(message)); message.h.security_header_type = OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED; message.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM; - message.esm.h.eps_bearer_identity = *(bearer->ebi); + message.esm.h.eps_bearer_identity = bearer->ebi; message.esm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM; message.esm.h.procedure_transaction_identity = sess->pti; message.esm.h.message_type = OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_REQUEST; @@ -376,14 +376,14 @@ ogs_pkbuf_t *esm_build_deactivate_bearer_context_request( ogs_debug("[ESM] Deactivate bearer context request"); ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", - mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); + mme_ue->imsi_bcd, sess->pti, bearer->ebi); ogs_debug(" Cause[%d]", esm_cause); memset(&message, 0, sizeof(message)); message.h.security_header_type = OGS_NAS_SECURITY_HEADER_INTEGRITY_PROTECTED_AND_CIPHERED; message.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_EMM; - message.esm.h.eps_bearer_identity = *(bearer->ebi); + message.esm.h.eps_bearer_identity = bearer->ebi; message.esm.h.protocol_discriminator = OGS_NAS_PROTOCOL_DISCRIMINATOR_ESM; message.esm.h.procedure_transaction_identity = sess->pti; message.esm.h.message_type = diff --git a/src/mme/esm-sm.c b/src/mme/esm-sm.c index e5e7746f9..d2fc0d878 100644 --- a/src/mme/esm-sm.c +++ b/src/mme/esm-sm.c @@ -81,7 +81,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e) case OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST: ogs_debug("[ESM] PDN Connectivity request"); ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", - mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); + mme_ue->imsi_bcd, sess->pti, bearer->ebi); rv = esm_handle_pdn_connectivity_request( bearer, &message->esm.pdn_connectivity_request); if (rv != OGS_OK) { @@ -92,7 +92,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e) case OGS_NAS_EPS_ESM_INFORMATION_RESPONSE: ogs_debug("[ESM] ESM information response"); ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", - mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); + mme_ue->imsi_bcd, sess->pti, bearer->ebi); CLEAR_BEARER_TIMER(bearer->t3489); rv = esm_handle_information_response( @@ -106,7 +106,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e) ogs_debug("[ESM] Activate default EPS bearer " "context accept"); ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", - mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); + mme_ue->imsi_bcd, sess->pti, bearer->ebi); /* Check if Initial Context Setup Response or * E-RAB Setup Response is received */ if (MME_HAVE_ENB_S1U_PATH(bearer)) { @@ -120,7 +120,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e) ogs_debug("[ESM] Activate dedicated EPS bearer " "context accept"); ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", - mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); + mme_ue->imsi_bcd, sess->pti, bearer->ebi); /* Check if Initial Context Setup Response or * E-RAB Setup Response is received */ if (MME_HAVE_ENB_S1U_PATH(bearer)) { @@ -197,7 +197,7 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e) case OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST: ogs_debug("[ESM] PDN Connectivity request"); ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", - mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); + mme_ue->imsi_bcd, sess->pti, bearer->ebi); rv = esm_handle_pdn_connectivity_request( bearer, &message->esm.pdn_connectivity_request); if (rv != OGS_OK) { @@ -210,7 +210,7 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e) case OGS_NAS_EPS_PDN_DISCONNECT_REQUEST: ogs_debug("[ESM] PDN disconnect request"); ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", - mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); + mme_ue->imsi_bcd, sess->pti, bearer->ebi); if (MME_HAVE_SGW_S1U_PATH(sess)) { mme_gtp_send_delete_session_request(sess); } else { @@ -221,7 +221,7 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e) case OGS_NAS_EPS_MODIFY_EPS_BEARER_CONTEXT_ACCEPT: ogs_debug("[ESM] Modify EPS bearer context accept"); ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", - mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); + mme_ue->imsi_bcd, sess->pti, bearer->ebi); mme_gtp_send_update_bearer_response(bearer); break; @@ -229,20 +229,20 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e) ogs_debug("[ESM] Deactivate EPS bearer " "context accept"); ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", - mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); + mme_ue->imsi_bcd, sess->pti, bearer->ebi); mme_gtp_send_delete_bearer_response(bearer); OGS_FSM_TRAN(s, esm_state_bearer_deactivated); break; case OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REQUEST: ogs_debug("[ESM] Bearer resource allocation request"); ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", - mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); + mme_ue->imsi_bcd, sess->pti, bearer->ebi); esm_handle_bearer_resource_allocation_request(bearer, message); break; case OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REQUEST: ogs_debug("[ESM] Bearer resource modification request"); ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", - mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); + mme_ue->imsi_bcd, sess->pti, bearer->ebi); esm_handle_bearer_resource_modification_request(bearer, message); break; default: @@ -290,7 +290,7 @@ void esm_state_pdn_will_disconnect(ogs_fsm_t *s, mme_event_t *e) ogs_debug("[ESM] [D] Deactivate EPS bearer " "context accept"); ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", - mme_ue->imsi_bcd, sess->pti, *(bearer->ebi)); + mme_ue->imsi_bcd, sess->pti, bearer->ebi); OGS_FSM_TRAN(s, esm_state_pdn_did_disconnect); break; default: diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index bf6445a26..0bfca1080 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -2333,7 +2333,7 @@ void mme_ue_remove(mme_ue_t *mme_ue) mme_sess_remove_all(mme_ue); mme_pdn_remove_all(mme_ue); - ogs_pool_final(&mme_ue->ebi_pool); + mme_ebi_pool_final(mme_ue); ogs_pool_free(&mme_ue_pool, mme_ue); } @@ -2782,11 +2782,13 @@ mme_bearer_t *mme_bearer_add(mme_sess_t *sess) ogs_assert(bearer); memset(bearer, 0, sizeof *bearer); - ogs_pool_alloc(&mme_ue->ebi_pool, &bearer->ebi); - ogs_assert(bearer->ebi); + ogs_pool_alloc(&mme_ue->ebi_pool, &bearer->ebi_node); + ogs_assert(bearer->ebi_node); - ogs_assert(*(bearer->ebi) >= MIN_EPS_BEARER_ID && - *(bearer->ebi) <= MAX_EPS_BEARER_ID); + bearer->ebi = *(bearer->ebi_node); + + ogs_assert(bearer->ebi >= MIN_EPS_BEARER_ID && + bearer->ebi <= MAX_EPS_BEARER_ID); bearer->mme_ue = mme_ue; bearer->sess = sess; @@ -2825,8 +2827,8 @@ void mme_bearer_remove(mme_bearer_t *bearer) OGS_TLV_CLEAR_DATA(&bearer->tft); - ogs_assert(bearer->ebi); - ogs_pool_free(&bearer->mme_ue->ebi_pool, bearer->ebi); + ogs_assert(bearer->ebi_node); + ogs_pool_free(&bearer->mme_ue->ebi_pool, bearer->ebi_node); ogs_pool_free(&mme_bearer_pool, bearer); } @@ -2855,7 +2857,7 @@ mme_bearer_t *mme_bearer_find_by_sess_ebi(mme_sess_t *sess, uint8_t ebi) bearer = mme_bearer_first(sess); while (bearer) { - if (ebi == *(bearer->ebi)) + if (ebi == bearer->ebi) return bearer; bearer = mme_bearer_next(bearer); @@ -3238,7 +3240,7 @@ void mme_ebi_pool_init(mme_ue_t *mme_ue) ogs_assert(mme_ue); - ogs_pool_init(&mme_ue->ebi_pool, MAX_EPS_BEARER_ID - MIN_EPS_BEARER_ID + 1); + ogs_index_init(&mme_ue->ebi_pool, MAX_EPS_BEARER_ID-MIN_EPS_BEARER_ID+1); for (i = MIN_EPS_BEARER_ID, index = 0; i <= MAX_EPS_BEARER_ID; i++, index++) { @@ -3248,7 +3250,20 @@ void mme_ebi_pool_init(mme_ue_t *mme_ue) void mme_ebi_pool_final(mme_ue_t *mme_ue) { - ogs_pool_final_skip_mem_checks(&mme_ue->ebi_pool); + ogs_assert(mme_ue); + + ogs_index_final(&mme_ue->ebi_pool); +} + +void mme_ebi_pool_clear(mme_ue_t *mme_ue) +{ + ogs_assert(mme_ue); + + ogs_free(mme_ue->ebi_pool.free); + ogs_free(mme_ue->ebi_pool.array); + ogs_free(mme_ue->ebi_pool.index); + + mme_ebi_pool_init(mme_ue); } uint8_t mme_selected_int_algorithm(mme_ue_t *mme_ue) diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index a0a2a28c8..58d98a653 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -397,8 +397,7 @@ struct mme_ue_s { #define CLEAR_EPS_BEARER_ID(__mME) \ do { \ ogs_assert((__mME)); \ - mme_ebi_pool_final(__mME); \ - mme_ebi_pool_init(__mME); \ + mme_ebi_pool_clear(__mME); \ } while(0) OGS_POOL(ebi_pool, uint8_t); @@ -523,7 +522,6 @@ struct mme_ue_s { ogs_assert((__mME)); \ (__mME)->sgw_s11_teid = 0; \ (__mME)->session_context_will_deleted = 0; \ - CLEAR_EPS_BEARER_ID((__mME)); \ } while(0) typedef struct mme_sess_s { ogs_lnode_t lnode; @@ -585,7 +583,8 @@ typedef struct mme_bearer_s { uint32_t index; ogs_fsm_t sm; /* State Machine */ - uint8_t *ebi; /* EPS Bearer ID */ + uint8_t *ebi_node; /* Pool-Node for EPS Bearer ID */ + uint8_t ebi; /* EPS Bearer ID */ uint32_t enb_s1u_teid; ogs_ip_t enb_s1u_ip; @@ -789,6 +788,7 @@ int mme_m_tmsi_free(mme_m_tmsi_t *tmsi); void mme_ebi_pool_init(mme_ue_t *mme_ue); void mme_ebi_pool_final(mme_ue_t *mme_ue); +void mme_ebi_pool_clear(mme_ue_t *mme_ue); uint8_t mme_selected_int_algorithm(mme_ue_t *mme_ue); uint8_t mme_selected_enc_algorithm(mme_ue_t *mme_ue); diff --git a/src/mme/mme-gtp-path.c b/src/mme/mme-gtp-path.c index 71566c100..6dbc8c39f 100644 --- a/src/mme/mme-gtp-path.c +++ b/src/mme/mme-gtp-path.c @@ -267,7 +267,7 @@ void mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue) if (bearer && OGS_FSM_CHECK(&bearer->sm, esm_state_pdn_will_disconnect)) { - ogs_warn("PDN will disconnect[EBI:%d]", *(bearer->ebi)); + ogs_warn("PDN will disconnect[EBI:%d]", bearer->ebi); } else { mme_gtp_send_delete_session_request(sess); } diff --git a/src/mme/mme-s11-build.c b/src/mme/mme-s11-build.c index ba1c121eb..815aee237 100644 --- a/src/mme/mme-s11-build.c +++ b/src/mme/mme-s11-build.c @@ -230,7 +230,7 @@ ogs_pkbuf_t *mme_s11_build_create_session_request( req->bearer_contexts_to_be_created.presence = 1; req->bearer_contexts_to_be_created.eps_bearer_id.presence = 1; - req->bearer_contexts_to_be_created.eps_bearer_id.u8 = *(bearer->ebi); + req->bearer_contexts_to_be_created.eps_bearer_id.u8 = bearer->ebi; memset(&bearer_qos, 0, sizeof(bearer_qos)); bearer_qos.qci = pdn->qos.qci; @@ -297,7 +297,7 @@ ogs_pkbuf_t *mme_s11_build_modify_bearer_request( /* Bearer Context : EBI */ req->bearer_contexts_to_be_modified.presence = 1; req->bearer_contexts_to_be_modified.eps_bearer_id.presence = 1; - req->bearer_contexts_to_be_modified.eps_bearer_id.u8 = *(bearer->ebi); + req->bearer_contexts_to_be_modified.eps_bearer_id.u8 = bearer->ebi; /* Data Plane(DL) : ENB-S1U */ memset(&enb_s1u_teid, 0, sizeof(ogs_gtp_f_teid_t)); @@ -354,7 +354,7 @@ ogs_pkbuf_t *mme_s11_build_delete_session_request( memset(>p_message, 0, sizeof(ogs_gtp_message_t)); req->linked_eps_bearer_id.presence = 1; - req->linked_eps_bearer_id.u8 = *(bearer->ebi); + req->linked_eps_bearer_id.u8 = bearer->ebi; /* User Location Information(ULI) */ memset(&uli, 0, sizeof(ogs_gtp_uli_t)); @@ -416,7 +416,7 @@ ogs_pkbuf_t *mme_s11_build_create_bearer_response( /* Bearer Context : EBI */ rsp->bearer_contexts.presence = 1; rsp->bearer_contexts.eps_bearer_id.presence = 1; - rsp->bearer_contexts.eps_bearer_id.u8 = *(bearer->ebi); + rsp->bearer_contexts.eps_bearer_id.u8 = bearer->ebi; /* Data Plane(DL) : ENB-S1U */ memset(&enb_s1u_teid, 0, sizeof(ogs_gtp_f_teid_t)); @@ -511,7 +511,7 @@ ogs_pkbuf_t *mme_s11_build_update_bearer_response( /* Bearer Context : EBI */ rsp->bearer_contexts.presence = 1; rsp->bearer_contexts.eps_bearer_id.presence = 1; - rsp->bearer_contexts.eps_bearer_id.u8 = *(bearer->ebi); + rsp->bearer_contexts.eps_bearer_id.u8 = bearer->ebi; /* Bearer Context : Cause */ rsp->bearer_contexts.cause.presence = 1; @@ -586,7 +586,7 @@ ogs_pkbuf_t *mme_s11_build_delete_bearer_response( /* Bearer Context : EBI */ rsp->bearer_contexts.presence = 1; rsp->bearer_contexts.eps_bearer_id.presence = 1; - rsp->bearer_contexts.eps_bearer_id.u8 = *(bearer->ebi); + rsp->bearer_contexts.eps_bearer_id.u8 = bearer->ebi; /* Bearer Context : Cause */ rsp->bearer_contexts.cause.presence = 1; @@ -725,7 +725,7 @@ ogs_pkbuf_t *mme_s11_build_create_indirect_data_forwarding_tunnel_request( MME_HAVE_ENB_UL_INDIRECT_TUNNEL(bearer)) { req->bearer_contexts[i].presence = 1; req->bearer_contexts[i].eps_bearer_id.presence = 1; - req->bearer_contexts[i].eps_bearer_id.u8 = *(bearer->ebi); + req->bearer_contexts[i].eps_bearer_id.u8 = bearer->ebi; i++; } @@ -795,7 +795,7 @@ ogs_pkbuf_t *mme_s11_build_bearer_resource_command( /* Linked Bearer Context : EBI */ cmd->linked_eps_bearer_id.presence = 1; - cmd->linked_eps_bearer_id.u8 = *(bearer->ebi); + cmd->linked_eps_bearer_id.u8 = bearer->ebi; /* Procedure Transaction ID(PTI) */ cmd->procedure_transaction_id.presence = 1; diff --git a/src/mme/mme-sm.c b/src/mme/mme-sm.c index 534ce5a2f..a2f08ba5d 100644 --- a/src/mme/mme-sm.c +++ b/src/mme/mme-sm.c @@ -364,7 +364,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) ogs_fsm_dispatch(&bearer->sm, e); if (OGS_FSM_CHECK(&bearer->sm, esm_state_bearer_deactivated)) { - if (*(default_bearer->ebi) == *(bearer->ebi)) { + if (default_bearer->ebi == bearer->ebi) { /* if the bearer is a default bearer, * remove all session context linked the default bearer */ mme_sess_remove(sess); @@ -375,7 +375,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) } } else if (OGS_FSM_CHECK(&bearer->sm, esm_state_pdn_did_disconnect)) { - ogs_assert(*(default_bearer->ebi) == *(bearer->ebi)); + ogs_assert(default_bearer->ebi == bearer->ebi); mme_sess_remove(sess); } else if (OGS_FSM_CHECK(&bearer->sm, esm_state_exception)) { diff --git a/src/mme/s1ap-build.c b/src/mme/s1ap-build.c index 1295a0fab..9881f0c56 100644 --- a/src/mme/s1ap-build.c +++ b/src/mme/s1ap-build.c @@ -377,11 +377,11 @@ ogs_pkbuf_t *s1ap_build_initial_context_setup_request( e_rab = &item->value.choice.E_RABToBeSetupItemCtxtSUReq; - e_rab->e_RAB_ID = *(bearer->ebi); + e_rab->e_RAB_ID = bearer->ebi; e_rab->e_RABlevelQoSParameters.qCI = bearer->qos.qci; ogs_debug(" EBI[%d] QCI[%d] SGW-S1U-TEID[%d]", - *(bearer->ebi), bearer->qos.qci, bearer->sgw_s1u_teid); + bearer->ebi, bearer->qos.qci, bearer->sgw_s1u_teid); e_rab->e_RABlevelQoSParameters.allocationRetentionPriority. priorityLevel = bearer->qos.arp.priority_level; @@ -887,10 +887,10 @@ ogs_pkbuf_t *s1ap_build_e_rab_setup_request( e_rab = &item->value.choice.E_RABToBeSetupItemBearerSUReq; - e_rab->e_RAB_ID = *(bearer->ebi); + e_rab->e_RAB_ID = bearer->ebi; e_rab->e_RABlevelQoSParameters.qCI = bearer->qos.qci; - ogs_debug(" EBI[%d] QCI[%d]", *(bearer->ebi), bearer->qos.qci); + ogs_debug(" EBI[%d] QCI[%d]", bearer->ebi, bearer->qos.qci); e_rab->e_RABlevelQoSParameters.allocationRetentionPriority. priorityLevel = bearer->qos.arp.priority_level; @@ -1024,10 +1024,10 @@ ogs_pkbuf_t *s1ap_build_e_rab_modify_request( e_rab = &item->value.choice.E_RABToBeModifiedItemBearerModReq; - e_rab->e_RAB_ID = *(bearer->ebi); + e_rab->e_RAB_ID = bearer->ebi; e_rab->e_RABLevelQoSParameters.qCI = bearer->qos.qci; - ogs_debug(" EBI[%d] QCI[%d]", *(bearer->ebi), bearer->qos.qci); + ogs_debug(" EBI[%d] QCI[%d]", bearer->ebi, bearer->qos.qci); e_rab->e_RABLevelQoSParameters.allocationRetentionPriority. priorityLevel = bearer->qos.arp.priority_level; @@ -1184,12 +1184,12 @@ ogs_pkbuf_t *s1ap_build_e_rab_release_command( e_rab = &item->value.choice.E_RABItem; - e_rab->e_RAB_ID = *(bearer->ebi); + e_rab->e_RAB_ID = bearer->ebi; e_rab->cause.present = group; e_rab->cause.choice.radioNetwork = cause; ogs_debug(" EBI[%d] Gruop[%d] Cause[%d]", - *(bearer->ebi), group, (int)cause); + bearer->ebi, group, (int)cause); nasPdu->size = esmbuf->len; nasPdu->buf = CALLOC(nasPdu->size, sizeof(uint8_t)); @@ -1636,7 +1636,7 @@ ogs_pkbuf_t *s1ap_build_handover_command(enb_ue_t *source_ue) e_rab = &item->value.choice.E_RABDataForwardingItem; ogs_assert(e_rab); - e_rab->e_RAB_ID = *(bearer->ebi); + e_rab->e_RAB_ID = bearer->ebi; } if (MME_HAVE_SGW_DL_INDIRECT_TUNNEL(bearer)) { @@ -1930,7 +1930,7 @@ ogs_pkbuf_t *s1ap_build_handover_request( e_rab = &item->value.choice.E_RABToBeSetupItemHOReq; - e_rab->e_RAB_ID = *(bearer->ebi); + e_rab->e_RAB_ID = bearer->ebi; e_rab->e_RABlevelQosParameters.qCI = bearer->qos.qci; e_rab->e_RABlevelQosParameters.allocationRetentionPriority. diff --git a/src/mme/s1ap-handler.c b/src/mme/s1ap-handler.c index 20c90557e..64787f44b 100644 --- a/src/mme/s1ap-handler.c +++ b/src/mme/s1ap-handler.c @@ -520,7 +520,7 @@ void s1ap_handle_initial_context_setup_response( ogs_assert(rv == OGS_OK); ogs_debug(" EBI[%d] ENB-S1U-TEID[%d]", - *(bearer->ebi), bearer->enb_s1u_teid); + bearer->ebi, bearer->enb_s1u_teid); if (OGS_FSM_CHECK(&bearer->sm, esm_state_active)) { ogs_debug(" NAS_EPS Type[%d]", mme_ue->nas_eps.type); @@ -815,14 +815,14 @@ void s1ap_handle_e_rab_setup_response( &e_rab->transportLayerAddress, &bearer->enb_s1u_ip); ogs_assert(rv == OGS_OK); - ogs_debug(" EBI[%d]", *(bearer->ebi)); + ogs_debug(" EBI[%d]", bearer->ebi); if (OGS_FSM_CHECK(&bearer->sm, esm_state_active)) { mme_bearer_t *linked_bearer = mme_linked_bearer(bearer); ogs_assert(linked_bearer); - ogs_debug(" Linked-EBI[%d]", *(linked_bearer->ebi)); + ogs_debug(" Linked-EBI[%d]", linked_bearer->ebi); - if (*(bearer->ebi) == *(linked_bearer->ebi)) { + if (bearer->ebi == linked_bearer->ebi) { mme_gtp_send_modify_bearer_request(bearer, 0); } else { mme_gtp_send_create_bearer_response(bearer); diff --git a/src/smf/context.c b/src/smf/context.c index e5a924b69..97b6b78da 100644 --- a/src/smf/context.c +++ b/src/smf/context.c @@ -668,12 +668,7 @@ smf_sess_t *smf_sess_add_by_apn(smf_ue_t *smf_ue, char *apn) } memset(sess, 0, sizeof *sess); - ogs_pool_init(&sess->pfcp.pdr_pool, OGS_MAX_NUM_OF_PDR); - ogs_pool_init(&sess->pfcp.far_pool, OGS_MAX_NUM_OF_FAR); - ogs_pool_init(&sess->pfcp.urr_pool, OGS_MAX_NUM_OF_URR); - ogs_pool_init(&sess->pfcp.qer_pool, OGS_MAX_NUM_OF_QER); - ogs_pool_init(&sess->pfcp.bar_pool, OGS_MAX_NUM_OF_BAR); - + ogs_pfcp_pool_init(&sess->pfcp); smf_qfi_pool_init(sess); sess->index = ogs_pool_index(&smf_sess_pool, sess); @@ -980,7 +975,7 @@ void smf_sess_remove(smf_sess_t *sess) smf_bearer_remove_all(sess); ogs_pfcp_pool_final(&sess->pfcp); - ogs_pool_final(&sess->qfi_pool); + smf_qfi_pool_final(sess); ogs_pool_free(&smf_sess_pool, sess); } @@ -1150,10 +1145,10 @@ smf_bearer_t *smf_qos_flow_add(smf_sess_t *sess) ogs_pfcp_pdr_associate_qer(ul_pdr, qer); /* Allocate QFI */ - ogs_pool_alloc(&sess->qfi_pool, &qos_flow->qfi); - ogs_assert(qos_flow->qfi); + ogs_pool_alloc(&sess->qfi_pool, &qos_flow->qfi_node); + ogs_assert(qos_flow->qfi_node); - ul_pdr->qfi = qer->qfi = *(qos_flow->qfi); + qos_flow->qfi = ul_pdr->qfi = qer->qfi = *(qos_flow->qfi_node); qos_flow->sess = sess; @@ -1168,7 +1163,7 @@ smf_bearer_t *smf_qos_flow_find_by_qfi(smf_sess_t *sess, uint8_t qfi) ogs_assert(sess); ogs_list_for_each(&sess->bearer_list, qos_flow) { - if (*(qos_flow->qfi) == qfi) + if (qos_flow->qfi == qfi) return qos_flow; } @@ -1191,7 +1186,7 @@ smf_bearer_t *smf_bearer_add(smf_sess_t *sess) ogs_assert(bearer); memset(bearer, 0, sizeof *bearer); - ogs_pool_init(&bearer->pf_pool, OGS_MAX_NUM_OF_PF); + ogs_index_init(&bearer->pf_pool, OGS_MAX_NUM_OF_PF); bearer->index = ogs_pool_index(&smf_bearer_pool, bearer); ogs_assert(bearer->index > 0 && bearer->index <= @@ -1308,10 +1303,10 @@ int smf_bearer_remove(smf_bearer_t *bearer) smf_pf_remove_all(bearer); - ogs_pool_final(&bearer->pf_pool); + ogs_index_final(&bearer->pf_pool); - if (bearer->qfi) - ogs_pool_free(&bearer->sess->qfi_pool, bearer->qfi); + if (bearer->qfi_node) + ogs_pool_free(&bearer->sess->qfi_pool, bearer->qfi_node); ogs_pool_free(&smf_bearer_pool, bearer); @@ -1679,7 +1674,7 @@ void smf_qfi_pool_init(smf_sess_t *sess) ogs_assert(sess); - ogs_pool_init(&sess->qfi_pool, OGS_MAX_QOS_FLOW_ID); + ogs_index_init(&sess->qfi_pool, OGS_MAX_QOS_FLOW_ID); for (i = 1; i <= OGS_MAX_QOS_FLOW_ID; i++) { sess->qfi_pool.array[i-1] = i; @@ -1688,5 +1683,5 @@ void smf_qfi_pool_init(smf_sess_t *sess) void smf_qfi_pool_final(smf_sess_t *sess) { - ogs_pool_final_skip_mem_checks(&sess->qfi_pool); + ogs_index_final(&sess->qfi_pool); } diff --git a/src/smf/context.h b/src/smf/context.h index 85f5c61b7..4c6f5e705 100644 --- a/src/smf/context.h +++ b/src/smf/context.h @@ -158,8 +158,9 @@ typedef struct smf_bearer_s { ogs_pfcp_far_t *ul_far; ogs_pfcp_qer_t *qer; - uint8_t *qfi; /* 5GC */ - uint8_t ebi; /* EPC */ + uint8_t *qfi_node; /* Pool-Node for 5GC-QFI */ + uint8_t qfi; /* 5G Core QFI */ + uint8_t ebi; /* EPC EBI */ uint32_t pgw_s5u_teid; /* PGW-S5U TEID */ ogs_sockaddr_t *pgw_s5u_addr; /* PGW-S5U IPv4 */ diff --git a/src/smf/gsm-build.c b/src/smf/gsm-build.c index 7a644804c..65bb45820 100644 --- a/src/smf/gsm-build.c +++ b/src/smf/gsm-build.c @@ -127,7 +127,7 @@ ogs_pkbuf_t *gsm_build_pdu_session_establishment_accept(smf_sess_t *sess) */ qos_rule[0].precedence = 255; /* lowest precedence */ qos_rule[0].flow.segregation = 0; - qos_rule[0].flow.identifier = *(qos_flow->qfi); + qos_rule[0].flow.identifier = qos_flow->qfi; ogs_nas_build_qos_rules(authorized_qos_rules, qos_rule, 1); @@ -180,7 +180,7 @@ ogs_pkbuf_t *gsm_build_pdu_session_establishment_accept(smf_sess_t *sess) /* QoS flow descriptions */ memset(&qos_flow_description, 0, sizeof(qos_flow_description)); - qos_flow_description.identifier = *(qos_flow->qfi); + qos_flow_description.identifier = qos_flow->qfi; qos_flow_description.code = OGS_NAS_CREATE_NEW_QOS_FLOW_DESCRIPTION; qos_flow_description.E = 1; qos_flow_description.num_of_parameter = 1; diff --git a/src/smf/ngap-build.c b/src/smf/ngap-build.c index f3d4d0819..47e5529c9 100644 --- a/src/smf/ngap-build.c +++ b/src/smf/ngap-build.c @@ -132,7 +132,7 @@ ogs_pkbuf_t *ngap_build_pdu_session_resource_setup_request_transfer( qosCharacteristics->choice.nonDynamic5QI = nonDynamic5QI; qosCharacteristics->present = NGAP_QosCharacteristics_PR_nonDynamic5QI; - *qosFlowIdentifier = *(qos_flow->qfi); + *qosFlowIdentifier = qos_flow->qfi; nonDynamic5QI->fiveQI = sess->pdn.qos.qci; diff --git a/tests/app/5gc-init.c b/tests/app/5gc-init.c index 89ae69e94..610cc6e5f 100644 --- a/tests/app/5gc-init.c +++ b/tests/app/5gc-init.c @@ -49,23 +49,23 @@ int app_initialize(const char *const argv[]) if (ogs_app()->parameter.no_nrf == 0) nrf_thread = test_child_create("nrf", argv_out); - if (ogs_app()->parameter.no_amf == 0) - amf_thread = test_child_create("amf", argv_out); - if (ogs_app()->parameter.no_smf == 0) - smf_thread = test_child_create("smf", argv_out); - if (ogs_app()->parameter.no_upf == 0) - upf_thread = test_child_create("upf", argv_out); - if (ogs_app()->parameter.no_ausf == 0) - ausf_thread = test_child_create("ausf", argv_out); - if (ogs_app()->parameter.no_udm == 0) - udm_thread = test_child_create("udm", argv_out); if (ogs_app()->parameter.no_udr == 0) udr_thread = test_child_create("udr", argv_out); + if (ogs_app()->parameter.no_udm == 0) + udm_thread = test_child_create("udm", argv_out); + if (ogs_app()->parameter.no_ausf == 0) + ausf_thread = test_child_create("ausf", argv_out); + if (ogs_app()->parameter.no_upf == 0) + upf_thread = test_child_create("upf", argv_out); + if (ogs_app()->parameter.no_smf == 0) + smf_thread = test_child_create("smf", argv_out); + if (ogs_app()->parameter.no_amf == 0) + amf_thread = test_child_create("amf", argv_out); /* * Wait for all sockets listening * - * If freeDiameter is not used, we can use a delay of less than 1 second. + * If freeDiameter is not used, it uses a delay of less than 1 second. */ ogs_msleep(500); @@ -74,11 +74,13 @@ int app_initialize(const char *const argv[]) void app_terminate(void) { - if (smf_thread) ogs_thread_destroy(smf_thread); - if (udm_thread) ogs_thread_destroy(udm_thread); - if (ausf_thread) ogs_thread_destroy(ausf_thread); + ogs_msleep(300); + if (amf_thread) ogs_thread_destroy(amf_thread); + if (smf_thread) ogs_thread_destroy(smf_thread); if (upf_thread) ogs_thread_destroy(upf_thread); + if (ausf_thread) ogs_thread_destroy(ausf_thread); + if (udm_thread) ogs_thread_destroy(udm_thread); if (udr_thread) ogs_thread_destroy(udr_thread); if (nrf_thread) ogs_thread_destroy(nrf_thread); } diff --git a/tests/app/app-init.c b/tests/app/app-init.c index 533d29577..31a56dd6e 100644 --- a/tests/app/app-init.c +++ b/tests/app/app-init.c @@ -54,28 +54,31 @@ int app_initialize(const char *const argv[]) if (ogs_app()->parameter.no_nrf == 0) nrf_thread = test_child_create("nrf", argv_out); - if (ogs_app()->parameter.no_mme == 0) - mme_thread = test_child_create("mme", argv_out); - if (ogs_app()->parameter.no_sgwc == 0) - sgwc_thread = test_child_create("sgwc", argv_out); - if (ogs_app()->parameter.no_smf == 0) - smf_thread = test_child_create("smf", argv_out); - if (ogs_app()->parameter.no_amf == 0) - amf_thread = test_child_create("amf", argv_out); - if (ogs_app()->parameter.no_sgwu == 0) - sgwu_thread = test_child_create("sgwu", argv_out); - if (ogs_app()->parameter.no_upf == 0) - upf_thread = test_child_create("upf", argv_out); if (ogs_app()->parameter.no_hss == 0) hss_thread = test_child_create("hss", argv_out); if (ogs_app()->parameter.no_pcrf == 0) pcrf_thread = test_child_create("pcrf", argv_out); - if (ogs_app()->parameter.no_ausf == 0) - ausf_thread = test_child_create("ausf", argv_out); - if (ogs_app()->parameter.no_udm == 0) - udm_thread = test_child_create("udm", argv_out); + if (ogs_app()->parameter.no_udr == 0) udr_thread = test_child_create("udr", argv_out); + if (ogs_app()->parameter.no_udm == 0) + udm_thread = test_child_create("udm", argv_out); + if (ogs_app()->parameter.no_ausf == 0) + ausf_thread = test_child_create("ausf", argv_out); + + if (ogs_app()->parameter.no_upf == 0) + upf_thread = test_child_create("upf", argv_out); + if (ogs_app()->parameter.no_sgwu == 0) + sgwu_thread = test_child_create("sgwu", argv_out); + + if (ogs_app()->parameter.no_smf == 0) + smf_thread = test_child_create("smf", argv_out); + if (ogs_app()->parameter.no_sgwc == 0) + sgwc_thread = test_child_create("sgwc", argv_out); + if (ogs_app()->parameter.no_mme == 0) + mme_thread = test_child_create("mme", argv_out); + if (ogs_app()->parameter.no_amf == 0) + amf_thread = test_child_create("amf", argv_out); /* * Wait for all sockets listening @@ -89,20 +92,23 @@ int app_initialize(const char *const argv[]) void app_terminate(void) { - if (udr_thread) ogs_thread_destroy(udr_thread); - if (udm_thread) ogs_thread_destroy(udm_thread); - if (ausf_thread) ogs_thread_destroy(ausf_thread); + ogs_msleep(300); if (amf_thread) ogs_thread_destroy(amf_thread); if (mme_thread) ogs_thread_destroy(mme_thread); + if (sgwc_thread) ogs_thread_destroy(sgwc_thread); if (smf_thread) ogs_thread_destroy(smf_thread); - if (sgwc_thread) ogs_thread_destroy(sgwc_thread); if (sgwu_thread) ogs_thread_destroy(sgwu_thread); if (upf_thread) ogs_thread_destroy(upf_thread); + if (ausf_thread) ogs_thread_destroy(ausf_thread); + if (udm_thread) ogs_thread_destroy(udm_thread); + if (udr_thread) ogs_thread_destroy(udr_thread); + if (hss_thread) ogs_thread_destroy(hss_thread); if (pcrf_thread) ogs_thread_destroy(pcrf_thread); + if (nrf_thread) ogs_thread_destroy(nrf_thread); } diff --git a/tests/app/epc-init.c b/tests/app/epc-init.c index 4675e7bf1..614d9a26f 100644 --- a/tests/app/epc-init.c +++ b/tests/app/epc-init.c @@ -50,21 +50,23 @@ int app_initialize(const char *const argv[]) if (ogs_app()->parameter.no_nrf == 0) nrf_thread = test_child_create("nrf", argv_out); - if (ogs_app()->parameter.no_mme == 0) - mme_thread = test_child_create("mme", argv_out); - if (ogs_app()->parameter.no_sgwc == 0) - sgwc_thread = test_child_create("sgwc", argv_out); - if (ogs_app()->parameter.no_smf == 0) - smf_thread = test_child_create("smf", argv_out); - if (ogs_app()->parameter.no_sgwu == 0) - sgwu_thread = test_child_create("sgwu", argv_out); - if (ogs_app()->parameter.no_upf == 0) - upf_thread = test_child_create("upf", argv_out); if (ogs_app()->parameter.no_hss == 0) hss_thread = test_child_create("hss", argv_out); if (ogs_app()->parameter.no_pcrf == 0) pcrf_thread = test_child_create("pcrf", argv_out); + if (ogs_app()->parameter.no_upf == 0) + upf_thread = test_child_create("upf", argv_out); + if (ogs_app()->parameter.no_sgwu == 0) + sgwu_thread = test_child_create("sgwu", argv_out); + + if (ogs_app()->parameter.no_smf == 0) + smf_thread = test_child_create("smf", argv_out); + if (ogs_app()->parameter.no_sgwc == 0) + sgwc_thread = test_child_create("sgwc", argv_out); + if (ogs_app()->parameter.no_mme == 0) + mme_thread = test_child_create("mme", argv_out); + /* * Wait for all sockets listening * @@ -77,6 +79,8 @@ int app_initialize(const char *const argv[]) void app_terminate(void) { + ogs_msleep(300); + if (mme_thread) ogs_thread_destroy(mme_thread); if (sgwc_thread) ogs_thread_destroy(sgwc_thread); if (smf_thread) ogs_thread_destroy(smf_thread);