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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Split bts_vty.c creating bts_trx_vty.c<br><br>Change-Id: I15ec8f71a5d31915162cb3ad75ea77e934fa4887<br>---<br>M include/osmocom/bsc/vty.h<br>M src/osmo-bsc/Makefile.am<br>A src/osmo-bsc/bts_trx_vty.c<br>M src/osmo-bsc/bts_vty.c<br>M tests/handover/Makefile.am<br>5 files changed, 863 insertions(+), 799 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/vty.h b/include/osmocom/bsc/vty.h</span><br><span>index 0b4504c..9ea9835 100644</span><br><span>--- a/include/osmocom/bsc/vty.h</span><br><span>+++ b/include/osmocom/bsc/vty.h</span><br><span>@@ -13,6 +13,8 @@</span><br><span> struct pchan_load;</span><br><span> struct gsm_lchan;</span><br><span> struct bsc_subscr;</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_e1_subslot;</span><br><span style="color: hsl(120, 100%, 40%);">+struct e1inp_sign_link;</span><br><span> struct vty;</span><br><span> </span><br><span> void openbsc_vty_print_statistics(struct vty *vty, struct gsm_network *);</span><br><span>@@ -53,6 +55,15 @@</span><br><span> void lchan_dump_full_vty(struct vty *vty, struct gsm_lchan *lchan);</span><br><span> void lchan_dump_short_vty(struct vty *vty, struct gsm_lchan *lchan);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int bts_trx_vty_init(void);</span><br><span style="color: hsl(120, 100%, 40%);">+void config_write_trx_single(struct vty *vty, struct gsm_bts_trx *trx);</span><br><span style="color: hsl(120, 100%, 40%);">+void config_write_e1_link(struct vty *vty, struct gsm_e1_subslot *e1_link,</span><br><span style="color: hsl(120, 100%, 40%);">+                             const char *prefix);</span><br><span style="color: hsl(120, 100%, 40%);">+void e1isl_dump_vty_tcp(struct vty *vty, const struct e1inp_sign_link *e1l);</span><br><span style="color: hsl(120, 100%, 40%);">+void e1isl_dump_vty(struct vty *vty, struct e1inp_sign_link *e1l);</span><br><span style="color: hsl(120, 100%, 40%);">+void parse_e1_link(struct gsm_e1_subslot *e1_link, const char *line,</span><br><span style="color: hsl(120, 100%, 40%);">+                   const char *ts, const char *ss);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> enum bsc_vty_cmd_attr {</span><br><span>      BSC_VTY_ATTR_RESTART_ABIS_OML_LINK = 0,</span><br><span>      BSC_VTY_ATTR_RESTART_ABIS_RSL_LINK,</span><br><span>diff --git a/src/osmo-bsc/Makefile.am b/src/osmo-bsc/Makefile.am</span><br><span>index 3e2761d..34b4f34 100644</span><br><span>--- a/src/osmo-bsc/Makefile.am</span><br><span>+++ b/src/osmo-bsc/Makefile.am</span><br><span>@@ -56,6 +56,7 @@</span><br><span>         bts_osmobts.c \</span><br><span>      bts_unknown.c \</span><br><span>      bts_vty.c \</span><br><span style="color: hsl(120, 100%, 40%);">+   bts_trx_vty.c \</span><br><span>      chan_alloc.c \</span><br><span>       codec_pref.c \</span><br><span>       e1_config.c \</span><br><span>diff --git a/src/osmo-bsc/bts_trx_vty.c b/src/osmo-bsc/bts_trx_vty.c</span><br><span>new file mode 100644</span><br><span>index 0000000..39584a5</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo-bsc/bts_trx_vty.c</span><br><span>@@ -0,0 +1,849 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* OsmoBSC interface to quagga VTY, TRX (and TS) node */</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2009-2017 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2021 by sysmocom s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.</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%);">+#include <stdlib.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdbool.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <unistd.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <time.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/linuxlist.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/command.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/buffer.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/vty.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/stats.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/telnet_interface.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/misc.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/vty.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/gsm_data.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/abis/e1_input.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/system_information.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/debug.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/timeslot_fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/lchan_fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/lchan_select.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/bts.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <inttypes.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "../../bscconfig.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define X(x) (1 << x)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct cmd_node trx_node = {</span><br><span style="color: hsl(120, 100%, 40%);">+       TRX_NODE,</span><br><span style="color: hsl(120, 100%, 40%);">+     "%s(config-net-bts-trx)# ",</span><br><span style="color: hsl(120, 100%, 40%);">+ 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%);">+static struct cmd_node ts_node = {</span><br><span style="color: hsl(120, 100%, 40%);">+  TS_NODE,</span><br><span style="color: hsl(120, 100%, 40%);">+      "%s(config-net-bts-trx-ts)# ",</span><br><span style="color: hsl(120, 100%, 40%);">+      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%);">+/* utility functions */</span><br><span style="color: hsl(120, 100%, 40%);">+void parse_e1_link(struct gsm_e1_subslot *e1_link, const char *line,</span><br><span style="color: hsl(120, 100%, 40%);">+                         const char *ts, const char *ss)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  e1_link->e1_nr = atoi(line);</span><br><span style="color: hsl(120, 100%, 40%);">+       e1_link->e1_ts = atoi(ts);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!strcmp(ss, "full"))</span><br><span style="color: hsl(120, 100%, 40%);">+            e1_link->e1_ts_ss = 255;</span><br><span style="color: hsl(120, 100%, 40%);">+   else</span><br><span style="color: hsl(120, 100%, 40%);">+          e1_link->e1_ts_ss = atoi(ss);</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 TRX_TEXT "Radio Transceiver\n"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* per TRX configuration */</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_ATTR(cfg_trx,</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg_trx_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+          "trx <0-255>",</span><br><span style="color: hsl(120, 100%, 40%);">+        TRX_TEXT</span><br><span style="color: hsl(120, 100%, 40%);">+      "Select a TRX to configure\n",</span><br><span style="color: hsl(120, 100%, 40%);">+      CMD_ATTR_IMMEDIATE)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     int trx_nr = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_bts *bts = vty->index;</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 (trx_nr > bts->num_trx) {</span><br><span style="color: hsl(120, 100%, 40%);">+            vty_out(vty, "%% The next unused TRX number in this BTS is %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                   bts->num_trx, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+                return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+   } else if (trx_nr == bts->num_trx) {</span><br><span style="color: hsl(120, 100%, 40%);">+               /* we need to allocate a new one */</span><br><span style="color: hsl(120, 100%, 40%);">+           trx = gsm_bts_trx_alloc(bts);</span><br><span style="color: hsl(120, 100%, 40%);">+ } else</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!trx)</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->index = trx;</span><br><span style="color: hsl(120, 100%, 40%);">+  vty->node = TRX_NODE;</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%);">+DEFUN_USRATTR(cfg_trx_arfcn,</span><br><span style="color: hsl(120, 100%, 40%);">+              cfg_trx_arfcn_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+            X(BSC_VTY_ATTR_RESTART_ABIS_OML_LINK),</span><br><span style="color: hsl(120, 100%, 40%);">+        "arfcn <0-1023>",</span><br><span style="color: hsl(120, 100%, 40%);">+             "Set the ARFCN for this TRX\n"</span><br><span style="color: hsl(120, 100%, 40%);">+              "Absolute Radio Frequency Channel Number\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       enum gsm_band unused;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts_trx *trx = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+      int arfcn = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (gsm_arfcn2band_rc(arfcn, &unused) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "%% Invalid arfcn %" PRIu16 " detected%s", arfcn, 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%);">+   /* FIXME: check if this ARFCN is supported by this TRX */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   trx->arfcn = arfcn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Update Cell Allocation (list of all the frequencies allocated to a cell) */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (generate_cell_chan_alloc(trx->bts) != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+             vty_out(vty, "%% Failed to re-generate Cell Allocation%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%);">+   /* FIXME: patch ARFCN into SYSTEM INFORMATION */</span><br><span style="color: hsl(120, 100%, 40%);">+      /* FIXME: use OML layer to update the ARFCN */</span><br><span style="color: hsl(120, 100%, 40%);">+        /* FIXME: use RSL layer to update SYSTEM INFORMATION */</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%);">+DEFUN_USRATTR(cfg_trx_nominal_power,</span><br><span style="color: hsl(120, 100%, 40%);">+              cfg_trx_nominal_power_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+            X(BSC_VTY_ATTR_RESTART_ABIS_OML_LINK),</span><br><span style="color: hsl(120, 100%, 40%);">+        "nominal power <-20-100>",</span><br><span style="color: hsl(120, 100%, 40%);">+            "Nominal TRX RF Power in dBm\n"</span><br><span style="color: hsl(120, 100%, 40%);">+             "Nominal TRX RF Power in dBm\n"</span><br><span style="color: hsl(120, 100%, 40%);">+             "Nominal TRX RF Power in dBm\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_bts_trx *trx = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    trx->nominal_power = atoi(argv[0]);</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%);">+DEFUN_USRATTR(cfg_trx_max_power_red,</span><br><span style="color: hsl(120, 100%, 40%);">+              cfg_trx_max_power_red_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+            X(BSC_VTY_ATTR_RESTART_ABIS_OML_LINK),</span><br><span style="color: hsl(120, 100%, 40%);">+        "max_power_red <0-100>",</span><br><span style="color: hsl(120, 100%, 40%);">+              "Reduction of maximum BS RF Power (relative to nominal power)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+            "Reduction of maximum BS RF Power in dB\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        int maxpwr_r = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts_trx *trx = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+      int upper_limit = 24;   /* default 12.21 max power red. */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* FIXME: check if our BTS type supports more than 12 */</span><br><span style="color: hsl(120, 100%, 40%);">+      if (maxpwr_r < 0 || maxpwr_r > upper_limit) {</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "%% Power %d dB is not in the valid range%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                  maxpwr_r, 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%);">+     if (maxpwr_r & 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+               vty_out(vty, "%% Power %d dB is not an even value%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                       maxpwr_r, 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->max_power_red = maxpwr_r;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* FIXME: make sure we update this using OML */</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%);">+/* NOTE: This requires a full restart as bsc_network_configure() is executed</span><br><span style="color: hsl(120, 100%, 40%);">+ * only once on startup from osmo_bsc_main.c */</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_trx_rsl_e1,</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg_trx_rsl_e1_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "rsl e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",</span><br><span style="color: hsl(120, 100%, 40%);">+      "RSL Parameters\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "E1/T1 interface to be used for RSL\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "E1/T1 interface to be used for RSL\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "E1/T1 Line Number to be used for RSL\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "E1/T1 Timeslot to be used for RSL\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "E1/T1 Timeslot to be used for RSL\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "E1/T1 Sub-slot to be used for RSL\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "E1/T1 Sub-slot 0 is to be used for RSL\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "E1/T1 Sub-slot 1 is to be used for RSL\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "E1/T1 Sub-slot 2 is to be used for RSL\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "E1/T1 Sub-slot 3 is to be used for RSL\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "E1/T1 full timeslot is to be used for RSL\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts_trx *trx = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    parse_e1_link(&trx->rsl_e1_link, argv[0], argv[1], argv[2]);</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%);">+DEFUN_USRATTR(cfg_trx_rsl_e1_tei,</span><br><span style="color: hsl(120, 100%, 40%);">+         cfg_trx_rsl_e1_tei_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+       X(BSC_VTY_ATTR_RESTART_ABIS_RSL_LINK),</span><br><span style="color: hsl(120, 100%, 40%);">+        "rsl e1 tei <0-63>",</span><br><span style="color: hsl(120, 100%, 40%);">+          "RSL Parameters\n"</span><br><span style="color: hsl(120, 100%, 40%);">+          "Set the TEI to be used for RSL\n"</span><br><span style="color: hsl(120, 100%, 40%);">+          "Set the TEI to be used for RSL\n"</span><br><span style="color: hsl(120, 100%, 40%);">+          "TEI to be used for RSL\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gsm_bts_trx *trx = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    trx->rsl_tei_primary = atoi(argv[0]);</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%);">+DEFUN_ATTR(cfg_trx_rf_locked,</span><br><span style="color: hsl(120, 100%, 40%);">+          cfg_trx_rf_locked_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+        "rf_locked (0|1)",</span><br><span style="color: hsl(120, 100%, 40%);">+          "Set or unset the RF Locking (Turn off RF of the TRX)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+    "TRX is NOT RF locked (active)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+           "TRX is RF locked (turned off)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+          CMD_ATTR_IMMEDIATE)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     int locked = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_bts_trx *trx = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    gsm_trx_lock_rf(trx, locked, "vty");</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%);">+/* per TS configuration */</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_ATTR(cfg_ts,</span><br><span style="color: hsl(120, 100%, 40%);">+         cfg_ts_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+           "timeslot <0-7>",</span><br><span style="color: hsl(120, 100%, 40%);">+     "Select a Timeslot to configure\n"</span><br><span style="color: hsl(120, 100%, 40%);">+          "Timeslot number\n",</span><br><span style="color: hsl(120, 100%, 40%);">+        CMD_ATTR_IMMEDIATE)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     int ts_nr = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_bts_trx *trx = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm_bts_trx_ts *ts;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (ts_nr >= TRX_NR_TS) {</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_out(vty, "%% A GSM TRX only has %u Timeslots per TRX%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                        TRX_NR_TS, 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%);">+   ts = &trx->ts[ts_nr];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        vty->index = ts;</span><br><span style="color: hsl(120, 100%, 40%);">+   vty->node = TS_NODE;</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%);">+DEFUN_USRATTR(cfg_ts_pchan,</span><br><span style="color: hsl(120, 100%, 40%);">+       cfg_ts_pchan_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+             X(BSC_VTY_ATTR_RESTART_ABIS_OML_LINK),</span><br><span style="color: hsl(120, 100%, 40%);">+        "phys_chan_config PCHAN", /* dynamically generated! */</span><br><span style="color: hsl(120, 100%, 40%);">+              "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts_trx_ts *ts = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+    int pchanc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ pchanc = gsm_pchan_parse(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (pchanc < 0)</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%);">+ ts->pchan_from_config = pchanc;</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%);">+/* used for backwards compatibility with old config files that still</span><br><span style="color: hsl(120, 100%, 40%);">+ * have uppercase pchan type names. Also match older names for existing types.  */</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_HIDDEN(cfg_ts_pchan_compat,</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg_ts_pchan_compat_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "phys_chan_config PCHAN",</span><br><span style="color: hsl(120, 100%, 40%);">+      "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_bts_trx_ts *ts = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+    int pchanc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ pchanc = gsm_pchan_parse(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (pchanc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (strcasecmp(argv[0], "tch/f_tch/h_pdch") == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 pchanc = GSM_PCHAN_OSMO_DYN;</span><br><span style="color: hsl(120, 100%, 40%);">+          } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      vty_out(vty, "Unknown physical channel name '%s'%s", argv[0], VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+                 return CMD_ERR_NO_MATCH;</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%);">+   ts->pchan_from_config = pchanc;</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%);">+DEFUN_USRATTR(cfg_ts_tsc,</span><br><span style="color: hsl(120, 100%, 40%);">+         cfg_ts_tsc_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+       X(BSC_VTY_ATTR_RESTART_ABIS_OML_LINK),</span><br><span style="color: hsl(120, 100%, 40%);">+        "training_sequence_code <0-7>",</span><br><span style="color: hsl(120, 100%, 40%);">+       "Training Sequence Code of the Timeslot\n" "TSC\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm_bts_trx_ts *ts = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!osmo_bts_has_feature(&ts->trx->bts->model->features, BTS_FEAT_MULTI_TSC)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "%% This BTS does not support a TSC != BCC, "</span><br><span style="color: hsl(120, 100%, 40%);">+                  "falling back to BCC%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+              ts->tsc = -1;</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%);">+   ts->tsc = atoi(argv[0]);</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%);">+#define HOPPING_STR "Configure frequency hopping\n"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_USRATTR(cfg_ts_hopping,</span><br><span style="color: hsl(120, 100%, 40%);">+            cfg_ts_hopping_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+           X(BSC_VTY_ATTR_RESTART_ABIS_OML_LINK),</span><br><span style="color: hsl(120, 100%, 40%);">+        "hopping enabled (0|1)",</span><br><span style="color: hsl(120, 100%, 40%);">+            HOPPING_STR "Enable or disable frequency hopping\n"</span><br><span style="color: hsl(120, 100%, 40%);">+         "Disable frequency hopping\n" "Enable frequency hopping\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm_bts_trx_ts *ts = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+    int enabled = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (enabled && !osmo_bts_has_feature(&ts->trx->bts->model->features, BTS_FEAT_HOPPING)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             vty_out(vty, "%% BTS model does not seem to support freq. hopping%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+         /* Allow enabling frequency hopping anyway, because the BTS might not have</span><br><span style="color: hsl(120, 100%, 40%);">+             * connected yet (thus not sent the feature vector), so we cannot know for</span><br><span style="color: hsl(120, 100%, 40%);">+             * sure.  Jet print a warning and let it go. */</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%);">+   ts->hopping.enabled = enabled;</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%);">+DEFUN_USRATTR(cfg_ts_hsn,</span><br><span style="color: hsl(120, 100%, 40%);">+         cfg_ts_hsn_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+       X(BSC_VTY_ATTR_RESTART_ABIS_OML_LINK),</span><br><span style="color: hsl(120, 100%, 40%);">+        "hopping sequence-number <0-63>",</span><br><span style="color: hsl(120, 100%, 40%);">+             HOPPING_STR</span><br><span style="color: hsl(120, 100%, 40%);">+           "Which hopping sequence to use for this channel\n"</span><br><span style="color: hsl(120, 100%, 40%);">+          "Hopping Sequence Number (HSN)\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts_trx_ts *ts = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  ts->hopping.hsn = atoi(argv[0]);</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%);">+DEFUN_USRATTR(cfg_ts_maio,</span><br><span style="color: hsl(120, 100%, 40%);">+        cfg_ts_maio_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+              X(BSC_VTY_ATTR_RESTART_ABIS_OML_LINK),</span><br><span style="color: hsl(120, 100%, 40%);">+        "hopping maio <0-63>",</span><br><span style="color: hsl(120, 100%, 40%);">+        HOPPING_STR</span><br><span style="color: hsl(120, 100%, 40%);">+           "Which hopping MAIO to use for this channel\n"</span><br><span style="color: hsl(120, 100%, 40%);">+              "Mobile Allocation Index Offset (MAIO)\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts_trx_ts *ts = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  ts->hopping.maio = atoi(argv[0]);</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%);">+DEFUN_USRATTR(cfg_ts_arfcn_add,</span><br><span style="color: hsl(120, 100%, 40%);">+           cfg_ts_arfcn_add_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+         X(BSC_VTY_ATTR_RESTART_ABIS_OML_LINK),</span><br><span style="color: hsl(120, 100%, 40%);">+        "hopping arfcn add <0-1023>",</span><br><span style="color: hsl(120, 100%, 40%);">+         HOPPING_STR "Configure hopping ARFCN list\n"</span><br><span style="color: hsl(120, 100%, 40%);">+        "Add an entry to the hopping ARFCN list\n" "ARFCN\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    enum gsm_band unused;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts_trx_ts *ts = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+    int arfcn = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (gsm_arfcn2band_rc(arfcn, &unused) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "%% Invalid arfcn %" PRIu16 " detected%s", arfcn, 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 (bitvec_get_bit_pos(&ts->hopping.arfcns, arfcn) == ONE) {</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "%% ARFCN %" PRIu16 " is already set%s", arfcn, 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%);">+   bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Update Cell Allocation (list of all the frequencies allocated to a cell) */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (generate_cell_chan_alloc(ts->trx->bts) != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "%% Failed to re-generate Cell Allocation%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+            bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, ZERO); /* roll-back */</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%);">+   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%);">+DEFUN_USRATTR(cfg_ts_arfcn_del,</span><br><span style="color: hsl(120, 100%, 40%);">+           cfg_ts_arfcn_del_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+         X(BSC_VTY_ATTR_RESTART_ABIS_OML_LINK),</span><br><span style="color: hsl(120, 100%, 40%);">+        "hopping arfcn del <0-1023>",</span><br><span style="color: hsl(120, 100%, 40%);">+         HOPPING_STR "Configure hopping ARFCN list\n"</span><br><span style="color: hsl(120, 100%, 40%);">+        "Delete an entry to the hopping ARFCN list\n" "ARFCN\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ enum gsm_band unused;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts_trx_ts *ts = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+    int arfcn = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (gsm_arfcn2band_rc(arfcn, &unused) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "%% Invalid arfcn %" PRIu16 " detected%s", arfcn, 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 (bitvec_get_bit_pos(&ts->hopping.arfcns, arfcn) != ONE) {</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "%% ARFCN %" PRIu16 " is not set%s", arfcn, 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%);">+   bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Update Cell Allocation (list of all the frequencies allocated to a cell) */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (generate_cell_chan_alloc(ts->trx->bts) != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "%% Failed to re-generate Cell Allocation%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+            /* It's unlikely to happen on removal, so we don't roll-back */</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%);">+   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%);">+DEFUN_USRATTR(cfg_ts_arfcn_del_all,</span><br><span style="color: hsl(120, 100%, 40%);">+       cfg_ts_arfcn_del_all_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+             X(BSC_VTY_ATTR_RESTART_ABIS_OML_LINK),</span><br><span style="color: hsl(120, 100%, 40%);">+        "hopping arfcn del-all",</span><br><span style="color: hsl(120, 100%, 40%);">+            HOPPING_STR "Configure hopping ARFCN list\n"</span><br><span style="color: hsl(120, 100%, 40%);">+        "Delete all previously configured entries\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm_bts_trx_ts *ts = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  bitvec_zero(&ts->hopping.arfcns);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Update Cell Allocation (list of all the frequencies allocated to a cell) */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (generate_cell_chan_alloc(ts->trx->bts) != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "%% Failed to re-generate Cell Allocation%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+            /* It's unlikely to happen on removal, so we don't roll-back */</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%);">+   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%);">+/* NOTE: This will have an effect on newly created voice lchans since the E1</span><br><span style="color: hsl(120, 100%, 40%);">+ * voice channels are handled by osmo-mgw and the information put in e1_link</span><br><span style="color: hsl(120, 100%, 40%);">+ * here is only used to generate the MGCP messages for the mgw. */</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_ATTR(cfg_ts_e1_subslot,</span><br><span style="color: hsl(120, 100%, 40%);">+          cfg_ts_e1_subslot_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+        "e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",</span><br><span style="color: hsl(120, 100%, 40%);">+    "E1/T1 channel connected to this on-air timeslot\n"</span><br><span style="color: hsl(120, 100%, 40%);">+         "E1/T1 channel connected to this on-air timeslot\n"</span><br><span style="color: hsl(120, 100%, 40%);">+         "E1/T1 line connected to this on-air timeslot\n"</span><br><span style="color: hsl(120, 100%, 40%);">+    "E1/T1 timeslot connected to this on-air timeslot\n"</span><br><span style="color: hsl(120, 100%, 40%);">+        "E1/T1 timeslot connected to this on-air timeslot\n"</span><br><span style="color: hsl(120, 100%, 40%);">+        "E1/T1 sub-slot connected to this on-air timeslot\n"</span><br><span style="color: hsl(120, 100%, 40%);">+        "E1/T1 sub-slot 0 connected to this on-air timeslot\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "E1/T1 sub-slot 1 connected to this on-air timeslot\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "E1/T1 sub-slot 2 connected to this on-air timeslot\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "E1/T1 sub-slot 3 connected to this on-air timeslot\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "Full E1/T1 timeslot connected to this on-air timeslot\n",</span><br><span style="color: hsl(120, 100%, 40%);">+          CMD_ATTR_IMMEDIATE)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gsm_bts_trx_ts *ts = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  parse_e1_link(&ts->e1_link, argv[0], argv[1], argv[2]);</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%);">+/* call vty_out() to print a string like " as TCH/H" for dynamic timeslots.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Don't do anything if the ts is not dynamic. */</span><br><span style="color: hsl(120, 100%, 40%);">+static void vty_out_dyn_ts_status(struct vty *vty, struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      enum gsm_phys_chan_config target;</span><br><span style="color: hsl(120, 100%, 40%);">+     if (ts_is_pchan_switching(ts, &target)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         vty_out(vty, " switching %s -> %s", gsm_pchan_name(ts->pchan_is),</span><br><span style="color: hsl(120, 100%, 40%);">+                     gsm_pchan_name(target));</span><br><span style="color: hsl(120, 100%, 40%);">+      } else if (ts->pchan_is != ts->pchan_on_init) {</span><br><span style="color: hsl(120, 100%, 40%);">+         vty_out(vty, " as %s", gsm_pchan_name(ts->pchan_is));</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%);">+static void vty_out_dyn_ts_details(struct vty *vty, struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     /* show dyn TS details, if applicable */</span><br><span style="color: hsl(120, 100%, 40%);">+      switch (ts->pchan_on_init) {</span><br><span style="color: hsl(120, 100%, 40%);">+       case GSM_PCHAN_OSMO_DYN:</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "  Osmocom Dyn TS:");</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_out_dyn_ts_status(vty, ts);</span><br><span style="color: hsl(120, 100%, 40%);">+               vty_out(vty, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM_PCHAN_TCH_F_PDCH:</span><br><span style="color: hsl(120, 100%, 40%);">+            vty_out(vty, "  IPACC Dyn PDCH TS:");</span><br><span style="color: hsl(120, 100%, 40%);">+               vty_out_dyn_ts_status(vty, ts);</span><br><span style="color: hsl(120, 100%, 40%);">+               vty_out(vty, VTY_NEWLINE);</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%);">+              /* no dyn ts */</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</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%);">+static void meas_rep_dump_uni_vty(struct vty *vty,</span><br><span style="color: hsl(120, 100%, 40%);">+                              struct gsm_meas_rep_unidir *mru,</span><br><span style="color: hsl(120, 100%, 40%);">+                              const char *prefix,</span><br><span style="color: hsl(120, 100%, 40%);">+                           const char *dir)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, "%s  RXL-FULL-%s: %4d dBm, RXL-SUB-%s: %4d dBm ",</span><br><span style="color: hsl(120, 100%, 40%);">+              prefix, dir, rxlev2dbm(mru->full.rx_lev),</span><br><span style="color: hsl(120, 100%, 40%);">+                  dir, rxlev2dbm(mru->sub.rx_lev));</span><br><span style="color: hsl(120, 100%, 40%);">+  vty_out(vty, "RXQ-FULL-%s: %d, RXQ-SUB-%s: %d%s",</span><br><span style="color: hsl(120, 100%, 40%);">+           dir, mru->full.rx_qual, dir, mru->sub.rx_qual,</span><br><span style="color: hsl(120, 100%, 40%);">+          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%);">+static void meas_rep_dump_vty(struct vty *vty, struct gsm_meas_rep *mr,</span><br><span style="color: hsl(120, 100%, 40%);">+                         const char *prefix)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  vty_out(vty, "%sMeasurement Report:%s", prefix, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+       vty_out(vty, "%s  Flags: %s%s%s%s%s", prefix,</span><br><span style="color: hsl(120, 100%, 40%);">+                       mr->flags & MEAS_REP_F_UL_DTX ? "DTXu " : "",</span><br><span style="color: hsl(120, 100%, 40%);">+                      mr->flags & MEAS_REP_F_DL_DTX ? "DTXd " : "",</span><br><span style="color: hsl(120, 100%, 40%);">+                      mr->flags & MEAS_REP_F_FPC ? "FPC " : "",</span><br><span style="color: hsl(120, 100%, 40%);">+                  mr->flags & MEAS_REP_F_DL_VALID ? " " : "DLinval ",</span><br><span style="color: hsl(120, 100%, 40%);">+                        VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (mr->flags & MEAS_REP_F_MS_TO)</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "%s  MS Timing Offset: %d%s", prefix, mr->ms_timing_offset, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (mr->flags & MEAS_REP_F_MS_L1)</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "%s  L1 MS Power: %u dBm, Timing Advance: %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                       prefix, mr->ms_l1.pwr, mr->ms_l1.ta, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (mr->flags & MEAS_REP_F_DL_VALID)</span><br><span style="color: hsl(120, 100%, 40%);">+           meas_rep_dump_uni_vty(vty, &mr->dl, prefix, "dl");</span><br><span style="color: hsl(120, 100%, 40%);">+   meas_rep_dump_uni_vty(vty, &mr->ul, prefix, "ul");</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%);">+void lchan_dump_full_vty(struct vty *vty, struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       int idx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    vty_out(vty, "BTS %u, TRX %u, Timeslot %u, Lchan %u: Type %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+            lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,</span><br><span style="color: hsl(120, 100%, 40%);">+                lchan->nr, gsm_lchant_name(lchan->type), VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+  vty_out_dyn_ts_details(vty, lchan->ts);</span><br><span style="color: hsl(120, 100%, 40%);">+    vty_out(vty, "  Connection: %u, State: %s%s%s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+           lchan->conn ? 1: 0, lchan_state_name(lchan),</span><br><span style="color: hsl(120, 100%, 40%);">+               lchan->fi && lchan->fi->state == LCHAN_ST_BORKEN ? " Error reason: " : "",</span><br><span style="color: hsl(120, 100%, 40%);">+               lchan->fi && lchan->fi->state == LCHAN_ST_BORKEN ? lchan->last_error : "",</span><br><span style="color: hsl(120, 100%, 40%);">+              VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, "  BS Power: %u dBm, MS Power: %u dBm%s",</span><br><span style="color: hsl(120, 100%, 40%);">+              lchan->ts->trx->nominal_power - lchan->ts->trx->max_power_red</span><br><span style="color: hsl(120, 100%, 40%);">+               - lchan->bs_power_db,</span><br><span style="color: hsl(120, 100%, 40%);">+              ms_pwr_dbm(lchan->ts->trx->bts->band, lchan->ms_power),</span><br><span style="color: hsl(120, 100%, 40%);">+                VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       vty_out(vty, "  Interference Level: ");</span><br><span style="color: hsl(120, 100%, 40%);">+     if (lchan->interf_dbm == INTERF_DBM_UNKNOWN)</span><br><span style="color: hsl(120, 100%, 40%);">+               vty_out(vty, "unknown");</span><br><span style="color: hsl(120, 100%, 40%);">+    else</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_out(vty, "%d dBm (%u)", lchan->interf_dbm, lchan->interf_band);</span><br><span style="color: hsl(120, 100%, 40%);">+   vty_out(vty, "%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  vty_out(vty, "  Channel Mode / Codec: %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                gsm48_chan_mode_name(lchan->current_ch_mode_rate.chan_mode),</span><br><span style="color: hsl(120, 100%, 40%);">+               VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!lchan_state_is(lchan, LCHAN_ST_UNUSED))</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_out(vty, "  Training Sequence: Set %d Code %u%s", (lchan->tsc_set > 0 ? lchan->tsc_set : 1), lchan->tsc, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (lchan->vamos.enabled)</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_out(vty, "  VAMOS: enabled%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (lchan->conn && lchan->conn->bsub) {</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "  Subscriber:%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+               bsc_subscr_dump_vty(vty, lchan->conn->bsub);</span><br><span style="color: hsl(120, 100%, 40%);">+    } else</span><br><span style="color: hsl(120, 100%, 40%);">+                vty_out(vty, "  No Subscriber%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (is_ipaccess_bts(lchan->ts->trx->bts)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          struct in_addr ia;</span><br><span style="color: hsl(120, 100%, 40%);">+            if (lchan->abis_ip.bound_ip) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     ia.s_addr = htonl(lchan->abis_ip.bound_ip);</span><br><span style="color: hsl(120, 100%, 40%);">+                        vty_out(vty, "  Bound IP: %s Port %u RTP_TYPE2=%u CONN_ID=%u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                            inet_ntoa(ia), lchan->abis_ip.bound_port,</span><br><span style="color: hsl(120, 100%, 40%);">+                          lchan->abis_ip.rtp_payload2, lchan->abis_ip.conn_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                            VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (lchan->abis_ip.connect_ip) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   ia.s_addr = htonl(lchan->abis_ip.connect_ip);</span><br><span style="color: hsl(120, 100%, 40%);">+                      vty_out(vty, "  Conn. IP: %s Port %u RTP_TYPE=%u SPEECH_MODE=0x%02x%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                             inet_ntoa(ia), lchan->abis_ip.connect_port,</span><br><span style="color: hsl(120, 100%, 40%);">+                                lchan->abis_ip.rtp_payload, lchan->abis_ip.speech_mode,</span><br><span style="color: hsl(120, 100%, 40%);">+                         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%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* we want to report the last measurement report */</span><br><span style="color: hsl(120, 100%, 40%);">+   idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),</span><br><span style="color: hsl(120, 100%, 40%);">+                               lchan->meas_rep_idx, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+    meas_rep_dump_vty(vty, &lchan->meas_rep[idx], "  ");</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%);">+void lchan_dump_short_vty(struct vty *vty, struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_meas_rep *mr;</span><br><span style="color: hsl(120, 100%, 40%);">+      int idx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* we want to report the last measurement report */</span><br><span style="color: hsl(120, 100%, 40%);">+   idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),</span><br><span style="color: hsl(120, 100%, 40%);">+                               lchan->meas_rep_idx, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+    mr =  &lchan->meas_rep[idx];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, "BTS %u, TRX %u, Timeslot %u %s",</span><br><span style="color: hsl(120, 100%, 40%);">+              lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,</span><br><span style="color: hsl(120, 100%, 40%);">+                gsm_pchan_name(lchan->ts->pchan_on_init));</span><br><span style="color: hsl(120, 100%, 40%);">+      vty_out_dyn_ts_status(vty, lchan->ts);</span><br><span style="color: hsl(120, 100%, 40%);">+     vty_out(vty, ", Lchan %u", lchan->nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (lchan_state_is(lchan, LCHAN_ST_UNUSED)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         vty_out(vty, ", Type %s, State %s - Interference Level: ",</span><br><span style="color: hsl(120, 100%, 40%);">+                  gsm_pchan_name(lchan->ts->pchan_is),</span><br><span style="color: hsl(120, 100%, 40%);">+                    lchan_state_name(lchan));</span><br><span style="color: hsl(120, 100%, 40%);">+             if (lchan->interf_dbm == INTERF_DBM_UNKNOWN)</span><br><span style="color: hsl(120, 100%, 40%);">+                       vty_out(vty, "unknown");</span><br><span style="color: hsl(120, 100%, 40%);">+            else</span><br><span style="color: hsl(120, 100%, 40%);">+                  vty_out(vty, "%d dBm (%u)", lchan->interf_dbm, lchan->interf_band);</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+            return;</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, ", Type %s%s TSC-s%dc%u, State %s - L1 MS Power: %u dBm RXL-FULL-dl: %4d dBm RXL-FULL-ul: %4d dBm%s",</span><br><span style="color: hsl(120, 100%, 40%);">+          gsm_lchant_name(lchan->type),</span><br><span style="color: hsl(120, 100%, 40%);">+              lchan->vamos.enabled ? " (VAMOS)" : "",</span><br><span style="color: hsl(120, 100%, 40%);">+                lchan->tsc_set > 0 ? lchan->tsc_set : 1,</span><br><span style="color: hsl(120, 100%, 40%);">+             lchan->tsc,</span><br><span style="color: hsl(120, 100%, 40%);">+                lchan_state_name(lchan),</span><br><span style="color: hsl(120, 100%, 40%);">+              mr->ms_l1.pwr,</span><br><span style="color: hsl(120, 100%, 40%);">+             rxlev2dbm(mr->dl.full.rx_lev),</span><br><span style="color: hsl(120, 100%, 40%);">+             rxlev2dbm(mr->ul.full.rx_lev),</span><br><span style="color: hsl(120, 100%, 40%);">+             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%);">+void ts_dump_vty(struct vty *vty, struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   vty_out(vty, "BTS %u, TRX %u, Timeslot %u, phys cfg %s (active %s)",</span><br><span style="color: hsl(120, 100%, 40%);">+                ts->trx->bts->nr, ts->trx->nr, ts->nr,</span><br><span style="color: hsl(120, 100%, 40%);">+              gsm_pchan_name(ts->pchan_on_init),</span><br><span style="color: hsl(120, 100%, 40%);">+         gsm_pchan_name(ts->pchan_is));</span><br><span style="color: hsl(120, 100%, 40%);">+     if (ts->pchan_is != ts->pchan_on_init)</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_out(vty, " (%s mode)", gsm_pchan_name(ts->pchan_is));</span><br><span style="color: hsl(120, 100%, 40%);">+        vty_out(vty, ", TSC %u%s  NM State: ", gsm_ts_tsc(ts), VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+        vty_out_dyn_ts_details(vty, ts);</span><br><span style="color: hsl(120, 100%, 40%);">+      net_dump_nmstate(vty, &ts->mo.nm_state);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!is_ipaccess_bts(ts->trx->bts))</span><br><span style="color: hsl(120, 100%, 40%);">+             vty_out(vty, "  E1 Line %u, Timeslot %u, Subslot %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                     ts->e1_link.e1_nr, ts->e1_link.e1_ts,</span><br><span style="color: hsl(120, 100%, 40%);">+                   ts->e1_link.e1_ts_ss, 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%);">+void e1isl_dump_vty(struct vty *vty, struct e1inp_sign_link *e1l)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct e1inp_line *line;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!e1l) {</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "   None%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</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%);">+   line = e1l->ts->line;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, "    E1 Line %u, Type %s: Timeslot %u, Mode %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+             line->num, line->driver->name, e1l->ts->num,</span><br><span style="color: hsl(120, 100%, 40%);">+           e1inp_signtype_name(e1l->type), VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+      vty_out(vty, "    E1 TEI %u, SAPI %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+            e1l->tei, e1l->sapi, 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%);">+/*! Dump the IP addresses and ports of the input signal link's timeslot.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  This only makes sense for links connected with ipaccess.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  Example output: "(r=10.1.42.1:55416<->l=10.1.42.123:3003)" */</span><br><span style="color: hsl(120, 100%, 40%);">+void e1isl_dump_vty_tcp(struct vty *vty, const struct e1inp_sign_link *e1l)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  if (e1l) {</span><br><span style="color: hsl(120, 100%, 40%);">+            char *name = osmo_sock_get_name(NULL, e1l->ts->driver.ipaccess.fd.fd);</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_out(vty, "%s", name);</span><br><span style="color: hsl(120, 100%, 40%);">+           talloc_free(name);</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     vty_out(vty, "%s", 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%);">+void trx_dump_vty(struct vty *vty, struct gsm_bts_trx *trx, bool print_rsl, bool show_connected)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  if (show_connected && !trx->rsl_link_primary)</span><br><span style="color: hsl(120, 100%, 40%);">+              return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!show_connected && trx->rsl_link_primary)</span><br><span style="color: hsl(120, 100%, 40%);">+              return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     vty_out(vty, "TRX %u of BTS %u is on ARFCN %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+           trx->nr, trx->bts->nr, trx->arfcn, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+  vty_out(vty, "  RF Nominal Power: %d dBm, reduced by %u dB, "</span><br><span style="color: hsl(120, 100%, 40%);">+               "resulting BS power: %d dBm%s",</span><br><span style="color: hsl(120, 100%, 40%);">+             trx->nominal_power, trx->max_power_red,</span><br><span style="color: hsl(120, 100%, 40%);">+         trx->nominal_power - trx->max_power_red, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+  vty_out(vty, "  Radio Carrier NM State: ");</span><br><span style="color: hsl(120, 100%, 40%);">+ net_dump_nmstate(vty, &trx->mo.nm_state);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (print_rsl)</span><br><span style="color: hsl(120, 100%, 40%);">+                vty_out(vty, "  RSL State: %s%s", trx->rsl_link_primary? "connected" : "disconnected", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, "  Baseband Transceiver NM State: ");</span><br><span style="color: hsl(120, 100%, 40%);">+  net_dump_nmstate(vty, &trx->bb_transc.mo.nm_state);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (is_ipaccess_bts(trx->bts)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "  ip.access stream ID: 0x%02x ", trx->rsl_tei_primary);</span><br><span style="color: hsl(120, 100%, 40%);">+            e1isl_dump_vty_tcp(vty, trx->rsl_link_primary);</span><br><span style="color: hsl(120, 100%, 40%);">+    } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "  E1 Signalling Link:%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+               e1isl_dump_vty(vty, trx->rsl_link_primary);</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%);">+void config_write_e1_link(struct vty *vty, struct gsm_e1_subslot *e1_link,</span><br><span style="color: hsl(120, 100%, 40%);">+                             const char *prefix)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!e1_link->e1_ts)</span><br><span style="color: hsl(120, 100%, 40%);">+               return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (e1_link->e1_ts_ss == 255)</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "%se1 line %u timeslot %u sub-slot full%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                    prefix, e1_link->e1_nr, e1_link->e1_ts, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+   else</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_out(vty, "%se1 line %u timeslot %u sub-slot %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                      prefix, e1_link->e1_nr, e1_link->e1_ts,</span><br><span style="color: hsl(120, 100%, 40%);">+                 e1_link->e1_ts_ss, 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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void config_write_ts_single(struct vty *vty, struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, "   timeslot %u%s", ts->nr, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (ts->tsc != -1)</span><br><span style="color: hsl(120, 100%, 40%);">+         vty_out(vty, "    training_sequence_code %u%s", ts->tsc, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (ts->pchan_from_config != GSM_PCHAN_NONE)</span><br><span style="color: hsl(120, 100%, 40%);">+               vty_out(vty, "    phys_chan_config %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                   gsm_pchan_name(ts->pchan_from_config), VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+       vty_out(vty, "    hopping enabled %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+            ts->hopping.enabled, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ts->hopping.enabled) {</span><br><span style="color: hsl(120, 100%, 40%);">+         unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+               vty_out(vty, "    hopping sequence-number %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                    ts->hopping.hsn, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+             vty_out(vty, "    hopping maio %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                       ts->hopping.maio, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+            for (i = 0; i < ts->hopping.arfcns.data_len*8; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (!bitvec_get_bit_pos(&ts->hopping.arfcns, i))</span><br><span style="color: hsl(120, 100%, 40%);">+                               continue;</span><br><span style="color: hsl(120, 100%, 40%);">+                     vty_out(vty, "    hopping arfcn add %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                          i, 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%);">+     config_write_e1_link(vty, &ts->e1_link, "    ");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (ts->trx->bts->model->config_write_ts)</span><br><span style="color: hsl(120, 100%, 40%);">+         ts->trx->bts->model->config_write_ts(vty, ts);</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%);">+void config_write_trx_single(struct vty *vty, struct gsm_bts_trx *trx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      vty_out(vty, "  trx %u%s", trx->nr, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+        vty_out(vty, "   rf_locked %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+           trx->mo.force_rf_lock ? 1 : 0,</span><br><span style="color: hsl(120, 100%, 40%);">+             VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, "   arfcn %u%s", trx->arfcn, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+  vty_out(vty, "   nominal power %u%s", trx->nominal_power, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+  vty_out(vty, "   max_power_red %u%s", trx->max_power_red, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+  config_write_e1_link(vty, &trx->rsl_e1_link, "   rsl ");</span><br><span style="color: hsl(120, 100%, 40%);">+     vty_out(vty, "   rsl e1 tei %u%s", trx->rsl_tei_primary, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (trx->bts->model->config_write_trx)</span><br><span style="color: hsl(120, 100%, 40%);">+               trx->bts->model->config_write_trx(vty, trx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       for (i = 0; i < TRX_NR_TS; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+            config_write_ts_single(vty, &trx->ts[i]);</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%);">+int bts_trx_vty_init(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  cfg_ts_pchan_cmd.string =</span><br><span style="color: hsl(120, 100%, 40%);">+             vty_cmd_string_from_valstr(tall_bsc_ctx,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         gsm_pchant_names,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     "phys_chan_config (", "|", ")",</span><br><span style="color: hsl(120, 100%, 40%);">+                                         VTY_DO_LOWER);</span><br><span style="color: hsl(120, 100%, 40%);">+     cfg_ts_pchan_cmd.doc =</span><br><span style="color: hsl(120, 100%, 40%);">+                vty_cmd_string_from_valstr(tall_bsc_ctx,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         gsm_pchant_descs,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     "Physical Channel Combination\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                           "\n", "", 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        install_element(BTS_NODE, &cfg_trx_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+  install_node(&trx_node, dummy_config_write);</span><br><span style="color: hsl(120, 100%, 40%);">+      install_element(TRX_NODE, &cfg_trx_arfcn_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+    install_element(TRX_NODE, &cfg_description_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+  install_element(TRX_NODE, &cfg_no_description_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+       install_element(TRX_NODE, &cfg_trx_nominal_power_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+    install_element(TRX_NODE, &cfg_trx_max_power_red_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+    install_element(TRX_NODE, &cfg_trx_rsl_e1_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+   install_element(TRX_NODE, &cfg_trx_rsl_e1_tei_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+       install_element(TRX_NODE, &cfg_trx_rf_locked_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      install_element(TRX_NODE, &cfg_ts_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+   install_node(&ts_node, dummy_config_write);</span><br><span style="color: hsl(120, 100%, 40%);">+       install_element(TS_NODE, &cfg_ts_pchan_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+      install_element(TS_NODE, &cfg_ts_pchan_compat_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+       install_element(TS_NODE, &cfg_ts_tsc_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+        install_element(TS_NODE, &cfg_ts_hopping_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+    install_element(TS_NODE, &cfg_ts_hsn_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+        install_element(TS_NODE, &cfg_ts_maio_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+       install_element(TS_NODE, &cfg_ts_arfcn_add_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+  install_element(TS_NODE, &cfg_ts_arfcn_del_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+  install_element(TS_NODE, &cfg_ts_arfcn_del_all_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+      install_element(TS_NODE, &cfg_ts_e1_subslot_cmd);</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>diff --git a/src/osmo-bsc/bts_vty.c b/src/osmo-bsc/bts_vty.c</span><br><span>index 5859480..b8b9f6c 100644</span><br><span>--- a/src/osmo-bsc/bts_vty.c</span><br><span>+++ b/src/osmo-bsc/bts_vty.c</span><br><span>@@ -38,7 +38,6 @@</span><br><span> </span><br><span> #include <osmocom/bsc/vty.h></span><br><span> #include <osmocom/bsc/gsm_data.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/abis/e1_input.h></span><br><span> #include <osmocom/bsc/chan_alloc.h></span><br><span> #include <osmocom/bsc/meas_rep.h></span><br><span> #include <osmocom/bsc/system_information.h></span><br><span>@@ -48,9 +47,6 @@</span><br><span> #include <osmocom/bsc/handover_vty.h></span><br><span> #include <osmocom/bsc/gsm_04_08_rr.h></span><br><span> #include <osmocom/bsc/neighbor_ident.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/timeslot_fsm.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/lchan_fsm.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/lchan_select.h></span><br><span> #include <osmocom/bsc/smscb.h></span><br><span> #include <osmocom/bsc/bts.h></span><br><span> </span><br><span>@@ -106,30 +102,6 @@</span><br><span>    1,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static struct cmd_node trx_node = {</span><br><span style="color: hsl(0, 100%, 40%);">- TRX_NODE,</span><br><span style="color: hsl(0, 100%, 40%);">-       "%s(config-net-bts-trx)# ",</span><br><span style="color: hsl(0, 100%, 40%);">-   1,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct cmd_node ts_node = {</span><br><span style="color: hsl(0, 100%, 40%);">-  TS_NODE,</span><br><span style="color: hsl(0, 100%, 40%);">-        "%s(config-net-bts-trx-ts)# ",</span><br><span style="color: hsl(0, 100%, 40%);">-        1,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* utility functions */</span><br><span style="color: hsl(0, 100%, 40%);">-static void parse_e1_link(struct gsm_e1_subslot *e1_link, const char *line,</span><br><span style="color: hsl(0, 100%, 40%);">-                    const char *ts, const char *ss)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      e1_link->e1_nr = atoi(line);</span><br><span style="color: hsl(0, 100%, 40%);">- e1_link->e1_ts = atoi(ts);</span><br><span style="color: hsl(0, 100%, 40%);">-   if (!strcmp(ss, "full"))</span><br><span style="color: hsl(0, 100%, 40%);">-              e1_link->e1_ts_ss = 255;</span><br><span style="color: hsl(0, 100%, 40%);">-     else</span><br><span style="color: hsl(0, 100%, 40%);">-            e1_link->e1_ts_ss = atoi(ss);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* per-BTS configuration */</span><br><span> DEFUN_ATTR(cfg_bts,</span><br><span>         cfg_bts_cmd,</span><br><span>@@ -3231,615 +3203,6 @@</span><br><span>    return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define TRX_TEXT "Radio Transceiver\n"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* per TRX configuration */</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN_ATTR(cfg_trx,</span><br><span style="color: hsl(0, 100%, 40%);">-         cfg_trx_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-    "trx <0-255>",</span><br><span style="color: hsl(0, 100%, 40%);">-          TRX_TEXT</span><br><span style="color: hsl(0, 100%, 40%);">-        "Select a TRX to configure\n",</span><br><span style="color: hsl(0, 100%, 40%);">-        CMD_ATTR_IMMEDIATE)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- int trx_nr = atoi(argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gsm_bts *bts = vty->index;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gsm_bts_trx *trx;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (trx_nr > bts->num_trx) {</span><br><span style="color: hsl(0, 100%, 40%);">-              vty_out(vty, "%% The next unused TRX number in this BTS is %u%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                     bts->num_trx, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-          return CMD_WARNING;</span><br><span style="color: hsl(0, 100%, 40%);">-     } else if (trx_nr == bts->num_trx) {</span><br><span style="color: hsl(0, 100%, 40%);">-         /* we need to allocate a new one */</span><br><span style="color: hsl(0, 100%, 40%);">-             trx = gsm_bts_trx_alloc(bts);</span><br><span style="color: hsl(0, 100%, 40%);">-   } else</span><br><span style="color: hsl(0, 100%, 40%);">-          trx = gsm_bts_trx_num(bts, trx_nr);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     if (!trx)</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->index = trx;</span><br><span style="color: hsl(0, 100%, 40%);">-    vty->node = TRX_NODE;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN_USRATTR(cfg_trx_arfcn,</span><br><span style="color: hsl(0, 100%, 40%);">-              cfg_trx_arfcn_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-              X(BSC_VTY_ATTR_RESTART_ABIS_OML_LINK),</span><br><span style="color: hsl(0, 100%, 40%);">-          "arfcn <0-1023>",</span><br><span style="color: hsl(0, 100%, 40%);">-       "Set the ARFCN for this TRX\n"</span><br><span style="color: hsl(0, 100%, 40%);">-        "Absolute Radio Frequency Channel Number\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   enum gsm_band unused;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gsm_bts_trx *trx = vty->index;</span><br><span style="color: hsl(0, 100%, 40%);">-        int arfcn = atoi(argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (gsm_arfcn2band_rc(arfcn, &unused) < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-             vty_out(vty, "%% Invalid arfcn %" PRIu16 " detected%s", arfcn, 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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* FIXME: check if this ARFCN is supported by this TRX */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       trx->arfcn = arfcn;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /* Update Cell Allocation (list of all the frequencies allocated to a cell) */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (generate_cell_chan_alloc(trx->bts) != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-               vty_out(vty, "%% Failed to re-generate Cell Allocation%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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* FIXME: patch ARFCN into SYSTEM INFORMATION */</span><br><span style="color: hsl(0, 100%, 40%);">-        /* FIXME: use OML layer to update the ARFCN */</span><br><span style="color: hsl(0, 100%, 40%);">-  /* FIXME: use RSL layer to update SYSTEM INFORMATION */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN_USRATTR(cfg_trx_nominal_power,</span><br><span style="color: hsl(0, 100%, 40%);">-              cfg_trx_nominal_power_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-              X(BSC_VTY_ATTR_RESTART_ABIS_OML_LINK),</span><br><span style="color: hsl(0, 100%, 40%);">-          "nominal power <-20-100>",</span><br><span style="color: hsl(0, 100%, 40%);">-              "Nominal TRX RF Power in dBm\n"</span><br><span style="color: hsl(0, 100%, 40%);">-       "Nominal TRX RF Power in dBm\n"</span><br><span style="color: hsl(0, 100%, 40%);">-       "Nominal TRX RF Power in dBm\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       struct gsm_bts_trx *trx = vty->index;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        trx->nominal_power = atoi(argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN_USRATTR(cfg_trx_max_power_red,</span><br><span style="color: hsl(0, 100%, 40%);">-              cfg_trx_max_power_red_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-              X(BSC_VTY_ATTR_RESTART_ABIS_OML_LINK),</span><br><span style="color: hsl(0, 100%, 40%);">-          "max_power_red <0-100>",</span><br><span style="color: hsl(0, 100%, 40%);">-        "Reduction of maximum BS RF Power (relative to nominal power)\n"</span><br><span style="color: hsl(0, 100%, 40%);">-              "Reduction of maximum BS RF Power in dB\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    int maxpwr_r = atoi(argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gsm_bts_trx *trx = vty->index;</span><br><span style="color: hsl(0, 100%, 40%);">-        int upper_limit = 24;   /* default 12.21 max power red. */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* FIXME: check if our BTS type supports more than 12 */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (maxpwr_r < 0 || maxpwr_r > upper_limit) {</span><br><span style="color: hsl(0, 100%, 40%);">-             vty_out(vty, "%% Power %d dB is not in the valid range%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                    maxpwr_r, 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%);">-       if (maxpwr_r & 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-         vty_out(vty, "%% Power %d dB is not an even value%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                 maxpwr_r, 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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       trx->max_power_red = maxpwr_r;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* FIXME: make sure we update this using OML */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* NOTE: This requires a full restart as bsc_network_configure() is executed</span><br><span style="color: hsl(0, 100%, 40%);">- * only once on startup from osmo_bsc_main.c */</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN(cfg_trx_rsl_e1,</span><br><span style="color: hsl(0, 100%, 40%);">-      cfg_trx_rsl_e1_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-      "rsl e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",</span><br><span style="color: hsl(0, 100%, 40%);">-      "RSL Parameters\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "E1/T1 interface to be used for RSL\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "E1/T1 interface to be used for RSL\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "E1/T1 Line Number to be used for RSL\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "E1/T1 Timeslot to be used for RSL\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "E1/T1 Timeslot to be used for RSL\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "E1/T1 Sub-slot to be used for RSL\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "E1/T1 Sub-slot 0 is to be used for RSL\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "E1/T1 Sub-slot 1 is to be used for RSL\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "E1/T1 Sub-slot 2 is to be used for RSL\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "E1/T1 Sub-slot 3 is to be used for RSL\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "E1/T1 full timeslot is to be used for RSL\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gsm_bts_trx *trx = vty->index;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        parse_e1_link(&trx->rsl_e1_link, argv[0], argv[1], argv[2]);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN_USRATTR(cfg_trx_rsl_e1_tei,</span><br><span style="color: hsl(0, 100%, 40%);">-         cfg_trx_rsl_e1_tei_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-         X(BSC_VTY_ATTR_RESTART_ABIS_RSL_LINK),</span><br><span style="color: hsl(0, 100%, 40%);">-          "rsl e1 tei <0-63>",</span><br><span style="color: hsl(0, 100%, 40%);">-            "RSL Parameters\n"</span><br><span style="color: hsl(0, 100%, 40%);">-            "Set the TEI to be used for RSL\n"</span><br><span style="color: hsl(0, 100%, 40%);">-            "Set the TEI to be used for RSL\n"</span><br><span style="color: hsl(0, 100%, 40%);">-            "TEI to be used for RSL\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gsm_bts_trx *trx = vty->index;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        trx->rsl_tei_primary = atoi(argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN_ATTR(cfg_trx_rf_locked,</span><br><span style="color: hsl(0, 100%, 40%);">-          cfg_trx_rf_locked_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-          "rf_locked (0|1)",</span><br><span style="color: hsl(0, 100%, 40%);">-    "Set or unset the RF Locking (Turn off RF of the TRX)\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "TRX is NOT RF locked (active)\n"</span><br><span style="color: hsl(0, 100%, 40%);">-     "TRX is RF locked (turned off)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-    CMD_ATTR_IMMEDIATE)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- int locked = atoi(argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gsm_bts_trx *trx = vty->index;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_trx_lock_rf(trx, locked, "vty");</span><br><span style="color: hsl(0, 100%, 40%);">-  return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* per TS configuration */</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN_ATTR(cfg_ts,</span><br><span style="color: hsl(0, 100%, 40%);">-           cfg_ts_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-     "timeslot <0-7>",</span><br><span style="color: hsl(0, 100%, 40%);">-       "Select a Timeslot to configure\n"</span><br><span style="color: hsl(0, 100%, 40%);">-    "Timeslot number\n",</span><br><span style="color: hsl(0, 100%, 40%);">-          CMD_ATTR_IMMEDIATE)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- int ts_nr = atoi(argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gsm_bts_trx *trx = vty->index;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gsm_bts_trx_ts *ts;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (ts_nr >= TRX_NR_TS) {</span><br><span style="color: hsl(0, 100%, 40%);">-            vty_out(vty, "%% A GSM TRX only has %u Timeslots per TRX%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                  TRX_NR_TS, 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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ts = &trx->ts[ts_nr];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    vty->index = ts;</span><br><span style="color: hsl(0, 100%, 40%);">-     vty->node = TS_NODE;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN_USRATTR(cfg_ts_pchan,</span><br><span style="color: hsl(0, 100%, 40%);">-       cfg_ts_pchan_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-       X(BSC_VTY_ATTR_RESTART_ABIS_OML_LINK),</span><br><span style="color: hsl(0, 100%, 40%);">-          "phys_chan_config PCHAN", /* dynamically generated! */</span><br><span style="color: hsl(0, 100%, 40%);">-        "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gsm_bts_trx_ts *ts = vty->index;</span><br><span style="color: hsl(0, 100%, 40%);">-      int pchanc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     pchanc = gsm_pchan_parse(argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (pchanc < 0)</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%);">-     ts->pchan_from_config = pchanc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* used for backwards compatibility with old config files that still</span><br><span style="color: hsl(0, 100%, 40%);">- * have uppercase pchan type names. Also match older names for existing types.  */</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN_HIDDEN(cfg_ts_pchan_compat,</span><br><span style="color: hsl(0, 100%, 40%);">-      cfg_ts_pchan_compat_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-      "phys_chan_config PCHAN",</span><br><span style="color: hsl(0, 100%, 40%);">-      "Physical Channel configuration (TCH/SDCCH/...)\n" "Physical Channel\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gsm_bts_trx_ts *ts = vty->index;</span><br><span style="color: hsl(0, 100%, 40%);">-      int pchanc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     pchanc = gsm_pchan_parse(argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (pchanc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-            if (strcasecmp(argv[0], "tch/f_tch/h_pdch") == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   pchanc = GSM_PCHAN_OSMO_DYN;</span><br><span style="color: hsl(0, 100%, 40%);">-            } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        vty_out(vty, "Unknown physical channel name '%s'%s", argv[0], VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-                   return CMD_ERR_NO_MATCH;</span><br><span style="color: hsl(0, 100%, 40%);">-                }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ts->pchan_from_config = pchanc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN_USRATTR(cfg_ts_tsc,</span><br><span style="color: hsl(0, 100%, 40%);">-         cfg_ts_tsc_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-         X(BSC_VTY_ATTR_RESTART_ABIS_OML_LINK),</span><br><span style="color: hsl(0, 100%, 40%);">-          "training_sequence_code <0-7>",</span><br><span style="color: hsl(0, 100%, 40%);">-         "Training Sequence Code of the Timeslot\n" "TSC\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gsm_bts_trx_ts *ts = vty->index;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (!osmo_bts_has_feature(&ts->trx->bts->model->features, BTS_FEAT_MULTI_TSC)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                vty_out(vty, "%% This BTS does not support a TSC != BCC, "</span><br><span style="color: hsl(0, 100%, 40%);">-                    "falling back to BCC%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-                ts->tsc = -1;</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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ts->tsc = atoi(argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define HOPPING_STR "Configure frequency hopping\n"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN_USRATTR(cfg_ts_hopping,</span><br><span style="color: hsl(0, 100%, 40%);">-        cfg_ts_hopping_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-             X(BSC_VTY_ATTR_RESTART_ABIS_OML_LINK),</span><br><span style="color: hsl(0, 100%, 40%);">-          "hopping enabled (0|1)",</span><br><span style="color: hsl(0, 100%, 40%);">-              HOPPING_STR "Enable or disable frequency hopping\n"</span><br><span style="color: hsl(0, 100%, 40%);">-           "Disable frequency hopping\n" "Enable frequency hopping\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gsm_bts_trx_ts *ts = vty->index;</span><br><span style="color: hsl(0, 100%, 40%);">-      int enabled = atoi(argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if (enabled && !osmo_bts_has_feature(&ts->trx->bts->model->features, BTS_FEAT_HOPPING)) {</span><br><span style="color: hsl(0, 100%, 40%);">-               vty_out(vty, "%% BTS model does not seem to support freq. hopping%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-           /* Allow enabling frequency hopping anyway, because the BTS might not have</span><br><span style="color: hsl(0, 100%, 40%);">-               * connected yet (thus not sent the feature vector), so we cannot know for</span><br><span style="color: hsl(0, 100%, 40%);">-               * sure.  Jet print a warning and let it go. */</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ts->hopping.enabled = enabled;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN_USRATTR(cfg_ts_hsn,</span><br><span style="color: hsl(0, 100%, 40%);">-         cfg_ts_hsn_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-         X(BSC_VTY_ATTR_RESTART_ABIS_OML_LINK),</span><br><span style="color: hsl(0, 100%, 40%);">-          "hopping sequence-number <0-63>",</span><br><span style="color: hsl(0, 100%, 40%);">-       HOPPING_STR</span><br><span style="color: hsl(0, 100%, 40%);">-             "Which hopping sequence to use for this channel\n"</span><br><span style="color: hsl(0, 100%, 40%);">-            "Hopping Sequence Number (HSN)\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gsm_bts_trx_ts *ts = vty->index;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      ts->hopping.hsn = atoi(argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN_USRATTR(cfg_ts_maio,</span><br><span style="color: hsl(0, 100%, 40%);">-        cfg_ts_maio_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-        X(BSC_VTY_ATTR_RESTART_ABIS_OML_LINK),</span><br><span style="color: hsl(0, 100%, 40%);">-          "hopping maio <0-63>",</span><br><span style="color: hsl(0, 100%, 40%);">-          HOPPING_STR</span><br><span style="color: hsl(0, 100%, 40%);">-             "Which hopping MAIO to use for this channel\n"</span><br><span style="color: hsl(0, 100%, 40%);">-        "Mobile Allocation Index Offset (MAIO)\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gsm_bts_trx_ts *ts = vty->index;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      ts->hopping.maio = atoi(argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN_USRATTR(cfg_ts_arfcn_add,</span><br><span style="color: hsl(0, 100%, 40%);">-           cfg_ts_arfcn_add_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-           X(BSC_VTY_ATTR_RESTART_ABIS_OML_LINK),</span><br><span style="color: hsl(0, 100%, 40%);">-          "hopping arfcn add <0-1023>",</span><br><span style="color: hsl(0, 100%, 40%);">-           HOPPING_STR "Configure hopping ARFCN list\n"</span><br><span style="color: hsl(0, 100%, 40%);">-          "Add an entry to the hopping ARFCN list\n" "ARFCN\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        enum gsm_band unused;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gsm_bts_trx_ts *ts = vty->index;</span><br><span style="color: hsl(0, 100%, 40%);">-      int arfcn = atoi(argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (gsm_arfcn2band_rc(arfcn, &unused) < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-             vty_out(vty, "%% Invalid arfcn %" PRIu16 " detected%s", arfcn, 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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (bitvec_get_bit_pos(&ts->hopping.arfcns, arfcn) == ONE) {</span><br><span style="color: hsl(0, 100%, 40%);">-             vty_out(vty, "%% ARFCN %" PRIu16 " is already set%s", arfcn, 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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Update Cell Allocation (list of all the frequencies allocated to a cell) */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (generate_cell_chan_alloc(ts->trx->bts) != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                vty_out(vty, "%% Failed to re-generate Cell Allocation%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-              bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, ZERO); /* roll-back */</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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN_USRATTR(cfg_ts_arfcn_del,</span><br><span style="color: hsl(0, 100%, 40%);">-           cfg_ts_arfcn_del_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-           X(BSC_VTY_ATTR_RESTART_ABIS_OML_LINK),</span><br><span style="color: hsl(0, 100%, 40%);">-          "hopping arfcn del <0-1023>",</span><br><span style="color: hsl(0, 100%, 40%);">-           HOPPING_STR "Configure hopping ARFCN list\n"</span><br><span style="color: hsl(0, 100%, 40%);">-          "Delete an entry to the hopping ARFCN list\n" "ARFCN\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     enum gsm_band unused;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gsm_bts_trx_ts *ts = vty->index;</span><br><span style="color: hsl(0, 100%, 40%);">-      int arfcn = atoi(argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (gsm_arfcn2band_rc(arfcn, &unused) < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-             vty_out(vty, "%% Invalid arfcn %" PRIu16 " detected%s", arfcn, 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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (bitvec_get_bit_pos(&ts->hopping.arfcns, arfcn) != ONE) {</span><br><span style="color: hsl(0, 100%, 40%);">-             vty_out(vty, "%% ARFCN %" PRIu16 " is not set%s", arfcn, 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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       bitvec_set_bit_pos(&ts->hopping.arfcns, arfcn, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Update Cell Allocation (list of all the frequencies allocated to a cell) */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (generate_cell_chan_alloc(ts->trx->bts) != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                vty_out(vty, "%% Failed to re-generate Cell Allocation%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-              /* It's unlikely to happen on removal, so we don't roll-back */</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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN_USRATTR(cfg_ts_arfcn_del_all,</span><br><span style="color: hsl(0, 100%, 40%);">-       cfg_ts_arfcn_del_all_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-       X(BSC_VTY_ATTR_RESTART_ABIS_OML_LINK),</span><br><span style="color: hsl(0, 100%, 40%);">-          "hopping arfcn del-all",</span><br><span style="color: hsl(0, 100%, 40%);">-              HOPPING_STR "Configure hopping ARFCN list\n"</span><br><span style="color: hsl(0, 100%, 40%);">-          "Delete all previously configured entries\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gsm_bts_trx_ts *ts = vty->index;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      bitvec_zero(&ts->hopping.arfcns);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Update Cell Allocation (list of all the frequencies allocated to a cell) */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (generate_cell_chan_alloc(ts->trx->bts) != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                vty_out(vty, "%% Failed to re-generate Cell Allocation%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-              /* It's unlikely to happen on removal, so we don't roll-back */</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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* NOTE: This will have an effect on newly created voice lchans since the E1</span><br><span style="color: hsl(0, 100%, 40%);">- * voice channels are handled by osmo-mgw and the information put in e1_link</span><br><span style="color: hsl(0, 100%, 40%);">- * here is only used to generate the MGCP messages for the mgw. */</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN_ATTR(cfg_ts_e1_subslot,</span><br><span style="color: hsl(0, 100%, 40%);">-        cfg_ts_e1_subslot_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-          "e1 line E1_LINE timeslot <1-31> sub-slot (0|1|2|3|full)",</span><br><span style="color: hsl(0, 100%, 40%);">-      "E1/T1 channel connected to this on-air timeslot\n"</span><br><span style="color: hsl(0, 100%, 40%);">-           "E1/T1 channel connected to this on-air timeslot\n"</span><br><span style="color: hsl(0, 100%, 40%);">-           "E1/T1 line connected to this on-air timeslot\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "E1/T1 timeslot connected to this on-air timeslot\n"</span><br><span style="color: hsl(0, 100%, 40%);">-          "E1/T1 timeslot connected to this on-air timeslot\n"</span><br><span style="color: hsl(0, 100%, 40%);">-          "E1/T1 sub-slot connected to this on-air timeslot\n"</span><br><span style="color: hsl(0, 100%, 40%);">-          "E1/T1 sub-slot 0 connected to this on-air timeslot\n"</span><br><span style="color: hsl(0, 100%, 40%);">-        "E1/T1 sub-slot 1 connected to this on-air timeslot\n"</span><br><span style="color: hsl(0, 100%, 40%);">-        "E1/T1 sub-slot 2 connected to this on-air timeslot\n"</span><br><span style="color: hsl(0, 100%, 40%);">-        "E1/T1 sub-slot 3 connected to this on-air timeslot\n"</span><br><span style="color: hsl(0, 100%, 40%);">-        "Full E1/T1 timeslot connected to this on-air timeslot\n",</span><br><span style="color: hsl(0, 100%, 40%);">-    CMD_ATTR_IMMEDIATE)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_bts_trx_ts *ts = vty->index;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      parse_e1_link(&ts->e1_link, argv[0], argv[1], argv[2]);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* call vty_out() to print a string like " as TCH/H" for dynamic timeslots.</span><br><span style="color: hsl(0, 100%, 40%);">- * Don't do anything if the ts is not dynamic. */</span><br><span style="color: hsl(0, 100%, 40%);">-static void vty_out_dyn_ts_status(struct vty *vty, struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    enum gsm_phys_chan_config target;</span><br><span style="color: hsl(0, 100%, 40%);">-       if (ts_is_pchan_switching(ts, &target)) {</span><br><span style="color: hsl(0, 100%, 40%);">-           vty_out(vty, " switching %s -> %s", gsm_pchan_name(ts->pchan_is),</span><br><span style="color: hsl(0, 100%, 40%);">-                       gsm_pchan_name(target));</span><br><span style="color: hsl(0, 100%, 40%);">-        } else if (ts->pchan_is != ts->pchan_on_init) {</span><br><span style="color: hsl(0, 100%, 40%);">-           vty_out(vty, " as %s", gsm_pchan_name(ts->pchan_is));</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void vty_out_dyn_ts_details(struct vty *vty, struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       /* show dyn TS details, if applicable */</span><br><span style="color: hsl(0, 100%, 40%);">-        switch (ts->pchan_on_init) {</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM_PCHAN_OSMO_DYN:</span><br><span style="color: hsl(0, 100%, 40%);">-                vty_out(vty, "  Osmocom Dyn TS:");</span><br><span style="color: hsl(0, 100%, 40%);">-            vty_out_dyn_ts_status(vty, ts);</span><br><span style="color: hsl(0, 100%, 40%);">-         vty_out(vty, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-              break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM_PCHAN_TCH_F_PDCH:</span><br><span style="color: hsl(0, 100%, 40%);">-              vty_out(vty, "  IPACC Dyn PDCH TS:");</span><br><span style="color: hsl(0, 100%, 40%);">-         vty_out_dyn_ts_status(vty, ts);</span><br><span style="color: hsl(0, 100%, 40%);">-         vty_out(vty, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-              break;</span><br><span style="color: hsl(0, 100%, 40%);">-  default:</span><br><span style="color: hsl(0, 100%, 40%);">-                /* no dyn ts */</span><br><span style="color: hsl(0, 100%, 40%);">-         break;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void meas_rep_dump_uni_vty(struct vty *vty,</span><br><span style="color: hsl(0, 100%, 40%);">-                              struct gsm_meas_rep_unidir *mru,</span><br><span style="color: hsl(0, 100%, 40%);">-                                const char *prefix,</span><br><span style="color: hsl(0, 100%, 40%);">-                             const char *dir)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     vty_out(vty, "%s  RXL-FULL-%s: %4d dBm, RXL-SUB-%s: %4d dBm ",</span><br><span style="color: hsl(0, 100%, 40%);">-                prefix, dir, rxlev2dbm(mru->full.rx_lev),</span><br><span style="color: hsl(0, 100%, 40%);">-                    dir, rxlev2dbm(mru->sub.rx_lev));</span><br><span style="color: hsl(0, 100%, 40%);">-    vty_out(vty, "RXQ-FULL-%s: %d, RXQ-SUB-%s: %d%s",</span><br><span style="color: hsl(0, 100%, 40%);">-             dir, mru->full.rx_qual, dir, mru->sub.rx_qual,</span><br><span style="color: hsl(0, 100%, 40%);">-            VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void meas_rep_dump_vty(struct vty *vty, struct gsm_meas_rep *mr,</span><br><span style="color: hsl(0, 100%, 40%);">-                         const char *prefix)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      vty_out(vty, "%sMeasurement Report:%s", prefix, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, "%s  Flags: %s%s%s%s%s", prefix,</span><br><span style="color: hsl(0, 100%, 40%);">-                 mr->flags & MEAS_REP_F_UL_DTX ? "DTXu " : "",</span><br><span style="color: hsl(0, 100%, 40%);">-                        mr->flags & MEAS_REP_F_DL_DTX ? "DTXd " : "",</span><br><span style="color: hsl(0, 100%, 40%);">-                        mr->flags & MEAS_REP_F_FPC ? "FPC " : "",</span><br><span style="color: hsl(0, 100%, 40%);">-                    mr->flags & MEAS_REP_F_DL_VALID ? " " : "DLinval ",</span><br><span style="color: hsl(0, 100%, 40%);">-                  VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-   if (mr->flags & MEAS_REP_F_MS_TO)</span><br><span style="color: hsl(0, 100%, 40%);">-                vty_out(vty, "%s  MS Timing Offset: %d%s", prefix, mr->ms_timing_offset, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-     if (mr->flags & MEAS_REP_F_MS_L1)</span><br><span style="color: hsl(0, 100%, 40%);">-                vty_out(vty, "%s  L1 MS Power: %u dBm, Timing Advance: %u%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                 prefix, mr->ms_l1.pwr, mr->ms_l1.ta, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (mr->flags & MEAS_REP_F_DL_VALID)</span><br><span style="color: hsl(0, 100%, 40%);">-             meas_rep_dump_uni_vty(vty, &mr->dl, prefix, "dl");</span><br><span style="color: hsl(0, 100%, 40%);">-     meas_rep_dump_uni_vty(vty, &mr->ul, prefix, "ul");</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void lchan_dump_full_vty(struct vty *vty, struct gsm_lchan *lchan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- int idx;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        vty_out(vty, "BTS %u, TRX %u, Timeslot %u, Lchan %u: Type %s%s",</span><br><span style="color: hsl(0, 100%, 40%);">-              lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,</span><br><span style="color: hsl(0, 100%, 40%);">-          lchan->nr, gsm_lchant_name(lchan->type), VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-    vty_out_dyn_ts_details(vty, lchan->ts);</span><br><span style="color: hsl(0, 100%, 40%);">-      vty_out(vty, "  Connection: %u, State: %s%s%s%s",</span><br><span style="color: hsl(0, 100%, 40%);">-             lchan->conn ? 1: 0, lchan_state_name(lchan),</span><br><span style="color: hsl(0, 100%, 40%);">-         lchan->fi && lchan->fi->state == LCHAN_ST_BORKEN ? " Error reason: " : "",</span><br><span style="color: hsl(0, 100%, 40%);">-         lchan->fi && lchan->fi->state == LCHAN_ST_BORKEN ? lchan->last_error : "",</span><br><span style="color: hsl(0, 100%, 40%);">-                VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-   vty_out(vty, "  BS Power: %u dBm, MS Power: %u dBm%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                lchan->ts->trx->nominal_power - lchan->ts->trx->max_power_red</span><br><span style="color: hsl(0, 100%, 40%);">-         - lchan->bs_power_db,</span><br><span style="color: hsl(0, 100%, 40%);">-                ms_pwr_dbm(lchan->ts->trx->bts->band, lchan->ms_power),</span><br><span style="color: hsl(0, 100%, 40%);">-          VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   vty_out(vty, "  Interference Level: ");</span><br><span style="color: hsl(0, 100%, 40%);">-       if (lchan->interf_dbm == INTERF_DBM_UNKNOWN)</span><br><span style="color: hsl(0, 100%, 40%);">-         vty_out(vty, "unknown");</span><br><span style="color: hsl(0, 100%, 40%);">-      else</span><br><span style="color: hsl(0, 100%, 40%);">-            vty_out(vty, "%d dBm (%u)", lchan->interf_dbm, lchan->interf_band);</span><br><span style="color: hsl(0, 100%, 40%);">-     vty_out(vty, "%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      vty_out(vty, "  Channel Mode / Codec: %s%s",</span><br><span style="color: hsl(0, 100%, 40%);">-          gsm48_chan_mode_name(lchan->current_ch_mode_rate.chan_mode),</span><br><span style="color: hsl(0, 100%, 40%);">-         VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-   if (!lchan_state_is(lchan, LCHAN_ST_UNUSED))</span><br><span style="color: hsl(0, 100%, 40%);">-            vty_out(vty, "  Training Sequence: Set %d Code %u%s", (lchan->tsc_set > 0 ? lchan->tsc_set : 1), lchan->tsc, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (lchan->vamos.enabled)</span><br><span style="color: hsl(0, 100%, 40%);">-            vty_out(vty, "  VAMOS: enabled%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (lchan->conn && lchan->conn->bsub) {</span><br><span style="color: hsl(0, 100%, 40%);">-                vty_out(vty, "  Subscriber:%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-         bsc_subscr_dump_vty(vty, lchan->conn->bsub);</span><br><span style="color: hsl(0, 100%, 40%);">-      } else</span><br><span style="color: hsl(0, 100%, 40%);">-          vty_out(vty, "  No Subscriber%s", VTY_NEWLINE);</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%);">-            struct in_addr ia;</span><br><span style="color: hsl(0, 100%, 40%);">-              if (lchan->abis_ip.bound_ip) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       ia.s_addr = htonl(lchan->abis_ip.bound_ip);</span><br><span style="color: hsl(0, 100%, 40%);">-                  vty_out(vty, "  Bound IP: %s Port %u RTP_TYPE2=%u CONN_ID=%u%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                              inet_ntoa(ia), lchan->abis_ip.bound_port,</span><br><span style="color: hsl(0, 100%, 40%);">-                            lchan->abis_ip.rtp_payload2, lchan->abis_ip.conn_id,</span><br><span style="color: hsl(0, 100%, 40%);">-                              VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-           }</span><br><span style="color: hsl(0, 100%, 40%);">-               if (lchan->abis_ip.connect_ip) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     ia.s_addr = htonl(lchan->abis_ip.connect_ip);</span><br><span style="color: hsl(0, 100%, 40%);">-                        vty_out(vty, "  Conn. IP: %s Port %u RTP_TYPE=%u SPEECH_MODE=0x%02x%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                               inet_ntoa(ia), lchan->abis_ip.connect_port,</span><br><span style="color: hsl(0, 100%, 40%);">-                          lchan->abis_ip.rtp_payload, lchan->abis_ip.speech_mode,</span><br><span style="color: hsl(0, 100%, 40%);">-                           VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-           }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* we want to report the last measurement report */</span><br><span style="color: hsl(0, 100%, 40%);">-     idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),</span><br><span style="color: hsl(0, 100%, 40%);">-                         lchan->meas_rep_idx, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-      meas_rep_dump_vty(vty, &lchan->meas_rep[idx], "  ");</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void lchan_dump_short_vty(struct vty *vty, struct gsm_lchan *lchan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gsm_meas_rep *mr;</span><br><span style="color: hsl(0, 100%, 40%);">-        int idx;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* we want to report the last measurement report */</span><br><span style="color: hsl(0, 100%, 40%);">-     idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),</span><br><span style="color: hsl(0, 100%, 40%);">-                         lchan->meas_rep_idx, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-      mr =  &lchan->meas_rep[idx];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     vty_out(vty, "BTS %u, TRX %u, Timeslot %u %s",</span><br><span style="color: hsl(0, 100%, 40%);">-                lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,</span><br><span style="color: hsl(0, 100%, 40%);">-          gsm_pchan_name(lchan->ts->pchan_on_init));</span><br><span style="color: hsl(0, 100%, 40%);">-        vty_out_dyn_ts_status(vty, lchan->ts);</span><br><span style="color: hsl(0, 100%, 40%);">-       vty_out(vty, ", Lchan %u", lchan->nr);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     if (lchan_state_is(lchan, LCHAN_ST_UNUSED)) {</span><br><span style="color: hsl(0, 100%, 40%);">-           vty_out(vty, ", Type %s, State %s - Interference Level: ",</span><br><span style="color: hsl(0, 100%, 40%);">-                    gsm_pchan_name(lchan->ts->pchan_is),</span><br><span style="color: hsl(0, 100%, 40%);">-                      lchan_state_name(lchan));</span><br><span style="color: hsl(0, 100%, 40%);">-               if (lchan->interf_dbm == INTERF_DBM_UNKNOWN)</span><br><span style="color: hsl(0, 100%, 40%);">-                 vty_out(vty, "unknown");</span><br><span style="color: hsl(0, 100%, 40%);">-              else</span><br><span style="color: hsl(0, 100%, 40%);">-                    vty_out(vty, "%d dBm (%u)", lchan->interf_dbm, lchan->interf_band);</span><br><span style="color: hsl(0, 100%, 40%);">-             vty_out(vty, "%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-              return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       vty_out(vty, ", Type %s%s TSC-s%dc%u, State %s - L1 MS Power: %u dBm RXL-FULL-dl: %4d dBm RXL-FULL-ul: %4d dBm%s",</span><br><span style="color: hsl(0, 100%, 40%);">-            gsm_lchant_name(lchan->type),</span><br><span style="color: hsl(0, 100%, 40%);">-                lchan->vamos.enabled ? " (VAMOS)" : "",</span><br><span style="color: hsl(0, 100%, 40%);">-          lchan->tsc_set > 0 ? lchan->tsc_set : 1,</span><br><span style="color: hsl(0, 100%, 40%);">-               lchan->tsc,</span><br><span style="color: hsl(0, 100%, 40%);">-          lchan_state_name(lchan),</span><br><span style="color: hsl(0, 100%, 40%);">-                mr->ms_l1.pwr,</span><br><span style="color: hsl(0, 100%, 40%);">-               rxlev2dbm(mr->dl.full.rx_lev),</span><br><span style="color: hsl(0, 100%, 40%);">-               rxlev2dbm(mr->ul.full.rx_lev),</span><br><span style="color: hsl(0, 100%, 40%);">-               VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void ts_dump_vty(struct vty *vty, struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     vty_out(vty, "BTS %u, TRX %u, Timeslot %u, phys cfg %s (active %s)",</span><br><span style="color: hsl(0, 100%, 40%);">-          ts->trx->bts->nr, ts->trx->nr, ts->nr,</span><br><span style="color: hsl(0, 100%, 40%);">-                gsm_pchan_name(ts->pchan_on_init),</span><br><span style="color: hsl(0, 100%, 40%);">-           gsm_pchan_name(ts->pchan_is));</span><br><span style="color: hsl(0, 100%, 40%);">-       if (ts->pchan_is != ts->pchan_on_init)</span><br><span style="color: hsl(0, 100%, 40%);">-            vty_out(vty, " (%s mode)", gsm_pchan_name(ts->pchan_is));</span><br><span style="color: hsl(0, 100%, 40%);">-  vty_out(vty, ", TSC %u%s  NM State: ", gsm_ts_tsc(ts), VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-  vty_out_dyn_ts_details(vty, ts);</span><br><span style="color: hsl(0, 100%, 40%);">-        net_dump_nmstate(vty, &ts->mo.nm_state);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!is_ipaccess_bts(ts->trx->bts))</span><br><span style="color: hsl(0, 100%, 40%);">-               vty_out(vty, "  E1 Line %u, Timeslot %u, Subslot %u%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                       ts->e1_link.e1_nr, ts->e1_link.e1_ts,</span><br><span style="color: hsl(0, 100%, 40%);">-                     ts->e1_link.e1_ts_ss, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static void vty_out_neigh_list(struct vty *vty, struct bitvec *bv)</span><br><span> {</span><br><span>   int count = 0;</span><br><span>@@ -3856,67 +3219,6 @@</span><br><span>              vty_out(vty, " (%d)", count);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void e1isl_dump_vty(struct vty *vty, struct e1inp_sign_link *e1l)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       struct e1inp_line *line;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!e1l) {</span><br><span style="color: hsl(0, 100%, 40%);">-             vty_out(vty, "   None%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-               return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       line = e1l->ts->line;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     vty_out(vty, "    E1 Line %u, Type %s: Timeslot %u, Mode %s%s",</span><br><span style="color: hsl(0, 100%, 40%);">-               line->num, line->driver->name, e1l->ts->num,</span><br><span style="color: hsl(0, 100%, 40%);">-             e1inp_signtype_name(e1l->type), VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-        vty_out(vty, "    E1 TEI %u, SAPI %u%s",</span><br><span style="color: hsl(0, 100%, 40%);">-              e1l->tei, e1l->sapi, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*! Dump the IP addresses and ports of the input signal link's timeslot.</span><br><span style="color: hsl(0, 100%, 40%);">- *  This only makes sense for links connected with ipaccess.</span><br><span style="color: hsl(0, 100%, 40%);">- *  Example output: "(r=10.1.42.1:55416<->l=10.1.42.123:3003)" */</span><br><span style="color: hsl(0, 100%, 40%);">-static void e1isl_dump_vty_tcp(struct vty *vty, const struct e1inp_sign_link *e1l)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   if (e1l) {</span><br><span style="color: hsl(0, 100%, 40%);">-              char *name = osmo_sock_get_name(NULL, e1l->ts->driver.ipaccess.fd.fd);</span><br><span style="color: hsl(0, 100%, 40%);">-            vty_out(vty, "%s", name);</span><br><span style="color: hsl(0, 100%, 40%);">-             talloc_free(name);</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-       vty_out(vty, "%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void trx_dump_vty(struct vty *vty, struct gsm_bts_trx *trx, bool print_rsl, bool show_connected)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    if (show_connected && !trx->rsl_link_primary)</span><br><span style="color: hsl(0, 100%, 40%);">-                return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!show_connected && trx->rsl_link_primary)</span><br><span style="color: hsl(0, 100%, 40%);">-                return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, "TRX %u of BTS %u is on ARFCN %u%s",</span><br><span style="color: hsl(0, 100%, 40%);">-             trx->nr, trx->bts->nr, trx->arfcn, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-    vty_out(vty, "  RF Nominal Power: %d dBm, reduced by %u dB, "</span><br><span style="color: hsl(0, 100%, 40%);">-         "resulting BS power: %d dBm%s",</span><br><span style="color: hsl(0, 100%, 40%);">-               trx->nominal_power, trx->max_power_red,</span><br><span style="color: hsl(0, 100%, 40%);">-           trx->nominal_power - trx->max_power_red, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-    vty_out(vty, "  Radio Carrier NM State: ");</span><br><span style="color: hsl(0, 100%, 40%);">-   net_dump_nmstate(vty, &trx->mo.nm_state);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (print_rsl)</span><br><span style="color: hsl(0, 100%, 40%);">-          vty_out(vty, "  RSL State: %s%s", trx->rsl_link_primary? "connected" : "disconnected", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-   vty_out(vty, "  Baseband Transceiver NM State: ");</span><br><span style="color: hsl(0, 100%, 40%);">-    net_dump_nmstate(vty, &trx->bb_transc.mo.nm_state);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (is_ipaccess_bts(trx->bts)) {</span><br><span style="color: hsl(0, 100%, 40%);">-             vty_out(vty, "  ip.access stream ID: 0x%02x ", trx->rsl_tei_primary);</span><br><span style="color: hsl(0, 100%, 40%);">-              e1isl_dump_vty_tcp(vty, trx->rsl_link_primary);</span><br><span style="color: hsl(0, 100%, 40%);">-      } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                vty_out(vty, "  E1 Signalling Link:%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-         e1isl_dump_vty(vty, trx->rsl_link_primary);</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static void bts_dump_vty_cbch(struct vty *vty, const struct bts_smscb_chan_state *cstate)</span><br><span> {</span><br><span>         vty_out(vty, "  CBCH %s: %u messages, %u pages, %zu-entry sched_arr, %u%% load%s",</span><br><span>@@ -4139,72 +3441,6 @@</span><br><span>        bts_dump_vty_features(vty, bts);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void config_write_e1_link(struct vty *vty, struct gsm_e1_subslot *e1_link,</span><br><span style="color: hsl(0, 100%, 40%);">-                               const char *prefix)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   if (!e1_link->e1_ts)</span><br><span style="color: hsl(0, 100%, 40%);">-         return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (e1_link->e1_ts_ss == 255)</span><br><span style="color: hsl(0, 100%, 40%);">-                vty_out(vty, "%se1 line %u timeslot %u sub-slot full%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                      prefix, e1_link->e1_nr, e1_link->e1_ts, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-     else</span><br><span style="color: hsl(0, 100%, 40%);">-            vty_out(vty, "%se1 line %u timeslot %u sub-slot %u%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                        prefix, e1_link->e1_nr, e1_link->e1_ts,</span><br><span style="color: hsl(0, 100%, 40%);">-                   e1_link->e1_ts_ss, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void config_write_ts_single(struct vty *vty, struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     vty_out(vty, "   timeslot %u%s", ts->nr, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-     if (ts->tsc != -1)</span><br><span style="color: hsl(0, 100%, 40%);">-           vty_out(vty, "    training_sequence_code %u%s", ts->tsc, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-     if (ts->pchan_from_config != GSM_PCHAN_NONE)</span><br><span style="color: hsl(0, 100%, 40%);">-         vty_out(vty, "    phys_chan_config %s%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                     gsm_pchan_name(ts->pchan_from_config), VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, "    hopping enabled %u%s",</span><br><span style="color: hsl(0, 100%, 40%);">-              ts->hopping.enabled, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-   if (ts->hopping.enabled) {</span><br><span style="color: hsl(0, 100%, 40%);">-           unsigned int i;</span><br><span style="color: hsl(0, 100%, 40%);">-         vty_out(vty, "    hopping sequence-number %u%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                      ts->hopping.hsn, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-               vty_out(vty, "    hopping maio %u%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                 ts->hopping.maio, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-              for (i = 0; i < ts->hopping.arfcns.data_len*8; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     if (!bitvec_get_bit_pos(&ts->hopping.arfcns, i))</span><br><span style="color: hsl(0, 100%, 40%);">-                         continue;</span><br><span style="color: hsl(0, 100%, 40%);">-                       vty_out(vty, "    hopping arfcn add %u%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                            i, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-                }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       config_write_e1_link(vty, &ts->e1_link, "    ");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (ts->trx->bts->model->config_write_ts)</span><br><span style="color: hsl(0, 100%, 40%);">-           ts->trx->bts->model->config_write_ts(vty, ts);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void config_write_trx_single(struct vty *vty, struct gsm_bts_trx *trx)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       int i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  vty_out(vty, "  trx %u%s", trx->nr, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-  vty_out(vty, "   rf_locked %u%s",</span><br><span style="color: hsl(0, 100%, 40%);">-             trx->mo.force_rf_lock ? 1 : 0,</span><br><span style="color: hsl(0, 100%, 40%);">-               VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-   vty_out(vty, "   arfcn %u%s", trx->arfcn, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-    vty_out(vty, "   nominal power %u%s", trx->nominal_power, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-    vty_out(vty, "   max_power_red %u%s", trx->max_power_red, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-    config_write_e1_link(vty, &trx->rsl_e1_link, "   rsl ");</span><br><span style="color: hsl(0, 100%, 40%);">-       vty_out(vty, "   rsl e1 tei %u%s", trx->rsl_tei_primary, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     if (trx->bts->model->config_write_trx)</span><br><span style="color: hsl(0, 100%, 40%);">-         trx->bts->model->config_write_trx(vty, trx);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   for (i = 0; i < TRX_NR_TS; i++)</span><br><span style="color: hsl(0, 100%, 40%);">-              config_write_ts_single(vty, &trx->ts[i]);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static void config_write_bts_gprs(struct vty *vty, struct gsm_bts *bts)</span><br><span> {</span><br><span>    unsigned int i;</span><br><span>@@ -4743,17 +3979,6 @@</span><br><span> </span><br><span> int bts_vty_init(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     cfg_ts_pchan_cmd.string =</span><br><span style="color: hsl(0, 100%, 40%);">-               vty_cmd_string_from_valstr(tall_bsc_ctx,</span><br><span style="color: hsl(0, 100%, 40%);">-                                           gsm_pchant_names,</span><br><span style="color: hsl(0, 100%, 40%);">-                                       "phys_chan_config (", "|", ")",</span><br><span style="color: hsl(0, 100%, 40%);">-                                           VTY_DO_LOWER);</span><br><span style="color: hsl(0, 100%, 40%);">-       cfg_ts_pchan_cmd.doc =</span><br><span style="color: hsl(0, 100%, 40%);">-          vty_cmd_string_from_valstr(tall_bsc_ctx,</span><br><span style="color: hsl(0, 100%, 40%);">-                                           gsm_pchant_descs,</span><br><span style="color: hsl(0, 100%, 40%);">-                                       "Physical Channel Combination\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                     "\n", "", 0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>         cfg_bts_type_cmd.string =</span><br><span>            vty_cmd_string_from_valstr(tall_bsc_ctx,</span><br><span>                                        bts_type_names,</span><br><span>@@ -4923,29 +4148,6 @@</span><br><span>  install_element(POWER_CTRL_NODE, &cfg_power_ctrl_avg_algo_cmd);</span><br><span>  install_element(POWER_CTRL_NODE, &cfg_power_ctrl_avg_osmo_ewma_cmd);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    install_element(BTS_NODE, &cfg_trx_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-    install_node(&trx_node, dummy_config_write);</span><br><span style="color: hsl(0, 100%, 40%);">-        install_element(TRX_NODE, &cfg_trx_arfcn_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-      install_element(TRX_NODE, &cfg_description_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-    install_element(TRX_NODE, &cfg_no_description_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">- install_element(TRX_NODE, &cfg_trx_nominal_power_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-      install_element(TRX_NODE, &cfg_trx_max_power_red_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-      install_element(TRX_NODE, &cfg_trx_rsl_e1_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-     install_element(TRX_NODE, &cfg_trx_rsl_e1_tei_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">- install_element(TRX_NODE, &cfg_trx_rf_locked_cmd);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      install_element(TRX_NODE, &cfg_ts_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-     install_node(&ts_node, dummy_config_write);</span><br><span style="color: hsl(0, 100%, 40%);">- install_element(TS_NODE, &cfg_ts_pchan_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-        install_element(TS_NODE, &cfg_ts_pchan_compat_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">- install_element(TS_NODE, &cfg_ts_tsc_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-  install_element(TS_NODE, &cfg_ts_hopping_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-      install_element(TS_NODE, &cfg_ts_hsn_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-  install_element(TS_NODE, &cfg_ts_maio_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">- install_element(TS_NODE, &cfg_ts_arfcn_add_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-    install_element(TS_NODE, &cfg_ts_arfcn_del_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-    install_element(TS_NODE, &cfg_ts_arfcn_del_all_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-        install_element(TS_NODE, &cfg_ts_e1_subslot_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     return bts_trx_vty_init();</span><br><span> }</span><br><span>diff --git a/tests/handover/Makefile.am b/tests/handover/Makefile.am</span><br><span>index a4d11a0..55b25c6 100644</span><br><span>--- a/tests/handover/Makefile.am</span><br><span>+++ b/tests/handover/Makefile.am</span><br><span>@@ -64,6 +64,7 @@</span><br><span>     $(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \</span><br><span>        $(top_builddir)/src/osmo-bsc/bts_unknown.o \</span><br><span>         $(top_builddir)/src/osmo-bsc/bts_vty.o \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(top_builddir)/src/osmo-bsc/bts_trx_vty.o \</span><br><span>         $(top_builddir)/src/osmo-bsc/chan_alloc.o \</span><br><span>  $(top_builddir)/src/osmo-bsc/codec_pref.o \</span><br><span>  $(top_builddir)/src/osmo-bsc/gsm_04_08_rr.o \</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/24980">change 24980</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/+/24980"/><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: I15ec8f71a5d31915162cb3ad75ea77e934fa4887 </div>
<div style="display:none"> Gerrit-Change-Number: 24980 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-CC: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>