From 76f2266317c0df8fd51a44af3dfa996924f5e751 Mon Sep 17 00:00:00 2001 From: Andreas Eversberg Date: Fri, 12 Jan 2024 11:29:19 +0100 Subject: [PATCH] Also track downtime when OML link is lost This will be used in a later patch to dertemine when a BTS became offline. Related: OS#6018 Change-Id: I1776099cbfef51af1d5a3a056fb0654abd7366a9 --- include/osmocom/bsc/bts.h | 6 +++--- src/osmo-bsc/bts.c | 11 ++++++----- src/osmo-bsc/bts_ctrl.c | 2 +- src/osmo-bsc/bts_ipaccess_nanobts.c | 7 +++++-- src/osmo-bsc/bts_vty.c | 2 +- src/osmo-bsc/e1_config.c | 2 +- 6 files changed, 17 insertions(+), 13 deletions(-) diff --git a/include/osmocom/bsc/bts.h b/include/osmocom/bsc/bts.h index a1799eb0a..e9634ee3e 100644 --- a/include/osmocom/bsc/bts.h +++ b/include/osmocom/bsc/bts.h @@ -375,8 +375,8 @@ struct gsm_bts { struct e1inp_sign_link *oml_link; /* Timer to use for deferred drop of OML link, see \ref ipaccess_drop_oml_deferred */ struct osmo_timer_list oml_drop_link_timer; - /* when OML link was established */ - time_t uptime; + /* when OML link was established or lost */ + time_t updowntime; /* Abis network management O&M handle */ struct abis_nm_h *nmh; @@ -815,7 +815,7 @@ int bts_gprs_mode_is_compat(struct gsm_bts *bts, enum bts_gprs_mode mode); #define BTS_STORE_UPTIME_INTERVAL 10 /* in seconds */ void bts_store_uptime(struct gsm_bts *bts); -unsigned long long bts_uptime(const struct gsm_bts *bts); +unsigned long long bts_updowntime(const struct gsm_bts *bts); #define BTS_STORE_LCHAN_DURATIONS_INTERVAL 1 /* in seconds */ void bts_store_lchan_durations(struct gsm_bts *bts); diff --git a/src/osmo-bsc/bts.c b/src/osmo-bsc/bts.c index 733d16ee3..8cc9e9af0 100644 --- a/src/osmo-bsc/bts.c +++ b/src/osmo-bsc/bts.c @@ -766,7 +766,8 @@ struct gsm_bts_trx *gsm_bts_trx_num(const struct gsm_bts *bts, int num) void bts_store_uptime(struct gsm_bts *bts) { - osmo_stat_item_set(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_UPTIME_SECONDS), bts_uptime(bts)); + osmo_stat_item_set(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_UPTIME_SECONDS), + bts->oml_link ? bts_updowntime(bts) : 0); } void bts_store_lchan_durations(struct gsm_bts *bts) @@ -824,20 +825,20 @@ void bts_store_lchan_durations(struct gsm_bts *bts) rate_ctr_add(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHAN_SDCCH_ACTIVE_MILLISECONDS_TOTAL), elapsed_sdcch_ms); } -unsigned long long bts_uptime(const struct gsm_bts *bts) +unsigned long long bts_updowntime(const struct gsm_bts *bts) { struct timespec tp; - if (!bts->uptime || !bts->oml_link) + if (!bts->updowntime) return 0; if (osmo_clock_gettime(CLOCK_MONOTONIC, &tp) != 0) { - LOGP(DNM, LOGL_ERROR, "BTS %u uptime computation failure: %s\n", bts->nr, strerror(errno)); + LOGP(DNM, LOGL_ERROR, "BTS %u uptime/downtime computation failure: %s\n", bts->nr, strerror(errno)); return 0; } /* monotonic clock helps to ensure that the conversion is valid */ - return difftime(tp.tv_sec, bts->uptime); + return difftime(tp.tv_sec, bts->updowntime); } char *get_model_oml_status(const struct gsm_bts *bts) diff --git a/src/osmo-bsc/bts_ctrl.c b/src/osmo-bsc/bts_ctrl.c index acbe68ac5..bebab1dd3 100644 --- a/src/osmo-bsc/bts_ctrl.c +++ b/src/osmo-bsc/bts_ctrl.c @@ -372,7 +372,7 @@ static int get_bts_oml_up(struct ctrl_cmd *cmd, void *data) { const struct gsm_bts *bts = cmd->node; - cmd->reply = talloc_asprintf(cmd, "%llu", bts_uptime(bts)); + cmd->reply = talloc_asprintf(cmd, "%llu", bts_updowntime(bts)); if (!cmd->reply) { cmd->reply = "OOM"; return CTRL_CMD_ERROR; diff --git a/src/osmo-bsc/bts_ipaccess_nanobts.c b/src/osmo-bsc/bts_ipaccess_nanobts.c index c690b4639..b0532e5d9 100644 --- a/src/osmo-bsc/bts_ipaccess_nanobts.c +++ b/src/osmo-bsc/bts_ipaccess_nanobts.c @@ -527,6 +527,8 @@ void ipaccess_drop_oml(struct gsm_bts *bts, const char *reason) struct gsm_bts_trx_ts *ts ; uint8_t tn; uint8_t i; + struct timespec tp; + int rc; /* First of all, remove deferred drop if enabled */ osmo_timer_del(&bts->oml_drop_link_timer); @@ -537,7 +539,8 @@ void ipaccess_drop_oml(struct gsm_bts *bts, const char *reason) LOG_BTS(bts, DLINP, LOGL_NOTICE, "Dropping OML link: %s\n", reason); e1inp_sign_link_destroy(bts->oml_link); bts->oml_link = NULL; - bts->uptime = 0; + rc = osmo_clock_gettime(CLOCK_MONOTONIC, &tp); + bts->updowntime = (rc < 0) ? 0 : tp.tv_sec; /* we don't need sub-second precision for downtime */ osmo_stat_item_dec(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_OML_CONNECTED), 1); gsm_bts_stats_reset(bts); @@ -710,7 +713,7 @@ ipaccess_sign_link_up(void *unit_data, struct e1inp_line *line, E1INP_SIGN_OML, bts->c0, bts->oml_tei, 0); rc = osmo_clock_gettime(CLOCK_MONOTONIC, &tp); - bts->uptime = (rc < 0) ? 0 : tp.tv_sec; /* we don't need sub-second precision for uptime */ + bts->updowntime = (rc < 0) ? 0 : tp.tv_sec; /* we don't need sub-second precision for uptime */ if (!(sign_link->trx->bts->ip_access.flags & OML_UP)) { e1inp_event(sign_link->ts, S_L_INP_TEI_UP, sign_link->tei, sign_link->sapi); diff --git a/src/osmo-bsc/bts_vty.c b/src/osmo-bsc/bts_vty.c index 8b97dceab..8aa1f8920 100644 --- a/src/osmo-bsc/bts_vty.c +++ b/src/osmo-bsc/bts_vty.c @@ -4127,7 +4127,7 @@ void bts_dump_vty(struct vty *vty, struct gsm_bts *bts) vty_out(vty, " OML Link state: %s", get_model_oml_status(bts)); if (bts_setup_ramp_active(bts->network)) vty_out(vty, " BTS Ramping: %s", bts_setup_ramp_get_state_str(bts)); - sec = bts_uptime(bts); + sec = bts_updowntime(bts); if (sec) vty_out(vty, " %llu days %llu hours %llu min. %llu sec.", OSMO_SEC2DAY(sec), OSMO_SEC2HRS(sec), OSMO_SEC2MIN(sec), sec % 60); diff --git a/src/osmo-bsc/e1_config.c b/src/osmo-bsc/e1_config.c index db77234c9..dbea3e9e0 100644 --- a/src/osmo-bsc/e1_config.c +++ b/src/osmo-bsc/e1_config.c @@ -197,7 +197,7 @@ int e1_reconfig_bts(struct gsm_bts *bts) e1inp_sign_link_destroy(bts->oml_link); bts->oml_link = oml_link; rc = osmo_clock_gettime(CLOCK_MONOTONIC, &tp); - bts->uptime = (rc < 0) ? 0 : tp.tv_sec; /* we don't need sub-second precision for uptime */ + bts->updowntime = (rc < 0) ? 0 : tp.tv_sec; /* we don't need sub-second precision for uptime */ llist_for_each_entry(trx, &bts->trx_list, list) e1_reconfig_trx(trx);