<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/21905">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 introspection commands for MS/BS params<br><br>Change-Id: I34095673bf49deb390d5e8383c4ee05a6915b82f<br>Related: SYS#4918<br>---<br>M src/common/vty.c<br>1 file changed, 103 insertions(+), 16 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/common/vty.c b/src/common/vty.c</span><br><span>index 7284bfa..ff7ec12 100644</span><br><span>--- a/src/common/vty.c</span><br><span>+++ b/src/common/vty.c</span><br><span>@@ -1118,6 +1118,66 @@</span><br><span>        return CMD_SUCCESS;</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(vty, 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 dump_dpc_meas_params(struct vty *vty, const unsigned int indent,</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 *pname, const unsigned int pn)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ cfg_out(vty, "Lower threshold (L_%s_XX_P): %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+           pname, mp->lower_thresh, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+     cfg_out(vty, "Upper threshold (U_%s_XX_P): %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+           pname, mp->upper_thresh, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   cfg_out(vty, "Lower threshold comparators: P%u=%02u / N%u=%02u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+          pn, mp->lower_cmp_p, pn, mp->lower_cmp_n, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ cfg_out(vty, "Upper threshold comparators: P%u=%02u / N%u=%02u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+          pn + 1, mp->upper_cmp_p, pn + 1, mp->upper_cmp_n, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       cfg_out(vty, "Pre-processing algorithm: ");</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_UNWEIGHTED:</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "unweighted average%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_MEAS_AVG_ALGO_WEIGHTED:</span><br><span style="color: hsl(120, 100%, 40%);">+             vty_out(vty, "weighted average%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_MEAS_AVG_ALGO_MOD_MEDIAN:</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "modified median%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_MEAS_AVG_ALGO_OSMO_EWMA:</span><br><span style="color: hsl(120, 100%, 40%);">+            vty_out(vty, "EWMA (alpha=%u)%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                   mp->ewma.alpha, 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_NONE:</span><br><span style="color: hsl(120, 100%, 40%);">+         vty_out(vty, "disabled (pass-through)%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</span><br><span style="color: hsl(120, 100%, 40%);">+       default:</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "unknown%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   cfg_out(vty, "Pre-processing parameters: Hreqave=%u / Hreqt=%u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+          mp->h_reqave, mp->h_reqt, 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 dump_dpc_params(struct vty *vty, const 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%);">+        cfg_out(vty, "Power increase step size: %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+              cp->inc_step_size_db, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+        cfg_out(vty, "Power reduce step size: %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                cp->red_step_size_db, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg_out(vty, "RxLev measurement processing:%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+       dump_dpc_meas_params(vty, indent + 2, &cp->rxlev_meas, "RXLEV", 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        cfg_out(vty, "RxQual measurement processing:%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+      dump_dpc_meas_params(vty, indent + 2, &cp->rxqual_meas, "RXQUAL", 3);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void trx_dump_vty(struct vty *vty, const struct gsm_bts_trx *trx)</span><br><span> {</span><br><span>         vty_out(vty, "TRX %u of BTS %u is on ARFCN %u%s",</span><br><span>@@ -1128,6 +1188,19 @@</span><br><span>                 "resulting BS power: %d dBm%s",</span><br><span>            trx->nominal_power, trx->max_power_red,</span><br><span>                trx->nominal_power - trx->max_power_red, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        vty_out(vty, "  BS Power control parameters (%s):%s",</span><br><span style="color: hsl(120, 100%, 40%);">+               trx->bs_dpc_params == &trx->bts->bs_dpc_params ?</span><br><span style="color: hsl(120, 100%, 40%);">+                 "fall-back" : "from BSC",</span><br><span style="color: hsl(120, 100%, 40%);">+         VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ dump_dpc_params(vty, 4, trx->bs_dpc_params);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     vty_out(vty, "  MS Power control parameters (%s):%s",</span><br><span style="color: hsl(120, 100%, 40%);">+               trx->ms_dpc_params == &trx->bts->ms_dpc_params ?</span><br><span style="color: hsl(120, 100%, 40%);">+                 "fall-back" : "from BSC",</span><br><span style="color: hsl(120, 100%, 40%);">+         VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ dump_dpc_params(vty, 4, trx->ms_dpc_params);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    vty_out(vty, "  NM State: ");</span><br><span>      net_dump_nmstate(vty, &trx->mo.nm_state);</span><br><span>     vty_out(vty, "  RSL State: %s%s", trx->rsl_link? "connected" : "disconnected", VTY_NEWLINE);</span><br><span>@@ -1307,47 +1380,61 @@</span><br><span>      }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void lchan_bs_power_ctrl_state_dump(struct vty *vty, const char *prefix,</span><br><span style="color: hsl(120, 100%, 40%);">+static void lchan_bs_power_ctrl_state_dump(struct vty *vty, unsigned int indent,</span><br><span>                                     const struct gsm_lchan *lchan)</span><br><span> {</span><br><span>       const struct lchan_power_ctrl_state *st = &lchan->bs_power_ctrl;</span><br><span>      const struct gsm_bts_trx *trx = lchan->ts->trx;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       vty_out(vty, "%sBS (Downlink) Power Control (%s):%s",</span><br><span style="color: hsl(0, 100%, 40%);">-         prefix, st->fixed ? "fixed" : "autonomous",</span><br><span style="color: hsl(120, 100%, 40%);">+    cfg_out(vty, "BS (Downlink) Power Control (%s):%s",</span><br><span style="color: hsl(120, 100%, 40%);">+         st->fixed ? "fixed" : "autonomous",</span><br><span>           VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ indent += 2;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        vty_out(vty, "%s  Channel reduction: %u dB", prefix, st->current);</span><br><span style="color: hsl(120, 100%, 40%);">+       cfg_out(vty, "Channel reduction: %u dB", st->current);</span><br><span>  if (!st->fixed)</span><br><span>           vty_out(vty, " (max %u dB)", st->max);</span><br><span>  vty_out(vty, "%s", VTY_NEWLINE);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  vty_out(vty, "%s  TRX reduction: %u dB%s",</span><br><span style="color: hsl(0, 100%, 40%);">-            prefix, trx->max_power_red, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+  cfg_out(vty, "TRX reduction: %u dB%s",</span><br><span style="color: hsl(120, 100%, 40%);">+              trx->max_power_red, VTY_NEWLINE);</span><br><span> </span><br><span>     int actual = trx->nominal_power - (trx->max_power_red + st->current);</span><br><span style="color: hsl(0, 100%, 40%);">-  vty_out(vty, "%s  Actual / Nominal power: %d dBm / %d dBm%s",</span><br><span style="color: hsl(0, 100%, 40%);">-         prefix, actual, trx->nominal_power, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+  cfg_out(vty, "Actual / Nominal power: %d dBm / %d dBm%s",</span><br><span style="color: hsl(120, 100%, 40%);">+           actual, trx->nominal_power, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (st->dpc_params == NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+                return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     cfg_out(vty, "Power Control parameters:%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+   dump_dpc_params(vty, indent + 2, st->dpc_params);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void lchan_ms_power_ctrl_state_dump(struct vty *vty, const char *prefix,</span><br><span style="color: hsl(120, 100%, 40%);">+static void lchan_ms_power_ctrl_state_dump(struct vty *vty, unsigned int indent,</span><br><span>                                          const struct gsm_lchan *lchan)</span><br><span> {</span><br><span>       const struct lchan_power_ctrl_state *st = &lchan->ms_power_ctrl;</span><br><span>      const struct gsm_bts_trx *trx = lchan->ts->trx;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       vty_out(vty, "%sMS (Uplink) Power Control (%s):%s",</span><br><span style="color: hsl(0, 100%, 40%);">-           prefix, st->fixed ? "fixed" : "autonomous",</span><br><span style="color: hsl(120, 100%, 40%);">+    cfg_out(vty, "MS (Uplink) Power Control (%s):%s",</span><br><span style="color: hsl(120, 100%, 40%);">+           st->fixed ? "fixed" : "autonomous",</span><br><span>           VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ indent += 2;</span><br><span> </span><br><span>     int current_dbm = ms_pwr_dbm(trx->bts->band, st->current);</span><br><span>  int max_dbm = ms_pwr_dbm(trx->bts->band, st->max);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, "%s  Current power level: %u, -%d dBm",</span><br><span style="color: hsl(0, 100%, 40%);">-          prefix, st->current, current_dbm);</span><br><span style="color: hsl(120, 100%, 40%);">+ cfg_out(vty, "Current power level: %u, -%d dBm",</span><br><span style="color: hsl(120, 100%, 40%);">+            st->current, current_dbm);</span><br><span>        if (!st->fixed)</span><br><span>           vty_out(vty, " (max %u, -%d dBm)", st->max, max_dbm);</span><br><span>   vty_out(vty, "%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (st->dpc_params == NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+                return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     cfg_out(vty, "Power Control parameters:%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+   dump_dpc_params(vty, indent + 2, st->dpc_params);</span><br><span> }</span><br><span> </span><br><span> static void lchan_dump_full_vty(struct vty *vty, const struct gsm_lchan *lchan)</span><br><span>@@ -1420,9 +1507,9 @@</span><br><span>             vty_out(vty, "  RTP/PDCH Loopback Enabled%s", VTY_NEWLINE);</span><br><span>        vty_out(vty, "  Radio Link Failure Counter 'S': %d%s", lchan->s, VTY_NEWLINE);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* BS/MS Power Control state */</span><br><span style="color: hsl(0, 100%, 40%);">- lchan_bs_power_ctrl_state_dump(vty, "  ", lchan);</span><br><span style="color: hsl(0, 100%, 40%);">-     lchan_ms_power_ctrl_state_dump(vty, "  ", lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+   /* BS/MS Power Control state and parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+        lchan_bs_power_ctrl_state_dump(vty, 2, lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+        lchan_ms_power_ctrl_state_dump(vty, 2, lchan);</span><br><span> }</span><br><span> </span><br><span> static void lchan_dump_short_vty(struct vty *vty, const struct gsm_lchan *lchan)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/21905">change 21905</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-bts/+/21905"/><meta itemprop="name" content="View Change"/></div></div>

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