<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/14612">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">osmo-bts-trx/scheduler: pass trx_ul_burst_ind to lchan handlers<br><br>Change-Id: Iae6b78bafa4b86d0c681684de47320d641d3f7c0<br>Related: OS#4006<br>---<br>M include/osmo-bts/scheduler_backend.h<br>M src/common/scheduler.c<br>M src/osmo-bts-trx/scheduler_trx.c<br>M src/osmo-bts-virtual/scheduler_virtbts.c<br>4 files changed, 189 insertions(+), 152 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/12/14612/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 505f4d7..d713900 100644</span><br><span>--- a/include/osmo-bts/scheduler_backend.h</span><br><span>+++ b/include/osmo-bts/scheduler_backend.h</span><br><span>@@ -13,10 +13,8 @@</span><br><span>                            uint32_t fn, enum trx_chan_type chan,</span><br><span>                                uint8_t bid, uint16_t *nbits);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-typedef int trx_sched_ul_func(struct l1sched_trx *l1t, uint8_t tn,</span><br><span style="color: hsl(0, 100%, 40%);">-                        uint32_t fn, enum trx_chan_type chan,</span><br><span style="color: hsl(0, 100%, 40%);">-                           uint8_t bid, sbit_t *bits, uint16_t nbits,</span><br><span style="color: hsl(0, 100%, 40%);">-                              int8_t rssi, int16_t toa256);</span><br><span style="color: hsl(120, 100%, 40%);">+typedef int trx_sched_ul_func(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(120, 100%, 40%);">+                        uint8_t bid, const struct trx_ul_burst_ind *bi);</span><br><span> </span><br><span> struct trx_chan_desc {</span><br><span>         /*! \brief Human-readable name */</span><br><span>@@ -70,21 +68,16 @@</span><br><span>      enum trx_chan_type chan, uint8_t bid, uint16_t *nbits);</span><br><span> ubit_t *tx_tchh_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 style="color: hsl(0, 100%, 40%);">-int rx_rach_fn(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 bid, sbit_t *bits, uint16_t nbits,</span><br><span style="color: hsl(0, 100%, 40%);">-     int8_t rssi, int16_t toa256);</span><br><span style="color: hsl(0, 100%, 40%);">-int rx_data_fn(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 bid, sbit_t *bits, uint16_t nbits,</span><br><span style="color: hsl(0, 100%, 40%);">-     int8_t rssi, int16_t toa256);</span><br><span style="color: hsl(0, 100%, 40%);">-int rx_pdtch_fn(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 bid, sbit_t *bits, uint16_t nbits,</span><br><span style="color: hsl(0, 100%, 40%);">-     int8_t rssi, int16_t toa256);</span><br><span style="color: hsl(0, 100%, 40%);">-int rx_tchf_fn(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 bid, sbit_t *bits, uint16_t nbits,</span><br><span style="color: hsl(0, 100%, 40%);">-     int8_t rssi, int16_t toa256);</span><br><span style="color: hsl(0, 100%, 40%);">-int rx_tchh_fn(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 bid, sbit_t *bits, uint16_t nbits,</span><br><span style="color: hsl(0, 100%, 40%);">-     int8_t rssi, int16_t toa256);</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_rach_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(120, 100%, 40%);">+              uint8_t bid, const struct trx_ul_burst_ind *bi);</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_data_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(120, 100%, 40%);">+            uint8_t bid, const struct trx_ul_burst_ind *bi);</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_pdtch_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(120, 100%, 40%);">+            uint8_t bid, const struct trx_ul_burst_ind *bi);</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_tchf_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(120, 100%, 40%);">+           uint8_t bid, const struct trx_ul_burst_ind *bi);</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_tchh_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(120, 100%, 40%);">+            uint8_t bid, const struct trx_ul_burst_ind *bi);</span><br><span> </span><br><span> const ubit_t *_sched_dl_burst(struct l1sched_trx *l1t, uint8_t tn,</span><br><span>                          uint32_t fn, uint16_t *nbits);</span><br><span>diff --git a/src/common/scheduler.c b/src/common/scheduler.c</span><br><span>index 83779d7..93214f9 100644</span><br><span>--- a/src/common/scheduler.c</span><br><span>+++ b/src/common/scheduler.c</span><br><span>@@ -1287,9 +1287,17 @@</span><br><span>            * Instead of doing this, it makes sense to use the</span><br><span>           * amount of lost frames in measurement calculations.</span><br><span>                 */</span><br><span style="color: hsl(0, 100%, 40%);">-             static sbit_t zero_burst[GSM_BURST_LEN] = { 0 };</span><br><span>             trx_sched_ul_func *func;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+          /* Prepare dummy burst indication */</span><br><span style="color: hsl(120, 100%, 40%);">+          struct trx_ul_burst_ind bi = {</span><br><span style="color: hsl(120, 100%, 40%);">+                        .flags = TRX_BI_F_NOPE_IND,</span><br><span style="color: hsl(120, 100%, 40%);">+                   .burst_len = GSM_BURST_LEN,</span><br><span style="color: hsl(120, 100%, 40%);">+                   .burst = { 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+                       .rssi = -128,</span><br><span style="color: hsl(120, 100%, 40%);">+                 .tn = tn,</span><br><span style="color: hsl(120, 100%, 40%);">+             };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                 for (i = 1; i < elapsed_fs; i++) {</span><br><span>                        fn_i = TDMA_FN_SUM(l1cs->last_tdma_fn, i);</span><br><span>                        offset = fn_i % l1ts->mf_period;</span><br><span>@@ -1303,8 +1311,8 @@</span><br><span>                          "Substituting lost TDMA frame=%u by all-zero "</span><br><span>                             "dummy burst\n", fn_i);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                   func(l1t, tn, fn_i, frame->ul_chan, frame->ul_bid,</span><br><span style="color: hsl(0, 100%, 40%);">-                                zero_burst, GSM_BURST_LEN, -128, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                  bi.fn = fn_i;</span><br><span style="color: hsl(120, 100%, 40%);">+                 func(l1t, frame->ul_chan, frame->ul_bid, &bi);</span><br><span> </span><br><span>                         l1cs->lost_tdma_fs--;</span><br><span>             }</span><br><span>@@ -1365,9 +1373,8 @@</span><br><span>            }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* put burst to function</span><br><span style="color: hsl(0, 100%, 40%);">-         * TODO: rather pass a pointer to trx_ul_burst_ind */</span><br><span style="color: hsl(0, 100%, 40%);">-   func(l1t, bi->tn, bi->fn, chan, bid, bi->burst, bi->burst_len, bi->rssi, bi->toa256);</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Invoke the logical channel handler */</span><br><span style="color: hsl(120, 100%, 40%);">+      func(l1t,chan, bid, bi);</span><br><span> </span><br><span>         return 0;</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 ade3cff..294e73c 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>@@ -775,9 +775,8 @@</span><br><span>    return seq;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int rx_rach_fn(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 bid, sbit_t *bits, uint16_t nbits,</span><br><span style="color: hsl(0, 100%, 40%);">-     int8_t rssi, int16_t toa256)</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_rach_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(120, 100%, 40%);">+               uint8_t bid, const struct trx_ul_burst_ind *bi)</span><br><span> {</span><br><span>  struct osmo_phsap_prim l1sap;</span><br><span>        int n_errors, n_bits_total;</span><br><span>@@ -796,31 +795,33 @@</span><br><span> </span><br><span>      /* Handover RACH cannot be extended (11-bit) */</span><br><span>      if (chan == TRXC_RACH)</span><br><span style="color: hsl(0, 100%, 40%);">-          synch_seq = rach_get_synch_seq(bits, &best_score);</span><br><span style="color: hsl(120, 100%, 40%);">+                /* TODO: check for TRX_BI_F_TS_INFO flag! */</span><br><span style="color: hsl(120, 100%, 40%);">+          synch_seq = rach_get_synch_seq((sbit_t *) bi->burst, &best_score);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   LOGL1S(DL1P, LOGL_DEBUG, l1t, tn, chan, fn,</span><br><span style="color: hsl(120, 100%, 40%);">+   LOGL1S(DL1P, LOGL_DEBUG, l1t, bi->tn, chan, bi->fn,</span><br><span>           "Received RACH (%s; match=%.1f%%) toa=%d\n",</span><br><span>               get_value_string(rach_synch_seq_names, synch_seq),</span><br><span>           best_score * 100.0 / (127 * RACH_SYNCH_SEQ_LEN),</span><br><span style="color: hsl(0, 100%, 40%);">-        toa256);</span><br><span style="color: hsl(120, 100%, 40%);">+              bi->toa256);</span><br><span> </span><br><span>   /* Compose a new L1SAP primitive */</span><br><span>  memset(&l1sap, 0x00, sizeof(l1sap));</span><br><span>     osmo_prim_init(&l1sap.oph, SAP_GSM_PH, PRIM_PH_RACH, PRIM_OP_INDICATION, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-     l1sap.u.rach_ind.chan_nr = trx_chan_desc[chan].chan_nr | tn;</span><br><span style="color: hsl(0, 100%, 40%);">-    l1sap.u.rach_ind.acc_delay = (toa256 >= 0) ? toa256 / 256 : 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       l1sap.u.rach_ind.acc_delay_256bits = toa256;</span><br><span style="color: hsl(0, 100%, 40%);">-    l1sap.u.rach_ind.rssi = rssi;</span><br><span style="color: hsl(0, 100%, 40%);">-   l1sap.u.rach_ind.fn = fn;</span><br><span style="color: hsl(120, 100%, 40%);">+     l1sap.u.rach_ind.chan_nr = trx_chan_desc[chan].chan_nr | bi->tn;</span><br><span style="color: hsl(120, 100%, 40%);">+   l1sap.u.rach_ind.acc_delay = (bi->toa256 >= 0) ? bi->toa256 / 256 : 0;</span><br><span style="color: hsl(120, 100%, 40%);">+       l1sap.u.rach_ind.acc_delay_256bits = bi->toa256;</span><br><span style="color: hsl(120, 100%, 40%);">+   l1sap.u.rach_ind.rssi = bi->rssi;</span><br><span style="color: hsl(120, 100%, 40%);">+  l1sap.u.rach_ind.fn = bi->fn;</span><br><span> </span><br><span>         /* Decode RACH depending on its synch. sequence */</span><br><span>   switch (synch_seq) {</span><br><span>         case RACH_SYNCH_SEQ_TS1:</span><br><span>     case RACH_SYNCH_SEQ_TS2:</span><br><span style="color: hsl(0, 100%, 40%);">-                rc = gsm0503_rach_ext_decode_ber(&ra11, bits + RACH_EXT_TAIL_LEN + RACH_SYNCH_SEQ_LEN,</span><br><span style="color: hsl(120, 100%, 40%);">+            rc = gsm0503_rach_ext_decode_ber(&ra11, bi->burst + RACH_EXT_TAIL_LEN + RACH_SYNCH_SEQ_LEN,</span><br><span>                                            l1t->trx->bts->bsic, &n_errors, &n_bits_total);</span><br><span>            if (rc) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       LOGL1S(DL1P, LOGL_DEBUG, l1t, tn, chan, fn, "Received bad Access Burst\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                 LOGL1S(DL1P, LOGL_DEBUG, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                            "Received bad Access Burst\n");</span><br><span>                     return 0;</span><br><span>            }</span><br><span> </span><br><span>@@ -837,14 +838,16 @@</span><br><span>        default:</span><br><span>             /* Fall-back to the default TS0 if needed */</span><br><span>                 if (synch_seq != RACH_SYNCH_SEQ_TS0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  LOGL1S(DL1P, LOGL_DEBUG, l1t, tn, chan, fn, "Falling-back to the default TS0\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                   LOGL1S(DL1P, LOGL_DEBUG, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                            "Falling-back to the default TS0\n");</span><br><span>                       synch_seq = RACH_SYNCH_SEQ_TS0;</span><br><span>              }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           rc = gsm0503_rach_decode_ber(&ra, bits + RACH_EXT_TAIL_LEN + RACH_SYNCH_SEQ_LEN,</span><br><span style="color: hsl(120, 100%, 40%);">+          rc = gsm0503_rach_decode_ber(&ra, bi->burst + RACH_EXT_TAIL_LEN + RACH_SYNCH_SEQ_LEN,</span><br><span>                                              l1t->trx->bts->bsic, &n_errors, &n_bits_total);</span><br><span>                if (rc) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       LOGL1S(DL1P, LOGL_DEBUG, l1t, tn, chan, fn, "Received bad Access Burst\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                 LOGL1S(DL1P, LOGL_DEBUG, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                            "Received bad Access Burst\n");</span><br><span>                     return 0;</span><br><span>            }</span><br><span> </span><br><span>@@ -863,11 +866,10 @@</span><br><span> }</span><br><span> </span><br><span> /*! \brief a single (SDCCH/SACCH) burst was received by the PHY, process it */</span><br><span style="color: hsl(0, 100%, 40%);">-int rx_data_fn(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 bid, sbit_t *bits, uint16_t nbits,</span><br><span style="color: hsl(0, 100%, 40%);">-     int8_t rssi, int16_t toa256)</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_data_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(120, 100%, 40%);">+               uint8_t bid, const struct trx_ul_burst_ind *bi)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, tn);</span><br><span style="color: hsl(120, 100%, 40%);">+        struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, bi->tn);</span><br><span>        struct l1sched_chan_state *chan_state = &l1ts->chan_state[chan];</span><br><span>      sbit_t *burst, **bursts_p = &chan_state->ul_bursts;</span><br><span>   uint32_t *first_fn = &chan_state->ul_first_fn;</span><br><span>@@ -883,9 +885,10 @@</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 style="color: hsl(0, 100%, 40%);">-         return rx_rach_fn(l1t, tn, fn, chan, bid, bits, GSM_BURST_LEN, rssi, toa256);</span><br><span style="color: hsl(120, 100%, 40%);">+         return rx_rach_fn(l1t, chan, bid, bi);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      LOGL1S(DL1P, LOGL_DEBUG, l1t, tn, chan, fn, "Received Data, bid=%u\n", bid);</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGL1S(DL1P, LOGL_DEBUG, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+            "Received Data, bid=%u\n", bid);</span><br><span> </span><br><span>        /* allocate burst memory, if not already */</span><br><span>  if (!*bursts_p) {</span><br><span>@@ -898,7 +901,7 @@</span><br><span>      if (bid == 0) {</span><br><span>              memset(*bursts_p, 0, 464);</span><br><span>           *mask = 0x0;</span><br><span style="color: hsl(0, 100%, 40%);">-            *first_fn = fn;</span><br><span style="color: hsl(120, 100%, 40%);">+               *first_fn = bi->fn;</span><br><span>               *rssi_sum = 0;</span><br><span>               *rssi_num = 0;</span><br><span>               *toa256_sum = 0;</span><br><span>@@ -907,20 +910,20 @@</span><br><span> </span><br><span>         /* update mask + RSSI */</span><br><span>     *mask |= (1 << bid);</span><br><span style="color: hsl(0, 100%, 40%);">-      *rssi_sum += rssi;</span><br><span style="color: hsl(120, 100%, 40%);">+    *rssi_sum += bi->rssi;</span><br><span>    (*rssi_num)++;</span><br><span style="color: hsl(0, 100%, 40%);">-  *toa256_sum += toa256;</span><br><span style="color: hsl(120, 100%, 40%);">+        *toa256_sum += bi->toa256;</span><br><span>        (*toa_num)++;</span><br><span> </span><br><span>    /* copy burst to buffer of 4 bursts */</span><br><span>       burst = *bursts_p + bid * 116;</span><br><span style="color: hsl(0, 100%, 40%);">-  memcpy(burst, bits + 3, 58);</span><br><span style="color: hsl(0, 100%, 40%);">-    memcpy(burst + 58, bits + 87, 58);</span><br><span style="color: hsl(120, 100%, 40%);">+    memcpy(burst, bi->burst + 3, 58);</span><br><span style="color: hsl(120, 100%, 40%);">+  memcpy(burst + 58, bi->burst + 87, 58);</span><br><span> </span><br><span>       /* send burst information to loops process */</span><br><span>        if (L1SAP_IS_LINK_SACCH(trx_chan_desc[chan].link_id)) {</span><br><span style="color: hsl(0, 100%, 40%);">-         trx_loop_sacch_input(l1t, trx_chan_desc[chan].chan_nr | tn,</span><br><span style="color: hsl(0, 100%, 40%);">-                     chan_state, rssi, toa256);</span><br><span style="color: hsl(120, 100%, 40%);">+            trx_loop_sacch_input(l1t, trx_chan_desc[chan].chan_nr | bi->tn,</span><br><span style="color: hsl(120, 100%, 40%);">+                    chan_state, bi->rssi, bi->toa256);</span><br><span>     }</span><br><span> </span><br><span>        /* wait until complete set of bursts */</span><br><span>@@ -929,7 +932,8 @@</span><br><span> </span><br><span>    /* check for complete set of bursts */</span><br><span>       if ((*mask & 0xf) != 0xf) {</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGL1S(DL1P, LOGL_NOTICE, l1t, tn, chan, fn, "Received incomplete data (%u/%u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGL1S(DL1P, LOGL_NOTICE, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "Received incomplete data (%u/%u)\n",</span><br><span>                      *first_fn, (*first_fn) % l1ts->mf_period);</span><br><span> </span><br><span>            /* we require first burst to have correct FN */</span><br><span>@@ -943,28 +947,33 @@</span><br><span>      /* decode */</span><br><span>         rc = gsm0503_xcch_decode(l2, *bursts_p, &n_errors, &n_bits_total);</span><br><span>   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(120, 100%, 40%);">+         LOGL1S(DL1P, LOGL_NOTICE, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "Received bad data (%u/%u)\n",</span><br><span>                     *first_fn, (*first_fn) % l1ts->mf_period);</span><br><span>                l2_len = 0;</span><br><span>  } else</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, 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(120, 100%, 40%);">+       l1if_process_meas_res(l1t->trx, bi->tn, *first_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                            trx_chan_desc[chan].chan_nr | bi->tn,</span><br><span style="color: hsl(120, 100%, 40%);">+                              n_errors, n_bits_total,</span><br><span style="color: hsl(120, 100%, 40%);">+                       *rssi_sum / *rssi_num,</span><br><span style="color: hsl(120, 100%, 40%);">+                        *toa256_sum / *toa_num);</span><br><span>       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(120, 100%, 40%);">+       return _sched_compose_ph_data_ind(l1t, bi->tn, *first_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    chan, l2, l2_len,</span><br><span>                                    *rssi_sum / *rssi_num,</span><br><span style="color: hsl(0, 100%, 40%);">-                                          *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%);">+                                   *toa256_sum / *toa_num,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       0 /* FIXME: AVG C/I */,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       ber10k, PRES_INFO_UNKNOWN);</span><br><span> }</span><br><span> </span><br><span> /*! \brief a single PDTCH burst was received by the PHY, process it */</span><br><span style="color: hsl(0, 100%, 40%);">-int rx_pdtch_fn(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 bid, sbit_t *bits, uint16_t nbits,</span><br><span style="color: hsl(0, 100%, 40%);">-     int8_t rssi, int16_t toa256)</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_pdtch_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(120, 100%, 40%);">+              uint8_t bid, const struct trx_ul_burst_ind *bi)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, tn);</span><br><span style="color: hsl(120, 100%, 40%);">+        struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, bi->tn);</span><br><span>        struct l1sched_chan_state *chan_state = &l1ts->chan_state[chan];</span><br><span>      sbit_t *burst, **bursts_p = &chan_state->ul_bursts;</span><br><span>   uint32_t *first_fn = &chan_state->ul_first_fn;</span><br><span>@@ -978,7 +987,8 @@</span><br><span>  uint16_t ber10k;</span><br><span>     int rc;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     LOGL1S(DL1P, LOGL_DEBUG, l1t, tn, chan, fn, "Received PDTCH bid=%u\n", bid);</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGL1S(DL1P, LOGL_DEBUG, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+             "Received PDTCH bid=%u\n", bid);</span><br><span> </span><br><span>       /* allocate burst memory, if not already */</span><br><span>  if (!*bursts_p) {</span><br><span>@@ -992,7 +1002,7 @@</span><br><span>     if (bid == 0) {</span><br><span>              memset(*bursts_p, 0, GSM0503_EGPRS_BURSTS_NBITS);</span><br><span>            *mask = 0x0;</span><br><span style="color: hsl(0, 100%, 40%);">-            *first_fn = fn;</span><br><span style="color: hsl(120, 100%, 40%);">+               *first_fn = bi->fn;</span><br><span>               *rssi_sum = 0;</span><br><span>               *rssi_num = 0;</span><br><span>               *toa256_sum = 0;</span><br><span>@@ -1001,21 +1011,21 @@</span><br><span> </span><br><span>       /* update mask + rssi */</span><br><span>     *mask |= (1 << bid);</span><br><span style="color: hsl(0, 100%, 40%);">-      *rssi_sum += rssi;</span><br><span style="color: hsl(120, 100%, 40%);">+    *rssi_sum += bi->rssi;</span><br><span>    (*rssi_num)++;</span><br><span style="color: hsl(0, 100%, 40%);">-  *toa256_sum += toa256;</span><br><span style="color: hsl(120, 100%, 40%);">+        *toa256_sum += bi->toa256;</span><br><span>        (*toa_num)++;</span><br><span> </span><br><span>    /* copy burst to buffer of 4 bursts */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (nbits == EGPRS_BURST_LEN) {</span><br><span style="color: hsl(120, 100%, 40%);">+       if (bi->burst_len == EGPRS_BURST_LEN) {</span><br><span>           burst = *bursts_p + bid * 348;</span><br><span style="color: hsl(0, 100%, 40%);">-          memcpy(burst, bits + 9, 174);</span><br><span style="color: hsl(0, 100%, 40%);">-           memcpy(burst + 174, bits + 261, 174);</span><br><span style="color: hsl(120, 100%, 40%);">+         memcpy(burst, bi->burst + 9, 174);</span><br><span style="color: hsl(120, 100%, 40%);">+         memcpy(burst + 174, bi->burst + 261, 174);</span><br><span>                n_bursts_bits = GSM0503_EGPRS_BURSTS_NBITS;</span><br><span>  } else {</span><br><span>             burst = *bursts_p + bid * 116;</span><br><span style="color: hsl(0, 100%, 40%);">-          memcpy(burst, bits + 3, 58);</span><br><span style="color: hsl(0, 100%, 40%);">-            memcpy(burst + 58, bits + 87, 58);</span><br><span style="color: hsl(120, 100%, 40%);">+            memcpy(burst, bi->burst + 3, 58);</span><br><span style="color: hsl(120, 100%, 40%);">+          memcpy(burst + 58, bi->burst + 87, 58);</span><br><span>           n_bursts_bits = GSM0503_GPRS_BURSTS_NBITS;</span><br><span>   }</span><br><span> </span><br><span>@@ -1025,8 +1035,9 @@</span><br><span> </span><br><span>    /* check for complete set of bursts */</span><br><span>       if ((*mask & 0xf) != 0xf) {</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGL1S(DL1P, LOGL_DEBUG, l1t, tn, chan, fn, "Received incomplete frame (%u/%u)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                    fn % l1ts->mf_period, l1ts->mf_period);</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGL1S(DL1P, LOGL_DEBUG, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                     "Received incomplete frame (%u/%u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                      bi->fn % l1ts->mf_period, l1ts->mf_period);</span><br><span>         }</span><br><span>    *mask = 0x0;</span><br><span> </span><br><span>@@ -1039,33 +1050,39 @@</span><br><span>   rc = gsm0503_pdtch_egprs_decode(l2, *bursts_p, n_bursts_bits,</span><br><span>                                NULL, &n_errors, &n_bits_total);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    if ((nbits == GSM_BURST_LEN) && (rc < 0)) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if ((bi->burst_len == GSM_BURST_LEN) && (rc < 0)) {</span><br><span>            rc = gsm0503_pdtch_decode(l2, *bursts_p, NULL,</span><br><span>                                 &n_errors, &n_bits_total);</span><br><span>         }</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, 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(120, 100%, 40%);">+       l1if_process_meas_res(l1t->trx, bi->tn, *first_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+              trx_chan_desc[chan].chan_nr | bi->tn,</span><br><span style="color: hsl(120, 100%, 40%);">+              n_errors, n_bits_total,</span><br><span style="color: hsl(120, 100%, 40%);">+               *rssi_sum / *rssi_num,</span><br><span style="color: hsl(120, 100%, 40%);">+                *toa256_sum / *toa_num);</span><br><span> </span><br><span>         if (rc <= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGL1S(DL1P, LOGL_DEBUG, l1t, tn, chan, fn, "Received bad PDTCH (%u/%u)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                   fn % l1ts->mf_period, l1ts->mf_period);</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGL1S(DL1P, LOGL_DEBUG, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                     "Received bad PDTCH (%u/%u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                     bi->fn % l1ts->mf_period, l1ts->mf_period);</span><br><span>                 return 0;</span><br><span>    }</span><br><span>    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,</span><br><span style="color: hsl(0, 100%, 40%);">-             l2, rc, *rssi_sum / *rssi_num, *toa256_sum / *toa_num, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+     return _sched_compose_ph_data_ind(l1t, bi->tn,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       *first_fn, chan, l2, rc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      *rssi_sum / *rssi_num,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        *toa256_sum / *toa_num,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       0 /* FIXME: AVG C/I */,</span><br><span>                                      ber10k, PRES_INFO_BOTH);</span><br><span> }</span><br><span> </span><br><span> /*! \brief a single TCH/F burst was received by the PHY, process it */</span><br><span style="color: hsl(0, 100%, 40%);">-int rx_tchf_fn(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 bid, sbit_t *bits, uint16_t nbits,</span><br><span style="color: hsl(0, 100%, 40%);">-     int8_t rssi, int16_t toa256)</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_tchf_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(120, 100%, 40%);">+               uint8_t bid, const struct trx_ul_burst_ind *bi)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, tn);</span><br><span style="color: hsl(120, 100%, 40%);">+        struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, bi->tn);</span><br><span>        struct l1sched_chan_state *chan_state = &l1ts->chan_state[chan];</span><br><span>      sbit_t *burst, **bursts_p = &chan_state->ul_bursts;</span><br><span>   uint32_t *first_fn = &chan_state->ul_first_fn;</span><br><span>@@ -1077,13 +1094,14 @@</span><br><span>      int n_errors, n_bits_total;</span><br><span>  bool bfi_flag = false;</span><br><span>       struct gsm_lchan *lchan =</span><br><span style="color: hsl(0, 100%, 40%);">-               get_lchan_by_chan_nr(l1t->trx, trx_chan_desc[chan].chan_nr | tn);</span><br><span style="color: hsl(120, 100%, 40%);">+          get_lchan_by_chan_nr(l1t->trx, trx_chan_desc[chan].chan_nr | bi->tn);</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 style="color: hsl(0, 100%, 40%);">-         return rx_rach_fn(l1t, tn, fn, chan, bid, bits, GSM_BURST_LEN, rssi, toa256);</span><br><span style="color: hsl(120, 100%, 40%);">+         return rx_rach_fn(l1t, chan, bid, bi);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      LOGL1S(DL1P, LOGL_DEBUG, l1t, tn, chan, fn, "Received TCH/F, bid=%u\n", bid);</span><br><span style="color: hsl(120, 100%, 40%);">+       LOGL1S(DL1P, LOGL_DEBUG, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+            "Received TCH/F, bid=%u\n", bid);</span><br><span> </span><br><span>       /* allocate burst memory, if not already */</span><br><span>  if (!*bursts_p) {</span><br><span>@@ -1096,7 +1114,7 @@</span><br><span>    if (bid == 0) {</span><br><span>              memset(*bursts_p + 464, 0, 464);</span><br><span>             *mask = 0x0;</span><br><span style="color: hsl(0, 100%, 40%);">-            *first_fn = fn;</span><br><span style="color: hsl(120, 100%, 40%);">+               *first_fn = bi->fn;</span><br><span>       }</span><br><span> </span><br><span>        /* update mask */</span><br><span>@@ -1104,8 +1122,8 @@</span><br><span> </span><br><span>        /* copy burst to end of buffer of 8 bursts */</span><br><span>        burst = *bursts_p + bid * 116 + 464;</span><br><span style="color: hsl(0, 100%, 40%);">-    memcpy(burst, bits + 3, 58);</span><br><span style="color: hsl(0, 100%, 40%);">-    memcpy(burst + 58, bits + 87, 58);</span><br><span style="color: hsl(120, 100%, 40%);">+    memcpy(burst, bi->burst + 3, 58);</span><br><span style="color: hsl(120, 100%, 40%);">+  memcpy(burst + 58, bi->burst + 87, 58);</span><br><span> </span><br><span>       /* wait until complete set of bursts */</span><br><span>      if (bid != 3)</span><br><span>@@ -1113,8 +1131,9 @@</span><br><span> </span><br><span>    /* check for complete set of bursts */</span><br><span>       if ((*mask & 0xf) != 0xf) {</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGL1S(DL1P, LOGL_NOTICE, l1t, tn, chan, fn, "Received incomplete frame (%u/%u)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                   fn % l1ts->mf_period, l1ts->mf_period);</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGL1S(DL1P, LOGL_NOTICE, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "Received incomplete frame (%u/%u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                      bi->fn % l1ts->mf_period, l1ts->mf_period);</span><br><span>         }</span><br><span>    *mask = 0x0;</span><br><span> </span><br><span>@@ -1136,12 +1155,12 @@</span><br><span>            * NOTE: A frame ends 7 FN after start.</span><br><span>               */</span><br><span>          rc = gsm0503_tch_afs_decode(tch_data + 2, *bursts_p,</span><br><span style="color: hsl(0, 100%, 40%);">-                    (((fn + 26 - 7) % 26) >> 2) & 1, chan_state->codec,</span><br><span style="color: hsl(120, 100%, 40%);">+                      (((bi->fn + 26 - 7) % 26) >> 2) & 1, chan_state->codec,</span><br><span>                      chan_state->codecs, &chan_state->ul_ft,</span><br><span>                    &chan_state->ul_cmr, &n_errors, &n_bits_total);</span><br><span>               if (rc)</span><br><span>                      trx_loop_amr_input(l1t,</span><br><span style="color: hsl(0, 100%, 40%);">-                         trx_chan_desc[chan].chan_nr | tn, chan_state,</span><br><span style="color: hsl(120, 100%, 40%);">+                         trx_chan_desc[chan].chan_nr | bi->tn, chan_state,</span><br><span>                                 (float)n_errors/(float)n_bits_total);</span><br><span>                amr = 2; /* we store tch_data + 2 header bytes */</span><br><span>            /* only good speech frames get rtp header */</span><br><span>@@ -1152,26 +1171,31 @@</span><br><span>               }</span><br><span>            break;</span><br><span>       default:</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGL1S(DL1P, LOGL_ERROR, l1t, tn, chan, fn, "TCH mode %u invalid, please fix!\n",</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGL1S(DL1P, LOGL_ERROR, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                     "TCH mode %u invalid, please fix!\n",</span><br><span>                      tch_mode);</span><br><span>           return -EINVAL;</span><br><span>      }</span><br><span>    memcpy(*bursts_p, *bursts_p + 464, 464);</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, 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, toa256);</span><br><span style="color: hsl(120, 100%, 40%);">+        l1if_process_meas_res(l1t->trx, bi->tn, *first_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                            trx_chan_desc[chan].chan_nr | bi->tn,</span><br><span style="color: hsl(120, 100%, 40%);">+                              n_errors, n_bits_total,</span><br><span style="color: hsl(120, 100%, 40%);">+                       bi->rssi, bi->toa256);</span><br><span> </span><br><span>       /* Check if the frame is bad */</span><br><span>      if (rc < 0) {</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%);">-                   fn % l1ts->mf_period, l1ts->mf_period);</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGL1S(DL1P, LOGL_NOTICE, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "Received bad data (%u/%u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                      bi->fn % l1ts->mf_period, l1ts->mf_period);</span><br><span>                 bfi_flag = true;</span><br><span>             goto bfi;</span><br><span>    }</span><br><span>    if (rc < 4) {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGL1S(DL1P, LOGL_NOTICE, l1t, tn, chan, fn, "Received bad data (%u/%u) "</span><br><span style="color: hsl(0, 100%, 40%);">-                     "with invalid codec mode %d\n", fn % l1ts->mf_period, l1ts->mf_period, rc);</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGL1S(DL1P, LOGL_NOTICE, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "Received bad data (%u/%u) with invalid codec mode %d\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                   bi->fn % l1ts->mf_period, l1ts->mf_period, rc);</span><br><span>             bfi_flag = true;</span><br><span>             goto bfi;</span><br><span>    }</span><br><span>@@ -1179,9 +1203,14 @@</span><br><span>   /* FACCH */</span><br><span>  if (rc == GSM_MACBLOCK_LEN) {</span><br><span>                uint16_t ber10k = compute_ber10k(n_bits_total, n_errors);</span><br><span style="color: hsl(0, 100%, 40%);">-               _sched_compose_ph_data_ind(l1t, tn, (fn + GSM_HYPERFRAME - 7) % GSM_HYPERFRAME, chan,</span><br><span style="color: hsl(0, 100%, 40%);">-                   tch_data + amr, GSM_MACBLOCK_LEN, rssi, toa256, 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                                         ber10k, PRES_INFO_UNKNOWN);</span><br><span style="color: hsl(120, 100%, 40%);">+                _sched_compose_ph_data_ind(l1t, bi->tn,</span><br><span style="color: hsl(120, 100%, 40%);">+                    /* FIXME: this calculation is wrong */</span><br><span style="color: hsl(120, 100%, 40%);">+                        (bi->fn + GSM_HYPERFRAME - 7) % GSM_HYPERFRAME, chan,</span><br><span style="color: hsl(120, 100%, 40%);">+                      tch_data + amr, GSM_MACBLOCK_LEN,</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* FIXME: AVG RSSI and ToA256 */</span><br><span style="color: hsl(120, 100%, 40%);">+                      bi->rssi, bi->toa256,</span><br><span style="color: hsl(120, 100%, 40%);">+                   0 /* FIXME: AVG C/I */,</span><br><span style="color: hsl(120, 100%, 40%);">+                       ber10k, PRES_INFO_UNKNOWN);</span><br><span> bfi:</span><br><span>          if (rsl_cmode == RSL_CMOD_SPD_SPEECH) {</span><br><span>                      /* indicate bad frame */</span><br><span>@@ -1217,7 +1246,7 @@</span><br><span>                             memset(tch_data + 2, 0, rc - 2);</span><br><span>                             break;</span><br><span>                       default:</span><br><span style="color: hsl(0, 100%, 40%);">-                                LOGL1S(DL1P, LOGL_ERROR, l1t, tn, chan, fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                           LOGL1S(DL1P, LOGL_ERROR, l1t, bi->tn, chan, bi->fn,</span><br><span>                                    "TCH mode %u invalid, please fix!\n", tch_mode);</span><br><span>                           return -EINVAL;</span><br><span>                      }</span><br><span>@@ -1233,16 +1262,17 @@</span><br><span> </span><br><span>      /* TCH or BFI */</span><br><span> compose_l1sap:</span><br><span style="color: hsl(0, 100%, 40%);">-      return _sched_compose_tch_ind(l1t, tn, (fn + GSM_HYPERFRAME - 7) % GSM_HYPERFRAME, chan,</span><br><span style="color: hsl(120, 100%, 40%);">+      return _sched_compose_tch_ind(l1t, bi->tn,</span><br><span style="color: hsl(120, 100%, 40%);">+         /* FIXME: this calculation is wrong */</span><br><span style="color: hsl(120, 100%, 40%);">+                (bi->fn + GSM_HYPERFRAME - 7) % GSM_HYPERFRAME, chan,</span><br><span>             tch_data, rc);</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 style="color: hsl(0, 100%, 40%);">-int rx_tchh_fn(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 bid, sbit_t *bits, uint16_t nbits,</span><br><span style="color: hsl(0, 100%, 40%);">-     int8_t rssi, int16_t toa256)</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_tchh_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(120, 100%, 40%);">+               uint8_t bid, const struct trx_ul_burst_ind *bi)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, tn);</span><br><span style="color: hsl(120, 100%, 40%);">+        struct l1sched_ts *l1ts = l1sched_trx_get_ts(l1t, bi->tn);</span><br><span>        struct l1sched_chan_state *chan_state = &l1ts->chan_state[chan];</span><br><span>      sbit_t *burst, **bursts_p = &chan_state->ul_bursts;</span><br><span>   uint32_t *first_fn = &chan_state->ul_first_fn;</span><br><span>@@ -1253,18 +1283,19 @@</span><br><span>      int rc, amr = 0;</span><br><span>     int n_errors, n_bits_total;</span><br><span>  struct gsm_lchan *lchan =</span><br><span style="color: hsl(0, 100%, 40%);">-               get_lchan_by_chan_nr(l1t->trx, trx_chan_desc[chan].chan_nr | tn);</span><br><span style="color: hsl(120, 100%, 40%);">+          get_lchan_by_chan_nr(l1t->trx, trx_chan_desc[chan].chan_nr | bi->tn);</span><br><span>  /* Note on FN-10: If we are at FN 10, we decoded an even aligned</span><br><span>      * TCH/FACCH frame, because our burst buffer carries 6 bursts.</span><br><span>        * Even FN ending at: 10,11,19,20,2,3</span><br><span>         */</span><br><span style="color: hsl(0, 100%, 40%);">-     int fn_is_odd = (((fn + 26 - 10) % 26) >> 2) & 1;</span><br><span style="color: hsl(120, 100%, 40%);">+   int fn_is_odd = (((bi->fn + 26 - 10) % 26) >> 2) & 1;</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 style="color: hsl(0, 100%, 40%);">-         return rx_rach_fn(l1t, tn, fn, chan, bid, bits, GSM_BURST_LEN, rssi, toa256);</span><br><span style="color: hsl(120, 100%, 40%);">+         return rx_rach_fn(l1t, chan, bid, bi);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      LOGL1S(DL1P, LOGL_DEBUG, l1t, tn, chan, fn, "Received TCH/H, bid=%u\n", bid);</span><br><span style="color: hsl(120, 100%, 40%);">+       LOGL1S(DL1P, LOGL_DEBUG, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+             "Received TCH/H, bid=%u\n", bid);</span><br><span> </span><br><span>      /* allocate burst memory, if not already */</span><br><span>  if (!*bursts_p) {</span><br><span>@@ -1277,7 +1308,7 @@</span><br><span>    if (bid == 0) {</span><br><span>              memset(*bursts_p + 464, 0, 232);</span><br><span>             *mask = 0x0;</span><br><span style="color: hsl(0, 100%, 40%);">-            *first_fn = fn;</span><br><span style="color: hsl(120, 100%, 40%);">+               *first_fn = bi->fn;</span><br><span>       }</span><br><span> </span><br><span>        /* update mask */</span><br><span>@@ -1285,8 +1316,8 @@</span><br><span> </span><br><span>        /* copy burst to end of buffer of 6 bursts */</span><br><span>        burst = *bursts_p + bid * 116 + 464;</span><br><span style="color: hsl(0, 100%, 40%);">-    memcpy(burst, bits + 3, 58);</span><br><span style="color: hsl(0, 100%, 40%);">-    memcpy(burst + 58, bits + 87, 58);</span><br><span style="color: hsl(120, 100%, 40%);">+    memcpy(burst, bi->burst + 3, 58);</span><br><span style="color: hsl(120, 100%, 40%);">+  memcpy(burst + 58, bi->burst + 87, 58);</span><br><span> </span><br><span>       /* wait until complete set of bursts */</span><br><span>      if (bid != 1)</span><br><span>@@ -1294,8 +1325,9 @@</span><br><span> </span><br><span>    /* check for complete set of bursts */</span><br><span>       if ((*mask & 0x3) != 0x3) {</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGL1S(DL1P, LOGL_NOTICE, l1t, tn, chan, fn, "Received incomplete frame (%u/%u)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                   fn % l1ts->mf_period, l1ts->mf_period);</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGL1S(DL1P, LOGL_NOTICE, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "Received incomplete frame (%u/%u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                      bi->fn % l1ts->mf_period, l1ts->mf_period);</span><br><span>         }</span><br><span>    *mask = 0x0;</span><br><span> </span><br><span>@@ -1332,7 +1364,7 @@</span><br><span>                     &chan_state->ul_cmr, &n_errors, &n_bits_total);</span><br><span>               if (rc)</span><br><span>                      trx_loop_amr_input(l1t,</span><br><span style="color: hsl(0, 100%, 40%);">-                         trx_chan_desc[chan].chan_nr | tn, chan_state,</span><br><span style="color: hsl(120, 100%, 40%);">+                         trx_chan_desc[chan].chan_nr | bi->tn, chan_state,</span><br><span>                                 (float)n_errors/(float)n_bits_total);</span><br><span>                amr = 2; /* we store tch_data + 2 two */</span><br><span>             /* only good speech frames get rtp header */</span><br><span>@@ -1343,7 +1375,8 @@</span><br><span>                 }</span><br><span>            break;</span><br><span>       default:</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGL1S(DL1P, LOGL_ERROR, l1t, tn, chan, fn, "TCH mode %u invalid, please fix!\n",</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGL1S(DL1P, LOGL_ERROR, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                     "TCH mode %u invalid, please fix!\n",</span><br><span>                      tch_mode);</span><br><span>           return -EINVAL;</span><br><span>      }</span><br><span>@@ -1351,18 +1384,22 @@</span><br><span>  memcpy(*bursts_p + 232, *bursts_p + 464, 232);</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, 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, toa256);</span><br><span style="color: hsl(120, 100%, 40%);">+        l1if_process_meas_res(l1t->trx, bi->tn,</span><br><span style="color: hsl(120, 100%, 40%);">+         *first_fn /* FIXME: this is wrong */,</span><br><span style="color: hsl(120, 100%, 40%);">+         trx_chan_desc[chan].chan_nr | bi->tn,</span><br><span style="color: hsl(120, 100%, 40%);">+              n_errors, n_bits_total, bi->rssi, bi->toa256);</span><br><span> </span><br><span>     /* Check if the frame is bad */</span><br><span>      if (rc < 0) {</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%);">-                   fn % l1ts->mf_period, l1ts->mf_period);</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGL1S(DL1P, LOGL_NOTICE, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "Received bad data (%u/%u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                      bi->fn % l1ts->mf_period, l1ts->mf_period);</span><br><span>                 goto bfi;</span><br><span>    }</span><br><span>    if (rc < 4) {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGL1S(DL1P, LOGL_NOTICE, l1t, tn, chan, fn, "Received bad data (%u/%u) "</span><br><span style="color: hsl(0, 100%, 40%);">-                     "with invalid codec mode %d\n", fn % l1ts->mf_period, l1ts->mf_period, rc);</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGL1S(DL1P, LOGL_NOTICE, l1t, bi->tn, chan, bi->fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "Received bad data (%u/%u) with invalid codec mode %d\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                   bi->fn % l1ts->mf_period, l1ts->mf_period, rc);</span><br><span>             goto bfi;</span><br><span>    }</span><br><span> </span><br><span>@@ -1370,10 +1407,14 @@</span><br><span>      if (rc == GSM_MACBLOCK_LEN) {</span><br><span>                chan_state->ul_ongoing_facch = 1;</span><br><span>                 uint16_t ber10k = compute_ber10k(n_bits_total, n_errors);</span><br><span style="color: hsl(0, 100%, 40%);">-               _sched_compose_ph_data_ind(l1t, tn,</span><br><span style="color: hsl(0, 100%, 40%);">-                     (fn + GSM_HYPERFRAME - 10 - ((fn % 26) >= 19)) % GSM_HYPERFRAME, chan,</span><br><span style="color: hsl(0, 100%, 40%);">-                       tch_data + amr, GSM_MACBLOCK_LEN, rssi, toa256, 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                                         ber10k, PRES_INFO_UNKNOWN);</span><br><span style="color: hsl(120, 100%, 40%);">+                _sched_compose_ph_data_ind(l1t, bi->tn,</span><br><span style="color: hsl(120, 100%, 40%);">+                    /* FIXME: what the hell is this?!? */</span><br><span style="color: hsl(120, 100%, 40%);">+                 (bi->fn + GSM_HYPERFRAME - 10 - ((bi->fn % 26) >= 19)) % GSM_HYPERFRAME, chan,</span><br><span style="color: hsl(120, 100%, 40%);">+                       tch_data + amr, GSM_MACBLOCK_LEN,</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* FIXME: AVG both RSSI and ToA */</span><br><span style="color: hsl(120, 100%, 40%);">+                    bi->rssi, bi->toa256,</span><br><span style="color: hsl(120, 100%, 40%);">+                   0 /* FIXME: AVG C/I */,</span><br><span style="color: hsl(120, 100%, 40%);">+                       ber10k, PRES_INFO_UNKNOWN);</span><br><span> bfi:</span><br><span>          if (rsl_cmode == RSL_CMOD_SPD_SPEECH) {</span><br><span>                      /* indicate bad frame */</span><br><span>@@ -1398,7 +1439,7 @@</span><br><span>                             memset(tch_data + 2, 0, rc - 2);</span><br><span>                             break;</span><br><span>                       default:</span><br><span style="color: hsl(0, 100%, 40%);">-                                LOGL1S(DL1P, LOGL_ERROR, l1t, tn, chan, fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                           LOGL1S(DL1P, LOGL_ERROR, l1t, bi->tn, chan, bi->fn,</span><br><span>                                    "TCH mode %u invalid, please fix!\n", tch_mode);</span><br><span>                           return -EINVAL;</span><br><span>                      }</span><br><span>@@ -1415,8 +1456,9 @@</span><br><span>     * with the slot 12, so an extra FN must be subtracted to get correct</span><br><span>         * start of frame.</span><br><span>    */</span><br><span style="color: hsl(0, 100%, 40%);">-     return _sched_compose_tch_ind(l1t, tn,</span><br><span style="color: hsl(0, 100%, 40%);">-          (fn + GSM_HYPERFRAME - 10 - ((fn%26)==19) - ((fn%26)==20)) % GSM_HYPERFRAME,</span><br><span style="color: hsl(120, 100%, 40%);">+  return _sched_compose_tch_ind(l1t, bi->tn,</span><br><span style="color: hsl(120, 100%, 40%);">+         /* FIXME: what the hell is this?!? */</span><br><span style="color: hsl(120, 100%, 40%);">+         (bi->fn + GSM_HYPERFRAME - 10 - ((bi->fn%26)==19) - ((bi->fn%26)==20)) % GSM_HYPERFRAME,</span><br><span>            chan, tch_data, rc);</span><br><span> }</span><br><span> </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 25f6583..259a573 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>@@ -479,38 +479,33 @@</span><br><span>  * directly into the L1SAP, bypassing the TDMA multiplex logic oriented</span><br><span>  * towards receiving bursts */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int rx_rach_fn(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 bid, sbit_t *bits, uint16_t nbits,</span><br><span style="color: hsl(0, 100%, 40%);">-     int8_t rssi, int16_t toa256)</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_rach_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(120, 100%, 40%);">+               uint8_t bid, const struct trx_ul_burst_ind *bi)</span><br><span> {</span><br><span>  return 0;</span><br><span> }</span><br><span> </span><br><span> /*! \brief a single burst was received by the PHY, process it */</span><br><span style="color: hsl(0, 100%, 40%);">-int rx_data_fn(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 bid, sbit_t *bits, uint16_t nbits,</span><br><span style="color: hsl(0, 100%, 40%);">-     int8_t rssi, int16_t toa256)</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_data_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(120, 100%, 40%);">+               uint8_t bid, const struct trx_ul_burst_ind *bi)</span><br><span> {</span><br><span>  return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int rx_pdtch_fn(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 bid, sbit_t *bits, uint16_t nbits,</span><br><span style="color: hsl(0, 100%, 40%);">-     int8_t rssi, int16_t toa256)</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_pdtch_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(120, 100%, 40%);">+               uint8_t bid, const struct trx_ul_burst_ind *bi)</span><br><span> {</span><br><span>         return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int rx_tchf_fn(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 bid, sbit_t *bits, uint16_t nbits,</span><br><span style="color: hsl(0, 100%, 40%);">-     int8_t rssi, int16_t toa256)</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_tchf_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(120, 100%, 40%);">+               uint8_t bid, const struct trx_ul_burst_ind *bi)</span><br><span> {</span><br><span>  return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int rx_tchh_fn(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 bid, sbit_t *bits, uint16_t nbits,</span><br><span style="color: hsl(0, 100%, 40%);">-     int8_t rssi, int16_t toa256)</span><br><span style="color: hsl(120, 100%, 40%);">+int rx_tchh_fn(struct l1sched_trx *l1t, enum trx_chan_type chan,</span><br><span style="color: hsl(120, 100%, 40%);">+               uint8_t bid, const struct trx_ul_burst_ind *bi)</span><br><span> {</span><br><span>  return 0;</span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/14612">change 14612</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/+/14612"/><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: Iae6b78bafa4b86d0c681684de47320d641d3f7c0 </div>
<div style="display:none"> Gerrit-Change-Number: 14612 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>