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 */ /* Send Attach Reject */
nas_send_attach_reject(mme_ue, nas_send_attach_reject(mme_ue,
S1ap_CauseNas_unspecified,
EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED, EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT); return CORE_ERROR;
return CORE_OK;
} }
/* Store UE specific information */ /* Store UE specific information */
@ -313,8 +311,8 @@ status_t emm_handle_identity_response(
{ {
/* Send TAU reject */ /* Send TAU reject */
nas_send_tau_reject(mme_ue, nas_send_tau_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK, EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
S1AP_UE_CTX_REL_NO_ACTION); return CORE_ERROR;
} }
} }
} }
@ -334,8 +332,8 @@ status_t emm_handle_identity_response(
else else
{ {
nas_send_service_reject(mme_ue, nas_send_service_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK, EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
S1AP_UE_CTX_REL_NO_ACTION); return CORE_ERROR;
} }
} }
} }
@ -442,8 +440,8 @@ status_t emm_handle_service_request(
else else
{ {
nas_send_service_reject(mme_ue, nas_send_service_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK, EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
S1AP_UE_CTX_REL_NO_ACTION); return CORE_ERROR;
} }
} }
} }
@ -496,10 +494,8 @@ status_t emm_handle_tau_request(
if (served_tai_index < 0) if (served_tai_index < 0)
{ {
/* Send TAU reject */ /* Send TAU reject */
nas_send_tau_reject(mme_ue, nas_send_tau_reject(mme_ue, EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED);
EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED, return CORE_ERROR;
S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT);
return CORE_OK;
} }
/* Store UE specific information */ /* Store UE specific information */
@ -588,8 +584,8 @@ status_t emm_handle_tau_request(
{ {
/* Send TAU reject */ /* Send TAU reject */
nas_send_tau_reject(mme_ue, nas_send_tau_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK, EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
S1AP_UE_CTX_REL_NO_ACTION); 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); mme_ue, &message->emm.service_request);
if (rv != CORE_OK) 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); FSM_TRAN(s, emm_state_exception);
break; break;
} }
@ -107,7 +108,8 @@ void emm_state_detached(fsm_t *s, event_t *e)
mme_ue, &message->emm.attach_request); mme_ue, &message->emm.attach_request);
if (rv != CORE_OK) 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); FSM_TRAN(s, emm_state_exception);
break; break;
} }
@ -137,7 +139,8 @@ void emm_state_detached(fsm_t *s, event_t *e)
mme_ue, &message->emm.tracking_area_update_request); mme_ue, &message->emm.tracking_area_update_request);
if (rv != CORE_OK) 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); FSM_TRAN(s, emm_state_exception);
break; break;
} }
@ -229,7 +232,8 @@ void emm_state_identity(fsm_t *s, event_t *e)
&message->emm.identity_response); &message->emm.identity_response);
if (rv != CORE_OK) 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); FSM_TRAN(s, emm_state_exception);
break; break;
} }
@ -512,7 +516,8 @@ void emm_state_initial_context_setup(fsm_t *s, event_t *e)
mme_ue, &message->emm.attach_complete); mme_ue, &message->emm.attach_complete);
if (rv != CORE_OK) 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); FSM_TRAN(s, emm_state_exception);
break; break;
} }
@ -597,7 +602,8 @@ void emm_state_attached(fsm_t *s, event_t *e)
mme_ue, &message->emm.service_request); mme_ue, &message->emm.service_request);
if (rv != CORE_OK) 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); FSM_TRAN(s, emm_state_exception);
break; break;
} }
@ -635,7 +641,8 @@ void emm_state_attached(fsm_t *s, event_t *e)
mme_ue, &message->emm.attach_request); mme_ue, &message->emm.attach_request);
if (rv != CORE_OK) 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); FSM_TRAN(s, emm_state_exception);
break; break;
} }
@ -680,7 +687,8 @@ void emm_state_attached(fsm_t *s, event_t *e)
mme_ue, &message->emm.tracking_area_update_request); mme_ue, &message->emm.tracking_area_update_request);
if (rv != CORE_OK) 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); FSM_TRAN(s, emm_state_exception);
break; 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) 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, rv = nas_send_attach_reject(mme_ue,
S1ap_CauseNas_authentication_failure,
EMM_CAUSE_EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED, EMM_CAUSE_EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
S1AP_UE_CTX_REL_REMOVE_MME_UE_CONTEXT);
d_assert(rv == CORE_OK,, d_assert(rv == CORE_OK,,
"nas_send_attach_reject failed"); "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); pkbuf_free(s6abuf);
break; 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, 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)
nas_emm_cause_t emm_cause, nas_esm_cause_t esm_cause,
c_uint8_t ue_ctx_rel_action)
{ {
status_t rv; status_t rv;
mme_enb_t *enb = NULL;
enb_ue_t *enb_ue = NULL;
mme_sess_t *sess = NULL; mme_sess_t *sess = NULL;
pkbuf_t *esmbuf = NULL, *emmbuf = NULL; pkbuf_t *esmbuf = NULL, *emmbuf = NULL;
S1ap_Cause_t cause;
d_assert(mme_ue, return CORE_ERROR, "Null param"); 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); sess = mme_sess_first(mme_ue);
if (sess) 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, esmbuf ? pkbuf_free(esmbuf) : 1; return CORE_ERROR,
"nas send 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; return rv;
} }
@ -421,72 +406,36 @@ status_t nas_send_tau_accept(mme_ue_t *mme_ue)
return CORE_OK; return CORE_OK;
} }
status_t nas_send_tau_reject(mme_ue_t *mme_ue, status_t nas_send_tau_reject(mme_ue_t *mme_ue, nas_emm_cause_t emm_cause)
nas_emm_cause_t emm_cause, c_uint8_t ue_ctx_rel_action)
{ {
status_t rv; status_t rv;
enb_ue_t *enb_ue = NULL;
pkbuf_t *emmbuf = NULL; pkbuf_t *emmbuf = NULL;
S1ap_Cause_t cause;
d_assert(mme_ue, return CORE_ERROR, "Null param"); 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 */ /* Build TAU reject */
if (emm_build_tau_reject(&emmbuf, emm_cause, mme_ue) != CORE_OK) rv = emm_build_tau_reject(&emmbuf, emm_cause, mme_ue);
{ d_assert(rv == CORE_OK, return CORE_ERROR, "emm build error");
d_error("emm_build_tau_reject error");
pkbuf_free(emmbuf);
return CORE_ERROR;
}
/* Send Dl NAS to UE */
rv = nas_send_to_downlink_nas_transport(mme_ue, emmbuf); rv = nas_send_to_downlink_nas_transport(mme_ue, emmbuf);
d_assert(rv == CORE_OK, return CORE_ERROR, "nas dl send error"); 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; return CORE_OK;
} }
status_t nas_send_service_reject(mme_ue_t *mme_ue, status_t nas_send_service_reject(mme_ue_t *mme_ue, nas_emm_cause_t emm_cause)
nas_emm_cause_t emm_cause, c_uint8_t ue_ctx_rel_action)
{ {
status_t rv; status_t rv;
enb_ue_t *enb_ue = NULL;
pkbuf_t *emmbuf = NULL; pkbuf_t *emmbuf = NULL;
S1ap_Cause_t cause;
d_assert(mme_ue, return CORE_ERROR, "Null param"); 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 */ /* Build Service Reject */
if (emm_build_service_reject(&emmbuf, emm_cause, mme_ue) != CORE_OK) rv = emm_build_service_reject(&emmbuf, emm_cause, mme_ue);
{ d_assert(rv == CORE_OK, return CORE_ERROR, "emm build error");
d_error("emm_build_service_reject error");
pkbuf_free(emmbuf);
return CORE_ERROR;
}
/* Send Dl NAS to UE */
rv = nas_send_to_downlink_nas_transport(mme_ue, emmbuf); rv = nas_send_to_downlink_nas_transport(mme_ue, emmbuf);
d_assert(rv == CORE_OK, return CORE_ERROR, "nas dl send error"); 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; 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_accept(mme_ue_t *mme_ue);
CORE_DECLARE(status_t) nas_send_attach_reject(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_emm_cause_t emm_cause, nas_esm_cause_t esm_cause);
nas_esm_cause_t esm_cause, c_uint8_t ue_ctx_rel_action);
CORE_DECLARE(status_t) nas_send_authentication_request( CORE_DECLARE(status_t) nas_send_authentication_request(
mme_ue_t *mme_ue, e_utran_vector_t *e_utran_vector); 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); mme_bearer_t *bearer);
CORE_DECLARE(status_t) nas_send_tau_accept(mme_ue_t *mme_ue); 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, CORE_DECLARE(status_t) nas_send_tau_reject(
nas_esm_cause_t emm_cause, c_uint8_t ue_ctx_rel_action); mme_ue_t *mme_ue, nas_esm_cause_t emm_cause);
CORE_DECLARE(status_t) nas_send_service_reject(mme_ue_t *mme_ue, CORE_DECLARE(status_t) nas_send_service_reject(
nas_emm_cause_t emm_cause, c_uint8_t ue_ctx_rel_action); mme_ue_t *mme_ue, nas_emm_cause_t emm_cause);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

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

View File

@ -445,7 +445,7 @@ static void volte_test2(abts_case *tc, void *data)
bson_destroy(doc); 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 */ * Send Initial-UE Message + Attach Request + PDN Connectivity */
rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex); rv = tests1ap_build_initial_ue_msg(&sendbuf, msgindex);
ABTS_INT_EQUAL(tc, CORE_OK, rv); ABTS_INT_EQUAL(tc, CORE_OK, rv);