From 5397cfd2d8063f596d4abe4270d103871b0cdb3f Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Fri, 2 Feb 2018 02:48:55 +0900 Subject: [PATCH] Send UE Context Release Command instead of Implicit S1 release --- src/mme/emm_sm.c | 2 +- src/mme/mme_context.h | 5 +++-- src/mme/mme_s11_handler.c | 2 +- src/mme/mme_sm.c | 13 +++++++++---- src/mme/nas_path.c | 4 ++-- src/mme/s1ap_handler.c | 25 +++++++++++++++++-------- 6 files changed, 33 insertions(+), 18 deletions(-) diff --git a/src/mme/emm_sm.c b/src/mme/emm_sm.c index 94916acff..783a17191 100644 --- a/src/mme/emm_sm.c +++ b/src/mme/emm_sm.c @@ -118,7 +118,7 @@ static void common_register_state(fsm_t *s, event_t *e) rv = s1ap_send_ue_context_release_command(enb_ue, S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release, - S1AP_UE_CTX_REL_NO_ACTION, 0); + S1AP_UE_CTX_REL_UNLINK_MME_UE_CONTEXT, 0); d_assert(rv == CORE_OK,, "s1ap_send_ue_context_release_command() failed"); return; diff --git a/src/mme/mme_context.h b/src/mme/mme_context.h index 7a86109f9..7efe05c2b 100644 --- a/src/mme/mme_context.h +++ b/src/mme/mme_context.h @@ -175,8 +175,9 @@ struct _enb_ue_t { * Retrieve by UE Context Release Complete */ #define S1AP_UE_CTX_REL_INVALID_ACTION 0 #define S1AP_UE_CTX_REL_NO_ACTION 1 -#define S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT 2 -#define S1AP_UE_CTX_REL_DELETE_INDIRECT_TUNNEL 3 +#define S1AP_UE_CTX_REL_UNLINK_MME_UE_CONTEXT 2 +#define S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT 3 +#define S1AP_UE_CTX_REL_DELETE_INDIRECT_TUNNEL 4 c_uint8_t ue_ctx_rel_action; /* Related Context */ diff --git a/src/mme/mme_s11_handler.c b/src/mme/mme_s11_handler.c index c7be3b6fb..ca8203d66 100644 --- a/src/mme/mme_s11_handler.c +++ b/src/mme/mme_s11_handler.c @@ -532,7 +532,7 @@ void mme_s11_handle_release_access_bearers_response( rv = s1ap_send_ue_context_release_command(enb_ue, S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release, - S1AP_UE_CTX_REL_NO_ACTION, 0); + S1AP_UE_CTX_REL_UNLINK_MME_UE_CONTEXT, 0); d_assert(rv == CORE_OK,, "s1ap send error"); } diff --git a/src/mme/mme_sm.c b/src/mme/mme_sm.c index 65fdafc52..ccf663ba6 100644 --- a/src/mme/mme_sm.c +++ b/src/mme/mme_sm.c @@ -291,15 +291,19 @@ void mme_state_operational(fsm_t *s, event_t *e) } /* If NAS(mme_ue_t) has already been associated with - * older S1(enb_ue_t) context, remove older S1 context. */ + * older S1(enb_ue_t) context, send UE context release command + * to older S1 context. */ if (mme_ue->enb_ue) { - d_warn("Implicit S1 release"); - d_warn(" ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", + d_trace(5, "OLD ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n", mme_ue->enb_ue->enb_ue_s1ap_id, mme_ue->enb_ue->mme_ue_s1ap_id); rv = enb_ue_remove(mme_ue->enb_ue); d_assert(rv == CORE_OK,,); + rv = s1ap_send_ue_context_release_command(mme_ue->enb_ue, + S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release, + S1AP_UE_CTX_REL_NO_ACTION, 0); + d_assert(rv == CORE_OK, return, "s1ap send error"); } mme_ue_associate_enb_ue(mme_ue, enb_ue); } @@ -564,7 +568,8 @@ void mme_state_operational(fsm_t *s, event_t *e) * If the MME receives a Downlink Data Notification after step 2 and * before step 9, the MME shall not send S1 interface paging messages */ - if (mme_ue->enb_ue == NULL) + if (ECM_IDLE(mme_ue) || + mme_ue->nas_eps.type != MME_EPS_TYPE_SERVICE_REQUEST) { s1ap_handle_paging(mme_ue); /* Start T3413 */ diff --git a/src/mme/nas_path.c b/src/mme/nas_path.c index 57ddf0422..66842ca22 100644 --- a/src/mme/nas_path.c +++ b/src/mme/nas_path.c @@ -212,7 +212,7 @@ status_t nas_send_detach_accept(mme_ue_t *mme_ue) rv = s1ap_send_ue_context_release_command(enb_ue, S1ap_Cause_PR_nas, S1ap_CauseNas_detach, - S1AP_UE_CTX_REL_NO_ACTION, 0); + S1AP_UE_CTX_REL_UNLINK_MME_UE_CONTEXT, 0); d_assert(rv == CORE_OK, return CORE_ERROR, "s1ap send error"); return CORE_OK; @@ -423,7 +423,7 @@ status_t nas_send_tau_accept(mme_ue_t *mme_ue) rv = s1ap_send_ue_context_release_command(enb_ue, S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release, - S1AP_UE_CTX_REL_NO_ACTION, 0); + S1AP_UE_CTX_REL_UNLINK_MME_UE_CONTEXT, 0); d_assert(rv == CORE_OK, return CORE_ERROR, "s1ap send error"); } diff --git a/src/mme/s1ap_handler.c b/src/mme/s1ap_handler.c index 9a77f46df..86c20f293 100644 --- a/src/mme/s1ap_handler.c +++ b/src/mme/s1ap_handler.c @@ -159,15 +159,17 @@ void s1ap_handle_initial_ue_message(mme_enb_t *enb, s1ap_message_t *message) ? mme_ue->imsi_bcd : "Unknown"); /* If NAS(mme_ue_t) has already been associated with - * older S1(enb_ue_t) context, remove older S1 context. */ + * older S1(enb_ue_t) context, send UE context release command + * to older S1 context. */ if (mme_ue->enb_ue) { - d_warn("Implicit S1 release"); - d_warn(" ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]", + d_trace(5, "OLD ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]\n", mme_ue->enb_ue->enb_ue_s1ap_id, mme_ue->enb_ue->mme_ue_s1ap_id); - rv = enb_ue_remove(mme_ue->enb_ue); - d_assert(rv == CORE_OK,,); + rv = s1ap_send_ue_context_release_command(mme_ue->enb_ue, + S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release, + S1AP_UE_CTX_REL_NO_ACTION, 0); + d_assert(rv == CORE_OK, return, "s1ap send error"); } mme_ue_associate_enb_ue(mme_ue, enb_ue); } @@ -406,7 +408,7 @@ void s1ap_handle_initial_context_setup_failure( #else /* NAS Cause : Detach */ S1ap_CauseNas_detach, #endif - S1AP_UE_CTX_REL_NO_ACTION, 0); + S1AP_UE_CTX_REL_UNLINK_MME_UE_CONTEXT, 0); d_assert(rv == CORE_OK,, "s1ap send error"); #else /* Implicit Release */ @@ -574,7 +576,7 @@ void s1ap_handle_ue_context_release_request( d_trace(5, " ECM-Idle\n"); rv = s1ap_send_ue_context_release_command(enb_ue, S1ap_Cause_PR_nas, S1ap_CauseNas_normal_release, - S1AP_UE_CTX_REL_NO_ACTION, 0); + S1AP_UE_CTX_REL_UNLINK_MME_UE_CONTEXT, 0); d_assert(rv == CORE_OK, return, "s1ap send error"); } } @@ -630,6 +632,13 @@ void s1ap_handle_ue_context_release_complete( d_trace(5, " No Action\n"); rv = enb_ue_remove(enb_ue); d_assert(rv == CORE_OK,, "enb_ue_remove() failed"); + break; + } + case S1AP_UE_CTX_REL_UNLINK_MME_UE_CONTEXT: + { + d_trace(5, " Action: Unlink UE(mme) context\n"); + rv = enb_ue_remove(enb_ue); + d_assert(rv == CORE_OK,, "enb_ue_remove() failed"); d_assert(mme_ue,,); rv = mme_ue_deassociate(mme_ue); @@ -638,7 +647,7 @@ void s1ap_handle_ue_context_release_complete( } case S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT: { - d_trace(5, " Action: UE(mme) context\n"); + d_trace(5, " Action: Remove UE(mme) context\n"); rv = enb_ue_remove(enb_ue); d_assert(rv == CORE_OK,, "enb_ue_removeI() failed");