forked from acouzens/open5gs
Follow-up on #1797
This commit is contained in:
parent
be2af54682
commit
dc6ca962bb
|
@ -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;
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue