[PATCH] osmo-bsc[master]: WIP: Move most counter from per-BSC to per-BTS level

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Harald Welte gerrit-no-reply at lists.osmocom.org
Tue Oct 24 16:23:20 UTC 2017


Review at  https://gerrit.osmocom.org/4401

WIP: Move most counter from per-BSC to per-BTS level

Operators want to see statistics for each BTS, not just cumulative for
all BTS/cells/sites.

Change-Id: I34356cb5a62b09b7ddcb4194c33e4db4560743e1
---
M include/osmocom/bsc/gsm_data.h
M include/osmocom/bsc/gsm_data_shared.h
M src/libbsc/abis_rsl.c
M src/libbsc/bsc_init.c
M src/libbsc/bsc_vty.c
M src/libbsc/handover_logic.c
M src/libbsc/paging.c
M src/libcommon/gsm_data.c
8 files changed, 80 insertions(+), 54 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/01/4401/1

diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h
index 51b2c98..5b2c5b4 100644
--- a/include/osmocom/bsc/gsm_data.h
+++ b/include/osmocom/bsc/gsm_data.h
@@ -223,49 +223,57 @@
 
 
 enum {
-	BSC_CTR_CHREQ_TOTAL,
-	BSC_CTR_CHREQ_NO_CHANNEL,
-	BSC_CTR_HANDOVER_ATTEMPTED,
-	BSC_CTR_HANDOVER_NO_CHANNEL,
-	BSC_CTR_HANDOVER_TIMEOUT,
-	BSC_CTR_HANDOVER_COMPLETED,
-	BSC_CTR_HANDOVER_FAILED,
+	BTS_CTR_CHREQ_TOTAL,
+	BTS_CTR_CHREQ_NO_CHANNEL,
+	BTS_CTR_HANDOVER_ATTEMPTED,
+	BTS_CTR_HANDOVER_NO_CHANNEL,
+	BTS_CTR_HANDOVER_TIMEOUT,
+	BTS_CTR_HANDOVER_COMPLETED,
+	BTS_CTR_HANDOVER_FAILED,
+	BTS_CTR_PAGING_ATTEMPTED,
+	BTS_CTR_PAGING_COMPLETED,
+	BTS_CTR_PAGING_EXPIRED,
+	BTS_CTR_CHAN_RF_FAIL,
+	BTS_CTR_CHAN_RLL_ERR,
+	BTS_CTR_BTS_OML_FAIL,
+	BTS_CTR_BTS_RSL_FAIL,
+	BTS_CTR_CODEC_AMR_F,
+	BTS_CTR_CODEC_AMR_H,
+	BTS_CTR_CODEC_EFR,
+	BTS_CTR_CODEC_V1_FR,
+	BTS_CTR_CODEC_V1_HR,
+};
+
+static const struct rate_ctr_desc bts_ctr_description[] = {
+	[BTS_CTR_CHREQ_TOTAL] = 		{"chreq.total", "Received channel requests."},
+	[BTS_CTR_CHREQ_NO_CHANNEL] = 		{"chreq.no_channel", "Sent to MS no channel available."},
+	[BTS_CTR_HANDOVER_ATTEMPTED] = 		{"handover.attempted", "Received handover attempts."},
+	[BTS_CTR_HANDOVER_NO_CHANNEL] = 		{"handover.no_channel", "Sent no channel available responses."},
+	[BTS_CTR_HANDOVER_TIMEOUT] = 		{"handover.timeout", "Count the amount of timeouts of timer T3103."},
+	[BTS_CTR_HANDOVER_COMPLETED] = 		{"handover.completed", "Received handover completed."},
+	[BTS_CTR_HANDOVER_FAILED] = 		{"handover.failed", "Receive HO FAIL messages."},
+	[BTS_CTR_PAGING_ATTEMPTED] = 		{"paging.attempted", "Paging attempts for a MS."},
+	[BTS_CTR_PAGING_COMPLETED] = 		{"paging.completed", "Paging successful completed."},
+	[BTS_CTR_PAGING_EXPIRED] = 		{"paging.expired", "Paging Request expired because of timeout T3113."},
+	[BTS_CTR_CHAN_RF_FAIL] = 		{"chan.rf_fail", "Received a RF failure indication from BTS."},
+	[BTS_CTR_CHAN_RLL_ERR] = 		{"chan.rll_err", "Received a RLL failure with T200 cause from BTS."},
+	[BTS_CTR_BTS_OML_FAIL] = 		{"oml_fail", "Received a TEI down on a OML link."},
+	[BTS_CTR_BTS_RSL_FAIL] = 		{"rsl_fail", "Received a TEI down on a OML link."},
+	[BTS_CTR_CODEC_AMR_F] =			{"codec.amr_f", "Count the usage of AMR/F codec by channel mode requested."},
+	[BTS_CTR_CODEC_AMR_H] =			{"codec.amr_h", "Count the usage of AMR/H codec by channel mode requested."},
+	[BTS_CTR_CODEC_EFR] = 			{"codec.efr", "Count the usage of EFR codec by channel mode requested."},
+	[BTS_CTR_CODEC_V1_FR] =			{"codec.fr", "Count the usage of FR codec by channel mode requested."},
+	[BTS_CTR_CODEC_V1_HR] =			{"codec.hr", "Count the usage of HR codec by channel mode requested."},
+};
+
+enum {
 	BSC_CTR_PAGING_ATTEMPTED,
 	BSC_CTR_PAGING_DETACHED,
-	BSC_CTR_PAGING_COMPLETED,
-	BSC_CTR_PAGING_EXPIRED,
-	BSC_CTR_CHAN_RF_FAIL,
-	BSC_CTR_CHAN_RLL_ERR,
-	BSC_CTR_BTS_OML_FAIL,
-	BSC_CTR_BTS_RSL_FAIL,
-	BSC_CTR_CODEC_AMR_F,
-	BSC_CTR_CODEC_AMR_H,
-	BSC_CTR_CODEC_EFR,
-	BSC_CTR_CODEC_V1_FR,
-	BSC_CTR_CODEC_V1_HR,
 };
 
 static const struct rate_ctr_desc bsc_ctr_description[] = {
-	[BSC_CTR_CHREQ_TOTAL] = 		{"chreq.total", "Received channel requests."},
-	[BSC_CTR_CHREQ_NO_CHANNEL] = 		{"chreq.no_channel", "Sent to MS no channel available."},
-	[BSC_CTR_HANDOVER_ATTEMPTED] = 		{"handover.attempted", "Received handover attempts."},
-	[BSC_CTR_HANDOVER_NO_CHANNEL] = 		{"handover.no_channel", "Sent no channel available responses."},
-	[BSC_CTR_HANDOVER_TIMEOUT] = 		{"handover.timeout", "Count the amount of timeouts of timer T3103."},
-	[BSC_CTR_HANDOVER_COMPLETED] = 		{"handover.completed", "Received handover completed."},
-	[BSC_CTR_HANDOVER_FAILED] = 		{"handover.failed", "Receive HO FAIL messages."},
 	[BSC_CTR_PAGING_ATTEMPTED] = 		{"paging.attempted", "Paging attempts for a MS."},
 	[BSC_CTR_PAGING_DETACHED] = 		{"paging.detached", "Counts the amount of paging attempts which couldn't sent out any paging request because no responsible bts found."},
-	[BSC_CTR_PAGING_COMPLETED] = 		{"paging.completed", "Paging successful completed."},
-	[BSC_CTR_PAGING_EXPIRED] = 		{"paging.expired", "Paging Request expired because of timeout T3113."},
-	[BSC_CTR_CHAN_RF_FAIL] = 		{"chan.rf_fail", "Received a RF failure indication from BTS."},
-	[BSC_CTR_CHAN_RLL_ERR] = 		{"chan.rll_err", "Received a RLL failure with T200 cause from BTS."},
-	[BSC_CTR_BTS_OML_FAIL] = 		{"bts.oml_fail", "Received a TEI down on a OML link."},
-	[BSC_CTR_BTS_RSL_FAIL] = 		{"bts.rsl_fail", "Received a TEI down on a OML link."},
-	[BSC_CTR_CODEC_AMR_F] =			{"bts.codec_amr_f", "Count the usage of AMR/F codec by channel mode requested."},
-	[BSC_CTR_CODEC_AMR_H] =			{"bts.codec_amr_h", "Count the usage of AMR/H codec by channel mode requested."},
-	[BSC_CTR_CODEC_EFR] = 			{"bts.codec_efr", "Count the usage of EFR codec by channel mode requested."},
-	[BSC_CTR_CODEC_V1_FR] =			{"bts.codec_fr", "Count the usage of FR codec by channel mode requested."},
-	[BSC_CTR_CODEC_V1_HR] =			{"bts.codec_hr", "Count the usage of HR codec by channel mode requested."},
 };
 
 enum {
@@ -314,6 +322,14 @@
 };
 
 
