aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Willmann <dwillmann@sysmocom.de>2021-07-09 20:35:00 +0200
committerDaniel Willmann <dwillmann@sysmocom.de>2021-07-09 20:35:00 +0200
commitefa64f9429aae0a7cab8efc7e40861d59ec3d6b9 (patch)
treebe8673c88e36a0306c8c9f6b707476109af3d85f
parent5aa421f7c19d78b9c21ce358ab161c15a3029403 (diff)
Aggregate NSVC stats inside the NSE
-rw-r--r--src/gb/gprs_ns2.c25
-rw-r--r--src/gb/gprs_ns2_internal.h17
-rw-r--r--src/gb/gprs_ns2_message.c8
-rw-r--r--src/gb/gprs_ns2_vc_fsm.c8
4 files changed, 45 insertions, 13 deletions
diff --git a/src/gb/gprs_ns2.c b/src/gb/gprs_ns2.c
index 3eb59e54..fb2965a3 100644
--- a/src/gb/gprs_ns2.c
+++ b/src/gb/gprs_ns2.c
@@ -159,7 +159,7 @@ const struct value_string gprs_ns2_cause_strs[] = {
{ 0, NULL }
};
-static const struct rate_ctr_desc nsvc_ctr_description[] = {
+static const struct rate_ctr_desc ns_ctr_description[] = {
[NS_CTR_PKTS_IN] = { "packets:in", "Packets at NS Level ( In)" },
[NS_CTR_PKTS_OUT] = { "packets:out", "Packets at NS Level (Out)" },
[NS_CTR_PKTS_OUT_DROP] = { "packets:out:drop", "Dropped Packets (Out)" },
@@ -177,11 +177,19 @@ static const struct rate_ctr_desc nsvc_ctr_description[] = {
[NS_CTR_LOST_RESET] = { "lost:reset", "RESET ACK missing count " },
};
+static const struct rate_ctr_group_desc nse_ctrg_desc = {
+ .group_name_prefix = "ns:nse",
+ .group_description = "NSE Peer Statistics",
+ .num_ctr = ARRAY_SIZE(ns_ctr_description),
+ .ctr_desc = ns_ctr_description,
+ .class_id = OSMO_STATS_CLASS_PEER,
+};
+
static const struct rate_ctr_group_desc nsvc_ctrg_desc = {
.group_name_prefix = "ns:nsvc",
.group_description = "NSVC Peer Statistics",
- .num_ctr = ARRAY_SIZE(nsvc_ctr_description),
- .ctr_desc = nsvc_ctr_description,
+ .num_ctr = ARRAY_SIZE(ns_ctr_description),
+ .ctr_desc = ns_ctr_description,
.class_id = OSMO_STATS_CLASS_PEER,
};
@@ -806,6 +814,12 @@ struct gprs_ns2_nse *gprs_ns2_create_nse2(struct gprs_ns2_inst *nsi, uint16_t ns
return NULL;
}
+ nse->ctrg = rate_ctr_group_alloc(nse, &nse_ctrg_desc, nsei);
+ if (!nse->ctrg) {
+ talloc_free(nse);
+ return NULL;
+ }
+
nse->ll = linklayer;
nse->nsei = nsei;
nse->nsi = nsi;
@@ -886,6 +900,7 @@ void gprs_ns2_free_nse(struct gprs_ns2_nse *nse)
gprs_ns2_free_nsvcs(nse);
ns2_prim_status_ind(nse, NULL, 0, GPRS_NS2_AFF_CAUSE_FAILURE);
+ rate_ctr_group_free(nse->ctrg);
llist_del(&nse->list);
talloc_free(nse);
@@ -1265,8 +1280,8 @@ int ns2_recv_vc(struct gprs_ns2_vc *nsvc,
log_set_context(LOG_CTX_GB_NSE, nsvc->nse);
log_set_context(LOG_CTX_GB_NSVC, nsvc);
- rate_ctr_inc(rate_ctr_group_get_ctr(nsvc->ctrg, NS_CTR_PKTS_IN));
- rate_ctr_add(rate_ctr_group_get_ctr(nsvc->ctrg, NS_CTR_BYTES_IN), msg->len);
+ RATE_CTR_INC_NS(nsvc, NS_CTR_PKTS_IN);
+ RATE_CTR_ADD_NS(nsvc, NS_CTR_BYTES_IN, msg->len);
if (msg->len < sizeof(struct gprs_ns_hdr)) {
rc = -EINVAL;
diff --git a/src/gb/gprs_ns2_internal.h b/src/gb/gprs_ns2_internal.h
index 70e212a0..db01c2ee 100644
--- a/src/gb/gprs_ns2_internal.h
+++ b/src/gb/gprs_ns2_internal.h
@@ -38,6 +38,20 @@
#define LOG_NS_RX_SIGNAL(nsvc, pdu_type) LOG_NS_SIGNAL(nsvc, "Rx", pdu_type, LOGL_INFO, "\n")
#define LOG_NS_TX_SIGNAL(nsvc, pdu_type) LOG_NS_SIGNAL(nsvc, "Tx", pdu_type, LOGL_INFO, "\n")
+#define RATE_CTR_INC_NS(nsvc, ctr) \
+ do { \
+ struct gprs_ns2_vc *_nsvc = (nsvc); \
+ rate_ctr_inc(rate_ctr_group_get_ctr(_nsvc->ctrg, ctr)); \
+ rate_ctr_inc(rate_ctr_group_get_ctr(_nsvc->nse->ctrg, ctr)); \
+ } while (0)
+
+#define RATE_CTR_ADD_NS(nsvc, ctr, val) \
+ do { \
+ struct gprs_ns2_vc *_nsvc = (nsvc); \
+ rate_ctr_add(rate_ctr_group_get_ctr(_nsvc->ctrg, ctr), val); \
+ rate_ctr_add(rate_ctr_group_get_ctr(_nsvc->nse->ctrg, ctr), val); \
+ } while (0)
+
struct osmo_fsm_inst;
struct tlv_parsed;
@@ -198,6 +212,9 @@ struct gprs_ns2_nse {
/*! are we implementing the SGSN role? */
bool ip_sns_role_sgsn;
+
+ /*! NSE-wide statistics */
+ struct rate_ctr_group *ctrg;
};
/*! Structure representing a single NS-VC */
diff --git a/src/gb/gprs_ns2_message.c b/src/gb/gprs_ns2_message.c
index 03e26bd3..dccf51d2 100644
--- a/src/gb/gprs_ns2_message.c
+++ b/src/gb/gprs_ns2_message.c
@@ -174,11 +174,11 @@ static int ns_vc_tx(struct gprs_ns2_vc *nsvc, struct msgb *msg)
rc = nsvc->bind->send_vc(nsvc, msg);
if (rc < 0) {
- rate_ctr_inc(rate_ctr_group_get_ctr(nsvc->ctrg, NS_CTR_PKTS_OUT_DROP));
- rate_ctr_add(rate_ctr_group_get_ctr(nsvc->ctrg, NS_CTR_BYTES_OUT_DROP), bytes);
+ RATE_CTR_INC_NS(nsvc, NS_CTR_PKTS_OUT_DROP);
+ RATE_CTR_ADD_NS(nsvc, NS_CTR_BYTES_OUT_DROP, bytes);
} else {
- rate_ctr_inc(rate_ctr_group_get_ctr(nsvc->ctrg, NS_CTR_PKTS_OUT));
- rate_ctr_add(rate_ctr_group_get_ctr(nsvc->ctrg, NS_CTR_BYTES_OUT), bytes);
+ RATE_CTR_INC_NS(nsvc, NS_CTR_PKTS_OUT);
+ RATE_CTR_ADD_NS(nsvc, NS_CTR_BYTES_OUT, bytes);
}
return rc;
diff --git a/src/gb/gprs_ns2_vc_fsm.c b/src/gb/gprs_ns2_vc_fsm.c
index 05118b21..4dc0536e 100644
--- a/src/gb/gprs_ns2_vc_fsm.c
+++ b/src/gb/gprs_ns2_vc_fsm.c
@@ -230,7 +230,7 @@ static void alive_timeout_handler(void *data)
osmo_timer_schedule(&priv->alive.timer, nsi->timeout[NS_TOUT_TNS_ALIVE], 0);
break;
case NS_TOUT_TNS_ALIVE:
- rate_ctr_inc(rate_ctr_group_get_ctr(priv->nsvc->ctrg, NS_CTR_LOST_ALIVE));
+ RATE_CTR_INC_NS(priv->nsvc, NS_CTR_LOST_ALIVE);
priv->alive.N++;
if (priv->alive.N <= nsi->timeout[NS_TOUT_TNS_ALIVE_RETRIES]) {
@@ -336,7 +336,7 @@ static void ns2_st_blocked_onenter(struct osmo_fsm_inst *fi, uint32_t old_state)
if (old_state != GPRS_NS2_ST_BLOCKED) {
priv->N = 0;
- rate_ctr_inc(rate_ctr_group_get_ctr(priv->nsvc->ctrg, NS_CTR_BLOCKED));
+ RATE_CTR_INC_NS(priv->nsvc, NS_CTR_BLOCKED);
}
ns2_nse_notify_unblocked(priv->nsvc, false);
@@ -412,7 +412,7 @@ static void ns2_st_unblocked_on_enter(struct osmo_fsm_inst *fi, uint32_t old_sta
struct gprs_ns2_nse *nse = nsvc->nse;
if (old_state != GPRS_NS2_ST_UNBLOCKED)
- rate_ctr_inc(rate_ctr_group_get_ctr(nsvc->ctrg, NS_CTR_UNBLOCKED));
+ RATE_CTR_INC_NS(nsvc, NS_CTR_UNBLOCKED);
priv->accept_unitdata = true;
ns2_nse_notify_unblocked(nsvc, true);
@@ -527,7 +527,7 @@ static int ns2_vc_fsm_timer_cb(struct osmo_fsm_inst *fi)
switch (fi->state) {
case GPRS_NS2_ST_RESET:
if (priv->initiate_reset) {
- rate_ctr_inc(rate_ctr_group_get_ctr(priv->nsvc->ctrg, NS_CTR_LOST_RESET));
+ RATE_CTR_INC_NS(priv->nsvc, NS_CTR_LOST_RESET);
priv->N++;
if (priv->N <= nsi->timeout[NS_TOUT_TNS_RESET_RETRIES]) {
osmo_fsm_inst_state_chg(fi, GPRS_NS2_ST_RESET, nsi->timeout[NS_TOUT_TNS_RESET], 0);