<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/21685">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">vty: add commands for MS/BS Power Control parameters<br><br>Change-Id: Ifd6ea29c3b9dbaccf92856131d5fb2e352b84eb2<br>Related: SYS#4918<br>---<br>M src/osmo-bsc/bsc_vty.c<br>1 file changed, 353 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/85/21685/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c</span><br><span>index c98a254..80cbee0 100644</span><br><span>--- a/src/osmo-bsc/bsc_vty.c</span><br><span>+++ b/src/osmo-bsc/bsc_vty.c</span><br><span>@@ -4828,6 +4828,346 @@</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define BS_POWER_CONTROL_DESC \</span><br><span style="color: hsl(120, 100%, 40%);">+        "BS (Downlink) power control\n"</span><br><span style="color: hsl(120, 100%, 40%);">+#define MS_POWER_CONTROL_DESC \</span><br><span style="color: hsl(120, 100%, 40%);">+    "MS (Uplink) power control\n"</span><br><span style="color: hsl(120, 100%, 40%);">+#define POWER_CONTROL_DESC \</span><br><span style="color: hsl(120, 100%, 40%);">+ BS_POWER_CONTROL_DESC MS_POWER_CONTROL_DESC</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define POWER_CONTROL_PARAMS(trx) \</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%);">+              &trx->bs_power_ctrl : &trx->ms_power_ctrl</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_USRATTR(cfg_trx_no_power_ctrl,</span><br><span style="color: hsl(120, 100%, 40%);">+             cfg_trx_no_power_ctrl_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_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 trx_power_ctrl_params *params;</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%);">+    params = POWER_CONTROL_PARAMS(trx);</span><br><span style="color: hsl(120, 100%, 40%);">+   params->mode = TRX_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_USRATTR(cfg_trx_power_ctrl_mode,</span><br><span style="color: hsl(120, 100%, 40%);">+            cfg_trx_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%);">+            POWER_CONTROL_CMD " mode (static|dyn-bts)",</span><br><span style="color: hsl(120, 100%, 40%);">+         POWER_CONTROL_DESC "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%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct trx_power_ctrl_params *params;</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%);">+    params = POWER_CONTROL_PARAMS(trx);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (strcmp(argv[1], "static") == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+         params->mode = TRX_PWR_CTRL_MODE_STATIC;</span><br><span style="color: hsl(120, 100%, 40%);">+   else if (strcmp(argv[1], "dyn-bts") == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+           params->mode = TRX_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_trx_power_ctrl_step_size,</span><br><span style="color: hsl(120, 100%, 40%);">+       cfg_trx_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%);">+            POWER_CONTROL_CMD " step-size inc <2-6> red <2-4>",</span><br><span style="color: hsl(120, 100%, 40%);">+             POWER_CONTROL_DESC "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 trx_power_ctrl_params *params;</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%);">+    if (atoi(argv[1]) % 2 || atoi(argv[2]) % 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 = POWER_CONTROL_PARAMS(trx);</span><br><span style="color: hsl(120, 100%, 40%);">+   params->inc_step_size_db = atoi(argv[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+  params->red_step_size_db = atoi(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%);">+#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_trx_power_ctrl_rxlev_thresh,</span><br><span style="color: hsl(120, 100%, 40%);">+        cfg_trx_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%);">+            POWER_CONTROL_CMD " rxlev-thresh lower <0-63> upper <0-63>",</span><br><span style="color: hsl(120, 100%, 40%);">+            POWER_CONTROL_DESC "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 trx_power_ctrl_params *params;</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 lower = atoi(argv[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+    int upper = atoi(argv[2]);</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 = POWER_CONTROL_PARAMS(trx);</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_trx_power_ctrl_rxqual_thresh,</span><br><span style="color: hsl(120, 100%, 40%);">+           cfg_trx_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%);">+            POWER_CONTROL_CMD " rxqual-thresh lower <0-7> upper <0-7>",</span><br><span style="color: hsl(120, 100%, 40%);">+             POWER_CONTROL_DESC "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 trx_power_ctrl_params *params;</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 lower = atoi(argv[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+    int upper = atoi(argv[2]);</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 = POWER_CONTROL_PARAMS(trx);</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%);">+  POWER_CONTROL_CMD " " 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%);">+        POWER_CONTROL_DESC "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_trx_power_ctrl_rxlev_thresh_comp,</span><br><span style="color: hsl(120, 100%, 40%);">+             cfg_trx_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 trx_power_ctrl_params *params;</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 lower_cmp_p = atoi(argv[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+      int lower_cmp_n = atoi(argv[2]);</span><br><span style="color: hsl(120, 100%, 40%);">+      int upper_cmp_p = atoi(argv[3]);</span><br><span style="color: hsl(120, 100%, 40%);">+      int upper_cmp_n = atoi(argv[4]);</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 = POWER_CONTROL_PARAMS(trx);</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_trx_power_ctrl_rxqual_thresh_comp,</span><br><span style="color: hsl(120, 100%, 40%);">+              cfg_trx_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 trx_power_ctrl_params *params;</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 lower_cmp_p = atoi(argv[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+      int lower_cmp_n = atoi(argv[2]);</span><br><span style="color: hsl(120, 100%, 40%);">+      int upper_cmp_p = atoi(argv[3]);</span><br><span style="color: hsl(120, 100%, 40%);">+      int upper_cmp_n = atoi(argv[4]);</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 = POWER_CONTROL_PARAMS(trx);</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%);">+        POWER_CONTROL_CMD " (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%);">+  POWER_CONTROL_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[1], "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_trx_no_power_ctrl_avg,</span><br><span style="color: hsl(120, 100%, 40%);">+        cfg_trx_no_power_ctrl_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 trx_power_ctrl_meas_params *avg_params;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct trx_power_ctrl_params *params;</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%);">+    params = POWER_CONTROL_PARAMS(trx);</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 = TRX_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_trx_power_ctrl_avg_params,</span><br><span style="color: hsl(120, 100%, 40%);">+              cfg_trx_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 trx_power_ctrl_meas_params *avg_params;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct trx_power_ctrl_params *params;</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 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%);">+   params = POWER_CONTROL_PARAMS(trx);</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_trx_power_ctrl_avg_algo,</span><br><span style="color: hsl(120, 100%, 40%);">+        cfg_trx_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 trx_power_ctrl_meas_params *avg_params;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct trx_power_ctrl_params *params;</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%);">+    params = POWER_CONTROL_PARAMS(trx);</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[2], "unweighted") == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+             avg_params->algo = TRX_PWR_CTRL_MEAS_AVG_ALGO_UNWEIGHTED;</span><br><span style="color: hsl(120, 100%, 40%);">+  else if (strcmp(argv[2], "weighted") == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          avg_params->algo = TRX_PWR_CTRL_MEAS_AVG_ALGO_WEIGHTED;</span><br><span style="color: hsl(120, 100%, 40%);">+    else if (strcmp(argv[2], "mod-median") == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                avg_params->algo = TRX_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_trx_power_ctrl_avg_ewma,</span><br><span style="color: hsl(120, 100%, 40%);">+        cfg_trx_power_ctrl_avg_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 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 trx_power_ctrl_meas_params *avg_params;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct trx_power_ctrl_params *params;</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%);">+    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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   params = POWER_CONTROL_PARAMS(trx);</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 = TRX_PWR_CTRL_MEAS_AVG_ALGO_EWMA;</span><br><span style="color: hsl(120, 100%, 40%);">+        avg_params->ewma.alpha = atoi(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> /* NOTE: This requires a full restart as bsc_network_configure() is executed</span><br><span>  * only once on startup from osmo_bsc_main.c */</span><br><span> DEFUN(cfg_trx_rsl_e1,</span><br><span>@@ -7205,6 +7545,19 @@</span><br><span>        install_element(TRX_NODE, &cfg_trx_rsl_e1_tei_cmd);</span><br><span>      install_element(TRX_NODE, &cfg_trx_rf_locked_cmd);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    install_element(TRX_NODE, &cfg_trx_no_power_ctrl_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+    install_element(TRX_NODE, &cfg_trx_power_ctrl_mode_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+  install_element(TRX_NODE, &cfg_trx_power_ctrl_step_size_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+     install_element(TRX_NODE, &cfg_trx_power_ctrl_rxlev_thresh_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+  install_element(TRX_NODE, &cfg_trx_power_ctrl_rxqual_thresh_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ install_element(TRX_NODE, &cfg_trx_power_ctrl_rxlev_thresh_comp_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+     install_element(TRX_NODE, &cfg_trx_power_ctrl_rxqual_thresh_comp_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  install_element(TRX_NODE, &cfg_trx_no_power_ctrl_avg_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+        install_element(TRX_NODE, &cfg_trx_power_ctrl_avg_params_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+    install_element(TRX_NODE, &cfg_trx_power_ctrl_avg_algo_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+      install_element(TRX_NODE, &cfg_trx_power_ctrl_avg_ewma_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   install_element(TRX_NODE, &cfg_ts_cmd);</span><br><span>  install_node(&ts_node, dummy_config_write);</span><br><span>      install_element(TS_NODE, &cfg_ts_pchan_cmd);</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: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>