Change in libosmocore[master]: ns2: Add rate_ctr_group for each bind

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

laforge gerrit-no-reply at lists.osmocom.org
Thu Feb 4 18:28:23 UTC 2021


laforge has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/22710 )


Change subject: ns2: Add rate_ctr_group for each bind
......................................................................

ns2: Add rate_ctr_group for each bind

Those rate counters allow us to track statistics particularly about
transmit related errors.  We can see the rate and ration of overall
transmit packets vs. those that failed to transmit, were short writes,
had to be enqueued (FR only), ...

Change-Id: Ic81f8de11b9b565e455dbecb34dddd1cb37d613b
---
M src/gb/gprs_ns2.c
M src/gb/gprs_ns2_fr.c
M src/gb/gprs_ns2_frgre.c
M src/gb/gprs_ns2_internal.h
M src/gb/gprs_ns2_udp.c
M src/gb/gprs_ns2_vty.c
6 files changed, 66 insertions(+), 8 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/10/22710/1

diff --git a/src/gb/gprs_ns2.c b/src/gb/gprs_ns2.c
index de27fb4..36c1c40 100644
--- a/src/gb/gprs_ns2.c
+++ b/src/gb/gprs_ns2.c
@@ -198,6 +198,23 @@
 	.class_id = OSMO_STATS_CLASS_PEER,
 };
 
+static const struct rate_ctr_desc nsbind_ctr_description[] = {
+	[NSBIND_CTR_PKTS_OUT]		= { "packets:out",	"Packets attempted    (Out)" },
+	[NSBIND_CTR_PKTS_OUT_DROP]	= { "packets:out:drop",	"Packets Dropped      (Out)" },
+	[NSBIND_CTR_PKTS_OUT_SHORT]	= { "packets:out:short","Packets Short Write  (Out)" },
+	[NSBIND_CTR_PKTS_OUT_ENQ]	= { "packets:out:enqueued",
+								"Packets Enqueued     (Out)" },
+	[NSBIND_CTR_PKTS_OUT_ERR]	= { "packets:out:err",	"Packets Error Write  (Out)" },
+};
+
+static const struct rate_ctr_group_desc nsbind_ctrg_desc = {
+	.group_name_prefix = "ns:bind",
+	.group_description = "NS Bind Statistics",
+	.num_ctr = ARRAY_SIZE(nsbind_ctr_description),
+	.ctr_desc = nsbind_ctr_description,
+	.class_id = OSMO_STATS_CLASS_PEER,
+};
+
 const struct osmo_stat_item_desc nsbind_stat_description[] = {
 	[NS2_BIND_STAT_BACKLOG_LEN] = { "tx_backlog_length",	"Transmit backlog length", "packets", 16, 0 },
 };
@@ -1397,16 +1414,16 @@
 		return -ENOMEM;
 
 	bind->name = talloc_strdup(bind, name);
-	if (!bind->name) {
-		talloc_free(bind);
-		return -ENOMEM;
-	}
+	if (!bind->name)
+		goto err_free;
+
+	bind->ctrg = rate_ctr_group_alloc(bind, &nsbind_ctrg_desc, nsi->bind_rate_ctr_idx);
+	if (!bind->ctrg)
+		goto err_free;
 
 	bind->statg = osmo_stat_item_group_alloc(bind, &nsbind_statg_desc, nsi->bind_rate_ctr_idx);
-	if (!bind->statg) {
-		talloc_free(bind);
-		return -ENOMEM;
-	}
+	if (!bind->statg)
+		goto err_ctrg;
 
 	bind->nsi = nsi;
 	INIT_LLIST_HEAD(&bind->nsvc);
@@ -1418,6 +1435,12 @@
 		*result = bind;
 
 	return 0;
+
+err_ctrg:
+	rate_ctr_group_free(bind->ctrg);
+err_free:
+	talloc_free(bind);
+	return -ENOMEM;
 }
 
 /*! @} */
