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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Move TA & Power Loops further up the stack, take DTXu flag into account<br><br>Only once we receive the Measurement Result on L3 from MS we are able to<br>find out whether DTXu was used, and hence whether SUB or FULL<br>measurement set should be used.<br><br>Let's move all control loops there to have them in one place together,<br>and have it at a similar level where it would lay if it was to be<br>implemented in the BSC.<br><br>Related: SYS#4917<br>Change-Id: Ic152473577ff7c33d30b3f4ee7e321fcb523f723<br>---<br>M src/common/l1sap.c<br>M src/common/measurement.c<br>2 files changed, 50 insertions(+), 34 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/common/l1sap.c b/src/common/l1sap.c</span><br><span>index 7e04a3a..a48287c 100644</span><br><span>--- a/src/common/l1sap.c</span><br><span>+++ b/src/common/l1sap.c</span><br><span>@@ -52,8 +52,6 @@</span><br><span> #include <osmo-bts/abis.h></span><br><span> #include <osmo-bts/bts_model.h></span><br><span> #include <osmo-bts/handover.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmo-bts/power_control.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmo-bts/ta_control.h></span><br><span> #include <osmo-bts/msg_utils.h></span><br><span> #include <osmo-bts/pcuif_proto.h></span><br><span> #include <osmo-bts/cbch.h></span><br><span>@@ -1533,8 +1531,6 @@</span><br><span>        uint32_t fn;</span><br><span>         enum osmo_ph_pres_info_type pr_info = data_ind->pdch_presence_info;</span><br><span>       struct gsm_sacch_l1_hdr *l1_hdr;</span><br><span style="color: hsl(0, 100%, 40%);">-        int8_t ul_rssi;</span><br><span style="color: hsl(0, 100%, 40%);">- int16_t ul_ci_cb;</span><br><span> </span><br><span>        chan_nr = data_ind->chan_nr;</span><br><span>      link_id = data_ind->link_id;</span><br><span>@@ -1609,16 +1605,6 @@</span><br><span>                     handle_ms_meas_report(lchan, NULL, 0);</span><br><span> </span><br><span>                   radio_link_timeout(lchan, true);</span><br><span style="color: hsl(0, 100%, 40%);">-                        lchan_ms_ta_ctrl(lchan, lchan->ta_ctrl.current, lchan->meas.ms_toa256);</span><br><span style="color: hsl(0, 100%, 40%);">-                   /* If DTx is active on Downlink, use the '-SUB', otherwise '-FULL': */</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (lchan->tch.dtx.dl_active) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              ul_rssi = rxlev2dbm(lchan->meas.ul_res.sub.rx_lev);</span><br><span style="color: hsl(0, 100%, 40%);">-                          ul_ci_cb = lchan->meas.ul_ci_cb_sub;</span><br><span style="color: hsl(0, 100%, 40%);">-                 } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                ul_rssi = rxlev2dbm(lchan->meas.ul_res.full.rx_lev);</span><br><span style="color: hsl(0, 100%, 40%);">-                         ul_ci_cb = lchan->meas.ul_ci_cb_full;</span><br><span style="color: hsl(0, 100%, 40%);">-                        }</span><br><span style="color: hsl(0, 100%, 40%);">-                       lchan_ms_pwr_ctrl(lchan, lchan->ms_power_ctrl.current, ul_rssi, ul_ci_cb);</span><br><span>                }</span><br><span>            return -EINVAL;</span><br><span>      }</span><br><span>@@ -1645,26 +1631,6 @@</span><br><span>           lchan->meas.l1_info.srr_sro = l1_hdr->srr_sro;</span><br><span>                 lchan->meas.l1_info.ta = l1_hdr->ta;</span><br><span>           lchan->meas.flags |= LC_UL_M_F_L1_VALID;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-             /* 3GPP TS 45.008 sec 4.2: UL L1 SACCH Header contains TA and</span><br><span style="color: hsl(0, 100%, 40%);">-            * MS_PWR used "for the last burst of the previous SACCH</span><br><span style="color: hsl(0, 100%, 40%);">-            * period". Since MS must use the values provided in DL SACCH</span><br><span style="color: hsl(0, 100%, 40%);">-               * starting at next meas period, the value of the "last burst"</span><br><span style="color: hsl(0, 100%, 40%);">-                 * is actually the value used in the entire meas period. Since</span><br><span style="color: hsl(0, 100%, 40%);">-           * it contains info about the previous meas period, we want to</span><br><span style="color: hsl(0, 100%, 40%);">-           * feed the Control Loop with the measurements for the same</span><br><span style="color: hsl(0, 100%, 40%);">-              * period (the previous one), which is stored in lchan->meas(.ul_res): */</span><br><span style="color: hsl(0, 100%, 40%);">-            lchan_ms_ta_ctrl(lchan, l1_hdr->ta, lchan->meas.ms_toa256);</span><br><span style="color: hsl(0, 100%, 40%);">-               /* If DTx is active on Downlink, use the '-SUB', otherwise '-FULL': */</span><br><span style="color: hsl(0, 100%, 40%);">-          if (lchan->tch.dtx.dl_active) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      ul_rssi = rxlev2dbm(lchan->meas.ul_res.sub.rx_lev);</span><br><span style="color: hsl(0, 100%, 40%);">-                  ul_ci_cb = lchan->meas.ul_ci_cb_sub;</span><br><span style="color: hsl(0, 100%, 40%);">-         } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        ul_rssi = rxlev2dbm(lchan->meas.ul_res.full.rx_lev);</span><br><span style="color: hsl(0, 100%, 40%);">-                 ul_ci_cb = lchan->meas.ul_ci_cb_full;</span><br><span style="color: hsl(0, 100%, 40%);">-                }</span><br><span style="color: hsl(0, 100%, 40%);">-               lchan_ms_pwr_ctrl(lchan, l1_hdr->ms_pwr, ul_rssi, ul_ci_cb);</span><br><span style="color: hsl(0, 100%, 40%);">-         lchan_bs_pwr_ctrl(lchan, (const struct gsm48_hdr *) &data[5]);</span><br><span>   } else</span><br><span>               le = &lchan->lapdm_ch.lapdm_dcch;</span><br><span> </span><br><span>diff --git a/src/common/measurement.c b/src/common/measurement.c</span><br><span>index 5b46f79..7dc0bf1 100644</span><br><span>--- a/src/common/measurement.c</span><br><span>+++ b/src/common/measurement.c</span><br><span>@@ -10,6 +10,8 @@</span><br><span> #include <osmo-bts/measurement.h></span><br><span> #include <osmo-bts/scheduler.h></span><br><span> #include <osmo-bts/rsl.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/power_control.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/ta_control.h></span><br><span> </span><br><span> /* Tables as per TS 45.008 Section 8.3 */</span><br><span> static const uint8_t ts45008_83_tch_f[] = { 52, 53, 54, 55, 56, 57, 58, 59 };</span><br><span>@@ -793,12 +795,60 @@</span><br><span> {</span><br><span>       int timing_offset, rc;</span><br><span>       struct lapdm_entity *le;</span><br><span style="color: hsl(120, 100%, 40%);">+      bool dtxu_used;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t ms_pwr;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t ms_ta;</span><br><span style="color: hsl(120, 100%, 40%);">+        int8_t ul_rssi;</span><br><span style="color: hsl(120, 100%, 40%);">+       int16_t ul_ci_cb;</span><br><span> </span><br><span>        le = &lchan->lapdm_ch.lapdm_acch;</span><br><span> </span><br><span>         timing_offset = ms_to_valid(lchan) ? ms_to2rsl(lchan, le) : -1;</span><br><span>      rc = rsl_tx_meas_res(lchan, (uint8_t *)gh, len, timing_offset);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   /* Run control loops now that we have all the information: */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* 3GPP TS 45.008 sec 4.2: UL L1 SACCH Header contains TA and</span><br><span style="color: hsl(120, 100%, 40%);">+  * MS_PWR used "for the last burst of the previous SACCH</span><br><span style="color: hsl(120, 100%, 40%);">+  * period". Since MS must use the values provided in DL SACCH</span><br><span style="color: hsl(120, 100%, 40%);">+     * starting at next meas period, the value of the "last burst"</span><br><span style="color: hsl(120, 100%, 40%);">+       * is actually the value used in the entire meas period. Since</span><br><span style="color: hsl(120, 100%, 40%);">+         * it contains info about the previous meas period, we want to</span><br><span style="color: hsl(120, 100%, 40%);">+         * feed the Control Loop with the measurements for the same</span><br><span style="color: hsl(120, 100%, 40%);">+    * period (the previous one), which is stored in lchan->meas(.ul_res):</span><br><span style="color: hsl(120, 100%, 40%);">+      */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (len == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+               dtxu_used = true;</span><br><span style="color: hsl(120, 100%, 40%);">+             ms_ta = lchan->ta_ctrl.current;</span><br><span style="color: hsl(120, 100%, 40%);">+            ms_pwr = lchan->ms_power_ctrl.current;</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* if len!=0, it means we were able to parse L1Header in UL SACCH: */</span><br><span style="color: hsl(120, 100%, 40%);">+         OSMO_ASSERT(lchan->meas.flags | LC_UL_M_F_L1_VALID);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             ms_ta = lchan->meas.l1_info.ta;</span><br><span style="color: hsl(120, 100%, 40%);">+            ms_pwr = lchan->meas.l1_info.ms_pwr;</span><br><span style="color: hsl(120, 100%, 40%);">+               switch (gh->msg_type) {</span><br><span style="color: hsl(120, 100%, 40%);">+            case GSM48_MT_RR_MEAS_REP:</span><br><span style="color: hsl(120, 100%, 40%);">+                    dtxu_used = (len > sizeof(*gh) + 1) && !!(gh->data[0] & 0x40);</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case GSM48_MT_RR_EXT_MEAS_REP:</span><br><span style="color: hsl(120, 100%, 40%);">+                default:</span><br><span style="color: hsl(120, 100%, 40%);">+                      dtxu_used = true; /* FIXME: not implemented */</span><br><span style="color: hsl(120, 100%, 40%);">+                        break;</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%);">+   if (dtxu_used) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ul_rssi = rxlev2dbm(lchan->meas.ul_res.sub.rx_lev);</span><br><span style="color: hsl(120, 100%, 40%);">+                ul_ci_cb = lchan->meas.ul_ci_cb_sub;</span><br><span style="color: hsl(120, 100%, 40%);">+       } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              ul_rssi = rxlev2dbm(lchan->meas.ul_res.full.rx_lev);</span><br><span style="color: hsl(120, 100%, 40%);">+               ul_ci_cb = lchan->meas.ul_ci_cb_full;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     lchan_ms_ta_ctrl(lchan, ms_ta, lchan->meas.ms_toa256);</span><br><span style="color: hsl(120, 100%, 40%);">+     lchan_ms_pwr_ctrl(lchan, ms_pwr, ul_rssi, ul_ci_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (gh)</span><br><span style="color: hsl(120, 100%, 40%);">+               lchan_bs_pwr_ctrl(lchan, (const struct gsm48_hdr *) gh);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   /* Reset state for next iteration */</span><br><span>         lchan->meas.res_nr++;</span><br><span>     lchan->tch.dtx.dl_active = false;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/25617">change 25617</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/+/25617"/><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: Ic152473577ff7c33d30b3f4ee7e321fcb523f723 </div>
<div style="display:none"> Gerrit-Change-Number: 25617 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </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: dexter <pmaier@sysmocom.de> </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>