forked from acouzens/open5gs
Send UE Context Release Command instead of Implicit S1 release
This commit is contained in:
parent
0cd0221b29
commit
5397cfd2d8
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
Loading…
Reference in New Issue