update EMM state machine

This commit is contained in:
Sukchan Lee 2018-01-20 15:09:30 +09:00
parent 6bcd72cf45
commit f93d367eee
3 changed files with 33 additions and 38 deletions

View File

@ -84,22 +84,17 @@ void emm_state_detached(fsm_t *s, event_t *e)
} }
else else
{ {
if (MME_HAVE_SGW_S11_PATH(mme_ue)) d_warn("NAS MAC Failure in emm_state_detached");
{ nas_send_service_reject(mme_ue, EMM_CAUSE_MAC_FAILURE);
mme_s6a_send_air(mme_ue, NULL); FSM_TRAN(s, &emm_state_exception);
FSM_TRAN(&mme_ue->sm, &emm_state_authentication);
}
else
{
d_error("No Session");
nas_send_service_reject(mme_ue, EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
FSM_TRAN(s, &emm_state_exception);
}
} }
} }
else else
{ {
FSM_TRAN(&mme_ue->sm, &emm_state_identity); d_warn("Unknown UE in emm_state_detached");
nas_send_service_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
FSM_TRAN(s, &emm_state_exception);
} }
break; break;
} }
@ -166,29 +161,22 @@ void emm_state_detached(fsm_t *s, event_t *e)
{ {
if (SECURITY_CONTEXT_IS_VALID(mme_ue)) if (SECURITY_CONTEXT_IS_VALID(mme_ue))
{ {
/* Send TAU Accept */
rv = nas_send_tau_accept(mme_ue); rv = nas_send_tau_accept(mme_ue);
d_assert(rv == CORE_OK,, "send send failed"); d_assert(rv == CORE_OK,, "send send failed");
} }
else else
{ {
if (MME_HAVE_SGW_S11_PATH(mme_ue)) d_error("NAS MAC Failure in emm_state_detached");
{ nas_send_tau_reject(mme_ue, EMM_CAUSE_MAC_FAILURE);
mme_s6a_send_air(mme_ue, NULL); FSM_TRAN(s, emm_state_exception);
FSM_TRAN(&mme_ue->sm, &emm_state_authentication);
}
else
{
/* Send TAU reject */
d_error("No Session");
nas_send_tau_reject(mme_ue, EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
FSM_TRAN(s, emm_state_exception);
}
} }
} }
else else
{ {
FSM_TRAN(&mme_ue->sm, &emm_state_identity); d_error("Unknown UE in emm_state_detached");
nas_send_tau_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
FSM_TRAN(s, emm_state_exception);
} }
break; break;
} }
@ -291,8 +279,10 @@ void emm_state_identity(fsm_t *s, event_t *e)
} }
else else
{ {
d_error("No Session"); d_error("No PDN connection "
nas_send_service_reject(mme_ue, EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); "in esm_state_identity");
nas_send_service_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
FSM_TRAN(s, &emm_state_exception); FSM_TRAN(s, &emm_state_exception);
} }
} }
@ -301,7 +291,6 @@ void emm_state_identity(fsm_t *s, event_t *e)
{ {
if (SECURITY_CONTEXT_IS_VALID(mme_ue)) if (SECURITY_CONTEXT_IS_VALID(mme_ue))
{ {
/* Send TAU Accept */
rv = nas_send_tau_accept(mme_ue); rv = nas_send_tau_accept(mme_ue);
d_assert(rv == CORE_OK,, "send send failed"); d_assert(rv == CORE_OK,, "send send failed");
FSM_TRAN(&mme_ue->sm, &emm_state_attached); FSM_TRAN(&mme_ue->sm, &emm_state_attached);
@ -315,9 +304,10 @@ void emm_state_identity(fsm_t *s, event_t *e)
} }
else else
{ {
/* Send TAU reject */ d_error("No PDN connection "
d_error("No Session"); "in esm_state_identity");
nas_send_tau_reject(mme_ue, EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); nas_send_tau_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
FSM_TRAN(s, emm_state_exception); FSM_TRAN(s, emm_state_exception);
} }
} }
@ -698,7 +688,7 @@ void emm_state_attached(fsm_t *s, event_t *e)
} }
else else
{ {
d_error("No Session"); d_warn("No PDN Connection in emm_state_attached");
nas_send_service_reject(mme_ue, EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); nas_send_service_reject(mme_ue, EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
FSM_TRAN(s, &emm_state_exception); FSM_TRAN(s, &emm_state_exception);
} }
@ -706,6 +696,7 @@ void emm_state_attached(fsm_t *s, event_t *e)
} }
else else
{ {
d_warn("Unknown UE in emm_state_attached");
FSM_TRAN(&mme_ue->sm, &emm_state_identity); FSM_TRAN(&mme_ue->sm, &emm_state_identity);
} }
break; break;
@ -787,9 +778,8 @@ void emm_state_attached(fsm_t *s, event_t *e)
{ {
if (SECURITY_CONTEXT_IS_VALID(mme_ue)) if (SECURITY_CONTEXT_IS_VALID(mme_ue))
{ {
/* Send TAU Accept */
rv = nas_send_tau_accept(mme_ue); rv = nas_send_tau_accept(mme_ue);
d_assert(rv == CORE_OK,, "send send failed"); d_assert(rv == CORE_OK,, "nas send failed");
} }
else else
{ {
@ -800,8 +790,8 @@ void emm_state_attached(fsm_t *s, event_t *e)
} }
else else
{ {
/* Send TAU reject */ d_warn("No PDN Connection "
d_error("No Session"); "in emm_state_attached");
nas_send_tau_reject(mme_ue, EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); nas_send_tau_reject(mme_ue, EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
FSM_TRAN(s, emm_state_exception); FSM_TRAN(s, emm_state_exception);
} }
@ -809,6 +799,7 @@ void emm_state_attached(fsm_t *s, event_t *e)
} }
else else
{ {
d_warn("Unknown UE in emm_state_attached");
FSM_TRAN(&mme_ue->sm, &emm_state_identity); FSM_TRAN(&mme_ue->sm, &emm_state_identity);
} }
break; break;

View File

@ -1457,13 +1457,13 @@ static void attach_test5(abts_case *tc, void *data)
ABTS_INT_EQUAL(tc, CORE_OK, rv); ABTS_INT_EQUAL(tc, CORE_OK, rv);
pkbuf_free(recvbuf); pkbuf_free(recvbuf);
#if 0
/* Receive UE Context Release Command */ /* Receive UE Context Release Command */
recvbuf = pkbuf_alloc(0, MAX_SDU_LEN); recvbuf = pkbuf_alloc(0, MAX_SDU_LEN);
rv = tests1ap_enb_read(sock, recvbuf); rv = tests1ap_enb_read(sock, recvbuf);
ABTS_INT_EQUAL(tc, CORE_OK, rv); ABTS_INT_EQUAL(tc, CORE_OK, rv);
pkbuf_free(recvbuf); pkbuf_free(recvbuf);
#if 0
/* Send UE Context Release Complete */ /* Send UE Context Release Complete */
rv = tests1ap_build_ue_context_release_complete(&sendbuf, msgindex+1); rv = tests1ap_build_ue_context_release_complete(&sendbuf, msgindex+1);
ABTS_INT_EQUAL(tc, CORE_OK, rv); ABTS_INT_EQUAL(tc, CORE_OK, rv);

View File

@ -202,6 +202,8 @@ static void volte_test1(abts_case *tc, void *data)
rv = tests1ap_enb_send(sock, sendbuf); rv = tests1ap_enb_send(sock, sendbuf);
ABTS_INT_EQUAL(tc, CORE_OK, rv); ABTS_INT_EQUAL(tc, CORE_OK, rv);
core_sleep(time_from_msec(300));
/* Send Attach Complete + Activate default EPS bearer cotext accept */ /* Send Attach Complete + Activate default EPS bearer cotext accept */
rv = tests1ap_build_attach_complete(&sendbuf, msgindex); rv = tests1ap_build_attach_complete(&sendbuf, msgindex);
ABTS_INT_EQUAL(tc, CORE_OK, rv); ABTS_INT_EQUAL(tc, CORE_OK, rv);
@ -511,6 +513,8 @@ static void volte_test2(abts_case *tc, void *data)
rv = tests1ap_enb_send(sock, sendbuf); rv = tests1ap_enb_send(sock, sendbuf);
ABTS_INT_EQUAL(tc, CORE_OK, rv); ABTS_INT_EQUAL(tc, CORE_OK, rv);
core_sleep(time_from_msec(300));
/* Send Attach Complete + Activate default EPS bearer cotext accept */ /* Send Attach Complete + Activate default EPS bearer cotext accept */
rv = tests1ap_build_attach_complete(&sendbuf, msgindex); rv = tests1ap_build_attach_complete(&sendbuf, msgindex);
ABTS_INT_EQUAL(tc, CORE_OK, rv); ABTS_INT_EQUAL(tc, CORE_OK, rv);