[#220] Guard timer instance is created
This commit is contained in:
parent
42f593d360
commit
805869da4f
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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 { \
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue