From 8d55964bcc8d0f9f2c607a235418172c101a1ead Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Thu, 8 Oct 2020 22:54:13 -0400 Subject: [PATCH] Change buffering instead of deleting [#592] --- lib/pfcp/handler.c | 11 ++++---- src/amf/context.c | 48 +++++---------------------------- src/amf/ngap-handler.c | 10 ++++++- src/mme/emm-handler.c | 5 ---- src/mme/mme-context.c | 49 +++++++++++++--------------------- src/mme/mme-context.h | 4 +-- src/mme/mme-path.c | 39 --------------------------- src/mme/mme-sm.c | 3 +-- src/mme/s1ap-handler.c | 15 ++++++----- src/sgwc/gtp-path.c | 11 -------- tests/attach/ue-context-test.c | 2 +- 11 files changed, 53 insertions(+), 144 deletions(-) diff --git a/lib/pfcp/handler.c b/lib/pfcp/handler.c index 276dfda28..f46fba896 100644 --- a/lib/pfcp/handler.c +++ b/lib/pfcp/handler.c @@ -631,12 +631,13 @@ ogs_pfcp_far_t *ogs_pfcp_handle_update_far(ogs_pfcp_sess_t *sess, if (message->apply_action.presence) far->apply_action = message->apply_action.u8; - if (message->update_forwarding_parameters.destination_interface.presence) { - far->dst_if = message->update_forwarding_parameters. - destination_interface.u8; - } - if (message->update_forwarding_parameters.presence) { + if (message->update_forwarding_parameters. + destination_interface.presence) { + far->dst_if = message->update_forwarding_parameters. + destination_interface.u8; + } + if (message->update_forwarding_parameters. outer_header_creation.presence) { ogs_pfcp_tlv_outer_header_creation_t *outer_header_creation = diff --git a/src/amf/context.c b/src/amf/context.c index 971f7f31d..4174b216c 100644 --- a/src/amf/context.c +++ b/src/amf/context.c @@ -1308,9 +1308,9 @@ amf_ue_t *amf_ue_find_by_message(ogs_nas_5gs_message_t *message) amf_ue = amf_ue_find_by_suci(suci); if (amf_ue) { - ogs_trace("[%s] known UE by SUCI", suci); + ogs_info("[%s] known UE by SUCI", suci); } else { - ogs_trace("[%s] Unknown UE by SUCI", suci); + ogs_info("[%s] Unknown UE by SUCI", suci); } ogs_free(suci); break; @@ -1329,7 +1329,8 @@ amf_ue_t *amf_ue_find_by_message(ogs_nas_5gs_message_t *message) amf_ue = amf_ue_find_by_guti(&nas_guti); if (amf_ue) { - ogs_debug("Known UE by 5G-S_TMSI[AMF_ID:0x%x,M_TMSI:0x%x]", + ogs_info("[%s] Known UE by 5G-S_TMSI[AMF_ID:0x%x,M_TMSI:0x%x]", + amf_ue->suci ? amf_ue->suci : "Unknown", ogs_amf_id_hexdump(&nas_guti.amf_id), nas_guti.m_tmsi); } else { ogs_warn("Unknown UE by 5G-S_TMSI[AMF_ID:0x%x,M_TMSI:0x%x]", @@ -1341,40 +1342,6 @@ amf_ue_t *amf_ue_find_by_message(ogs_nas_5gs_message_t *message) } break; -#if 0 - case OGS_NAS_5GS_TRACKING_AREA_UPDATE_REQUEST: - tau_request = &message->gmm.tracking_area_update_request; - eps_mobile_identity = &tau_request->old_guti; - - switch(eps_mobile_identity->imsi.type) { - case OGS_NAS_5GS_MOBILE_IDENTITY_GUTI: - eps_mobile_identity_guti = &eps_mobile_identity->guti; - - ogs_nas_guti.nas_plmn_id = eps_mobile_identity_guti->nas_plmn_id; - ogs_nas_guti.amf_gid = eps_mobile_identity_guti->amf_gid; - ogs_nas_guti.amf_code = eps_mobile_identity_guti->amf_code; - ogs_nas_guti.m_tmsi = eps_mobile_identity_guti->m_tmsi; - - amf_ue = amf_ue_find_by_guti(&ogs_nas_guti); - if (amf_ue) { - ogs_trace("Known UE by GUTI[G:%d,C:%d,M_TMSI:0x%x]", - ogs_nas_guti.amf_gid, - ogs_nas_guti.amf_code, - ogs_nas_guti.m_tmsi); - } else { - ogs_warn("Unknown UE by GUTI[G:%d,C:%d,M_TMSI:0x%x]", - ogs_nas_guti.amf_gid, - ogs_nas_guti.amf_code, - ogs_nas_guti.m_tmsi); - } - break; - default: - ogs_error("Unknown IMSI type [%d]", eps_mobile_identity->imsi.type); - break; - } - break; - -#endif default: break; } @@ -1400,12 +1367,11 @@ void amf_ue_set_suci(amf_ue_t *amf_ue, /* Check if OLD amf_ue_t is different with NEW amf_ue_t */ if (ogs_pool_index(&amf_ue_pool, amf_ue) != ogs_pool_index(&amf_ue_pool, old_amf_ue)) { - ogs_warn("[%s] OLD UE Context Release", suci); if (CM_CONNECTED(old_amf_ue)) { - /* Implcit NG release */ - ogs_debug("[%s] Implicit NG release", suci); - ogs_debug("[%s] RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", + /* Implcit NG release */ + ogs_warn("[%s] Implicit NG release", suci); + ogs_warn("[%s] RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", old_amf_ue->suci, old_amf_ue->ran_ue->ran_ue_ngap_id, (long long)old_amf_ue->ran_ue->amf_ue_ngap_id); ran_ue_remove(old_amf_ue->ran_ue); diff --git a/src/amf/ngap-handler.c b/src/amf/ngap-handler.c index 0f9b43e05..f883f213b 100644 --- a/src/amf/ngap-handler.c +++ b/src/amf/ngap-handler.c @@ -907,8 +907,13 @@ void ngap_handle_initial_context_setup_failure( if (amf_ue) { old_xact_count = amf_sess_xact_count(amf_ue); +#if 0 /* change buffering instead of deletion */ amf_sbi_send_release_all_sessions(amf_ue, AMF_RELEASE_SM_CONTEXT_NG_CONTEXT_REMOVE); +#else + amf_sbi_send_deactivate_all_sessions( + amf_ue, Cause->present, (int)Cause->choice.radioNetwork); +#endif new_xact_count = amf_sess_xact_count(amf_ue); } @@ -1161,8 +1166,11 @@ void ngap_handle_ue_context_release_action(ran_ue_t *ran_ue) amf_ue = ran_ue->amf_ue; - ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", + ogs_info("UE Context Release [Action:%d]", ran_ue->ue_ctx_rel_action); + ogs_info(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]", ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id); + if (amf_ue) + ogs_info(" SUCI[%s]", amf_ue->suci ? amf_ue->suci : "Unknown"); switch (ran_ue->ue_ctx_rel_action) { case NGAP_UE_CTX_REL_NG_CONTEXT_REMOVE: diff --git a/src/mme/emm-handler.c b/src/mme/emm-handler.c index 72a440ffe..38b4dcd80 100644 --- a/src/mme/emm-handler.c +++ b/src/mme/emm-handler.c @@ -464,11 +464,6 @@ int emm_handle_tau_request(mme_ue_t *mme_ue, CLEAR_MME_UE_ALL_TIMERS(mme_ue); CLEAR_SERVICE_INDICATOR(mme_ue); - if (BEARER_CONTEXT_IS_ACTIVE(mme_ue)) - ogs_debug(" Bearer-Active"); - else - ogs_debug(" Bearer-Inactive"); - if (mme_ue->nas_eps.update.active_flag) ogs_debug(" Active flag"); else diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index db844f779..80e0bc4e0 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -2407,9 +2407,9 @@ mme_ue_t *mme_ue_find_by_message(ogs_nas_eps_message_t *message) mme_ue = mme_ue_find_by_imsi_bcd(imsi_bcd); if (mme_ue) { - ogs_trace("known UE by IMSI[%s]", imsi_bcd); + ogs_info("[%s] known UE by IMSI", imsi_bcd); } else { - ogs_trace("Unknown UE by IMSI[%s]", imsi_bcd); + ogs_info("[%s] Unknown UE by IMSI", imsi_bcd); } break; case OGS_NAS_EPS_MOBILE_IDENTITY_GUTI: @@ -2422,7 +2422,8 @@ mme_ue_t *mme_ue_find_by_message(ogs_nas_eps_message_t *message) mme_ue = mme_ue_find_by_guti(&ogs_nas_guti); if (mme_ue) { - ogs_trace("Known UE by GUTI[G:%d,C:%d,M_TMSI:0x%x]", + ogs_info("[%s] Known UE by GUTI[G:%d,C:%d,M_TMSI:0x%x]", + mme_ue->imsi_bcd, ogs_nas_guti.mme_gid, ogs_nas_guti.mme_code, ogs_nas_guti.m_tmsi); @@ -2456,7 +2457,8 @@ mme_ue_t *mme_ue_find_by_message(ogs_nas_eps_message_t *message) mme_ue = mme_ue_find_by_guti(&ogs_nas_guti); if (mme_ue) { - ogs_trace("Known UE by GUTI[G:%d,C:%d,M_TMSI:0x%x]", + ogs_info("[%s] Known UE by GUTI[G:%d,C:%d,M_TMSI:0x%x]", + mme_ue->imsi_bcd, ogs_nas_guti.mme_gid, ogs_nas_guti.mme_code, ogs_nas_guti.m_tmsi); @@ -2490,12 +2492,13 @@ mme_ue_t *mme_ue_find_by_message(ogs_nas_eps_message_t *message) mme_ue = mme_ue_find_by_guti(&ogs_nas_guti); if (mme_ue) { - ogs_trace("Known UE by GUTI[G:%d,C:%d,M_TMSI:0x%x]", + ogs_info("[%s] Known UE by GUTI[G:%d,C:%d,M_TMSI:0x%x]", + mme_ue->imsi_bcd, ogs_nas_guti.mme_gid, ogs_nas_guti.mme_code, ogs_nas_guti.m_tmsi); } else { - ogs_warn("Unknown UE by GUTI[G:%d,C:%d,M_TMSI:0x%x]", + ogs_info("Unknown UE by GUTI[G:%d,C:%d,M_TMSI:0x%x]", ogs_nas_guti.mme_gid, ogs_nas_guti.mme_code, ogs_nas_guti.m_tmsi); @@ -2527,9 +2530,16 @@ int mme_ue_set_imsi(mme_ue_t *mme_ue, char *imsi_bcd) /* Check if OLD mme_ue_t is different with NEW mme_ue_t */ if (ogs_pool_index(&mme_ue_pool, mme_ue) != ogs_pool_index(&mme_ue_pool, old_mme_ue)) { - ogs_warn("OLD UE Context Release [IMSI:%s]", mme_ue->imsi_bcd); - if (old_mme_ue->enb_ue) - enb_ue_deassociate(old_mme_ue->enb_ue); + ogs_warn("[%s] OLD UE Context Release", mme_ue->imsi_bcd); + if (ECM_CONNECTED(old_mme_ue)) { + /* Implcit S1 release */ + ogs_warn("[%s] Implicit S1 release", mme_ue->imsi_bcd); + ogs_warn("[%s] ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", + old_mme_ue->imsi_bcd, + old_mme_ue->enb_ue->enb_ue_s1ap_id, + old_mme_ue->enb_ue->mme_ue_s1ap_id); + enb_ue_remove(old_mme_ue->enb_ue); + } mme_ue_remove(old_mme_ue); } } @@ -3066,27 +3076,6 @@ mme_bearer_t *mme_bearer_next(mme_bearer_t *bearer) return ogs_list_next(bearer); } -int mme_bearer_is_inactive(mme_ue_t *mme_ue) -{ - mme_sess_t *sess = NULL; - ogs_assert(mme_ue); - - sess = mme_sess_first(mme_ue); - while (sess) { - mme_bearer_t *bearer = mme_bearer_first(sess); - while (bearer) { - if (MME_HAVE_ENB_S1U_PATH(bearer)) { - return 0; - } - - bearer = mme_bearer_next(bearer); - } - sess = mme_sess_next(sess); - } - - return 1; -} - int mme_bearer_set_inactive(mme_ue_t *mme_ue) { mme_sess_t *sess = NULL; diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index 710b253ad..efc60ddea 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -554,9 +554,7 @@ typedef struct mme_sess_s { ogs_tlv_octet_t pgw_pco; } mme_sess_t; -#define BEARER_CONTEXT_IS_ACTIVE(__mME) \ - (mme_bearer_is_inactive(__mME) == 0) -#define CLEAR_BEARER_CONTEXT(__mME) \ +#define CLEAR_BEARER_CONTEXT(__mME) \ mme_bearer_set_inactive(__mME) #define MME_HAVE_ENB_S1U_PATH(__bEARER) \ diff --git a/src/mme/mme-path.c b/src/mme/mme-path.c index eab7c059b..bc71d522c 100644 --- a/src/mme/mme-path.c +++ b/src/mme/mme-path.c @@ -51,7 +51,6 @@ void mme_send_delete_session_or_mme_ue_context_release(mme_ue_t *mme_ue) } } -#if 1 void mme_send_release_access_bearer_or_ue_context_release(enb_ue_t *enb_ue) { mme_ue_t *mme_ue = NULL; @@ -68,41 +67,3 @@ void mme_send_release_access_bearer_or_ue_context_release(enb_ue_t *enb_ue) S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0); } } -#else -void mme_send_delete_session_or_enb_ue_context_release(enb_ue_t *enb_ue) -{ - mme_ue_t *mme_ue = NULL; - ogs_assert(enb_ue); - - mme_ue = enb_ue->mme_ue; - if (mme_ue && SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) { - mme_gtp_send_delete_all_sessions(mme_ue); - } else { - s1ap_send_ue_context_release_command(enb_ue, - S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, - S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0); - } -} - -void mme_send_release_access_bearer_or_ue_context_release(enb_ue_t *enb_ue) -{ - mme_ue_t *mme_ue = NULL; - ogs_assert(enb_ue); - - mme_ue = enb_ue->mme_ue; - if (mme_ue) { - if (BEARER_CONTEXT_IS_ACTIVE(mme_ue)) { - ogs_debug("[%s] EMM-Registered", mme_ue->imsi_bcd); - mme_gtp_send_release_access_bearers_request(mme_ue); - } else { - ogs_warn("[%s] No EMM-Registered", mme_ue->imsi_bcd); - mme_send_delete_session_or_mme_ue_context_release(mme_ue); - } - } else { - ogs_debug("No UE Context"); - s1ap_send_ue_context_release_command(enb_ue, - S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, - S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0); - } -} -#endif diff --git a/src/mme/mme-sm.c b/src/mme/mme-sm.c index f52c28cfe..24140c64f 100644 --- a/src/mme/mme-sm.c +++ b/src/mme/mme-sm.c @@ -283,8 +283,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) case MME_TIMER_S1_HOLDING: ogs_warn("Implicit S1 release"); ogs_warn(" ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", - enb_ue->enb_ue_s1ap_id, - enb_ue->mme_ue_s1ap_id); + enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); s1ap_handle_ue_context_release_action(enb_ue); break; default: diff --git a/src/mme/s1ap-handler.c b/src/mme/s1ap-handler.c index 46d5f8f17..848784472 100644 --- a/src/mme/s1ap-handler.c +++ b/src/mme/s1ap-handler.c @@ -684,7 +684,7 @@ void s1ap_handle_initial_context_setup_failure( * may in principle be adopted. The eNB should ensure * that no hanging resources remain at the eNB. */ -#if 1 +#if 0 if (mme_ue && SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) { mme_gtp_send_delete_all_sessions(mme_ue); } else { @@ -1125,8 +1125,11 @@ void s1ap_handle_ue_context_release_action(enb_ue_t *enb_ue) mme_ue = enb_ue->mme_ue; - ogs_debug(" ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", + ogs_info("UE Context Release [Action:%d]", enb_ue->ue_ctx_rel_action); + ogs_info(" ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id); + if (mme_ue) + ogs_info(" IMSI[%s]", mme_ue->imsi_bcd); switch (enb_ue->ue_ctx_rel_action) { case S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE: @@ -2053,7 +2056,7 @@ void s1ap_handle_s1_reset( Reset = &initiatingMessage->value.choice.Reset; ogs_assert(Reset); - ogs_debug("[MME] Reset"); + ogs_warn("[MME] Reset"); for (i = 0; i < Reset->protocolIEs.list.count; i++) { ie = Reset->protocolIEs.list.array[i]; @@ -2092,12 +2095,12 @@ void s1ap_handle_s1_reset( ogs_assert(ResetType); switch (ResetType->present) { case S1AP_ResetType_PR_s1_Interface: - ogs_debug(" S1AP_ResetType_PR_s1_Interface"); + ogs_warn(" S1AP_ResetType_PR_s1_Interface"); enb_ue_remove_in_enb(enb); break; case S1AP_ResetType_PR_partOfS1_Interface: - ogs_debug(" S1AP_ResetType_PR_partOfS1_Interface"); + ogs_warn(" S1AP_ResetType_PR_partOfS1_Interface"); partOfS1_Interface = ResetType->choice.partOfS1_Interface; ogs_assert(partOfS1_Interface); @@ -2114,7 +2117,7 @@ void s1ap_handle_s1_reset( item = &ie2->value.choice.UE_associatedLogicalS1_ConnectionItem; ogs_assert(item); - ogs_debug(" MME_UE_S1AP_ID[%d] ENB_UE_S1AP_ID[%d]", + ogs_warn(" MME_UE_S1AP_ID[%d] ENB_UE_S1AP_ID[%d]", item->mME_UE_S1AP_ID ? (int)*item->mME_UE_S1AP_ID : -1, item->eNB_UE_S1AP_ID ? (int)*item->eNB_UE_S1AP_ID : -1); diff --git a/src/sgwc/gtp-path.c b/src/sgwc/gtp-path.c index 5ec19a2c7..a32801609 100644 --- a/src/sgwc/gtp-path.c +++ b/src/sgwc/gtp-path.c @@ -19,8 +19,6 @@ #include "gtp-path.h" -static ogs_pkbuf_pool_t *packet_pool = NULL; - static void _gtpv2_c_recv_cb(short when, ogs_socket_t fd, void *data) { sgwc_event_t *e = NULL; @@ -107,13 +105,6 @@ int sgwc_gtp_open(void) ogs_socknode_t *node = NULL; ogs_sock_t *sock = NULL; - ogs_pkbuf_config_t config; - memset(&config, 0, sizeof config); - - config.cluster_8192_pool = ogs_app()->pool.packet; - - packet_pool = ogs_pkbuf_pool_create(&config); - ogs_list_for_each(&sgwc_self()->gtpc_list, node) { sock = ogs_gtp_server(node); ogs_assert(sock); @@ -146,8 +137,6 @@ void sgwc_gtp_close(void) { ogs_socknode_remove_all(&sgwc_self()->gtpc_list); ogs_socknode_remove_all(&sgwc_self()->gtpc_list6); - - ogs_pkbuf_pool_destroy(packet_pool); } void sgwc_gtp_send_downlink_data_notification( diff --git a/tests/attach/ue-context-test.c b/tests/attach/ue-context-test.c index 35d530a9c..90827bc2f 100644 --- a/tests/attach/ue-context-test.c +++ b/tests/attach/ue-context-test.c @@ -1002,7 +1002,7 @@ static void test3_func(abts_case *tc, void *data) /* Send Service Request */ emmbuf = testemm_build_service_request(test_ue); ABTS_PTR_NOTNULL(tc, emmbuf); -#if 0 +#if 1 /* * In s1ap_handle_initial_context_setup_failure(), * Use mme_send_release_access_bearer_or_ue_context_release(enb_ue);