gtphub: add first rate counters

Sponsored-by: On-Waves ehi
diff --git a/openbsc/src/gprs/gtphub.c b/openbsc/src/gprs/gtphub.c
index 9a5e882..45599cc 100644
--- a/openbsc/src/gprs/gtphub.c
+++ b/openbsc/src/gprs/gtphub.c
@@ -39,6 +39,8 @@
 #include <osmocom/core/utils.h>
 #include <osmocom/core/logging.h>
 #include <osmocom/core/socket.h>
+#include <osmocom/core/rate_ctr.h>
+#include <osmocom/core/stats.h>
 
 
 static const int GTPH_GC_TICK_SECONDS = 1;
@@ -86,6 +88,32 @@
 	union gtpie_member *ie[GTPIE_SIZE];
 };
 
+
+/* counters */
+
+enum gtphub_counters_io {
+	GTPH_CTR_PKTS_IN = 0,
+	GTPH_CTR_PKTS_OUT,
+	GTPH_CTR_BYTES_IN,
+	GTPH_CTR_BYTES_OUT
+};
+
+static const struct rate_ctr_desc gtphub_counters_io_desc[] = {
+	{ "packets.in",  "Packets ( In)" },
+	{ "packets.out", "Packets (Out)" },
+	{ "bytes.in",    "Packets ( In)" },
+	{ "bytes.out",   "Packets (Out)" },
+};
+
+static const struct rate_ctr_group_desc gtphub_ctrg_io_desc = {
+	.group_name_prefix = "gtphub.bind",
+	.group_description = "Local address I/O statistics",
+	.num_ctr = ARRAY_SIZE(gtphub_counters_io_desc),
+	.ctr_desc = gtphub_counters_io_desc,
+	.class_id = OSMO_STATS_CLASS_GLOBAL,
+};
+
+
 void gsn_addr_copy(struct gsn_addr *gsna, const struct gsn_addr *src)
 {
 	memcpy(gsna, src, sizeof(struct gsn_addr));
@@ -790,6 +818,10 @@
 	ZERO_STRUCT(b);
 
 	INIT_LLIST_HEAD(&b->peers);
+
+	b->counters_io = rate_ctr_group_alloc(osmo_gtphub_ctx,
+					      &gtphub_ctrg_io_desc, 0);
+	OSMO_ASSERT(b->counters_io);
 }
 
 static int gtphub_bind_start(struct gtphub_bind *b,
@@ -807,6 +839,7 @@
 static void gtphub_bind_free(struct gtphub_bind *b)
 {
 	OSMO_ASSERT(llist_empty(&b->peers));
+	rate_ctr_group_free(b->counters_io);
 }
 
 static void gtphub_bind_stop(struct gtphub_bind *b) {
@@ -1366,6 +1399,8 @@
 	struct gtphub_bind *from_bind = &from_bind_arr[plane_idx];
 	struct gtphub_bind *to_bind = &to_bind_arr[plane_idx];
 
+	rate_ctr_add(&from_bind->counters_io->ctr[GTPH_CTR_BYTES_IN],
+		     received);
 	LOG(LOGL_DEBUG, "<- rx %s from GGSN %s\n",
 	    gtphub_plane_idx_names[plane_idx],
 	    osmo_sockaddr_to_str(from_addr));
@@ -1376,6 +1411,8 @@
 	if (p.rc <= 0)
 		return -1;
 
+	rate_ctr_inc(&from_bind->counters_io->ctr[GTPH_CTR_PKTS_IN]);
+
 	int reply_len;
 	reply_len = gtphub_handle_echo(hub, &p, reply_buf);
 	if (reply_len > 0) {
@@ -1463,6 +1500,11 @@
 
 	*reply_buf = (uint8_t*)p.data;
 
+	if (received) {
+		rate_ctr_inc(&to_bind->counters_io->ctr[GTPH_CTR_PKTS_OUT]);
+		rate_ctr_add(&to_bind->counters_io->ctr[GTPH_CTR_BYTES_OUT],
+			     received);
+	}
 	LOG(LOGL_DEBUG, "<-- Forward to SGSN: %d bytes to %s\n",
 	    (int)received, osmo_sockaddr_to_str(to_addr));
 	return received;
@@ -1516,6 +1558,8 @@
 	struct gtphub_bind *from_bind = &from_bind_arr[plane_idx];
 	struct gtphub_bind *to_bind = &to_bind_arr[plane_idx];
 
+	rate_ctr_add(&from_bind->counters_io->ctr[GTPH_CTR_BYTES_IN],
+		     received);
 	LOG(LOGL_DEBUG, "-> rx %s from SGSN %s\n",
 	    gtphub_plane_idx_names[plane_idx],
 	    osmo_sockaddr_to_str(from_addr));
@@ -1526,6 +1570,8 @@
 	if (p.rc <= 0)
 		return -1;
 
+	rate_ctr_inc(&from_bind->counters_io->ctr[GTPH_CTR_PKTS_IN]);
+
 	int reply_len;
 	reply_len = gtphub_handle_echo(hub, &p, reply_buf);
 	if (reply_len > 0) {
@@ -1634,6 +1680,11 @@
 
 	*reply_buf = (uint8_t*)p.data;
 
+	if (received) {
+		rate_ctr_inc(&to_bind->counters_io->ctr[GTPH_CTR_PKTS_OUT]);
+		rate_ctr_add(&to_bind->counters_io->ctr[GTPH_CTR_BYTES_OUT],
+			     received);
+	}
 	LOG(LOGL_DEBUG, "--> Forward to GGSN: %d bytes to %s\n",
 	    (int)received, osmo_sockaddr_to_str(to_addr));
 	return received;