+static const struct rate_ctr_group_desc bts_ctrg_desc = {
+	"bts",
+	"base station",
+	OSMO_STATS_CLASS_GLOBAL,
+	ARRAY_SIZE(bts_ctr_description),
+	bts_ctr_description,
+};
+
 static const struct rate_ctr_group_desc bsc_ctrg_desc = {
 	"bsc",
 	"base station controller",
diff --git a/include/osmocom/bsc/gsm_data_shared.h b/include/osmocom/bsc/gsm_data_shared.h
index 240be1c..a26c368 100644
--- a/include/osmocom/bsc/gsm_data_shared.h
+++ b/include/osmocom/bsc/gsm_data_shared.h
@@ -6,6 +6,7 @@
 #include <stdint.h>
 
 #include <osmocom/core/timer.h>
+#include <osmocom/core/rate_ctr.h>
 #include <osmocom/core/bitvec.h>
 #include <osmocom/core/statistics.h>
 #include <osmocom/core/utils.h>
@@ -847,6 +848,8 @@
 	int force_combined_si;
 	int bcch_change_mark;
 
+	struct rate_ctr_group *bts_ctrs;
+
 #ifdef ROLE_BSC
 	/* Abis NM queue */
 	struct llist_head abis_queue;
diff --git a/src/libbsc/abis_rsl.c b/src/libbsc/abis_rsl.c
index 9968602..fbaaf09 100644
--- a/src/libbsc/abis_rsl.c
+++ b/src/libbsc/abis_rsl.c
@@ -91,10 +91,10 @@
 	if (lchan->type == GSM_LCHAN_TCH_H) {
 		switch (lchan->tch_mode) {
 		case GSM48_CMODE_SPEECH_AMR:
-			rate_ctr_inc(&bts->network->bsc_ctrs->ctr[BSC_CTR_CODEC_AMR_H]);
+			rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CODEC_AMR_H]);
 			break;
 		case GSM48_CMODE_SPEECH_V1:
-			rate_ctr_inc(&bts->network->bsc_ctrs->ctr[BSC_CTR_CODEC_V1_HR]);
+			rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CODEC_V1_HR]);
 			break;
 		default:
 			break;
