<p>dexter has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/16170">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">rsl: ensure measurement reports are sent<br><br>osmo-bts currently does not generate a measurement report in case the<br>SACCH of the related traffic channel is lost. This is a problem because<br>the moment when reception gets bad measurmenet reporting is crucial to<br>carry out handover decisions effectively.<br><br>The presence of a SACCH block controls the conclusion of the measurement<br>interval and the sending of the RSL measurement report. The latter one<br>not only requires a measurmenet indication, it also requires a fully<br>intact SACCH block.<br><br>Lets use the NOPE / IDLE indications from V1 of the TRXD protocol to<br>ensure a SACCH block is always reported up to l1sap.c. In cases where<br>the SACCH is bad, trigger the sending of the RSL measurement report<br>manually without attaching the measurmenet data from the MS (which we do<br>not have in this case)<br><br>Related: OS#2975<br>Change-Id: Idfa8ef94e8cf131ff234dac8f93f337051663ae2<br>---<br>M include/osmo-bts/rsl.h<br>M src/common/l1sap.c<br>M src/common/rsl.c<br>M src/common/scheduler.c<br>4 files changed, 24 insertions(+), 5 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/70/16170/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/rsl.h b/include/osmo-bts/rsl.h</span><br><span>index 186018e..ff6c2a8 100644</span><br><span>--- a/include/osmo-bts/rsl.h</span><br><span>+++ b/include/osmo-bts/rsl.h</span><br><span>@@ -45,4 +45,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(120, 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%);">+</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 7bf0b09..47368b7 100644</span><br><span>--- a/src/common/l1sap.c</span><br><span>+++ b/src/common/l1sap.c</span><br><span>@@ -1235,8 +1235,20 @@</span><br><span> </span><br><span>       /* bad frame */</span><br><span>      if (len == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-         if (L1SAP_IS_LINK_SACCH(link_id))</span><br><span style="color: hsl(120, 100%, 40%);">+             if (L1SAP_IS_LINK_SACCH(link_id)) {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                 /* In case we loose a SACCH block on the traffic we</span><br><span style="color: hsl(120, 100%, 40%);">+                    * must take care that the related measurement report</span><br><span style="color: hsl(120, 100%, 40%);">+                  * is sent via RSL. This is a fallback method. The</span><br><span style="color: hsl(120, 100%, 40%);">+                     * report will also lack the measurement report from</span><br><span style="color: hsl(120, 100%, 40%);">+                   * the MS side. See also rsl.c:lapdm_rll_tx_cb() */</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (lchan->type == GSM_LCHAN_TCH_F || lchan->type == GSM_LCHAN_TCH_H) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         le = &lchan->lapdm_ch.lapdm_acch;</span><br><span style="color: hsl(120, 100%, 40%);">+                              rsl_tx_meas_res(lchan, NULL, 0, le);</span><br><span style="color: hsl(120, 100%, 40%);">+                  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                  radio_link_timeout(lchan, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span>            return -EINVAL;</span><br><span>      }</span><br><span> </span><br><span>diff --git a/src/common/rsl.c b/src/common/rsl.c</span><br><span>index 09a9217..61f3a38 100644</span><br><span>--- a/src/common/rsl.c</span><br><span>+++ b/src/common/rsl.c</span><br><span>@@ -2837,8 +2837,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%);">-/* 8.4.8 MEASUREMENT RESult */</span><br><span style="color: hsl(0, 100%, 40%);">-static 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 */</span><br><span style="color: hsl(120, 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> {</span><br><span>      struct msgb *msg;</span><br><span>    uint8_t meas_res[16];</span><br><span>@@ -2898,9 +2898,12 @@</span><br><span>               msgb_tv_fixed_put(msg, RSL_IE_L1_INFO, 2, lchan->meas.l1_info);</span><br><span>           lchan->meas.flags &= ~LC_UL_M_F_L1_VALID;</span><br><span>     }</span><br><span style="color: hsl(0, 100%, 40%);">-       msgb_tl16v_put(msg, RSL_IE_L3_INFO, l3_len, l3);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (l3 && l3_len > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+              msgb_tl16v_put(msg, RSL_IE_L3_INFO, l3_len, l3);</span><br><span>     if (ms_to_valid(lchan)) {</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(120, 100%, 40%);">+              if (l3 && l3_len > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                      msgb_tv_put(msg, RSL_IE_MS_TIMING_OFFSET, ms_to2rsl(lchan, le));</span><br><span>             lchan->ms_t_offs = -1;</span><br><span>            lchan->p_offs = -1;</span><br><span>       }</span><br><span>diff --git a/src/common/scheduler.c b/src/common/scheduler.c</span><br><span>index fe93c32..1c2755e 100644</span><br><span>--- a/src/common/scheduler.c</span><br><span>+++ b/src/common/scheduler.c</span><br><span>@@ -191,6 +191,7 @@</span><br><span>                 .rts_fn = rts_tchf_fn,</span><br><span>               .dl_fn = tx_tchf_fn,</span><br><span>                 .ul_fn = rx_tchf_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+          .nope_fn = rx_tchf_fn,</span><br><span>       },</span><br><span>   [TRXC_TCHH_0] = {</span><br><span>            .name = "TCH/H(0)", /* 3GPP TS 05.02, section 3.2 */</span><br><span>@@ -365,6 +366,7 @@</span><br><span>                 .rts_fn = rts_data_fn,</span><br><span>               .dl_fn = tx_data_fn,</span><br><span>                 .ul_fn = rx_data_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+          .nope_fn = rx_data_fn,</span><br><span>       },</span><br><span>   [TRXC_SACCHTH_0] = {</span><br><span>                 .name = "SACCH/TH(0)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/16170">change 16170</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/+/16170"/><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: Idfa8ef94e8cf131ff234dac8f93f337051663ae2 </div>
<div style="display:none"> Gerrit-Change-Number: 16170 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>