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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">power_control: implement handling of P_Con_INTERVAL parameter<br><br>Change-Id: Ibf9956b2c6d829b38e9fda7d1f29790036219f42<br>Related: SYS#4918<br>---<br>M include/osmo-bts/gsm_data.h<br>M src/common/power_control.c<br>M src/common/rsl.c<br>M src/common/vty.c<br>M tests/power/bs_power_loop_test.c<br>M tests/power/bs_power_loop_test.err<br>M tests/power/bs_power_loop_test.ok<br>M tests/power/ms_power_loop_test.c<br>M tests/power/ms_power_loop_test.err<br>M tests/power/ms_power_loop_test.ok<br>10 files changed, 320 insertions(+), 3 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/gsm_data.h b/include/osmo-bts/gsm_data.h</span><br><span>index 8071a28..05b6cf2 100644</span><br><span>--- a/include/osmo-bts/gsm_data.h</span><br><span>+++ b/include/osmo-bts/gsm_data.h</span><br><span>@@ -201,6 +201,9 @@</span><br><span> </span><br><span> /* MS/BS Power Control parameters */</span><br><span> struct gsm_power_ctrl_params {</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Minimum interval between power level changes */</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t ctrl_interval; /* 1 step is 2 SACCH periods */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     /* Power change step size (maximum) */</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>@@ -231,6 +234,8 @@</span><br><span>     const struct gsm_power_ctrl_params *dpc_params;</span><br><span>      /* Measurement pre-processing state (for dynamic mode) */</span><br><span>    struct gsm_power_ctrl_meas_proc_state rxlev_meas_proc;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Number of SACCH blocks to skip (for dynamic mode) */</span><br><span style="color: hsl(120, 100%, 40%);">+       int skip_block_num;</span><br><span> </span><br><span>      /* Depending on the context (MS or BS power control), fields 'current' and 'max'</span><br><span>      * reflect either the MS power level (magic numbers), or BS Power reduction level</span><br><span>diff --git a/src/common/power_control.c b/src/common/power_control.c</span><br><span>index be74a41..4f5d15e 100644</span><br><span>--- a/src/common/power_control.c</span><br><span>+++ b/src/common/power_control.c</span><br><span>@@ -1,7 +1,8 @@</span><br><span> /* MS Power Control Loop L1 */</span><br><span> </span><br><span> /* (C) 2014 by Holger Hans Peter Freyther</span><br><span style="color: hsl(0, 100%, 40%);">- * Contributions by sysmocom - s.m.f.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2020-2021 by sysmocom - s.m.f.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * Author: Vadim Yanitskiy <vyanitskiy@sysmocom.de></span><br><span>  *</span><br><span>  * All Rights Reserved</span><br><span>  *</span><br><span>@@ -160,6 +161,17 @@</span><br><span>      if (params == NULL)</span><br><span>          return 0;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Power control interval: how many blocks do we skip? */</span><br><span style="color: hsl(120, 100%, 40%);">+     if (state->skip_block_num-- > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Reset the number of SACCH blocks to be skipped:</span><br><span style="color: hsl(120, 100%, 40%);">+     *   ctrl_interval=0 => 0 blocks to skip,</span><br><span style="color: hsl(120, 100%, 40%);">+   *   ctrl_interval=1 => 1 blocks to skip,</span><br><span style="color: hsl(120, 100%, 40%);">+   *   ctrl_interval=2 => 3 blocks to skip,</span><br><span style="color: hsl(120, 100%, 40%);">+   *     so basically ctrl_interval * 2 - 1. */</span><br><span style="color: hsl(120, 100%, 40%);">+ state->skip_block_num = params->ctrl_interval * 2 - 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       ms_dbm = ms_pwr_dbm(band, ms_power_lvl);</span><br><span>     if (ms_dbm < 0) {</span><br><span>                 LOGPLCHAN(lchan, DLOOP, LOGL_NOTICE,</span><br><span>@@ -265,6 +277,17 @@</span><br><span>            lchan->tch.dtx.dl_active ? "enabled" : "disabled",</span><br><span>            lchan->tch.dtx.dl_active ? "SUB" : "FULL");</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      /* Power control interval: how many blocks do we skip? */</span><br><span style="color: hsl(120, 100%, 40%);">+     if (state->skip_block_num-- > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Reset the number of SACCH blocks to be skipped:</span><br><span style="color: hsl(120, 100%, 40%);">+     *   ctrl_interval=0 => 0 blocks to skip,</span><br><span style="color: hsl(120, 100%, 40%);">+   *   ctrl_interval=1 => 1 blocks to skip,</span><br><span style="color: hsl(120, 100%, 40%);">+   *   ctrl_interval=2 => 3 blocks to skip,</span><br><span style="color: hsl(120, 100%, 40%);">+   *     so basically ctrl_interval * 2 - 1. */</span><br><span style="color: hsl(120, 100%, 40%);">+ state->skip_block_num = params->ctrl_interval * 2 - 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       /* If DTx is active on Downlink, use the '-SUB' */</span><br><span>   if (lchan->tch.dtx.dl_active) {</span><br><span>           rxqual = rxqual_sub;</span><br><span>diff --git a/src/common/rsl.c b/src/common/rsl.c</span><br><span>index bde53a1..3023ffa 100644</span><br><span>--- a/src/common/rsl.c</span><br><span>+++ b/src/common/rsl.c</span><br><span>@@ -763,7 +763,8 @@</span><br><span>              params->rxqual_meas.upper_cmp_p = thresh_comp->p4;</span><br><span>             params->rxqual_meas.upper_cmp_n = thresh_comp->n4;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-            /* FIXME: TIMER_PWR_CON_INTERVAL (P_Con_INTERVAL) */</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Minimum interval between power level changes (P_Con_INTERVAL) */</span><br><span style="color: hsl(120, 100%, 40%);">+           params->ctrl_interval = thresh_comp->pc_interval;</span><br><span> </span><br><span>          /* Power increase / reduce step size: POWER_{INC,RED}_STEP_SIZE */</span><br><span>           params->inc_step_size_db = thresh_comp->inc_step_size;</span><br><span>diff --git a/src/common/vty.c b/src/common/vty.c</span><br><span>index 9dd0c1a..f36c09e 100644</span><br><span>--- a/src/common/vty.c</span><br><span>+++ b/src/common/vty.c</span><br><span>@@ -1269,6 +1269,11 @@</span><br><span> static void dump_dpc_params(struct vty *vty, const unsigned int indent,</span><br><span>                            const struct gsm_power_ctrl_params *cp)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg_out(vty, "Power control interval: %u ms (every %u SACCH block(s))%s",</span><br><span style="color: hsl(120, 100%, 40%);">+           cp->ctrl_interval ? cp->ctrl_interval * 2 * 480 : 480,</span><br><span style="color: hsl(120, 100%, 40%);">+          cp->ctrl_interval ? cp->ctrl_interval * 2 : 1,</span><br><span style="color: hsl(120, 100%, 40%);">+          VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      cfg_out(vty, "Power increase step size: %u%s",</span><br><span>             cp->inc_step_size_db, VTY_NEWLINE);</span><br><span>       cfg_out(vty, "Power reduce step size: %u%s",</span><br><span>diff --git a/tests/power/bs_power_loop_test.c b/tests/power/bs_power_loop_test.c</span><br><span>index 5271324..6f5f2bf 100644</span><br><span>--- a/tests/power/bs_power_loop_test.c</span><br><span>+++ b/tests/power/bs_power_loop_test.c</span><br><span>@@ -1,5 +1,5 @@</span><br><span> /*</span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2020 by sysmocom - s.m.f.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2020-2021 by sysmocom - s.m.f.c. GmbH <info@sysmocom.de></span><br><span>  * Author: Vadim Yanitskiy <vyanitskiy@sysmocom.de></span><br><span>  *</span><br><span>  * All Rights Reserved</span><br><span>@@ -56,6 +56,7 @@</span><br><span>  PWR_TEST_ST_IND_MEAS = 0,</span><br><span>    PWR_TEST_ST_IND_DUMMY,</span><br><span>       PWR_TEST_ST_SET_STATE,</span><br><span style="color: hsl(120, 100%, 40%);">+        PWR_TEST_ST_SET_CTRL_INTERVAL,</span><br><span>       PWR_TEST_ST_SET_STEP_SIZE,</span><br><span>   PWR_TEST_ST_SET_RXLEV_PARAMS,</span><br><span>        PWR_TEST_ST_ENABLE_DTXD,</span><br><span>@@ -84,6 +85,8 @@</span><br><span>                         uint8_t inc;</span><br><span>                         uint8_t red;</span><br><span>                 } step_size;</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Power control interval */</span><br><span style="color: hsl(120, 100%, 40%);">+          uint8_t ctrl_interval;</span><br><span>       };</span><br><span>   /* Expected Tx power reduction */</span><br><span>    uint8_t exp_txred;</span><br><span>@@ -159,6 +162,11 @@</span><br><span>            printf("#%02u %s() <- Dynamic power control is disabled\n", n, __func__);</span><br><span>               lchan->bs_power_ctrl.dpc_params = NULL;</span><br><span>           return 0; /* we're done */</span><br><span style="color: hsl(120, 100%, 40%);">+        case PWR_TEST_ST_SET_CTRL_INTERVAL:</span><br><span style="color: hsl(120, 100%, 40%);">+           printf("#%02u %s() <- (Re)set power control interval: %u -> %u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                   n, __func__, lchan->bs_dpc_params.ctrl_interval, step->ctrl_interval);</span><br><span style="color: hsl(120, 100%, 40%);">+           lchan->bs_dpc_params.ctrl_interval = step->ctrl_interval;</span><br><span style="color: hsl(120, 100%, 40%);">+               return 0; /* we're done */</span><br><span>       case PWR_TEST_ST_SET_STEP_SIZE:</span><br><span>              printf("#%02u %s() <- Set step size: inc %u dB, red %u dB\n",</span><br><span>                  n, __func__, step->step_size.inc, step->step_size.red);</span><br><span>@@ -411,6 +419,49 @@</span><br><span>  { .meas = DL_MEAS_FULL_SUB(0, PWR_TEST_RXLEV_TARGET),   .exp_txred = 16 },</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Verify handling of optional power control interval (P_Con_INTERVAL). */</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct power_test_step TC_ctrl_interval[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Initial state: 0 dB, up to 20 dB */</span><br><span style="color: hsl(120, 100%, 40%);">+        { .type = PWR_TEST_ST_SET_STATE,</span><br><span style="color: hsl(120, 100%, 40%);">+        .state = { .current = 0, .max = 2 * 10 } },</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* P_Con_INTERVAL=0 (480 ms): every SACCH block is handled */</span><br><span style="color: hsl(120, 100%, 40%);">+ { .type = PWR_TEST_ST_SET_CTRL_INTERVAL, .ctrl_interval = 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* MS indicates high RxLev values (-50 dBm), red step is 2 dB */</span><br><span style="color: hsl(120, 100%, 40%);">+      { .meas = DL_MEAS_FULL_SUB(0, 60),      .exp_txred =  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+    { .meas = DL_MEAS_FULL_SUB(0, 60),      .exp_txred =  4 },</span><br><span style="color: hsl(120, 100%, 40%);">+    { .meas = DL_MEAS_FULL_SUB(0, 60),      .exp_txred =  6 },</span><br><span style="color: hsl(120, 100%, 40%);">+    { .meas = DL_MEAS_FULL_SUB(0, 60),      .exp_txred =  8 },</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* MS indicates low RxLev values (-100 dBm), inc step is 4 dB */</span><br><span style="color: hsl(120, 100%, 40%);">+      { .meas = DL_MEAS_FULL_SUB(0, 10),      .exp_txred =  4 },</span><br><span style="color: hsl(120, 100%, 40%);">+    { .meas = DL_MEAS_FULL_SUB(0, 10),      .exp_txred =  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* P_Con_INTERVAL=1 (960 ms): 1 out of 2 SACCH blocks is handled */</span><br><span style="color: hsl(120, 100%, 40%);">+   { .type = PWR_TEST_ST_SET_CTRL_INTERVAL, .ctrl_interval = 1 },</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* MS indicates high RxLev values (-50 dBm), red step is 2 dB */</span><br><span style="color: hsl(120, 100%, 40%);">+      { .meas = DL_MEAS_FULL_SUB(0, 60),      .exp_txred =  2 },</span><br><span style="color: hsl(120, 100%, 40%);">+    { .meas = DL_MEAS_FULL_SUB(0, 60),      .exp_txred =  2 }, /* skipped */</span><br><span style="color: hsl(120, 100%, 40%);">+      { .meas = DL_MEAS_FULL_SUB(0, 60),      .exp_txred =  4 },</span><br><span style="color: hsl(120, 100%, 40%);">+    { .meas = DL_MEAS_FULL_SUB(0, 60),      .exp_txred =  4 }, /* skipped */</span><br><span style="color: hsl(120, 100%, 40%);">+      { .meas = DL_MEAS_FULL_SUB(0, 60),      .exp_txred =  6 },</span><br><span style="color: hsl(120, 100%, 40%);">+    { .meas = DL_MEAS_FULL_SUB(0, 60),      .exp_txred =  6 }, /* skipped */</span><br><span style="color: hsl(120, 100%, 40%);">+      { .meas = DL_MEAS_FULL_SUB(0, 60),      .exp_txred =  8 },</span><br><span style="color: hsl(120, 100%, 40%);">+    { .meas = DL_MEAS_FULL_SUB(0, 60),      .exp_txred =  8 }, /* skipped */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* P_Con_INTERVAL=2 (1920 ms): 1 out of 4 SACCH blocks is handled */</span><br><span style="color: hsl(120, 100%, 40%);">+  { .type = PWR_TEST_ST_SET_CTRL_INTERVAL, .ctrl_interval = 2 },</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* MS indicates low RxLev values (-100 dBm), inc step is 4 dB */</span><br><span style="color: hsl(120, 100%, 40%);">+      { .meas = DL_MEAS_FULL_SUB(0, 10),      .exp_txred =  4 },</span><br><span style="color: hsl(120, 100%, 40%);">+    { .meas = DL_MEAS_FULL_SUB(0, 10),      .exp_txred =  4 }, /* skipped */</span><br><span style="color: hsl(120, 100%, 40%);">+      { .meas = DL_MEAS_FULL_SUB(0, 10),      .exp_txred =  4 }, /* skipped */</span><br><span style="color: hsl(120, 100%, 40%);">+      { .meas = DL_MEAS_FULL_SUB(0, 10),      .exp_txred =  4 }, /* skipped */</span><br><span style="color: hsl(120, 100%, 40%);">+      { .meas = DL_MEAS_FULL_SUB(0, 10),      .exp_txred =  0 },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Verify that small deviations from the target do not trigger any changes. */</span><br><span> static const struct power_test_step TC_rxlev_hyst[] = {</span><br><span>        /* Initial state: 16 dB, up to 20 dB */</span><br><span>@@ -488,6 +539,7 @@</span><br><span>        exec_test(TC_dtxd_mode);</span><br><span>     exec_test(TC_rxqual_ber);</span><br><span>    exec_test(TC_inval_dummy);</span><br><span style="color: hsl(120, 100%, 40%);">+    exec_test(TC_ctrl_interval);</span><br><span> </span><br><span>     exec_test(TC_rxlev_hyst);</span><br><span>    exec_test(TC_rxlev_pf_ewma);</span><br><span>diff --git a/tests/power/bs_power_loop_test.err b/tests/power/bs_power_loop_test.err</span><br><span>index 7fcfb1e..c4726b1 100644</span><br><span>--- a/tests/power/bs_power_loop_test.err</span><br><span>+++ b/tests/power/bs_power_loop_test.err</span><br><span>@@ -135,6 +135,37 @@</span><br><span> (bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 16 dB (maximum 20 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)</span><br><span> (bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0), DTx is disabled => using FULL</span><br><span> (bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 16 dB (maximum 20 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 0 -> 2 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 2 -> 4 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 4 -> 6 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 6 -> 8 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 8 -> 4 dB (maximum 20 dB, suggested delta -4 dB, RxLev current 10 (-100 dBm), thresholds 30 .. 30)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 4 -> 0 dB (maximum 20 dB, suggested delta -4 dB, RxLev current 10 (-100 dBm), thresholds 30 .. 30)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 0 -> 2 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 2 -> 4 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 4 -> 6 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 6 -> 8 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 8 -> 4 dB (maximum 20 dB, suggested delta -4 dB, RxLev current 10 (-100 dBm), thresholds 30 .. 30)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 4 -> 0 dB (maximum 20 dB, suggested delta -4 dB, RxLev current 10 (-100 dBm), thresholds 30 .. 30)</span><br><span> (bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(31), RXQUAL-FULL(0), RXLEV-SUB(31), RXQUAL-SUB(0), DTx is disabled => using FULL</span><br><span> (bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 12 -> 13 dB (maximum 16 dB, suggested delta 1 dB, RxLev current 31 (-79 dBm), thresholds 30 .. 30)</span><br><span> (bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(28), RXQUAL-FULL(0), RXLEV-SUB(28), RXQUAL-SUB(0), DTx is disabled => using FULL</span><br><span>diff --git a/tests/power/bs_power_loop_test.ok b/tests/power/bs_power_loop_test.ok</span><br><span>index 4371c9d..2c12392 100644</span><br><span>--- a/tests/power/bs_power_loop_test.ok</span><br><span>+++ b/tests/power/bs_power_loop_test.ok</span><br><span>@@ -268,6 +268,70 @@</span><br><span> #07 lchan_bs_pwr_ctrl() -> BS power reduction: 16 -> 16 (expected 16)</span><br><span> Test case verdict: SUCCESS</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+Starting test case 'TC_ctrl_interval'</span><br><span style="color: hsl(120, 100%, 40%);">+#00 exec_power_step() <- State (re)set (current 0 dB, max 20 dB)</span><br><span style="color: hsl(120, 100%, 40%);">+#01 exec_power_step() <- (Re)set power control interval: 0 -> 0</span><br><span style="color: hsl(120, 100%, 40%);">+#02 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0)</span><br><span style="color: hsl(120, 100%, 40%);">+#02 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 3c 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 </span><br><span style="color: hsl(120, 100%, 40%);">+#02 lchan_bs_pwr_ctrl() -> BS power reduction: 0 -> 2 (expected 2)</span><br><span style="color: hsl(120, 100%, 40%);">+#03 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0)</span><br><span style="color: hsl(120, 100%, 40%);">+#03 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 3c 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 </span><br><span style="color: hsl(120, 100%, 40%);">+#03 lchan_bs_pwr_ctrl() -> BS power reduction: 2 -> 4 (expected 4)</span><br><span style="color: hsl(120, 100%, 40%);">+#04 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0)</span><br><span style="color: hsl(120, 100%, 40%);">+#04 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 3c 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 </span><br><span style="color: hsl(120, 100%, 40%);">+#04 lchan_bs_pwr_ctrl() -> BS power reduction: 4 -> 6 (expected 6)</span><br><span style="color: hsl(120, 100%, 40%);">+#05 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0)</span><br><span style="color: hsl(120, 100%, 40%);">+#05 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 3c 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 </span><br><span style="color: hsl(120, 100%, 40%);">+#05 lchan_bs_pwr_ctrl() -> BS power reduction: 6 -> 8 (expected 8)</span><br><span style="color: hsl(120, 100%, 40%);">+#06 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0)</span><br><span style="color: hsl(120, 100%, 40%);">+#06 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 0a 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 </span><br><span style="color: hsl(120, 100%, 40%);">+#06 lchan_bs_pwr_ctrl() -> BS power reduction: 8 -> 4 (expected 4)</span><br><span style="color: hsl(120, 100%, 40%);">+#07 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0)</span><br><span style="color: hsl(120, 100%, 40%);">+#07 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 0a 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 </span><br><span style="color: hsl(120, 100%, 40%);">+#07 lchan_bs_pwr_ctrl() -> BS power reduction: 4 -> 0 (expected 0)</span><br><span style="color: hsl(120, 100%, 40%);">+#08 exec_power_step() <- (Re)set power control interval: 0 -> 1</span><br><span style="color: hsl(120, 100%, 40%);">+#09 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0)</span><br><span style="color: hsl(120, 100%, 40%);">+#09 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 3c 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 </span><br><span style="color: hsl(120, 100%, 40%);">+#09 lchan_bs_pwr_ctrl() -> BS power reduction: 0 -> 2 (expected 2)</span><br><span style="color: hsl(120, 100%, 40%);">+#10 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0)</span><br><span style="color: hsl(120, 100%, 40%);">+#10 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 3c 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 </span><br><span style="color: hsl(120, 100%, 40%);">+#10 lchan_bs_pwr_ctrl() -> BS power reduction: 2 -> 2 (expected 2)</span><br><span style="color: hsl(120, 100%, 40%);">+#11 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0)</span><br><span style="color: hsl(120, 100%, 40%);">+#11 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 3c 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 </span><br><span style="color: hsl(120, 100%, 40%);">+#11 lchan_bs_pwr_ctrl() -> BS power reduction: 2 -> 4 (expected 4)</span><br><span style="color: hsl(120, 100%, 40%);">+#12 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0)</span><br><span style="color: hsl(120, 100%, 40%);">+#12 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 3c 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 </span><br><span style="color: hsl(120, 100%, 40%);">+#12 lchan_bs_pwr_ctrl() -> BS power reduction: 4 -> 4 (expected 4)</span><br><span style="color: hsl(120, 100%, 40%);">+#13 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0)</span><br><span style="color: hsl(120, 100%, 40%);">+#13 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 3c 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 </span><br><span style="color: hsl(120, 100%, 40%);">+#13 lchan_bs_pwr_ctrl() -> BS power reduction: 4 -> 6 (expected 6)</span><br><span style="color: hsl(120, 100%, 40%);">+#14 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0)</span><br><span style="color: hsl(120, 100%, 40%);">+#14 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 3c 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 </span><br><span style="color: hsl(120, 100%, 40%);">+#14 lchan_bs_pwr_ctrl() -> BS power reduction: 6 -> 6 (expected 6)</span><br><span style="color: hsl(120, 100%, 40%);">+#15 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0)</span><br><span style="color: hsl(120, 100%, 40%);">+#15 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 3c 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 </span><br><span style="color: hsl(120, 100%, 40%);">+#15 lchan_bs_pwr_ctrl() -> BS power reduction: 6 -> 8 (expected 8)</span><br><span style="color: hsl(120, 100%, 40%);">+#16 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0)</span><br><span style="color: hsl(120, 100%, 40%);">+#16 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 3c 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 </span><br><span style="color: hsl(120, 100%, 40%);">+#16 lchan_bs_pwr_ctrl() -> BS power reduction: 8 -> 8 (expected 8)</span><br><span style="color: hsl(120, 100%, 40%);">+#17 exec_power_step() <- (Re)set power control interval: 1 -> 2</span><br><span style="color: hsl(120, 100%, 40%);">+#18 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0)</span><br><span style="color: hsl(120, 100%, 40%);">+#18 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 0a 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 </span><br><span style="color: hsl(120, 100%, 40%);">+#18 lchan_bs_pwr_ctrl() -> BS power reduction: 8 -> 4 (expected 4)</span><br><span style="color: hsl(120, 100%, 40%);">+#19 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0)</span><br><span style="color: hsl(120, 100%, 40%);">+#19 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 0a 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 </span><br><span style="color: hsl(120, 100%, 40%);">+#19 lchan_bs_pwr_ctrl() -> BS power reduction: 4 -> 4 (expected 4)</span><br><span style="color: hsl(120, 100%, 40%);">+#20 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0)</span><br><span style="color: hsl(120, 100%, 40%);">+#20 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 0a 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 </span><br><span style="color: hsl(120, 100%, 40%);">+#20 lchan_bs_pwr_ctrl() -> BS power reduction: 4 -> 4 (expected 4)</span><br><span style="color: hsl(120, 100%, 40%);">+#21 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0)</span><br><span style="color: hsl(120, 100%, 40%);">+#21 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 0a 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 </span><br><span style="color: hsl(120, 100%, 40%);">+#21 lchan_bs_pwr_ctrl() -> BS power reduction: 4 -> 4 (expected 4)</span><br><span style="color: hsl(120, 100%, 40%);">+#22 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0)</span><br><span style="color: hsl(120, 100%, 40%);">+#22 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 0a 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 </span><br><span style="color: hsl(120, 100%, 40%);">+#22 lchan_bs_pwr_ctrl() -> BS power reduction: 4 -> 0 (expected 0)</span><br><span style="color: hsl(120, 100%, 40%);">+Test case verdict: SUCCESS</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> Starting test case 'TC_rxlev_hyst'</span><br><span> #00 exec_power_step() <- State (re)set (current 12 dB, max 16 dB)</span><br><span> #01 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(31), RXQUAL-FULL(0), RXLEV-SUB(31), RXQUAL-SUB(0)</span><br><span>diff --git a/tests/power/ms_power_loop_test.c b/tests/power/ms_power_loop_test.c</span><br><span>index eb0e3e9..c58812b 100644</span><br><span>--- a/tests/power/ms_power_loop_test.c</span><br><span>+++ b/tests/power/ms_power_loop_test.c</span><br><span>@@ -248,6 +248,71 @@</span><br><span>         apply_power_test(lchan, PWR_TEST_RXLEV_TARGET_DBM - 10, 1, 13);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void test_power_ctrl_interval(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_lchan *lchan;</span><br><span style="color: hsl(120, 100%, 40%);">+      unsigned int i, j;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  init_test(__func__);</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan = &g_trx->ts[0].lchan[0];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      lchan->ms_power_ctrl.max = ms_pwr_ctl_lvl(GSM_BAND_1800, 26);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(lchan->ms_power_ctrl.max == 2);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      static const int script[][8][3] = {</span><br><span style="color: hsl(120, 100%, 40%);">+           { /* P_Con_INTERVAL=0 (480 ms) */</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* { UL RxLev, expected rc, expected Tx power level } */</span><br><span style="color: hsl(120, 100%, 40%);">+                      { PWR_TEST_RXLEV_TARGET_DBM - 15,       1,      13 },</span><br><span style="color: hsl(120, 100%, 40%);">+                 { PWR_TEST_RXLEV_TARGET_DBM - 15,       1,      11 },</span><br><span style="color: hsl(120, 100%, 40%);">+                 { PWR_TEST_RXLEV_TARGET_DBM - 15,       1,       9 },</span><br><span style="color: hsl(120, 100%, 40%);">+                 { PWR_TEST_RXLEV_TARGET_DBM - 15,       1,       7 },</span><br><span style="color: hsl(120, 100%, 40%);">+                 { PWR_TEST_RXLEV_TARGET_DBM - 15,       1,       5 },</span><br><span style="color: hsl(120, 100%, 40%);">+                 { PWR_TEST_RXLEV_TARGET_DBM - 15,       1,       3 },</span><br><span style="color: hsl(120, 100%, 40%);">+                 { PWR_TEST_RXLEV_TARGET_DBM - 15,       1,       2 },</span><br><span style="color: hsl(120, 100%, 40%);">+                 { PWR_TEST_RXLEV_TARGET_DBM - 15,       1,       2 },</span><br><span style="color: hsl(120, 100%, 40%);">+         },</span><br><span style="color: hsl(120, 100%, 40%);">+            { /* P_Con_INTERVAL=1 (960 ms) */</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* { UL RxLev, expected rc, expected Tx power level } */</span><br><span style="color: hsl(120, 100%, 40%);">+                      { PWR_TEST_RXLEV_TARGET_DBM - 15,       1,      13 },</span><br><span style="color: hsl(120, 100%, 40%);">+                 { PWR_TEST_RXLEV_TARGET_DBM - 15,       0,      13 }, /* skipped */</span><br><span style="color: hsl(120, 100%, 40%);">+                   { PWR_TEST_RXLEV_TARGET_DBM - 15,       1,      11 },</span><br><span style="color: hsl(120, 100%, 40%);">+                 { PWR_TEST_RXLEV_TARGET_DBM - 15,       0,      11 }, /* skipped */</span><br><span style="color: hsl(120, 100%, 40%);">+                   { PWR_TEST_RXLEV_TARGET_DBM - 15,       1,       9 },</span><br><span style="color: hsl(120, 100%, 40%);">+                 { PWR_TEST_RXLEV_TARGET_DBM - 15,       0,       9 }, /* skipped */</span><br><span style="color: hsl(120, 100%, 40%);">+                   { PWR_TEST_RXLEV_TARGET_DBM - 15,       1,       7 },</span><br><span style="color: hsl(120, 100%, 40%);">+                 { PWR_TEST_RXLEV_TARGET_DBM - 15,       0,       7 }, /* skipped */</span><br><span style="color: hsl(120, 100%, 40%);">+           },</span><br><span style="color: hsl(120, 100%, 40%);">+            { /* P_Con_INTERVAL=2 (1920 ms) */</span><br><span style="color: hsl(120, 100%, 40%);">+                    /* { UL RxLev, expected rc, expected Tx power level } */</span><br><span style="color: hsl(120, 100%, 40%);">+                      { PWR_TEST_RXLEV_TARGET_DBM - 15,       1,      13 },</span><br><span style="color: hsl(120, 100%, 40%);">+                 { PWR_TEST_RXLEV_TARGET_DBM - 15,       0,      13 }, /* skipped */</span><br><span style="color: hsl(120, 100%, 40%);">+                   { PWR_TEST_RXLEV_TARGET_DBM - 15,       0,      13 }, /* skipped */</span><br><span style="color: hsl(120, 100%, 40%);">+                   { PWR_TEST_RXLEV_TARGET_DBM - 15,       0,      13 }, /* skipped */</span><br><span style="color: hsl(120, 100%, 40%);">+                   { PWR_TEST_RXLEV_TARGET_DBM - 15,       1,      11 },</span><br><span style="color: hsl(120, 100%, 40%);">+                 { PWR_TEST_RXLEV_TARGET_DBM - 15,       0,      11 }, /* skipped */</span><br><span style="color: hsl(120, 100%, 40%);">+                   { PWR_TEST_RXLEV_TARGET_DBM - 15,       0,      11 }, /* skipped */</span><br><span style="color: hsl(120, 100%, 40%);">+                   { PWR_TEST_RXLEV_TARGET_DBM - 15,       0,      11 }, /* skipped */</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%);">+  for (i = 0; i < ARRAY_SIZE(script); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+         lchan->ms_power_ctrl.current = ms_pwr_ctl_lvl(GSM_BAND_1800, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+           OSMO_ASSERT(lchan->ms_power_ctrl.current == 15);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         /* Set the corresponding power control interval */</span><br><span style="color: hsl(120, 100%, 40%);">+            printf("%s(): power control interval is now %u\n", __func__, i);</span><br><span style="color: hsl(120, 100%, 40%);">+            lchan->ms_dpc_params.ctrl_interval = i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          for (j = 0; j < ARRAY_SIZE(script[i]); j++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      apply_power_test(lchan, script[i][j][0],  /* UL RxLev */</span><br><span style="color: hsl(120, 100%, 40%);">+                                              script[i][j][1],  /* expected rc */</span><br><span style="color: hsl(120, 100%, 40%);">+                                           script[i][j][2]); /* expected Tx power level */</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%);">+           printf("\n");</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> int main(int argc, char **argv)</span><br><span> {</span><br><span>       printf("Testing power loop...\n");</span><br><span>@@ -264,6 +329,7 @@</span><br><span>   test_power_loop();</span><br><span>   test_pf_algo_ewma();</span><br><span>         test_power_hysteresis();</span><br><span style="color: hsl(120, 100%, 40%);">+      test_power_ctrl_interval();</span><br><span> </span><br><span>      printf("Power loop test OK\n");</span><br><span> </span><br><span>diff --git a/tests/power/ms_power_loop_test.err b/tests/power/ms_power_loop_test.err</span><br><span>index 7f8779c..ae8ad03 100644</span><br><span>--- a/tests/power/ms_power_loop_test.err</span><br><span>+++ b/tests/power/ms_power_loop_test.err</span><br><span>@@ -35,3 +35,17 @@</span><br><span> (bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15, 0 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -70 dBm, rx-target -75 dBm)</span><br><span> (bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15, 0 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -80 dBm, rx-target -75 dBm)</span><br><span> (bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 15 (0 dBm) to 13, 4 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -85 dBm, rx-target -75 dBm)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 15 (0 dBm) to 13, 4 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 13 (4 dBm) to 11, 8 dBm (rx-ms-pwr-lvl 13, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 11 (8 dBm) to 9, 12 dBm (rx-ms-pwr-lvl 11, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 9 (12 dBm) to 7, 16 dBm (rx-ms-pwr-lvl 9, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 7 (16 dBm) to 5, 20 dBm (rx-ms-pwr-lvl 7, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 5 (20 dBm) to 3, 24 dBm (rx-ms-pwr-lvl 5, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 3 (24 dBm) to 2, 26 dBm (rx-ms-pwr-lvl 3, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 2, 26 dBm (rx-ms-pwr-lvl 2, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 15 (0 dBm) to 13, 4 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 13 (4 dBm) to 11, 8 dBm (rx-ms-pwr-lvl 13, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 11 (8 dBm) to 9, 12 dBm (rx-ms-pwr-lvl 11, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 9 (12 dBm) to 7, 16 dBm (rx-ms-pwr-lvl 9, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 15 (0 dBm) to 13, 4 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)</span><br><span style="color: hsl(120, 100%, 40%);">+(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 13 (4 dBm) to 11, 8 dBm (rx-ms-pwr-lvl 13, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)</span><br><span>diff --git a/tests/power/ms_power_loop_test.ok b/tests/power/ms_power_loop_test.ok</span><br><span>index 4293d28..5fea474 100644</span><br><span>--- a/tests/power/ms_power_loop_test.ok</span><br><span>+++ b/tests/power/ms_power_loop_test.ok</span><br><span>@@ -88,4 +88,60 @@</span><br><span>       MS current power 15 -> 15 (expected 15)</span><br><span> lchan_ms_pwr_ctrl(RxLvl=-85 dBm) returns 1 (expected 1)</span><br><span>        MS current power 15 -> 13 (expected 13)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Starting test case 'test_power_ctrl_interval'</span><br><span style="color: hsl(120, 100%, 40%);">+test_power_ctrl_interval(): power control interval is now 0</span><br><span style="color: hsl(120, 100%, 40%);">+lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 1 (expected 1)</span><br><span style="color: hsl(120, 100%, 40%);">+     MS current power 15 -> 13 (expected 13)</span><br><span style="color: hsl(120, 100%, 40%);">+lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 1 (expected 1)</span><br><span style="color: hsl(120, 100%, 40%);">+   MS current power 13 -> 11 (expected 11)</span><br><span style="color: hsl(120, 100%, 40%);">+lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 1 (expected 1)</span><br><span style="color: hsl(120, 100%, 40%);">+   MS current power 11 -> 9 (expected 9)</span><br><span style="color: hsl(120, 100%, 40%);">+lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 1 (expected 1)</span><br><span style="color: hsl(120, 100%, 40%);">+     MS current power 9 -> 7 (expected 7)</span><br><span style="color: hsl(120, 100%, 40%);">+lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 1 (expected 1)</span><br><span style="color: hsl(120, 100%, 40%);">+      MS current power 7 -> 5 (expected 5)</span><br><span style="color: hsl(120, 100%, 40%);">+lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 1 (expected 1)</span><br><span style="color: hsl(120, 100%, 40%);">+      MS current power 5 -> 3 (expected 3)</span><br><span style="color: hsl(120, 100%, 40%);">+lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 1 (expected 1)</span><br><span style="color: hsl(120, 100%, 40%);">+      MS current power 3 -> 2 (expected 2)</span><br><span style="color: hsl(120, 100%, 40%);">+lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 0 (expected 1)</span><br><span style="color: hsl(120, 100%, 40%);">+      MS current power 2 -> 2 (expected 2)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+test_power_ctrl_interval(): power control interval is now 1</span><br><span style="color: hsl(120, 100%, 40%);">+lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 1 (expected 1)</span><br><span style="color: hsl(120, 100%, 40%);">+       MS current power 15 -> 13 (expected 13)</span><br><span style="color: hsl(120, 100%, 40%);">+lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 0 (expected 0)</span><br><span style="color: hsl(120, 100%, 40%);">+   MS current power 13 -> 13 (expected 13)</span><br><span style="color: hsl(120, 100%, 40%);">+lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 1 (expected 1)</span><br><span style="color: hsl(120, 100%, 40%);">+   MS current power 13 -> 11 (expected 11)</span><br><span style="color: hsl(120, 100%, 40%);">+lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 0 (expected 0)</span><br><span style="color: hsl(120, 100%, 40%);">+   MS current power 11 -> 11 (expected 11)</span><br><span style="color: hsl(120, 100%, 40%);">+lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 1 (expected 1)</span><br><span style="color: hsl(120, 100%, 40%);">+   MS current power 11 -> 9 (expected 9)</span><br><span style="color: hsl(120, 100%, 40%);">+lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 0 (expected 0)</span><br><span style="color: hsl(120, 100%, 40%);">+     MS current power 9 -> 9 (expected 9)</span><br><span style="color: hsl(120, 100%, 40%);">+lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 1 (expected 1)</span><br><span style="color: hsl(120, 100%, 40%);">+      MS current power 9 -> 7 (expected 7)</span><br><span style="color: hsl(120, 100%, 40%);">+lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 0 (expected 0)</span><br><span style="color: hsl(120, 100%, 40%);">+      MS current power 7 -> 7 (expected 7)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+test_power_ctrl_interval(): power control interval is now 2</span><br><span style="color: hsl(120, 100%, 40%);">+lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 1 (expected 1)</span><br><span style="color: hsl(120, 100%, 40%);">+       MS current power 15 -> 13 (expected 13)</span><br><span style="color: hsl(120, 100%, 40%);">+lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 0 (expected 0)</span><br><span style="color: hsl(120, 100%, 40%);">+   MS current power 13 -> 13 (expected 13)</span><br><span style="color: hsl(120, 100%, 40%);">+lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 0 (expected 0)</span><br><span style="color: hsl(120, 100%, 40%);">+   MS current power 13 -> 13 (expected 13)</span><br><span style="color: hsl(120, 100%, 40%);">+lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 0 (expected 0)</span><br><span style="color: hsl(120, 100%, 40%);">+   MS current power 13 -> 13 (expected 13)</span><br><span style="color: hsl(120, 100%, 40%);">+lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 1 (expected 1)</span><br><span style="color: hsl(120, 100%, 40%);">+   MS current power 13 -> 11 (expected 11)</span><br><span style="color: hsl(120, 100%, 40%);">+lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 0 (expected 0)</span><br><span style="color: hsl(120, 100%, 40%);">+   MS current power 11 -> 11 (expected 11)</span><br><span style="color: hsl(120, 100%, 40%);">+lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 0 (expected 0)</span><br><span style="color: hsl(120, 100%, 40%);">+   MS current power 11 -> 11 (expected 11)</span><br><span style="color: hsl(120, 100%, 40%);">+lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 0 (expected 0)</span><br><span style="color: hsl(120, 100%, 40%);">+   MS current power 11 -> 11 (expected 11)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> Power loop test OK</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/22781">change 22781</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/+/22781"/><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: Ibf9956b2c6d829b38e9fda7d1f29790036219f42 </div>
<div style="display:none"> Gerrit-Change-Number: 22781 </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: fixeria <vyanitskiy@sysmocom.de> </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>