<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>