From dc6ca962bb7a950c83f7a7834a2c5cf21302a740 Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Thu, 6 Oct 2022 10:10:31 +0900 Subject: [PATCH] Follow-up on #1797 --- lib/gtp/xact.h | 3 +-- src/mme/mme-path.c | 14 ++-------- src/mme/mme-s11-handler.c | 20 +++++---------- src/mme/mme-s6a-handler.c | 54 +++++++++++++++++++++++++++------------ 4 files changed, 47 insertions(+), 44 deletions(-) diff --git a/lib/gtp/xact.h b/lib/gtp/xact.h index 3a3bfd3c0..91c840f2c 100644 --- a/lib/gtp/xact.h +++ b/lib/gtp/xact.h @@ -104,8 +104,7 @@ typedef struct ogs_gtp_xact_s { #define OGS_GTP_DELETE_SEND_RELEASE_WITH_S1_REMOVE_AND_UNLINK 6 #define OGS_GTP_DELETE_HANDLE_PDN_CONNECTIVITY_REQUEST 7 #define OGS_GTP_DELETE_UE_CONTEXT_REMOVE_PARTIAL 8 -#define OGS_GTP_DELETE_UE_CONTEXT_REMOVE_ALL 9 -#define OGS_GTP_DELETE_IN_PATH_SWITCH_REQUEST 10 +#define OGS_GTP_DELETE_IN_PATH_SWITCH_REQUEST 9 int delete_action; diff --git a/src/mme/mme-path.c b/src/mme/mme-path.c index c1c88e3ad..39c4bb472 100644 --- a/src/mme/mme-path.c +++ b/src/mme/mme-path.c @@ -81,13 +81,8 @@ void mme_send_delete_session_or_detach(mme_ue_t *mme_ue) case MME_DETACH_TYPE_HSS_IMPLICIT: ogs_debug("Implicit HSS Detach"); if (SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) { - if (ECM_IDLE(mme_ue)) { - mme_gtp_send_delete_all_sessions(mme_ue, - OGS_GTP_DELETE_UE_CONTEXT_REMOVE_ALL); - } else { - mme_gtp_send_delete_all_sessions(mme_ue, - OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_REMOVE); - } + mme_gtp_send_delete_all_sessions(mme_ue, + OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_REMOVE); } break; @@ -245,11 +240,6 @@ void mme_send_after_paging(mme_ue_t *mme_ue, bool failed) ogs_warn("MME-initiated Detach cannot be invoked"); } else { ogs_assert(OGS_OK == nas_eps_send_detach_request(mme_ue)); - if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { - ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); - } else { - mme_send_delete_session_or_detach(mme_ue); - } } break; default: diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index 1869d0f7a..4e11c6fab 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -594,16 +594,16 @@ void mme_s11_handle_delete_session_response( } else if (action == OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_REMOVE) { if (mme_sess_count(mme_ue) == 1) /* Last Session */ { - enb_ue_t *enb_ue = NULL; - - enb_ue = enb_ue_cycle(mme_ue->enb_ue); - if (enb_ue) { + if (ECM_IDLE(mme_ue)) { + mme_ue_hash_remove(mme_ue); + mme_ue_remove(mme_ue); + } else { + ogs_assert(mme_ue->enb_ue); ogs_assert(OGS_OK == - s1ap_send_ue_context_release_command(enb_ue, + s1ap_send_ue_context_release_command(mme_ue->enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0)); - } else - ogs_error("ENB-S1 Context has already been removed"); + } } } else if (action == @@ -640,12 +640,6 @@ void mme_s11_handle_delete_session_response( mme_ue_remove(mme_ue); return; - } else if (action == OGS_GTP_DELETE_UE_CONTEXT_REMOVE_ALL) { - /* Remove MME-UE Context and hash after Implicit Detach */ - mme_ue_hash_remove(mme_ue); - mme_ue_remove(mme_ue); - return; - } else if (action == OGS_GTP_DELETE_IN_PATH_SWITCH_REQUEST) { /* Don't have to remove Session in X2 Handover with SGW relocation */ diff --git a/src/mme/mme-s6a-handler.c b/src/mme/mme-s6a-handler.c index ba6ae6789..aa58ff750 100644 --- a/src/mme/mme-s6a-handler.c +++ b/src/mme/mme-s6a-handler.c @@ -178,6 +178,27 @@ void mme_s6a_handle_clr(mme_ue_t *mme_ue, ogs_diam_s6a_message_t *s6a_message) clr_message = &s6a_message->clr_message; ogs_assert(clr_message); + mme_ue = mme_ue_cycle(mme_ue); + if (!mme_ue) { + ogs_warn("UE(mme-ue) context has already been removed"); + return; + } + + /* + * This causes issues in this scenario: + * 1. UE attaches + * 2. UE detaches (Airplane Mode) + * 3. Cancel Location is triggered by HSS + * + * If Cancel Locations are performed, UE(mme-ue) context must be removed. + */ + if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_de_registered)) { + ogs_warn("UE has already been de-registered"); + mme_ue_hash_remove(mme_ue); + mme_ue_remove(mme_ue); + return; + } + /* Set EPS Detach */ memset(&mme_ue->nas_eps.detach, 0, sizeof(ogs_nas_detach_type_t)); @@ -202,31 +223,30 @@ void mme_s6a_handle_clr(mme_ue_t *mme_ue, ogs_diam_s6a_message_t *s6a_message) ogs_debug(" OGS_NAS_EPS TYPE[%d]", mme_ue->nas_eps.type); - if (clr_message->cancellation_type == - OGS_DIAM_S6A_CT_MME_UPDATE_PROCEDURE) { - mme_ue->detach_type = MME_DETACH_TYPE_HSS_IMPLICIT; - if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { - ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); - } else { - mme_send_delete_session_or_detach(mme_ue); - } - } else if (clr_message->cancellation_type == - OGS_DIAM_S6A_CT_SUBSCRIPTION_WITHDRAWL) { + switch (clr_message->cancellation_type) { + case OGS_DIAM_S6A_CT_SUBSCRIPTION_WITHDRAWL: mme_ue->detach_type = MME_DETACH_TYPE_HSS_EXPLICIT; if (ECM_IDLE(mme_ue)) { MME_STORE_PAGING_INFO(mme_ue, MME_PAGING_TYPE_DETACH_TO_UE, NULL); ogs_assert(OGS_OK == s1ap_send_paging(mme_ue, S1AP_CNDomain_ps)); } else { ogs_assert(OGS_OK == nas_eps_send_detach_request(mme_ue)); - if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { - ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); - } else { - mme_send_delete_session_or_detach(mme_ue); - } } - } else { - ogs_error("Unsupported Cancellation-Type [%d]", + break; + case OGS_DIAM_S6A_CT_MME_UPDATE_PROCEDURE: + mme_ue->detach_type = MME_DETACH_TYPE_HSS_IMPLICIT; + break; + default: + ogs_fatal("Unsupported Cancellation-Type [%d]", clr_message->cancellation_type); + ogs_assert_if_reached(); + break; + } + + if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); + } else { + mme_send_delete_session_or_detach(mme_ue); } }