aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Couzens <lynxis@fe80.eu>2016-07-12 15:42:02 +0200
committerHarald Welte <laforge@gnumonks.org>2016-08-27 01:58:19 +0000
commit20423ea6cfdecd264b32c7fe5e15ee7de4455692 (patch)
treee62843a1ddcb0fc97891be516d57df4565de1447
parent4e699a9cbf418518265dc7b8b6b7fe250d87222d (diff)
libbsc/libmsc: convert old osmo counter into rate_ctrgs
rate counters support the export to statsd and can have a delta value. Change-Id: Ie749cebd53a0bb618d0e23d375885712078bf8dd
-rw-r--r--openbsc/include/openbsc/gsm_data.h128
-rw-r--r--openbsc/src/libbsc/abis_rsl.c8
-rw-r--r--openbsc/src/libbsc/bsc_init.c4
-rw-r--r--openbsc/src/libbsc/bsc_vty.c22
-rw-r--r--openbsc/src/libbsc/gsm_04_08_utils.c2
-rw-r--r--openbsc/src/libbsc/handover_logic.c10
-rw-r--r--openbsc/src/libbsc/net_init.c32
-rw-r--r--openbsc/src/libbsc/paging.c6
-rw-r--r--openbsc/src/libmsc/gsm_04_08.c20
-rw-r--r--openbsc/src/libmsc/gsm_04_11.c12
-rw-r--r--openbsc/src/libmsc/vty_interface_layer3.c48
11 files changed, 152 insertions, 140 deletions
diff --git a/openbsc/include/openbsc/gsm_data.h b/openbsc/include/openbsc/gsm_data.h
index b9cb48d3d..6168a6ba2 100644
--- a/openbsc/include/openbsc/gsm_data.h
+++ b/openbsc/include/openbsc/gsm_data.h
@@ -7,7 +7,10 @@
#include <stdbool.h>
#include <osmocom/core/timer.h>
+#include <osmocom/core/rate_ctr.h>
#include <osmocom/core/select.h>
+#include <osmocom/core/stats.h>
+
#include <osmocom/crypt/auth.h>
#include <openbsc/rest_octets.h>
@@ -148,55 +151,79 @@ struct gsm_subscriber_connection {
/* Some statistics of our network */
-struct gsmnet_stats {
- struct {
- struct osmo_counter *total;
- struct osmo_counter *no_channel;
- } chreq;
- struct {
- struct osmo_counter *attempted;
- struct osmo_counter *no_channel; /* no channel available */
- struct osmo_counter *timeout; /* T3103 timeout */
- struct osmo_counter *completed; /* HO COMPL received */
- struct osmo_counter *failed; /* HO FAIL received */
- } handover;
- struct {
- struct osmo_counter *attach;
- struct osmo_counter *normal;
- struct osmo_counter *periodic;
- struct osmo_counter *detach;
- } loc_upd_type;
- struct {
- struct osmo_counter *reject;
- struct osmo_counter *accept;
- } loc_upd_resp;
- struct {
- struct osmo_counter *attempted;
- struct osmo_counter *detached;
- struct osmo_counter *completed;
- struct osmo_counter *expired;
- } paging;
- struct {
- struct osmo_counter *submitted; /* MO SMS submissions */
- struct osmo_counter *no_receiver;
- struct osmo_counter *delivered; /* MT SMS deliveries */
- struct osmo_counter *rp_err_mem;
- struct osmo_counter *rp_err_other;
- } sms;
- struct {
- struct osmo_counter *mo_setup;
- struct osmo_counter *mo_connect_ack;
- struct osmo_counter *mt_setup;
- struct osmo_counter *mt_connect;
- } call;
- struct {
- struct osmo_counter *rf_fail;
- struct osmo_counter *rll_err;
- } chan;
- struct {
- struct osmo_counter *oml_fail;
- struct osmo_counter *rsl_fail;
- } bts;
+enum {
+ MSC_CTR_CHREQ_TOTAL,
+ MSC_CTR_CHREQ_NO_CHANNEL,
+ MSC_CTR_HANDOVER_ATTEMPTED,
+ MSC_CTR_HANDOVER_NO_CHANNEL,
+ MSC_CTR_HANDOVER_TIMEOUT,
+ MSC_CTR_HANDOVER_COMPLETED,
+ MSC_CTR_HANDOVER_FAILED,
+ MSC_CTR_LOC_UPDATE_TYPE_ATTACH,
+ MSC_CTR_LOC_UPDATE_TYPE_NORMAL,
+ MSC_CTR_LOC_UPDATE_TYPE_PERIODIC,
+ MSC_CTR_LOC_UPDATE_TYPE_DETACH,
+ MSC_CTR_LOC_UPDATE_RESP_REJECT,
+ MSC_CTR_LOC_UPDATE_RESP_ACCEPT,
+ MSC_CTR_PAGING_ATTEMPTED,
+ MSC_CTR_PAGING_DETACHED,
+ MSC_CTR_PAGING_COMPLETED,
+ MSC_CTR_PAGING_EXPIRED,
+ MSC_CTR_SMS_SUBMITTED,
+ MSC_CTR_SMS_NO_RECEIVER,
+ MSC_CTR_SMS_DELIVERED,
+ MSC_CTR_SMS_RP_ERR_MEM,
+ MSC_CTR_SMS_RP_ERR_OTHER,
+ MSC_CTR_CALL_MO_SETUP,
+ MSC_CTR_CALL_MO_CONNECT_ACK,
+ MSC_CTR_CALL_MT_SETUP,
+ MSC_CTR_CALL_MT_CONNECT,
+ MSC_CTR_CHAN_RF_FAIL,
+ MSC_CTR_CHAN_RLL_ERR,
+ MSC_CTR_BTS_OML_FAIL,
+ MSC_CTR_BTS_RSL_FAIL,
+};
+
+static const struct rate_ctr_desc msc_ctr_description[] = {
+ [MSC_CTR_CHREQ_TOTAL] = {"chreq.total", "Received channel requests."},
+ [MSC_CTR_CHREQ_NO_CHANNEL] = {"chreq.no_channel", "Sent to MS no channel available."},
+ [MSC_CTR_HANDOVER_ATTEMPTED] = {"handover.attempted", "Received handover attempts."},
+ [MSC_CTR_HANDOVER_NO_CHANNEL] = {"handover.no_channel", "Sent no channel available responses."},
+ [MSC_CTR_HANDOVER_TIMEOUT] = {"handover.timeout", "Count the amount of timeouts of timer T3103."},
+ [MSC_CTR_HANDOVER_COMPLETED] = {"handover.completed", "Received handover completed."},
+ [MSC_CTR_HANDOVER_FAILED] = {"handover.failed", "Receive HO FAIL messages."},
+ [MSC_CTR_LOC_UPDATE_TYPE_ATTACH] = {"loc_update_type.attach", "Received location update imsi attach requests."},
+ [MSC_CTR_LOC_UPDATE_TYPE_NORMAL] = {"loc_update_type.normal", "Received location update normal requests."},
+ [MSC_CTR_LOC_UPDATE_TYPE_PERIODIC] = {"loc_update_type.periodic", "Received location update periodic requests."},
+ [MSC_CTR_LOC_UPDATE_TYPE_DETACH] = {"loc_update_type.detach", "Received location update detach indication."},
+ [MSC_CTR_LOC_UPDATE_RESP_REJECT] = {"loc_update_resp.reject", "Sent location update reject responses."},
+ [MSC_CTR_LOC_UPDATE_RESP_ACCEPT] = {"loc_update_resp.accept", "Sent location update accept responses."},
+ [MSC_CTR_PAGING_ATTEMPTED] = {"paging.attempted", "Paging attempts for a MS."},
+ [MSC_CTR_PAGING_DETACHED] = {"paging.detached", "Counts the amount of paging attempts which couldn't sent out any paging request because no responsible bts found."},
+ [MSC_CTR_PAGING_COMPLETED] = {"paging.completed", "Paging successful completed."},
+ [MSC_CTR_PAGING_EXPIRED] = {"paging.expired", "Paging Request expired because of timeout T3113."},
+ [MSC_CTR_SMS_SUBMITTED] = {"sms.submitted", "Received a RPDU from a MS (MO)."},
+ [MSC_CTR_SMS_NO_RECEIVER] = {"sms.no_receiver", "Counts SMS which couldn't routed because no receiver found."},
+ [MSC_CTR_SMS_DELIVERED] = {"sms.delivered", "Global SMS Deliver attempts."},
+ [MSC_CTR_SMS_RP_ERR_MEM] = {"sms.rp_err_mem", "CAUSE_MT_MEM_EXCEEDED errors of MS responses on a sms deliver attempt."},
+ [MSC_CTR_SMS_RP_ERR_OTHER] = {"sms.rp_err_other", "Other error of MS responses on a sms delive attempt."},
+ /* FIXME: count also sms delivered */
+ [MSC_CTR_CALL_MO_SETUP] = {"call.mo_setup", "Received setup requests from a MS to init a MO call."},
+ [MSC_CTR_CALL_MO_CONNECT_ACK] = {"call.mo_connect_ack", "Received a connect ack from MS of a MO call. Call is now succesful connected up."},
+ [MSC_CTR_CALL_MT_SETUP] = {"call.mt_setup", "Sent setup requests to the MS (MT)."},
+ [MSC_CTR_CALL_MT_CONNECT] = {"call.mt_connect", "Sent a connect to the MS (MT)."},
+ [MSC_CTR_CHAN_RF_FAIL] = {"chan.rf_fail", "Received a RF failure indication from BTS."},
+ [MSC_CTR_CHAN_RLL_ERR] = {"chan.rll_err", "Received a RLL failure with T200 cause from BTS."},
+ [MSC_CTR_BTS_OML_FAIL] = {"bts.oml_fail", "Received a TEI down on a OML link."},
+ [MSC_CTR_BTS_RSL_FAIL] = {"bts.rsl_fail", "Received a TEI down on a OML link."},
+};
+
+static const struct rate_ctr_group_desc msc_ctrg_desc = {
+ "msc",
+ "mobile switching center",
+ OSMO_STATS_CLASS_GLOBAL,
+ ARRAY_SIZE(msc_ctr_description),
+ msc_ctr_description,
};
enum gsm_auth_policy {
@@ -241,7 +268,8 @@ struct gsm_network {
unsigned int max_distance; /* TA values */
} handover;
- struct gsmnet_stats stats;
+ struct rate_ctr_group *ratectrs;
+
/* layer 4 */
struct mncc_sock_state *mncc_state;
diff --git a/openbsc/src/libbsc/abis_rsl.c b/openbsc/src/libbsc/abis_rsl.c
index b84a0b582..092ec4ebc 100644
--- a/openbsc/src/libbsc/abis_rsl.c
+++ b/openbsc/src/libbsc/abis_rsl.c
@@ -1207,7 +1207,7 @@ static int rsl_rx_conn_fail(struct msgb *msg)
TLVP_LEN(&tp, RSL_IE_CAUSE));
LOGPC(DRSL, LOGL_NOTICE, "\n");
- osmo_counter_inc(msg->lchan->ts->trx->bts->network->stats.chan.rf_fail);
+ rate_ctr_inc(&msg->lchan->ts->trx->bts->network->ratectrs->ctr[MSC_CTR_CHAN_RF_FAIL]);
return rsl_rf_chan_release_err(msg->lchan);
}
@@ -1641,7 +1641,7 @@ static int rsl_rx_chan_rqd(struct msgb *msg)
lctype = get_ctype_by_chreq(bts->network, rqd_ref->ra);
chreq_reason = get_reason_by_chreq(rqd_ref->ra, bts->network->neci);
- osmo_counter_inc(bts->network->stats.chreq.total);
+ rate_ctr_inc(&bts->network->ratectrs->ctr[MSC_CTR_CHREQ_TOTAL]);
/*
* We want LOCATION UPDATES to succeed and will assign a TCH
@@ -1654,7 +1654,7 @@ static int rsl_rx_chan_rqd(struct msgb *msg)
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);
- osmo_counter_inc(bts->network->stats.chreq.no_channel);
+ rate_ctr_inc(&bts->network->ratectrs->ctr[MSC_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);
@@ -1837,7 +1837,7 @@ static int rsl_rx_rll_err_ind(struct msgb *msg)
rll_indication(msg->lchan, rllh->link_id, BSC_RLLR_IND_ERR_IND);
if (rlm_cause == RLL_CAUSE_T200_EXPIRED) {
- osmo_counter_inc(msg->lchan->ts->trx->bts->network->stats.chan.rll_err);
+ rate_ctr_inc(&msg->lchan->ts->trx->bts->network->ratectrs->ctr[MSC_CTR_CHAN_RLL_ERR]);
return rsl_rf_chan_release_err(msg->lchan);
}
diff --git a/openbsc/src/libbsc/bsc_init.c b/openbsc/src/libbsc/bsc_init.c
index 5c2786278..5ea85d020 100644
--- a/openbsc/src/libbsc/bsc_init.c
+++ b/openbsc/src/libbsc/bsc_init.c
@@ -340,9 +340,9 @@ static int inp_sig_cb(unsigned int subsys, unsigned int signal,
LOGP(DLMI, LOGL_ERROR, "Lost some E1 TEI link: %d %p\n", isd->link_type, trx);
if (isd->link_type == E1INP_SIGN_OML)
- osmo_counter_inc(trx->bts->network->stats.bts.oml_fail);
+ rate_ctr_inc(&trx->bts->network->ratectrs->ctr[MSC_CTR_BTS_OML_FAIL]);
else if (isd->link_type == E1INP_SIGN_RSL)
- osmo_counter_inc(trx->bts->network->stats.bts.rsl_fail);
+ rate_ctr_inc(&trx->bts->network->ratectrs->ctr[MSC_CTR_BTS_RSL_FAIL]);
/*
* free all allocated channels. change the nm_state so the
diff --git a/openbsc/src/libbsc/bsc_vty.c b/openbsc/src/libbsc/bsc_vty.c
index 6584cf0d6..fbaf06bfb 100644
--- a/openbsc/src/libbsc/bsc_vty.c
+++ b/openbsc/src/libbsc/bsc_vty.c
@@ -3784,18 +3784,22 @@ DEFUN(cfg_ts_e1_subslot,
void openbsc_vty_print_statistics(struct vty *vty, struct gsm_network *net)
{
vty_out(vty, "Channel Requests : %lu total, %lu no channel%s",
- osmo_counter_get(net->stats.chreq.total),
- osmo_counter_get(net->stats.chreq.no_channel), VTY_NEWLINE);
+ net->ratectrs->ctr[MSC_CTR_CHREQ_TOTAL].current,
+ net->ratectrs->ctr[MSC_CTR_CHREQ_NO_CHANNEL].current,
+ VTY_NEWLINE);
vty_out(vty, "Channel Failures : %lu rf_failures, %lu rll failures%s",
- osmo_counter_get(net->stats.chan.rf_fail),
- osmo_counter_get(net->stats.chan.rll_err), VTY_NEWLINE);
+ net->ratectrs->ctr[MSC_CTR_CHAN_RF_FAIL].current,
+ net->ratectrs->ctr[MSC_CTR_CHAN_RLL_ERR].current,
+ VTY_NEWLINE);
vty_out(vty, "Paging : %lu attempted, %lu complete, %lu expired%s",
- osmo_counter_get(net->stats.paging.attempted),
- osmo_counter_get(net->stats.paging.completed),
- osmo_counter_get(net->stats.paging.expired), VTY_NEWLINE);
+ net->ratectrs->ctr[MSC_CTR_PAGING_ATTEMPTED].current,
+ net->ratectrs->ctr[MSC_CTR_PAGING_COMPLETED].current,
+ net->ratectrs->ctr[MSC_CTR_PAGING_EXPIRED].current,
+ VTY_NEWLINE);
vty_out(vty, "BTS failures : %lu OML, %lu RSL%s",
- osmo_counter_get(net->stats.bts.oml_fail),
- osmo_counter_get(net->stats.bts.rsl_fail), VTY_NEWLINE);
+ net->ratectrs->ctr[MSC_CTR_BTS_OML_FAIL].current,
+ net->ratectrs->ctr[MSC_CTR_BTS_RSL_FAIL].current,
+ VTY_NEWLINE);
}
DEFUN(drop_bts,
diff --git a/openbsc/src/libbsc/gsm_04_08_utils.c b/openbsc/src/libbsc/gsm_04_08_utils.c
index 635665a3d..d4eca4a29 100644
--- a/openbsc/src/libbsc/gsm_04_08_utils.c
+++ b/openbsc/src/libbsc/gsm_04_08_utils.c
@@ -304,7 +304,7 @@ int gsm48_handle_paging_resp(struct gsm_subscriber_connection *conn,
subscr = conn->subscr;
}
- osmo_counter_inc(bts->network->stats.paging.completed);
+ rate_ctr_inc(&bts->network->ratectrs->ctr[MSC_CTR_PAGING_COMPLETED]);
/* Stop paging on the bts we received the paging response */
paging_request_stop(conn->bts, subscr, conn, msg);
diff --git a/openbsc/src/libbsc/handover_logic.c b/openbsc/src/libbsc/handover_logic.c
index 52fa4af26..5424e2750 100644
--- a/openbsc/src/libbsc/handover_logic.c
+++ b/openbsc/src/libbsc/handover_logic.c
@@ -103,7 +103,7 @@ int bsc_handover_start(struct gsm_lchan *old_lchan, struct gsm_bts *bts)
DEBUGP(DHO, "(old_lchan on BTS %u, new BTS %u)\n",
old_lchan->ts->trx->bts->nr, bts->nr);
- osmo_counter_inc(bts->network->stats.handover.attempted);
+ rate_ctr_inc(&bts->network->ratectrs->ctr[MSC_CTR_HANDOVER_ATTEMPTED]);
if (!old_lchan->conn) {
LOGP(DHO, LOGL_ERROR, "Old lchan lacks connection data.\n");
@@ -113,7 +113,7 @@ int bsc_handover_start(struct gsm_lchan *old_lchan, struct gsm_bts *bts)
new_lchan = lchan_alloc(bts, old_lchan->type, 0);
if (!new_lchan) {
LOGP(DHO, LOGL_NOTICE, "No free channel\n");
- osmo_counter_inc(bts->network->stats.handover.no_channel);
+ rate_ctr_inc(&bts->network->ratectrs->ctr[MSC_CTR_HANDOVER_NO_CHANNEL]);
return -ENOSPC;
}
@@ -188,7 +188,7 @@ static void ho_T3103_cb(void *_ho)
struct gsm_network *net = ho->new_lchan->ts->trx->bts->network;
DEBUGP(DHO, "HO T3103 expired\n");
- osmo_counter_inc(net->stats.handover.timeout);
+ rate_ctr_inc(&net->ratectrs->ctr[MSC_CTR_HANDOVER_TIMEOUT]);
ho->new_lchan->conn->ho_lchan = NULL;
ho->new_lchan->conn = NULL;
@@ -265,7 +265,7 @@ static int ho_gsm48_ho_compl(struct gsm_lchan *new_lchan)
ho->old_lchan->ts->trx->bts->nr, new_lchan->ts->trx->bts->nr,
ho->old_lchan->ts->trx->arfcn, new_lchan->ts->trx->arfcn);
- osmo_counter_inc(net->stats.handover.completed);
+ rate_ctr_inc(&net->ratectrs->ctr[MSC_CTR_HANDOVER_COMPLETED]);
osmo_timer_del(&ho->T3103);
@@ -303,7 +303,7 @@ static int ho_gsm48_ho_fail(struct gsm_lchan *old_lchan)
return -ENODEV;
}
- osmo_counter_inc(net->stats.handover.failed);
+ rate_ctr_inc(&net->ratectrs->ctr[MSC_CTR_HANDOVER_FAILED]);
new_lchan = ho->new_lchan;
diff --git a/openbsc/src/libbsc/net_init.c b/openbsc/src/libbsc/net_init.c
index 6d03ee428..b99f3d2a0 100644
--- a/openbsc/src/libbsc/net_init.c
+++ b/openbsc/src/libbsc/net_init.c
@@ -80,36 +80,8 @@ struct gsm_network *gsm_network_init(uint16_t country_code, uint16_t network_cod
INIT_LLIST_HEAD(&net->upqueue);
INIT_LLIST_HEAD(&net->bts_list);
- net->stats.chreq.total = osmo_counter_alloc("net.chreq.total");
- net->stats.chreq.no_channel = osmo_counter_alloc("net.chreq.no_channel");
- net->stats.handover.attempted = osmo_counter_alloc("net.handover.attempted");
- net->stats.handover.no_channel = osmo_counter_alloc("net.handover.no_channel");
- net->stats.handover.timeout = osmo_counter_alloc("net.handover.timeout");
- net->stats.handover.completed = osmo_counter_alloc("net.handover.completed");
- net->stats.handover.failed = osmo_counter_alloc("net.handover.failed");
- net->stats.loc_upd_type.attach = osmo_counter_alloc("net.loc_upd_type.attach");
- net->stats.loc_upd_type.normal = osmo_counter_alloc("net.loc_upd_type.normal");
- net->stats.loc_upd_type.periodic = osmo_counter_alloc("net.loc_upd_type.periodic");
- net->stats.loc_upd_type.detach = osmo_counter_alloc("net.imsi_detach.count");
- net->stats.loc_upd_resp.reject = osmo_counter_alloc("net.loc_upd_resp.reject");
- net->stats.loc_upd_resp.accept = osmo_counter_alloc("net.loc_upd_resp.accept");
- net->stats.paging.attempted = osmo_counter_alloc("net.paging.attempted");
- net->stats.paging.detached = osmo_counter_alloc("net.paging.detached");
- net->stats.paging.completed = osmo_counter_alloc("net.paging.completed");
- net->stats.paging.expired = osmo_counter_alloc("net.paging.expired");
- net->stats.sms.submitted = osmo_counter_alloc("net.sms.submitted");
- net->stats.sms.no_receiver = osmo_counter_alloc("net.sms.no_receiver");
- net->stats.sms.delivered = osmo_counter_alloc("net.sms.delivered");
- net->stats.sms.rp_err_mem = osmo_counter_alloc("net.sms.rp_err_mem");
- net->stats.sms.rp_err_other = osmo_counter_alloc("net.sms.rp_err_other");
- net->stats.call.mo_setup = osmo_counter_alloc("net.call.mo_setup");
- net->stats.call.mo_connect_ack = osmo_counter_alloc("net.call.mo_connect_ack");
- net->stats.call.mt_setup = osmo_counter_alloc("net.call.mt_setup");
- net->stats.call.mt_connect = osmo_counter_alloc("net.call.mt_connect");
- net->stats.chan.rf_fail = osmo_counter_alloc("net.chan.rf_fail");
- net->stats.chan.rll_err = osmo_counter_alloc("net.chan.rll_err");
- net->stats.bts.oml_fail = osmo_counter_alloc("net.bts.oml_fail");
- net->stats.bts.rsl_fail = osmo_counter_alloc("net.bts.rsl_fail");
+ /* init statistics */
+ net->ratectrs = rate_ctr_group_alloc(net, &msc_ctrg_desc, 0);
net->mncc_recv = mncc_recv;
net->ext_min = GSM_MIN_EXTEN;
diff --git a/openbsc/src/libbsc/paging.c b/openbsc/src/libbsc/paging.c
index 9ae28e0c4..03c91fd7b 100644
--- a/openbsc/src/libbsc/paging.c
+++ b/openbsc/src/libbsc/paging.c
@@ -260,7 +260,7 @@ static void paging_T3113_expired(void *data)
req, req->subscr->imsi);
/* must be destroyed before calling cbfn, to prevent double free */
- osmo_counter_inc(req->bts->network->stats.paging.expired);
+ rate_ctr_inc(&req->bts->network->ratectrs->ctr[MSC_CTR_PAGING_EXPIRED]);
cbfn_param = req->cbfn_param;
cbfn = req->cbfn;
@@ -330,7 +330,7 @@ int paging_request(struct gsm_network *network, struct gsm_subscriber *subscr,
struct gsm_bts *bts = NULL;
int num_pages = 0;
- osmo_counter_inc(network->stats.paging.attempted);
+ rate_ctr_inc(&network->ratectrs->ctr[MSC_CTR_PAGING_ATTEMPTED]);
/* start paging subscriber on all BTS within Location Area */
do {
@@ -349,7 +349,7 @@ int paging_request(struct gsm_network *network, struct gsm_subscriber *subscr,
} while (1);
if (num_pages == 0)
- osmo_counter_inc(network->stats.paging.detached);
+ rate_ctr_inc(&network->ratectrs->ctr[MSC_CTR_PAGING_DETACHED]);
return num_pages;
}
diff --git a/openbsc/src/libmsc/gsm_04_08.c b/openbsc/src/libmsc/gsm_04_08.c
index 1b02efe42..c4ecf1c0c 100644
--- a/openbsc/src/libmsc/gsm_04_08.c
+++ b/openbsc/src/libmsc/gsm_04_08.c
@@ -457,7 +457,7 @@ int gsm0408_loc_upd_rej(struct gsm_subscriber_connection *conn, uint8_t cause)
struct gsm_bts *bts = conn->bts;
struct msgb *msg;
- osmo_counter_inc(bts->network->stats.loc_upd_resp.reject);
+ rate_ctr_inc(&bts->network->ratectrs->ctr[MSC_CTR_LOC_UPDATE_RESP_REJECT]);
msg = gsm48_create_loc_upd_rej(cause);
if (!msg) {
@@ -506,7 +506,7 @@ static int gsm0408_loc_upd_acc(struct gsm_subscriber_connection *conn)
DEBUGP(DMM, "-> LOCATION UPDATE ACCEPT\n");
- osmo_counter_inc(bts->network->stats.loc_upd_resp.accept);
+ rate_ctr_inc(&bts->network->ratectrs->ctr[MSC_CTR_LOC_UPDATE_RESP_ACCEPT]);
return gsm48_conn_sendmsg(msg, conn, NULL);
}
@@ -637,13 +637,13 @@ static int mm_rx_loc_upd_req(struct gsm_subscriber_connection *conn, struct msgb
switch (lu->type) {
case GSM48_LUPD_NORMAL:
- osmo_counter_inc(bts->network->stats.loc_upd_type.normal);
+ rate_ctr_inc(&bts->network->ratectrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_NORMAL]);
break;
case GSM48_LUPD_IMSI_ATT:
- osmo_counter_inc(bts->network->stats.loc_upd_type.attach);
+ rate_ctr_inc(&bts->network->ratectrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_ATTACH]);
break;
case GSM48_LUPD_PERIODIC:
- osmo_counter_inc(bts->network->stats.loc_upd_type.periodic);
+ rate_ctr_inc(&bts->network->ratectrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_PERIODIC]);
break;
}
@@ -1063,7 +1063,7 @@ static int gsm48_rx_mm_imsi_detach_ind(struct gsm_subscriber_connection *conn, s
DEBUGP(DMM, "IMSI DETACH INDICATION: MI(%s)=%s",
gsm48_mi_type_name(mi_type), mi_string);
- osmo_counter_inc(bts->network->stats.loc_upd_type.detach);
+ rate_ctr_inc(&bts->network->ratectrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_DETACH]);
switch (mi_type) {
case GSM_MI_TYPE_TMSI:
@@ -2002,7 +2002,7 @@ static int gsm48_cc_rx_setup(struct gsm_trans *trans, struct msgb *msg)
subscr_name(trans->subscr), trans->subscr->extension,
setup.called.number);
- osmo_counter_inc(trans->net->stats.call.mo_setup);
+ rate_ctr_inc(&trans->net->ratectrs->ctr[MSC_CTR_CALL_MO_SETUP]);
/* indicate setup to MNCC */
mncc_recvmsg(trans->net, trans, MNCC_SETUP_IND, &setup);
@@ -2080,7 +2080,7 @@ static int gsm48_cc_tx_setup(struct gsm_trans *trans, void *arg)
new_cc_state(trans, GSM_CSTATE_CALL_PRESENT);
- osmo_counter_inc(trans->net->stats.call.mt_setup);
+ rate_ctr_inc(&trans->net->ratectrs->ctr[MSC_CTR_CALL_MT_SETUP]);
return gsm48_conn_sendmsg(msg, trans->conn, trans);
}
@@ -2306,7 +2306,7 @@ static int gsm48_cc_rx_connect(struct gsm_trans *trans, struct msgb *msg)
}
new_cc_state(trans, GSM_CSTATE_CONNECT_REQUEST);
- osmo_counter_inc(trans->net->stats.call.mt_connect);
+ rate_ctr_inc(&trans->net->ratectrs->ctr[MSC_CTR_CALL_MT_CONNECT]);
return mncc_recvmsg(trans->net, trans, MNCC_SETUP_CNF, &connect);
}
@@ -2319,7 +2319,7 @@ static int gsm48_cc_rx_connect_ack(struct gsm_trans *trans, struct msgb *msg)
gsm48_stop_cc_timer(trans);
new_cc_state(trans, GSM_CSTATE_ACTIVE);
- osmo_counter_inc(trans->net->stats.call.mo_connect_ack);
+ rate_ctr_inc(&trans->net->ratectrs->ctr[MSC_CTR_CALL_MO_CONNECT_ACK]);
memset(&connect_ack, 0, sizeof(struct gsm_mncc));
connect_ack.callref = trans->callref;
diff --git a/openbsc/src/libmsc/gsm_04_11.c b/openbsc/src/libmsc/gsm_04_11.c
index 20d18a959..fba5208eb 100644
--- a/openbsc/src/libmsc/gsm_04_11.c
+++ b/openbsc/src/libmsc/gsm_04_11.c
@@ -315,14 +315,14 @@ try_local:
rc = smpp_try_deliver(gsms, conn);
if (rc == 1) {
rc = 1; /* cause 1: unknown subscriber */
- osmo_counter_inc(conn->bts->network->stats.sms.no_receiver);
+ rate_ctr_inc(&conn->bts->network->ratectrs->ctr[MSC_CTR_SMS_NO_RECEIVER]);
} else if (rc < 0) {
rc = 21; /* cause 21: short message transfer rejected */
/* FIXME: handle the error somehow? */
}
#else
rc = 1; /* cause 1: unknown subscriber */
- osmo_counter_inc(conn->bts->network->stats.sms.no_receiver);
+ rate_ctr_inc(&conn->bts->network->ratectrs->ctr[MSC_CTR_SMS_NO_RECEIVER]);
#endif
return rc;
}
@@ -363,7 +363,7 @@ static int gsm340_rx_tpdu(struct gsm_subscriber_connection *conn, struct msgb *m
uint8_t address_lv[12]; /* according to 03.40 / 9.1.2.5 */
int rc = 0;
- osmo_counter_inc(conn->bts->network->stats.sms.submitted);
+ rate_ctr_inc(&conn->bts->network->ratectrs->ctr[MSC_CTR_SMS_SUBMITTED]);
gsms = sms_alloc();
if (!gsms)
@@ -633,10 +633,10 @@ static int gsm411_rx_rp_error(struct msgb *msg, struct gsm_trans *trans,
* to store this in our database and wait for a SMMA message */
/* FIXME */
send_signal(S_SMS_MEM_EXCEEDED, trans, sms, 0);
- osmo_counter_inc(net->stats.sms.rp_err_mem);
+ rate_ctr_inc(&net->ratectrs->ctr[MSC_CTR_SMS_RP_ERR_MEM]);
} else {
send_signal(S_SMS_UNKNOWN_ERROR, trans, sms, 0);
- osmo_counter_inc(net->stats.sms.rp_err_other);
+ rate_ctr_inc(&net->ratectrs->ctr[MSC_CTR_SMS_RP_ERR_OTHER]);
}
sms_free(sms);
@@ -932,7 +932,7 @@ int gsm411_send_sms(struct gsm_subscriber_connection *conn, struct gsm_sms *sms)
DEBUGP(DLSMS, "TX: SMS DELIVER\n");
- osmo_counter_inc(conn->bts->network->stats.sms.delivered);
+ rate_ctr_inc(&conn->bts->network->ratectrs->ctr[MSC_CTR_SMS_DELIVERED]);
db_sms_inc_deliver_attempts(trans->sms.sms);
return gsm411_rp_sendmsg(&trans->sms.smr_inst, msg,
diff --git a/openbsc/src/libmsc/vty_interface_layer3.c b/openbsc/src/libmsc/vty_interface_layer3.c
index 74da1d7dc..d1041b378 100644
--- a/openbsc/src/libmsc/vty_interface_layer3.c
+++ b/openbsc/src/libmsc/vty_interface_layer3.c
@@ -795,34 +795,42 @@ DEFUN(show_stats,
openbsc_vty_print_statistics(vty, net);
vty_out(vty, "Location Update : %lu attach, %lu normal, %lu periodic%s",
- osmo_counter_get(net->stats.loc_upd_type.attach),
- osmo_counter_get(net->stats.loc_upd_type.normal),
- osmo_counter_get(net->stats.loc_upd_type.periodic), VTY_NEWLINE);
+ net->ratectrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_ATTACH].current,
+ net->ratectrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_NORMAL].current,
+ net->ratectrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_PERIODIC].current,
+ VTY_NEWLINE);
vty_out(vty, "IMSI Detach Indications : %lu%s",
- osmo_counter_get(net->stats.loc_upd_type.detach), VTY_NEWLINE);
+ net->ratectrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_DETACH].current,
+ VTY_NEWLINE);
vty_out(vty, "Location Update Response: %lu accept, %lu reject%s",
- osmo_counter_get(net->stats.loc_upd_resp.accept),
- osmo_counter_get(net->stats.loc_upd_resp.reject), VTY_NEWLINE);
+ net->ratectrs->ctr[MSC_CTR_LOC_UPDATE_RESP_ACCEPT].current,
+ net->ratectrs->ctr[MSC_CTR_LOC_UPDATE_RESP_REJECT].current,
+ VTY_NEWLINE);
vty_out(vty, "Handover : %lu attempted, %lu no_channel, %lu timeout, "
"%lu completed, %lu failed%s",
- osmo_counter_get(net->stats.handover.attempted),
- osmo_counter_get(net->stats.handover.no_channel),
- osmo_counter_get(net->stats.handover.timeout),
- osmo_counter_get(net->stats.handover.completed),
- osmo_counter_get(net->stats.handover.failed), VTY_NEWLINE);
+ net->ratectrs->ctr[MSC_CTR_HANDOVER_ATTEMPTED].current,
+ net->ratectrs->ctr[MSC_CTR_HANDOVER_NO_CHANNEL].current,
+ net->ratectrs->ctr[MSC_CTR_HANDOVER_TIMEOUT].current,
+ net->ratectrs->ctr[MSC_CTR_HANDOVER_COMPLETED].current,
+ net->ratectrs->ctr[MSC_CTR_HANDOVER_FAILED].current,
+ VTY_NEWLINE);
vty_out(vty, "SMS MO : %lu submitted, %lu no receiver%s",
- osmo_counter_get(net->stats.sms.submitted),
- osmo_counter_get(net->stats.sms.no_receiver), VTY_NEWLINE);
+ net->ratectrs->ctr[MSC_CTR_SMS_SUBMITTED].current,
+ net->ratectrs->ctr[MSC_CTR_SMS_NO_RECEIVER].current,
+ VTY_NEWLINE);
vty_out(vty, "SMS MT : %lu delivered, %lu no memory, %lu other error%s",
- osmo_counter_get(net->stats.sms.delivered),
- osmo_counter_get(net->stats.sms.rp_err_mem),
- osmo_counter_get(net->stats.sms.rp_err_other), VTY_NEWLINE);
+ net->ratectrs->ctr[MSC_CTR_SMS_DELIVERED].current,
+ net->ratectrs->ctr[MSC_CTR_SMS_RP_ERR_MEM].current,
+ net->ratectrs->ctr[MSC_CTR_SMS_RP_ERR_OTHER].current,
+ VTY_NEWLINE);
vty_out(vty, "MO Calls : %lu setup, %lu connect ack%s",
- osmo_counter_get(net->stats.call.mo_setup),
- osmo_counter_get(net->stats.call.mo_connect_ack), VTY_NEWLINE);
+ net->ratectrs->ctr[MSC_CTR_CALL_MO_SETUP].current,
+ net->ratectrs->ctr[MSC_CTR_CALL_MO_CONNECT_ACK].current,
+ VTY_NEWLINE);
vty_out(vty, "MT Calls : %lu setup, %lu connect%s",
- osmo_counter_get(net->stats.call.mt_setup),
- osmo_counter_get(net->stats.call.mt_connect), VTY_NEWLINE);
+ net->ratectrs->ctr[MSC_CTR_CALL_MT_SETUP].current,
+ net->ratectrs->ctr[MSC_CTR_CALL_MT_CONNECT].current,
+ VTY_NEWLINE);
return CMD_SUCCESS;
}