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