path: root/src
diff options
authorHarald Welte <laforge@gnumonks.org>2017-12-13 23:17:16 +0100
committerHarald Welte <laforge@gnumonks.org>2017-12-14 13:06:33 +0100
commitcf9d431e8978c085d0e0992eeb8de817dbeaf9f6 (patch)
treed01cfc2aa42847e04bf1653a61ac91e5d72a8df2 /src
parent2ed22c83dfd8fcc944fd05c854ab4d8de7895b30 (diff)
libbsc: paging: more reasonable (and detailed) paging statistics
Counting the number of T3113 expirations (one per subscriber per BTS) vs the number of paging attempts (Bsc global) is a ueseless figure, as you cannot relate each other. We count on the BSC level: * how many PAGING we received from the MSC (total) * how many of those were for cells/LACs we don't serve * how many of those resulted in PAGING RESPONSE We count on the BTS leve: * how many PAGING CMD we sent to the BTS (total) * how many of those we ignored as we were already paging * how many of those resulted in PAGING RESPONSE * how many were expired due to T3113 expiring Change-Id: I410bbcbb2621f95f11238f7a5da01ab438f5fee1
Diffstat (limited to 'src')
2 files changed, 10 insertions, 5 deletions
diff --git a/src/libbsc/bsc_vty.c b/src/libbsc/bsc_vty.c
index 42b71650a..950064592 100644
--- a/src/libbsc/bsc_vty.c
+++ b/src/libbsc/bsc_vty.c
@@ -3794,10 +3794,9 @@ DEFUN(cfg_ts_e1_subslot,
void openbsc_vty_print_statistics(struct vty *vty, struct gsm_network *net)
- vty_out(vty, "Paging : %"PRIu64" attempted, %"PRIu64" complete, %"PRIu64" expired%s",
+ vty_out(vty, "Paging : %"PRIu64" attempted, %"PRIu64" responded%s",
- net->bsc_ctrs->ctr[BSC_CTR_PAGING_COMPLETED].current,
- net->bsc_ctrs->ctr[BSC_CTR_PAGING_EXPIRED].current,
+ net->bsc_ctrs->ctr[BSC_CTR_PAGING_RESPONDED].current,
diff --git a/src/libbsc/paging.c b/src/libbsc/paging.c
index 42ecdcf28..314dfddd9 100644
--- a/src/libbsc/paging.c
+++ b/src/libbsc/paging.c
@@ -277,7 +277,7 @@ static void paging_T3113_expired(void *data)
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]);
/* destroy it now. Do not access req afterwards */
paging_remove_request(&req->bts->paging, req);
@@ -295,9 +295,12 @@ static int _paging_request(struct gsm_bts *bts, struct bsc_subscr *bsub, int typ
struct gsm_bts_paging_state *bts_entry = &bts->paging;
struct gsm_paging_request *req;
+ rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_PAGING_ATTEMPTED]);
if (paging_pending_request(bts_entry, bsub)) {
LOGP(DPAG, LOGL_INFO, "Paging request already pending for %s\n",
+ rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_PAGING_ALREADY]);
return -EEXIST;
@@ -423,8 +426,11 @@ void paging_request_stop(struct llist_head *bts_list,
log_set_context(LOG_CTX_BSC_SUBSCR, bsub);
/* Stop this first and dispatch the request */
- if (_bts)
+ if (_bts) {
_paging_request_stop(_bts, bsub, conn, msg);
+ rate_ctr_inc(&_bts->bts_ctrs->ctr[BTS_CTR_PAGING_RESPONDED]);
+ rate_ctr_inc(&_bts->network->bsc_ctrs->ctr[BSC_CTR_PAGING_RESPONDED]);
+ }
/* Make sure to cancel this everywhere else */
llist_for_each_entry(bts, bts_list, list) {