diff --git a/src/gb/gprs_ns2_fr.c b/src/gb/gprs_ns2_fr.c
index 8421691..bf7deea 100644
--- a/src/gb/gprs_ns2_fr.c
+++ b/src/gb/gprs_ns2_fr.c
@@ -48,6 +48,7 @@
 #include <osmocom/gprs/frame_relay.h>
 #include <osmocom/core/byteswap.h>
 #include <osmocom/core/stat_item.h>
+#include <osmocom/core/rate_ctr.h>
 #include <osmocom/core/logging.h>
 #include <osmocom/core/msgb.h>
 #include <osmocom/core/select.h>
@@ -317,12 +318,14 @@
 		default:
 			/* an actual error, like -ENETDOWN, -EMSGSIZE */
 			LOGBIND(bind, LOGL_ERROR, "error during write to AF_PACKET: %s\n", strerror(errno));
+			rate_ctr_inc(&bind->ctrg->ctr[NSBIND_CTR_PKTS_OUT_ERR]);
 			msgb_free(msg);
 			return 0;
 		}
 	} else {
 		/* short write */
 		LOGBIND(bind, LOGL_ERROR, "short write on AF_PACKET: %d < %d\n", rc, len);
+		rate_ctr_inc(&bind->ctrg->ctr[NSBIND_CTR_PKTS_OUT_SHORT]);
 		msgb_free(msg);
 		return 0;
 	}
@@ -378,6 +381,7 @@
 		/* always store only the last LMI message in the lmi_msg bucket */
 		msgb_free(priv->backlog.lmi_msg);
 		priv->backlog.lmi_msg = msg;
+		rate_ctr_inc(&bind->ctrg->ctr[NSBIND_CTR_PKTS_OUT_ENQ]);
 		return 0;
 	default:
 		/* there's no point in trying to enqueue messages if the interface is down */
@@ -395,12 +399,14 @@
 			/* enqueue BVCI=0 traffic at tail of queue */
 			if (bvci == BVCI_SIGNALLING) {
 				enqueue_at_tail(bind, msg);
+				rate_ctr_inc(&bind->ctrg->ctr[NSBIND_CTR_PKTS_OUT_ENQ]);
 				return 0;
 			}
 			break;
 		default:
 			/* enqueue NS signaling traffic at head of queue */
 			enqueue_at_head(bind, msg);
+			rate_ctr_inc(&bind->ctrg->ctr[NSBIND_CTR_PKTS_OUT_ENQ]);
 			return 0;
 		}
 		break;
@@ -408,6 +414,7 @@
 
 out_free:
 	/* drop everything that is not LMI, NS-signaling or BVCI-0 */
+	rate_ctr_inc(&bind->ctrg->ctr[NSBIND_CTR_PKTS_OUT_DROP]);
 	msgb_free(msg);
 	return -1;
 }
@@ -455,6 +462,8 @@
 	struct priv_bind *priv = bind->priv;
 	int rc;
 
+	rate_ctr_inc(&bind->ctrg->ctr[NSBIND_CTR_PKTS_OUT]);
+
 	if (llist_empty(&priv->backlog.list)) {
 		/* attempt to transmit right now */
 		rc = fr_netif_write_one(bind, msg);
diff --git a/src/gb/gprs_ns2_frgre.c b/src/gb/gprs_ns2_frgre.c
index 177aeb2..bd51712 100644
--- a/src/gb/gprs_ns2_frgre.c
+++ b/src/gb/gprs_ns2_frgre.c
@@ -43,6 +43,7 @@
 #include <osmocom/core/select.h>
 #include <osmocom/core/socket.h>
 #include <osmocom/core/talloc.h>
+#include <osmocom/core/rate_ctr.h>
 #include <osmocom/gprs/gprs_ns2.h>
 
 #include "gprs_ns2_internal.h"
@@ -486,9 +487,16 @@
 	int rc;
 	struct priv_bind *priv = bind->priv;
 
+	rate_ctr_inc(&bind->ctrg->ctr[NSBIND_CTR_PKTS_OUT]);
+
 	rc = sendto(priv->fd.fd, msg->data, msg->len, 0,
 		    &dest->u.sa, sizeof(*dest));
 
+	if (rc < 0)
+		rate_ctr_inc(&bind->ctrg->ctr[NSBIND_CTR_PKTS_OUT_ERR]);
+	else if (rc < msg->len)
+		rate_ctr_inc(&bind->ctrg->ctr[NSBIND_CTR_PKTS_OUT_SHORT]);
+
 	msgb_free(msg);
 
 	return rc;
diff --git a/src/gb/gprs_ns2_internal.h b/src/gb/gprs_ns2_internal.h
index 6462907..2d77e16 100644
--- a/src/gb/gprs_ns2_internal.h
+++ b/src/gb/gprs_ns2_internal.h
@@ -107,6 +107,14 @@
 	NS_CTR_LOST_RESET,
 };
 