@@ -102,13 +102,13 @@
 	} else if (lchan->type == GSM_LCHAN_TCH_F) {
 		switch (lchan->tch_mode) {
 		case GSM48_CMODE_SPEECH_AMR:
-			rate_ctr_inc(&bts->network->bsc_ctrs->ctr[BSC_CTR_CODEC_AMR_F]);
+			rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CODEC_AMR_F]);
 			break;
 		case GSM48_CMODE_SPEECH_V1:
-			rate_ctr_inc(&bts->network->bsc_ctrs->ctr[BSC_CTR_CODEC_V1_FR]);
+			rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CODEC_V1_FR]);
 			break;
 		case GSM48_CMODE_SPEECH_EFR:
-			rate_ctr_inc(&bts->network->bsc_ctrs->ctr[BSC_CTR_CODEC_EFR]);
+			rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CODEC_EFR]);
 			break;
 		default:
 			break;
@@ -1366,7 +1366,7 @@
 				TLVP_LEN(&tp, RSL_IE_CAUSE));
 
 	LOGPC(DRSL, LOGL_NOTICE, "\n");
-	rate_ctr_inc(&msg->lchan->ts->trx->bts->network->bsc_ctrs->ctr[BSC_CTR_CHAN_RF_FAIL]);
+	rate_ctr_inc(&msg->lchan->ts->trx->bts->bts_ctrs->ctr[BTS_CTR_CHAN_RF_FAIL]);
 	return rsl_rf_chan_release_err(msg->lchan);
 }
 
@@ -1872,7 +1872,7 @@
 	 * request reference RA */
 	lctype = get_ctype_by_chreq(bts->network, rqd_ref->ra);
 
