diff --git a/lib/gtp/xact.h b/lib/gtp/xact.h index 01b4c43be..91c840f2c 100644 --- a/lib/gtp/xact.h +++ b/lib/gtp/xact.h @@ -96,16 +96,15 @@ typedef struct ogs_gtp_xact_s { #define OGS_GTP_MODIFY_QOS_UPDATE ((uint64_t)1<<1) uint64_t update_flags; -#define OGS_GTP_DELETE_NO_ACTION 1 -#define OGS_GTP_DELETE_SEND_AUTHENTICATION_REQUEST 2 -#define OGS_GTP_DELETE_SEND_DETACH_ACCEPT 3 -#define OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST 4 -#define OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_REMOVE 5 -#define OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_PURGE_AND_REMOVE 6 -#define OGS_GTP_DELETE_SEND_RELEASE_WITH_S1_REMOVE_AND_UNLINK 7 -#define OGS_GTP_DELETE_HANDLE_PDN_CONNECTIVITY_REQUEST 8 -#define OGS_GTP_DELETE_UE_CONTEXT_REMOVE_PARTIAL 9 -#define OGS_GTP_DELETE_IN_PATH_SWITCH_REQUEST 10 +#define OGS_GTP_DELETE_NO_ACTION 1 +#define OGS_GTP_DELETE_SEND_AUTHENTICATION_REQUEST 2 +#define OGS_GTP_DELETE_SEND_DETACH_ACCEPT 3 +#define OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST 4 +#define OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_REMOVE 5 +#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_IN_PATH_SWITCH_REQUEST 9 int delete_action; diff --git a/src/mme/esm-sm.c b/src/mme/esm-sm.c index 642c04df4..4cb31ac89 100644 --- a/src/mme/esm-sm.c +++ b/src/mme/esm-sm.c @@ -145,7 +145,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e) ogs_assert(OGS_OK == s1ap_send_ue_context_release_command(mme_ue->enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, - S1AP_UE_CTX_REL_UE_CONTEXT_PURGE_AND_REMOVE, 0)); + S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0)); OGS_FSM_TRAN(s, &esm_state_exception); break; } @@ -160,7 +160,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e) ogs_assert(OGS_OK == s1ap_send_ue_context_release_command(mme_ue->enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, - S1AP_UE_CTX_REL_UE_CONTEXT_PURGE_AND_REMOVE, 0)); + S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0)); OGS_FSM_TRAN(s, &esm_state_exception); break; } diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index ff6977f4b..22ec783bd 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -262,11 +262,10 @@ struct enb_ue_s { #define S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE 1 #define S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK 2 #define S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE 3 -#define S1AP_UE_CTX_REL_UE_CONTEXT_PURGE_AND_REMOVE 4 -#define S1AP_UE_CTX_REL_S1_HANDOVER_COMPLETE 5 -#define S1AP_UE_CTX_REL_S1_HANDOVER_CANCEL 6 -#define S1AP_UE_CTX_REL_S1_HANDOVER_FAILURE 7 -#define S1AP_UE_CTX_REL_S1_PAGING 8 +#define S1AP_UE_CTX_REL_S1_HANDOVER_COMPLETE 4 +#define S1AP_UE_CTX_REL_S1_HANDOVER_CANCEL 5 +#define S1AP_UE_CTX_REL_S1_HANDOVER_FAILURE 6 +#define S1AP_UE_CTX_REL_S1_PAGING 7 uint8_t ue_ctx_rel_action; bool part_of_s1_reset_requested; @@ -397,6 +396,8 @@ struct mme_ue_s { int security_context_available; int mac_failed; + bool update_location_answer_received; + /* Security Context */ ogs_nas_ue_network_capability_t ue_network_capability; ogs_nas_ms_network_capability_t ms_network_capability; diff --git a/src/mme/mme-gtp-path.c b/src/mme/mme-gtp-path.c index 9e6156371..1d601d9e9 100644 --- a/src/mme/mme-gtp-path.c +++ b/src/mme/mme-gtp-path.c @@ -134,7 +134,7 @@ static void timeout(ogs_gtp_xact_t *xact, void *data) ogs_assert(OGS_OK == s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, - S1AP_UE_CTX_REL_UE_CONTEXT_PURGE_AND_REMOVE, 0)); + S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0)); } else { ogs_warn("No S1 Context"); } diff --git a/src/mme/mme-path.c b/src/mme/mme-path.c index e0e88eba1..ea305769f 100644 --- a/src/mme/mme-path.c +++ b/src/mme/mme-path.c @@ -98,7 +98,7 @@ void mme_send_delete_session_or_mme_ue_context_release(mme_ue_t *mme_ue) if (SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) { mme_gtp_send_delete_all_sessions(mme_ue, - OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_PURGE_AND_REMOVE); + OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_REMOVE); } else { enb_ue_t *enb_ue = enb_ue_cycle(mme_ue->enb_ue); if (enb_ue) { diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index b191dccac..bfa995417 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -623,8 +623,12 @@ 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 */ { if (ECM_IDLE(mme_ue)) { - mme_ue_hash_remove(mme_ue); - mme_ue_remove(mme_ue); + if (mme_ue->update_location_answer_received == true) { + mme_s6a_send_pur(mme_ue); + } else { + mme_ue_hash_remove(mme_ue); + mme_ue_remove(mme_ue); + } } else { ogs_assert(mme_ue->enb_ue); ogs_assert(OGS_OK == @@ -634,20 +638,6 @@ void mme_s11_handle_delete_session_response( } } - } else if (action == - OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_PURGE_AND_REMOVE) { - if (mme_sess_count(mme_ue) == 1) /* Last Session */ { - if (ECM_IDLE(mme_ue)) { - mme_s6a_send_pur(mme_ue); - } else { - ogs_assert(mme_ue->enb_ue); - ogs_assert(OGS_OK == - s1ap_send_ue_context_release_command(mme_ue->enb_ue, - S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, - S1AP_UE_CTX_REL_UE_CONTEXT_PURGE_AND_REMOVE, 0)); - } - } - } else if (action == OGS_GTP_DELETE_SEND_RELEASE_WITH_S1_REMOVE_AND_UNLINK) { if (mme_sess_count(mme_ue) == 1) /* Last Session */ { diff --git a/src/mme/mme-sm.c b/src/mme/mme-sm.c index 6e631a034..a4a9d41ed 100644 --- a/src/mme/mme-sm.c +++ b/src/mme/mme-sm.c @@ -436,8 +436,10 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) ogs_assert(OGS_OK == s1ap_send_ue_context_release_command(enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, - S1AP_UE_CTX_REL_UE_CONTEXT_PURGE_AND_REMOVE, 0)); + S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0)); } + + mme_ue->update_location_answer_received = true; break; case OGS_DIAM_S6A_CMD_CODE_PURGE_UE: mme_s6a_handle_pua(mme_ue, s6a_message); diff --git a/src/mme/nas-path.c b/src/mme/nas-path.c index 6ffb35e66..5989f2822 100644 --- a/src/mme/nas-path.c +++ b/src/mme/nas-path.c @@ -346,7 +346,7 @@ int nas_eps_send_pdn_connectivity_reject( ogs_assert(OGS_OK == s1ap_send_ue_context_release_command(mme_ue->enb_ue, S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release, - S1AP_UE_CTX_REL_UE_CONTEXT_PURGE_AND_REMOVE, 0)); + S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0)); } } else { esmbuf = esm_build_pdn_connectivity_reject( diff --git a/src/mme/s1ap-handler.c b/src/mme/s1ap-handler.c index 48990b08b..52c50fbe9 100644 --- a/src/mme/s1ap-handler.c +++ b/src/mme/s1ap-handler.c @@ -1485,15 +1485,12 @@ void s1ap_handle_ue_context_release_action(enb_ue_t *enb_ue) enb_ue_remove(enb_ue); ogs_expect_or_return(mme_ue); - mme_ue_hash_remove(mme_ue); - mme_ue_remove(mme_ue); - break; - case S1AP_UE_CTX_REL_UE_CONTEXT_PURGE_AND_REMOVE: - ogs_debug(" Action: UE context remove"); - enb_ue_remove(enb_ue); - ogs_expect_or_return(mme_ue); - - mme_s6a_send_pur(mme_ue); + if (mme_ue->update_location_answer_received == true) { + mme_s6a_send_pur(mme_ue); + } else { + mme_ue_hash_remove(mme_ue); + mme_ue_remove(mme_ue); + } break; case S1AP_UE_CTX_REL_S1_HANDOVER_COMPLETE: ogs_debug(" Action: S1 handover complete");