<p>osmith has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/17571">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">VTY: add show bts failure report<br><br>Save OML failure reports from each BTS in a ring buffer. Add a VTY<br>command to display them conveniently.<br><br>OsmoBSC> show bts 0 fail-rep<br>[2020-03-23 14:51:22] Type=processing failure, Severity=minor failure, Probable cause=Manufacturer specific values: Software warning, Additional text=test message sent from VTY<br>[2020-03-23 14:51:19] Type=processing failure, Severity=minor failure, Probable cause=Manufacturer specific values: Software warning, Additional text=test message sent from VTY<br><br>Related: OS#1605<br>Change-Id: I18aa17a721cd5eb1c98926dc2367229c0a50bc78<br>---<br>M include/osmocom/bsc/gsm_data.h<br>M src/osmo-bsc/bsc_vty.c<br>M src/osmo-bsc/gsm_data.c<br>M src/osmo-bsc/osmo_bsc_main.c<br>4 files changed, 90 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/71/17571/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h</span><br><span>index 5afc2cf..b7b6009 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -1005,6 +1005,16 @@</span><br><span>        uint8_t overflow;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct bts_oml_fail_rep {</span><br><span style="color: hsl(120, 100%, 40%);">+        struct llist_head list;</span><br><span style="color: hsl(120, 100%, 40%);">+       time_t time;</span><br><span style="color: hsl(120, 100%, 40%);">+  char *event_type;</span><br><span style="color: hsl(120, 100%, 40%);">+     char *severity;</span><br><span style="color: hsl(120, 100%, 40%);">+       char *additional_text;</span><br><span style="color: hsl(120, 100%, 40%);">+        enum abis_nm_pcause_type pcause;</span><br><span style="color: hsl(120, 100%, 40%);">+      enum abis_mm_event_causes cause;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* One BTS */</span><br><span> struct gsm_bts {</span><br><span>  /* list header in net->bts_list */</span><br><span>@@ -1267,6 +1277,8 @@</span><br><span>        struct bts_smscb_chan_state cbch_basic;</span><br><span>      struct bts_smscb_chan_state cbch_extended;</span><br><span>   struct osmo_timer_list etws_timer;      /* when to stop ETWS PN */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  struct llist_head oml_fail_rep;</span><br><span> };</span><br><span> </span><br><span> /* One rejected BTS */</span><br><span>diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c</span><br><span>index 39adb21..94aa06c 100644</span><br><span>--- a/src/osmo-bsc/bsc_vty.c</span><br><span>+++ b/src/osmo-bsc/bsc_vty.c</span><br><span>@@ -559,6 +559,43 @@</span><br><span>      return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(show_bts_fail_rep, show_bts_fail_rep_cmd, "show bts <0-255> fail-rep",</span><br><span style="color: hsl(120, 100%, 40%);">+    SHOW_STR "Display information about a BTS\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                "BTS number" "OML failure reports")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_network *net = gsmnet_from_vty(vty);</span><br><span style="color: hsl(120, 100%, 40%);">+       struct llist_head *list;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct bts_oml_fail_rep *entry;</span><br><span style="color: hsl(120, 100%, 40%);">+       int bts_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ bts_nr = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (bts_nr >= net->num_bts) {</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "%% can't find BTS '%s'%s", argv[0], VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+         return CMD_WARNING;</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%);">+   list = &gsm_bts_num(net, bts_nr)->oml_fail_rep;</span><br><span style="color: hsl(120, 100%, 40%);">+        if (llist_empty(list)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "No failure reports received.%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+                return CMD_SUCCESS;</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%);">+   llist_for_each_entry(entry, list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+             char timestamp[20]; /* format like 2020-03-23 14:24:00 */</span><br><span style="color: hsl(120, 100%, 40%);">+             strftime(timestamp, sizeof(timestamp), "%F %T", localtime(&entry->time));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_out(vty, "[%s] Type=%s, Severity=%s, ", timestamp, entry->event_type, entry->severity);</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "Probable cause=%s: ", get_value_string(abis_nm_pcause_type_names, entry->pcause));</span><br><span style="color: hsl(120, 100%, 40%);">+         if (entry->pcause == NM_PCAUSE_T_MANUF)</span><br><span style="color: hsl(120, 100%, 40%);">+                    vty_out(vty, "%s, ", get_value_string(abis_mm_event_cause_names, entry->cause));</span><br><span style="color: hsl(120, 100%, 40%);">+         else</span><br><span style="color: hsl(120, 100%, 40%);">+                  vty_out(vty, "%04X, ", entry->cause);</span><br><span style="color: hsl(120, 100%, 40%);">+            vty_out(vty, "Additional text=%s%s", entry->additional_text, VTY_NEWLINE);</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%);">+   return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> DEFUN(show_rejected_bts, show_rejected_bts_cmd, "show rejected-bts",</span><br><span>   SHOW_STR "Display recently rejected BTS devices\n")</span><br><span> {</span><br><span>@@ -5272,6 +5309,7 @@</span><br><span> </span><br><span>       install_element_ve(&bsc_show_net_cmd);</span><br><span>   install_element_ve(&show_bts_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+        install_element_ve(&show_bts_fail_rep_cmd);</span><br><span>      install_element_ve(&show_rejected_bts_cmd);</span><br><span>      install_element_ve(&show_trx_cmd);</span><br><span>       install_element_ve(&show_trx_con_cmd);</span><br><span>diff --git a/src/osmo-bsc/gsm_data.c b/src/osmo-bsc/gsm_data.c</span><br><span>index f12b032..fe421a4 100644</span><br><span>--- a/src/osmo-bsc/gsm_data.c</span><br><span>+++ b/src/osmo-bsc/gsm_data.c</span><br><span>@@ -881,6 +881,7 @@</span><br><span>    INIT_LLIST_HEAD(&bts->abis_queue);</span><br><span>    INIT_LLIST_HEAD(&bts->loc_list);</span><br><span>      INIT_LLIST_HEAD(&bts->local_neighbors);</span><br><span style="color: hsl(120, 100%, 40%);">+        INIT_LLIST_HEAD(&bts->oml_fail_rep);</span><br><span> </span><br><span>      /* Enable all codecs by default. These get reset to a more fine grained selection IF a</span><br><span>        * 'codec-support' config appears in the config file (see bsc_vty.c). */</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_main.c b/src/osmo-bsc/osmo_bsc_main.c</span><br><span>index bf68c9b..a968c97 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_main.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_main.c</span><br><span>@@ -205,16 +205,55 @@</span><br><span>        return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Callback function for FAIL REPORT on the OML NM: save to ringbuffer, so it can be read from VTY */</span><br><span style="color: hsl(120, 100%, 40%);">+static int oml_msg_fail_rep(struct nm_fail_rep_signal_data *fail_rep)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct llist_head *list;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct bts_oml_fail_rep *entry;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!fail_rep->bts) {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DNM, LOGL_ERROR, "Unknown bts. Can not log failure report.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                return 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%);">+   /* Allocate new list entry */</span><br><span style="color: hsl(120, 100%, 40%);">+ entry = talloc_zero(fail_rep->bts, struct bts_oml_fail_rep);</span><br><span style="color: hsl(120, 100%, 40%);">+       entry->time = time(NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+  entry->event_type = talloc_strdup(entry, fail_rep->parsed.event_type);</span><br><span style="color: hsl(120, 100%, 40%);">+  entry->severity = talloc_strdup(entry, fail_rep->parsed.severity);</span><br><span style="color: hsl(120, 100%, 40%);">+      entry->additional_text = talloc_strdup(entry, fail_rep->parsed.additional_text);</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Split up probable_cause like in log_oml_fail_rep() */</span><br><span style="color: hsl(120, 100%, 40%);">+      entry->pcause = fail_rep->parsed.probable_cause[0];</span><br><span style="color: hsl(120, 100%, 40%);">+     entry->cause = osmo_load16be(fail_rep->parsed.probable_cause + 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Attach to list */</span><br><span style="color: hsl(120, 100%, 40%);">+  list = &fail_rep->bts->oml_fail_rep;</span><br><span style="color: hsl(120, 100%, 40%);">+        llist_add(&entry->list, list);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Clear old entries */</span><br><span style="color: hsl(120, 100%, 40%);">+       if (llist_count(list) > 50) {</span><br><span style="color: hsl(120, 100%, 40%);">+              struct bts_oml_fail_rep *old = llist_last_entry(list, struct bts_oml_fail_rep, list);</span><br><span style="color: hsl(120, 100%, 40%);">+         llist_del(&old->list);</span><br><span style="color: hsl(120, 100%, 40%);">+         talloc_free(old);</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%);">+   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Callback function to be called every time we receive a signal from NM */</span><br><span> static int nm_sig_cb(unsigned int subsys, unsigned int signal,</span><br><span>                   void *handler_data, void *signal_data)</span><br><span> {</span><br><span>     struct nm_nack_signal_data *nack;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct nm_fail_rep_signal_data *fail_rep;</span><br><span> </span><br><span>        switch (signal) {</span><br><span>    case S_NM_NACK:</span><br><span>              nack = signal_data;</span><br><span>          return oml_msg_nack(nack);</span><br><span style="color: hsl(120, 100%, 40%);">+    case S_NM_FAIL_REP:</span><br><span style="color: hsl(120, 100%, 40%);">+           fail_rep = signal_data;</span><br><span style="color: hsl(120, 100%, 40%);">+               return oml_msg_fail_rep(fail_rep);</span><br><span>   default:</span><br><span>             break;</span><br><span>       }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/17571">change 17571</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/+/17571"/><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: I18aa17a721cd5eb1c98926dc2367229c0a50bc78 </div>
<div style="display:none"> Gerrit-Change-Number: 17571 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>