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


Change subject: ns2: Count transmitted/dropped in each layer implementation
......................................................................

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
---
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_message.c
M src/gb/gprs_ns2_udp.c
5 files changed, 52 insertions(+), 17 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/35/32535/1

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_internal.h b/src/gb/gprs_ns2_internal.h
index 4f33221..37b142e 100644
--- a/src/gb/gprs_ns2_internal.h
+++ b/src/gb/gprs_ns2_internal.h
@@ -6,6 +6,7 @@
 #include <stdint.h>

 #include <osmocom/core/logging.h>
+#include <osmocom/core/rate_ctr.h>
 #include <osmocom/gprs/protocol/gsm_08_16.h>
 #include <osmocom/gprs/gprs_ns2.h>

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 */
diff --git a/src/gb/gprs_ns2_udp.c b/src/gb/gprs_ns2_udp.c
index d7dc0db..71a0b28 100644
--- a/src/gb/gprs_ns2_udp.c
+++ b/src/gb/gprs_ns2_udp.c
@@ -226,6 +226,20 @@
                               const struct msgb *msg,
                               const struct osmo_sockaddr *daddr)
 {
+       struct gprs_ns2_vc_bind *bind = osmo_iofd_get_data(iofd);
+       struct gprs_ns2_vc *nsvc;
+
+       nsvc = gprs_ns2_nsvc_by_sockaddr_bind(bind, daddr);
+       if (!nsvc)
+               return;
+
+       if (OSMO_LIKELY(res >= 0)) {
+               RATE_CTR_INC_NS(nsvc, NS_CTR_PKTS_OUT);
+               RATE_CTR_ADD_NS(nsvc, NS_CTR_BYTES_OUT, res);
+       } else {
+               RATE_CTR_INC_NS(nsvc, NS_CTR_PKTS_OUT_DROP);
+               RATE_CTR_ADD_NS(nsvc, NS_CTR_BYTES_OUT_DROP, msgb_length(msg));
+       }
 }

 /*! Find NS bind for a given socket address

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

Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Change-Id: I8109cee07f157ebf1806f82a071f58de3a2dcc9c
Gerrit-Change-Number: 32535
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <[email protected]>
Gerrit-MessageType: newchange

Reply via email to