diff --git a/src/mme/emm_handler.c b/src/mme/emm_handler.c index 563313e89..57f76b407 100644 --- a/src/mme/emm_handler.c +++ b/src/mme/emm_handler.c @@ -128,7 +128,35 @@ void emm_handle_attach_request( if (SECURITY_CONTEXT_IS_VALID(mme_ue)) { - emm_handle_attach_accept(mme_ue); + /* Update Kenb */ + mme_kdf_enb(mme_ue->kasme, mme_ue->ul_count.i32, mme_ue->kenb); + + /* FIXME : + * Need to refine the code to start from ESM_Info_req. + * Call esm_handle_s6a_update_location(bearer) here + * or send event ? + */ + { + mme_sess_t *sess = mme_sess_first(mme_ue); + while(sess) + { + mme_bearer_t *bearer = mme_bearer_first(sess); + while(bearer) + { + event_t e; + event_set(&e, MME_EVT_ESM_BEARER_FROM_S6A); + event_set_param1(&e, (c_uintptr_t)bearer->index); + event_set_param2(&e, + (c_uintptr_t)S6A_CMD_UPDATE_LOCATION); + mme_event_send(&e); + + bearer = mme_bearer_next(bearer); + } + + sess = mme_sess_next(sess); + } + } + } else { @@ -168,7 +196,36 @@ void emm_handle_attach_request( /* Known GUTI */ if (SECURITY_CONTEXT_IS_VALID(mme_ue)) { - emm_handle_attach_accept(mme_ue); + /* Update Kenb */ + mme_kdf_enb(mme_ue->kasme, mme_ue->ul_count.i32, + mme_ue->kenb); + + /* FIXME : + * Need to refine the code to start from ESM_Info_req. + * Call esm_handle_s6a_update_location(bearer) here + * or send event ? + */ + { + + mme_sess_t *sess = mme_sess_first(mme_ue); + while(sess) + { + mme_bearer_t *bearer = mme_bearer_first(sess); + while(bearer) + { + event_t e; + event_set(&e, MME_EVT_ESM_BEARER_FROM_S6A); + event_set_param1(&e, (c_uintptr_t)bearer->index); + event_set_param2(&e, + (c_uintptr_t)S6A_CMD_UPDATE_LOCATION); + mme_event_send(&e); + + bearer = mme_bearer_next(bearer); + } + + sess = mme_sess_next(sess); + } + } } else { @@ -404,6 +461,7 @@ void emm_handle_authentication_response(mme_ue_t *mme_ue, mme_ue->kasme, mme_ue->knas_enc); mme_kdf_enb(mme_ue->kasme, mme_ue->ul_count.i32, mme_ue->kenb); + d_info("[NAS] Security mode command : UE[%s] <-- EMM", mme_ue->imsi_bcd); diff --git a/src/mme/emm_sm.c b/src/mme/emm_sm.c index c29851405..c7ceba6f4 100644 --- a/src/mme/emm_sm.c +++ b/src/mme/emm_sm.c @@ -8,6 +8,7 @@ #include "emm_handler.h" #include "emm_build.h" #include "mme_s6a_handler.h" +#include "mme_kdf.h" void emm_state_initial(fsm_t *s, event_t *e) { @@ -161,6 +162,12 @@ void emm_state_operational(fsm_t *s, event_t *e) { d_info("[NAS] Security mode complete : UE[%s] --> EMM", mme_ue->imsi_bcd); + + /* Update Kenb */ + if (SECURITY_CONTEXT_IS_VALID(mme_ue)) + mme_kdf_enb(mme_ue->kasme, mme_ue->ul_count.i32, + mme_ue->kenb); + mme_s6a_send_ulr(mme_ue); break; } diff --git a/src/mme/nas_security.c b/src/mme/nas_security.c index 346e8db31..208e46afd 100644 --- a/src/mme/nas_security.c +++ b/src/mme/nas_security.c @@ -4,6 +4,7 @@ #include "nas_message.h" #include "nas_security.h" +#include "mme_kdf.h" status_t nas_security_encode( pkbuf_t **pkbuf, mme_ue_t *mme_ue, nas_message_t *message) @@ -154,6 +155,10 @@ status_t nas_security_decode(mme_ue_t *mme_ue, mme_ue->mac_failed = 1; } + /* Update Kenb */ + if (SECURITY_CONTEXT_IS_VALID(mme_ue)) + mme_kdf_enb(mme_ue->kasme, mme_ue->ul_count.i32, mme_ue->kenb); + return CORE_OK; }