<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/18092">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved
  pespin: Looks good to me, but someone else must approve

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">stats: Add a stats gauge for the MSC links count.<br><br>Change-Id: Ibe4b29056ba704a27b925cfdba49f343ee34f428<br>---<br>M include/osmocom/bsc/bsc_msc_data.h<br>M src/osmo-bsc/a_reset.c<br>M src/osmo-bsc/osmo_bsc_msc.c<br>3 files changed, 78 insertions(+), 6 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/bsc_msc_data.h b/include/osmocom/bsc/bsc_msc_data.h</span><br><span>index b9df4ba..7d797eb 100644</span><br><span>--- a/include/osmocom/bsc/bsc_msc_data.h</span><br><span>+++ b/include/osmocom/bsc/bsc_msc_data.h</span><br><span>@@ -56,6 +56,12 @@</span><br><span>  MSC_CON_TYPE_LOCAL,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Constants for the MSC stats */</span><br><span style="color: hsl(120, 100%, 40%);">+enum {</span><br><span style="color: hsl(120, 100%, 40%);">+      MSC_STAT_MSC_LINKS_ACTIVE,</span><br><span style="color: hsl(120, 100%, 40%);">+    MSC_STAT_MSC_LINKS_TOTAL,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! /brief Information on a remote MSC for libbsc.</span><br><span>  */</span><br><span> struct bsc_msc_data {</span><br><span>@@ -99,6 +105,10 @@</span><br><span> </span><br><span>      char *acc_lst_name;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       /* structures for keeping rate counters and gauge stats */</span><br><span style="color: hsl(120, 100%, 40%);">+    struct rate_ctr_group *msc_ctrs;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct osmo_stat_item_group *msc_statg;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    /* Sigtran connection data */</span><br><span>        struct {</span><br><span>             uint32_t cs7_instance;</span><br><span>diff --git a/src/osmo-bsc/a_reset.c b/src/osmo-bsc/a_reset.c</span><br><span>index 3f51278..63273e9 100644</span><br><span>--- a/src/osmo-bsc/a_reset.c</span><br><span>+++ b/src/osmo-bsc/a_reset.c</span><br><span>@@ -66,18 +66,28 @@</span><br><span>    {0, NULL}</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Disconnected state */</span><br><span style="color: hsl(120, 100%, 40%);">+/* Disconnected state event handler */</span><br><span> static void fsm_disc_cb(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span>    struct reset_ctx *reset_ctx = (struct reset_ctx *)fi->priv;</span><br><span>       OSMO_ASSERT(reset_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- LOGPFSML(fi, LOGL_NOTICE, "SIGTRAN connection succeeded.\n");</span><br><span> </span><br><span>  reset_ctx->conn_loss_counter = 0;</span><br><span>         osmo_fsm_inst_state_chg(fi, ST_CONN, 0, 0);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Connected state */</span><br><span style="color: hsl(120, 100%, 40%);">+/* Called when entering Disconnected state */</span><br><span style="color: hsl(120, 100%, 40%);">+static void fsm_disc_onenter_cb(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct reset_ctx *reset_ctx = (struct reset_ctx *)fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct bsc_msc_data *msc = reset_ctx->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      LOGPFSML(fi, LOGL_NOTICE, "SIGTRAN connection down, reconnecting...\n");</span><br><span style="color: hsl(120, 100%, 40%);">+    if (prev_state != ST_DISC)</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_stat_item_dec(msc->msc_statg->items[MSC_STAT_MSC_LINKS_ACTIVE], 1);</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%);">+/* Connected state event handler */</span><br><span> static void fsm_conn_cb(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span>       struct reset_ctx *reset_ctx = (struct reset_ctx *)fi->priv;</span><br><span>@@ -85,10 +95,9 @@</span><br><span> </span><br><span>      switch (event) {</span><br><span>     case EV_N_DISCONNECT:</span><br><span style="color: hsl(0, 100%, 40%);">-           if (reset_ctx->conn_loss_counter >= BAD_CONNECTION_THRESOLD) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    LOGPFSML(fi, LOGL_NOTICE, "SIGTRAN connection down, reconnecting...\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            if (reset_ctx->conn_loss_counter >= BAD_CONNECTION_THRESOLD)</span><br><span>                   osmo_fsm_inst_state_chg(fi, ST_DISC, RESET_RESEND_INTERVAL, RESET_RESEND_TIMER_NO);</span><br><span style="color: hsl(0, 100%, 40%);">-             } else</span><br><span style="color: hsl(120, 100%, 40%);">+                else</span><br><span>                         reset_ctx->conn_loss_counter++;</span><br><span>           break;</span><br><span>       case EV_N_CONNECT:</span><br><span>@@ -97,6 +106,17 @@</span><br><span>     }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Called when entering Connected state */</span><br><span style="color: hsl(120, 100%, 40%);">+static void fsm_conn_onenter_cb(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct reset_ctx *reset_ctx = (struct reset_ctx *)fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct bsc_msc_data *msc = reset_ctx->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      LOGPFSML(fi, LOGL_NOTICE, "SIGTRAN connection succeeded.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+       if (prev_state != ST_CONN)</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_stat_item_inc(msc->msc_statg->items[MSC_STAT_MSC_LINKS_ACTIVE], 1);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Timer callback to retransmit the reset signal */</span><br><span> static int fsm_reset_ack_timeout_cb(struct osmo_fsm_inst *fi)</span><br><span> {</span><br><span>@@ -117,12 +137,14 @@</span><br><span>                  .out_state_mask = (1 << ST_DISC) | (1 << ST_CONN),</span><br><span>               .name = "DISC",</span><br><span>                    .action = fsm_disc_cb,</span><br><span style="color: hsl(120, 100%, 40%);">+                .onenter = fsm_disc_onenter_cb,</span><br><span>                      },</span><br><span>      [ST_CONN] = {</span><br><span>                     .in_event_mask = (1 << EV_N_DISCONNECT) | (1 << EV_N_CONNECT),</span><br><span>                   .out_state_mask = (1 << ST_DISC) | (1 << ST_CONN),</span><br><span>               .name = "CONN",</span><br><span>                    .action = fsm_conn_cb,</span><br><span style="color: hsl(120, 100%, 40%);">+                .onenter = fsm_conn_onenter_cb,</span><br><span>                      },</span><br><span> };</span><br><span> </span><br><span>@@ -161,6 +183,9 @@</span><br><span> </span><br><span>  /* Immediately (1ms) kick off reset sending mechanism */</span><br><span>     osmo_fsm_inst_state_chg_ms(reset_fsm, ST_DISC, 1, RESET_RESEND_TIMER_NO);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Count the new MSC link */</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_stat_item_inc(msc->msc_statg->items[MSC_STAT_MSC_LINKS_TOTAL], 1);</span><br><span> }</span><br><span> </span><br><span> /* Confirm that we successfully received a reset acknowledge message */</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_msc.c b/src/osmo-bsc/osmo_bsc_msc.c</span><br><span>index 24c8c6d..1704a73 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_msc.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_msc.c</span><br><span>@@ -43,6 +43,30 @@</span><br><span> #include <netinet/tcp.h></span><br><span> #include <unistd.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static const struct rate_ctr_desc msc_ctr_description[] = {</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 msc_ctrg_desc = {</span><br><span style="color: hsl(120, 100%, 40%);">+      "msc",</span><br><span style="color: hsl(120, 100%, 40%);">+      "mobile switching center",</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_STATS_CLASS_GLOBAL,</span><br><span style="color: hsl(120, 100%, 40%);">+      ARRAY_SIZE(msc_ctr_description),</span><br><span style="color: hsl(120, 100%, 40%);">+      msc_ctr_description,</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 osmo_stat_item_desc msc_stat_desc[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+       { "msc_links:active", "Number of active MSC links", "", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+        { "msc_links:total", "Number of configured MSC links", "", 16, 0 },</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 osmo_stat_item_group_desc msc_statg_desc = {</span><br><span style="color: hsl(120, 100%, 40%);">+     .group_name_prefix = "msc",</span><br><span style="color: hsl(120, 100%, 40%);">+ .group_description = "mobile switching center",</span><br><span style="color: hsl(120, 100%, 40%);">+     .class_id = OSMO_STATS_CLASS_GLOBAL,</span><br><span style="color: hsl(120, 100%, 40%);">+  .num_items = ARRAY_SIZE(msc_stat_desc),</span><br><span style="color: hsl(120, 100%, 40%);">+       .item_desc = msc_stat_desc,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int osmo_bsc_msc_init(struct bsc_msc_data *msc)</span><br><span> {</span><br><span>    struct gsm_network *net = msc->network;</span><br><span>@@ -91,6 +115,19 @@</span><br><span>     if (!msc_data)</span><br><span>               return NULL;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      /* init statistics */</span><br><span style="color: hsl(120, 100%, 40%);">+ msc_data->msc_ctrs = rate_ctr_group_alloc(net, &msc_ctrg_desc, nr);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!msc_data->msc_ctrs) {</span><br><span style="color: hsl(120, 100%, 40%);">+         talloc_free(msc_data);</span><br><span style="color: hsl(120, 100%, 40%);">+                return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     msc_data->msc_statg = osmo_stat_item_group_alloc(net, &msc_statg_desc, nr);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!msc_data->msc_statg) {</span><br><span style="color: hsl(120, 100%, 40%);">+                rate_ctr_group_free(msc_data->msc_ctrs);</span><br><span style="color: hsl(120, 100%, 40%);">+           talloc_free(msc_data);</span><br><span style="color: hsl(120, 100%, 40%);">+                return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  llist_add_tail(&msc_data->entry, &net->bsc_data->mscs);</span><br><span> </span><br><span>         /* Init back pointer */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/18092">change 18092</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/osmo-bsc/+/18092"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ibe4b29056ba704a27b925cfdba49f343ee34f428 </div>
<div style="display:none"> Gerrit-Change-Number: 18092 </div>
<div style="display:none"> Gerrit-PatchSet: 8 </div>
<div style="display:none"> Gerrit-Owner: ipse <Alexander.Chemeris@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: ipse <Alexander.Chemeris@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>