if TAU_REJECT or SERVICE_REJECT, MME UE Context is removed.

This commit is contained in:
Sukchan Lee 2018-01-19 16:29:21 +09:00
parent 2701add779
commit e4c189fec2
7 changed files with 55 additions and 93 deletions

View File

@ -76,11 +76,9 @@ status_t emm_handle_attach_request(
{
/* Send Attach Reject */
nas_send_attach_reject(mme_ue,
S1ap_CauseNas_unspecified,
EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT);
return CORE_OK;
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
return CORE_ERROR;
}
/* Store UE specific information */
@ -313,8 +311,8 @@ status_t emm_handle_identity_response(
{
/* Send TAU reject */
nas_send_tau_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK,
S1AP_UE_CTX_REL_NO_ACTION);
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
return CORE_ERROR;
}
}
}
@ -334,8 +332,8 @@ status_t emm_handle_identity_response(
else
{
nas_send_service_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK,
S1AP_UE_CTX_REL_NO_ACTION);
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
return CORE_ERROR;
}
}
}
@ -442,8 +440,8 @@ status_t emm_handle_service_request(
else
{
nas_send_service_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK,
S1AP_UE_CTX_REL_NO_ACTION);
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
return CORE_ERROR;
}
}
}
@ -496,10 +494,8 @@ status_t emm_handle_tau_request(
if (served_tai_index < 0)
{
/* Send TAU reject */
nas_send_tau_reject(mme_ue,
EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED,
S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT);
return CORE_OK;
nas_send_tau_reject(mme_ue, EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED);
return CORE_ERROR;
}
/* Store UE specific information */
@ -588,8 +584,8 @@ status_t emm_handle_tau_request(
{
/* Send TAU reject */
nas_send_tau_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK,
S1AP_UE_CTX_REL_NO_ACTION);
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
return CORE_ERROR;
}
}
}

View File

@ -69,7 +69,8 @@ void emm_state_detached(fsm_t *s, event_t *e)
mme_ue, &message->emm.service_request);
if (rv != CORE_OK)
{
d_error("emm_handle_service_request() failed");
d_error("emm_handle_service_request() failed "
"in emm_state_detached");
FSM_TRAN(s, emm_state_exception);
break;
}
@ -107,7 +108,8 @@ void emm_state_detached(fsm_t *s, event_t *e)
mme_ue, &message->emm.attach_request);
if (rv != CORE_OK)
{
d_error("emm_handle_attach_request() failed");
d_error("emm_handle_attach_request() failed "
"in emm_state_detached");
FSM_TRAN(s, emm_state_exception);
break;
}
@ -137,7 +139,8 @@ void emm_state_detached(fsm_t *s, event_t *e)
mme_ue, &message->emm.tracking_area_update_request);
if (rv != CORE_OK)
{
d_error("emm_handle_tau_request() failed");
d_error("emm_handle_tau_request() failed"
"in emm_state_detached");
FSM_TRAN(s, emm_state_exception);
break;
}
@ -229,7 +232,8 @@ void emm_state_identity(fsm_t *s, event_t *e)
&message->emm.identity_response);
if (rv != CORE_OK)
{
d_error("emm_handle_identity_response failed()");
d_error("emm_handle_identity_response failed() "
"in emm_state_identity");
FSM_TRAN(s, emm_state_exception);
break;
}
@ -512,7 +516,8 @@ void emm_state_initial_context_setup(fsm_t *s, event_t *e)
mme_ue, &message->emm.attach_complete);
if (rv != CORE_OK)
{
d_error("emm_handle_attach_complete() failed");
d_error("emm_handle_attach_complete() failed "
"in emm_state_initial_context_setup");
FSM_TRAN(s, emm_state_exception);
break;
}
@ -597,7 +602,8 @@ void emm_state_attached(fsm_t *s, event_t *e)
mme_ue, &message->emm.service_request);
if (rv != CORE_OK)
{
d_error("emm_handle_service_request() failed");
d_error("emm_handle_service_request() failed "
"in emm_state_attached");
FSM_TRAN(s, emm_state_exception);
break;
}
@ -635,7 +641,8 @@ void emm_state_attached(fsm_t *s, event_t *e)
mme_ue, &message->emm.attach_request);
if (rv != CORE_OK)
{
d_error("emm_handle_attach_request() failed");
d_error("emm_handle_attach_request() failed "
"in emm_state_attached");
FSM_TRAN(s, emm_state_exception);
break;
}
@ -680,7 +687,8 @@ void emm_state_attached(fsm_t *s, event_t *e)
mme_ue, &message->emm.tracking_area_update_request);
if (rv != CORE_OK)
{
d_error("emm_handle_tau_request() failed");
d_error("emm_handle_tau_request() failed "
"in emm_state_attached");
FSM_TRAN(s, emm_state_exception);
break;
}

