From 6e306f47bcc140d20d0fc148e260d9961e64f57e Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Tue, 10 Sep 2024 18:45:18 +0200 Subject: [PATCH] bts: Remove acc timers during talloc destructor This went unnoticed because so far there's not clear way to free a BTS, eg. through VTY. Change-Id: I0f94d8fc775953ee98eebc4d80f825404c4f92b2 --- include/osmocom/bsc/acc.h | 2 ++ src/osmo-bsc/acc.c | 16 ++++++++++++++++ src/osmo-bsc/bts.c | 3 +++ tests/acc/acc_test.c | 2 -- tests/gsm0408/gsm0408_test.c | 1 - 5 files changed, 21 insertions(+), 3 deletions(-) diff --git a/include/osmocom/bsc/acc.h b/include/osmocom/bsc/acc.h index 531a69acf..567482587 100644 --- a/include/osmocom/bsc/acc.h +++ b/include/osmocom/bsc/acc.h @@ -53,6 +53,7 @@ struct acc_mgr { }; void acc_mgr_init(struct acc_mgr *acc_mgr, struct gsm_bts *bts); +void acc_mgr_deinit(struct acc_mgr *acc_mgr); uint8_t acc_mgr_get_len_allowed_adm(struct acc_mgr *acc_mgr); uint8_t acc_mgr_get_len_allowed_ramp(struct acc_mgr *acc_mgr); void acc_mgr_set_len_allowed_adm(struct acc_mgr *acc_mgr, uint8_t len_allowed_adm); @@ -164,6 +165,7 @@ static inline unsigned int acc_ramp_is_running(struct acc_ramp *acc_ramp) void acc_ramp_global_init(void); void acc_ramp_init(struct acc_ramp *acc_ramp, struct gsm_bts *bts); +void acc_ramp_deinit(struct acc_ramp *acc_ramp); int acc_ramp_set_step_size(struct acc_ramp *acc_ramp, unsigned int step_size); int acc_ramp_set_step_interval(struct acc_ramp *acc_ramp, unsigned int step_interval); int acc_ramp_set_chan_load_thresholds(struct acc_ramp *acc_ramp, unsigned int low_threshold, unsigned int up_threshold); diff --git a/src/osmo-bsc/acc.c b/src/osmo-bsc/acc.c index 80a35766c..4b5aba055 100644 --- a/src/osmo-bsc/acc.c +++ b/src/osmo-bsc/acc.c @@ -296,6 +296,11 @@ void acc_mgr_init(struct acc_mgr *acc_mgr, struct gsm_bts *bts) acc_mgr_gen_subset(acc_mgr, false); } +void acc_mgr_deinit(struct acc_mgr *acc_mgr) +{ + osmo_timer_del(&acc_mgr->rotate_timer); +} + uint8_t acc_mgr_get_len_allowed_adm(struct acc_mgr *acc_mgr) { return acc_mgr->len_allowed_adm; @@ -474,6 +479,17 @@ void acc_ramp_init(struct acc_ramp *acc_ramp, struct gsm_bts *bts) osmo_timer_setup(&acc_ramp->step_timer, do_acc_ramping_step, acc_ramp); } +/*! + * Deinitialize an acc_ramp data structure. + * Called when the user is going to free the structure. + * + * \param[in] acc_ramp Pointer to acc_ramp structure to be deinitialized. + */ +void acc_ramp_deinit(struct acc_ramp *acc_ramp) +{ + osmo_timer_del(&acc_ramp->step_timer); +} + /*! * Change the ramping step size which controls how many ACCs will be allowed per ramping step. * Returns negative on error (step_size out of range), else zero. diff --git a/src/osmo-bsc/bts.c b/src/osmo-bsc/bts.c index 50a857951..790a8d47b 100644 --- a/src/osmo-bsc/bts.c +++ b/src/osmo-bsc/bts.c @@ -163,6 +163,9 @@ static int gsm_bts_talloc_destructor(struct gsm_bts *bts) paging_destructor(bts); bts_setup_ramp_remove(bts); + acc_ramp_deinit(&bts->acc_ramp); + acc_mgr_deinit(&bts->acc_mgr); + osmo_timer_del(&bts->cbch_timer); bts->site_mgr->bts[0] = NULL; diff --git a/tests/acc/acc_test.c b/tests/acc/acc_test.c index 3dcdc1b46..84a63b026 100644 --- a/tests/acc/acc_test.c +++ b/tests/acc/acc_test.c @@ -58,8 +58,6 @@ static inline struct gsm_bts *_bts_init(struct gsm_network *net, const char *msg #define bts_del(bts) _bts_del(bts, __func__) static inline void _bts_del(struct gsm_bts *bts, const char *msg) { - osmo_timer_del(&bts->acc_mgr.rotate_timer); - osmo_timer_del(&bts->acc_ramp.step_timer); talloc_free(bts->site_mgr); fprintf(stderr, "BTS deallocated OK in %s()\n", msg); } diff --git a/tests/gsm0408/gsm0408_test.c b/tests/gsm0408/gsm0408_test.c index b35df60ab..4f4b4d444 100644 --- a/tests/gsm0408/gsm0408_test.c +++ b/tests/gsm0408/gsm0408_test.c @@ -137,7 +137,6 @@ static inline struct gsm_bts *_bts_init(struct gsm_network *net, const char *msg #define bts_del(bts) _bts_del(bts, __func__) static inline void _bts_del(struct gsm_bts *bts, const char *msg) { - osmo_timer_del(&bts->acc_mgr.rotate_timer); talloc_free(bts->site_mgr); printf("BTS deallocated OK in %s()\n", msg); }