Follow-up on #1797

This commit is contained in:
Sukchan Lee 2022-10-06 10:10:31 +09:00
parent be2af54682
commit dc6ca962bb
4 changed files with 47 additions and 44 deletions

View File

@ -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;

View File

@ -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:

View File

@ -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 */

View File

@ -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);
}
}