diff --git a/lib/core/ogs-timer.c b/lib/core/ogs-timer.c index fd0fa254d..43a921ff8 100644 --- a/lib/core/ogs-timer.c +++ b/lib/core/ogs-timer.c @@ -70,6 +70,12 @@ void ogs_timer_mgr_destroy(ogs_timer_mgr_t *manager) ogs_free(manager); } +static ogs_timer_t *ogs_timer_cycle(ogs_timer_mgr_t *manager, ogs_timer_t *timer) +{ + ogs_assert(manager); + return ogs_pool_cycle(&manager->pool, timer); +} + ogs_timer_t *ogs_timer_add( ogs_timer_mgr_t *manager, void (*cb)(void *data), void *data) { @@ -77,7 +83,11 @@ ogs_timer_t *ogs_timer_add( ogs_assert(manager); ogs_pool_alloc(&manager->pool, &timer); - ogs_assert(timer); + if (!timer) { + ogs_fatal("ogs_pool_alloc() failed"); + return NULL; + } + ogs_expect_or_return_val(timer, NULL); memset(timer, 0, sizeof *timer); timer->cb = cb; @@ -88,19 +98,25 @@ ogs_timer_t *ogs_timer_add( return timer; } -void ogs_timer_delete(ogs_timer_t *timer) +void ogs_timer_delete_debug(ogs_timer_t *timer, const char *file_line) { ogs_timer_mgr_t *manager; ogs_assert(timer); manager = timer->manager; ogs_assert(manager); + timer = ogs_timer_cycle(manager, timer); + if (!timer) { + ogs_fatal("ogs_timer_delete() failed in %s", file_line); + ogs_assert_if_reached(); + } ogs_timer_stop(timer); ogs_pool_free(&manager->pool, timer); } -void ogs_timer_start(ogs_timer_t *timer, ogs_time_t duration) +void ogs_timer_start_debug( + ogs_timer_t *timer, ogs_time_t duration, const char *file_line) { ogs_timer_mgr_t *manager = NULL; ogs_assert(timer); @@ -108,6 +124,11 @@ void ogs_timer_start(ogs_timer_t *timer, ogs_time_t duration) manager = timer->manager; ogs_assert(manager); + timer = ogs_timer_cycle(manager, timer); + if (!timer) { + ogs_fatal("ogs_timer_start() failed in %s", file_line); + ogs_assert_if_reached(); + } if (timer->running == true) ogs_rbtree_delete(&manager->tree, timer); @@ -116,12 +137,18 @@ void ogs_timer_start(ogs_timer_t *timer, ogs_time_t duration) add_timer_node(&manager->tree, timer, duration); } -void ogs_timer_stop(ogs_timer_t *timer) +void ogs_timer_stop_debug(ogs_timer_t *timer, const char *file_line) { ogs_timer_mgr_t *manager = NULL; ogs_assert(timer); manager = timer->manager; ogs_assert(manager); + timer = ogs_timer_cycle(manager, timer); + ogs_assert(timer); + if (!timer) { + ogs_fatal("ogs_timer_stop() failed in %s", file_line); + ogs_assert_if_reached(); + } if (timer->running == false) return; @@ -178,4 +205,3 @@ void ogs_timer_mgr_expire(ogs_timer_mgr_t *manager) this->cb(this->data); } } - diff --git a/lib/core/ogs-timer.h b/lib/core/ogs-timer.h index 7ab14eee5..f38b208a3 100644 --- a/lib/core/ogs-timer.h +++ b/lib/core/ogs-timer.h @@ -46,10 +46,17 @@ void ogs_timer_mgr_destroy(ogs_timer_mgr_t *manager); ogs_timer_t *ogs_timer_add( ogs_timer_mgr_t *manager, void (*cb)(void *data), void *data); -void ogs_timer_delete(ogs_timer_t *timer); +#define ogs_timer_delete(timer) \ + ogs_timer_delete_debug(timer, OGS_FILE_LINE) +void ogs_timer_delete_debug(ogs_timer_t *timer, const char *file_line); -void ogs_timer_start(ogs_timer_t *timer, ogs_time_t duration); -void ogs_timer_stop(ogs_timer_t *timer); +#define ogs_timer_start(timer, duration) \ + ogs_timer_start_debug(timer, duration, OGS_FILE_LINE) +void ogs_timer_start_debug( + ogs_timer_t *timer, ogs_time_t duration, const char *file_line); +#define ogs_timer_stop(timer) \ + ogs_timer_stop_debug(timer, OGS_FILE_LINE) +void ogs_timer_stop_debug(ogs_timer_t *timer, const char *file_line); ogs_time_t ogs_timer_mgr_next(ogs_timer_mgr_t *manager); void ogs_timer_mgr_expire(ogs_timer_mgr_t *manager); diff --git a/lib/sbi/client.c b/lib/sbi/client.c index b2af72783..8f30ac999 100644 --- a/lib/sbi/client.c +++ b/lib/sbi/client.c @@ -106,10 +106,13 @@ ogs_sbi_client_t *ogs_sbi_client_add(ogs_sockaddr_t *addr) ogs_assert(OGS_OK == ogs_copyaddrinfo(&client->node.addr, addr)); - ogs_list_init(&client->connection_list); - client->t_curl = ogs_timer_add( ogs_app()->timer_mgr, multi_timer_expired, client); + if (!client->t_curl) { + ogs_error("ogs_timer_add() failed"); + ogs_pool_free(&client_pool, client); + return NULL; + } multi = client->multi = curl_multi_init(); ogs_assert(multi); @@ -122,6 +125,8 @@ ogs_sbi_client_t *ogs_sbi_client_add(ogs_sockaddr_t *addr) ogs_app()->pool.stream); #endif + ogs_list_init(&client->connection_list); + ogs_list_add(&ogs_sbi_self()->client_list, client); return client; diff --git a/lib/sbi/mhd-server.c b/lib/sbi/mhd-server.c index 6ce154263..aadf0aec0 100644 --- a/lib/sbi/mhd-server.c +++ b/lib/sbi/mhd-server.c @@ -135,7 +135,11 @@ static ogs_sbi_session_t *session_add(ogs_sbi_server_t *server, sbi_sess->timer = ogs_timer_add( ogs_app()->timer_mgr, session_timer_expired, sbi_sess); - ogs_assert(sbi_sess->timer); + if (!sbi_sess->timer) { + ogs_error("ogs_timer_add() failed"); + ogs_pool_free(&session_pool, sbi_sess); + return NULL; + } /* If User does not send HTTP response within deadline, * Open5GS will assert this program. */ diff --git a/src/amf/context.c b/src/amf/context.c index 3b82f7f88..d2e80cea8 100644 --- a/src/amf/context.c +++ b/src/amf/context.c @@ -973,6 +973,14 @@ ran_ue_t *ran_ue_add(amf_gnb_t *gnb, uint32_t ran_ue_ngap_id) ogs_assert(ran_ue); memset(ran_ue, 0, sizeof *ran_ue); + ran_ue->t_ng_holding = ogs_timer_add( + ogs_app()->timer_mgr, amf_timer_ng_holding_timer_expire, ran_ue); + if (!ran_ue->t_ng_holding) { + ogs_error("ogs_timer_add() failed"); + ogs_pool_free(&ran_ue_pool, ran_ue); + return NULL; + } + ran_ue->index = ogs_pool_index(&ran_ue_pool, ran_ue); ogs_assert(ran_ue->index > 0 && ran_ue->index <= ogs_app()->max.ue); @@ -989,10 +997,6 @@ ran_ue_t *ran_ue_add(amf_gnb_t *gnb, uint32_t ran_ue_ngap_id) ran_ue->gnb_ostream_id = OGS_NEXT_ID(gnb->ostream_id, 1, gnb->max_num_of_ostreams-1); - ran_ue->t_ng_holding = ogs_timer_add( - ogs_app()->timer_mgr, amf_timer_ng_holding_timer_expire, ran_ue); - ogs_assert(ran_ue->t_ng_holding); - ran_ue->gnb = gnb; ogs_list_add(&gnb->ran_ue_list, ran_ue); @@ -1163,6 +1167,56 @@ amf_ue_t *amf_ue_add(ran_ue_t *ran_ue) ogs_assert(amf_ue); memset(amf_ue, 0, sizeof *amf_ue); + /* Add All Timers */ + amf_ue->t3513.timer = ogs_timer_add( + ogs_app()->timer_mgr, amf_timer_t3513_expire, amf_ue); + if (!amf_ue->t3513.timer) { + ogs_error("ogs_timer_add() failed"); + ogs_pool_free(&amf_ue_pool, amf_ue); + return NULL; + } + amf_ue->t3513.pkbuf = NULL; + amf_ue->t3522.timer = ogs_timer_add( + ogs_app()->timer_mgr, amf_timer_t3522_expire, amf_ue); + if (!amf_ue->t3522.timer) { + ogs_error("ogs_timer_add() failed"); + ogs_pool_free(&amf_ue_pool, amf_ue); + return NULL; + } + amf_ue->t3522.pkbuf = NULL; + amf_ue->t3550.timer = ogs_timer_add( + ogs_app()->timer_mgr, amf_timer_t3550_expire, amf_ue); + if (!amf_ue->t3550.timer) { + ogs_error("ogs_timer_add() failed"); + ogs_pool_free(&amf_ue_pool, amf_ue); + return NULL; + } + amf_ue->t3550.pkbuf = NULL; + amf_ue->t3555.timer = ogs_timer_add( + ogs_app()->timer_mgr, amf_timer_t3555_expire, amf_ue); + if (!amf_ue->t3555.timer) { + ogs_error("ogs_timer_add() failed"); + ogs_pool_free(&amf_ue_pool, amf_ue); + return NULL; + } + amf_ue->t3555.pkbuf = NULL; + amf_ue->t3560.timer = ogs_timer_add( + ogs_app()->timer_mgr, amf_timer_t3560_expire, amf_ue); + if (!amf_ue->t3560.timer) { + ogs_error("ogs_timer_add() failed"); + ogs_pool_free(&amf_ue_pool, amf_ue); + return NULL; + } + amf_ue->t3560.pkbuf = NULL; + amf_ue->t3570.timer = ogs_timer_add( + ogs_app()->timer_mgr, amf_timer_t3570_expire, amf_ue); + if (!amf_ue->t3570.timer) { + ogs_error("ogs_timer_add() failed"); + ogs_pool_free(&amf_ue_pool, amf_ue); + return NULL; + } + amf_ue->t3570.pkbuf = NULL; + /* SBI Type */ amf_ue->sbi.type = OGS_SBI_OBJ_UE_TYPE; @@ -1178,26 +1232,6 @@ amf_ue_t *amf_ue_add(ran_ue_t *ran_ue) amf_ue->nas.amf.ksi = OGS_NAS_KSI_NO_KEY_IS_AVAILABLE; amf_ue->abba_len = 2; - /* Add All Timers */ - amf_ue->t3513.timer = ogs_timer_add( - ogs_app()->timer_mgr, amf_timer_t3513_expire, amf_ue); - amf_ue->t3513.pkbuf = NULL; - amf_ue->t3522.timer = ogs_timer_add( - ogs_app()->timer_mgr, amf_timer_t3522_expire, amf_ue); - amf_ue->t3522.pkbuf = NULL; - amf_ue->t3550.timer = ogs_timer_add( - ogs_app()->timer_mgr, amf_timer_t3550_expire, amf_ue); - amf_ue->t3550.pkbuf = NULL; - amf_ue->t3555.timer = ogs_timer_add( - ogs_app()->timer_mgr, amf_timer_t3555_expire, amf_ue); - amf_ue->t3555.pkbuf = NULL; - amf_ue->t3560.timer = ogs_timer_add( - ogs_app()->timer_mgr, amf_timer_t3560_expire, amf_ue); - amf_ue->t3560.pkbuf = NULL; - amf_ue->t3570.timer = ogs_timer_add( - ogs_app()->timer_mgr, amf_timer_t3570_expire, amf_ue); - amf_ue->t3570.pkbuf = NULL; - amf_ue_fsm_init(amf_ue); ogs_list_add(&self.amf_ue_list, amf_ue); diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index 851730260..c1cc9abcb 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -1943,6 +1943,14 @@ enb_ue_t *enb_ue_add(mme_enb_t *enb, uint32_t enb_ue_s1ap_id) ogs_assert(enb_ue); memset(enb_ue, 0, sizeof *enb_ue); + enb_ue->t_s1_holding = ogs_timer_add( + ogs_app()->timer_mgr, mme_timer_s1_holding_timer_expire, enb_ue); + if (!enb_ue->t_s1_holding) { + ogs_error("ogs_timer_add() failed"); + ogs_pool_free(&enb_ue_pool, enb_ue); + return NULL; + } + enb_ue->index = ogs_pool_index(&enb_ue_pool, enb_ue); ogs_assert(enb_ue->index > 0 && enb_ue->index <= ogs_app()->max.ue); @@ -1959,10 +1967,6 @@ enb_ue_t *enb_ue_add(mme_enb_t *enb, uint32_t enb_ue_s1ap_id) enb_ue->enb_ostream_id = OGS_NEXT_ID(enb->ostream_id, 1, enb->max_num_of_ostreams-1); - enb_ue->t_s1_holding = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_s1_holding_timer_expire, enb_ue); - ogs_assert(enb_ue->t_s1_holding); - enb_ue->enb = enb; ogs_list_add(&enb->enb_ue_list, enb_ue); @@ -2047,7 +2051,11 @@ sgw_ue_t *sgw_ue_add(mme_sgw_t *sgw) sgw_ue->t_s11_holding = ogs_timer_add( ogs_app()->timer_mgr, mme_timer_s11_holding_timer_expire, sgw_ue); - ogs_assert(sgw_ue->t_s11_holding); + if (!sgw_ue->t_s11_holding) { + ogs_error("ogs_timer_add() failed"); + ogs_pool_free(&sgw_ue_pool, sgw_ue); + return NULL; + } sgw_ue->sgw = sgw; @@ -2259,6 +2267,48 @@ mme_ue_t *mme_ue_add(enb_ue_t *enb_ue) ogs_assert(mme_ue); memset(mme_ue, 0, sizeof *mme_ue); + /* Add All Timers */ + mme_ue->t3413.timer = ogs_timer_add( + ogs_app()->timer_mgr, mme_timer_t3413_expire, mme_ue); + if (!mme_ue->t3413.timer) { + ogs_error("ogs_timer_add() failed"); + ogs_pool_free(&mme_ue_pool, mme_ue); + return NULL; + } + mme_ue->t3413.pkbuf = NULL; + mme_ue->t3422.timer = ogs_timer_add( + ogs_app()->timer_mgr, mme_timer_t3422_expire, mme_ue); + if (!mme_ue->t3422.timer) { + ogs_error("ogs_timer_add() failed"); + ogs_pool_free(&mme_ue_pool, mme_ue); + return NULL; + } + mme_ue->t3422.pkbuf = NULL; + mme_ue->t3450.timer = ogs_timer_add( + ogs_app()->timer_mgr, mme_timer_t3450_expire, mme_ue); + if (!mme_ue->t3450.timer) { + ogs_error("ogs_timer_add() failed"); + ogs_pool_free(&mme_ue_pool, mme_ue); + return NULL; + } + mme_ue->t3450.pkbuf = NULL; + mme_ue->t3460.timer = ogs_timer_add( + ogs_app()->timer_mgr, mme_timer_t3460_expire, mme_ue); + if (!mme_ue->t3460.timer) { + ogs_error("ogs_timer_add() failed"); + ogs_pool_free(&mme_ue_pool, mme_ue); + return NULL; + } + mme_ue->t3460.pkbuf = NULL; + mme_ue->t3470.timer = ogs_timer_add( + ogs_app()->timer_mgr, mme_timer_t3470_expire, mme_ue); + if (!mme_ue->t3470.timer) { + ogs_error("ogs_timer_add() failed"); + ogs_pool_free(&mme_ue_pool, mme_ue); + return NULL; + } + mme_ue->t3470.pkbuf = NULL; + mme_ebi_pool_init(mme_ue); ogs_list_init(&mme_ue->sess_list); @@ -2290,23 +2340,6 @@ mme_ue_t *mme_ue_add(enb_ue_t *enb_ue) mme_ue->csmap = NULL; mme_ue->vlr_ostream_id = 0; - /* Add All Timers */ - mme_ue->t3413.timer = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_t3413_expire, mme_ue); - mme_ue->t3413.pkbuf = NULL; - mme_ue->t3422.timer = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_t3422_expire, mme_ue); - mme_ue->t3422.pkbuf = NULL; - mme_ue->t3450.timer = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_t3450_expire, mme_ue); - mme_ue->t3450.pkbuf = NULL; - mme_ue->t3460.timer = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_t3460_expire, mme_ue); - mme_ue->t3460.pkbuf = NULL; - mme_ue->t3470.timer = ogs_timer_add( - ogs_app()->timer_mgr, mme_timer_t3470_expire, mme_ue); - mme_ue->t3470.pkbuf = NULL; - mme_ue_fsm_init(mme_ue); ogs_list_add(&self.mme_ue_list, mme_ue);