<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/20457">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bts: Add VTY command to manually override Radio Link Timeout<br><br>There are some situations where it is useful to be able to change the<br>Radio Link Timeout at runtime, without restarting the BTS.<br><br>This adds a new (hidden) command for this:<br>     "bts <0-255> radio-link-timeout (oml|infinite|<4-64>)"<br><br>Change-Id: I64674a432cf7751b16d5d0b52f66766fa6e37028<br>---<br>M include/osmo-bts/bts.h<br>M src/common/bts.c<br>M src/common/l1sap.c<br>M src/common/oml.c<br>M src/common/vty.c<br>5 files changed, 65 insertions(+), 9 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/57/20457/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/bts.h b/include/osmo-bts/bts.h</span><br><span>index ffaeb57..ccbcf9a 100644</span><br><span>--- a/include/osmo-bts/bts.h</span><br><span>+++ b/include/osmo-bts/bts.h</span><br><span>@@ -283,7 +283,11 @@</span><br><span>        } fn_stats;</span><br><span>  /* Radio Link Timeout counter. -1 disables timeout for</span><br><span>        * lab/measurement purpose */</span><br><span style="color: hsl(0, 100%, 40%);">-   int radio_link_timeout;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              int oml;                /* value communicated by BSC in OML */</span><br><span style="color: hsl(120, 100%, 40%);">+                int current;            /* actual currently applied value */</span><br><span style="color: hsl(120, 100%, 40%);">+          bool vty_override;      /* OML value overridden by VTY */</span><br><span style="color: hsl(120, 100%, 40%);">+     } radio_link_timeout;</span><br><span> </span><br><span>    int ul_power_target;            /* Uplink Rx power target */</span><br><span> </span><br><span>diff --git a/src/common/bts.c b/src/common/bts.c</span><br><span>index c900428..c121609 100644</span><br><span>--- a/src/common/bts.c</span><br><span>+++ b/src/common/bts.c</span><br><span>@@ -324,7 +324,8 @@</span><br><span>          bts->t200_ms[i] = oml_default_t200_ms[i];</span><br><span> </span><br><span>     /* default RADIO_LINK_TIMEOUT */</span><br><span style="color: hsl(0, 100%, 40%);">-        bts->radio_link_timeout = 32;</span><br><span style="color: hsl(120, 100%, 40%);">+      bts->radio_link_timeout.oml = 32;</span><br><span style="color: hsl(120, 100%, 40%);">+  bts->radio_link_timeout.current = bts->radio_link_timeout.oml;</span><br><span> </span><br><span>     /* Start with the site manager */</span><br><span>    oml_mo_state_init(&bts->site_mgr.mo, NM_OPSTATE_ENABLED, NM_AVSTATE_OK);</span><br><span>diff --git a/src/common/l1sap.c b/src/common/l1sap.c</span><br><span>index ca1949a..c9ec9bf 100644</span><br><span>--- a/src/common/l1sap.c</span><br><span>+++ b/src/common/l1sap.c</span><br><span>@@ -1173,7 +1173,7 @@</span><br><span>         struct gsm_bts *bts = lchan->ts->trx->bts;</span><br><span> </span><br><span>      /* Bypass radio link timeout if set to -1 */</span><br><span style="color: hsl(0, 100%, 40%);">-    if (bts->radio_link_timeout < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        if (bts->radio_link_timeout.current < 0)</span><br><span>               return;</span><br><span> </span><br><span>  /* if link loss criterion already reached */</span><br><span>@@ -1197,11 +1197,11 @@</span><br><span>               return;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (lchan->s < bts->radio_link_timeout) {</span><br><span style="color: hsl(120, 100%, 40%);">+    if (lchan->s < bts->radio_link_timeout.current) {</span><br><span>           /* count up radio link counter S */</span><br><span>          int s = lchan->s + 2;</span><br><span style="color: hsl(0, 100%, 40%);">-                if (s > bts->radio_link_timeout)</span><br><span style="color: hsl(0, 100%, 40%);">-                  s = bts->radio_link_timeout;</span><br><span style="color: hsl(120, 100%, 40%);">+               if (s > bts->radio_link_timeout.current)</span><br><span style="color: hsl(120, 100%, 40%);">+                        s = bts->radio_link_timeout.current;</span><br><span>              LOGPLCHAN(lchan, DMEAS, LOGL_DEBUG,</span><br><span>                    "increasing radio link timeout counter S=%d -> %d\n",</span><br><span>                           lchan->s, s);</span><br><span>@@ -1750,7 +1750,7 @@</span><br><span>           }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   lchan->s = lchan->ts->trx->bts->radio_link_timeout;</span><br><span style="color: hsl(120, 100%, 40%);">+    lchan->s = lchan->ts->trx->bts->radio_link_timeout.current;</span><br><span> </span><br><span>       rc = l1sap_chan_act_dact_modify(trx, chan_nr, PRIM_INFO_ACTIVATE, 0);</span><br><span>        if (rc)</span><br><span>diff --git a/src/common/oml.c b/src/common/oml.c</span><br><span>index 14fc80f..9fca008 100644</span><br><span>--- a/src/common/oml.c</span><br><span>+++ b/src/common/oml.c</span><br><span>@@ -605,12 +605,16 @@</span><br><span>                 case 0xFF: /* Osmocom specific Extension of TS 12.21 */</span><br><span>                      LOGPFOH(DOML, LOGL_NOTICE, foh, "WARNING: Radio Link Timeout "</span><br><span>                             "explicitly disabled, only use this for lab testing!\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                     bts->radio_link_timeout = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+                      bts->radio_link_timeout.oml = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (!bts->radio_link_timeout.vty_override)</span><br><span style="color: hsl(120, 100%, 40%);">+                         bts->radio_link_timeout.current = bts->radio_link_timeout.oml;</span><br><span>                         break;</span><br><span>               case 0x01: /* Based on uplink SACCH (radio link timeout) */</span><br><span>                  if (TLVP_LEN(&tp, NM_ATT_CONN_FAIL_CRIT) >= 2 &&</span><br><span>                          val[1] >= 4 && val[1] <= 64) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                bts->radio_link_timeout = val[1];</span><br><span style="color: hsl(120, 100%, 40%);">+                          bts->radio_link_timeout.oml = val[1];</span><br><span style="color: hsl(120, 100%, 40%);">+                              if (!bts->radio_link_timeout.vty_override)</span><br><span style="color: hsl(120, 100%, 40%);">+                                 bts->radio_link_timeout.current = bts->radio_link_timeout.oml;</span><br><span>                                 break;</span><br><span>                       }</span><br><span>                    /* fall-through */</span><br><span>diff --git a/src/common/vty.c b/src/common/vty.c</span><br><span>index b662320..aaae7c0 100644</span><br><span>--- a/src/common/vty.c</span><br><span>+++ b/src/common/vty.c</span><br><span>@@ -855,6 +855,16 @@</span><br><span>               vty_out(vty, "    (not available)%s", VTY_NEWLINE);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static const char *stringify_radio_link_timeout(int val)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   static char buf[32];</span><br><span style="color: hsl(120, 100%, 40%);">+  if (val == -1)</span><br><span style="color: hsl(120, 100%, 40%);">+                snprintf(buf, sizeof(buf), "%s", "infinite");</span><br><span style="color: hsl(120, 100%, 40%);">+     else</span><br><span style="color: hsl(120, 100%, 40%);">+          snprintf(buf, sizeof(buf), "%d SACCH blocks", val);</span><br><span style="color: hsl(120, 100%, 40%);">+ return buf;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void bts_dump_vty(struct vty *vty, const struct gsm_bts *bts)</span><br><span> {</span><br><span>        const struct gsm_bts_trx *trx;</span><br><span>@@ -902,6 +912,12 @@</span><br><span>                bts->oml_link ? "connected" : "disconnected", VTY_NEWLINE);</span><br><span>   vty_out(vty, "  PH-RTS.ind FN advance average: %d, min: %d, max: %d%s",</span><br><span>            bts_get_avg_fn_advance(bts), bts->fn_stats.min, bts->fn_stats.max, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+        vty_out(vty, "  Radio Link Timeout (OML): %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+            stringify_radio_link_timeout(bts->radio_link_timeout.oml), VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (bts->radio_link_timeout.vty_override) {</span><br><span style="color: hsl(120, 100%, 40%);">+                vty_out(vty, "  Radio Link Timeout (OVERRIDE): %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                       stringify_radio_link_timeout(bts->radio_link_timeout.current), VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span>        llist_for_each_entry(trx, &bts->trx_list, list) {</span><br><span>             const struct phy_instance *pinst = trx_phy_instance(trx);</span><br><span>@@ -963,6 +979,36 @@</span><br><span>     return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_HIDDEN(radio_link_timeout, radio_link_timeout_cmd, "bts <0-255> radio-link-timeout (oml|infinite|<4-64>)",</span><br><span style="color: hsl(120, 100%, 40%);">+          "BTS Specific Commands\n" BTS_NR_STR "Manually override Radio Link Timeout\n"</span><br><span style="color: hsl(120, 100%, 40%);">+             "Use value provided by BSC via A-bis OML (Connection Failure Criterion)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+          "Use infinite timeout (DANGEROUS: only use during testing!)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+              "Number of lost SACCH blocks\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct gsm_network *net = gsmnet_from_vty(vty);</span><br><span style="color: hsl(120, 100%, 40%);">+ int bts_nr = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_bts *bts = gsm_bts_num(net, bts_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!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%);">+   if (!strcmp(argv[1], "oml")) {</span><br><span style="color: hsl(120, 100%, 40%);">+              bts->radio_link_timeout.current = bts->radio_link_timeout.oml;</span><br><span style="color: hsl(120, 100%, 40%);">+          bts->radio_link_timeout.vty_override = false;</span><br><span style="color: hsl(120, 100%, 40%);">+      } else if (!strcmp(argv[1], "infinite")) {</span><br><span style="color: hsl(120, 100%, 40%);">+          bts->radio_link_timeout.current = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+              bts->radio_link_timeout.vty_override = true;</span><br><span style="color: hsl(120, 100%, 40%);">+               vty_out(vty, "%% INFINITE RADIO LINK TIMEOUT, USE ONLY FOR BTS RF TESTING%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              bts->radio_link_timeout.current = atoi(argv[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+           bts->radio_link_timeout.vty_override = true;</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> static void trx_dump_vty(struct vty *vty, const struct gsm_bts_trx *trx)</span><br><span> {</span><br><span>    vty_out(vty, "TRX %u of BTS %u is on ARFCN %u%s",</span><br><span>@@ -1756,6 +1802,7 @@</span><br><span>  install_element(ENABLE_NODE, &bts_t_t_l_loopback_cmd);</span><br><span>   install_element(ENABLE_NODE, &no_bts_t_t_l_loopback_cmd);</span><br><span>        install_element(ENABLE_NODE, &test_send_failure_event_report_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+        install_element(ENABLE_NODE, &radio_link_timeout_cmd);</span><br><span> </span><br><span>       install_element(CONFIG_NODE, &cfg_phy_cmd);</span><br><span>      install_node(&phy_node, config_write_phy);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/20457">change 20457</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-bts/+/20457"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bts </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I64674a432cf7751b16d5d0b52f66766fa6e37028 </div>
<div style="display:none"> Gerrit-Change-Number: 20457 </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>