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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">MS Power Control Loop: Use P_CON_INTERVAL=2 by default<br><br>Increase the reaction time at the expense of more stable loop with less<br>temporary oscillations.<br><br>See updated user manual documentation in this commit for a larger<br>description.<br><br>Related: SYS#5371<br>Change-Id: I46be244a5e01a74086e3a977ec3ea139742a0074<br>---<br>M doc/manuals/chapters/power_control.adoc<br>M include/osmocom/bsc/gsm_data.h<br>M src/osmo-bsc/bts.c<br>M src/osmo-bsc/bts_vty.c<br>M src/osmo-bsc/gsm_data.c<br>M tests/power_ctrl.vty<br>6 files changed, 69 insertions(+), 33 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/doc/manuals/chapters/power_control.adoc b/doc/manuals/chapters/power_control.adoc</span><br><span>index 51a38cb..f94dd2e 100644</span><br><span>--- a/doc/manuals/chapters/power_control.adoc</span><br><span>+++ b/doc/manuals/chapters/power_control.adoc</span><br><span>@@ -168,6 +168,23 @@</span><br><span>   <0-31>  P_CON_INTERVAL, in units of 2 SACCH periods (0.96 seconds)</span><br><span> ----</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+3GPP TS 45.008 briefly mentions this parameter in table A.1 (`P_Con_INTERVAL`).</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+A small time graph is depicted below for better understanding of the meaning of</span><br><span style="color: hsl(120, 100%, 40%);">+values for this parameter, since it is not obvious at all.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.Example: Suspension interval accomplished by several values of P_CON_INTERVAL</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+|<-->| - one SACCH multi-frame period</span><br><span style="color: hsl(120, 100%, 40%);">+|    |</span><br><span style="color: hsl(120, 100%, 40%);">+|----|----|----|----|----|----|----|----|----> SACCH multi-frames</span><br><span style="color: hsl(120, 100%, 40%);">+a) *    *    *    *    *    *    *    *    *      P_CON_INTERVAL=0 (0.48 s)</span><br><span style="color: hsl(120, 100%, 40%);">+b) *         *         *         *         *      P_CON_INTERVAL=1 (0.96 s)</span><br><span style="color: hsl(120, 100%, 40%);">+c) *                   *                   *      P_CON_INTERVAL=2 (1.92 s, default)</span><br><span style="color: hsl(120, 100%, 40%);">+d) *                             *                P_CON_INTERVAL=3 (2.88 s)</span><br><span style="color: hsl(120, 100%, 40%);">+e) *                                       *      P_CON_INTERVAL=4 (3.84 s)</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> The value to use for this parameter is closely related to that of VTY option</span><br><span> `step-size inc <2-6> red <2-4>`, which configures the maximum step (in dB) at</span><br><span> which the MS Power can be requested to changed when the MS Power Control Loop is</span><br><span>@@ -181,31 +198,42 @@</span><br><span> By default, increment `step-size` is set to 4 dB and the decrement `step-size`</span><br><span> is set to 2 dB, hence the MS requiring `4 * 60 = 240` milliseconds. That's less</span><br><span> than 1 measurement period (480 ms), hence only the first measurement period</span><br><span style="color: hsl(0, 100%, 40%);">-needs to be skipped. Therefore, the suspension interval is set to 1 for both</span><br><span style="color: hsl(0, 100%, 40%);">-MS/BS power control loops, and so the power control decision is taken every 960</span><br><span style="color: hsl(0, 100%, 40%);">-ms (every second SACCH block period).</span><br><span style="color: hsl(120, 100%, 40%);">+needs to be skipped. Therefore, a suspension interval of 1 for both</span><br><span style="color: hsl(120, 100%, 40%);">+MS/BS power control loops can be used, and so the power control decision is</span><br><span style="color: hsl(120, 100%, 40%);">+taken every 960 ms (every second SACCH block period).</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+However, OsmoBSC currently uses a default value of `ctrl-interval 2`</span><br><span style="color: hsl(120, 100%, 40%);">+(`P_CON_INTERVAL=2`, 1.92s, 3/4 received SACCH blocks are skipped), because</span><br><span style="color: hsl(120, 100%, 40%);">+that's the minimum amount of frames required for one loop step to run</span><br><span style="color: hsl(120, 100%, 40%);">+completely, that is: BTS fetching measurements and transmitting the new MS Power</span><br><span style="color: hsl(120, 100%, 40%);">+Level, then the MS retrieving the MS Power Level, transmitting with that exact</span><br><span style="color: hsl(120, 100%, 40%);">+MS Power level during the entire period and then finally submitting the</span><br><span style="color: hsl(120, 100%, 40%);">+Measurement Result containing that same MS Power Level. Using a value of</span><br><span style="color: hsl(120, 100%, 40%);">+`P_CON_INTERVAL=1` also provides good results, but in that case the loop tends</span><br><span style="color: hsl(120, 100%, 40%);">+to produce more temporary power oscillations due to the loop acting on periods</span><br><span style="color: hsl(120, 100%, 40%);">+where an older (earlier requested) MS Power level is still in use (and</span><br><span style="color: hsl(120, 100%, 40%);">+announced) by the MS.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.Example: Timeline showing propagation of a new MS Power Level (P_CON_INTERVAL=2)</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+|<------------->| - one SACCH multi-frame period</span><br><span style="color: hsl(120, 100%, 40%);">+| 1             | 2             | 3             | 4             | ---> SACCH multi-frames</span><br><span style="color: hsl(120, 100%, 40%);">+|SA0|SA1|SA2|SA3|SA0|SA1|SA2|SA3|SA0|SA1|SA2|SA3|SA0|SA1|SA2|SA3| ---> SACCH bursts</span><br><span style="color: hsl(120, 100%, 40%);">+|<1>|...|...|<2>|<3>|...|...|<4>|<5>|...|...|<6>|<7>|...|...|<8>|</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+<1> BTS sends new requested MS Power Level in header of SACCH</span><br><span style="color: hsl(120, 100%, 40%);">+<2> MS receives SACCH block (new MS Power Level)</span><br><span style="color: hsl(120, 100%, 40%);">+<3> MS starts ramping towards new MS Power Level (hence potentially variable power used over the period)</span><br><span style="color: hsl(120, 100%, 40%);">+<4> MS should already be in desired MS Power Level (for step increments of less-or-equal than 8 dB)</span><br><span style="color: hsl(120, 100%, 40%);">+<5> MS starts transmitting at desired MS Power level constantly (ramping is over)</span><br><span style="color: hsl(120, 100%, 40%);">+<6> MS builds Measurement Results to be sent on next SACCH period</span><br><span style="color: hsl(120, 100%, 40%);">+<7> MS sends the Measurement Results of the previous multiframe to the BTS</span><br><span style="color: hsl(120, 100%, 40%);">+<8> BTS receives the Measurement Results from MS on SACCH, starts next loop iteration</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span> Setting `ctrl-interval` to 0 increases the interval to 480 ms, so basically no</span><br><span> SACCH block is skipped and MS Power Control loop is triggered upon receival of</span><br><span style="color: hsl(0, 100%, 40%);">-every UL SACCH block. Value 2 corresponds to the interval of 1920 ms, so 3/4</span><br><span style="color: hsl(0, 100%, 40%);">-received SACCH blocks are skipped.</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-3GPP TS 45.008 briefly mentions this parameter in table A.1 (`P_Con_INTERVAL`).</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-A small time graph is depicted below for better understanding of the meaning of</span><br><span style="color: hsl(0, 100%, 40%);">-values for this parameter, since it is not obvious at all.</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-.Example: Suspension interval accomplished by several values of P_CON_INTERVAL</span><br><span>-----</span><br><span style="color: hsl(0, 100%, 40%);">-|<-->| - one SACCH multi-frame period</span><br><span style="color: hsl(0, 100%, 40%);">-|    |</span><br><span style="color: hsl(0, 100%, 40%);">-|----|----|----|----|----|----|----|----|----> SACCH multi-frames</span><br><span style="color: hsl(0, 100%, 40%);">-a) *    *    *    *    *    *    *    *    *      P_CON_INTERVAL=0 (0.48 s)</span><br><span style="color: hsl(0, 100%, 40%);">-b) *         *         *         *         *      P_CON_INTERVAL=1 (0.96 s, default)</span><br><span style="color: hsl(0, 100%, 40%);">-c) *                   *                   *      P_CON_INTERVAL=2 (1.92 s)</span><br><span style="color: hsl(0, 100%, 40%);">-d) *                             *                P_CON_INTERVAL=3 (2.88 s)</span><br><span style="color: hsl(0, 100%, 40%);">-e) *                                       *      P_CON_INTERVAL=4 (3.84 s)</span><br><span>-----</span><br><span style="color: hsl(120, 100%, 40%);">+every UL SACCH block.</span><br><span> </span><br><span> ==== Power change step size</span><br><span> </span><br><span>diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h</span><br><span>index 99d1d18..cb56028 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -1395,6 +1395,8 @@</span><br><span> };</span><br><span> </span><br><span> extern const struct gsm_power_ctrl_params power_ctrl_params_def;</span><br><span style="color: hsl(120, 100%, 40%);">+void power_ctrl_params_def_reset(struct gsm_power_ctrl_params *params,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 enum gsm_power_ctrl_dir dir);</span><br><span> </span><br><span> /* Interference Measurement Parameters */</span><br><span> struct gsm_interf_meas_params {</span><br><span>diff --git a/src/osmo-bsc/bts.c b/src/osmo-bsc/bts.c</span><br><span>index c0d6634..3f782c1 100644</span><br><span>--- a/src/osmo-bsc/bts.c</span><br><span>+++ b/src/osmo-bsc/bts.c</span><br><span>@@ -351,12 +351,10 @@</span><br><span>      bts->repeated_acch_policy.rxqual = 4;</span><br><span> </span><br><span>         /* MS Power Control parameters (defaults) */</span><br><span style="color: hsl(0, 100%, 40%);">-    bts->ms_power_ctrl = power_ctrl_params_def;</span><br><span style="color: hsl(0, 100%, 40%);">-  bts->ms_power_ctrl.dir = GSM_PWR_CTRL_DIR_UL;</span><br><span style="color: hsl(120, 100%, 40%);">+      power_ctrl_params_def_reset(&bts->ms_power_ctrl, GSM_PWR_CTRL_DIR_UL);</span><br><span> </span><br><span>    /* BS Power Control parameters (defaults) */</span><br><span style="color: hsl(0, 100%, 40%);">-    bts->bs_power_ctrl = power_ctrl_params_def;</span><br><span style="color: hsl(0, 100%, 40%);">-  bts->bs_power_ctrl.dir = GSM_PWR_CTRL_DIR_DL;</span><br><span style="color: hsl(120, 100%, 40%);">+      power_ctrl_params_def_reset(&bts->bs_power_ctrl, GSM_PWR_CTRL_DIR_DL);</span><br><span> </span><br><span>    /* Interference Measurement Parameters (defaults) */</span><br><span>         bts->interf_meas_params_cfg = interf_meas_params_def;</span><br><span>diff --git a/src/osmo-bsc/bts_vty.c b/src/osmo-bsc/bts_vty.c</span><br><span>index 460e14a..a05d965 100644</span><br><span>--- a/src/osmo-bsc/bts_vty.c</span><br><span>+++ b/src/osmo-bsc/bts_vty.c</span><br><span>@@ -2927,9 +2927,7 @@</span><br><span>        /* Do we need to reset? */</span><br><span>   if (argc > 1) {</span><br><span>           vty_out(vty, "%% Reset to default parameters%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-                enum gsm_power_ctrl_dir dir = params->dir;</span><br><span style="color: hsl(0, 100%, 40%);">-           *params = power_ctrl_params_def;</span><br><span style="color: hsl(0, 100%, 40%);">-                params->dir = dir;</span><br><span style="color: hsl(120, 100%, 40%);">+         power_ctrl_params_def_reset(params, params->dir);</span><br><span>         }</span><br><span> </span><br><span>        if (strcmp(argv[0], "static") == 0)</span><br><span>diff --git a/src/osmo-bsc/gsm_data.c b/src/osmo-bsc/gsm_data.c</span><br><span>index c8108e8..5d57072 100644</span><br><span>--- a/src/osmo-bsc/gsm_data.c</span><br><span>+++ b/src/osmo-bsc/gsm_data.c</span><br><span>@@ -1333,6 +1333,16 @@</span><br><span>      },</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void power_ctrl_params_def_reset(struct gsm_power_ctrl_params *params,</span><br><span style="color: hsl(120, 100%, 40%);">+                           enum gsm_power_ctrl_dir dir)</span><br><span style="color: hsl(120, 100%, 40%);">+{</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%);">+ if (dir == GSM_PWR_CTRL_DIR_UL)</span><br><span style="color: hsl(120, 100%, 40%);">+               /* Trigger loop every fourth SACCH block (1.92s). TS 45.008 sec 4.7.1: */</span><br><span style="color: hsl(120, 100%, 40%);">+             params->ctrl_interval = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> enum rsl_cmod_spd chan_mode_to_rsl_cmod_spd(enum gsm48_chan_mode chan_mode)</span><br><span> {</span><br><span>       switch (gsm48_chan_mode_to_non_vamos(chan_mode)) {</span><br><span>diff --git a/tests/power_ctrl.vty b/tests/power_ctrl.vty</span><br><span>index 9747ec2..374002d 100644</span><br><span>--- a/tests/power_ctrl.vty</span><br><span>+++ b/tests/power_ctrl.vty</span><br><span>@@ -7,7 +7,7 @@</span><br><span>    mode static</span><br><span>   ms-power-control</span><br><span>    mode dyn-bts</span><br><span style="color: hsl(0, 100%, 40%);">-   ctrl-interval 1</span><br><span style="color: hsl(120, 100%, 40%);">+   ctrl-interval 2</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>@@ -102,7 +102,7 @@</span><br><span> ...</span><br><span>   ms-power-control</span><br><span> ...</span><br><span style="color: hsl(0, 100%, 40%);">-   ctrl-interval 1</span><br><span style="color: hsl(120, 100%, 40%);">+   ctrl-interval 2</span><br><span> ...</span><br><span> </span><br><span> OsmoBSC(config-bs-power-ctrl)# exit</span><br><span>@@ -137,7 +137,7 @@</span><br><span> ...</span><br><span>   ms-power-control</span><br><span>    mode dyn-bts</span><br><span style="color: hsl(0, 100%, 40%);">-   ctrl-interval 1</span><br><span style="color: hsl(120, 100%, 40%);">+   ctrl-interval 2</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>@@ -296,7 +296,7 @@</span><br><span>    mode static</span><br><span>   ms-power-control</span><br><span>    mode dyn-bts</span><br><span style="color: hsl(0, 100%, 40%);">-   ctrl-interval 1</span><br><span style="color: hsl(120, 100%, 40%);">+   ctrl-interval 2</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></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/25681">change 25681</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/+/25681"/><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: I46be244a5e01a74086e3a977ec3ea139742a0074 </div>
<div style="display:none"> Gerrit-Change-Number: 25681 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>