ns2: Count transmitted/dropped in each layer implementation

This allows better control on how the counters are ticked.
For instance, since nowadays the writing in ns2_udp is done
asyncrhonously, most probable failures occur at a later point and not
when returning to the caller.

Change-Id: I8109cee07f157ebf1806f82a071f58de3a2dcc9c
diff --git a/src/gb/gprs_ns2_fr.c b/src/gb/gprs_ns2_fr.c
index d651601..f6bee39 100644
--- a/src/gb/gprs_ns2_fr.c
+++ b/src/gb/gprs_ns2_fr.c
@@ -332,9 +332,19 @@
 static int fr_vc_sendmsg(struct gprs_ns2_vc *nsvc, struct msgb *msg)
 {
 	struct priv_vc *vcpriv = nsvc->priv;
+	unsigned int vc_len = msgb_length(msg);
+	int rc;
 
 	msg->dst = vcpriv->dlc;
-	return osmo_fr_tx_dlc(msg);
+	rc = osmo_fr_tx_dlc(msg);
+	if (OSMO_LIKELY(rc >= 0)) {
+		RATE_CTR_INC_NS(nsvc, NS_CTR_PKTS_OUT);
+		RATE_CTR_ADD_NS(nsvc, NS_CTR_BYTES_OUT, vc_len);
+	} else {
+		RATE_CTR_INC_NS(nsvc, NS_CTR_PKTS_OUT_DROP);
+		RATE_CTR_ADD_NS(nsvc, NS_CTR_BYTES_OUT_DROP, vc_len);
+	}
+	return rc;
 }
 
 static void enqueue_at_head(struct gprs_ns2_vc_bind *bind, struct msgb *msg)
diff --git a/src/gb/gprs_ns2_frgre.c b/src/gb/gprs_ns2_frgre.c
index 9391343..b99761e 100644
--- a/src/gb/gprs_ns2_frgre.c
+++ b/src/gb/gprs_ns2_frgre.c
@@ -503,6 +503,8 @@
 	uint16_t dlci = osmo_htons(bindpriv->dlci);
 	uint8_t *frh;
 	struct gre_hdr *greh;
+	unsigned int vc_len = msgb_length(msg);
+	int rc;
 
 	/* Prepend the FR header */
 	frh = msgb_push(msg, 2);
@@ -514,7 +516,15 @@
 	greh->flags = 0;
 	greh->ptype = osmo_htons(GRE_PTYPE_FR);
 
-	return frgre_sendmsg(bind, msg, &vcpriv->remote);
+	rc = frgre_sendmsg(bind, msg, &vcpriv->remote);
+	if (OSMO_LIKELY(rc >= 0)) {
+		RATE_CTR_INC_NS(nsvc, NS_CTR_PKTS_OUT);
+		RATE_CTR_ADD_NS(nsvc, NS_CTR_BYTES_OUT, rc);
+	} else {
+		RATE_CTR_INC_NS(nsvc, NS_CTR_PKTS_OUT_DROP);
+		RATE_CTR_ADD_NS(nsvc, NS_CTR_BYTES_OUT_DROP, vc_len);
+	}
+	return rc;
 }
 
 static int frgre_fd_cb(struct osmo_fd *bfd, unsigned int what)
diff --git a/src/gb/gprs_ns2_message.c b/src/gb/gprs_ns2_message.c
index 1b986fe..de63b7a 100644
--- a/src/gb/gprs_ns2_message.c
+++ b/src/gb/gprs_ns2_message.c
@@ -169,23 +169,9 @@
 	return 0;
 }
 
-
 static int ns_vc_tx(struct gprs_ns2_vc *nsvc, struct msgb *msg)
 {
-	unsigned int bytes = msgb_length(msg);
-	int rc;
-
-
-	rc = nsvc->bind->send_vc(nsvc, msg);
-	if (rc < 0) {
-		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_NS(nsvc, NS_CTR_PKTS_OUT);
-		RATE_CTR_ADD_NS(nsvc, NS_CTR_BYTES_OUT, bytes);
-	}
-
-	return rc;
+	return nsvc->bind->send_vc(nsvc, msg);
 }
 
 /* transmit functions */