+enum nsbind_ctr {
+	NSBIND_CTR_PKTS_OUT,
+	NSBIND_CTR_PKTS_OUT_DROP,
+	NSBIND_CTR_PKTS_OUT_ENQ,
+	NSBIND_CTR_PKTS_OUT_ERR,
+	NSBIND_CTR_PKTS_OUT_SHORT,
+};
+
 #define NSE_S_BLOCKED	0x0001
 #define NSE_S_ALIVE	0x0002
 #define NSE_S_RESET	0x0004
@@ -257,6 +265,7 @@
 	void (*dump_vty)(const struct gprs_ns2_vc_bind *bind,
 			 struct vty *vty, bool stats);
 
+	struct rate_ctr_group *ctrg;
 	struct osmo_stat_item_group *statg;
 };
 
diff --git a/src/gb/gprs_ns2_udp.c b/src/gb/gprs_ns2_udp.c
index e07f6d4..c8a6d0d 100644
--- a/src/gb/gprs_ns2_udp.c
+++ b/src/gb/gprs_ns2_udp.c
@@ -31,6 +31,7 @@
 #include <osmocom/core/select.h>
 #include <osmocom/core/sockaddr_str.h>
 #include <osmocom/core/socket.h>
+#include <osmocom/core/rate_ctr.h>
 #include <osmocom/gprs/gprs_ns2.h>
 
 #include "common_vty.h"
@@ -144,9 +145,16 @@
 	int rc;
 	struct priv_bind *priv = bind->priv;
 
+	rate_ctr_inc(&bind->ctrg->ctr[NSBIND_CTR_PKTS_OUT]);
+
 	rc = sendto(priv->fd.fd, msg->data, msg->len, 0,
 		    &dest->u.sa, sizeof(*dest));
 
+	if (rc < 0)
+		rate_ctr_inc(&bind->ctrg->ctr[NSBIND_CTR_PKTS_OUT_ERR]);
+	else if (rc < msg->len)
+		rate_ctr_inc(&bind->ctrg->ctr[NSBIND_CTR_PKTS_OUT_SHORT]);
+
 	msgb_free(msg);
 
 	return rc;
diff --git a/src/gb/gprs_ns2_vty.c b/src/gb/gprs_ns2_vty.c
index a3aa6ee..d57b8b5 100644
--- a/src/gb/gprs_ns2_vty.c
+++ b/src/gb/gprs_ns2_vty.c
@@ -1376,6 +1376,7 @@
 		bind->dump_vty(bind, vty, stats);
 
 	if (stats) {
+		vty_out_rate_ctr_group(vty, "  ", bind->ctrg);
 		vty_out_stat_item_group(vty, "  ", bind->statg);
 	}
 }

-- 
To view, visit https://gerrit.osmocom.org/c/libosmocore/+/22710
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Change-Id: Ic81f8de11b9b565e455dbecb34dddd1cb37d613b
Gerrit-Change-Number: 22710
Gerrit-PatchSet: 1
Gerrit-Owner: laforge <laforge at osmocom.org>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20210204/45bb1b4b/attachment.htm>


More information about the gerrit-log mailing list