<p>Pau Espin Pedrol has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/11446">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bts-trx: Try decoding received UL bursts when SACCH frame detected as lost<br><br>This way if for instance only 1 out of 3 bursts was lost, reported ul<br>mesuarement is more similar to expected values.<br><br>Related: OS#3665<br>Change-Id: I910277df181df5082b234c1c97a75eebdffc2cb5<br>---<br>M src/osmo-bts-trx/scheduler_trx.c<br>1 file changed, 61 insertions(+), 41 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/46/11446/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo-bts-trx/scheduler_trx.c b/src/osmo-bts-trx/scheduler_trx.c</span><br><span>index fa3aed2..332a41d 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>@@ -65,6 +65,61 @@</span><br><span>          return 10000 * n_errors / n_bits_total;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void reset_ul_bursts(struct l1sched_chan_state *chan_state, uint32_t first_fn)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    if (chan_state->ul_bursts)</span><br><span style="color: hsl(120, 100%, 40%);">+         memset(chan_state->ul_bursts, 0, 464);</span><br><span style="color: hsl(120, 100%, 40%);">+     chan_state->ul_mask = 0x0;</span><br><span style="color: hsl(120, 100%, 40%);">+ chan_state->ul_first_fn = first_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+        chan_state->rssi_sum = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+  chan_state->rssi_num = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+  chan_state->toa256_sum = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        chan_state->toa_num = 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%);">+static int _submit_ph_data_ind_with_ul_meas_res(struct l1sched_trx *l1t, uint8_t tn,</span><br><span style="color: hsl(120, 100%, 40%);">+                                uint32_t fn, enum trx_chan_type chan,</span><br><span style="color: hsl(120, 100%, 40%);">+                         struct l1sched_chan_state *chan_state)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t l2[GSM_MACBLOCK_LEN], l2_len;</span><br><span style="color: hsl(120, 100%, 40%);">+ int n_errors, n_bits_total;</span><br><span style="color: hsl(120, 100%, 40%);">+   uint16_t ber10k;</span><br><span style="color: hsl(120, 100%, 40%);">+      float rssi;</span><br><span style="color: hsl(120, 100%, 40%);">+   int16_t toa256;</span><br><span style="color: hsl(120, 100%, 40%);">+       int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, tn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* empty mask -> empty buffer, no need to decode buffer (buffer may not even be allocated) */</span><br><span style="color: hsl(120, 100%, 40%);">+      if (chan_state->ul_mask == 0x0) {</span><br><span style="color: hsl(120, 100%, 40%);">+          l1if_process_meas_res(l1t->trx, tn, fn, trx_chan_desc[chan].chan_nr | tn,</span><br><span style="color: hsl(120, 100%, 40%);">+                                456, 456, -110, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+             ber10k = compute_ber10k(0, 456);</span><br><span style="color: hsl(120, 100%, 40%);">+              return _sched_compose_ph_data_ind(l1t, tn, 0, chan, NULL, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                     -110, 0, 0, ber10k,</span><br><span style="color: hsl(120, 100%, 40%);">+                           PRES_INFO_INVALID);</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%);">+   /* Once processed, erase mask so they are not used again, also invalidating ul_first_fn */</span><br><span style="color: hsl(120, 100%, 40%);">+    chan_state->ul_mask = 0x0;</span><br><span style="color: hsl(120, 100%, 40%);">+ rssi = chan_state->rssi_sum / chan_state->rssi_num;</span><br><span style="color: hsl(120, 100%, 40%);">+     toa256 = chan_state->toa256_sum / chan_state->toa_num;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* decode */</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = gsm0503_xcch_decode(l2, chan_state->ul_bursts, &n_errors, &n_bits_total);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (rc) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGL1S(DL1P, LOGL_NOTICE, l1t, tn, chan, fn, "Received bad data (%u/%u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                 chan_state->ul_first_fn, chan_state->ul_first_fn % l1ts->mf_period);</span><br><span style="color: hsl(120, 100%, 40%);">+         l2_len = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   } else</span><br><span style="color: hsl(120, 100%, 40%);">+                l2_len = GSM_MACBLOCK_LEN;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Send uplink measurement information to L2 */</span><br><span style="color: hsl(120, 100%, 40%);">+       l1if_process_meas_res(l1t->trx, tn, chan_state->ul_first_fn, trx_chan_desc[chan].chan_nr | tn,</span><br><span style="color: hsl(120, 100%, 40%);">+          n_errors, n_bits_total, rssi, toa256);</span><br><span style="color: hsl(120, 100%, 40%);">+        ber10k = compute_ber10k(n_bits_total, n_errors);</span><br><span style="color: hsl(120, 100%, 40%);">+      return _sched_compose_ph_data_ind(l1t, tn, chan_state->ul_first_fn, chan, l2, l2_len,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        rssi,  4 * toa256, 0, ber10k, PRES_INFO_UNKNOWN);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*</span><br><span>  * TX on downlink</span><br><span>  */</span><br><span>@@ -194,16 +249,9 @@</span><br><span>    if (L1SAP_IS_LINK_SACCH(trx_chan_desc[chan].link_id)) {</span><br><span>              /* count and send BFI */</span><br><span>             if (++(l1ts->chan_state[chan].lost_frames) > 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 /* TODO: Should we pass old TOA here? Otherwise we risk</span><br><span style="color: hsl(0, 100%, 40%);">-                  * unnecessary decreasing TA */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                 /* Send uplink measurement information to L2 */</span><br><span style="color: hsl(0, 100%, 40%);">-                 l1if_process_meas_res(l1t->trx, tn, fn, trx_chan_desc[chan].chan_nr | tn,</span><br><span style="color: hsl(0, 100%, 40%);">-                            456, 456, -110, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-                     /* FIXME: use actual values for BER etc */</span><br><span style="color: hsl(0, 100%, 40%);">-                      _sched_compose_ph_data_ind(l1t, tn, 0, chan, NULL, 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                                              -110, 0, 0, 10000,</span><br><span style="color: hsl(0, 100%, 40%);">-                                              PRES_INFO_INVALID);</span><br><span style="color: hsl(120, 100%, 40%);">+                        _submit_ph_data_ind_with_ul_meas_res(l1t, tn, fn, chan, &l1ts->chan_state[chan]);</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* Don't keep re-sending same meas result cached over and over */</span><br><span style="color: hsl(120, 100%, 40%);">+                 reset_ul_bursts(&l1ts->chan_state[chan], fn);</span><br><span>                 }</span><br><span>    }</span><br><span> </span><br><span>@@ -767,10 +815,6 @@</span><br><span>         uint8_t *rssi_num = &chan_state->rssi_num;</span><br><span>    int32_t *toa256_sum = &chan_state->toa256_sum;</span><br><span>        uint8_t *toa_num = &chan_state->toa_num;</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t l2[GSM_MACBLOCK_LEN], l2_len;</span><br><span style="color: hsl(0, 100%, 40%);">-   int n_errors, n_bits_total;</span><br><span style="color: hsl(0, 100%, 40%);">-     uint16_t ber10k;</span><br><span style="color: hsl(0, 100%, 40%);">-        int rc;</span><br><span> </span><br><span>  /* handle RACH, if handover RACH detection is turned on */</span><br><span>   if (chan_state->ho_rach_detect == 1)</span><br><span>@@ -786,15 +830,8 @@</span><br><span>       }</span><br><span> </span><br><span>        /* clear burst & store frame number of first burst */</span><br><span style="color: hsl(0, 100%, 40%);">-       if (bid == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-         memset(*bursts_p, 0, 464);</span><br><span style="color: hsl(0, 100%, 40%);">-              *mask = 0x0;</span><br><span style="color: hsl(0, 100%, 40%);">-            *first_fn = fn;</span><br><span style="color: hsl(0, 100%, 40%);">-         *rssi_sum = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-          *rssi_num = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-          *toa256_sum = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                *toa_num = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (bid == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+         reset_ul_bursts(chan_state, fn);</span><br><span> </span><br><span>         /* update mask + RSSI */</span><br><span>     *mask |= (1 << bid);</span><br><span>@@ -829,25 +866,8 @@</span><br><span>                    return 0;</span><br><span>            }</span><br><span>    }</span><br><span style="color: hsl(0, 100%, 40%);">-       *mask = 0x0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        /* decode */</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = gsm0503_xcch_decode(l2, *bursts_p, &n_errors, &n_bits_total);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (rc) {</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGL1S(DL1P, LOGL_NOTICE, l1t, tn, chan, fn, "Received bad data (%u/%u)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                   *first_fn, (*first_fn) % l1ts->mf_period);</span><br><span style="color: hsl(0, 100%, 40%);">-           l2_len = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-     } else</span><br><span style="color: hsl(0, 100%, 40%);">-          l2_len = GSM_MACBLOCK_LEN;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* Send uplink measurement information to L2 */</span><br><span style="color: hsl(0, 100%, 40%);">- l1if_process_meas_res(l1t->trx, tn, *first_fn, trx_chan_desc[chan].chan_nr | tn,</span><br><span style="color: hsl(0, 100%, 40%);">-             n_errors, n_bits_total, *rssi_sum / *rssi_num, *toa256_sum / *toa_num);</span><br><span style="color: hsl(0, 100%, 40%);">- ber10k = compute_ber10k(n_bits_total, n_errors);</span><br><span style="color: hsl(0, 100%, 40%);">-        return _sched_compose_ph_data_ind(l1t, tn, *first_fn, chan, l2, l2_len,</span><br><span style="color: hsl(0, 100%, 40%);">-                                   *rssi_sum / *rssi_num,</span><br><span style="color: hsl(0, 100%, 40%);">-                                          4 * (*toa256_sum) / *toa_num, 0, ber10k,</span><br><span style="color: hsl(0, 100%, 40%);">-                                        PRES_INFO_UNKNOWN);</span><br><span style="color: hsl(120, 100%, 40%);">+ return _submit_ph_data_ind_with_ul_meas_res(l1t, tn, fn, chan, chan_state);</span><br><span> }</span><br><span> </span><br><span> /*! \brief a single PDTCH burst was received by the PHY, process it */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11446">change 11446</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/11446"/><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-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I910277df181df5082b234c1c97a75eebdffc2cb5 </div>
<div style="display:none"> Gerrit-Change-Number: 11446 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Pau Espin Pedrol <pespin@sysmocom.de> </div>