<p>dexter has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/15918">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">l1sap: merge MEAS IND into PRIM PH DATA / PRIM TCH<br><br>The MPH INFO MEAS IND indication, which contains the uplink measurement<br>data is sent in parallel to the PH DATA and TCH indications as a<br>separate indications. This makes the overall uplink measurement data<br>processing unnecessarly complex. So lets put the data that is relevant<br>for measurement into the PH DATA and TCH indications directly.<br><br>This change only affects osmo-bts-trx at the moment. In order to keep<br>the upper layers (l1sap.c) compatible we add an autodection to switch<br>between separate measurement indications and included measurement data.<br><br>Related: OS#2977<br>Depends: libosmocore I2c34b02d329f9df190c5035c396403ca0a4f9c42<br>Change-Id: I710d0b7cf193afa8515807836ee69b8b7db84a84<br>---<br>M include/osmo-bts/scheduler_backend.h<br>M src/common/l1sap.c<br>M src/common/scheduler.c<br>M src/osmo-bts-trx/l1_if.c<br>M src/osmo-bts-trx/l1_if.h<br>M src/osmo-bts-trx/scheduler_trx.c<br>6 files changed, 114 insertions(+), 96 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/18/15918/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/scheduler_backend.h b/include/osmo-bts/scheduler_backend.h</span><br><span>index d713900..4959853 100644</span><br><span>--- a/include/osmo-bts/scheduler_backend.h</span><br><span>+++ b/include/osmo-bts/scheduler_backend.h</span><br><span>@@ -52,7 +52,8 @@</span><br><span>                           enum osmo_ph_pres_info_type presence_info);</span><br><span> </span><br><span> int _sched_compose_tch_ind(struct l1sched_trx *l1t, uint8_t tn, uint32_t fn,</span><br><span style="color: hsl(0, 100%, 40%);">-              enum trx_chan_type chan, uint8_t *tch, uint8_t tch_len);</span><br><span style="color: hsl(120, 100%, 40%);">+                     enum trx_chan_type chan, uint8_t *tch, uint8_t tch_len,</span><br><span style="color: hsl(120, 100%, 40%);">+                       int16_t ta_offs_256bits, uint16_t ber10k, float rssi);</span><br><span> </span><br><span> ubit_t *tx_idle_fn(struct l1sched_trx *l1t, uint8_t tn, uint32_t fn,</span><br><span>        enum trx_chan_type chan, uint8_t bid, uint16_t *nbits);</span><br><span>diff --git a/src/common/l1sap.c b/src/common/l1sap.c</span><br><span>index 7bf0b09..ec6f287 100644</span><br><span>--- a/src/common/l1sap.c</span><br><span>+++ b/src/common/l1sap.c</span><br><span>@@ -62,6 +62,17 @@</span><br><span> #define CB_BCCH            -3</span><br><span> #define CB_IDLE           -4</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* We are capable to use two different sources to receive measurement data from</span><br><span style="color: hsl(120, 100%, 40%);">+ * lower layers. The first source is the MPH INFO MEAS IND, which is an</span><br><span style="color: hsl(120, 100%, 40%);">+ * indication for itsself that is passed up in parallel to the payload data</span><br><span style="color: hsl(120, 100%, 40%);">+ * (see also PRIM_PH_DATA, PRIM_TCH). This idea is obsolete, however it is</span><br><span style="color: hsl(120, 100%, 40%);">+ * still used with some BTS implementations). The second source is to use the</span><br><span style="color: hsl(120, 100%, 40%);">+ * measurement data that is contained inside struct ph_data_param</span><br><span style="color: hsl(120, 100%, 40%);">+ * (PRIM_PH_DATA) and struct ph_tch_param (PRIM_TCH). Which source is used is</span><br><span style="color: hsl(120, 100%, 40%);">+ * determined automatically. Once we receive an MPH INFO MEAS IND, we fall back</span><br><span style="color: hsl(120, 100%, 40%);">+ * to the old (first) source. (See also ticket: OS#2977) */</span><br><span style="color: hsl(120, 100%, 40%);">+static bool tch_data_meas_present = true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* according to TS 05.02 Clause 7 Table 3 of 9 an Figure 8a */</span><br><span> static const int ccch_block_table[51] = {</span><br><span>         CB_FCCH, CB_SCH,/* 0..1 */</span><br><span>@@ -626,42 +637,81 @@</span><br><span> }</span><br><span> </span><br><span> /* measurement information received from bts model */</span><br><span style="color: hsl(0, 100%, 40%);">-static int l1sap_info_meas_ind(struct gsm_bts_trx *trx,</span><br><span style="color: hsl(0, 100%, 40%);">-     struct osmo_phsap_prim *l1sap,</span><br><span style="color: hsl(0, 100%, 40%);">-  struct info_meas_ind_param *info_meas_ind)</span><br><span style="color: hsl(120, 100%, 40%);">+static void process_l1sap_meas_data(struct gsm_bts_trx *trx,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  struct osmo_phsap_prim *l1sap,</span><br><span style="color: hsl(120, 100%, 40%);">+                                enum osmo_ph_prim ind_type)</span><br><span> {</span><br><span>         struct bts_ul_meas ulm;</span><br><span>      struct gsm_lchan *lchan;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct info_meas_ind_param *info_meas_ind = &l1sap->u.info.u.meas_ind;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ph_data_param *ph_data_ind = &l1sap->u.data;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct ph_tch_param *ph_tch_ind = &l1sap->u.tch;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t fn;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t inv_rssi;</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t is_sub;</span><br><span style="color: hsl(120, 100%, 40%);">+       int16_t ta_offs_256bits;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint16_t ber10k;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    lchan = get_active_lchan_by_chan_nr(trx, info_meas_ind->chan_nr);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!lchan) {</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGPFN(DL1P, LOGL_ERROR, info_meas_ind->fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                  "No lchan for MPH INFO MEAS IND (chan_nr=%s)\n", rsl_chan_nr_str(info_meas_ind->chan_nr));</span><br><span style="color: hsl(0, 100%, 40%);">-         return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     switch (ind_type) {</span><br><span style="color: hsl(120, 100%, 40%);">+   case PRIM_MPH_INFO:</span><br><span style="color: hsl(120, 100%, 40%);">+           /* (legacy way, see also OS#2977) */</span><br><span style="color: hsl(120, 100%, 40%);">+          chan_nr = info_meas_ind->chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+          fn = info_meas_ind->fn;</span><br><span style="color: hsl(120, 100%, 40%);">+            inv_rssi = info_meas_ind->inv_rssi;</span><br><span style="color: hsl(120, 100%, 40%);">+                is_sub = info_meas_ind->is_sub;</span><br><span style="color: hsl(120, 100%, 40%);">+            ta_offs_256bits = info_meas_ind->ta_offs_256bits;</span><br><span style="color: hsl(120, 100%, 40%);">+          ber10k = info_meas_ind->ber10k;</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case PRIM_TCH:</span><br><span style="color: hsl(120, 100%, 40%);">+                chan_nr = ph_tch_ind->chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+             fn = ph_tch_ind->fn;</span><br><span style="color: hsl(120, 100%, 40%);">+               inv_rssi = abs(ph_tch_ind->rssi);</span><br><span style="color: hsl(120, 100%, 40%);">+          is_sub = ph_tch_ind->is_sub;</span><br><span style="color: hsl(120, 100%, 40%);">+               ta_offs_256bits = ph_tch_ind->ta_offs_256bits;</span><br><span style="color: hsl(120, 100%, 40%);">+             ber10k = ph_tch_ind->ber10k;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case PRIM_PH_DATA:</span><br><span style="color: hsl(120, 100%, 40%);">+            chan_nr = ph_data_ind->chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+            fn = ph_data_ind->fn;</span><br><span style="color: hsl(120, 100%, 40%);">+              inv_rssi = abs(ph_data_ind->rssi);</span><br><span style="color: hsl(120, 100%, 40%);">+         is_sub = ph_data_ind->is_sub;</span><br><span style="color: hsl(120, 100%, 40%);">+              ta_offs_256bits = ph_data_ind->ta_offs_256bits;</span><br><span style="color: hsl(120, 100%, 40%);">+            ber10k = ph_data_ind->ber10k;</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              OSMO_ASSERT(false);</span><br><span>  }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   DEBUGPFN(DL1P, info_meas_ind->fn,</span><br><span style="color: hsl(0, 100%, 40%);">-            "%s MPH_INFO meas ind, ta_offs_256bits=%d, ber10k=%d, inv_rssi=%u\n",</span><br><span style="color: hsl(0, 100%, 40%);">-         gsm_lchan_name(lchan), info_meas_ind->ta_offs_256bits,</span><br><span style="color: hsl(0, 100%, 40%);">-               info_meas_ind->ber10k, info_meas_ind->inv_rssi);</span><br><span style="color: hsl(120, 100%, 40%);">+        lchan = get_active_lchan_by_chan_nr(trx, chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!lchan) {</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGPFN(DL1P, LOGL_ERROR, fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                 "No lchan for MPH INFO MEAS IND (chan_nr=%s)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                    rsl_chan_nr_str(chan_nr));</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</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%);">+   DEBUGPFN(DL1P, fn,</span><br><span style="color: hsl(120, 100%, 40%);">+             "%s MPH_INFO meas ind, ta_offs_256bits=%d, ber10k=%d, inv_rssi=%u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+               gsm_lchan_name(lchan), ta_offs_256bits, ber10k, inv_rssi);</span><br><span> </span><br><span>      /* in the GPRS case we are not interested in measurement</span><br><span>      * processing.  The PCU will take care of it */</span><br><span>      if (lchan->type == GSM_LCHAN_PDTCH)</span><br><span style="color: hsl(0, 100%, 40%);">-          return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</span><br><span> </span><br><span>  memset(&ulm, 0, sizeof(ulm));</span><br><span style="color: hsl(0, 100%, 40%);">-       ulm.ta_offs_256bits = info_meas_ind->ta_offs_256bits;</span><br><span style="color: hsl(0, 100%, 40%);">-        ulm.ber10k = info_meas_ind->ber10k;</span><br><span style="color: hsl(0, 100%, 40%);">-  ulm.inv_rssi = info_meas_ind->inv_rssi;</span><br><span style="color: hsl(0, 100%, 40%);">-      ulm.is_sub = info_meas_ind->is_sub;</span><br><span style="color: hsl(120, 100%, 40%);">+        ulm.ta_offs_256bits = ta_offs_256bits;</span><br><span style="color: hsl(120, 100%, 40%);">+        ulm.ber10k = ber10k;</span><br><span style="color: hsl(120, 100%, 40%);">+  ulm.inv_rssi = inv_rssi;</span><br><span style="color: hsl(120, 100%, 40%);">+      ulm.is_sub = is_sub;</span><br><span> </span><br><span>     /* we assume that symbol period is 1 bit: */</span><br><span style="color: hsl(0, 100%, 40%);">-    set_ms_to_data(lchan, info_meas_ind->ta_offs_256bits / 256, true);</span><br><span style="color: hsl(120, 100%, 40%);">+ set_ms_to_data(lchan, ta_offs_256bits / 256, true);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- lchan_meas_process_measurement(lchan, &ulm, info_meas_ind->fn);</span><br><span style="color: hsl(120, 100%, 40%);">+        lchan_meas_process_measurement(lchan, &ulm, fn);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     return;</span><br><span> }</span><br><span> </span><br><span> /* any L1 MPH_INFO indication prim received from bts model */</span><br><span>@@ -682,7 +732,12 @@</span><br><span>                                              &info->u.time_ind);</span><br><span>          break;</span><br><span>       case PRIM_INFO_MEAS:</span><br><span style="color: hsl(0, 100%, 40%);">-            rc = l1sap_info_meas_ind(trx, l1sap, &info->u.meas_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+               /* See above */</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGP(DL1P, LOGL_NOTICE, "MPH_INFO MEAS IND received, will now only use data from MEAS IND! (OS#2977)\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           tch_data_meas_present = false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              process_l1sap_meas_data(trx, l1sap, PRIM_MPH_INFO);</span><br><span style="color: hsl(120, 100%, 40%);">+           rc = 0;</span><br><span>              break;</span><br><span>       default:</span><br><span>             LOGP(DL1P, LOGL_NOTICE, "unknown MPH_INFO ind type %d\n",</span><br><span>@@ -1197,6 +1252,12 @@</span><br><span>                 return -EINVAL;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* The ph_data_param contained in the l1sap primitive may contain</span><br><span style="color: hsl(120, 100%, 40%);">+      * measurement data. If this data is present, forward it for</span><br><span style="color: hsl(120, 100%, 40%);">+   * processing */</span><br><span style="color: hsl(120, 100%, 40%);">+      if (tch_data_meas_present == true)</span><br><span style="color: hsl(120, 100%, 40%);">+            process_l1sap_meas_data(trx, l1sap, PRIM_PH_DATA);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         if (ts_is_pdch(&trx->ts[tn])) {</span><br><span>               lchan = get_lchan_by_chan_nr(trx, chan_nr);</span><br><span>          if (!lchan)</span><br><span>@@ -1301,6 +1362,12 @@</span><br><span>                 return 0;</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* The ph_tch_param contained in the l1sap primitive may contain</span><br><span style="color: hsl(120, 100%, 40%);">+       * measurement data. If this data is present, forward it for</span><br><span style="color: hsl(120, 100%, 40%);">+   * processing */</span><br><span style="color: hsl(120, 100%, 40%);">+      if (tch_data_meas_present == true)</span><br><span style="color: hsl(120, 100%, 40%);">+            process_l1sap_meas_data(trx, l1sap, PRIM_TCH);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     msgb_pull(msg, sizeof(*l1sap));</span><br><span> </span><br><span>  /* Low level layers always call us when TCH content is expected, even if</span><br><span>diff --git a/src/common/scheduler.c b/src/common/scheduler.c</span><br><span>index 3adfc49..7155cbb 100644</span><br><span>--- a/src/common/scheduler.c</span><br><span>+++ b/src/common/scheduler.c</span><br><span>@@ -738,7 +738,8 @@</span><br><span> }</span><br><span> </span><br><span> int _sched_compose_tch_ind(struct l1sched_trx *l1t, uint8_t tn, uint32_t fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                enum trx_chan_type chan, uint8_t *tch, uint8_t tch_len)</span><br><span style="color: hsl(120, 100%, 40%);">+                      enum trx_chan_type chan, uint8_t *tch, uint8_t tch_len,</span><br><span style="color: hsl(120, 100%, 40%);">+                       int16_t ta_offs_256bits, uint16_t ber10k, float rssi)</span><br><span> {</span><br><span>        struct msgb *msg;</span><br><span>    struct osmo_phsap_prim *l1sap;</span><br><span>@@ -754,6 +755,10 @@</span><br><span>                PRIM_OP_INDICATION, msg);</span><br><span>    l1sap->u.tch.chan_nr = chan_nr;</span><br><span>   l1sap->u.tch.fn = fn;</span><br><span style="color: hsl(120, 100%, 40%);">+      l1sap->u.tch.rssi = (int8_t) (rssi);</span><br><span style="color: hsl(120, 100%, 40%);">+       l1sap->u.tch.ber10k = ber10k;</span><br><span style="color: hsl(120, 100%, 40%);">+      l1sap->u.tch.ta_offs_256bits = ta_offs_256bits;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         msg->l2h = msgb_put(msg, tch_len);</span><br><span>        if (tch_len)</span><br><span>                 memcpy(msg->l2h, tch, tch_len);</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 38b43b9..b28c894 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>@@ -572,40 +572,6 @@</span><br><span>       return l1sap_up(bts->c0, &l1sap);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void l1if_fill_meas_res(struct osmo_phsap_prim *l1sap, uint8_t chan_nr, int16_t toa256,</span><br><span style="color: hsl(0, 100%, 40%);">- float ber, float rssi, uint32_t fn)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    memset(l1sap, 0, sizeof(*l1sap));</span><br><span style="color: hsl(0, 100%, 40%);">-       osmo_prim_init(&l1sap->oph, SAP_GSM_PH, PRIM_MPH_INFO,</span><br><span style="color: hsl(0, 100%, 40%);">-           PRIM_OP_INDICATION, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-      l1sap->u.info.type = PRIM_INFO_MEAS;</span><br><span style="color: hsl(0, 100%, 40%);">- l1sap->u.info.u.meas_ind.chan_nr = chan_nr;</span><br><span style="color: hsl(0, 100%, 40%);">-  l1sap->u.info.u.meas_ind.ta_offs_256bits = toa256;</span><br><span style="color: hsl(0, 100%, 40%);">-   l1sap->u.info.u.meas_ind.ber10k = (unsigned int) (ber * 10000);</span><br><span style="color: hsl(0, 100%, 40%);">-      l1sap->u.info.u.meas_ind.inv_rssi = (uint8_t) (rssi * -1);</span><br><span style="color: hsl(0, 100%, 40%);">-   l1sap->u.info.u.meas_ind.fn = fn;</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%);">-int l1if_process_meas_res(struct gsm_bts_trx *trx, uint8_t tn, uint32_t fn, uint8_t chan_nr,</span><br><span style="color: hsl(0, 100%, 40%);">-       int n_errors, int n_bits_total, float rssi, int16_t toa256)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gsm_lchan *lchan = &trx->ts[tn].lchan[l1sap_chan2ss(chan_nr)];</span><br><span style="color: hsl(0, 100%, 40%);">-    struct osmo_phsap_prim l1sap;</span><br><span style="color: hsl(0, 100%, 40%);">-   /* 100% BER is n_bits_total is 0 */</span><br><span style="color: hsl(0, 100%, 40%);">-     float ber = n_bits_total==0 ? 1.0 : (float)n_errors / (float)n_bits_total;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      LOGPFN(DMEAS, LOGL_DEBUG, fn, "RX UL measurement for %s fn=%u chan_nr=0x%02x MS pwr=%ddBm rssi=%.1f dBFS "</span><br><span style="color: hsl(0, 100%, 40%);">-            "ber=%.2f%% (%d/%d bits) L1_ta=%d rqd_ta=%d toa256=%d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-             gsm_lchan_name(lchan), fn, chan_nr, ms_pwr_dbm(lchan->ts->trx->bts->band, lchan->ms_power_ctrl.current),</span><br><span style="color: hsl(0, 100%, 40%);">-         rssi, ber*100, n_errors, n_bits_total, lchan->meas.l1_info[1], lchan->rqd_ta, toa256);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    l1if_fill_meas_res(&l1sap, chan_nr, toa256, ber, rssi, fn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return l1sap_up(trx, &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%);">-</span><br><span> /* primitive from common part */</span><br><span> int bts_model_l1sap_down(struct gsm_bts_trx *trx, struct osmo_phsap_prim *l1sap)</span><br><span> {</span><br><span>diff --git a/src/osmo-bts-trx/l1_if.h b/src/osmo-bts-trx/l1_if.h</span><br><span>index 4ff1f97..7370999 100644</span><br><span>--- a/src/osmo-bts-trx/l1_if.h</span><br><span>+++ b/src/osmo-bts-trx/l1_if.h</span><br><span>@@ -115,8 +115,6 @@</span><br><span> int l1if_provision_transceiver_trx(struct trx_l1h *l1h);</span><br><span> int l1if_provision_transceiver(struct gsm_bts *bts);</span><br><span> int l1if_mph_time_ind(struct gsm_bts *bts, uint32_t fn);</span><br><span style="color: hsl(0, 100%, 40%);">-int l1if_process_meas_res(struct gsm_bts_trx *trx, uint8_t tn, uint32_t fn, uint8_t chan_nr,</span><br><span style="color: hsl(0, 100%, 40%);">-  int n_errors, int n_bits_total, float rssi, int16_t toa256);</span><br><span> </span><br><span> static inline struct l1sched_trx *trx_l1sched_hdl(struct gsm_bts_trx *trx)</span><br><span> {</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 88e4f3a..3f6d604 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>@@ -198,11 +198,6 @@</span><br><span>              if (++(l1ts->chan_state[chan].lost_frames) > 1) {</span><br><span>                      /* TODO: Should we pass old TOA here? Otherwise we risk</span><br><span>                       * 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>                   _sched_compose_ph_data_ind(l1t, tn, 0, chan, NULL, 0,</span><br><span>                                                   -110, 0, 0, 10000,</span><br><span>                                                   PRES_INFO_INVALID);</span><br><span>@@ -351,6 +346,9 @@</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(120, 100%, 40%);">+        int32_t *toa256_sum = &chan_state->toa256_sum;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t *toa_num = &chan_state->toa_num;</span><br><span style="color: hsl(120, 100%, 40%);">+       int16_t toa256;</span><br><span> </span><br><span>  /* handle loss detection of received TCH frames */</span><br><span>   if (rsl_cmode == RSL_CMOD_SPD_SPEECH</span><br><span>@@ -396,8 +394,14 @@</span><br><span>                  LOGL1S(DL1P, LOGL_ERROR, l1t, tn, chan, fn, "TCH mode invalid, please fix!\n");</span><br><span>                    len = 0;</span><br><span>             }</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, fn, chan, tch_data, len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           if (len) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (*toa_num == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                            toa256 = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                   else</span><br><span style="color: hsl(120, 100%, 40%);">+                          toa256 = *toa256_sum / *toa_num;</span><br><span style="color: hsl(120, 100%, 40%);">+                      _sched_compose_tch_ind(l1t, tn, fn, chan, tch_data, len, toa256, 10000, 127);</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span>    }</span><br><span> </span><br><span>        /* get frame and unlink from queue */</span><br><span>@@ -989,11 +993,6 @@</span><br><span>                 l2_len = GSM_MACBLOCK_LEN;</span><br><span> </span><br><span>       /* Send uplink measurement information to L2 */</span><br><span style="color: hsl(0, 100%, 40%);">- l1if_process_meas_res(l1t->trx, bi->tn, *first_fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                              trx_chan_desc[chan].chan_nr | bi->tn,</span><br><span style="color: hsl(0, 100%, 40%);">-                        n_errors, n_bits_total,</span><br><span style="color: hsl(0, 100%, 40%);">-                         *rssi_sum / *rssi_num,</span><br><span style="color: hsl(0, 100%, 40%);">-                          *toa256_sum / *toa_num);</span><br><span>       lqual_cb = *ci_cb_num ? (*ci_cb_sum / *ci_cb_num) : 0;</span><br><span>       ber10k = compute_ber10k(n_bits_total, n_errors);</span><br><span>     return _sched_compose_ph_data_ind(l1t, bi->tn, *first_fn,</span><br><span>@@ -1103,12 +1102,6 @@</span><br><span> </span><br><span> </span><br><span>        /* Send uplink measurement information to L2 */</span><br><span style="color: hsl(0, 100%, 40%);">- l1if_process_meas_res(l1t->trx, bi->tn, *first_fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                trx_chan_desc[chan].chan_nr | bi->tn,</span><br><span style="color: hsl(0, 100%, 40%);">-                n_errors, n_bits_total,</span><br><span style="color: hsl(0, 100%, 40%);">-         *rssi_sum / *rssi_num,</span><br><span style="color: hsl(0, 100%, 40%);">-          *toa256_sum / *toa_num);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>     if (rc <= 0) {</span><br><span>            LOGL1S(DL1P, LOGL_DEBUG, l1t, bi->tn, chan, bi->fn,</span><br><span>                    "Received bad PDTCH (%u/%u)\n",</span><br><span>@@ -1144,6 +1137,7 @@</span><br><span>    struct gsm_lchan *lchan =</span><br><span>            get_lchan_by_chan_nr(l1t->trx, trx_chan_desc[chan].chan_nr | bi->tn);</span><br><span>  unsigned int fn_begin;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint16_t ber10k;</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>@@ -1243,17 +1237,13 @@</span><br><span>    if (rc != GSM_MACBLOCK_LEN && lchan->ecu_state)</span><br><span>           osmo_ecu_frame_in(lchan->ecu_state, bfi_flag, tch_data, rc);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   ber10k = compute_ber10k(n_bits_total, n_errors);</span><br><span>     if (bfi_flag)</span><br><span>                goto bfi;</span><br><span> </span><br><span>        /* FACCH */</span><br><span>  if (rc == GSM_MACBLOCK_LEN) {</span><br><span style="color: hsl(0, 100%, 40%);">-           uint16_t ber10k = compute_ber10k(n_bits_total, n_errors);</span><br><span>            fn_begin = gsm0502_fn_remap(bi->fn, FN_REMAP_FACCH_F);</span><br><span style="color: hsl(0, 100%, 40%);">-               l1if_process_meas_res(l1t->trx, bi->tn, fn_begin,</span><br><span style="color: hsl(0, 100%, 40%);">-                               trx_chan_desc[chan].chan_nr | bi->tn,</span><br><span style="color: hsl(0, 100%, 40%);">-                                n_errors, n_bits_total,</span><br><span style="color: hsl(0, 100%, 40%);">-                                 bi->rssi, bi->toa256);</span><br><span>           _sched_compose_ph_data_ind(l1t, bi->tn, fn_begin, chan,</span><br><span>                   tch_data + amr, GSM_MACBLOCK_LEN,</span><br><span>                    /* FIXME: AVG RSSI and ToA256 */</span><br><span>@@ -1314,12 +1304,8 @@</span><br><span>    /* TCH or BFI */</span><br><span> compose_l1sap:</span><br><span>   fn_begin = gsm0502_fn_remap(bi->fn, FN_REMAP_TCH_F);</span><br><span style="color: hsl(0, 100%, 40%);">- l1if_process_meas_res(l1t->trx, bi->tn, fn_begin,</span><br><span style="color: hsl(0, 100%, 40%);">-                       trx_chan_desc[chan].chan_nr | bi->tn,</span><br><span style="color: hsl(0, 100%, 40%);">-                        n_errors, n_bits_total,</span><br><span style="color: hsl(0, 100%, 40%);">-                         bi->rssi, bi->toa256);</span><br><span>   return _sched_compose_tch_ind(l1t, bi->tn, fn_begin, chan,</span><br><span style="color: hsl(0, 100%, 40%);">-                                 tch_data, rc);</span><br><span style="color: hsl(120, 100%, 40%);">+                                tch_data, rc, bi->toa256, ber10k, bi->rssi);</span><br><span> }</span><br><span> </span><br><span> /*! \brief a single TCH/H burst was received by the PHY, process it */</span><br><span>@@ -1345,6 +1331,7 @@</span><br><span>   */</span><br><span>  int fn_is_odd = (((bi->fn + 26 - 10) % 26) >> 2) & 1;</span><br><span>   unsigned int fn_begin;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint16_t ber10k;</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>@@ -1387,6 +1374,8 @@</span><br><span>      }</span><br><span>    *mask = 0x0;</span><br><span> </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%);">+</span><br><span>         /* skip second of two TCH frames of FACCH was received */</span><br><span>    if (chan_state->ul_ongoing_facch) {</span><br><span>               chan_state->ul_ongoing_facch = 0;</span><br><span>@@ -1466,10 +1455,6 @@</span><br><span>                        fn_begin = gsm0502_fn_remap(bi->fn, FN_REMAP_FACCH_H0);</span><br><span>           else</span><br><span>                         fn_begin = gsm0502_fn_remap(bi->fn, FN_REMAP_FACCH_H1);</span><br><span style="color: hsl(0, 100%, 40%);">-              l1if_process_meas_res(l1t->trx, bi->tn, fn_begin,</span><br><span style="color: hsl(0, 100%, 40%);">-                               trx_chan_desc[chan].chan_nr | bi->tn,</span><br><span style="color: hsl(0, 100%, 40%);">-                                n_errors, n_bits_total, bi->rssi,</span><br><span style="color: hsl(0, 100%, 40%);">-                                    bi->toa256);</span><br><span>                _sched_compose_ph_data_ind(l1t, bi->tn, fn_begin, chan,</span><br><span>                   tch_data + amr, GSM_MACBLOCK_LEN,</span><br><span>                    /* FIXME: AVG both RSSI and ToA */</span><br><span>@@ -1535,12 +1520,8 @@</span><br><span>          fn_begin = gsm0502_fn_remap(bi->fn, FN_REMAP_TCH_H0);</span><br><span>     else</span><br><span>                 fn_begin = gsm0502_fn_remap(bi->fn, FN_REMAP_TCH_H1);</span><br><span style="color: hsl(0, 100%, 40%);">-        l1if_process_meas_res(l1t->trx, bi->tn, fn_begin,</span><br><span style="color: hsl(0, 100%, 40%);">-                       trx_chan_desc[chan].chan_nr | bi->tn,</span><br><span style="color: hsl(0, 100%, 40%);">-                        n_errors, n_bits_total, bi->rssi,</span><br><span style="color: hsl(0, 100%, 40%);">-                            bi->toa256);</span><br><span>        return _sched_compose_tch_ind(l1t, bi->tn, fn_begin, chan,</span><br><span style="color: hsl(0, 100%, 40%);">-                                 tch_data, rc);</span><br><span style="color: hsl(120, 100%, 40%);">+                                tch_data, rc, bi->toa256, ber10k, bi->rssi);</span><br><span> }</span><br><span> </span><br><span> /* schedule all frames of all TRX for given FN */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/15918">change 15918</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/+/15918"/><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: I710d0b7cf193afa8515807836ee69b8b7db84a84 </div>
<div style="display:none"> Gerrit-Change-Number: 15918 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>