<p>dexter has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/20085">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bsc_vty: improve manual activation of lchans (debug / labtest)<br><br>The VTY already has a method available to activate lchans manually,<br>however, this method does not support proper activation of signalling<br>channels. Also additional commands to activate multiple lchans at once<br>are helpful to make labtesting simpler and more efficient.<br><br>Change-Id: I66b874736c8c456eb82ccc26d5209987d8ed706c<br>Related: SYS#4910<br>---<br>M src/osmo-bsc/bsc_vty.c<br>1 file changed, 215 insertions(+), 41 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/85/20085/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c</span><br><span>index 3524506..f7039f4 100644</span><br><span>--- a/src/osmo-bsc/bsc_vty.c</span><br><span>+++ b/src/osmo-bsc/bsc_vty.c</span><br><span>@@ -5033,15 +5033,118 @@</span><br><span>     return vty_rc;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Activate / Deactivate a single lchan with a specific codec mode */</span><br><span style="color: hsl(120, 100%, 40%);">+static int lchan_act_single(struct vty *vty, struct gsm_lchan *lchan, const char *codec_str, int amr_mode, int activate)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   if (activate) {</span><br><span style="color: hsl(120, 100%, 40%);">+               int lchan_t;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (lchan->fi->state != LCHAN_ST_UNUSED) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      vty_out(vty, "%% Cannot activate: Channel busy!%s", 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%);">+             lchan_t = gsm_lchan_type_by_pchan(lchan->ts->pchan_is);</span><br><span style="color: hsl(120, 100%, 40%);">+         if (lchan_t < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 vty_out(vty, "%% Cannot activate: Invalid lchan type!%s", 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%);">+             /* configure the lchan */</span><br><span style="color: hsl(120, 100%, 40%);">+             lchan->type = lchan_t;</span><br><span style="color: hsl(120, 100%, 40%);">+             if (!strcmp(codec_str, "hr") || !strcmp(codec_str, "fr")) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       lchan->rsl_cmode = RSL_CMOD_SPD_SPEECH;</span><br><span style="color: hsl(120, 100%, 40%);">+                    lchan->tch_mode = GSM48_CMODE_SPEECH_V1;</span><br><span style="color: hsl(120, 100%, 40%);">+           } else if (!strcmp(codec_str, "efr")) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     lchan->rsl_cmode = RSL_CMOD_SPD_SPEECH;</span><br><span style="color: hsl(120, 100%, 40%);">+                    lchan->tch_mode = GSM48_CMODE_SPEECH_EFR;</span><br><span style="color: hsl(120, 100%, 40%);">+          } else if (!strcmp(codec_str, "amr")) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     int vty_rc;</span><br><span style="color: hsl(120, 100%, 40%);">+                   lchan->rsl_cmode = RSL_CMOD_SPD_SPEECH;</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (amr_mode == -1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         vty_out(vty, "%% AMR requires specification of AMR mode%s", 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%);">+                     lchan->tch_mode = GSM48_CMODE_SPEECH_AMR;</span><br><span style="color: hsl(120, 100%, 40%);">+                  vty_rc = lchan_set_single_amr_mode(vty, lchan, amr_mode);</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (vty_rc != CMD_SUCCESS) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          vty_out(vty, "%% Failed to set AMR mode (%i)%s", amr_mode, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+                            return vty_rc;</span><br><span style="color: hsl(120, 100%, 40%);">+                        }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else if (!strcmp(codec_str, "sig")) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     lchan->rsl_cmode = RSL_CMOD_SPD_SIGN;</span><br><span style="color: hsl(120, 100%, 40%);">+                      lchan->tch_mode = GSM48_CMODE_SIGN;</span><br><span style="color: hsl(120, 100%, 40%);">+                } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      vty_out(vty, "%% Invalid channel mode specified!%s", 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%);">+           vty_out(vty, "%% activating lchan %s as %s%s", gsm_lchan_name(lchan), gsm_chan_t_name(lchan->type),</span><br><span style="color: hsl(120, 100%, 40%);">+                      VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+         rsl_tx_chan_activ(lchan, RSL_ACT_TYPE_INITIAL, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          if ((lchan->type == GSM_LCHAN_TCH_F || lchan->type == GSM_LCHAN_TCH_H)</span><br><span style="color: hsl(120, 100%, 40%);">+              && is_ipaccess_bts(lchan->ts->trx->bts))</span><br><span style="color: hsl(120, 100%, 40%);">+                 rsl_tx_ipacc_crcx(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (!lchan->fi) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  vty_out(vty, "%% Cannot release: Channel not initialized%s", 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%);">+             vty_out(vty, "%% Asking for release of %s in state %s%s", gsm_lchan_name(lchan),</span><br><span style="color: hsl(120, 100%, 40%);">+                    osmo_fsm_inst_state_name(lchan->fi), VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+         lchan_release(lchan, !!(lchan->conn), false, 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%);">+   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%);">+/* Activate / Deactivate a single lchan with a specific codec mode */</span><br><span style="color: hsl(120, 100%, 40%);">+static int lchan_act_trx(struct vty *vty, struct gsm_bts_trx *trx, int activate)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  int ts_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_bts_trx_ts *ts;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_lchan *lchan;</span><br><span style="color: hsl(120, 100%, 40%);">+      char *codec_str;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ts = &trx->ts[ts_nr];</span><br><span style="color: hsl(120, 100%, 40%);">+          ts_for_each_lchan(lchan, ts) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        switch (ts->pchan_is) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    case GSM_PCHAN_SDCCH8_SACCH8C:</span><br><span style="color: hsl(120, 100%, 40%);">+                        case GSM_PCHAN_CCCH_SDCCH4_CBCH:</span><br><span style="color: hsl(120, 100%, 40%);">+                      case GSM_PCHAN_SDCCH8_SACCH8C_CBCH:</span><br><span style="color: hsl(120, 100%, 40%);">+                   case GSM_PCHAN_CCCH:</span><br><span style="color: hsl(120, 100%, 40%);">+                  case GSM_PCHAN_CCCH_SDCCH4:</span><br><span style="color: hsl(120, 100%, 40%);">+                           codec_str = "sig";</span><br><span style="color: hsl(120, 100%, 40%);">+                          break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        case GSM_PCHAN_TCH_F:</span><br><span style="color: hsl(120, 100%, 40%);">+                 case GSM_PCHAN_TCH_F_PDCH:</span><br><span style="color: hsl(120, 100%, 40%);">+                    case GSM_PCHAN_TCH_F_TCH_H_PDCH:</span><br><span style="color: hsl(120, 100%, 40%);">+                              codec_str = "fr";</span><br><span style="color: hsl(120, 100%, 40%);">+                           break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        case GSM_PCHAN_TCH_H:</span><br><span style="color: hsl(120, 100%, 40%);">+                         codec_str = "hr";</span><br><span style="color: hsl(120, 100%, 40%);">+                           break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        default:</span><br><span style="color: hsl(120, 100%, 40%);">+                              codec_str = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+                             vty_out(vty, "%% omitting lchan %s%s", gsm_lchan_name(lchan), 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%);">+                   if (codec_str)</span><br><span style="color: hsl(120, 100%, 40%);">+                                lchan_act_single(vty, lchan, codec_str, -1, activate);</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%);">+</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> /* Debug/Measurement command to activate a given logical channel</span><br><span>  * manually in a given mode/codec.  This is useful for receiver</span><br><span>  * performance testing (FER/RBER/...) */</span><br><span> DEFUN(lchan_act, lchan_act_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-  "bts <0-255> trx <0-255> timeslot <0-7> sub-slot <0-7> (activate|deactivate) (hr|fr|efr|amr) [<0-7>]",</span><br><span style="color: hsl(120, 100%, 40%);">+        "bts <0-255> trx <0-255> timeslot <0-7> sub-slot <0-7> (activate|deactivate) (hr|fr|efr|amr|sig) [<0-7>]",</span><br><span>   BTS_NR_TRX_TS_SS_STR2</span><br><span>        "Manual Channel Activation (e.g. for BER test)\n"</span><br><span>  "Manual Channel Deactivation (e.g. for BER test)\n"</span><br><span style="color: hsl(0, 100%, 40%);">-   "Half-Rate v1\n" "Full-Rate\n" "Enhanced Full Rate\n" "Adaptive Multi-Rate\n" "AMR Mode\n")</span><br><span style="color: hsl(120, 100%, 40%);">+ "Half-Rate v1\n" "Full-Rate\n" "Enhanced Full Rate\n" "Adaptive Multi-Rate\n" "Signalling\n" "AMR Mode\n")</span><br><span> {</span><br><span>  struct gsm_bts_trx_ts *ts;</span><br><span>   struct gsm_lchan *lchan;</span><br><span>@@ -5049,6 +5152,10 @@</span><br><span>    const char *act_str = argv[4];</span><br><span>       const char *codec_str = argv[5];</span><br><span>     int activate;</span><br><span style="color: hsl(120, 100%, 40%);">+ int amr_mode = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (argc > 6)</span><br><span style="color: hsl(120, 100%, 40%);">+              amr_mode = atoi(argv[6]);</span><br><span> </span><br><span>        ts = vty_get_ts(vty, argv[0], argv[1], argv[2]);</span><br><span>     if (!ts)</span><br><span>@@ -5069,51 +5176,115 @@</span><br><span>          return CMD_WARNING;</span><br><span>  }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (activate) {</span><br><span style="color: hsl(0, 100%, 40%);">-         int lchan_t;</span><br><span style="color: hsl(0, 100%, 40%);">-            if (lchan->fi->state != LCHAN_ST_UNUSED) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        vty_out(vty, "%% Cannot activate: Channel busy!%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-                     return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+   return lchan_act_single(vty, lchan, codec_str, amr_mode, activate);</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%);">+#define ACTIVATE_ALL_LCHANS_STR "Manual Channel Activation of all logical channels (e.g. for BER test)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+#define DEACTIVATE_ALL_LCHANS_STR "Manual Channel Deactivation of all logical channels (e.g. for BER test)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Similar to lchan_act, but activates all lchans on the network at once,</span><br><span style="color: hsl(120, 100%, 40%);">+ * this is intended to perform lab tests / measurements. */</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_HIDDEN(lchan_act_bts, lchan_act_all_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+           "(activate-all-lchan|deactivate-all-lchan)",</span><br><span style="color: hsl(120, 100%, 40%);">+        ACTIVATE_ALL_LCHANS_STR</span><br><span style="color: hsl(120, 100%, 40%);">+       DEACTIVATE_ALL_LCHANS_STR)</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%);">+       const char *act_str = argv[0];</span><br><span style="color: hsl(120, 100%, 40%);">+        int activate;</span><br><span style="color: hsl(120, 100%, 40%);">+ int bts_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+  int trx_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_bts_trx *trx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!strcmp(act_str, "activate-all-lchan"))</span><br><span style="color: hsl(120, 100%, 40%);">+         activate = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+          activate = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       for (bts_nr = 0; bts_nr < net->num_bts; bts_nr++) {</span><br><span style="color: hsl(120, 100%, 40%);">+             bts = gsm_bts_num(gsmnet_from_vty(vty), bts_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+              for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     trx = gsm_bts_trx_num(bts, trx_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+                   lchan_act_trx(vty, trx, activate);</span><br><span>           }</span><br><span style="color: hsl(0, 100%, 40%);">-               lchan_t = gsm_lchan_type_by_pchan(ts->pchan_is);</span><br><span style="color: hsl(0, 100%, 40%);">-             if (lchan_t < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                     return CMD_WARNING;</span><br><span style="color: hsl(0, 100%, 40%);">-             /* configure the lchan */</span><br><span style="color: hsl(0, 100%, 40%);">-               lchan->type = lchan_t;</span><br><span style="color: hsl(0, 100%, 40%);">-               lchan->rsl_cmode = RSL_CMOD_SPD_SPEECH;</span><br><span style="color: hsl(0, 100%, 40%);">-              if (!strcmp(codec_str, "hr") || !strcmp(codec_str, "fr"))</span><br><span style="color: hsl(0, 100%, 40%);">-                   lchan->tch_mode = GSM48_CMODE_SPEECH_V1;</span><br><span style="color: hsl(0, 100%, 40%);">-             else if (!strcmp(codec_str, "efr"))</span><br><span style="color: hsl(0, 100%, 40%);">-                   lchan->tch_mode = GSM48_CMODE_SPEECH_EFR;</span><br><span style="color: hsl(0, 100%, 40%);">-            else if (!strcmp(codec_str, "amr")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 int amr_mode, vty_rc;</span><br><span style="color: hsl(0, 100%, 40%);">-                   if (argc < 7) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              vty_out(vty, "%% AMR requires specification of AMR mode%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-                             return CMD_WARNING;</span><br><span style="color: hsl(0, 100%, 40%);">-                     }</span><br><span style="color: hsl(0, 100%, 40%);">-                       amr_mode = atoi(argv[6]);</span><br><span style="color: hsl(0, 100%, 40%);">-                       lchan->tch_mode = GSM48_CMODE_SPEECH_AMR;</span><br><span style="color: hsl(0, 100%, 40%);">-                    vty_rc = lchan_set_single_amr_mode(vty, lchan, amr_mode);</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (vty_rc != CMD_SUCCESS)</span><br><span style="color: hsl(0, 100%, 40%);">-                              return vty_rc;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-               vty_out(vty, "%% activating lchan %s%s", gsm_lchan_name(lchan), VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-         rsl_tx_chan_activ(lchan, RSL_ACT_TYPE_INITIAL, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-              if (is_ipaccess_bts(lchan->ts->trx->bts))</span><br><span style="color: hsl(0, 100%, 40%);">-                      rsl_tx_ipacc_crcx(lchan);</span><br><span style="color: hsl(0, 100%, 40%);">-       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                if (!lchan->fi) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    vty_out(vty, "%% Cannot release: Channel not initialized%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-                    return CMD_WARNING;</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-               vty_out(vty, "%% Asking for release of %s in state %s%s", gsm_lchan_name(lchan),</span><br><span style="color: hsl(0, 100%, 40%);">-                      osmo_fsm_inst_state_name(lchan->fi), VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-           lchan_release(lchan, !!(lchan->conn), false, 0);</span><br><span>  }</span><br><span> </span><br><span>        return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Similar to lchan_act, but activates all lchans on the specified BTS at once,</span><br><span style="color: hsl(120, 100%, 40%);">+ * this is intended to perform lab tests / measurements. */</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_HIDDEN(lchan_act_all_bts, lchan_act_all_bts_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+         "bts <0-255> (activate-all-lchan|deactivate-all-lchan)",</span><br><span style="color: hsl(120, 100%, 40%);">+      "BTS Specific Commands\n" BTS_NR_STR</span><br><span style="color: hsl(120, 100%, 40%);">+        ACTIVATE_ALL_LCHANS_STR</span><br><span style="color: hsl(120, 100%, 40%);">+       DEACTIVATE_ALL_LCHANS_STR)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    int bts_nr = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+   const char *act_str = argv[1];</span><br><span style="color: hsl(120, 100%, 40%);">+        int activate;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+  int trx_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_bts_trx *trx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!strcmp(act_str, "activate-all-lchan"))</span><br><span style="color: hsl(120, 100%, 40%);">+         activate = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+          activate = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       bts = gsm_bts_num(gsmnet_from_vty(vty), bts_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!bts) {</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "%% No such BTS (%d)%s", bts_nr, 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%);">+   for (trx_nr = 0; trx_nr < bts->num_trx; trx_nr++) {</span><br><span style="color: hsl(120, 100%, 40%);">+             trx = gsm_bts_trx_num(bts, trx_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+           lchan_act_trx(vty, trx, activate);</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 style="color: hsl(120, 100%, 40%);">+/* Similar to lchan_act, but activates all lchans on the specified BTS at once,</span><br><span style="color: hsl(120, 100%, 40%);">+ * this is intended to perform lab tests / measurements. */</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_HIDDEN(lchan_act_all_trx, lchan_act_all_trx_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+             "bts <0-255> trx <0-255> (activate-all-lchan|deactivate-all-lchan)",</span><br><span style="color: hsl(120, 100%, 40%);">+            "BTS for manual command\n" BTS_NR_STR</span><br><span style="color: hsl(120, 100%, 40%);">+       "TRX for manual command\n" TRX_NR_STR</span><br><span style="color: hsl(120, 100%, 40%);">+       ACTIVATE_ALL_LCHANS_STR</span><br><span style="color: hsl(120, 100%, 40%);">+       DEACTIVATE_ALL_LCHANS_STR)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    int bts_nr = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+   int trx_nr = atoi(argv[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+   const char *act_str = argv[2];</span><br><span style="color: hsl(120, 100%, 40%);">+        int activate;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_bts_trx *trx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!strcmp(act_str, "activate-all-lchan"))</span><br><span style="color: hsl(120, 100%, 40%);">+         activate = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+          activate = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       bts = gsm_bts_num(gsmnet_from_vty(vty), bts_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!bts) {</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "%% No such BTS (%d)%s", bts_nr, 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%);">+   trx = gsm_bts_trx_num(bts, trx_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!bts) {</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "%% No such TRX (%d)%s", trx_nr, 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%);">+   lchan_act_trx(vty, trx, activate);</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> /* Debug command to send lchans from state LCHAN_ST_UNUSED to state</span><br><span>  * LCHAN_ST_BORKEN and vice versa. */</span><br><span> DEFUN_HIDDEN(lchan_set_borken, lchan_set_borken_cmd,</span><br><span>@@ -6592,6 +6763,9 @@</span><br><span>     install_element(ENABLE_NODE, &bts_resend_cmd);</span><br><span>   install_element(ENABLE_NODE, &pdch_act_cmd);</span><br><span>     install_element(ENABLE_NODE, &lchan_act_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+     install_element(ENABLE_NODE, &lchan_act_all_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ install_element(ENABLE_NODE, &lchan_act_all_bts_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+     install_element(ENABLE_NODE, &lchan_act_all_trx_cmd);</span><br><span>    install_element(ENABLE_NODE, &lchan_mdcx_cmd);</span><br><span>   install_element(ENABLE_NODE, &lchan_set_borken_cmd);</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/20085">change 20085</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/+/20085"/><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: I66b874736c8c456eb82ccc26d5209987d8ed706c </div>
<div style="display:none"> Gerrit-Change-Number: 20085 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>