aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2018-02-24 12:36:52 +0100
committerHarald Welte <laforge@gnumonks.org>2018-02-24 19:26:42 +0100
commitd7f8a1c16e8a6337539b5dae291f435cf0cf426e (patch)
treed394995e58a5101561ed72623519cae54230db9d
parentc1135015135f9c664dd6735f30fc94772c0d9ce8 (diff)
BTS: add rate_ctr about CCCH (paging, agch, pch)
-rw-r--r--include/osmo-bts/bts.h12
-rw-r--r--include/osmo-bts/gsm_data.h2
-rw-r--r--include/osmo-bts/gsm_data_shared.h2
-rw-r--r--src/common/bts.c27
-rw-r--r--src/common/l1sap.c2
-rw-r--r--src/common/main.c1
-rw-r--r--src/common/paging.c4
-rw-r--r--src/common/rsl.c3
-rw-r--r--src/common/vty.c1
9 files changed, 54 insertions, 0 deletions
diff --git a/include/osmo-bts/bts.h b/include/osmo-bts/bts.h
index 4d6e3479..76f8ba51 100644
--- a/include/osmo-bts/bts.h
+++ b/include/osmo-bts/bts.h
@@ -1,6 +1,7 @@
#ifndef _BTS_H
#define _BTS_H
+#include <osmocom/core/rate_ctr.h>
#include <osmo-bts/gsm_data.h>
enum bts_global_status {
@@ -9,6 +10,17 @@ enum bts_global_status {
BTS_STATUS_LAST,
};
+enum {
+ BTS_CTR_PAGING_RCVD,
+ BTS_CTR_PAGING_DROP,
+ BTS_CTR_PAGING_SENT,
+ BTS_CTR_RACH_RCVD,
+ BTS_CTR_RACH_SENT,
+ BTS_CTR_AGCH_RCVD,
+ BTS_CTR_AGCH_SENT,
+ BTS_CTR_AGCH_DELETED,
+};
+
extern void *tall_bts_ctx;
int bts_init(struct gsm_bts *bts);
diff --git a/include/osmo-bts/gsm_data.h b/include/osmo-bts/gsm_data.h
index 4b834b54..f2574b15 100644
--- a/include/osmo-bts/gsm_data.h
+++ b/include/osmo-bts/gsm_data.h
@@ -35,6 +35,7 @@ struct gsm_network {
/* data structure for BTS related data specific to the BTS role */
struct gsm_bts_role_bts {
+ struct gsm_bts *bts;
struct {
/* Interference Boundaries for OML */
int16_t boundary[6];
@@ -132,6 +133,7 @@ enum lchan_ciph_state {
};
#define bts_role_bts(x) ((struct gsm_bts_role_bts *)(x)->role)
+#define btsb_bts(x) (x)->bts
#include <osmo-bts/gsm_data_shared.h>
diff --git a/include/osmo-bts/gsm_data_shared.h b/include/osmo-bts/gsm_data_shared.h
index 1571929e..7cefb10e 100644
--- a/include/osmo-bts/gsm_data_shared.h
+++ b/include/osmo-bts/gsm_data_shared.h
@@ -816,6 +816,8 @@ struct gsm_bts {
int force_combined_si;
int bcch_change_mark;
+ struct rate_ctr_group *ctrs;
+
void *role;
};
diff --git a/src/common/bts.c b/src/common/bts.c
index 7849d616..60a309e2 100644
--- a/src/common/bts.c
+++ b/src/common/bts.c
@@ -32,6 +32,8 @@
#include <osmocom/core/timer.h>
#include <osmocom/core/msgb.h>
#include <osmocom/core/talloc.h>
+#include <osmocom/core/stats.h>
+#include <osmocom/core/rate_ctr.h>
#include <osmocom/gsm/protocol/gsm_12_21.h>
#include <osmocom/gsm/lapdm.h>
#include <osmocom/trau/osmo_ortp.h>
@@ -79,6 +81,26 @@ static int bts_signal_cbfn(unsigned int subsys, unsigned int signal,
return 0;
}
+static const struct rate_ctr_desc bts_ctr_desc[] = {
+ [BTS_CTR_PAGING_RCVD] = {"paging:rcvd", "Received paging requests (Abis)"},
+ [BTS_CTR_PAGING_DROP] = {"paging:drop", "Dropped paging requests (Abis)"},
+ [BTS_CTR_PAGING_SENT] = {"paging:sent", "Sent paging requests (Um)"},
+
+ [BTS_CTR_RACH_RCVD] = {"rach:rcvd", "Received RACH requests (Um)"},
+ [BTS_CTR_RACH_SENT] = {"rach:sent", "Sent RACH requests (Abis)"},
+
+ [BTS_CTR_AGCH_RCVD] = {"agch:rcvd", "Received AGCH requests (Abis)"},
+ [BTS_CTR_AGCH_SENT] = {"agch:sent", "Sent AGCH requests (Abis)"},
+ [BTS_CTR_AGCH_DELETED] = {"agch:delete", "Sent AGCH DELETE IND (Abis)"},
+};
+static const struct rate_ctr_group_desc bts_ctrg_desc = {
+ "bts",
+ "base transceiver station",
+ OSMO_STATS_CLASS_GLOBAL,
+ ARRAY_SIZE(bts_ctr_desc),
+ bts_ctr_desc
+};
+
/* Initialize the BTS (and TRX) data structures, called before config
* file reading */
int bts_init(struct gsm_bts *bts)
@@ -95,10 +117,13 @@ int bts_init(struct gsm_bts *bts)
bts->band = GSM_BAND_1800;
bts->role = btsb = talloc_zero(bts, struct gsm_bts_role_bts);
+ btsb->bts = bts;
INIT_LLIST_HEAD(&btsb->agch_queue);
btsb->agch_queue_length = 0;
+ bts->ctrs = rate_ctr_group_alloc(bts, &bts_ctrg_desc, bts->nr);
+
/* enable management with default levels,
* raise threshold to GSM_BTS_AGCH_QUEUE_THRESH_LEVEL_DISABLE to
* disable this feature.
@@ -636,6 +661,8 @@ int bts_ccch_copy_msg(struct gsm_bts *bts, uint8_t *out_buf, struct gsm_time *gt
if (!msg)
return rc;
+ rate_ctr_inc2(bts->ctrs, BTS_CTR_AGCH_SENT);
+
/* Copy AGCH message */
memcpy(out_buf, msgb_l3(msg), msgb_l3len(msg));
rc = msgb_l3len(msg);
diff --git a/src/common/l1sap.c b/src/common/l1sap.c
index 3580a73f..88d5a345 100644
--- a/src/common/l1sap.c
+++ b/src/common/l1sap.c
@@ -1190,6 +1190,7 @@ static int l1sap_ph_rach_ind(struct gsm_bts_trx *trx,
uint8_t acc_delay;
DEBUGPFN(DL1P, rach_ind->fn, "Rx PH-RA.ind");
+ rate_ctr_inc2(trx->bts->ctrs, BTS_CTR_RACH_RCVD);
lc = &trx->ts[0].lchan[CCCH_LCHAN].lapdm_ch;
@@ -1222,6 +1223,7 @@ static int l1sap_ph_rach_ind(struct gsm_bts_trx *trx,
LOGPFN(DL1P, LOGL_INFO, rach_ind->fn, "RACH for RR access (toa=%d, ra=%d)\n",
rach_ind->acc_delay, rach_ind->ra);
+ rate_ctr_inc2(trx->bts->ctrs, BTS_CTR_RACH_SENT);
lapdm_phsap_up(&l1sap->oph, &lc->lapdm_dcch);
return 0;
diff --git a/src/common/main.c b/src/common/main.c
index b7d56531..df3c0464 100644
--- a/src/common/main.c
+++ b/src/common/main.c
@@ -240,6 +240,7 @@ int bts_main(int argc, char **argv)
bts_log_init(NULL);
vty_init(&bts_vty_info);
ctrl_vty_init(tall_bts_ctx);
+ rate_ctr_init(tall_bts_ctx);
handle_options(argc, argv);
diff --git a/src/common/paging.c b/src/common/paging.c
index 957d609b..d796176e 100644
--- a/src/common/paging.c
+++ b/src/common/paging.c
@@ -179,9 +179,12 @@ int paging_add_identity(struct paging_state *ps, uint8_t paging_group,
struct llist_head *group_q = &ps->paging_queue[paging_group];
struct paging_record *pr;
+ rate_ctr_inc2(ps->btsb->bts->ctrs, BTS_CTR_PAGING_RCVD);
+
if (ps->num_paging >= ps->num_paging_max) {
LOGP(DPAG, LOGL_NOTICE, "Dropping paging, queue full (%u)\n",
ps->num_paging);
+ rate_ctr_inc2(ps->btsb->bts->ctrs, BTS_CTR_PAGING_DROP);
return -ENOSPC;
}
@@ -503,6 +506,7 @@ int paging_gen_msg(struct paging_state *ps, uint8_t *out_buf, struct gsm_time *g
/* skip those that we might have re-added above */
if (pr[i] == NULL)
continue;
+ rate_ctr_inc2(ps->btsb->bts->ctrs, BTS_CTR_PAGING_SENT);
/* check if we can expire the paging record,
* or if we need to re-queue it */
if (pr[i]->u.paging.expiration_time <= now) {
diff --git a/src/common/rsl.c b/src/common/rsl.c
index bffe69d0..de04b3bf 100644
--- a/src/common/rsl.c
+++ b/src/common/rsl.c
@@ -552,6 +552,8 @@ static int rsl_rx_imm_ass(struct gsm_bts_trx *trx, struct msgb *msg)
if (!TLVP_PRESENT(&tp, RSL_IE_FULL_IMM_ASS_INFO))
return rsl_tx_error_report(trx, RSL_ERR_MAND_IE_ERROR);
+ rate_ctr_inc2(trx->bts->ctrs, BTS_CTR_AGCH_RCVD);
+
/* cut down msg to the 04.08 RR part */
msg->l3h = (uint8_t *) TLVP_VAL(&tp, RSL_IE_FULL_IMM_ASS_INFO);
msg->data = msg->l3h;
@@ -563,6 +565,7 @@ static int rsl_rx_imm_ass(struct gsm_bts_trx *trx, struct msgb *msg)
/* if there is no space in the queue: send DELETE IND */
rsl_tx_delete_ind(trx->bts, TLVP_VAL(&tp, RSL_IE_FULL_IMM_ASS_INFO),
TLVP_LEN(&tp, RSL_IE_FULL_IMM_ASS_INFO));
+ rate_ctr_inc2(trx->bts->ctrs, BTS_CTR_AGCH_DELETED);
msgb_free(msg);
}
diff --git a/src/common/vty.c b/src/common/vty.c
index 55c1e0fe..a1cb2fec 100644
--- a/src/common/vty.c
+++ b/src/common/vty.c
@@ -808,6 +808,7 @@ static void bts_dump_vty(struct vty *vty, struct gsm_bts *bts)
}
bts_dump_vty_features(vty, bts);
+ vty_out_rate_ctr_group(vty, " ", bts->ctrs);
}