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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">power_control: add VTY commands for per-BTS configuration<br><br>Change-Id: Ifd6ea29c3b9dbaccf92856131d5fb2e352b84eb2<br>Related: SYS#4918<br>---<br>M include/osmocom/bsc/vty.h<br>M src/osmo-bsc/bsc_vty.c<br>M src/osmo-bsc/osmo_bsc_main.c<br>M tests/Makefile.am<br>A tests/power_ctrl.vty<br>5 files changed, 677 insertions(+), 0 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 cfdcbfc..92f7932 100644</span><br><span>--- a/include/osmocom/bsc/vty.h</span><br><span>+++ b/include/osmocom/bsc/vty.h</span><br><span>@@ -28,6 +28,7 @@</span><br><span>      CBC_SERVER_NODE,</span><br><span>     CBC_CLIENT_NODE,</span><br><span>     SMLC_NODE,</span><br><span style="color: hsl(120, 100%, 40%);">+    POWER_CTRL_NODE,</span><br><span> };</span><br><span> </span><br><span> struct log_info;</span><br><span>diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c</span><br><span>index 3858da8..91ce2df 100644</span><br><span>--- a/src/osmo-bsc/bsc_vty.c</span><br><span>+++ b/src/osmo-bsc/bsc_vty.c</span><br><span>@@ -153,6 +153,12 @@</span><br><span>   1,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct cmd_node power_ctrl_node = {</span><br><span style="color: hsl(120, 100%, 40%);">+     POWER_CTRL_NODE,</span><br><span style="color: hsl(120, 100%, 40%);">+      "%s(config-power-ctrl)# ",</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> struct cmd_node trx_node = {</span><br><span>     TRX_NODE,</span><br><span>    "%s(config-net-bts-trx)# ",</span><br><span>@@ -869,6 +875,99 @@</span><br><span>                 vty_out(vty, "auto%s", VTY_NEWLINE);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* TODO: generalize and move indention handling to libosmocore */</span><br><span style="color: hsl(120, 100%, 40%);">+#define cfg_out(fmt, args...) \</span><br><span style="color: hsl(120, 100%, 40%);">+   vty_out(vty, "%*s" fmt, indent, "", ##args);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void config_write_power_ctrl_meas(struct vty *vty, unsigned int indent,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     const struct gsm_power_ctrl_params *cp,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       uint8_t ptype)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    const struct gsm_power_ctrl_meas_params *mp;</span><br><span style="color: hsl(120, 100%, 40%);">+  const char *param;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  switch (ptype) {</span><br><span style="color: hsl(120, 100%, 40%);">+      case IPAC_RXLEV_AVE:</span><br><span style="color: hsl(120, 100%, 40%);">+          mp = &cp->rxlev_meas;</span><br><span style="color: hsl(120, 100%, 40%);">+          param = "rxlev";</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case IPAC_RXQUAL_AVE:</span><br><span style="color: hsl(120, 100%, 40%);">+         mp = &cp->rxqual_meas;</span><br><span style="color: hsl(120, 100%, 40%);">+         param = "rxqual";</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%);">+              /* Shall not happen */</span><br><span style="color: hsl(120, 100%, 40%);">+                OSMO_ASSERT(0);</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   cfg_out("%s-thresh lower %u upper %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+            param, mp->lower_thresh, mp->upper_thresh,</span><br><span style="color: hsl(120, 100%, 40%);">+              VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ cfg_out("%s-thresh-comp lower %u %u upper %u %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+         param, mp->lower_cmp_p, mp->lower_cmp_n,</span><br><span style="color: hsl(120, 100%, 40%);">+                mp->upper_cmp_p, mp->upper_cmp_n,</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%);">+       switch (mp->algo) {</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM_PWR_CTRL_MEAS_AVG_ALGO_NONE:</span><br><span style="color: hsl(120, 100%, 40%);">+         cfg_out("no %s-avg%s", param, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+         return; /* we're done */</span><br><span style="color: hsl(120, 100%, 40%);">+  case GSM_PWR_CTRL_MEAS_AVG_ALGO_UNWEIGHTED:</span><br><span style="color: hsl(120, 100%, 40%);">+           cfg_out("%s-avg algo unweighted%s", param, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM_PWR_CTRL_MEAS_AVG_ALGO_WEIGHTED:</span><br><span style="color: hsl(120, 100%, 40%);">+             cfg_out("%s-avg algo weighted%s", param, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM_PWR_CTRL_MEAS_AVG_ALGO_MOD_MEDIAN:</span><br><span style="color: hsl(120, 100%, 40%);">+           cfg_out("%s-avg algo mod-median%s", param, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM_PWR_CTRL_MEAS_AVG_ALGO_OSMO_EWMA:</span><br><span style="color: hsl(120, 100%, 40%);">+            cfg_out("%s-avg algo osmo-ewma beta %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                  param, 100 - mp->ewma.alpha,</span><br><span style="color: hsl(120, 100%, 40%);">+                       VTY_NEWLINE);</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%);">+   cfg_out("%s-avg params hreqave %u hreqt %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+              param, mp->h_reqave, mp->h_reqt,</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 config_write_power_ctrl(struct vty *vty, unsigned int indent,</span><br><span style="color: hsl(120, 100%, 40%);">+                             const struct gsm_power_ctrl_params *cp)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        const char *node_name;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (cp->dir == GSM_PWR_CTRL_DIR_UL)</span><br><span style="color: hsl(120, 100%, 40%);">+                node_name = "ms-power-control";</span><br><span style="color: hsl(120, 100%, 40%);">+     else</span><br><span style="color: hsl(120, 100%, 40%);">+          node_name = "bs-power-control";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   switch (cp->mode) {</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM_PWR_CTRL_MODE_NONE:</span><br><span style="color: hsl(120, 100%, 40%);">+          cfg_out("no %s%s", node_name, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM_PWR_CTRL_MODE_STATIC:</span><br><span style="color: hsl(120, 100%, 40%);">+                cfg_out("%s%s", node_name, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+            cfg_out(" mode static%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM_PWR_CTRL_MODE_DYN_BTS:</span><br><span style="color: hsl(120, 100%, 40%);">+               cfg_out("%s%s", node_name, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+            cfg_out(" mode dyn-bts%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          cfg_out(" step-size inc %u red %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                       cp->inc_step_size_db, cp->red_step_size_db,</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%);">+               /* Measurement processing / averaging parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+           config_write_power_ctrl_meas(vty, indent + 1, cp, IPAC_RXLEV_AVE);</span><br><span style="color: hsl(120, 100%, 40%);">+            config_write_power_ctrl_meas(vty, indent + 1, cp, IPAC_RXQUAL_AVE);</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%);">+#undef cfg_out</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void config_write_bts_single(struct vty *vty, struct gsm_bts *bts)</span><br><span> {</span><br><span>   int i;</span><br><span>@@ -1129,6 +1228,10 @@</span><br><span>          || bts->repeated_acch_policy.dl_facch_cmd)</span><br><span>            vty_out(vty, "  repeat rxqual %u%s", bts->repeated_acch_policy.rxqual, VTY_NEWLINE);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* BS/MS Power Control parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+  config_write_power_ctrl(vty, 2, &bts->bs_power_ctrl);</span><br><span style="color: hsl(120, 100%, 40%);">+  config_write_power_ctrl(vty, 2, &bts->ms_power_ctrl);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       config_write_bts_model(vty, bts);</span><br><span> }</span><br><span> </span><br><span>@@ -4722,6 +4825,344 @@</span><br><span>         return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define BS_POWER_CONTROL_CMD \</span><br><span style="color: hsl(120, 100%, 40%);">+  "bs-power-control"</span><br><span style="color: hsl(120, 100%, 40%);">+#define MS_POWER_CONTROL_CMD \</span><br><span style="color: hsl(120, 100%, 40%);">+  "ms-power-control"</span><br><span style="color: hsl(120, 100%, 40%);">+#define POWER_CONTROL_CMD \</span><br><span style="color: hsl(120, 100%, 40%);">+     "(" BS_POWER_CONTROL_CMD "|" MS_POWER_CONTROL_CMD ")"</span><br><span style="color: hsl(120, 100%, 40%);">+#define POWER_CONTROL_DESC \</span><br><span style="color: hsl(120, 100%, 40%);">+     "BS (Downlink) power control parameters\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+        "MS (Uplink) power control parameters\n"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define BTS_POWER_CTRL_PARAMS(bts) \</span><br><span style="color: hsl(120, 100%, 40%);">+    (strcmp(argv[0], BS_POWER_CONTROL_CMD) == 0) ? \</span><br><span style="color: hsl(120, 100%, 40%);">+              &bts->bs_power_ctrl : &bts->ms_power_ctrl</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_USRATTR(cfg_bts_no_power_ctrl,</span><br><span style="color: hsl(120, 100%, 40%);">+             cfg_bts_no_power_ctrl_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+            X(BSC_VTY_ATTR_NEW_LCHAN),</span><br><span style="color: hsl(120, 100%, 40%);">+            "no " POWER_CONTROL_CMD,</span><br><span style="color: hsl(120, 100%, 40%);">+            NO_STR POWER_CONTROL_DESC)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_power_ctrl_params *params;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts *bts = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        params = BTS_POWER_CTRL_PARAMS(bts);</span><br><span style="color: hsl(120, 100%, 40%);">+  params->mode = GSM_PWR_CTRL_MODE_NONE;</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(cfg_bts_power_ctrl,</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg_bts_power_ctrl_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      POWER_CONTROL_CMD,</span><br><span style="color: hsl(120, 100%, 40%);">+      POWER_CONTROL_DESC)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_bts *bts = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        vty->index = BTS_POWER_CTRL_PARAMS(bts);</span><br><span style="color: hsl(120, 100%, 40%);">+   vty->node = POWER_CTRL_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_power_ctrl_mode,</span><br><span style="color: hsl(120, 100%, 40%);">+        cfg_power_ctrl_mode_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+              X(BSC_VTY_ATTR_VENDOR_SPECIFIC) |</span><br><span style="color: hsl(120, 100%, 40%);">+             X(BSC_VTY_ATTR_NEW_LCHAN),</span><br><span style="color: hsl(120, 100%, 40%);">+            "mode (static|dyn-bts) [reset]",</span><br><span style="color: hsl(120, 100%, 40%);">+            "Power control mode\n"</span><br><span style="color: hsl(120, 100%, 40%);">+              "Instruct the MS/BTS to use a static power level (default)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+       "Power control to be performed dynamically by the BTS itself\n"</span><br><span style="color: hsl(120, 100%, 40%);">+             "Reset to default parameters for the given mode\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gsm_power_ctrl_params *params = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Do we need to reset? */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (argc > 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+            vty_out(vty, "%% Reset to default parameters%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+              enum gsm_power_ctrl_dir dir = params->dir;</span><br><span style="color: hsl(120, 100%, 40%);">+         *params = power_ctrl_params_def;</span><br><span style="color: hsl(120, 100%, 40%);">+              params->dir = dir;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (strcmp(argv[0], "static") == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+         params->mode = GSM_PWR_CTRL_MODE_STATIC;</span><br><span style="color: hsl(120, 100%, 40%);">+   else if (strcmp(argv[0], "dyn-bts") == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+           params->mode = GSM_PWR_CTRL_MODE_DYN_BTS;</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_power_ctrl_step_size,</span><br><span style="color: hsl(120, 100%, 40%);">+           cfg_power_ctrl_step_size_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+         X(BSC_VTY_ATTR_VENDOR_SPECIFIC) |</span><br><span style="color: hsl(120, 100%, 40%);">+             X(BSC_VTY_ATTR_NEW_LCHAN),</span><br><span style="color: hsl(120, 100%, 40%);">+            "step-size inc <2-6> red <2-4>",</span><br><span style="color: hsl(120, 100%, 40%);">+        "Set power change step size (for dynamic mode)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+           "Increase step size (default is 4 dB)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+            "Step size (2, 4, or 6 dB)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+       "Reduce step size (default is 2 dB)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+              "Step size (2 or 4 dB)\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_power_ctrl_params *params = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (atoi(argv[0]) % 2 || atoi(argv[1]) % 2) {</span><br><span style="color: hsl(120, 100%, 40%);">+         vty_out(vty, "%% Power change step size must be "</span><br><span style="color: hsl(120, 100%, 40%);">+                   "an even number%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%);">+   params->inc_step_size_db = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+  params->red_step_size_db = atoi(argv[1]);</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 POWER_CONTROL_MEAS_RXLEV_DESC \</span><br><span style="color: hsl(120, 100%, 40%);">+     "RxLev value (signal strength, 0 is worst, 63 is best)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+#define POWER_CONTROL_MEAS_RXQUAL_DESC \</span><br><span style="color: hsl(120, 100%, 40%);">+ "RxQual value (signal quality, 0 is best, 7 is worst)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_USRATTR(cfg_power_ctrl_rxlev_thresh,</span><br><span style="color: hsl(120, 100%, 40%);">+            cfg_power_ctrl_rxlev_thresh_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+              X(BSC_VTY_ATTR_VENDOR_SPECIFIC) |</span><br><span style="color: hsl(120, 100%, 40%);">+             X(BSC_VTY_ATTR_NEW_LCHAN),</span><br><span style="color: hsl(120, 100%, 40%);">+            "rxlev-thresh lower <0-63> upper <0-63>",</span><br><span style="color: hsl(120, 100%, 40%);">+       "Set target RxLev thresholds (for dynamic mode)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+          "Lower RxLev value (default is 32, i.e. -78 dBm)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+         "Lower " POWER_CONTROL_MEAS_RXLEV_DESC</span><br><span style="color: hsl(120, 100%, 40%);">+              "Upper RxLev value (default is 38, i.e. -72 dBm)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+         "Upper " POWER_CONTROL_MEAS_RXLEV_DESC)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_power_ctrl_params *params = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+ int lower = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+    int upper = atoi(argv[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (lower > upper) {</span><br><span style="color: hsl(120, 100%, 40%);">+               vty_out(vty, "%% Lower 'rxlev-thresh' (%d) must be less than upper (%d)%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                 lower, upper, 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%);">+   params->rxlev_meas.lower_thresh = lower;</span><br><span style="color: hsl(120, 100%, 40%);">+   params->rxlev_meas.upper_thresh = upper;</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_power_ctrl_rxqual_thresh,</span><br><span style="color: hsl(120, 100%, 40%);">+       cfg_power_ctrl_rxqual_thresh_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+             X(BSC_VTY_ATTR_VENDOR_SPECIFIC) |</span><br><span style="color: hsl(120, 100%, 40%);">+             X(BSC_VTY_ATTR_NEW_LCHAN),</span><br><span style="color: hsl(120, 100%, 40%);">+            "rxqual-thresh lower <0-7> upper <0-7>",</span><br><span style="color: hsl(120, 100%, 40%);">+        "Set target RxQual thresholds (for dynamic mode)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+         "Lower RxQual value (default is 0, i.e. BER < 0.2%)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+           "Lower " POWER_CONTROL_MEAS_RXQUAL_DESC</span><br><span style="color: hsl(120, 100%, 40%);">+             "Upper RxQual value (default is 3, i.e. 0.8% <= BER < 1.6%)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+        "Upper " POWER_CONTROL_MEAS_RXQUAL_DESC)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_power_ctrl_params *params = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+ int lower = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+    int upper = atoi(argv[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (lower > upper) {</span><br><span style="color: hsl(120, 100%, 40%);">+               vty_out(vty, "%% Lower 'rxqual-rxqual' (%d) must be less than upper (%d)%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                        lower, upper, 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%);">+   params->rxqual_meas.lower_thresh = lower;</span><br><span style="color: hsl(120, 100%, 40%);">+  params->rxqual_meas.upper_thresh = upper;</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 POWER_CONTROL_MEAS_THRESH_COMP_CMD(meas) \</span><br><span style="color: hsl(120, 100%, 40%);">+  meas " lower <0-31> <0-31> upper <0-31> <0-31>"</span><br><span style="color: hsl(120, 100%, 40%);">+#define POWER_CONTROL_MEAS_THRESH_COMP_DESC(meas, lp, ln, up, un) \</span><br><span style="color: hsl(120, 100%, 40%);">+        "Set " meas " threshold comparators (for dynamic mode)\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+       "Lower " meas " threshold comparators (see 3GPP TS 45.008, A.3.2.1)\n" lp ln \</span><br><span style="color: hsl(120, 100%, 40%);">+    "Upper " meas " threshold comparators (see 3GPP TS 45.008, A.3.2.1)\n" up un</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_USRATTR(cfg_power_ctrl_rxlev_thresh_comp,</span><br><span style="color: hsl(120, 100%, 40%);">+         cfg_power_ctrl_rxlev_thresh_comp_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+         X(BSC_VTY_ATTR_VENDOR_SPECIFIC) |</span><br><span style="color: hsl(120, 100%, 40%);">+             X(BSC_VTY_ATTR_NEW_LCHAN),</span><br><span style="color: hsl(120, 100%, 40%);">+            POWER_CONTROL_MEAS_THRESH_COMP_CMD("rxlev-thresh-comp"),</span><br><span style="color: hsl(120, 100%, 40%);">+            POWER_CONTROL_MEAS_THRESH_COMP_DESC("RxLev",</span><br><span style="color: hsl(120, 100%, 40%);">+          "P1 (default 10)\n", "N1 (default 12)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+         "P2 (default 10)\n", "N2 (default 12)\n"))</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gsm_power_ctrl_params *params = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+ int lower_cmp_p = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+      int lower_cmp_n = atoi(argv[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+      int upper_cmp_p = atoi(argv[2]);</span><br><span style="color: hsl(120, 100%, 40%);">+      int upper_cmp_n = atoi(argv[3]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (lower_cmp_p > lower_cmp_n) {</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "%% Lower RxLev P1 %d must be less than N1 %d%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                      lower_cmp_p, lower_cmp_n, 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 (upper_cmp_p > upper_cmp_n) {</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "%% Upper RxLev P2 %d must be less than N2 %d%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                      lower_cmp_p, lower_cmp_n, 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%);">+   params->rxlev_meas.lower_cmp_p = lower_cmp_p;</span><br><span style="color: hsl(120, 100%, 40%);">+      params->rxlev_meas.lower_cmp_n = lower_cmp_n;</span><br><span style="color: hsl(120, 100%, 40%);">+      params->rxlev_meas.upper_cmp_p = upper_cmp_p;</span><br><span style="color: hsl(120, 100%, 40%);">+      params->rxlev_meas.upper_cmp_n = upper_cmp_n;</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_power_ctrl_rxqual_thresh_comp,</span><br><span style="color: hsl(120, 100%, 40%);">+          cfg_power_ctrl_rxqual_thresh_comp_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+        X(BSC_VTY_ATTR_VENDOR_SPECIFIC) |</span><br><span style="color: hsl(120, 100%, 40%);">+             X(BSC_VTY_ATTR_NEW_LCHAN),</span><br><span style="color: hsl(120, 100%, 40%);">+            POWER_CONTROL_MEAS_THRESH_COMP_CMD("rxqual-thresh-comp"),</span><br><span style="color: hsl(120, 100%, 40%);">+           POWER_CONTROL_MEAS_THRESH_COMP_DESC("RxQual",</span><br><span style="color: hsl(120, 100%, 40%);">+         "P3 (default 5)\n", "N3 (default 7)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+           "P4 (default 15)\n", "N4 (default 18)\n"))</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gsm_power_ctrl_params *params = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+ int lower_cmp_p = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+      int lower_cmp_n = atoi(argv[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+      int upper_cmp_p = atoi(argv[2]);</span><br><span style="color: hsl(120, 100%, 40%);">+      int upper_cmp_n = atoi(argv[3]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (lower_cmp_p > lower_cmp_n) {</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "%% Lower RxQual P3 %d must be less than N3 %d%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                     lower_cmp_p, lower_cmp_n, 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 (upper_cmp_p > upper_cmp_n) {</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "%% Upper RxQual P4 %d must be less than N4 %d%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                     lower_cmp_p, lower_cmp_n, 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%);">+   params->rxqual_meas.lower_cmp_p = lower_cmp_p;</span><br><span style="color: hsl(120, 100%, 40%);">+     params->rxqual_meas.lower_cmp_n = lower_cmp_n;</span><br><span style="color: hsl(120, 100%, 40%);">+     params->rxqual_meas.upper_cmp_p = upper_cmp_p;</span><br><span style="color: hsl(120, 100%, 40%);">+     params->rxqual_meas.upper_cmp_n = upper_cmp_n;</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 POWER_CONTROL_MEAS_AVG_CMD \</span><br><span style="color: hsl(120, 100%, 40%);">+        "(rxlev-avg|rxqual-avg)"</span><br><span style="color: hsl(120, 100%, 40%);">+#define POWER_CONTROL_MEAS_AVG_DESC \</span><br><span style="color: hsl(120, 100%, 40%);">+     "RxLev (signal strength) measurement averaging (for dynamic mode)\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+      "RxQual (signal quality) measurement averaging (for dynamic mode)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define POWER_CONTROL_MEAS_AVG_PARAMS(params) \</span><br><span style="color: hsl(120, 100%, 40%);">+     (strncmp(argv[0], "rxlev", 5) == 0) ? \</span><br><span style="color: hsl(120, 100%, 40%);">+             &params->rxlev_meas : &params->rxqual_meas</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_USRATTR(cfg_power_ctrl_no_avg,</span><br><span style="color: hsl(120, 100%, 40%);">+            cfg_power_ctrl_no_avg_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+            X(BSC_VTY_ATTR_VENDOR_SPECIFIC) |</span><br><span style="color: hsl(120, 100%, 40%);">+             X(BSC_VTY_ATTR_NEW_LCHAN),</span><br><span style="color: hsl(120, 100%, 40%);">+            "no " POWER_CONTROL_MEAS_AVG_CMD,</span><br><span style="color: hsl(120, 100%, 40%);">+           NO_STR POWER_CONTROL_MEAS_AVG_DESC)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_power_ctrl_params *params = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_power_ctrl_meas_params *avg_params;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      avg_params = POWER_CONTROL_MEAS_AVG_PARAMS(params);</span><br><span style="color: hsl(120, 100%, 40%);">+   avg_params->algo = GSM_PWR_CTRL_MEAS_AVG_ALGO_NONE;</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_power_ctrl_avg_params,</span><br><span style="color: hsl(120, 100%, 40%);">+          cfg_power_ctrl_avg_params_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+        X(BSC_VTY_ATTR_VENDOR_SPECIFIC) |</span><br><span style="color: hsl(120, 100%, 40%);">+             X(BSC_VTY_ATTR_NEW_LCHAN),</span><br><span style="color: hsl(120, 100%, 40%);">+            POWER_CONTROL_MEAS_AVG_CMD " params hreqave <1-31> hreqt <1-31>",</span><br><span style="color: hsl(120, 100%, 40%);">+       POWER_CONTROL_MEAS_AVG_DESC "Configure general averaging parameters\n"</span><br><span style="color: hsl(120, 100%, 40%);">+              "Hreqave: the period over which an average is produced\n"</span><br><span style="color: hsl(120, 100%, 40%);">+           "Hreqave value (so that Hreqave * Hreqt < 32)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+         "Hreqt: the number of averaged results that are maintained\n"</span><br><span style="color: hsl(120, 100%, 40%);">+       "Hreqt value (so that Hreqave * Hreqt < 32)\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_power_ctrl_params *params = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_power_ctrl_meas_params *avg_params;</span><br><span style="color: hsl(120, 100%, 40%);">+        int h_reqave = atoi(argv[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+ int h_reqt = atoi(argv[2]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (h_reqave * h_reqt > 31) {</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "%% Hreqave (%d) * Hreqt (%d) = %d must be < 32%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                 h_reqave, h_reqt, h_reqave * h_reqt, 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%);">+   avg_params = POWER_CONTROL_MEAS_AVG_PARAMS(params);</span><br><span style="color: hsl(120, 100%, 40%);">+   avg_params->h_reqave = h_reqave;</span><br><span style="color: hsl(120, 100%, 40%);">+   avg_params->h_reqt = h_reqt;</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_power_ctrl_avg_algo,</span><br><span style="color: hsl(120, 100%, 40%);">+            cfg_power_ctrl_avg_algo_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+          X(BSC_VTY_ATTR_VENDOR_SPECIFIC) |</span><br><span style="color: hsl(120, 100%, 40%);">+             X(BSC_VTY_ATTR_NEW_LCHAN),</span><br><span style="color: hsl(120, 100%, 40%);">+            /* FIXME: add algorithm specific parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+        POWER_CONTROL_MEAS_AVG_CMD " algo (unweighted|weighted|mod-median)",</span><br><span style="color: hsl(120, 100%, 40%);">+        POWER_CONTROL_MEAS_AVG_DESC "Select the averaging algorithm\n"</span><br><span style="color: hsl(120, 100%, 40%);">+              "Un-weighted average\n" "Weighted average\n"</span><br><span style="color: hsl(120, 100%, 40%);">+              "Modified median calculation\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_power_ctrl_params *params = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_power_ctrl_meas_params *avg_params;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      avg_params = POWER_CONTROL_MEAS_AVG_PARAMS(params);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (strcmp(argv[1], "unweighted") == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+             avg_params->algo = GSM_PWR_CTRL_MEAS_AVG_ALGO_UNWEIGHTED;</span><br><span style="color: hsl(120, 100%, 40%);">+  else if (strcmp(argv[1], "weighted") == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          avg_params->algo = GSM_PWR_CTRL_MEAS_AVG_ALGO_WEIGHTED;</span><br><span style="color: hsl(120, 100%, 40%);">+    else if (strcmp(argv[1], "mod-median") == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                avg_params->algo = GSM_PWR_CTRL_MEAS_AVG_ALGO_MOD_MEDIAN;</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_power_ctrl_avg_osmo_ewma,</span><br><span style="color: hsl(120, 100%, 40%);">+       cfg_power_ctrl_avg_osmo_ewma_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+             X(BSC_VTY_ATTR_VENDOR_SPECIFIC) |</span><br><span style="color: hsl(120, 100%, 40%);">+             X(BSC_VTY_ATTR_NEW_LCHAN),</span><br><span style="color: hsl(120, 100%, 40%);">+            POWER_CONTROL_MEAS_AVG_CMD " algo osmo-ewma beta <1-99>",</span><br><span style="color: hsl(120, 100%, 40%);">+             POWER_CONTROL_MEAS_AVG_DESC "Select the averaging algorithm\n"</span><br><span style="color: hsl(120, 100%, 40%);">+              "Exponentially Weighted Moving Average (EWMA)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+            "Smoothing factor (in %): beta = (100 - alpha)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+           "1% - lowest smoothing, 99% - highest smoothing\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gsm_power_ctrl_params *params = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_power_ctrl_meas_params *avg_params;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#if 0</span><br><span style="color: hsl(120, 100%, 40%);">+       if (trx->bts->type != GSM_BTS_TYPE_OSMOBTS) {</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "%% EWMA is an OsmoBTS specific algorithm, "</span><br><span style="color: hsl(120, 100%, 40%);">+                   "it's not usable for other BTS types%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%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   avg_params = POWER_CONTROL_MEAS_AVG_PARAMS(params);</span><br><span style="color: hsl(120, 100%, 40%);">+   avg_params->algo = GSM_PWR_CTRL_MEAS_AVG_ALGO_OSMO_EWMA;</span><br><span style="color: hsl(120, 100%, 40%);">+   avg_params->ewma.alpha = 100 - atoi(argv[1]);</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> #define TRX_TEXT "Radio Transceiver\n"</span><br><span> </span><br><span> /* per TRX configuration */</span><br><span>@@ -7194,6 +7635,20 @@</span><br><span>     neighbor_ident_vty_init(network, network->neighbor_bss_cells);</span><br><span>    /* See also handover commands added on bts level from handover_vty.c */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   install_element(BTS_NODE, &cfg_bts_power_ctrl_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+       install_element(BTS_NODE, &cfg_bts_no_power_ctrl_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+    install_node(&power_ctrl_node, dummy_config_write);</span><br><span style="color: hsl(120, 100%, 40%);">+       install_element(POWER_CTRL_NODE, &cfg_power_ctrl_mode_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+       install_element(POWER_CTRL_NODE, &cfg_power_ctrl_step_size_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+  install_element(POWER_CTRL_NODE, &cfg_power_ctrl_rxlev_thresh_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+       install_element(POWER_CTRL_NODE, &cfg_power_ctrl_rxqual_thresh_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+      install_element(POWER_CTRL_NODE, &cfg_power_ctrl_rxlev_thresh_comp_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+  install_element(POWER_CTRL_NODE, &cfg_power_ctrl_rxqual_thresh_comp_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ install_element(POWER_CTRL_NODE, &cfg_power_ctrl_no_avg_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+     install_element(POWER_CTRL_NODE, &cfg_power_ctrl_avg_params_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ install_element(POWER_CTRL_NODE, &cfg_power_ctrl_avg_algo_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+   install_element(POWER_CTRL_NODE, &cfg_power_ctrl_avg_osmo_ewma_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   install_element(BTS_NODE, &cfg_trx_cmd);</span><br><span>         install_node(&trx_node, dummy_config_write);</span><br><span>     install_element(TRX_NODE, &cfg_trx_arfcn_cmd);</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_main.c b/src/osmo-bsc/osmo_bsc_main.c</span><br><span>index 4ab0430..ed561aa 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_main.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_main.c</span><br><span>@@ -583,6 +583,21 @@</span><br><span>                       vty->index_sub = NULL;</span><br><span>            }</span><br><span>            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case POWER_CTRL_NODE:</span><br><span style="color: hsl(120, 100%, 40%);">+         vty->node = BTS_NODE;</span><br><span style="color: hsl(120, 100%, 40%);">+              {</span><br><span style="color: hsl(120, 100%, 40%);">+                     const struct gsm_power_ctrl_params *cp = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+                       struct gsm_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (cp->dir == GSM_PWR_CTRL_DIR_UL)</span><br><span style="color: hsl(120, 100%, 40%);">+                                bts = container_of(cp, struct gsm_bts, ms_power_ctrl);</span><br><span style="color: hsl(120, 100%, 40%);">+                        else</span><br><span style="color: hsl(120, 100%, 40%);">+                          bts = container_of(cp, struct gsm_bts, bs_power_ctrl);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                      vty->index_sub = &bts->description;</span><br><span style="color: hsl(120, 100%, 40%);">+                 vty->index = bts;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span>       case TRX_NODE:</span><br><span>               vty->node = BTS_NODE;</span><br><span>             {</span><br><span>diff --git a/tests/Makefile.am b/tests/Makefile.am</span><br><span>index c061baa..b11b905 100644</span><br><span>--- a/tests/Makefile.am</span><br><span>+++ b/tests/Makefile.am</span><br><span>@@ -40,6 +40,7 @@</span><br><span>       nri_cfg.vty \</span><br><span>        osmo-bsc.vty \</span><br><span>       timer.vty \</span><br><span style="color: hsl(120, 100%, 40%);">+   power_ctrl.vty \</span><br><span>     $(NULL)</span><br><span> </span><br><span> TESTSUITE = $(srcdir)/testsuite</span><br><span>diff --git a/tests/power_ctrl.vty b/tests/power_ctrl.vty</span><br><span>new file mode 100644</span><br><span>index 0000000..abd2768</span><br><span>--- /dev/null</span><br><span>+++ b/tests/power_ctrl.vty</span><br><span>@@ -0,0 +1,205 @@</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC> enable</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC# ### Dynamic power control must be disabled by default</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  bs-power-control</span><br><span style="color: hsl(120, 100%, 40%);">+   mode static</span><br><span style="color: hsl(120, 100%, 40%);">+  ms-power-control</span><br><span style="color: hsl(120, 100%, 40%);">+   mode static</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%);">+OsmoBSC# ### Check that 'power-ctrl' node and its commands exist</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC# configure terminal</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config)# network</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-net)# bts 0</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-net-bts)# list with-flags</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  . ...  (bs-power-control|ms-power-control)</span><br><span style="color: hsl(120, 100%, 40%);">+  . ..l  no (bs-power-control|ms-power-control)</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%);">+OsmoBSC(config-net-bts)# bs-power-control</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# list with-flags</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  . lv  mode (static|dyn-bts) [reset]</span><br><span style="color: hsl(120, 100%, 40%);">+  . lv  step-size inc <2-6> red <2-4></span><br><span style="color: hsl(120, 100%, 40%);">+  . lv  rxlev-thresh lower <0-63> upper <0-63></span><br><span style="color: hsl(120, 100%, 40%);">+  . lv  rxqual-thresh lower <0-7> upper <0-7></span><br><span style="color: hsl(120, 100%, 40%);">+  . lv  rxlev-thresh-comp lower <0-31> <0-31> upper <0-31> <0-31></span><br><span style="color: hsl(120, 100%, 40%);">+  . lv  rxqual-thresh-comp lower <0-31> <0-31> upper <0-31> <0-31></span><br><span style="color: hsl(120, 100%, 40%);">+  . lv  no (rxlev-avg|rxqual-avg)</span><br><span style="color: hsl(120, 100%, 40%);">+  . lv  (rxlev-avg|rxqual-avg) params hreqave <1-31> hreqt <1-31></span><br><span style="color: hsl(120, 100%, 40%);">+  . lv  (rxlev-avg|rxqual-avg) algo (unweighted|weighted|mod-median)</span><br><span style="color: hsl(120, 100%, 40%);">+  . lv  (rxlev-avg|rxqual-avg) algo osmo-ewma beta <1-99></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# ### Check default BS Power Parameters</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# mode dyn-bts</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  bs-power-control</span><br><span style="color: hsl(120, 100%, 40%);">+   mode dyn-bts</span><br><span style="color: hsl(120, 100%, 40%);">+   step-size inc 4 red 2</span><br><span style="color: hsl(120, 100%, 40%);">+   rxlev-thresh lower 32 upper 38</span><br><span style="color: hsl(120, 100%, 40%);">+   rxlev-thresh-comp lower 10 12 upper 19 20</span><br><span style="color: hsl(120, 100%, 40%);">+   no rxlev-avg</span><br><span style="color: hsl(120, 100%, 40%);">+   rxqual-thresh lower 0 upper 3</span><br><span style="color: hsl(120, 100%, 40%);">+   rxqual-thresh-comp lower 5 7 upper 15 18</span><br><span style="color: hsl(120, 100%, 40%);">+   no rxqual-avg</span><br><span style="color: hsl(120, 100%, 40%);">+  ms-power-control</span><br><span style="color: hsl(120, 100%, 40%);">+   mode static</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%);">+OsmoBSC(config-power-ctrl)# exit</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-net-bts)# ms-power-control</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# list with-flags</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  . lv  mode (static|dyn-bts) [reset]</span><br><span style="color: hsl(120, 100%, 40%);">+  . lv  step-size inc <2-6> red <2-4></span><br><span style="color: hsl(120, 100%, 40%);">+  . lv  rxlev-thresh lower <0-63> upper <0-63></span><br><span style="color: hsl(120, 100%, 40%);">+  . lv  rxqual-thresh lower <0-7> upper <0-7></span><br><span style="color: hsl(120, 100%, 40%);">+  . lv  rxlev-thresh-comp lower <0-31> <0-31> upper <0-31> <0-31></span><br><span style="color: hsl(120, 100%, 40%);">+  . lv  rxqual-thresh-comp lower <0-31> <0-31> upper <0-31> <0-31></span><br><span style="color: hsl(120, 100%, 40%);">+  . lv  no (rxlev-avg|rxqual-avg)</span><br><span style="color: hsl(120, 100%, 40%);">+  . lv  (rxlev-avg|rxqual-avg) params hreqave <1-31> hreqt <1-31></span><br><span style="color: hsl(120, 100%, 40%);">+  . lv  (rxlev-avg|rxqual-avg) algo (unweighted|weighted|mod-median)</span><br><span style="color: hsl(120, 100%, 40%);">+  . lv  (rxlev-avg|rxqual-avg) algo osmo-ewma beta <1-99></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# ### Check default MS Power Parameters</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# mode dyn-bts</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  bs-power-control</span><br><span style="color: hsl(120, 100%, 40%);">+   mode dyn-bts</span><br><span style="color: hsl(120, 100%, 40%);">+   step-size inc 4 red 2</span><br><span style="color: hsl(120, 100%, 40%);">+   rxlev-thresh lower 32 upper 38</span><br><span style="color: hsl(120, 100%, 40%);">+   rxlev-thresh-comp lower 10 12 upper 19 20</span><br><span style="color: hsl(120, 100%, 40%);">+   no rxlev-avg</span><br><span style="color: hsl(120, 100%, 40%);">+   rxqual-thresh lower 0 upper 3</span><br><span style="color: hsl(120, 100%, 40%);">+   rxqual-thresh-comp lower 5 7 upper 15 18</span><br><span style="color: hsl(120, 100%, 40%);">+   no rxqual-avg</span><br><span style="color: hsl(120, 100%, 40%);">+  ms-power-control</span><br><span style="color: hsl(120, 100%, 40%);">+   mode dyn-bts</span><br><span style="color: hsl(120, 100%, 40%);">+   step-size inc 4 red 2</span><br><span style="color: hsl(120, 100%, 40%);">+   rxlev-thresh lower 32 upper 38</span><br><span style="color: hsl(120, 100%, 40%);">+   rxlev-thresh-comp lower 10 12 upper 19 20</span><br><span style="color: hsl(120, 100%, 40%);">+   no rxlev-avg</span><br><span style="color: hsl(120, 100%, 40%);">+   rxqual-thresh lower 0 upper 3</span><br><span style="color: hsl(120, 100%, 40%);">+   rxqual-thresh-comp lower 5 7 upper 15 18</span><br><span style="color: hsl(120, 100%, 40%);">+   no rxqual-avg</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%);">+OsmoBSC(config-power-ctrl)# step-size inc 5 red 4</span><br><span style="color: hsl(120, 100%, 40%);">+% Power change step size must be an even number</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# step-size inc 2 red 3</span><br><span style="color: hsl(120, 100%, 40%);">+% Power change step size must be an even number</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# step-size inc 2 red 4</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  bs-power-control</span><br><span style="color: hsl(120, 100%, 40%);">+   mode dyn-bts</span><br><span style="color: hsl(120, 100%, 40%);">+   step-size inc 4 red 2</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  ms-power-control</span><br><span style="color: hsl(120, 100%, 40%);">+   mode dyn-bts</span><br><span style="color: hsl(120, 100%, 40%);">+   step-size inc 2 red 4</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%);">+OsmoBSC(config-power-ctrl)# rxlev-thresh lower?</span><br><span style="color: hsl(120, 100%, 40%);">+  lower  Lower RxLev value (default is 32, i.e. -78 dBm)</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# rxlev-thresh lower ?</span><br><span style="color: hsl(120, 100%, 40%);">+  <0-63>  Lower RxLev value (signal strength, 0 is worst, 63 is best)</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# rxlev-thresh lower 30 upper?</span><br><span style="color: hsl(120, 100%, 40%);">+  upper  Upper RxLev value (default is 38, i.e. -72 dBm)</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# rxlev-thresh lower 30 upper ?</span><br><span style="color: hsl(120, 100%, 40%);">+  <0-63>  Upper RxLev value (signal strength, 0 is worst, 63 is best)</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# rxlev-thresh lower 30 upper 63</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  bs-power-control</span><br><span style="color: hsl(120, 100%, 40%);">+... !rxlev-thresh</span><br><span style="color: hsl(120, 100%, 40%);">+   rxlev-thresh lower 32 upper 38</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  ms-power-control</span><br><span style="color: hsl(120, 100%, 40%);">+... !rxlev-thresh</span><br><span style="color: hsl(120, 100%, 40%);">+   rxlev-thresh lower 30 upper 63</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%);">+OsmoBSC(config-power-ctrl)# rxqual-thresh lower?</span><br><span style="color: hsl(120, 100%, 40%);">+  lower  Lower RxQual value (default is 0, i.e. BER < 0.2%)</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# rxqual-thresh lower ?</span><br><span style="color: hsl(120, 100%, 40%);">+  <0-7>  Lower RxQual value (signal quality, 0 is best, 7 is worst)</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# rxqual-thresh lower 0 upper?</span><br><span style="color: hsl(120, 100%, 40%);">+  upper  Upper RxQual value (default is 3, i.e. 0.8% <= BER < 1.6%)</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# rxqual-thresh lower 0 upper ?</span><br><span style="color: hsl(120, 100%, 40%);">+  <0-7>  Upper RxQual value (signal quality, 0 is best, 7 is worst)</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# rxqual-thresh lower 0 upper 7</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  bs-power-control</span><br><span style="color: hsl(120, 100%, 40%);">+... !rxqual-thresh</span><br><span style="color: hsl(120, 100%, 40%);">+   rxqual-thresh lower 0 upper 3</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  ms-power-control</span><br><span style="color: hsl(120, 100%, 40%);">+... !rxqual-thresh</span><br><span style="color: hsl(120, 100%, 40%);">+   rxqual-thresh lower 0 upper 7</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%);">+OsmoBSC(config-power-ctrl)# rxlev-avg algo osmo-ewma beta 50</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# rxqual-avg algo unweighted</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  bs-power-control</span><br><span style="color: hsl(120, 100%, 40%);">+... !(rxlev-avg|rxqual-avg)</span><br><span style="color: hsl(120, 100%, 40%);">+   no rxlev-avg</span><br><span style="color: hsl(120, 100%, 40%);">+... !(rxlev-avg|rxqual-avg)</span><br><span style="color: hsl(120, 100%, 40%);">+   no rxqual-avg</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  ms-power-control</span><br><span style="color: hsl(120, 100%, 40%);">+... !(rxlev-avg|rxqual-avg)</span><br><span style="color: hsl(120, 100%, 40%);">+   rxlev-avg algo osmo-ewma beta 50</span><br><span style="color: hsl(120, 100%, 40%);">+   rxlev-avg params hreqave 4 hreqt 6</span><br><span style="color: hsl(120, 100%, 40%);">+... !(rxlev-avg|rxqual-avg)</span><br><span style="color: hsl(120, 100%, 40%);">+   rxqual-avg algo unweighted</span><br><span style="color: hsl(120, 100%, 40%);">+   rxqual-avg params hreqave 4 hreqt 6</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%);">+OsmoBSC(config-power-ctrl)# rxlev-avg params hreqave 2 hreqt 20</span><br><span style="color: hsl(120, 100%, 40%);">+% Hreqave (2) * Hreqt (20) = 40 must be < 32</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# rxlev-avg params hreqave 2 hreqt 15</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  bs-power-control</span><br><span style="color: hsl(120, 100%, 40%);">+... !rxlev-avg params</span><br><span style="color: hsl(120, 100%, 40%);">+  ms-power-control</span><br><span style="color: hsl(120, 100%, 40%);">+... !rxlev-avg params</span><br><span style="color: hsl(120, 100%, 40%);">+   rxlev-avg params hreqave 2 hreqt 15</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%);">+OsmoBSC(config-power-ctrl)# exit</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-net-bts)# ### Disable BS/MS Power Control</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-net-bts)# no bs-power-control</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-net-bts)# no ms-power-control</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-net-bts)# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  no bs-power-control</span><br><span style="color: hsl(120, 100%, 40%);">+  no ms-power-control</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%);">+OsmoBSC(config-net-bts)# bs-power-control</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# mode static reset</span><br><span style="color: hsl(120, 100%, 40%);">+% Reset to default parameters</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# exit</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-net-bts)# ms-power-control</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# mode static reset</span><br><span style="color: hsl(120, 100%, 40%);">+% Reset to default parameters</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-power-ctrl)# exit</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-net-bts)# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  bs-power-control</span><br><span style="color: hsl(120, 100%, 40%);">+   mode static</span><br><span style="color: hsl(120, 100%, 40%);">+  ms-power-control</span><br><span style="color: hsl(120, 100%, 40%);">+   mode static</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/21685">change 21685</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/+/21685"/><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: Ifd6ea29c3b9dbaccf92856131d5fb2e352b84eb2 </div>
<div style="display:none"> Gerrit-Change-Number: 21685 </div>
<div style="display:none"> Gerrit-PatchSet: 7 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>