<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/24739">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">power_control: add separate 'bs-power-c0' command for C0<br><br>The BCCH carrier (sometimes called C0) of a BTS shall maintain<br>discontinuous Downlink transmission at full power in order to<br>stay 'visible' for the mobile stations.  Because of that, early<br>versions of 3GPP TS 45.008 prohibited BS power reduction on C0.<br><br>However, in the recent 3GPP TS 45.008 there is a feature called<br>'BCCH carrier power reduction operation'.  This is a special<br>mode of operation, where the variation of RF level for some<br>timeslots is relaxed for the purpose of energy saving.<br><br>In BCCH carrier power reduction operation, for timeslots on the<br>C0 carrier, except timeslots carrying BCCH/CCCH, the output power<br>may be lower than the output power used for timeslots carrying<br>BCCH/CCCH.  In this case the maximum allowed difference in output<br>power actually transmitted by the BTS is 6 dB.<br><br>Introduce a new 'bs-power-c0' configuration command, complementing<br>the existing 'bs-power' command, in order to allow constrained BS<br>power reduction on the BCCH carriers.<br><br>Change-Id: Id7c2cf80309532f57621342826acc0e9639733cd<br>Related: SYS#4919<br>---<br>M include/osmocom/bsc/gsm_data.h<br>M src/osmo-bsc/bsc_vty.c<br>M src/osmo-bsc/gsm_data.c<br>M src/osmo-bsc/lchan_fsm.c<br>M tests/power_ctrl.vty<br>5 files changed, 72 insertions(+), 11 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/39/24739/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h</span><br><span>index 1755b92..379a5d2 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -1452,10 +1452,14 @@</span><br><span>  /* Power Control mode to be used by the BTS */</span><br><span>       enum gsm_power_ctrl_mode mode;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      /* BS Power reduction value / maximum (in dB) */</span><br><span style="color: hsl(120, 100%, 40%);">+      /* BS Power reduction value / maximum (in dB) for Cx */</span><br><span>      uint8_t bs_power_val_db; /* for static mode */</span><br><span>       uint8_t bs_power_max_db; /* for dynamic mode */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   /* BS Power reduction value / maximum (in dB) for C0 */</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t bs_power_c0_val_db; /* for static mode */</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t bs_power_c0_max_db; /* for dynamic mode */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         /* Power change step size (dynamic mode only) */</span><br><span>     uint8_t inc_step_size_db; /* increasing direction */</span><br><span>         uint8_t red_step_size_db; /* reducing direction */</span><br><span>diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c</span><br><span>index 1ec34bc..c26b15b 100644</span><br><span>--- a/src/osmo-bsc/bsc_vty.c</span><br><span>+++ b/src/osmo-bsc/bsc_vty.c</span><br><span>@@ -987,12 +987,16 @@</span><br><span>              cfg_out(" mode static%s", VTY_NEWLINE);</span><br><span>            if (cp->dir == GSM_PWR_CTRL_DIR_DL && cp->bs_power_val_db != 0)</span><br><span>                        cfg_out(" bs-power static %u%s", cp->bs_power_val_db, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (cp->dir == GSM_PWR_CTRL_DIR_DL && cp->bs_power_c0_val_db != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                      cfg_out(" bs-power-c0 static %u%s", cp->bs_power_c0_val_db, VTY_NEWLINE);</span><br><span>               break;</span><br><span>       case GSM_PWR_CTRL_MODE_DYN_BTS:</span><br><span>              cfg_out("%s%s", node_name, VTY_NEWLINE);</span><br><span>           cfg_out(" mode dyn-bts%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-              if (cp->dir == GSM_PWR_CTRL_DIR_DL)</span><br><span style="color: hsl(120, 100%, 40%);">+                if (cp->dir == GSM_PWR_CTRL_DIR_DL) {</span><br><span>                     cfg_out(" bs-power dyn-max %u%s", cp->bs_power_max_db, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+                     cfg_out(" bs-power-c0 dyn-max %u%s", cp->bs_power_c0_max_db, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span> </span><br><span>                if (cp->ctrl_interval > 0)</span><br><span>                     cfg_out(" ctrl-interval %u%s", cp->ctrl_interval, VTY_NEWLINE);</span><br><span>@@ -5120,14 +5124,33 @@</span><br><span>               return CMD_WARNING;</span><br><span>  }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (dynamic) /* maximum value */</span><br><span style="color: hsl(0, 100%, 40%);">-                params->bs_power_max_db = value;</span><br><span style="color: hsl(0, 100%, 40%);">-     else /* static (fixed) value */</span><br><span style="color: hsl(0, 100%, 40%);">-         params->bs_power_val_db = value;</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!strncmp(self->string, "bs-power-c0", 11)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         if (dynamic) /* maximum value for C0 */</span><br><span style="color: hsl(120, 100%, 40%);">+                       params->bs_power_c0_max_db = value;</span><br><span style="color: hsl(120, 100%, 40%);">+                else /* static (fixed) value for C0 */</span><br><span style="color: hsl(120, 100%, 40%);">+                        params->bs_power_c0_val_db = value;</span><br><span style="color: hsl(120, 100%, 40%);">+        } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (dynamic) /* maximum value for Cx */</span><br><span style="color: hsl(120, 100%, 40%);">+                       params->bs_power_max_db = value;</span><br><span style="color: hsl(120, 100%, 40%);">+           else /* static (fixed) value for Cx */</span><br><span style="color: hsl(120, 100%, 40%);">+                        params->bs_power_val_db = value;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span> </span><br><span>        return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_USRATTR(cfg_power_ctrl_bs_power_c0,</span><br><span style="color: hsl(120, 100%, 40%);">+             cfg_power_ctrl_bs_power_c0_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%);">+            "bs-power-c0 (static|dyn-max) <0-6>",</span><br><span style="color: hsl(120, 100%, 40%);">+         "BS Power IE value to be sent to the C0 (BCCH carrier) of the BTS\n"</span><br><span style="color: hsl(120, 100%, 40%);">+        "Fixed BS Power reduction value (for static mode)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+        "Maximum BS Power reduction value (for dynamic mode)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+             "BS Power reduction value (in dB, even numbers only)\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   return cfg_power_ctrl_bs_power(self, vty, argc, argv);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> DEFUN_USRATTR(cfg_power_ctrl_ctrl_interval,</span><br><span>         cfg_power_ctrl_ctrl_interval_cmd,</span><br><span>            X(BSC_VTY_ATTR_VENDOR_SPECIFIC) |</span><br><span>@@ -8132,6 +8155,7 @@</span><br><span>      install_node(&power_ctrl_node, dummy_config_write);</span><br><span>      install_element(POWER_CTRL_NODE, &cfg_power_ctrl_mode_cmd);</span><br><span>      install_element(POWER_CTRL_NODE, &cfg_power_ctrl_bs_power_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+   install_element(POWER_CTRL_NODE, &cfg_power_ctrl_bs_power_c0_cmd);</span><br><span>       install_element(POWER_CTRL_NODE, &cfg_power_ctrl_ctrl_interval_cmd);</span><br><span>     install_element(POWER_CTRL_NODE, &cfg_power_ctrl_step_size_cmd);</span><br><span>         install_element(POWER_CTRL_NODE, &cfg_power_ctrl_rxlev_thresh_cmd);</span><br><span>diff --git a/src/osmo-bsc/gsm_data.c b/src/osmo-bsc/gsm_data.c</span><br><span>index 0d1395c..31e00a9 100644</span><br><span>--- a/src/osmo-bsc/gsm_data.c</span><br><span>+++ b/src/osmo-bsc/gsm_data.c</span><br><span>@@ -1136,10 +1136,14 @@</span><br><span>   /* Static Power Control is the safe default */</span><br><span>       .mode = GSM_PWR_CTRL_MODE_STATIC,</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* BS Power reduction value / maximum (in dB) */</span><br><span style="color: hsl(120, 100%, 40%);">+      /* BS Power reduction value / maximum (in dB) for Cx */</span><br><span>      .bs_power_val_db = 0,  /* no attenuation in static mode */</span><br><span>   .bs_power_max_db = 12, /* up to 12 dB in dynamic mode */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  /* BS Power reduction value / maximum (in dB) for C0 */</span><br><span style="color: hsl(120, 100%, 40%);">+       .bs_power_c0_val_db = 0, /* no attenuation in static mode */</span><br><span style="color: hsl(120, 100%, 40%);">+  .bs_power_c0_max_db = 0, /* no attenuation in dynamic mode */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      /* Power increasing/reducing step size */</span><br><span>    .inc_step_size_db = 4, /* 2, 4, or 6 dB */</span><br><span>   .red_step_size_db = 2, /* 2 or 4 dB */</span><br><span>diff --git a/src/osmo-bsc/lchan_fsm.c b/src/osmo-bsc/lchan_fsm.c</span><br><span>index 03ccec0..6b30205 100644</span><br><span>--- a/src/osmo-bsc/lchan_fsm.c</span><br><span>+++ b/src/osmo-bsc/lchan_fsm.c</span><br><span>@@ -669,10 +669,17 @@</span><br><span>           * - TA is still zero, to be determined by RACH. */</span><br><span> </span><br><span>              /* Default BS Power reduction value (in 2 dB steps) */</span><br><span style="color: hsl(0, 100%, 40%);">-          if (bts->bs_power_ctrl.mode == GSM_PWR_CTRL_MODE_DYN_BTS)</span><br><span style="color: hsl(0, 100%, 40%);">-                    lchan->bs_power_db = bts->bs_power_ctrl.bs_power_max_db;</span><br><span style="color: hsl(0, 100%, 40%);">-          else</span><br><span style="color: hsl(0, 100%, 40%);">-                    lchan->bs_power_db = bts->bs_power_ctrl.bs_power_val_db;</span><br><span style="color: hsl(120, 100%, 40%);">+                if (bts->bs_power_ctrl.mode == GSM_PWR_CTRL_MODE_DYN_BTS) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (lchan->trx == bts->c0)</span><br><span style="color: hsl(120, 100%, 40%);">+                              lchan->bs_power_db = bts->bs_power_ctrl.bs_power_c0_max_db;</span><br><span style="color: hsl(120, 100%, 40%);">+                     else</span><br><span style="color: hsl(120, 100%, 40%);">+                          lchan->bs_power_db = bts->bs_power_ctrl.bs_power_max_db;</span><br><span style="color: hsl(120, 100%, 40%);">+                } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (lchan->trx == bts->c0)</span><br><span style="color: hsl(120, 100%, 40%);">+                              lchan->bs_power_db = bts->bs_power_ctrl.bs_power_c0_val_db;</span><br><span style="color: hsl(120, 100%, 40%);">+                     else</span><br><span style="color: hsl(120, 100%, 40%);">+                          lchan->bs_power_db = bts->bs_power_ctrl.bs_power_val_db;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span>    }</span><br><span> </span><br><span>        if (lchan_activate_set_ch_mode_rate_and_mr_config(lchan))</span><br><span>diff --git a/tests/power_ctrl.vty b/tests/power_ctrl.vty</span><br><span>index ff387ce..d268725 100644</span><br><span>--- a/tests/power_ctrl.vty</span><br><span>+++ b/tests/power_ctrl.vty</span><br><span>@@ -29,6 +29,7 @@</span><br><span> ...</span><br><span>   . l.  mode (static|dyn-bts) [reset]</span><br><span>   . l.  bs-power (static|dyn-max) <0-30></span><br><span style="color: hsl(120, 100%, 40%);">+  . l.  bs-power-c0 (static|dyn-max) <0-6></span><br><span>   . lv  ctrl-interval <0-31></span><br><span>   . lv  step-size inc <2-6> red <2-4></span><br><span>   . lv  rxlev-thresh lower <0-63> upper <0-63></span><br><span>@@ -40,19 +41,36 @@</span><br><span>   . lv  (rxlev-avg|rxqual-avg) algo (unweighted|weighted|mod-median)</span><br><span>   . lv  (rxlev-avg|rxqual-avg) algo osmo-ewma beta <1-99></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-bs-power-ctrl)# bs-power?</span><br><span style="color: hsl(120, 100%, 40%);">+  bs-power  BS Power IE value to be sent to the BTS</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-bs-power-ctrl)# bs-power-c0?</span><br><span style="color: hsl(120, 100%, 40%);">+  bs-power-c0  BS Power IE value to be sent to the C0 (BCCH carrier) of the BTS</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> OsmoBSC(config-bs-power-ctrl)# bs-power ?</span><br><span>   static   Fixed BS Power reduction value (for static mode)</span><br><span>   dyn-max  Maximum BS Power reduction value (for dynamic mode)</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-bs-power-ctrl)# bs-power-c0 ?</span><br><span style="color: hsl(120, 100%, 40%);">+  static   Fixed BS Power reduction value (for static mode)</span><br><span style="color: hsl(120, 100%, 40%);">+  dyn-max  Maximum BS Power reduction value (for dynamic mode)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> OsmoBSC(config-bs-power-ctrl)# bs-power static ?</span><br><span>   <0-30>  BS Power reduction value (in dB, even numbers only)</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-bs-power-ctrl)# bs-power-c0 static ?</span><br><span style="color: hsl(120, 100%, 40%);">+  <0-6>  BS Power reduction value (in dB, even numbers only)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> OsmoBSC(config-bs-power-ctrl)# bs-power static 3</span><br><span> % Incorrect BS Power reduction value, an even number is expected</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-bs-power-ctrl)# bs-power-c0 static 30</span><br><span style="color: hsl(120, 100%, 40%);">+% Unknown command.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> OsmoBSC(config-bs-power-ctrl)# bs-power static 6</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-bs-power-ctrl)# bs-power-c0 static 4</span><br><span> OsmoBSC(config-bs-power-ctrl)# show running-config</span><br><span> ...</span><br><span>   bs-power-control</span><br><span>    mode static</span><br><span>    bs-power static 6</span><br><span style="color: hsl(120, 100%, 40%);">+   bs-power-c0 static 4</span><br><span>   ms-power-control</span><br><span>    mode dyn-bts</span><br><span> ... !bs-power</span><br><span>@@ -64,6 +82,7 @@</span><br><span>   bs-power-control</span><br><span>    mode dyn-bts</span><br><span>    bs-power dyn-max 12</span><br><span style="color: hsl(120, 100%, 40%);">+   bs-power-c0 dyn-max 0</span><br><span>    step-size inc 4 red 2</span><br><span>    rxlev-thresh lower 32 upper 38</span><br><span>    rxlev-thresh-comp lower 10 12 upper 19 20</span><br><span>@@ -74,11 +93,13 @@</span><br><span> ...</span><br><span> </span><br><span> OsmoBSC(config-bs-power-ctrl)# bs-power dyn-max 30</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-bs-power-ctrl)# bs-power-c0 dyn-max 6</span><br><span> OsmoBSC(config-bs-power-ctrl)# show running-config</span><br><span> ...</span><br><span>   bs-power-control</span><br><span>    mode dyn-bts</span><br><span>    bs-power dyn-max 30</span><br><span style="color: hsl(120, 100%, 40%);">+   bs-power-c0 dyn-max 6</span><br><span> ... !bs-power</span><br><span>   ms-power-control</span><br><span>    mode dyn-bts</span><br><span>@@ -100,6 +121,7 @@</span><br><span> ...</span><br><span>   . l.  mode (static|dyn-bts) [reset]</span><br><span>   . l.  bs-power (static|dyn-max) <0-30></span><br><span style="color: hsl(120, 100%, 40%);">+  . l.  bs-power-c0 (static|dyn-max) <0-6></span><br><span>   . lv  ctrl-interval <0-31></span><br><span>   . lv  step-size inc <2-6> red <2-4></span><br><span>   . lv  rxlev-thresh lower <0-63> upper <0-63></span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/24739">change 24739</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/+/24739"/><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: Id7c2cf80309532f57621342826acc0e9639733cd </div>
<div style="display:none"> Gerrit-Change-Number: 24739 </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>