[#220] Guard timer instance is created

This commit is contained in:
Sukchan Lee 2019-07-20 20:38:03 +09:00
parent 42f593d360
commit 805869da4f
7 changed files with 103 additions and 43 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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 { \

View File

@ -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)

View File

@ -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

View File

@ -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);
}