Send UE Context Release Command instead of Implicit S1 release

This commit is contained in:
Sukchan Lee 2018-02-02 02:48:55 +09:00
parent 0cd0221b29
commit 5397cfd2d8
6 changed files with 33 additions and 18 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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