<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/20674">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">scheduler: drop Uplink SACCH loss detection from Downlink path<br><br>We do have NOPE/IDLE indications on the TRXD interface since<br>Jul 4 2019, so this hack that can finally be eliminated.<br><br>Change-Id: Ic292d180ba64206fb4d88adb284f9f9d058b4587<br>---<br>M include/osmo-bts/scheduler.h<br>M src/common/scheduler.c<br>M src/osmo-bts-trx/sched_lchan_tchf.c<br>M src/osmo-bts-trx/sched_lchan_xcch.c<br>M src/osmo-bts-virtual/scheduler_virtbts.c<br>5 files changed, 0 insertions(+), 123 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/74/20674/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/scheduler.h b/include/osmo-bts/scheduler.h</span><br><span>index f19a13e..da9e20c 100644</span><br><span>--- a/include/osmo-bts/scheduler.h</span><br><span>+++ b/include/osmo-bts/scheduler.h</span><br><span>@@ -93,7 +93,6 @@</span><br><span> uint8_t ul_mask; /* mask of received bursts */</span><br><span> </span><br><span> /* loss detection */</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t lost_frames; /* how many L2 frames were lost */</span><br><span> uint32_t last_tdma_fn; /* last processed TDMA frame number */</span><br><span> uint32_t proc_tdma_fs; /* how many TDMA frames were processed */</span><br><span> uint32_t lost_tdma_fs; /* how many TDMA frames were lost */</span><br><span>diff --git a/src/common/scheduler.c b/src/common/scheduler.c</span><br><span>index e7cbc83..b9e5439 100644</span><br><span>--- a/src/common/scheduler.c</span><br><span>+++ b/src/common/scheduler.c</span><br><span>@@ -723,7 +723,6 @@</span><br><span> struct msgb *msg;</span><br><span> struct osmo_phsap_prim *l1sap;</span><br><span> uint8_t chan_nr = trx_chan_desc[chan].chan_nr | tn;</span><br><span style="color: hsl(0, 100%, 40%);">- struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, tn);</span><br><span> </span><br><span> /* compose primitive */</span><br><span> msg = l1sap_msgb_alloc(l2_len);</span><br><span>@@ -742,9 +741,6 @@</span><br><span> if (l2_len)</span><br><span> memcpy(msg->l2h, l2, l2_len);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (L1SAP_IS_LINK_SACCH(trx_chan_desc[chan].link_id))</span><br><span style="color: hsl(0, 100%, 40%);">- l1ts->chan_state[chan].lost_frames = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* forward primitive */</span><br><span> l1sap_up(l1t->trx, l1sap);</span><br><span> </span><br><span>@@ -759,7 +755,6 @@</span><br><span> struct msgb *msg;</span><br><span> struct osmo_phsap_prim *l1sap;</span><br><span> struct gsm_bts_trx *trx = l1t->trx;</span><br><span style="color: hsl(0, 100%, 40%);">- struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, tn);</span><br><span> uint8_t chan_nr = trx_chan_desc[chan].chan_nr | tn;</span><br><span> struct gsm_lchan *lchan = &trx->ts[L1SAP_CHAN2TS(chan_nr)].lchan[l1sap_chan2ss(chan_nr)];</span><br><span> </span><br><span>@@ -779,9 +774,6 @@</span><br><span> if (tch_len)</span><br><span> memcpy(msg->l2h, tch, tch_len);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (l1ts->chan_state[chan].lost_frames)</span><br><span style="color: hsl(0, 100%, 40%);">- l1ts->chan_state[chan].lost_frames--;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> LOGL1S(DL1P, LOGL_DEBUG, l1t, tn, -1, l1sap->u.data.fn,</span><br><span> "%s Rx -> RTP: %s\n",</span><br><span> gsm_lchan_name(lchan), osmo_hexdump(msgb_l2(msg), msgb_l2len(msg)));</span><br><span>diff --git a/src/osmo-bts-trx/sched_lchan_tchf.c b/src/osmo-bts-trx/sched_lchan_tchf.c</span><br><span>index 9c5bfc2..fe21559 100644</span><br><span>--- a/src/osmo-bts-trx/sched_lchan_tchf.c</span><br><span>+++ b/src/osmo-bts-trx/sched_lchan_tchf.c</span><br><span>@@ -314,58 +314,6 @@</span><br><span> uint8_t tch_mode = chan_state->tch_mode;</span><br><span> struct osmo_phsap_prim *l1sap;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* handle loss detection of received TCH frames */</span><br><span style="color: hsl(0, 100%, 40%);">- if (rsl_cmode == RSL_CMOD_SPD_SPEECH</span><br><span style="color: hsl(0, 100%, 40%);">- && ++(chan_state->lost_frames) > 5) {</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t tch_data[GSM_FR_BYTES];</span><br><span style="color: hsl(0, 100%, 40%);">- int len;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- LOGL1S(DL1P, LOGL_NOTICE, l1t, tn, chan, fn,</span><br><span style="color: hsl(0, 100%, 40%);">- "Missing TCH bursts detected, sending BFI\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* indicate bad frame */</span><br><span style="color: hsl(0, 100%, 40%);">- switch (tch_mode) {</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM48_CMODE_SPEECH_V1: /* FR / HR */</span><br><span style="color: hsl(0, 100%, 40%);">- if (chan != TRXC_TCHF) { /* HR */</span><br><span style="color: hsl(0, 100%, 40%);">- tch_data[0] = 0x70; /* F = 0, FT = 111 */</span><br><span style="color: hsl(0, 100%, 40%);">- memset(tch_data + 1, 0, 14);</span><br><span style="color: hsl(0, 100%, 40%);">- len = 15;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- memset(tch_data, 0, GSM_FR_BYTES);</span><br><span style="color: hsl(0, 100%, 40%);">- len = GSM_FR_BYTES;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM48_CMODE_SPEECH_EFR: /* EFR */</span><br><span style="color: hsl(0, 100%, 40%);">- if (chan != TRXC_TCHF)</span><br><span style="color: hsl(0, 100%, 40%);">- goto inval_mode1;</span><br><span style="color: hsl(0, 100%, 40%);">- memset(tch_data, 0, GSM_EFR_BYTES);</span><br><span style="color: hsl(0, 100%, 40%);">- len = GSM_EFR_BYTES;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM48_CMODE_SPEECH_AMR: /* AMR */</span><br><span style="color: hsl(0, 100%, 40%);">- len = osmo_amr_rtp_enc(tch_data,</span><br><span style="color: hsl(0, 100%, 40%);">- chan_state->codec[chan_state->dl_cmr],</span><br><span style="color: hsl(0, 100%, 40%);">- chan_state->codec[chan_state->dl_ft], AMR_BAD);</span><br><span style="color: hsl(0, 100%, 40%);">- if (len < 2) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGL1S(DL1P, LOGL_ERROR, l1t, tn, chan, fn,</span><br><span style="color: hsl(0, 100%, 40%);">- "Failed to encode AMR_BAD frame (rc=%d), "</span><br><span style="color: hsl(0, 100%, 40%);">- "not sending BFI\n", len);</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- memset(tch_data + 2, 0, len - 2);</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">-inval_mode1:</span><br><span style="color: hsl(0, 100%, 40%);">- LOGL1S(DL1P, LOGL_ERROR, l1t, tn, chan, fn, "TCH mode invalid, please fix!\n");</span><br><span style="color: hsl(0, 100%, 40%);">- len = 0;</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%);">- if (len) {</span><br><span style="color: hsl(0, 100%, 40%);">- /* Note: RSSI/ToA256 is set to 0 to indicate to the higher</span><br><span style="color: hsl(0, 100%, 40%);">- * layers that this is a faked tch_ind */</span><br><span style="color: hsl(0, 100%, 40%);">- _sched_compose_tch_ind(l1t, tn, fn, chan, tch_data, len, 0, 10000, 0, 0);</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%);">-</span><br><span> /* get frame and unlink from queue */</span><br><span> msg1 = _sched_dequeue_prim(l1t, tn, fn, chan);</span><br><span> msg2 = _sched_dequeue_prim(l1t, tn, fn, chan);</span><br><span>diff --git a/src/osmo-bts-trx/sched_lchan_xcch.c b/src/osmo-bts-trx/sched_lchan_xcch.c</span><br><span>index b96bc0b..7e1de6f 100644</span><br><span>--- a/src/osmo-bts-trx/sched_lchan_xcch.c</span><br><span>+++ b/src/osmo-bts-trx/sched_lchan_xcch.c</span><br><span>@@ -169,21 +169,6 @@</span><br><span> </span><br><span> /* BURST BYPASS */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* handle loss detection of SACCH */</span><br><span style="color: hsl(0, 100%, 40%);">- if (L1SAP_IS_LINK_SACCH(trx_chan_desc[chan].link_id)) {</span><br><span style="color: hsl(0, 100%, 40%);">- /* count and send BFI */</span><br><span style="color: hsl(0, 100%, 40%);">- 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%);">- /* Note: RSSI is set to 0 to indicate to the higher</span><br><span style="color: hsl(0, 100%, 40%);">- * layers that this is a faked ph_data_ind */</span><br><span style="color: hsl(0, 100%, 40%);">- _sched_compose_ph_data_ind(l1t, br->tn, 0, chan, NULL, 0,</span><br><span style="color: hsl(0, 100%, 40%);">- 0, 0, 0, 10000,</span><br><span style="color: hsl(0, 100%, 40%);">- PRES_INFO_INVALID);</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%);">-</span><br><span> /* allocate burst memory, if not already */</span><br><span> if (!*bursts_p) {</span><br><span> *bursts_p = talloc_zero_size(tall_bts_ctx, 464);</span><br><span>diff --git a/src/osmo-bts-virtual/scheduler_virtbts.c b/src/osmo-bts-virtual/scheduler_virtbts.c</span><br><span>index 466e864..9e9a9e9 100644</span><br><span>--- a/src/osmo-bts-virtual/scheduler_virtbts.c</span><br><span>+++ b/src/osmo-bts-virtual/scheduler_virtbts.c</span><br><span>@@ -254,53 +254,6 @@</span><br><span> uint8_t rsl_cmode = chan_state->rsl_cmode;</span><br><span> uint8_t tch_mode = chan_state->tch_mode;</span><br><span> struct osmo_phsap_prim *l1sap;</span><br><span style="color: hsl(0, 100%, 40%);">-#if 0</span><br><span style="color: hsl(0, 100%, 40%);">- /* handle loss detection of received TCH frames */</span><br><span style="color: hsl(0, 100%, 40%);">- if (rsl_cmode == RSL_CMOD_SPD_SPEECH</span><br><span style="color: hsl(0, 100%, 40%);">- && ++(chan_state->lost_frames) > 5) {</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t tch_data[GSM_FR_BYTES];</span><br><span style="color: hsl(0, 100%, 40%);">- int len;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- LOGL1S(DL1P, LOGL_NOTICE, l1t, tn, chan, fn, "Missing TCH bursts detected, sending "</span><br><span style="color: hsl(0, 100%, 40%);">- "BFI for %s\n", trx_chan_desc[chan].name);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* indicate bad frame */</span><br><span style="color: hsl(0, 100%, 40%);">- switch (tch_mode) {</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM48_CMODE_SPEECH_V1: /* FR / HR */</span><br><span style="color: hsl(0, 100%, 40%);">- if (chan != TRXC_TCHF) { /* HR */</span><br><span style="color: hsl(0, 100%, 40%);">- tch_data[0] = 0x70; /* F = 0, FT = 111 */</span><br><span style="color: hsl(0, 100%, 40%);">- memset(tch_data + 1, 0, 14);</span><br><span style="color: hsl(0, 100%, 40%);">- len = 15;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- memset(tch_data, 0, GSM_FR_BYTES);</span><br><span style="color: hsl(0, 100%, 40%);">- len = GSM_FR_BYTES;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM48_CMODE_SPEECH_EFR: /* EFR */</span><br><span style="color: hsl(0, 100%, 40%);">- if (chan != TRXC_TCHF)</span><br><span style="color: hsl(0, 100%, 40%);">- goto inval_mode1;</span><br><span style="color: hsl(0, 100%, 40%);">- memset(tch_data, 0, GSM_EFR_BYTES);</span><br><span style="color: hsl(0, 100%, 40%);">- len = GSM_EFR_BYTES;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM48_CMODE_SPEECH_AMR: /* AMR */</span><br><span style="color: hsl(0, 100%, 40%);">- len = amr_compose_payload(tch_data,</span><br><span style="color: hsl(0, 100%, 40%);">- chan_state->codec[chan_state->dl_cmr],</span><br><span style="color: hsl(0, 100%, 40%);">- chan_state->codec[chan_state->dl_ft], 1);</span><br><span style="color: hsl(0, 100%, 40%);">- if (len < 2)</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- memset(tch_data + 2, 0, len - 2);</span><br><span style="color: hsl(0, 100%, 40%);">- _sched_compose_tch_ind(l1t, tn, 0, chan, tch_data, len);</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">-inval_mode1:</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DL1P, LOGL_ERROR, "TCH mode invalid, please "</span><br><span style="color: hsl(0, 100%, 40%);">- "fix!\n");</span><br><span style="color: hsl(0, 100%, 40%);">- len = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- if (len)</span><br><span style="color: hsl(0, 100%, 40%);">- _sched_compose_tch_ind(l1t, tn, 0, chan, tch_data, len);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span> </span><br><span> /* get frame and unlink from queue */</span><br><span> msg1 = _sched_dequeue_prim(l1t, tn, fn, chan);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/20674">change 20674</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/+/20674"/><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: Ic292d180ba64206fb4d88adb284f9f9d058b4587 </div>
<div style="display:none"> Gerrit-Change-Number: 20674 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>