[TIMER] Move timer expiration work to the FSM

This commit is contained in:
Sukchan Lee 2019-07-20 13:07:40 +09:00
parent a96398357f
commit 9565967517
9 changed files with 82 additions and 23 deletions

View File

@ -22,6 +22,7 @@
#include "fd/s6a/s6a-message.h"
#include "mme-event.h"
#include "mme-timer.h"
#include "mme-kdf.h"
#include "s1ap-handler.h"
#include "mme-fd-path.h"
@ -264,6 +265,30 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
return;
}
break;
case MME_EVT_EMM_TIMER:
switch (e->timer_id) {
case MME_TIMER_T3413:
if (mme_ue->max_paging_retry >= MAX_NUM_OF_PAGING) {
/* 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;
}
} else {
mme_ue->max_paging_retry++;
/* 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);
}
break;
default:
ogs_warn("Unknown timer[%s:%d]",
mme_timer_get_name(e->timer_id), e->timer_id);
break;
}
return;
default:
ogs_error("Unknown event[%s]", mme_event_get_name(e));
return;

View File

@ -2026,7 +2026,8 @@ mme_ue_t *mme_ue_add(enb_ue_t *enb_ue)
mme_ue->vlr_ostream_id = 0;
/* Create paging retry timer */
mme_ue->t3413 = ogs_timer_add(self.timer_mgr, s1ap_t3413_timeout, mme_ue);
mme_ue->t3413 = ogs_timer_add(
self.timer_mgr, mme_timer_t3413_expire, mme_ue);
ogs_assert(mme_ue->t3413);
e.mme_ue = mme_ue;

View File

@ -99,6 +99,8 @@ const char *mme_event_get_name(mme_event_t *e)
case MME_EVT_S1AP_MESSAGE:
return "MME_EVT_S1AP_MESSAGE";
case MME_EVT_S1AP_TIMER:
return "MME_EVT_S1AP_TIMER";
case MME_EVT_S1AP_DELAYED_SEND:
return "MME_EVT_S1AP_DELAYED_SEND";
case MME_EVT_S1AP_LO_ACCEPT:
@ -110,15 +112,25 @@ const char *mme_event_get_name(mme_event_t *e)
case MME_EVT_EMM_MESSAGE:
return "MME_EVT_EMM_MESSAGE";
case MME_EVT_EMM_TIMER:
return "MME_EVT_EMM_TIMER";
case MME_EVT_ESM_MESSAGE:
return "MME_EVT_ESM_MESSAGE";
case MME_EVT_ESM_TIMER:
return "MME_EVT_ESM_TIMER";
case MME_EVT_S11_MESSAGE:
return "MME_EVT_S11_MESSAGE";
case MME_EVT_S11_TIMER:
return "MME_EVT_S11_TIMER";
case MME_EVT_S6A_MESSAGE:
return "MME_EVT_S6A_MESSAGE";
case MME_EVT_S6A_TIMER:
return "MME_EVT_S6A_TIMER";
case MME_EVT_SGSAP_MESSAGE:
return "MME_EVT_SGSAP_MESSAGE";
case MME_EVT_SGSAP_TIMER:
return "MME_EVT_SGSAP_TIMER";
case MME_EVT_SGSAP_LO_SCTP_COMM_UP:
return "MME_EVT_SGSAP_LO_SCTP_COMM_UP";
case MME_EVT_SGSAP_LO_CONNREFUSED:

View File

@ -31,17 +31,23 @@ typedef enum {
MME_EVT_BASE = OGS_FSM_USER_SIG,
MME_EVT_S1AP_MESSAGE,
MME_EVT_S1AP_TIMER,
MME_EVT_S1AP_DELAYED_SEND,
MME_EVT_S1AP_LO_ACCEPT,
MME_EVT_S1AP_LO_SCTP_COMM_UP,
MME_EVT_S1AP_LO_CONNREFUSED,
MME_EVT_EMM_MESSAGE,
MME_EVT_EMM_TIMER,
MME_EVT_ESM_MESSAGE,
MME_EVT_ESM_TIMER,
MME_EVT_S11_MESSAGE,
MME_EVT_S11_TIMER,
MME_EVT_S6A_MESSAGE,
MME_EVT_S6A_TIMER,
MME_EVT_SGSAP_MESSAGE,
MME_EVT_SGSAP_TIMER,
MME_EVT_SGSAP_LO_SCTP_COMM_UP,
MME_EVT_SGSAP_LO_CONNREFUSED,
@ -62,6 +68,7 @@ typedef struct mme_bearer_s mme_bearer_t;
typedef struct mme_event_s {
int id;
void *pkbuf;
int timer_id;
ogs_sock_t *sctp_sock;
ogs_sockaddr_t *sctp_addr;

View File

@ -273,6 +273,13 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
ogs_pkbuf_free(pkbuf);
break;
case MME_EVT_EMM_TIMER:
mme_ue = e->mme_ue;
ogs_assert(mme_ue);
ogs_assert(OGS_FSM_STATE(&mme_ue->sm));
ogs_fsm_dispatch(&mme_ue->sm, e);
break;
case MME_EVT_ESM_MESSAGE:
mme_ue = e->mme_ue;

View File

@ -18,6 +18,7 @@
*/
#include "mme-timer.h"
#include "mme-event.h"
#include "mme-context.h"
void mme_timer_init(void)
@ -45,3 +46,26 @@ const char *mme_timer_get_name(mme_timer_e id)
return "UNKNOWN_TIMER";
}
static void mme_ue_timer_event(
mme_timer_e timer_id, mme_ue_t *mme_ue)
{
int rv;
mme_event_t *e = NULL;
ogs_assert(mme_ue);
e = mme_event_new(MME_EVT_EMM_TIMER);
e->timer_id = timer_id;
e->mme_ue = mme_ue;
rv = ogs_queue_push(mme_self()->queue, e);
if (rv != OGS_OK) {
ogs_warn("ogs_queue_push() failed:%d", (int)rv);
mme_event_free(e);
}
}
void mme_timer_t3413_expire(void *data)
{
mme_ue_timer_event(MME_TIMER_T3413, data);
}

View File

@ -26,6 +26,7 @@
extern "C" {
#endif
/* forward declaration */
typedef enum {
MME_TIMER_BASE = 0,
@ -39,6 +40,10 @@ typedef enum {
void mme_timer_init(void);
void mme_timer_final(void);
const char *mme_timer_get_name(mme_timer_e id);
void mme_timer_t3413_expire(void *data);
#ifdef __cplusplus
}
#endif

View File

@ -333,27 +333,6 @@ void s1ap_send_paging(mme_ue_t *mme_ue, S1AP_CNDomain_t cn_domain)
ogs_timer_start(mme_ue->t3413, mme_self()->t3413_value);
}
void s1ap_t3413_timeout(void *data)
{
mme_ue_t *mme_ue = data;
ogs_assert(mme_ue);
if (mme_ue->max_paging_retry >= MAX_NUM_OF_PAGING) {
/* 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;
}
} else {
mme_ue->max_paging_retry++;
/* 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);
}
}
int s1ap_send_mme_configuration_transfer(
mme_enb_t *target_enb,
S1AP_SONConfigurationTransfer_t *SONConfigurationTransfer)

View File

@ -57,7 +57,6 @@ int s1ap_send_ue_context_release_command(
uint8_t action, uint32_t delay);
void s1ap_send_paging(mme_ue_t *mme_ue, S1AP_CNDomain_t cn_domain);
void s1ap_t3413_timeout(void *data);
int s1ap_send_mme_configuration_transfer(
mme_enb_t *target_enb,