View File

@ -373,14 +373,24 @@ void mme_state_operational(fsm_t *s, event_t *e)
if (s6a_message->result_code != ER_DIAMETER_SUCCESS)
{
S1ap_Cause_t cause;
enb_ue_t *enb_ue = NULL;
rv = nas_send_attach_reject(mme_ue,
S1ap_CauseNas_authentication_failure,
EMM_CAUSE_EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT);
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
d_assert(rv == CORE_OK,,
"nas_send_attach_reject failed");
enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, break, "No ENB UE context");
cause.present = S1ap_Cause_PR_nas;
cause.choice.nas = S1ap_CauseNas_authentication_failure;
rv = s1ap_send_ue_context_release_commmand(enb_ue, &cause,
S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT, 0);
d_assert(rv == CORE_OK,, "s1ap send error");
pkbuf_free(s6abuf);
break;
}

View File

@ -100,22 +100,13 @@ status_t nas_send_attach_accept(mme_ue_t *mme_ue)
}
status_t nas_send_attach_reject(mme_ue_t *mme_ue,
e_S1ap_CauseNas s1ap_cause_nas,
nas_emm_cause_t emm_cause, nas_esm_cause_t esm_cause,
c_uint8_t ue_ctx_rel_action)
nas_emm_cause_t emm_cause, nas_esm_cause_t esm_cause)
{
status_t rv;
mme_enb_t *enb = NULL;
enb_ue_t *enb_ue = NULL;
mme_sess_t *sess = NULL;
pkbuf_t *esmbuf = NULL, *emmbuf = NULL;
S1ap_Cause_t cause;
d_assert(mme_ue, return CORE_ERROR, "Null param");
enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, return CORE_ERROR, "Null param");
enb = enb_ue->enb;
d_assert(enb, return CORE_ERROR, "Null param");
sess = mme_sess_first(mme_ue);
if (sess)
@ -133,12 +124,6 @@ status_t nas_send_attach_reject(mme_ue_t *mme_ue,
esmbuf ? pkbuf_free(esmbuf) : 1; return CORE_ERROR,
"nas send error");
cause.present = S1ap_Cause_PR_nas;
cause.choice.nas = s1ap_cause_nas;;
rv = s1ap_send_ue_context_release_commmand(
enb_ue, &cause, ue_ctx_rel_action, 0);
d_assert(rv == CORE_OK,, "s1ap send error");
return rv;
}
@ -421,72 +406,36 @@ status_t nas_send_tau_accept(mme_ue_t *mme_ue)
return CORE_OK;
}
status_t nas_send_tau_reject(mme_ue_t *mme_ue,
nas_emm_cause_t emm_cause, c_uint8_t ue_ctx_rel_action)
status_t nas_send_tau_reject(mme_ue_t *mme_ue, nas_emm_cause_t emm_cause)
{
status_t rv;
enb_ue_t *enb_ue = NULL;
pkbuf_t *emmbuf = NULL;
S1ap_Cause_t cause;
d_assert(mme_ue, return CORE_ERROR, "Null param");
enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, return CORE_ERROR, "Null param");
/* Build TAU reject */
if (emm_build_tau_reject(&emmbuf, emm_cause, mme_ue) != CORE_OK)
{
d_error("emm_build_tau_reject error");
pkbuf_free(emmbuf);
return CORE_ERROR;
}
rv = emm_build_tau_reject(&emmbuf, emm_cause, mme_ue);
d_assert(rv == CORE_OK, return CORE_ERROR, "emm build error");
/* Send Dl NAS to UE */
rv = nas_send_to_downlink_nas_transport(mme_ue, emmbuf);
d_assert(rv == CORE_OK, return CORE_ERROR, "nas dl send error");
/* FIXME : delay required before sending UE context release to make sure
* that UE receive DL NAS ? */
cause.present = S1ap_Cause_PR_nas;
cause.choice.nas = S1ap_CauseNas_normal_release;
rv = s1ap_send_ue_context_release_commmand(
enb_ue, &cause, ue_ctx_rel_action, 0);
d_assert(rv == CORE_OK, return CORE_ERROR, "s1ap send error");
return CORE_OK;
}
status_t nas_send_service_reject(mme_ue_t *mme_ue,
nas_emm_cause_t emm_cause, c_uint8_t ue_ctx_rel_action)
status_t nas_send_service_reject(mme_ue_t *mme_ue, nas_emm_cause_t emm_cause)
{
status_t rv;
enb_ue_t *enb_ue = NULL;
pkbuf_t *emmbuf = NULL;
S1ap_Cause_t cause;
d_assert(mme_ue, return CORE_ERROR, "Null param");
enb_ue = mme_ue->enb_ue;
d_assert(enb_ue, return CORE_ERROR, "Null param");
/* Build Service Reject */
if (emm_build_service_reject(&emmbuf, emm_cause, mme_ue) != CORE_OK)
{
d_error("emm_build_service_reject error");
pkbuf_free(emmbuf);
return CORE_ERROR;
}
rv = emm_build_service_reject(&emmbuf, emm_cause, mme_ue);
d_assert(rv == CORE_OK, return CORE_ERROR, "emm build error");
/* Send Dl NAS to UE */
rv = nas_send_to_downlink_nas_transport(mme_ue, emmbuf);
d_assert(rv == CORE_OK, return CORE_ERROR, "nas dl send error");
/* FIXME : delay required before sending UE context release to make sure
* that UE receive DL NAS ? */
cause.present = S1ap_Cause_PR_nas;
cause.choice.nas = S1ap_CauseNas_normal_release;
rv = s1ap_send_ue_context_release_commmand(
enb_ue, &cause, S1AP_UE_CTX_REL_NO_ACTION, 0);
d_assert(rv == CORE_OK, return CORE_ERROR, "s1ap send error");
return CORE_OK;
}

View File

@ -17,8 +17,7 @@ CORE_DECLARE(status_t) nas_send_to_downlink_nas_transport(
CORE_DECLARE(status_t) nas_send_attach_accept(mme_ue_t *mme_ue);
CORE_DECLARE(status_t) nas_send_attach_reject(mme_ue_t *mme_ue,
e_S1ap_CauseNas s1ap_cause_nas, nas_emm_cause_t emm_cause,
nas_esm_cause_t esm_cause, c_uint8_t ue_ctx_rel_action);
nas_emm_cause_t emm_cause, nas_esm_cause_t esm_cause);
CORE_DECLARE(status_t) nas_send_authentication_request(
mme_ue_t *mme_ue, e_utran_vector_t *e_utran_vector);
@ -39,11 +38,11 @@ CORE_DECLARE(status_t) nas_send_deactivate_bearer_context_request(
mme_bearer_t *bearer);
CORE_DECLARE(status_t) nas_send_tau_accept(mme_ue_t *mme_ue);
CORE_DECLARE(status_t) nas_send_tau_reject(mme_ue_t *mme_ue,
nas_esm_cause_t emm_cause, c_uint8_t ue_ctx_rel_action);
CORE_DECLARE(status_t) nas_send_tau_reject(
mme_ue_t *mme_ue, nas_esm_cause_t emm_cause);
CORE_DECLARE(status_t) nas_send_service_reject(mme_ue_t *mme_ue,
nas_emm_cause_t emm_cause, c_uint8_t ue_ctx_rel_action);
CORE_DECLARE(status_t) nas_send_service_reject(
mme_ue_t *mme_ue, nas_emm_cause_t emm_cause);
#ifdef __cplusplus
}

View File

@ -693,7 +693,7 @@ static void attach_test2(abts_case *tc, void *data)
pkbuf_free(recvbuf);
/*****************************************************************
* Attach Request : IMSI, Integrity Protected, MAC Failed
* Attach Request : Unknown IMSI, Integrity Protected
* Send Initial-UE Message + Attach Request + PDN Connectivity */
core_sleep(time_from_msec(300));

View File

@ -445,7 +445,7 @@ static void volte_test2(abts_case *tc, void *data)
bson_destroy(doc);
/***********************************************************************
* Attach Request : Known IMSI, Integrity Protected, No Security Context
* Attach Request : Known IMSI, Integrity Protected, MAC failed
* Send Initial-UE Message + Attach Request + PDN Connectivity */
rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex);
ABTS_INT_EQUAL(tc, CORE_OK, rv);