<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/16170">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  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;">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>Depends: osmo-ttcn3-hacks Ib2f511991349ab15e02db9c5e45f0df3645835a4<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>M src/osmo-bts-trx/scheduler_trx.c<br>5 files changed, 41 insertions(+), 8 deletions(-)<br><br></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 b6e21fa..4930257 100644</span><br><span>--- a/src/common/l1sap.c</span><br><span>+++ b/src/common/l1sap.c</span><br><span>@@ -1238,8 +1238,17 @@</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%);">+                   /* In case we loose a SACCH block, we must take care</span><br><span style="color: hsl(120, 100%, 40%);">+                   * that the related measurement report is sent via RSL.</span><br><span style="color: hsl(120, 100%, 40%);">+                        * This is a fallback method. The report will also</span><br><span style="color: hsl(120, 100%, 40%);">+                     * lack the measurement report from the MS side. See</span><br><span style="color: hsl(120, 100%, 40%);">+                   * also rsl.c:lapdm_rll_tx_cb() */</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>                       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 b315d30..d7e3565 100644</span><br><span>--- a/src/common/rsl.c</span><br><span>+++ b/src/common/rsl.c</span><br><span>@@ -2834,8 +2834,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>@@ -2895,9 +2895,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..3713b06 100644</span><br><span>--- a/src/common/scheduler.c</span><br><span>+++ b/src/common/scheduler.c</span><br><span>@@ -365,6 +365,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>@@ -376,6 +377,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_1] = {</span><br><span>                 .name = "SACCH/TH(1)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>@@ -387,6 +389,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_SACCH4_0] = {</span><br><span>          .name = "SACCH/4(0)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>@@ -398,6 +401,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_SACCH4_1] = {</span><br><span>          .name = "SACCH/4(1)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>@@ -409,6 +413,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_SACCH4_2] = {</span><br><span>          .name = "SACCH/4(2)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>@@ -420,6 +425,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_SACCH4_3] = {</span><br><span>          .name = "SACCH/4(3)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>@@ -431,6 +437,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_SACCH8_0] = {</span><br><span>          .name = "SACCH/8(0)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>@@ -442,6 +449,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_SACCH8_1] = {</span><br><span>          .name = "SACCH/8(1)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>@@ -453,6 +461,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_SACCH8_2] = {</span><br><span>          .name = "SACCH/8(2)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>@@ -464,6 +473,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_SACCH8_3] = {</span><br><span>          .name = "SACCH/8(3)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>@@ -475,6 +485,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_SACCH8_4] = {</span><br><span>          .name = "SACCH/8(4)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>@@ -486,6 +497,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_SACCH8_5] = {</span><br><span>          .name = "SACCH/8(5)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>@@ -497,6 +509,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_SACCH8_6] = {</span><br><span>          .name = "SACCH/8(6)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>@@ -508,6 +521,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_SACCH8_7] = {</span><br><span>          .name = "SACCH/8(7)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>@@ -519,6 +533,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_PDTCH] = {</span><br><span>             .name = "PDTCH", /* 3GPP TS 05.02, sections 3.2.4, 3.3.2.4 */</span><br><span>diff --git a/src/osmo-bts-trx/scheduler_trx.c b/src/osmo-bts-trx/scheduler_trx.c</span><br><span>index c3608bf..2785d09 100644</span><br><span>--- a/src/osmo-bts-trx/scheduler_trx.c</span><br><span>+++ b/src/osmo-bts-trx/scheduler_trx.c</span><br><span>@@ -945,10 +945,14 @@</span><br><span>                 (*ci_cb_num)++;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* copy burst to buffer of 4 bursts */</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Copy burst to buffer of 4 bursts. If the burst indication contains</span><br><span style="color: hsl(120, 100%, 40%);">+  * no data, ensure that the buffer does not stay uninitalized */</span><br><span>     burst = *bursts_p + bid * 116;</span><br><span style="color: hsl(0, 100%, 40%);">-  memcpy(burst, bi->burst + 3, 58);</span><br><span style="color: hsl(0, 100%, 40%);">-    memcpy(burst + 58, bi->burst + 87, 58);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (bi->burst_len > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                memcpy(burst, bi->burst + 3, 58);</span><br><span style="color: hsl(120, 100%, 40%);">+          memcpy(burst + 58, bi->burst + 87, 58);</span><br><span style="color: hsl(120, 100%, 40%);">+    } else</span><br><span style="color: hsl(120, 100%, 40%);">+                memset(burst, 0, 58 * 2);</span><br><span> </span><br><span>        /* send burst information to loops process */</span><br><span>        if (L1SAP_IS_LINK_SACCH(trx_chan_desc[chan].link_id)) {</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: 7 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@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 <axilirator@gmail.com> </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>