diff --git a/src/mme/mme-sm.c b/src/mme/mme-sm.c index 345faf875..54b0fa127 100644 --- a/src/mme/mme-sm.c +++ b/src/mme/mme-sm.c @@ -562,6 +562,14 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e) ogs_pkbuf_free(pkbuf); break; + case MME_EVT_SGSAP_TIMER: + vlr = e->vlr; + ogs_assert(vlr); + ogs_assert(OGS_FSM_STATE(&vlr->sm)); + + ogs_fsm_dispatch(&vlr->sm, e); + break; + default: ogs_error("No handler for event %s", mme_event_get_name(e)); break; diff --git a/src/mme/mme-timer.c b/src/mme/mme-timer.c index 442db5337..4bc066d1e 100644 --- a/src/mme/mme-timer.c +++ b/src/mme/mme-timer.c @@ -93,3 +93,19 @@ static void mme_ue_timer_event( } } +void mme_timer_sgs_cli_conn_to_srv(void *data) +{ + int rv; + mme_event_t *e = NULL; + ogs_assert(data); + + e = mme_event_new(MME_EVT_SGSAP_TIMER); + e->timer_id = MME_TIMER_SGS_CLI_CONN_TO_SRV; + e->vlr = data; + + 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); + } +} diff --git a/src/mme/mme-timer.h b/src/mme/mme-timer.h index da95f77f3..c52c9ce37 100644 --- a/src/mme/mme-timer.h +++ b/src/mme/mme-timer.h @@ -50,6 +50,7 @@ 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_sgs_cli_conn_to_srv(void *data); #ifdef __cplusplus } diff --git a/src/mme/sgsap-sm.c b/src/mme/sgsap-sm.c index d0a711625..658c6eb79 100644 --- a/src/mme/sgsap-sm.c +++ b/src/mme/sgsap-sm.c @@ -21,13 +21,12 @@ #include "mme-context.h" #include "mme-event.h" +#include "mme-timer.h" #include "mme-sm.h" #include "sgsap-path.h" #include "sgsap-handler.h" -static void sgsap_connect_timeout(void *data); - void sgsap_state_initial(ogs_fsm_t *s, mme_event_t *e) { mme_vlr_t *vlr = NULL; @@ -40,7 +39,7 @@ void sgsap_state_initial(ogs_fsm_t *s, mme_event_t *e) ogs_assert(vlr); vlr->t_conn = ogs_timer_add(mme_self()->timer_mgr, - sgsap_connect_timeout, vlr); + mme_timer_sgs_cli_conn_to_srv, vlr); ogs_assert(vlr->t_conn); OGS_FSM_TRAN(s, &sgsap_state_will_connect); @@ -62,7 +61,11 @@ void sgsap_state_final(ogs_fsm_t *s, mme_event_t *e) void sgsap_state_will_connect(ogs_fsm_t *s, mme_event_t *e) { + char buf[OGS_ADDRSTRLEN]; + mme_vlr_t *vlr = NULL; + ogs_socknode_t *node = NULL; + ogs_sockaddr_t *addr = NULL; ogs_assert(s); ogs_assert(e); @@ -81,6 +84,31 @@ void sgsap_state_will_connect(ogs_fsm_t *s, mme_event_t *e) case OGS_FSM_EXIT_SIG: ogs_timer_stop(vlr->t_conn); break; + case MME_EVT_SGSAP_TIMER: + switch(e->timer_id) { + case MME_TIMER_SGS_CLI_CONN_TO_SRV: + vlr = e->vlr; + ogs_assert(vlr); + node = vlr->node; + ogs_assert(node); + addr = node->addr; + ogs_assert(addr); + + ogs_warn("[SGsAP] Connect to VLR [%s]:%d failed", + OGS_ADDR(addr, buf), OGS_PORT(addr)); + + ogs_assert(vlr->t_conn); + ogs_timer_start(vlr->t_conn, mme_self()->t_conn_value); + + mme_vlr_free_node(vlr); + sgsap_client(vlr); + break; + default: + ogs_error("Unknown timer[%s:%d]", + mme_timer_get_name(e->timer_id), e->timer_id); + break; + } + break; case MME_EVT_SGSAP_LO_SCTP_COMM_UP: OGS_FSM_TRAN(s, sgsap_state_connected); break; @@ -170,28 +198,3 @@ void sgsap_state_exception(ogs_fsm_t *s, mme_event_t *e) break; } } - -static void sgsap_connect_timeout(void *data) -{ - char buf[OGS_ADDRSTRLEN]; - - mme_vlr_t *vlr = data; - ogs_socknode_t *node = NULL; - ogs_sockaddr_t *addr = NULL; - - ogs_assert(vlr); - node = vlr->node; - ogs_assert(node); - addr = node->addr; - ogs_assert(addr); - - ogs_warn("[SGsAP] Connect to VLR [%s]:%d failed", - OGS_ADDR(addr, buf), OGS_PORT(addr)); - - ogs_assert(vlr->t_conn); - ogs_timer_start(vlr->t_conn, mme_self()->t_conn_value); - - mme_vlr_free_node(vlr); - sgsap_client(vlr); -} -