<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/22710">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">ns2: Add rate_ctr_group for each bind<br><br>Those rate counters allow us to track statistics particularly about<br>transmit related errors.  We can see the rate and ration of overall<br>transmit packets vs. those that failed to transmit, were short writes,<br>had to be enqueued (FR only), ...<br><br>Change-Id: Ic81f8de11b9b565e455dbecb34dddd1cb37d613b<br>---<br>M src/gb/gprs_ns2.c<br>M src/gb/gprs_ns2_fr.c<br>M src/gb/gprs_ns2_frgre.c<br>M src/gb/gprs_ns2_internal.h<br>M src/gb/gprs_ns2_udp.c<br>M src/gb/gprs_ns2_vty.c<br>6 files changed, 66 insertions(+), 8 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/10/22710/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/gb/gprs_ns2.c b/src/gb/gprs_ns2.c</span><br><span>index de27fb4..36c1c40 100644</span><br><span>--- a/src/gb/gprs_ns2.c</span><br><span>+++ b/src/gb/gprs_ns2.c</span><br><span>@@ -198,6 +198,23 @@</span><br><span>        .class_id = OSMO_STATS_CLASS_PEER,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static const struct rate_ctr_desc nsbind_ctr_description[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  [NSBIND_CTR_PKTS_OUT]           = { "packets:out",    "Packets attempted    (Out)" },</span><br><span style="color: hsl(120, 100%, 40%);">+     [NSBIND_CTR_PKTS_OUT_DROP]      = { "packets:out:drop",       "Packets Dropped      (Out)" },</span><br><span style="color: hsl(120, 100%, 40%);">+     [NSBIND_CTR_PKTS_OUT_SHORT]     = { "packets:out:short","Packets Short Write  (Out)" },</span><br><span style="color: hsl(120, 100%, 40%);">+   [NSBIND_CTR_PKTS_OUT_ENQ]       = { "packets:out:enqueued",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                         "Packets Enqueued     (Out)" },</span><br><span style="color: hsl(120, 100%, 40%);">+     [NSBIND_CTR_PKTS_OUT_ERR]       = { "packets:out:err",        "Packets Error Write  (Out)" },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct rate_ctr_group_desc nsbind_ctrg_desc = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .group_name_prefix = "ns:bind",</span><br><span style="color: hsl(120, 100%, 40%);">+     .group_description = "NS Bind Statistics",</span><br><span style="color: hsl(120, 100%, 40%);">+  .num_ctr = ARRAY_SIZE(nsbind_ctr_description),</span><br><span style="color: hsl(120, 100%, 40%);">+        .ctr_desc = nsbind_ctr_description,</span><br><span style="color: hsl(120, 100%, 40%);">+   .class_id = OSMO_STATS_CLASS_PEER,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> const struct osmo_stat_item_desc nsbind_stat_description[] = {</span><br><span>   [NS2_BIND_STAT_BACKLOG_LEN] = { "tx_backlog_length",  "Transmit backlog length", "packets", 16, 0 },</span><br><span> };</span><br><span>@@ -1397,16 +1414,16 @@</span><br><span>           return -ENOMEM;</span><br><span> </span><br><span>  bind->name = talloc_strdup(bind, name);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (!bind->name) {</span><br><span style="color: hsl(0, 100%, 40%);">-           talloc_free(bind);</span><br><span style="color: hsl(0, 100%, 40%);">-              return -ENOMEM;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!bind->name)</span><br><span style="color: hsl(120, 100%, 40%);">+           goto err_free;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      bind->ctrg = rate_ctr_group_alloc(bind, &nsbind_ctrg_desc, nsi->bind_rate_ctr_idx);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!bind->ctrg)</span><br><span style="color: hsl(120, 100%, 40%);">+           goto err_free;</span><br><span> </span><br><span>   bind->statg = osmo_stat_item_group_alloc(bind, &nsbind_statg_desc, nsi->bind_rate_ctr_idx);</span><br><span style="color: hsl(0, 100%, 40%);">-   if (!bind->statg) {</span><br><span style="color: hsl(0, 100%, 40%);">-          talloc_free(bind);</span><br><span style="color: hsl(0, 100%, 40%);">-              return -ENOMEM;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!bind->statg)</span><br><span style="color: hsl(120, 100%, 40%);">+          goto err_ctrg;</span><br><span> </span><br><span>   bind->nsi = nsi;</span><br><span>  INIT_LLIST_HEAD(&bind->nsvc);</span><br><span>@@ -1418,6 +1435,12 @@</span><br><span>                *result = bind;</span><br><span> </span><br><span>  return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+err_ctrg:</span><br><span style="color: hsl(120, 100%, 40%);">+        rate_ctr_group_free(bind->ctrg);</span><br><span style="color: hsl(120, 100%, 40%);">+err_free:</span><br><span style="color: hsl(120, 100%, 40%);">+        talloc_free(bind);</span><br><span style="color: hsl(120, 100%, 40%);">+    return -ENOMEM;</span><br><span> }</span><br><span> </span><br><span> /*! @} */</span><br><span>diff --git a/src/gb/gprs_ns2_fr.c b/src/gb/gprs_ns2_fr.c</span><br><span>index 8421691..bf7deea 100644</span><br><span>--- a/src/gb/gprs_ns2_fr.c</span><br><span>+++ b/src/gb/gprs_ns2_fr.c</span><br><span>@@ -48,6 +48,7 @@</span><br><span> #include <osmocom/gprs/frame_relay.h></span><br><span> #include <osmocom/core/byteswap.h></span><br><span> #include <osmocom/core/stat_item.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/rate_ctr.h></span><br><span> #include <osmocom/core/logging.h></span><br><span> #include <osmocom/core/msgb.h></span><br><span> #include <osmocom/core/select.h></span><br><span>@@ -317,12 +318,14 @@</span><br><span>                default:</span><br><span>                     /* an actual error, like -ENETDOWN, -EMSGSIZE */</span><br><span>                     LOGBIND(bind, LOGL_ERROR, "error during write to AF_PACKET: %s\n", strerror(errno));</span><br><span style="color: hsl(120, 100%, 40%);">+                        rate_ctr_inc(&bind->ctrg->ctr[NSBIND_CTR_PKTS_OUT_ERR]);</span><br><span>                   msgb_free(msg);</span><br><span>                      return 0;</span><br><span>            }</span><br><span>    } else {</span><br><span>             /* short write */</span><br><span>            LOGBIND(bind, LOGL_ERROR, "short write on AF_PACKET: %d < %d\n", rc, len);</span><br><span style="color: hsl(120, 100%, 40%);">+               rate_ctr_inc(&bind->ctrg->ctr[NSBIND_CTR_PKTS_OUT_SHORT]);</span><br><span>                 msgb_free(msg);</span><br><span>              return 0;</span><br><span>    }</span><br><span>@@ -378,6 +381,7 @@</span><br><span>              /* always store only the last LMI message in the lmi_msg bucket */</span><br><span>           msgb_free(priv->backlog.lmi_msg);</span><br><span>                 priv->backlog.lmi_msg = msg;</span><br><span style="color: hsl(120, 100%, 40%);">+               rate_ctr_inc(&bind->ctrg->ctr[NSBIND_CTR_PKTS_OUT_ENQ]);</span><br><span>           return 0;</span><br><span>    default:</span><br><span>             /* there's no point in trying to enqueue messages if the interface is down */</span><br><span>@@ -395,12 +399,14 @@</span><br><span>                    /* enqueue BVCI=0 traffic at tail of queue */</span><br><span>                        if (bvci == BVCI_SIGNALLING) {</span><br><span>                               enqueue_at_tail(bind, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+                           rate_ctr_inc(&bind->ctrg->ctr[NSBIND_CTR_PKTS_OUT_ENQ]);</span><br><span>                           return 0;</span><br><span>                    }</span><br><span>                    break;</span><br><span>               default:</span><br><span>                     /* enqueue NS signaling traffic at head of queue */</span><br><span>                  enqueue_at_head(bind, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+                   rate_ctr_inc(&bind->ctrg->ctr[NSBIND_CTR_PKTS_OUT_ENQ]);</span><br><span>                   return 0;</span><br><span>            }</span><br><span>            break;</span><br><span>@@ -408,6 +414,7 @@</span><br><span> </span><br><span> out_free:</span><br><span>        /* drop everything that is not LMI, NS-signaling or BVCI-0 */</span><br><span style="color: hsl(120, 100%, 40%);">+ rate_ctr_inc(&bind->ctrg->ctr[NSBIND_CTR_PKTS_OUT_DROP]);</span><br><span>  msgb_free(msg);</span><br><span>      return -1;</span><br><span> }</span><br><span>@@ -455,6 +462,8 @@</span><br><span>        struct priv_bind *priv = bind->priv;</span><br><span>      int rc;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   rate_ctr_inc(&bind->ctrg->ctr[NSBIND_CTR_PKTS_OUT]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     if (llist_empty(&priv->backlog.list)) {</span><br><span>               /* attempt to transmit right now */</span><br><span>          rc = fr_netif_write_one(bind, msg);</span><br><span>diff --git a/src/gb/gprs_ns2_frgre.c b/src/gb/gprs_ns2_frgre.c</span><br><span>index 177aeb2..bd51712 100644</span><br><span>--- a/src/gb/gprs_ns2_frgre.c</span><br><span>+++ b/src/gb/gprs_ns2_frgre.c</span><br><span>@@ -43,6 +43,7 @@</span><br><span> #include <osmocom/core/select.h></span><br><span> #include <osmocom/core/socket.h></span><br><span> #include <osmocom/core/talloc.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/rate_ctr.h></span><br><span> #include <osmocom/gprs/gprs_ns2.h></span><br><span> </span><br><span> #include "gprs_ns2_internal.h"</span><br><span>@@ -486,9 +487,16 @@</span><br><span>  int rc;</span><br><span>      struct priv_bind *priv = bind->priv;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   rate_ctr_inc(&bind->ctrg->ctr[NSBIND_CTR_PKTS_OUT]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     rc = sendto(priv->fd.fd, msg->data, msg->len, 0,</span><br><span>                &dest->u.sa, sizeof(*dest));</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                rate_ctr_inc(&bind->ctrg->ctr[NSBIND_CTR_PKTS_OUT_ERR]);</span><br><span style="color: hsl(120, 100%, 40%);">+    else if (rc < msg->len)</span><br><span style="color: hsl(120, 100%, 40%);">+         rate_ctr_inc(&bind->ctrg->ctr[NSBIND_CTR_PKTS_OUT_SHORT]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       msgb_free(msg);</span><br><span> </span><br><span>  return rc;</span><br><span>diff --git a/src/gb/gprs_ns2_internal.h b/src/gb/gprs_ns2_internal.h</span><br><span>index 6462907..2d77e16 100644</span><br><span>--- a/src/gb/gprs_ns2_internal.h</span><br><span>+++ b/src/gb/gprs_ns2_internal.h</span><br><span>@@ -107,6 +107,14 @@</span><br><span>       NS_CTR_LOST_RESET,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+enum nsbind_ctr {</span><br><span style="color: hsl(120, 100%, 40%);">+       NSBIND_CTR_PKTS_OUT,</span><br><span style="color: hsl(120, 100%, 40%);">+  NSBIND_CTR_PKTS_OUT_DROP,</span><br><span style="color: hsl(120, 100%, 40%);">+     NSBIND_CTR_PKTS_OUT_ENQ,</span><br><span style="color: hsl(120, 100%, 40%);">+      NSBIND_CTR_PKTS_OUT_ERR,</span><br><span style="color: hsl(120, 100%, 40%);">+      NSBIND_CTR_PKTS_OUT_SHORT,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #define NSE_S_BLOCKED       0x0001</span><br><span> #define NSE_S_ALIVE   0x0002</span><br><span> #define NSE_S_RESET   0x0004</span><br><span>@@ -257,6 +265,7 @@</span><br><span>         void (*dump_vty)(const struct gprs_ns2_vc_bind *bind,</span><br><span>                         struct vty *vty, bool stats);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    struct rate_ctr_group *ctrg;</span><br><span>         struct osmo_stat_item_group *statg;</span><br><span> };</span><br><span> </span><br><span>diff --git a/src/gb/gprs_ns2_udp.c b/src/gb/gprs_ns2_udp.c</span><br><span>index e07f6d4..c8a6d0d 100644</span><br><span>--- a/src/gb/gprs_ns2_udp.c</span><br><span>+++ b/src/gb/gprs_ns2_udp.c</span><br><span>@@ -31,6 +31,7 @@</span><br><span> #include <osmocom/core/select.h></span><br><span> #include <osmocom/core/sockaddr_str.h></span><br><span> #include <osmocom/core/socket.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/rate_ctr.h></span><br><span> #include <osmocom/gprs/gprs_ns2.h></span><br><span> </span><br><span> #include "common_vty.h"</span><br><span>@@ -144,9 +145,16 @@</span><br><span>         int rc;</span><br><span>      struct priv_bind *priv = bind->priv;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   rate_ctr_inc(&bind->ctrg->ctr[NSBIND_CTR_PKTS_OUT]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     rc = sendto(priv->fd.fd, msg->data, msg->len, 0,</span><br><span>                &dest->u.sa, sizeof(*dest));</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                rate_ctr_inc(&bind->ctrg->ctr[NSBIND_CTR_PKTS_OUT_ERR]);</span><br><span style="color: hsl(120, 100%, 40%);">+    else if (rc < msg->len)</span><br><span style="color: hsl(120, 100%, 40%);">+         rate_ctr_inc(&bind->ctrg->ctr[NSBIND_CTR_PKTS_OUT_SHORT]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       msgb_free(msg);</span><br><span> </span><br><span>  return rc;</span><br><span>diff --git a/src/gb/gprs_ns2_vty.c b/src/gb/gprs_ns2_vty.c</span><br><span>index a3aa6ee..d57b8b5 100644</span><br><span>--- a/src/gb/gprs_ns2_vty.c</span><br><span>+++ b/src/gb/gprs_ns2_vty.c</span><br><span>@@ -1376,6 +1376,7 @@</span><br><span>          bind->dump_vty(bind, vty, stats);</span><br><span> </span><br><span>     if (stats) {</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_out_rate_ctr_group(vty, "  ", bind->ctrg);</span><br><span>          vty_out_stat_item_group(vty, "  ", bind->statg);</span><br><span>        }</span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/22710">change 22710</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/libosmocore/+/22710"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ic81f8de11b9b565e455dbecb34dddd1cb37d613b </div>
<div style="display:none"> Gerrit-Change-Number: 22710 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>