diff --git a/src/mme/emm-sm.c b/src/mme/emm-sm.c index 8fcb552c2..0ce1854cd 100644 --- a/src/mme/emm-sm.c +++ b/src/mme/emm-sm.c @@ -882,7 +882,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e) OGS_FSM_TRAN(s, &emm_state_exception); break; case OGS_NAS_EPS_DETACH_REQUEST: - ogs_warn("Detach request"); + ogs_warn("[%s] Detach request", mme_ue->imsi_bcd); rv = emm_handle_detach_request( mme_ue, &message->emm.detach_request_from_ue); if (rv != OGS_OK) { @@ -891,7 +891,30 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e) break; } - mme_send_delete_session_or_detach(mme_ue); + if (!MME_UE_HAVE_IMSI(mme_ue)) { + ogs_warn("Detach request : Unknown UE"); + ogs_assert(OGS_OK == + nas_eps_send_service_reject(mme_ue, + OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)); + OGS_FSM_TRAN(s, &emm_state_exception); + break; + } + + if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) { + ogs_warn("No Security Context : IMSI[%s]", mme_ue->imsi_bcd); + ogs_assert(OGS_OK == + nas_eps_send_service_reject(mme_ue, + OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)); + OGS_FSM_TRAN(s, &emm_state_exception); + break; + } + + if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); + } else { + mme_send_delete_session_or_detach(mme_ue); + } + OGS_FSM_TRAN(s, &emm_state_de_registered); break; default: @@ -1059,7 +1082,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e) OGS_FSM_TRAN(s, &emm_state_exception); break; case OGS_NAS_EPS_DETACH_REQUEST: - ogs_warn("Detach request"); + ogs_warn("[%s] Detach request", mme_ue->imsi_bcd); rv = emm_handle_detach_request( mme_ue, &message->emm.detach_request_from_ue); if (rv != OGS_OK) { @@ -1068,7 +1091,30 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e) break; } - mme_send_delete_session_or_detach(mme_ue); + if (!MME_UE_HAVE_IMSI(mme_ue)) { + ogs_warn("Detach request : Unknown UE"); + ogs_assert(OGS_OK == + nas_eps_send_service_reject(mme_ue, + OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)); + OGS_FSM_TRAN(s, &emm_state_exception); + break; + } + + if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) { + ogs_warn("No Security Context : IMSI[%s]", mme_ue->imsi_bcd); + ogs_assert(OGS_OK == + nas_eps_send_service_reject(mme_ue, + OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)); + OGS_FSM_TRAN(s, &emm_state_exception); + break; + } + + if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); + } else { + mme_send_delete_session_or_detach(mme_ue); + } + OGS_FSM_TRAN(s, &emm_state_de_registered); break; default: @@ -1257,7 +1303,7 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e) OGS_FSM_TRAN(s, &emm_state_exception); break; case OGS_NAS_EPS_DETACH_REQUEST: - ogs_warn("Detach request"); + ogs_warn("[%s] Detach request", mme_ue->imsi_bcd); rv = emm_handle_detach_request( mme_ue, &message->emm.detach_request_from_ue); if (rv != OGS_OK) { @@ -1266,7 +1312,30 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e) break; } - mme_send_delete_session_or_detach(mme_ue); + if (!MME_UE_HAVE_IMSI(mme_ue)) { + ogs_warn("Detach request : Unknown UE"); + ogs_assert(OGS_OK == + nas_eps_send_service_reject(mme_ue, + OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)); + OGS_FSM_TRAN(s, &emm_state_exception); + break; + } + + if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) { + ogs_warn("No Security Context : IMSI[%s]", mme_ue->imsi_bcd); + ogs_assert(OGS_OK == + nas_eps_send_service_reject(mme_ue, + OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)); + OGS_FSM_TRAN(s, &emm_state_exception); + break; + } + + if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) { + ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue)); + } else { + mme_send_delete_session_or_detach(mme_ue); + } + OGS_FSM_TRAN(s, &emm_state_de_registered); break; case OGS_NAS_EPS_SECURITY_MODE_COMPLETE: diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index 182c5bbfe..c455d513e 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -539,7 +539,7 @@ struct mme_ue_s { ogs_pkbuf_t *pkbuf; ogs_timer_t *timer; uint32_t retry_count;; - } t3413, t3422, t3450, t3460, t3470, t_mobile_reachable, + } t3413, t3422, t3450, t3460, t3470, t_mobile_reachable, t_implicit_detach; #define CLEAR_SERVICE_INDICATOR(__mME) \ diff --git a/src/mme/mme-sm.c b/src/mme/mme-sm.c index 34596d6de..801df5d2e 100644 --- a/src/mme/mme-sm.c +++ b/src/mme/mme-sm.c @@ -307,7 +307,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) ogs_assert(r != OGS_ERROR); } enb_ue_associate_mme_ue(enb_ue, mme_ue); - ogs_debug("Mobile Reachable timer stopped for IMSI[%s]", + ogs_debug("Mobile Reachable timer stopped for IMSI[%s]", mme_ue->imsi_bcd); CLEAR_MME_UE_TIMER(mme_ue->t_mobile_reachable); } diff --git a/src/mme/s1ap-handler.c b/src/mme/s1ap-handler.c index b7024b850..cbc6a831d 100644 --- a/src/mme/s1ap-handler.c +++ b/src/mme/s1ap-handler.c @@ -330,7 +330,7 @@ void s1ap_handle_initial_ue_message(mme_enb_t *enb, ogs_s1ap_message_t *message) ogs_assert(r != OGS_ERROR); } enb_ue_associate_mme_ue(enb_ue, mme_ue); - ogs_debug("Mobile Reachable timer stopped for IMSI[%s]", + ogs_debug("Mobile Reachable timer stopped for IMSI[%s]", mme_ue->imsi_bcd); CLEAR_MME_UE_TIMER(mme_ue->t_mobile_reachable); }