diff options
author | Daniel Willmann <dwillmann@sysmocom.de> | 2021-07-09 20:35:00 +0200 |
---|---|---|
committer | Daniel Willmann <dwillmann@sysmocom.de> | 2021-07-09 20:35:00 +0200 |
commit | efa64f9429aae0a7cab8efc7e40861d59ec3d6b9 (patch) | |
tree | be8673c88e36a0306c8c9f6b707476109af3d85f | |
parent | 5aa421f7c19d78b9c21ce358ab161c15a3029403 (diff) |
Aggregate NSVC stats inside the NSE
Change-Id: Ifa3c85ec52bda14596e9d7a8705baa1fd4ee2010
Related: OS#4998
-rw-r--r-- | src/gb/gprs_ns2.c | 25 | ||||
-rw-r--r-- | src/gb/gprs_ns2_internal.h | 17 | ||||
-rw-r--r-- | src/gb/gprs_ns2_message.c | 8 | ||||
-rw-r--r-- | src/gb/gprs_ns2_vc_fsm.c | 8 |
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); |