-	rate_ctr_inc(&bts->network->bsc_ctrs->ctr[BSC_CTR_CHREQ_TOTAL]);
+	rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CHREQ_TOTAL]);
 
 	/*
 	 * We want LOCATION UPDATES to succeed and will assign a TCH
@@ -1885,7 +1885,7 @@
 	if (!lchan) {
 		LOGP(DRSL, LOGL_NOTICE, "BTS %d CHAN RQD: no resources for %s 0x%x\n",
 		     msg->lchan->ts->trx->bts->nr, gsm_lchant_name(lctype), rqd_ref->ra);
-		rate_ctr_inc(&bts->network->bsc_ctrs->ctr[BSC_CTR_CHREQ_NO_CHANNEL]);
+		rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CHREQ_NO_CHANNEL]);
 		/* FIXME gather multiple CHAN RQD and reject up to 4 at the same time */
 		if (bts->network->T3122)
 			rsl_send_imm_ass_rej(bts, 1, rqd_ref, bts->network->T3122 & 0xff);
@@ -2082,7 +2082,7 @@
 	rll_indication(msg->lchan, rllh->link_id, BSC_RLLR_IND_ERR_IND);
 
 	if (rlm_cause == RLL_CAUSE_T200_EXPIRED) {
-		rate_ctr_inc(&msg->lchan->ts->trx->bts->network->bsc_ctrs->ctr[BSC_CTR_CHAN_RLL_ERR]);
+		rate_ctr_inc(&msg->lchan->ts->trx->bts->bts_ctrs->ctr[BTS_CTR_CHAN_RLL_ERR]);
 		return rsl_rf_chan_release_err(msg->lchan);
 	}
 
diff --git a/src/libbsc/bsc_init.c b/src/libbsc/bsc_init.c
index 674813c..df83665 100644
--- a/src/libbsc/bsc_init.c
+++ b/src/libbsc/bsc_init.c
@@ -398,9 +398,9 @@
 		LOGP(DLMI, LOGL_ERROR, "Lost some E1 TEI link: %d %p\n", isd->link_type, trx);
 
 		if (isd->link_type == E1INP_SIGN_OML)
-			rate_ctr_inc(&trx->bts->network->bsc_ctrs->ctr[BSC_CTR_BTS_OML_FAIL]);
+			rate_ctr_inc(&trx->bts->bts_ctrs->ctr[BTS_CTR_BTS_OML_FAIL]);
 		else if (isd->link_type == E1INP_SIGN_RSL)
