update state machine

This commit is contained in:
Sukchan Lee 2018-01-22 12:24:18 +09:00
parent 6e6eb7a355
commit f94553bc8a
1 changed files with 55 additions and 43 deletions

View File

@ -174,22 +174,28 @@ void emm_state_detached(fsm_t *s, event_t *e)
} }
else else
{ {
d_error("NAS MAC Failure in emm_state_detached"); if (MME_HAVE_SGW_S11_PATH(mme_ue))
rv = nas_send_tau_reject( {
mme_ue, EMM_CAUSE_MAC_FAILURE); mme_s6a_send_air(mme_ue, NULL);
d_assert(rv == CORE_OK,, FSM_TRAN(&mme_ue->sm,
"nas_send_tau_reject() failed"); &emm_state_authentication);
FSM_TRAN(s, emm_state_exception); }
else
{
d_warn("No PDN Connection "
"in emm_state_detached");
rv = nas_send_tau_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
d_assert(rv == CORE_OK,,
"nas_send_tau_reject() failed");
FSM_TRAN(s, emm_state_exception);
}
} }
} }
else else
{ {
d_error("Unknown UE in emm_state_detached"); d_warn("Unknown UE in emm_state_detached");
rv = nas_send_tau_reject(mme_ue, FSM_TRAN(&mme_ue->sm, &emm_state_identity);
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
d_assert(rv == CORE_OK,,
"nas_send_tau_reject() failed");
FSM_TRAN(s, emm_state_exception);
} }
break; break;
} }
@ -289,12 +295,42 @@ void emm_state_identity(fsm_t *s, event_t *e)
FSM_TRAN(s, &emm_state_authentication); FSM_TRAN(s, &emm_state_authentication);
} }
} }
else if (mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST)
{
if (SECURITY_CONTEXT_IS_VALID(mme_ue))
{
rv = nas_send_tau_accept(mme_ue);
d_assert(rv == CORE_OK,,
"nas_send_tau_accept() failed");
FSM_TRAN(&mme_ue->sm, &emm_state_attached);
}
else
{
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
mme_s6a_send_air(mme_ue, NULL);
FSM_TRAN(&mme_ue->sm,
&emm_state_authentication);
}
else
{
d_warn("No PDN Connection "
"in emm_state_identity");
rv = nas_send_tau_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
d_assert(rv == CORE_OK,,
"nas_send_tau_reject() failed");
FSM_TRAN(s, emm_state_exception);
}
}
}
else if (mme_ue->nas_eps.type == else if (mme_ue->nas_eps.type ==
MME_EPS_TYPE_SERVICE_REQUEST) MME_EPS_TYPE_SERVICE_REQUEST)
{ {
if (SECURITY_CONTEXT_IS_VALID(mme_ue)) if (SECURITY_CONTEXT_IS_VALID(mme_ue))
{ {
rv = s1ap_send_initial_context_setup_request(mme_ue); rv = s1ap_send_initial_context_setup_request(
mme_ue);
d_assert(rv == CORE_OK,, d_assert(rv == CORE_OK,,
"s1ap_send_initial_context_setup_request() failed"); "s1ap_send_initial_context_setup_request() failed");
FSM_TRAN(&mme_ue->sm, &emm_state_attached); FSM_TRAN(&mme_ue->sm, &emm_state_attached);
@ -306,7 +342,7 @@ void emm_state_identity(fsm_t *s, event_t *e)
enb_ue_t *enb_ue = NULL; enb_ue_t *enb_ue = NULL;
d_warn("Have PDN Connection " d_warn("Have PDN Connection "
"in emm_state_attached"); "in emm_state_identity");
rv = nas_send_service_reject(mme_ue, rv = 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);
d_assert(rv == CORE_OK,, d_assert(rv == CORE_OK,,
@ -325,7 +361,7 @@ void emm_state_identity(fsm_t *s, event_t *e)
else else
{ {
d_warn("No PDN Connection " d_warn("No PDN Connection "
"in emm_state_attached"); "in emm_state_identity");
rv = nas_send_service_reject(mme_ue, rv = 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);
d_assert(rv == CORE_OK,, d_assert(rv == CORE_OK,,
@ -334,34 +370,10 @@ void emm_state_identity(fsm_t *s, event_t *e)
} }
} }
} }
else if (mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST) else
{ d_assert(0,, "Invalid NAS_EPS type[%d]",
if (SECURITY_CONTEXT_IS_VALID(mme_ue)) mme_ue->nas_eps.type);
{
rv = nas_send_tau_accept(mme_ue);
d_assert(rv == CORE_OK,,
"nas_send_tau_accept() failed");
FSM_TRAN(&mme_ue->sm, &emm_state_attached);
}
else
{
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
mme_s6a_send_air(mme_ue, NULL);
FSM_TRAN(&mme_ue->sm, &emm_state_authentication);
}
else
{
d_warn("No PDN Connection "
"in emm_state_attached");
rv = nas_send_tau_reject(
mme_ue, EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
d_assert(rv == CORE_OK,,
"nas_send_tau_reject() failed");
FSM_TRAN(s, emm_state_exception);
}
}
}
break; break;
} }
case NAS_EMM_STATUS: case NAS_EMM_STATUS: