From 805869da4f5c8a2147d6c994584fbb1bb6dc0478 Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Sat, 20 Jul 2019 20:38:03 +0900 Subject: [PATCH] [#220] Guard timer instance is created --- src/mme/emm-handler.c | 17 ++++++----------- src/mme/emm-sm.c | 10 +++++----- src/mme/mme-context.c | 28 +++++++++++++++++++++------- src/mme/mme-context.h | 22 +++++++++++----------- src/mme/mme-timer.c | 34 +++++++++++++++++++++++++++++++++- src/mme/mme-timer.h | 27 +++++++++++++++++++++++---- src/mme/s1ap-path.c | 8 ++++---- 7 files changed, 103 insertions(+), 43 deletions(-) diff --git a/src/mme/emm-handler.c b/src/mme/emm-handler.c index ed578fce1..be63ab6f1 100644 --- a/src/mme/emm-handler.c +++ b/src/mme/emm-handler.c @@ -81,8 +81,9 @@ int emm_handle_attach_request( * EXTENDED_SERVICE_REQUEST * Clear Paging Timer and Message */ + CLEAR_MME_UE_TIMER(mme_ue->t3413); + CLEAR_EPS_BEARER_ID(mme_ue); - CLEAR_PAGING_INFO(mme_ue); CLEAR_SERVICE_INDICATOR(mme_ue); if (SECURITY_CONTEXT_IS_VALID(mme_ue)) { mme_kdf_enb(mme_ue->kasme, mme_ue->ul_count.i32, mme_ue->kenb); @@ -383,7 +384,7 @@ int emm_handle_service_request( * EXTENDED_SERVICE_REQUEST * Clear Paging Timer and Message */ - CLEAR_PAGING_INFO(mme_ue); + CLEAR_MME_UE_TIMER(mme_ue->t3413); if (SECURITY_CONTEXT_IS_VALID(mme_ue)) { mme_kdf_enb(mme_ue->kasme, mme_ue->ul_count.i32, mme_ue->kenb); mme_kdf_nh(mme_ue->kasme, mme_ue->kenb, mme_ue->nh); @@ -440,7 +441,8 @@ int emm_handle_tau_request( * EXTENDED_SERVICE_REQUEST * Clear Paging Timer and Message */ - CLEAR_PAGING_INFO(mme_ue); + CLEAR_MME_UE_TIMER(mme_ue->t3413); + CLEAR_SERVICE_INDICATOR(mme_ue); if (BEARER_CONTEXT_IS_ACTIVE(mme_ue)) ogs_debug(" Bearer-Active"); @@ -570,14 +572,7 @@ int emm_handle_extended_service_request( * EXTENDED_SERVICE_REQUEST * Clear Paging Timer and Message */ - CLEAR_PAGING_INFO(mme_ue); -#if KeNB_Should_Not_Refreshed - if (SECURITY_CONTEXT_IS_VALID(mme_ue)) { - mme_kdf_enb(mme_ue->kasme, mme_ue->ul_count.i32, mme_ue->kenb); - mme_kdf_nh(mme_ue->kasme, mme_ue->kenb, mme_ue->nh); - mme_ue->nhcc = 1; - } -#endif + CLEAR_MME_UE_TIMER(mme_ue->t3413); ogs_debug(" OLD TAI[PLMN_ID:%06x,TAC:%d]", plmn_id_hexdump(&mme_ue->tai.plmn_id), mme_ue->tai.tac); diff --git a/src/mme/emm-sm.c b/src/mme/emm-sm.c index 7c7cd048e..1b99157e3 100644 --- a/src/mme/emm-sm.c +++ b/src/mme/emm-sm.c @@ -268,17 +268,17 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e) case MME_EVT_EMM_TIMER: switch (e->timer_id) { case MME_TIMER_T3413: - if (mme_ue->max_paging_retry >= + if (mme_ue->t3413.retry_count >= mme_timer_cfg(MME_TIMER_T3413)->max_count) { /* Paging failed */ ogs_warn("[EMM] Paging to IMSI[%s] failed. Stop paging", mme_ue->imsi_bcd); - if (mme_ue->last_paging_msg) { - ogs_pkbuf_free(mme_ue->last_paging_msg); - mme_ue->last_paging_msg = NULL; + if (mme_ue->t3413.pkbuf) { + ogs_pkbuf_free(mme_ue->t3413.pkbuf); + mme_ue->t3413.pkbuf = NULL; } } else { - mme_ue->max_paging_retry++; + mme_ue->t3413.retry_count++; /* If t3413 is timeout, last_paging_msg is used. * We don't have to set CNDomain. So, we just set CNDomain to 0 */ s1ap_send_paging(mme_ue, 0); diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index 4182d8830..00433974a 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -2025,11 +2025,19 @@ mme_ue_t *mme_ue_add(enb_ue_t *enb_ue) mme_ue->vlr = NULL; mme_ue->vlr_ostream_id = 0; - /* Create paging retry timer */ - mme_ue->t3413 = ogs_timer_add( + /* Add All Timers */ + mme_ue->t3413.timer = ogs_timer_add( self.timer_mgr, mme_timer_t3413_expire, mme_ue); - ogs_assert(mme_ue->t3413); + mme_ue->t3422.timer = ogs_timer_add( + self.timer_mgr, mme_timer_t3422_expire, mme_ue); + mme_ue->t3450.timer = ogs_timer_add( + self.timer_mgr, mme_timer_t3450_expire, mme_ue); + mme_ue->t3460.timer = ogs_timer_add( + self.timer_mgr, mme_timer_t3460_expire, mme_ue); + mme_ue->t3470.timer = ogs_timer_add( + self.timer_mgr, mme_timer_t3470_expire, mme_ue); + /* Create FSM */ e.mme_ue = mme_ue; ogs_fsm_create(&mme_ue->sm, emm_state_initial, emm_state_final); ogs_fsm_init(&mme_ue->sm, &e); @@ -2063,9 +2071,6 @@ void mme_ue_remove(mme_ue_t *mme_ue) /* Clear the saved PDN Connectivity Request */ NAS_CLEAR_DATA(&mme_ue->pdn_connectivity_request); - /* Clear Paging info : stop t3413, last_paing_msg */ - CLEAR_PAGING_INFO(mme_ue); - /* Clear Service Indicator */ CLEAR_SERVICE_INDICATOR(mme_ue); @@ -2076,7 +2081,16 @@ void mme_ue_remove(mme_ue_t *mme_ue) S1AP_CLEAR_DATA(&mme_ue->container); /* Delete All Timers */ - ogs_timer_delete(mme_ue->t3413); + CLEAR_MME_UE_TIMER(mme_ue->t3413); + CLEAR_MME_UE_TIMER(mme_ue->t3422); + CLEAR_MME_UE_TIMER(mme_ue->t3450); + CLEAR_MME_UE_TIMER(mme_ue->t3460); + CLEAR_MME_UE_TIMER(mme_ue->t3470); + ogs_timer_delete(mme_ue->t3413.timer); + ogs_timer_delete(mme_ue->t3422.timer); + ogs_timer_delete(mme_ue->t3450.timer); + ogs_timer_delete(mme_ue->t3460.timer); + ogs_timer_delete(mme_ue->t3470.timer); mme_ue_deassociate(mme_ue); diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index a55077f78..1ee06e818 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -394,21 +394,21 @@ struct mme_ue_s { nas_esm_message_container_t pdn_connectivity_request; /* Paging */ -#define CLEAR_PAGING_INFO(__mME) \ +#define CLEAR_MME_UE_TIMER(__mME_UE_TIMER) \ do { \ - ogs_assert((__mME)); \ - \ - ogs_timer_stop((__mME)->t3413); \ - if ((__mME)->last_paging_msg) \ + ogs_timer_stop((__mME_UE_TIMER).timer); \ + if ((__mME_UE_TIMER).pkbuf) \ { \ - ogs_pkbuf_free((__mME)->last_paging_msg); \ - (__mME)->last_paging_msg = NULL; \ + ogs_pkbuf_free((__mME_UE_TIMER).pkbuf); \ + (__mME_UE_TIMER).pkbuf = NULL; \ } \ - (__mME)->max_paging_retry = 0; \ + (__mME_UE_TIMER).retry_count = 0; \ } while(0); - ogs_pkbuf_t *last_paging_msg; - ogs_timer_t *t3413; - uint32_t max_paging_retry; + struct { + ogs_pkbuf_t *pkbuf; + ogs_timer_t *timer; + uint32_t retry_count;; + } t3413, t3422, t3450, t3460, t3470; #define CLEAR_SERVICE_INDICATOR(__mME) \ do { \ diff --git a/src/mme/mme-timer.c b/src/mme/mme-timer.c index a35812ab8..4059217e7 100644 --- a/src/mme/mme-timer.c +++ b/src/mme/mme-timer.c @@ -23,7 +23,15 @@ static mme_timer_cfg_t g_mme_timer_cfg[MAX_NUM_OF_MME_TIMER] = { [MME_TIMER_T3413] = - { .max_count = 2, .duration = ogs_time_from_sec(2) }, + { .max_count = 4, .duration = ogs_time_from_sec(2) }, + [MME_TIMER_T3422] = + { .max_count = 2, .duration = ogs_time_from_sec(6) }, + [MME_TIMER_T3450] = + { .max_count = 2, .duration = ogs_time_from_sec(6) }, + [MME_TIMER_T3460] = + { .max_count = 2, .duration = ogs_time_from_sec(6) }, + [MME_TIMER_T3470] = + { .max_count = 2, .duration = ogs_time_from_sec(6) }, [MME_TIMER_SGS_CLI_CONN_TO_SRV] = { .duration = ogs_time_from_sec(3) }, }; @@ -44,6 +52,14 @@ const char *mme_timer_get_name(mme_timer_e id) return "MME_TIMER_S1_DELAYED_SEND"; case MME_TIMER_T3413: return "MME_TIMER_T3413"; + case MME_TIMER_T3422: + return "MME_TIMER_T3422"; + case MME_TIMER_T3450: + return "MME_TIMER_T3450"; + case MME_TIMER_T3460: + return "MME_TIMER_T3460"; + case MME_TIMER_T3470: + return "MME_TIMER_T3470"; case MME_TIMER_SGS_CLI_CONN_TO_SRV: return "MME_TIMER_SGS_CLI_CONN_TO_SRV"; default: @@ -73,6 +89,22 @@ void mme_timer_t3413_expire(void *data) { mme_ue_timer_event(MME_TIMER_T3413, data); } +void mme_timer_t3422_expire(void *data) +{ + mme_ue_timer_event(MME_TIMER_T3422, data); +} +void mme_timer_t3450_expire(void *data) +{ + mme_ue_timer_event(MME_TIMER_T3413, data); +} +void mme_timer_t3460_expire(void *data) +{ + mme_ue_timer_event(MME_TIMER_T3413, data); +} +void mme_timer_t3470_expire(void *data) +{ + mme_ue_timer_event(MME_TIMER_T3413, data); +} static void mme_ue_timer_event( mme_timer_e timer_id, mme_ue_t *mme_ue) diff --git a/src/mme/mme-timer.h b/src/mme/mme-timer.h index b337e8dff..8b7ac4d7d 100644 --- a/src/mme/mme-timer.h +++ b/src/mme/mme-timer.h @@ -30,13 +30,26 @@ extern "C" { typedef enum { MME_TIMER_BASE = 0, - /* S1AP */ MME_TIMER_S1_DELAYED_SEND, - /* EMM */ - MME_TIMER_T3413, + MME_TIMER_T3413, /* Paging procedure for EPS services initiated */ + MME_TIMER_T3422, /* DETACH REQUEST sent */ + + /* + * ATTACH ACCEPT sent + * TRACKING AREA UPDATE ACCEPT sent with GUTI + * TRACKING AREA UPDATE ACCEPT sent with TMSI + * GUTI REALLOCATION COMMAND sent + */ + MME_TIMER_T3450, + /* + * AUTHENTICATION REQUEST sent + * SECURITY MODE COMMAND sent + */ + MME_TIMER_T3460, + + MME_TIMER_T3470, /* IDENTITY REQUEST sent */ - /* SGSAP */ MME_TIMER_SGS_CLI_CONN_TO_SRV, MAX_NUM_OF_MME_TIMER, @@ -53,7 +66,13 @@ mme_timer_cfg_t *mme_timer_cfg(mme_timer_e id); const char *mme_timer_get_name(mme_timer_e id); void mme_timer_s1_delayed_send(void *data); + void mme_timer_t3413_expire(void *data); +void mme_timer_t3422_expire(void *data); +void mme_timer_t3450_expire(void *data); +void mme_timer_t3460_expire(void *data); +void mme_timer_t3470_expire(void *data); + void mme_timer_sgs_cli_conn_to_srv(void *data); #ifdef __cplusplus diff --git a/src/mme/s1ap-path.c b/src/mme/s1ap-path.c index 66ac2922b..63ab161a8 100644 --- a/src/mme/s1ap-path.c +++ b/src/mme/s1ap-path.c @@ -317,14 +317,14 @@ void s1ap_send_paging(mme_ue_t *mme_ue, S1AP_CNDomain_t cn_domain) if (memcmp(&enb->supported_ta_list[i], &mme_ue->tai, sizeof(tai_t)) == 0) { - if (mme_ue->last_paging_msg) { - s1apbuf = mme_ue->last_paging_msg; + if (mme_ue->t3413.pkbuf) { + s1apbuf = mme_ue->t3413.pkbuf; } else { rv = s1ap_build_paging(&s1apbuf, mme_ue, cn_domain); ogs_assert(rv == OGS_OK && s1apbuf); } - mme_ue->last_paging_msg = ogs_pkbuf_copy(s1apbuf); + mme_ue->t3413.pkbuf = ogs_pkbuf_copy(s1apbuf); rv = s1ap_send_to_enb(enb, s1apbuf, S1AP_NON_UE_SIGNALLING); ogs_assert(rv == OGS_OK); @@ -333,7 +333,7 @@ void s1ap_send_paging(mme_ue_t *mme_ue, S1AP_CNDomain_t cn_domain) } /* Start T3413 */ - ogs_timer_start(mme_ue->t3413, + ogs_timer_start(mme_ue->t3413.timer, mme_timer_cfg(MME_TIMER_T3413)->duration); }