-			rate_ctr_inc(&trx->bts->network->bsc_ctrs->ctr[BSC_CTR_BTS_RSL_FAIL]);
+			rate_ctr_inc(&trx->bts->bts_ctrs->ctr[BTS_CTR_BTS_RSL_FAIL]);
 
 		/*
 		 * free all allocated channels. change the nm_state so the
diff --git a/src/libbsc/bsc_vty.c b/src/libbsc/bsc_vty.c
index 461e3d3..19d89cd 100644
--- a/src/libbsc/bsc_vty.c
+++ b/src/libbsc/bsc_vty.c
@@ -3769,6 +3769,7 @@
 
 void openbsc_vty_print_statistics(struct vty *vty, struct gsm_network *net)
 {
+#if 0
 	vty_out(vty, "Channel Requests        : %"PRIu64" total, %"PRIu64" no channel%s",
 		net->bsc_ctrs->ctr[BSC_CTR_CHREQ_TOTAL].current,
 		net->bsc_ctrs->ctr[BSC_CTR_CHREQ_NO_CHANNEL].current,
@@ -3786,6 +3787,7 @@
 		net->bsc_ctrs->ctr[BSC_CTR_BTS_OML_FAIL].current,
 		net->bsc_ctrs->ctr[BSC_CTR_BTS_RSL_FAIL].current,
 		VTY_NEWLINE);
+#endif
 }
 
 DEFUN(drop_bts,
diff --git a/src/libbsc/handover_logic.c b/src/libbsc/handover_logic.c
index ace8ac3..5152fec 100644
--- a/src/libbsc/handover_logic.c
+++ b/src/libbsc/handover_logic.c
@@ -105,7 +105,7 @@
 	       "(old_lchan on BTS %u, new BTS %u) ...\n",
 		old_lchan->ts->trx->bts->nr, bts->nr);
 
-	rate_ctr_inc(&bts->network->bsc_ctrs->ctr[BSC_CTR_HANDOVER_ATTEMPTED]);
+	rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_HANDOVER_ATTEMPTED]);
 
 	if (!old_lchan->conn) {
 		LOGP(DHO, LOGL_ERROR, "Old lchan lacks connection data.\n");
@@ -115,7 +115,7 @@
 	new_lchan = lchan_alloc(bts, old_lchan->type, 0);
 	if (!new_lchan) {
 		LOGP(DHO, LOGL_NOTICE, "No free channel\n");
-		rate_ctr_inc(&bts->network->bsc_ctrs->ctr[BSC_CTR_HANDOVER_NO_CHANNEL]);
+		rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_HANDOVER_NO_CHANNEL]);
 		return -ENOSPC;
 	}
 
@@ -190,7 +190,7 @@
 	struct gsm_network *net = ho->new_lchan->ts->trx->bts->network;
 
 	DEBUGP(DHO, "HO T3103 expired\n");
-	rate_ctr_inc(&net->bsc_ctrs->ctr[BSC_CTR_HANDOVER_TIMEOUT]);
+	rate_ctr_inc(&ho->new_lchan->ts->trx->bts->bts_ctrs->ctr[BTS_CTR_HANDOVER_TIMEOUT]);
 
 	ho->new_lchan->conn->ho_lchan = NULL;
 	ho->new_lchan->conn = NULL;
@@ -266,7 +266,7 @@
 	     ho->old_lchan->ts->trx->bts->nr, new_lchan->ts->trx->bts->nr,
 	     ho->old_lchan->ts->trx->arfcn, new_lchan->ts->trx->arfcn);
 
-	rate_ctr_inc(&net->bsc_ctrs->ctr[BSC_CTR_HANDOVER_COMPLETED]);
+	rate_ctr_inc(&new_lchan->ts->trx->bts->bts_ctrs->ctr[BTS_CTR_HANDOVER_COMPLETED]);
 
 	osmo_timer_del(&ho->T3103);
 
@@ -305,10 +305,10 @@
 		return -ENODEV;
 	}
 
-	rate_ctr_inc(&net->bsc_ctrs->ctr[BSC_CTR_HANDOVER_FAILED]);
-
 	new_lchan = ho->new_lchan;
 
+	rate_ctr_inc(&new_lchan->ts->trx->bts->bts_ctrs->ctr[BTS_CTR_HANDOVER_FAILED]);
+
 	/* release the channel and forget about it */
 	ho->new_lchan->conn->ho_lchan = NULL;
 	ho->new_lchan->conn = NULL;
diff --git a/src/libbsc/paging.c b/src/libbsc/paging.c
index b8f9043..f763d73 100644
--- a/src/libbsc/paging.c
+++ b/src/libbsc/paging.c
@@ -269,7 +269,7 @@
 	     req, bsc_subscr_name(req->bsub));
 
 	/* must be destroyed before calling cbfn, to prevent double free */
-	rate_ctr_inc(&req->bts->network->bsc_ctrs->ctr[BSC_CTR_PAGING_EXPIRED]);
+	rate_ctr_inc(&req->bts->bts_ctrs->ctr[BTS_CTR_PAGING_EXPIRED]);
 	cbfn_param = req->cbfn_param;
 	cbfn = req->cbfn;
 
@@ -297,6 +297,8 @@
 		return -EEXIST;
 	}
 
+	rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_PAGING_ATTEMPTED]);
+
 	LOGP(DPAG, LOGL_DEBUG, "Start paging of subscriber %s on bts %d.\n",
 	     bsc_subscr_name(bsub), bts->nr);
 	req = talloc_zero(tall_paging_ctx, struct gsm_paging_request);
diff --git a/src/libcommon/gsm_data.c b/src/libcommon/gsm_data.c
index e085aa6..b1001f5 100644
--- a/src/libcommon/gsm_data.c
+++ b/src/libcommon/gsm_data.c
@@ -301,6 +301,9 @@
 
 	INIT_LLIST_HEAD(&bts->loc_list);
 
+	bts->bts_ctrs = rate_ctr_group_alloc(bts, &bts_ctrg_desc, 0);
+	OSMO_ASSERT(bts->bts_ctrs);
+
 	return bts;
 }
 

-- 
To view, visit https://gerrit.osmocom.org/4401
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I34356cb5a62b09b7ddcb4194c33e4db4560743e1
Gerrit-PatchSet: 1
Gerrit-Project: osmo-bsc
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <laforge at gnumonks.org>



More information about the gerrit-log mailing list