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
This commit is contained in:
parent
1cfec9d2c9
commit
e1f33e5c10
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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->oml_link ? bts_updowntime(bts) : 0);
|
||||
if (!cmd->reply) {
|
||||
cmd->reply = "OOM";
|
||||
return CTRL_CMD_ERROR;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue