<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/15027">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">osmo-bts-trx: migrate to new generic ECU abstraction<br><br>libosmocodec has recently introduced a generic ECU abstraction layer<br>which supports (pluggable) Error Concealment Units for not only the<br>FR codec, but potentially any other codec, too.<br><br>Change-Id: I001005aae6de76d4e045b8dc572239f057bb150d<br>Depends: libosmocore I4d33c9c7c2d4c7462ff38a49c178b65accae1915<br>---<br>M include/osmo-bts/gsm_data_shared.h<br>M src/common/gsm_data_shared.c<br>M src/osmo-bts-trx/l1_if.c<br>M src/osmo-bts-trx/scheduler_trx.c<br>4 files changed, 56 insertions(+), 19 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/27/15027/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/gsm_data_shared.h b/include/osmo-bts/gsm_data_shared.h</span><br><span>index dd2a14c..d1d9522 100644</span><br><span>--- a/include/osmo-bts/gsm_data_shared.h</span><br><span>+++ b/include/osmo-bts/gsm_data_shared.h</span><br><span>@@ -329,9 +329,7 @@</span><br><span>      struct msgb *pending_rel_ind_msg;</span><br><span> </span><br><span>        /* ECU (Error Concealment Unit) state */</span><br><span style="color: hsl(0, 100%, 40%);">-        union {</span><br><span style="color: hsl(0, 100%, 40%);">-         struct osmo_ecu_fr_state fr;</span><br><span style="color: hsl(0, 100%, 40%);">-    } ecu_state;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct osmo_ecu_state *ecu_state;</span><br><span> };</span><br><span> </span><br><span> static inline uint8_t lchan_get_ta(const struct gsm_lchan *lchan)</span><br><span>@@ -869,4 +867,6 @@</span><br><span> bool ts_is_tch(struct gsm_bts_trx_ts *ts);</span><br><span> const char *gsm_trx_unit_id(struct gsm_bts_trx *trx);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int lchan2ecu_codec(const struct gsm_lchan *lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #endif</span><br><span>diff --git a/src/common/gsm_data_shared.c b/src/common/gsm_data_shared.c</span><br><span>index b1785b8..ce6dd2b 100644</span><br><span>--- a/src/common/gsm_data_shared.c</span><br><span>+++ b/src/common/gsm_data_shared.c</span><br><span>@@ -31,6 +31,7 @@</span><br><span> #include <osmocom/gsm/gsm_utils.h></span><br><span> #include <osmocom/gsm/abis_nm.h></span><br><span> #include <osmocom/core/statistics.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/codec/ecu.h></span><br><span> </span><br><span> #include <osmo-bts/gsm_data.h></span><br><span> </span><br><span>@@ -806,3 +807,24 @@</span><br><span>         { LCHAN_CIPH_RXTX_CONF, "RXTX_CONF" },</span><br><span>     { 0, NULL }</span><br><span> };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* determine the ECU codec constant for the codec used by given lchan */</span><br><span style="color: hsl(120, 100%, 40%);">+int lchan2ecu_codec(const struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_bts_trx_ts *ts = lchan->ts;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   switch (lchan->tch_mode) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM48_CMODE_SPEECH_V1:</span><br><span style="color: hsl(120, 100%, 40%);">+           if (ts_pchan(ts) == GSM_PCHAN_TCH_H)</span><br><span style="color: hsl(120, 100%, 40%);">+                  return OSMO_ECU_CODEC_HR;</span><br><span style="color: hsl(120, 100%, 40%);">+             else</span><br><span style="color: hsl(120, 100%, 40%);">+                  return OSMO_ECU_CODEC_FR;</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM48_CMODE_SPEECH_EFR:</span><br><span style="color: hsl(120, 100%, 40%);">+          return OSMO_ECU_CODEC_EFR;</span><br><span style="color: hsl(120, 100%, 40%);">+    case GSM48_CMODE_SPEECH_AMR:</span><br><span style="color: hsl(120, 100%, 40%);">+          return OSMO_ECU_CODEC_AMR;</span><br><span style="color: hsl(120, 100%, 40%);">+    default:</span><br><span style="color: hsl(120, 100%, 40%);">+              return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/osmo-bts-trx/l1_if.c b/src/osmo-bts-trx/l1_if.c</span><br><span>index 22ef2d7..db53d4c 100644</span><br><span>--- a/src/osmo-bts-trx/l1_if.c</span><br><span>+++ b/src/osmo-bts-trx/l1_if.c</span><br><span>@@ -29,6 +29,7 @@</span><br><span> </span><br><span> #include <osmocom/core/talloc.h></span><br><span> #include <osmocom/core/bits.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/codec/ecu.h></span><br><span> #include <osmocom/gsm/abis_nm.h></span><br><span> </span><br><span> #include <osmo-bts/logging.h></span><br><span>@@ -626,6 +627,9 @@</span><br><span>                                         break;</span><br><span>                               }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+                         /* attempt to allocate an Error Concealment Unit instance, if available */</span><br><span style="color: hsl(120, 100%, 40%);">+                            lchan->ecu_state = osmo_ecu_init(trx, lchan2ecu_codec(lchan));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                          /* trx_chan_desc[] in scheduler.c uses the RSL_CHAN_OSMO_PDCH cbits</span><br><span>                           * (0xc0) to indicate the need for PDTCH and PTCCH SAPI activation.</span><br><span>                           * However, 0xc0 is a cbits pattern exclusively used for Osmocom style</span><br><span>@@ -671,6 +675,10 @@</span><br><span>                                break;</span><br><span>                       }</span><br><span>                    if (l1sap->u.info.type == PRIM_INFO_MODIFY) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              /* ECU for possibly new codec */</span><br><span style="color: hsl(120, 100%, 40%);">+                              if (lchan->ecu_state)</span><br><span style="color: hsl(120, 100%, 40%);">+                                      osmo_ecu_destroy(lchan->ecu_state);</span><br><span style="color: hsl(120, 100%, 40%);">+                                lchan->ecu_state = osmo_ecu_init(trx, lchan2ecu_codec(lchan));</span><br><span>                            /* change mode */</span><br><span>                            trx_sched_set_mode(&l1h->l1s, chan_nr,</span><br><span>                                        lchan->rsl_cmode, lchan->tch_mode,</span><br><span>@@ -689,6 +697,11 @@</span><br><span>                                      "chan_nr 0x%02x\n", chan_nr);</span><br><span>                              break;</span><br><span>                       }</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* clear ECU state (if any) */</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (lchan->ecu_state) {</span><br><span style="color: hsl(120, 100%, 40%);">+                            osmo_ecu_destroy(lchan->ecu_state);</span><br><span style="color: hsl(120, 100%, 40%);">+                                lchan->ecu_state = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+                   }</span><br><span>                    /* deactivate associated channel */</span><br><span>                  bts_model_lchan_deactivate_sacch(lchan);</span><br><span>                     if (!l1sap->u.info.u.act_req.sacch_only) {</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 532eca5..742f1c8 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>@@ -1256,22 +1256,24 @@</span><br><span>                         ber10k, PRES_INFO_UNKNOWN);</span><br><span> bfi:</span><br><span>          if (rsl_cmode == RSL_CMOD_SPD_SPEECH) {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                    /* indicate bad frame */</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (lchan->tch.dtx.ul_sid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                               /* DTXu: pause in progress. Push empty payload to upper layers */</span><br><span style="color: hsl(120, 100%, 40%);">+                             rc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                               goto compose_l1sap;</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%);">+                   /* If there is an ECU active on this channel, use its output */</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (lchan->ecu_state) {</span><br><span style="color: hsl(120, 100%, 40%);">+                            rc = osmo_ecu_frame_out(lchan->ecu_state, tch_data);</span><br><span style="color: hsl(120, 100%, 40%);">+                               goto compose_l1sap;</span><br><span style="color: hsl(120, 100%, 40%);">+                   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                  switch (tch_mode) {</span><br><span>                  case GSM48_CMODE_SPEECH_V1: /* FR */</span><br><span style="color: hsl(0, 100%, 40%);">-                            if (lchan->tch.dtx.ul_sid) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                 /* DTXu: pause in progress. Push empty payload to upper layers */</span><br><span style="color: hsl(0, 100%, 40%);">-                                       rc = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                                 goto compose_l1sap;</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%);">-                               /* Perform error concealment if possible */</span><br><span style="color: hsl(0, 100%, 40%);">-                             rc = osmo_ecu_fr_conceal(&lchan->ecu_state.fr, tch_data);</span><br><span style="color: hsl(0, 100%, 40%);">-                                if (rc) {</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%);">-                                      tch_data[0] = 0xd0;</span><br><span style="color: hsl(0, 100%, 40%);">-                             }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+                             memset(tch_data, 0, GSM_FR_BYTES);</span><br><span style="color: hsl(120, 100%, 40%);">+                            tch_data[0] = 0xd0;</span><br><span>                          rc = GSM_FR_BYTES;</span><br><span>                           break;</span><br><span>                       case GSM48_CMODE_SPEECH_EFR: /* EFR */</span><br><span>@@ -1299,9 +1301,9 @@</span><br><span>       if (rsl_cmode != RSL_CMOD_SPD_SPEECH)</span><br><span>                return 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* Reset ECU with a good frame */</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!bfi_flag && tch_mode == GSM48_CMODE_SPEECH_V1)</span><br><span style="color: hsl(0, 100%, 40%);">-             osmo_ecu_fr_reset(&lchan->ecu_state.fr, tch_data);</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Feed frame into ECU */</span><br><span style="color: hsl(120, 100%, 40%);">+     if (lchan->ecu_state)</span><br><span style="color: hsl(120, 100%, 40%);">+              osmo_ecu_frame_in(lchan->ecu_state, bfi_flag, tch_data, rc);</span><br><span> </span><br><span>  /* TCH or BFI */</span><br><span> compose_l1sap:</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/15027">change 15027</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/+/15027"/><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: I001005aae6de76d4e045b8dc572239f057bb150d </div>
<div style="display:none"> Gerrit-Change-Number: 15027 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>