diff options
-rw-r--r-- | include/osmocom/bsc/gsm_data.h | 10 | ||||
-rw-r--r-- | src/osmo-bsc/bsc_init.c | 34 | ||||
-rw-r--r-- | src/osmo-bsc/bsc_subscr_conn_fsm.c | 2 | ||||
-rw-r--r-- | src/osmo-bsc/handover_fsm.c | 2 |
4 files changed, 37 insertions, 11 deletions
diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h index 1dac6707c..1a4a1c48b 100644 --- a/include/osmocom/bsc/gsm_data.h +++ b/include/osmocom/bsc/gsm_data.h @@ -1089,6 +1089,11 @@ enum { BSC_STAT_NUM_BTS_TOTAL, }; +/* BTS counter index if a BTS could not be found + * Currently we are limited to bts 0 - 255 in the VTY, but that might change in + * the future so use 2**16 */ +#define BTS_STAT_IDX_UNKNOWN (UINT16_MAX + 1) + struct gsm_tz { int override; /* if 0, use system's time zone instead. */ int hr; /* hour */ @@ -1123,6 +1128,11 @@ struct gsm_network { struct llist_head bts_list; struct llist_head bts_rejected; + /* BTS-based counters when we can't find the actual BTS + * e.g. when conn->lchan is NULL */ + struct rate_ctr_group *bts_unknown_ctrs; + struct osmo_stat_item_group *bts_unknown_statg; + /* see gsm_network_T_defs */ struct osmo_tdef *T_defs; diff --git a/src/osmo-bsc/bsc_init.c b/src/osmo-bsc/bsc_init.c index e45b5e8e3..22eba50d1 100644 --- a/src/osmo-bsc/bsc_init.c +++ b/src/osmo-bsc/bsc_init.c @@ -90,8 +90,7 @@ static struct gsm_network *bsc_network_init(void *ctx) net->cbc = talloc_zero(net, struct bsc_cbc_link); if (!net->cbc) { - talloc_free(net); - return NULL; + goto err_out; } /* Init back pointer */ @@ -104,16 +103,19 @@ static struct gsm_network *bsc_network_init(void *ctx) /* init statistics */ net->bsc_ctrs = rate_ctr_group_alloc(net, &bsc_ctrg_desc, 0); - if (!net->bsc_ctrs) { - talloc_free(net); - return NULL; - } + if (!net->bsc_ctrs) + goto err_out; net->bsc_statg = osmo_stat_item_group_alloc(net, &bsc_statg_desc, 0); - if (!net->bsc_statg) { - rate_ctr_group_free(net->bsc_ctrs); - talloc_free(net); - return NULL; - } + if (!net->bsc_statg) + goto err_free_bsc_ctr; + + /* init statistics */ + net->bts_unknown_ctrs = rate_ctr_group_alloc(net, &bts_ctrg_desc, BTS_STAT_IDX_UNKNOWN); + if (!net->bts_unknown_ctrs) + goto err_free_bsc_ctr_stat; + net->bts_unknown_statg = osmo_stat_item_group_alloc(net, &bts_statg_desc, BTS_STAT_IDX_UNKNOWN); + if (!net->bts_unknown_statg) + goto err_free_all; INIT_LLIST_HEAD(&net->bts_rejected); gsm_net_update_ctype(net); @@ -134,6 +136,16 @@ static struct gsm_network *bsc_network_init(void *ctx) net->cbc->config.listen_hostname = talloc_strdup(net->cbc, "127.0.0.1"); return net; + +err_free_all: + rate_ctr_group_free(net->bts_unknown_ctrs); +err_free_bsc_ctr_stat: + osmo_stat_item_group_free(net->bsc_statg); +err_free_bsc_ctr: + rate_ctr_group_free(net->bsc_ctrs); +err_out: + talloc_free(net); + return NULL; } int bsc_network_alloc(void) diff --git a/src/osmo-bsc/bsc_subscr_conn_fsm.c b/src/osmo-bsc/bsc_subscr_conn_fsm.c index 04718dafd..22aa70af7 100644 --- a/src/osmo-bsc/bsc_subscr_conn_fsm.c +++ b/src/osmo-bsc/bsc_subscr_conn_fsm.c @@ -386,6 +386,8 @@ static void gscon_fsm_active(struct osmo_fsm_inst *fi, uint32_t event, void *dat rate_ctr_inc(&conn->network->bsc_ctrs->ctr[BSC_CTR_HANDOVER_ATTEMPTED]); if (bts) rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_HANDOVER_ATTEMPTED]); + else + rate_ctr_inc(&conn->network->bts_unknown_ctrs->ctr[BTS_CTR_HANDOVER_ATTEMPTED]); /* Rely on handover_fsm timeout */ if (osmo_fsm_inst_state_chg(fi, ST_HANDOVER, 0, 0)) diff --git a/src/osmo-bsc/handover_fsm.c b/src/osmo-bsc/handover_fsm.c index e238d837e..78dbd3308 100644 --- a/src/osmo-bsc/handover_fsm.c +++ b/src/osmo-bsc/handover_fsm.c @@ -96,6 +96,8 @@ bts_ctr_description[counter].description); \ if (bts) \ rate_ctr_inc(&bts->bts_ctrs->ctr[counter]); \ + else \ + rate_ctr_inc(&conn->network->bts_unknown_ctrs->ctr[counter]); \ } while(0) #define ho_count(bts, counter) do { \ |