From 08fe1d64a810bc088e726efef0d55971f57476b7 Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Sat, 23 Sep 2017 17:17:30 +0900 Subject: [PATCH] move FSM_TRAN from emm_handler.c to emm_sm.c --- src/mme/emm_handler.c | 56 +------------ src/mme/emm_handler.h | 2 - src/mme/emm_sm.c | 187 +++++++++++++++++++++++++++++++++++++++++- 3 files changed, 188 insertions(+), 57 deletions(-) diff --git a/src/mme/emm_handler.c b/src/mme/emm_handler.c index 53b9f08ede..0653992725 100644 --- a/src/mme/emm_handler.c +++ b/src/mme/emm_handler.c @@ -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); } } } diff --git a/src/mme/emm_handler.h b/src/mme/emm_handler.h index c52e4815d6..57041ec819 100644 --- a/src/mme/emm_handler.h +++ b/src/mme/emm_handler.h @@ -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); diff --git a/src/mme/emm_sm.c b/src/mme/emm_sm.c index 703d1252ff..96c698dabd 100644 --- a/src/mme/emm_sm.c +++ b/src/mme/emm_sm.c @@ -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: