forked from acouzens/open5gs
[TIMER] Move timer expiration work to the FSM
This commit is contained in:
parent
a96398357f
commit
9565967517
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue