move FSM_TRAN from emm_handler.c to emm_sm.c

This commit is contained in:
Sukchan Lee 2017-09-23 17:17:30 +09:00
parent 51c41df3d1
commit 08fe1d64a8
3 changed files with 188 additions and 57 deletions

View File

@ -141,17 +141,12 @@ void emm_handle_attach_request(
NAS_STORE_DATA(&mme_ue->pdn_connectivity_request, esm_message_container);
if (!MME_UE_HAVE_IMSI(mme_ue))
{
FSM_TRAN(&mme_ue->sm, &emm_state_identity);
}
else
if (MME_UE_HAVE_IMSI(mme_ue))
{
if (SECURITY_CONTEXT_IS_VALID(mme_ue))
{
rv = nas_send_emm_to_esm(mme_ue, &mme_ue->pdn_connectivity_request);
d_assert(rv == CORE_OK,, "nas_send_emm_to_esm failed");
FSM_TRAN(&mme_ue->sm, &emm_state_default_esm);
}
else
{
@ -164,7 +159,6 @@ void emm_handle_attach_request(
{
mme_s6a_send_air(mme_ue);
}
FSM_TRAN(&mme_ue->sm, &emm_state_authentication);
}
}
}
@ -269,7 +263,6 @@ void emm_handle_identity_response(
{
rv = nas_send_emm_to_esm(mme_ue, &mme_ue->pdn_connectivity_request);
d_assert(rv == CORE_OK, return, "nas_send_emm_to_esm failed");
FSM_TRAN(&mme_ue->sm, &emm_state_default_esm);
}
else
{
@ -282,7 +275,6 @@ void emm_handle_identity_response(
{
mme_s6a_send_air(mme_ue);
}
FSM_TRAN(&mme_ue->sm, &emm_state_authentication);
}
}
else if (mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST)
@ -298,14 +290,12 @@ void emm_handle_identity_response(
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
mme_s6a_send_air(mme_ue);
FSM_TRAN(&mme_ue->sm, &emm_state_authentication);
}
else
{
/* Send TAU reject */
nas_send_tau_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
FSM_TRAN(&mme_ue->sm, &emm_state_detached);
}
}
}
@ -321,44 +311,16 @@ void emm_handle_identity_response(
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
mme_s6a_send_air(mme_ue);
FSM_TRAN(&mme_ue->sm, &emm_state_authentication);
}
else
{
nas_send_service_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
FSM_TRAN(&mme_ue->sm, &emm_state_detached);
}
}
}
}
void emm_handle_authentication_response(mme_ue_t *mme_ue,
nas_authentication_response_t *authentication_response)
{
nas_authentication_response_parameter_t *authentication_response_parameter =
&authentication_response->authentication_response_parameter;
d_assert(mme_ue, return, "Null param");
if (authentication_response_parameter->length != mme_ue->xres_len ||
memcmp(authentication_response_parameter->res,
mme_ue->xres, mme_ue->xres_len) != 0)
{
status_t rv;
d_error("authentication failed");
rv = nas_send_authentication_reject(mme_ue);
d_assert(rv == CORE_OK,, "nas send error");
FSM_TRAN(&mme_ue->sm, &emm_state_detached);
}
else
{
FSM_TRAN(&mme_ue->sm, &emm_state_security_mode);
}
}
void emm_handle_detach_request(
mme_ue_t *mme_ue, nas_detach_request_from_ue_t *detach_request)
{
@ -440,11 +402,7 @@ void emm_handle_service_request(
/* Set EPS Update Type */
mme_ue->nas_eps.type = MME_EPS_TYPE_SERVICE_REQUEST;
if (!MME_UE_HAVE_IMSI(mme_ue))
{
FSM_TRAN(&mme_ue->sm, &emm_state_identity);
}
else
if (MME_UE_HAVE_IMSI(mme_ue))
{
if (SECURITY_CONTEXT_IS_VALID(mme_ue))
{
@ -456,13 +414,11 @@ void emm_handle_service_request(
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
mme_s6a_send_air(mme_ue);
FSM_TRAN(&mme_ue->sm, &emm_state_authentication);
}
else
{
nas_send_service_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
FSM_TRAN(&mme_ue->sm, &emm_state_detached);
}
}
}
@ -584,11 +540,7 @@ void emm_handle_tau_request(
}
}
if (!MME_UE_HAVE_IMSI(mme_ue))
{
FSM_TRAN(&mme_ue->sm, &emm_state_identity);
}
else
if (MME_UE_HAVE_IMSI(mme_ue))
{
if (SECURITY_CONTEXT_IS_VALID(mme_ue))
{
@ -602,14 +554,12 @@ void emm_handle_tau_request(
{
/* Re-authentication */
mme_s6a_send_air(mme_ue);
FSM_TRAN(&mme_ue->sm, &emm_state_authentication);
}
else
{
/* Send TAU reject */
nas_send_tau_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
FSM_TRAN(&mme_ue->sm, &emm_state_detached);
}
}
}

View File

@ -16,8 +16,6 @@ CORE_DECLARE(void) emm_handle_attach_complete(
CORE_DECLARE(void) emm_handle_identity_response(
mme_ue_t *mme_ue, nas_identity_response_t *identity_response);
CORE_DECLARE(void) emm_handle_authentication_response(
mme_ue_t *mme_ue, nas_authentication_response_t *authentication_response);
CORE_DECLARE(void) emm_handle_detach_request(
mme_ue_t *mme_ue, nas_detach_request_from_ue_t *detach_request);

View File

@ -65,6 +65,29 @@ void emm_state_detached(fsm_t *s, event_t *e)
{
emm_handle_service_request(
mme_ue, &message->emm.service_request);
if (MME_UE_HAVE_IMSI(mme_ue))
{
if (SECURITY_CONTEXT_IS_VALID(mme_ue))
{
/* Nothing */
}
else
{
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
FSM_TRAN(&mme_ue->sm, &emm_state_authentication);
}
else
{
FSM_TRAN(&mme_ue->sm, &emm_state_detached);
}
}
}
else
{
FSM_TRAN(&mme_ue->sm, &emm_state_identity);
}
break;
}
@ -74,6 +97,22 @@ void emm_state_detached(fsm_t *s, event_t *e)
{
emm_handle_attach_request(
mme_ue, &message->emm.attach_request);
if (MME_UE_HAVE_IMSI(mme_ue))
{
if (SECURITY_CONTEXT_IS_VALID(mme_ue))
{
FSM_TRAN(&mme_ue->sm, &emm_state_default_esm);
}
else
{
FSM_TRAN(&mme_ue->sm, &emm_state_authentication);
}
}
else
{
FSM_TRAN(&mme_ue->sm, &emm_state_identity);
}
break;
}
@ -81,6 +120,30 @@ void emm_state_detached(fsm_t *s, event_t *e)
{
emm_handle_tau_request(
mme_ue, &message->emm.tracking_area_update_request);
if (MME_UE_HAVE_IMSI(mme_ue))
{
if (SECURITY_CONTEXT_IS_VALID(mme_ue))
{
/* Nothing */
}
else
{
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
FSM_TRAN(&mme_ue->sm,
&emm_state_authentication);
}
else
{
FSM_TRAN(&mme_ue->sm, &emm_state_detached);
}
}
}
else
{
FSM_TRAN(&mme_ue->sm, &emm_state_identity);
}
break;
}
@ -143,6 +206,39 @@ void emm_state_identity(fsm_t *s, event_t *e)
{
emm_handle_identity_response(mme_ue,
&message->emm.identity_response);
if (mme_ue->nas_eps.type == MME_EPS_TYPE_ATTACH_REQUEST)
{
if (SECURITY_CONTEXT_IS_VALID(mme_ue))
{
FSM_TRAN(&mme_ue->sm, &emm_state_default_esm);
}
else
{
FSM_TRAN(&mme_ue->sm, &emm_state_authentication);
}
}
else if (mme_ue->nas_eps.type ==
MME_EPS_TYPE_SERVICE_REQUEST ||
mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST)
{
if (SECURITY_CONTEXT_IS_VALID(mme_ue))
{
/* Nothing */
}
else
{
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
FSM_TRAN(&mme_ue->sm,
&emm_state_authentication);
}
else
{
FSM_TRAN(&mme_ue->sm, &emm_state_detached);
}
}
}
break;
}
case NAS_EMM_STATUS:
@ -199,8 +295,32 @@ void emm_state_authentication(fsm_t *s, event_t *e)
{
case NAS_AUTHENTICATION_RESPONSE:
{
emm_handle_authentication_response(
mme_ue, &message->emm.authentication_response);
nas_authentication_response_t *authentication_response =
&message->emm.authentication_response;
nas_authentication_response_parameter_t
*authentication_response_parameter =
&authentication_response->
authentication_response_parameter;
d_assert(mme_ue, return, "Null param");
if (authentication_response_parameter->length !=
mme_ue->xres_len ||
memcmp(authentication_response_parameter->res,
mme_ue->xres, mme_ue->xres_len) != 0)
{
status_t rv;
d_error("authentication failed");
rv = nas_send_authentication_reject(mme_ue);
d_assert(rv == CORE_OK,, "nas send error");
FSM_TRAN(&mme_ue->sm, &emm_state_detached);
}
else
{
FSM_TRAN(&mme_ue->sm, &emm_state_security_mode);
}
break;
}
case NAS_EMM_STATUS:
@ -417,6 +537,29 @@ void emm_state_attached(fsm_t *s, event_t *e)
{
emm_handle_service_request(
mme_ue, &message->emm.service_request);
if (MME_UE_HAVE_IMSI(mme_ue))
{
if (SECURITY_CONTEXT_IS_VALID(mme_ue))
{
/* Nothing */
}
else
{
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
FSM_TRAN(&mme_ue->sm, &emm_state_authentication);
}
else
{
FSM_TRAN(&mme_ue->sm, &emm_state_detached);
}
}
}
else
{
FSM_TRAN(&mme_ue->sm, &emm_state_identity);
}
break;
}
@ -426,6 +569,22 @@ void emm_state_attached(fsm_t *s, event_t *e)
{
emm_handle_attach_request(
mme_ue, &message->emm.attach_request);
if (MME_UE_HAVE_IMSI(mme_ue))
{
if (SECURITY_CONTEXT_IS_VALID(mme_ue))
{
FSM_TRAN(&mme_ue->sm, &emm_state_default_esm);
}
else
{
FSM_TRAN(&mme_ue->sm, &emm_state_authentication);
}
}
else
{
FSM_TRAN(&mme_ue->sm, &emm_state_identity);
}
break;
}
case NAS_EMM_STATUS:
@ -445,6 +604,30 @@ void emm_state_attached(fsm_t *s, event_t *e)
{
emm_handle_tau_request(
mme_ue, &message->emm.tracking_area_update_request);
if (MME_UE_HAVE_IMSI(mme_ue))
{
if (SECURITY_CONTEXT_IS_VALID(mme_ue))
{
/* Nothing */
}
else
{
if (MME_HAVE_SGW_S11_PATH(mme_ue))
{
FSM_TRAN(&mme_ue->sm,
&emm_state_authentication);
}
else
{
FSM_TRAN(&mme_ue->sm, &emm_state_detached);
}
}
}
else
{
FSM_TRAN(&mme_ue->sm, &emm_state_identity);
}
break;
}
default: