<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/26049">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">measurement: pass *mr to lchan_bs_pwr_ctrl()<br><br>Change-Id: I937117cf26fb718d57920382f6972390ad498c51<br>---<br>M include/osmo-bts/power_control.h<br>M src/common/measurement.c<br>M src/common/power_control.c<br>M tests/power/bs_power_loop_test.c<br>M tests/power/bs_power_loop_test.ok<br>5 files changed, 26 insertions(+), 61 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/49/26049/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/power_control.h b/include/osmo-bts/power_control.h</span><br><span>index e8b035d..0764ba7 100644</span><br><span>--- a/include/osmo-bts/power_control.h</span><br><span>+++ b/include/osmo-bts/power_control.h</span><br><span>@@ -87,4 +87,4 @@</span><br><span>                   const int16_t ul_lqual_cb);</span><br><span> </span><br><span> int lchan_bs_pwr_ctrl(struct gsm_lchan *lchan,</span><br><span style="color: hsl(0, 100%, 40%);">-               const struct gsm48_hdr *gh);</span><br><span style="color: hsl(120, 100%, 40%);">+                  const struct gsm48_meas_res *mr);</span><br><span>diff --git a/src/common/measurement.c b/src/common/measurement.c</span><br><span>index b25104e..52243fe 100644</span><br><span>--- a/src/common/measurement.c</span><br><span>+++ b/src/common/measurement.c</span><br><span>@@ -957,8 +957,8 @@</span><br><span>   }</span><br><span>    lchan_ms_ta_ctrl(lchan, ms_ta, lchan->meas.ms_toa256);</span><br><span>    lchan_ms_pwr_ctrl(lchan, ms_pwr, ul_rssi, ul_ci_cb);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (gh)</span><br><span style="color: hsl(0, 100%, 40%);">-         lchan_bs_pwr_ctrl(lchan, gh);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (mr)</span><br><span style="color: hsl(120, 100%, 40%);">+               lchan_bs_pwr_ctrl(lchan, mr);</span><br><span> </span><br><span>    repeated_dl_facch_active_decision(lchan, mr);</span><br><span> </span><br><span>diff --git a/src/common/power_control.c b/src/common/power_control.c</span><br><span>index a81000e..73a30da 100644</span><br><span>--- a/src/common/power_control.c</span><br><span>+++ b/src/common/power_control.c</span><br><span>@@ -314,43 +314,30 @@</span><br><span>  *  \param[in] gh pointer to the beginning of (presumably) a Measurement Report.</span><br><span>  */</span><br><span> int lchan_bs_pwr_ctrl(struct gsm_lchan *lchan,</span><br><span style="color: hsl(0, 100%, 40%);">-                   const struct gsm48_hdr *gh)</span><br><span style="color: hsl(120, 100%, 40%);">+                   const struct gsm48_meas_res *mr)</span><br><span> {</span><br><span>  struct lchan_power_ctrl_state *state = &lchan->bs_power_ctrl;</span><br><span>         const struct gsm_power_ctrl_params *params = state->dpc_params;</span><br><span style="color: hsl(0, 100%, 40%);">-      uint8_t rxqual_full, rxqual_sub;</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t rxlev_full, rxlev_sub;</span><br><span>       uint8_t rxqual, rxqual_avg, rxlev, rxlev_avg;</span><br><span>        int new_att;</span><br><span> </span><br><span>     /* Check if dynamic BS Power Control is enabled */</span><br><span>   if (params == NULL)</span><br><span>          return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Check if this is a Measurement Report */</span><br><span style="color: hsl(0, 100%, 40%);">-     if (gh->proto_discr != GSM48_PDISC_RR)</span><br><span style="color: hsl(0, 100%, 40%);">-               return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       if (gh->msg_type != GSM48_MT_RR_MEAS_REP)</span><br><span style="color: hsl(0, 100%, 40%);">-            return 0;</span><br><span> </span><br><span>        /* Check if the measurement results are valid */</span><br><span style="color: hsl(0, 100%, 40%);">-        if ((gh->data[1] & 0x40) == 0x40) {</span><br><span style="color: hsl(120, 100%, 40%);">+    if (mr->meas_valid != 0) { /* 0 = valid */</span><br><span>                LOGPLCHAN(lchan, DLOOP, LOGL_DEBUG,</span><br><span>                    "The measurement results are not valid\n");</span><br><span>              return 0;</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* See 3GPP TS 44.018, section 10.5.2.20 */</span><br><span style="color: hsl(0, 100%, 40%);">-     rxqual_full = (gh->data[2] >> 4) & 0x7;</span><br><span style="color: hsl(0, 100%, 40%);">-    rxqual_sub = (gh->data[2] >> 1) & 0x7;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     rxlev_full = gh->data[0] & 0x3f;</span><br><span style="color: hsl(0, 100%, 40%);">- rxlev_sub = gh->data[1] & 0x3f;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>       LOGPLCHAN(lchan, DLOOP, LOGL_DEBUG, "Rx DL Measurement Report: "</span><br><span>             "RXLEV-FULL(%02u), RXQUAL-FULL(%u), "</span><br><span>              "RXLEV-SUB(%02u), RXQUAL-SUB(%u), "</span><br><span>                "DTx is %s => using %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                 rxlev_full, rxqual_full, rxlev_sub, rxqual_sub,</span><br><span style="color: hsl(120, 100%, 40%);">+               mr->rxlev_full, mr->rxqual_full,</span><br><span style="color: hsl(120, 100%, 40%);">+                mr->rxlev_sub, mr->rxqual_sub,</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>@@ -360,11 +347,11 @@</span><br><span> </span><br><span>         /* If DTx is active on Downlink, use the '-SUB' */</span><br><span>   if (lchan->tch.dtx.dl_active) {</span><br><span style="color: hsl(0, 100%, 40%);">-              rxqual = rxqual_sub;</span><br><span style="color: hsl(0, 100%, 40%);">-            rxlev = rxlev_sub;</span><br><span style="color: hsl(120, 100%, 40%);">+            rxqual = mr->rxqual_sub;</span><br><span style="color: hsl(120, 100%, 40%);">+           rxlev = mr->rxlev_sub;</span><br><span>    } else { /* ... otherwise use the '-FULL' */</span><br><span style="color: hsl(0, 100%, 40%);">-            rxqual = rxqual_full;</span><br><span style="color: hsl(0, 100%, 40%);">-           rxlev = rxlev_full;</span><br><span style="color: hsl(120, 100%, 40%);">+           rxqual = mr->rxqual_full;</span><br><span style="color: hsl(120, 100%, 40%);">+          rxlev = mr->rxlev_full;</span><br><span>   }</span><br><span> </span><br><span>        rxlev_avg = do_avg_algo(&params->rxlev_meas, &state->rxlev_meas_proc, rxlev);</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 6b67ba2..b5e5264 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>@@ -54,7 +54,6 @@</span><br><span> </span><br><span> enum power_test_step_type {</span><br><span>      PWR_TEST_ST_IND_MEAS = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-       PWR_TEST_ST_IND_DUMMY,</span><br><span>       PWR_TEST_ST_SET_STATE,</span><br><span>       PWR_TEST_ST_SET_CTRL_INTERVAL,</span><br><span>       PWR_TEST_ST_SET_STEP_SIZE,</span><br><span>@@ -123,15 +122,10 @@</span><br><span>   printf("\nStarting test case '%s'\n", name);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void enc_meas_rep(struct gsm48_hdr *gh,</span><br><span style="color: hsl(120, 100%, 40%);">+static void enc_meas_rep(struct gsm48_meas_res *mr,</span><br><span>                    const unsigned int n,</span><br><span>                        const struct power_test_step *step)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       struct gsm48_meas_res *mr = (struct gsm48_meas_res *) gh->data;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      gh->proto_discr = GSM48_PDISC_RR;</span><br><span style="color: hsl(0, 100%, 40%);">-    gh->msg_type = GSM48_MT_RR_MEAS_REP;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>      *mr = (struct gsm48_meas_res) {</span><br><span>              .rxlev_full = step->meas.rxlev_full,</span><br><span>              .rxlev_sub = step->meas.rxlev_sub,</span><br><span>@@ -153,11 +147,8 @@</span><br><span>                            const unsigned int n,</span><br><span>                        const struct power_test_step *step)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gsm48_hdr *gh;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm48_meas_res mr;</span><br><span>    uint8_t old, new;</span><br><span style="color: hsl(0, 100%, 40%);">-       uint8_t buf[18];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        gh = (struct gsm48_hdr *) buf;</span><br><span> </span><br><span>   switch (step->type) {</span><br><span>     case PWR_TEST_ST_SET_STATE:</span><br><span>@@ -192,20 +183,16 @@</span><br><span>          printf("#%02u %s() <- Enable DTXd\n", n, __func__);</span><br><span>             lchan->tch.dtx.dl_active = true;</span><br><span>          return 0; /* we're done */</span><br><span style="color: hsl(0, 100%, 40%);">-  case PWR_TEST_ST_IND_DUMMY:</span><br><span style="color: hsl(0, 100%, 40%);">-             printf("#%02u %s() <- Dummy block\n", n, __func__);</span><br><span style="color: hsl(0, 100%, 40%);">-                memset(buf, 0x2b, sizeof(buf));</span><br><span style="color: hsl(0, 100%, 40%);">-         break;</span><br><span>       case PWR_TEST_ST_IND_MEAS:</span><br><span style="color: hsl(0, 100%, 40%);">-              enc_meas_rep(gh, n, step);</span><br><span style="color: hsl(120, 100%, 40%);">+            enc_meas_rep(&mr, n, step);</span><br><span>              break;</span><br><span>       }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   printf("#%02u lchan_bs_pwr_ctrl() <- UL SACCH: %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-             n, osmo_hexdump(buf, sizeof(buf)));</span><br><span style="color: hsl(120, 100%, 40%);">+    printf("#%02u lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+             n, osmo_hexdump((void *)&mr, sizeof(mr)));</span><br><span> </span><br><span>    old = lchan->bs_power_ctrl.current;</span><br><span style="color: hsl(0, 100%, 40%);">-  lchan_bs_pwr_ctrl(lchan, gh);</span><br><span style="color: hsl(120, 100%, 40%);">+ lchan_bs_pwr_ctrl(lchan, &mr);</span><br><span>   new = lchan->bs_power_ctrl.current;</span><br><span> </span><br><span>   printf("#%02u lchan_bs_pwr_ctrl() -> BS power reduction: "</span><br><span>@@ -406,8 +393,8 @@</span><br><span>        { .meas = DL_MEAS_FULL_SUB(7, PWR_TEST_RXLEV_TARGET) }, /* max */</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Verify that invalid and dummy SACCH blocks are ignored. */</span><br><span style="color: hsl(0, 100%, 40%);">-static const struct power_test_step TC_inval_dummy[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+/* Verify that invalid measurement results are ignored. */</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct power_test_step TC_inval_meas[] = {</span><br><span>        /* Initial state: 16 dB, up to 20 dB */</span><br><span>      { .type = PWR_TEST_ST_SET_STATE,</span><br><span>       .state = { .current = 16, .max = 2 * 10 } },</span><br><span>@@ -416,12 +403,9 @@</span><br><span>        { .meas = DL_MEAS_FULL_SUB_INV(7, 63),                  .exp_txred = 16 },</span><br><span>   { .meas = DL_MEAS_FULL_SUB_INV(0, 0),                   .exp_txred = 16 },</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  /* Let's say SMS (SAPI=3) blocks substitute some of the reports */</span><br><span style="color: hsl(0, 100%, 40%);">-  { .meas = DL_MEAS_FULL_SUB(0, PWR_TEST_RXLEV_TARGET),   .exp_txred = 16 },</span><br><span style="color: hsl(0, 100%, 40%);">-      { .type = PWR_TEST_ST_IND_DUMMY, /* not a report */     .exp_txred = 16 },</span><br><span style="color: hsl(0, 100%, 40%);">-      { .meas = DL_MEAS_FULL_SUB(0, PWR_TEST_RXLEV_TARGET),   .exp_txred = 16 },</span><br><span style="color: hsl(0, 100%, 40%);">-      { .type = PWR_TEST_ST_IND_DUMMY, /* not a report */     .exp_txred = 16 },</span><br><span style="color: hsl(0, 100%, 40%);">-      { .meas = DL_MEAS_FULL_SUB(0, PWR_TEST_RXLEV_TARGET),   .exp_txred = 16 },</span><br><span style="color: hsl(120, 100%, 40%);">+    { .meas = DL_MEAS_FULL_SUB(0, PWR_TEST_RXLEV_TARGET),   .exp_txred = 16 },</span><br><span style="color: hsl(120, 100%, 40%);">+    { .meas = DL_MEAS_FULL_SUB(0, PWR_TEST_RXLEV_TARGET),   .exp_txred = 16 },</span><br><span style="color: hsl(120, 100%, 40%);">+    { .meas = DL_MEAS_FULL_SUB(0, PWR_TEST_RXLEV_TARGET),   .exp_txred = 16 },</span><br><span> };</span><br><span> </span><br><span> /* Verify handling of optional power control interval (P_Con_INTERVAL). */</span><br><span>@@ -545,7 +529,7 @@</span><br><span> </span><br><span>         exec_test(TC_dtxd_mode);</span><br><span>     exec_test(TC_rxqual_ber);</span><br><span style="color: hsl(0, 100%, 40%);">-       exec_test(TC_inval_dummy);</span><br><span style="color: hsl(120, 100%, 40%);">+    exec_test(TC_inval_meas);</span><br><span>    exec_test(TC_ctrl_interval);</span><br><span> </span><br><span>     exec_test(TC_rxlev_hyst);</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 2c12392..1001ba1 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>@@ -243,7 +243,7 @@</span><br><span> #16 lchan_bs_pwr_ctrl() -> BS power reduction: 0 -> 0 (expected 0)</span><br><span> Test case verdict: SUCCESS</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-Starting test case 'TC_inval_dummy'</span><br><span style="color: hsl(120, 100%, 40%);">+Starting test case 'TC_inval_meas'</span><br><span> #00 exec_power_step() <- State (re)set (current 16 dB, max 20 dB)</span><br><span> #01 enc_meas_rep() -> Measurement Results (invalid): RXLEV-FULL(63), RXQUAL-FULL(7), RXLEV-SUB(63), RXQUAL-SUB(7)</span><br><span> #01 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 3f 7f 7e 00 00 00 00 00 00 00 00 00 00 00 00 00 </span><br><span>@@ -254,18 +254,12 @@</span><br><span> #03 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0)</span><br><span> #03 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 1e 1e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 </span><br><span> #03 lchan_bs_pwr_ctrl() -> BS power reduction: 16 -> 16 (expected 16)</span><br><span style="color: hsl(0, 100%, 40%);">-#04 exec_power_step() <- Dummy block</span><br><span style="color: hsl(0, 100%, 40%);">-#04 lchan_bs_pwr_ctrl() <- UL SACCH: 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b </span><br><span style="color: hsl(120, 100%, 40%);">+#04 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0)</span><br><span style="color: hsl(120, 100%, 40%);">+#04 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 1e 1e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 </span><br><span> #04 lchan_bs_pwr_ctrl() -> BS power reduction: 16 -> 16 (expected 16)</span><br><span> #05 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0)</span><br><span> #05 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 1e 1e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 </span><br><span> #05 lchan_bs_pwr_ctrl() -> BS power reduction: 16 -> 16 (expected 16)</span><br><span style="color: hsl(0, 100%, 40%);">-#06 exec_power_step() <- Dummy block</span><br><span style="color: hsl(0, 100%, 40%);">-#06 lchan_bs_pwr_ctrl() <- UL SACCH: 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b </span><br><span style="color: hsl(0, 100%, 40%);">-#06 lchan_bs_pwr_ctrl() -> BS power reduction: 16 -> 16 (expected 16)</span><br><span style="color: hsl(0, 100%, 40%);">-#07 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0)</span><br><span style="color: hsl(0, 100%, 40%);">-#07 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 1e 1e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 </span><br><span style="color: hsl(0, 100%, 40%);">-#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> Starting test case 'TC_ctrl_interval'</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/26049">change 26049</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/+/26049"/><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: I937117cf26fb718d57920382f6972390ad498c51 </div>
<div style="display:none"> Gerrit-Change-Number: 26049 </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>