diff --git a/src/mme/emm-sm.c b/src/mme/emm-sm.c index 730afbcdd..c3a1a5d5c 100644 --- a/src/mme/emm-sm.c +++ b/src/mme/emm-sm.c @@ -60,11 +60,25 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e); void emm_state_de_registered(ogs_fsm_t *s, mme_event_t *e) { + mme_ue_t *mme_ue = NULL; ogs_assert(s); ogs_assert(e); mme_sm_debug(e); + mme_ue = e->mme_ue; + ogs_assert(mme_ue); + + switch (e->id) { + case OGS_FSM_ENTRY_SIG: + CLEAR_MME_UE_ALL_TIMERS(mme_ue); + break; + case OGS_FSM_EXIT_SIG: + break; + default: + break; + } + common_register_state(s, e); } @@ -633,7 +647,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e) mme_timer_get_name(e->timer_id), e->timer_id); break; } - return; + break; default: ogs_error("Unknown event[%s]", mme_event_get_name(e)); break; @@ -776,7 +790,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e) mme_timer_get_name(e->timer_id), e->timer_id); break; } - return; + break; default: ogs_error("Unknown event[%s]", mme_event_get_name(e)); break; @@ -810,6 +824,9 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e) case NAS_ATTACH_COMPLETE: ogs_debug("[EMM] Attach complete"); ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd); + + CLEAR_MME_UE_TIMER(mme_ue->t3450); + rv = emm_handle_attach_complete( mme_ue, &message->emm.attach_complete); if (rv != OGS_OK) { @@ -865,6 +882,27 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e) break; } break; + case MME_EVT_EMM_TIMER: + switch (e->timer_id) { + case MME_TIMER_T3450: + if (mme_ue->t3450.retry_count >= + mme_timer_cfg(MME_TIMER_T3450)->max_count) { + ogs_warn("[EMM] Retransmission of IMSI[%s] failed. " + "Stop retransmission", + mme_ue->imsi_bcd); + CLEAR_MME_UE_TIMER(mme_ue->t3450); + OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception); + } else { + mme_ue->t3450.retry_count++; + nas_send_attach_accept(mme_ue); + } + break; + default: + ogs_error("Unknown timer[%s:%d]", + mme_timer_get_name(e->timer_id), e->timer_id); + break; + } + break; default: ogs_error("Unknown event[%s]", mme_event_get_name(e)); break; diff --git a/src/mme/esm-handler.c b/src/mme/esm-handler.c index 585ed6e26..542f9e805 100644 --- a/src/mme/esm-handler.c +++ b/src/mme/esm-handler.c @@ -140,10 +140,12 @@ int esm_handle_information_response(mme_sess_t *sess, mme_vlr_t *vlr = mme_vlr_find_by_tai(&mme_ue->tai); mme_ue->vlr = vlr; - if (vlr) + if (vlr) { sgsap_send_location_update_request(mme_ue); - else + } else { + CLEAR_MME_UE_TIMER(mme_ue->t3450); nas_send_attach_accept(mme_ue); + } } else { rv = mme_gtp_send_create_session_request(sess); ogs_assert(rv == OGS_OK); diff --git a/src/mme/mme-s11-handler.c b/src/mme/mme-s11-handler.c index f79717014..4193efd10 100644 --- a/src/mme/mme-s11-handler.c +++ b/src/mme/mme-s11-handler.c @@ -113,10 +113,12 @@ void mme_s11_handle_create_session_response( mme_vlr_t *vlr = mme_vlr_find_by_tai(&mme_ue->tai); mme_ue->vlr = vlr; - if (vlr) + if (vlr) { sgsap_send_location_update_request(mme_ue); - else + } else { + CLEAR_MME_UE_TIMER(mme_ue->t3450); nas_send_attach_accept(mme_ue); + } } else if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_registered)) { nas_send_activate_default_bearer_context_request(bearer); diff --git a/src/mme/nas-path.c b/src/mme/nas-path.c index 1fefa435c..cf0b37b63 100644 --- a/src/mme/nas-path.c +++ b/src/mme/nas-path.c @@ -98,14 +98,23 @@ int nas_send_attach_accept(mme_ue_t *mme_ue) ogs_assert(bearer); ogs_assert(mme_bearer_next(bearer) == NULL); - rv = esm_build_activate_default_bearer_context_request(&esmbuf, sess); - ogs_assert(rv == OGS_OK && esmbuf); + if (mme_ue->t3450.pkbuf) { + s1apbuf = mme_ue->t3450.pkbuf; - rv = emm_build_attach_accept(&emmbuf, mme_ue, esmbuf); - ogs_assert(rv == OGS_OK && emmbuf); + } else { + rv = esm_build_activate_default_bearer_context_request(&esmbuf, sess); + ogs_assert(rv == OGS_OK && esmbuf); - rv = s1ap_build_initial_context_setup_request(&s1apbuf, mme_ue, emmbuf); - ogs_assert(rv == OGS_OK && s1apbuf); + rv = emm_build_attach_accept(&emmbuf, mme_ue, esmbuf); + ogs_assert(rv == OGS_OK && emmbuf); + + rv = s1ap_build_initial_context_setup_request(&s1apbuf, mme_ue, emmbuf); + ogs_assert(rv == OGS_OK && s1apbuf); + } + + mme_ue->t3450.pkbuf = ogs_pkbuf_copy(s1apbuf); + ogs_timer_start(mme_ue->t3450.timer, + mme_timer_cfg(MME_TIMER_T3450)->duration); rv = nas_send_to_enb(mme_ue, s1apbuf); ogs_assert(rv == OGS_OK); diff --git a/src/mme/sgsap-handler.c b/src/mme/sgsap-handler.c index 4023a9eed..1c510e5b7 100644 --- a/src/mme/sgsap-handler.c +++ b/src/mme/sgsap-handler.c @@ -102,6 +102,7 @@ void sgsap_handle_location_update_accept(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf) ogs_debug(" P-TMSI[0x%08x]", mme_ue->p_tmsi); } + CLEAR_MME_UE_TIMER(mme_ue->t3450); nas_send_attach_accept(mme_ue); return;