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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Decouple handling of Measurement Report from lapdm<br><br>This is a preparation commit in order to move power loops up in the<br>stack in order to have DTXu information available, in order to decide<br>whether SUB or FULL ul measurements should be used in the MS Power<br>Control Loop.<br><br>Function rsl_tx_meas_res() is stripped from code changing state, and it<br>simply encodes content and transmits the message.<br><br>Change-Id: Id67259ec9ac4c2c33bd0eef3f64450affbe3fb9f<br>---<br>M include/osmo-bts/measurement.h<br>M include/osmo-bts/rsl.h<br>M src/common/l1sap.c<br>M src/common/measurement.c<br>M src/common/rsl.c<br>5 files changed, 44 insertions(+), 28 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/measurement.h b/include/osmo-bts/measurement.h</span><br><span>index 45f275f..481b7be 100644</span><br><span>--- a/include/osmo-bts/measurement.h</span><br><span>+++ b/include/osmo-bts/measurement.h</span><br><span>@@ -20,4 +20,6 @@</span><br><span> </span><br><span> int is_meas_complete(struct gsm_lchan *lchan, uint32_t fn);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int handle_ms_meas_report(struct gsm_lchan *lchan, struct gsm48_hdr *gh, unsigned int len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #endif</span><br><span>diff --git a/include/osmo-bts/rsl.h b/include/osmo-bts/rsl.h</span><br><span>index 4e79de5..1663006 100644</span><br><span>--- a/include/osmo-bts/rsl.h</span><br><span>+++ b/include/osmo-bts/rsl.h</span><br><span>@@ -34,6 +34,6 @@</span><br><span> </span><br><span> int rsl_tx_cbch_load_indication(struct gsm_bts *bts, bool ext_cbch, bool overflow, uint8_t amount);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int rsl_tx_meas_res(struct gsm_lchan *lchan, uint8_t *l3, int l3_len, const struct lapdm_entity *le);</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_tx_meas_res(struct gsm_lchan *lchan, uint8_t *l3, int l3_len, int timing_offset);</span><br><span> </span><br><span> #endif // _RSL_H */</span><br><span>diff --git a/src/common/l1sap.c b/src/common/l1sap.c</span><br><span>index 2ebd39a..7e04a3a 100644</span><br><span>--- a/src/common/l1sap.c</span><br><span>+++ b/src/common/l1sap.c</span><br><span>@@ -1606,8 +1606,7 @@</span><br><span>                        * lack the measurement report from the MS side. See</span><br><span>                          * also rsl.c:lapdm_rll_tx_cb() */</span><br><span>                   LOGPGT(DL1P, LOGL_INFO, &g_time, "Lost SACCH block, faking meas reports and ms pwr\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                   le = &lchan->lapdm_ch.lapdm_acch;</span><br><span style="color: hsl(0, 100%, 40%);">-                        rsl_tx_meas_res(lchan, NULL, 0, le);</span><br><span style="color: hsl(120, 100%, 40%);">+                  handle_ms_meas_report(lchan, NULL, 0);</span><br><span> </span><br><span>                   radio_link_timeout(lchan, true);</span><br><span>                     lchan_ms_ta_ctrl(lchan, lchan->ta_ctrl.current, lchan->meas.ms_toa256);</span><br><span>diff --git a/src/common/measurement.c b/src/common/measurement.c</span><br><span>index a1c91a9..5b46f79 100644</span><br><span>--- a/src/common/measurement.c</span><br><span>+++ b/src/common/measurement.c</span><br><span>@@ -776,3 +776,35 @@</span><br><span>    memset(&lchan->meas, 0, sizeof(lchan->meas));</span><br><span>      lchan->meas.last_fn = LCHAN_FN_DUMMY;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static inline uint8_t ms_to2rsl(const struct gsm_lchan *lchan, const struct lapdm_entity *le)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     return (lchan->ms_t_offs >= 0) ? lchan->ms_t_offs : (lchan->p_offs - le->ta);</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%);">+static inline bool ms_to_valid(const struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   return (lchan->ms_t_offs >= 0) || (lchan->p_offs >= 0);</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%);">+/* Called every time a Measurement Result (TS 08.58 8.4.8) is received from</span><br><span style="color: hsl(120, 100%, 40%);">+ * lower layers and has to be forwarded to BSC */</span><br><span style="color: hsl(120, 100%, 40%);">+int handle_ms_meas_report(struct gsm_lchan *lchan, struct gsm48_hdr *gh, unsigned int len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       int timing_offset, rc;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct lapdm_entity *le;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    le = &lchan->lapdm_ch.lapdm_acch;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    timing_offset = ms_to_valid(lchan) ? ms_to2rsl(lchan, le) : -1;</span><br><span style="color: hsl(120, 100%, 40%);">+       rc = rsl_tx_meas_res(lchan, (uint8_t *)gh, len, timing_offset);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Reset state for next iteration */</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->meas.res_nr++;</span><br><span style="color: hsl(120, 100%, 40%);">+      lchan->tch.dtx.dl_active = false;</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->meas.flags &= ~LC_UL_M_F_OSMO_EXT_VALID;</span><br><span style="color: hsl(120, 100%, 40%);">+        lchan->meas.flags &= ~LC_UL_M_F_L1_VALID;</span><br><span style="color: hsl(120, 100%, 40%);">+      lchan->ms_t_offs = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+     lchan->p_offs = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+        return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/common/rsl.c b/src/common/rsl.c</span><br><span>index 742270d..e13160e 100644</span><br><span>--- a/src/common/rsl.c</span><br><span>+++ b/src/common/rsl.c</span><br><span>@@ -3490,16 +3490,6 @@</span><br><span>  return rc;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static inline uint8_t ms_to2rsl(const struct gsm_lchan *lchan, const struct lapdm_entity *le)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       return (lchan->ms_t_offs >= 0) ? lchan->ms_t_offs : (lchan->p_offs - le->ta);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static inline bool ms_to_valid(const struct gsm_lchan *lchan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     return (lchan->ms_t_offs >= 0) || (lchan->p_offs >= 0);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> struct osmo_bts_supp_meas_info {</span><br><span>     int16_t toa256_mean;</span><br><span>         int16_t toa256_min;</span><br><span>@@ -3507,8 +3497,8 @@</span><br><span>  uint16_t toa256_std_dev;</span><br><span> } __attribute__((packed));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Compose and send 8.4.8 MEASUREMENT RESult via RSL */</span><br><span style="color: hsl(0, 100%, 40%);">-int rsl_tx_meas_res(struct gsm_lchan *lchan, uint8_t *l3, int l3_len, const struct lapdm_entity *le)</span><br><span style="color: hsl(120, 100%, 40%);">+/* Compose and send 8.4.8 MEASUREMENT RESult via RSL. (timing_offset=-1 -> not present) */</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_tx_meas_res(struct gsm_lchan *lchan, uint8_t *l3, int l3_len, int timing_offset)</span><br><span> {</span><br><span>  struct msgb *msg;</span><br><span>    uint8_t meas_res[16];</span><br><span>@@ -3534,13 +3524,12 @@</span><br><span>           lchan->meas.ul_res.full.rx_qual,</span><br><span>          lchan->meas.ul_res.sub.rx_qual,</span><br><span>           lchan->meas.l1_info.ms_pwr,</span><br><span style="color: hsl(0, 100%, 40%);">-          lchan->meas.l1_info.ta, l3_len, ms_to2rsl(lchan, le) - MEAS_MAX_TIMING_ADVANCE);</span><br><span style="color: hsl(120, 100%, 40%);">+           lchan->meas.l1_info.ta, l3_len, timing_offset - MEAS_MAX_TIMING_ADVANCE);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   msgb_tv_put(msg, RSL_IE_MEAS_RES_NR, lchan->meas.res_nr++);</span><br><span style="color: hsl(120, 100%, 40%);">+        msgb_tv_put(msg, RSL_IE_MEAS_RES_NR, lchan->meas.res_nr);</span><br><span>         size_t ie_len = gsm0858_rsl_ul_meas_enc(&lchan->meas.ul_res,</span><br><span>                                          lchan->tch.dtx.dl_active,</span><br><span>                                                 meas_res);</span><br><span style="color: hsl(0, 100%, 40%);">-      lchan->tch.dtx.dl_active = false;</span><br><span>         if (ie_len >= 3) {</span><br><span>                if (bts->supp_meas_toa256 && lchan->meas.flags & LC_UL_M_F_OSMO_EXT_VALID) {</span><br><span>                       struct osmo_bts_supp_meas_info *smi;</span><br><span>@@ -3558,24 +3547,18 @@</span><br><span>                       smi->toa256_min = htons(ta256 + lchan->meas.ext.toa256_min);</span><br><span>                   smi->toa256_max = htons(ta256 + lchan->meas.ext.toa256_max);</span><br><span>                   smi->toa256_std_dev = htons(lchan->meas.ext.toa256_std_dev);</span><br><span style="color: hsl(0, 100%, 40%);">-                      lchan->meas.flags &= ~LC_UL_M_F_OSMO_EXT_VALID;</span><br><span>               }</span><br><span>            msgb_tlv_put(msg, RSL_IE_UPLINK_MEAS, ie_len, meas_res);</span><br><span style="color: hsl(0, 100%, 40%);">-                lchan->meas.flags &= ~LC_UL_M_F_RES_VALID;</span><br><span>    }</span><br><span>    msgb_tv_put(msg, RSL_IE_BS_POWER, lchan->bs_power_ctrl.current / 2);</span><br><span>      if (lchan->meas.flags & LC_UL_M_F_L1_VALID) {</span><br><span>                 msgb_tv_fixed_put(msg, RSL_IE_L1_INFO, sizeof(lchan->meas.l1_info), (uint8_t*)&lchan->meas.l1_info);</span><br><span style="color: hsl(0, 100%, 40%);">-          lchan->meas.flags &= ~LC_UL_M_F_L1_VALID;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (l3 && l3_len > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+      if (l3 && l3_len > 0) {</span><br><span>           msgb_tl16v_put(msg, RSL_IE_L3_INFO, l3_len, l3);</span><br><span style="color: hsl(0, 100%, 40%);">-        if (ms_to_valid(lchan)) {</span><br><span style="color: hsl(0, 100%, 40%);">-               if (l3 && l3_len > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                        msgb_tv_put(msg, RSL_IE_MS_TIMING_OFFSET, ms_to2rsl(lchan, le));</span><br><span style="color: hsl(0, 100%, 40%);">-                lchan->ms_t_offs = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-               lchan->p_offs = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+                if (timing_offset != -1)</span><br><span style="color: hsl(120, 100%, 40%);">+                      msgb_tv_put(msg, RSL_IE_MS_TIMING_OFFSET, timing_offset);</span><br><span>    }</span><br><span> </span><br><span>        rsl_dch_push_hdr(msg, RSL_MT_MEAS_RES, chan_nr);</span><br><span>@@ -3629,7 +3612,7 @@</span><br><span>             }</span><br><span> </span><br><span>                repeated_dl_facch_active_decision(lchan, msgb_l3(msg), msgb_l3len(msg));</span><br><span style="color: hsl(0, 100%, 40%);">-                rc = rsl_tx_meas_res(lchan, msgb_l3(msg), msgb_l3len(msg), le);</span><br><span style="color: hsl(120, 100%, 40%);">+               rc = handle_ms_meas_report(lchan, (struct gsm48_hdr *)msgb_l3(msg), msgb_l3len(msg));</span><br><span>                msgb_free(msg);</span><br><span>              return rc;</span><br><span>   } else if (rslms_is_gprs_susp_req(msg)) {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/25616">change 25616</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/+/25616"/><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: Id67259ec9ac4c2c33bd0eef3f64450affbe3fb9f </div>
<div style="display:none"> Gerrit-Change-Number: 25616 </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>