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