<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmocom-bb/+/24661">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">trxcon/scheduler: introduce and use struct sched_burst_req<br><br>Similar to what we do in osmo-bts-trx, group everything related to<br>a to be transmitted burst into a structure.  Pass a pointer to this<br>structure to the logical channel handlers.  Thus makes the code<br>easier to read, and facilitates sending NOPE indications to the<br>transceiver (will be introduced in the upcoming patch).<br><br>Get rid of sched_trx_handle_tx_burst(), and instead just call<br>sched_trx_a5_burst_enc() directly from sched_frame_clck_cb().<br><br>Change-Id: Id45b27180c233fdc42ae1ef0b195554dd299a056<br>Related: SYS#5313, OS#1569<br>---<br>M src/host/trxcon/sched_lchan_desc.c<br>M src/host/trxcon/sched_lchan_pdtch.c<br>M src/host/trxcon/sched_lchan_rach.c<br>M src/host/trxcon/sched_lchan_tchf.c<br>M src/host/trxcon/sched_lchan_tchh.c<br>M src/host/trxcon/sched_lchan_xcch.c<br>M src/host/trxcon/sched_trx.c<br>M src/host/trxcon/sched_trx.h<br>M src/host/trxcon/trx_if.c<br>M src/host/trxcon/trx_if.h<br>10 files changed, 146 insertions(+), 162 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/61/24661/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/host/trxcon/sched_lchan_desc.c b/src/host/trxcon/sched_lchan_desc.c</span><br><span>index 2c3c3b2..b6a72b3 100644</span><br><span>--- a/src/host/trxcon/sched_lchan_desc.c</span><br><span>+++ b/src/host/trxcon/sched_lchan_desc.c</span><br><span>@@ -34,35 +34,40 @@</span><br><span>        const sbit_t *bits, const struct trx_meas_set *meas);</span><br><span> </span><br><span> int tx_data_fn(struct trx_instance *trx, struct trx_ts *ts,</span><br><span style="color: hsl(0, 100%, 40%);">-        struct trx_lchan_state *lchan, uint32_t fn, uint8_t bid);</span><br><span style="color: hsl(120, 100%, 40%);">+            struct trx_lchan_state *lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+        struct sched_burst_req *br);</span><br><span> </span><br><span> int rx_sch_fn(struct trx_instance *trx, struct trx_ts *ts,</span><br><span>        struct trx_lchan_state *lchan, uint32_t fn, uint8_t bid,</span><br><span>     const sbit_t *bits, const struct trx_meas_set *meas);</span><br><span> </span><br><span> int tx_rach_fn(struct trx_instance *trx, struct trx_ts *ts,</span><br><span style="color: hsl(0, 100%, 40%);">-        struct trx_lchan_state *lchan, uint32_t fn, uint8_t bid);</span><br><span style="color: hsl(120, 100%, 40%);">+            struct trx_lchan_state *lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+        struct sched_burst_req *br);</span><br><span> </span><br><span> int rx_tchf_fn(struct trx_instance *trx, struct trx_ts *ts,</span><br><span>       struct trx_lchan_state *lchan, uint32_t fn, uint8_t bid,</span><br><span>     const sbit_t *bits, const struct trx_meas_set *meas);</span><br><span> </span><br><span> int tx_tchf_fn(struct trx_instance *trx, struct trx_ts *ts,</span><br><span style="color: hsl(0, 100%, 40%);">-        struct trx_lchan_state *lchan, uint32_t fn, uint8_t bid);</span><br><span style="color: hsl(120, 100%, 40%);">+            struct trx_lchan_state *lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+        struct sched_burst_req *br);</span><br><span> </span><br><span> int rx_tchh_fn(struct trx_instance *trx, struct trx_ts *ts,</span><br><span>       struct trx_lchan_state *lchan, uint32_t fn, uint8_t bid,</span><br><span>     const sbit_t *bits, const struct trx_meas_set *meas);</span><br><span> </span><br><span> int tx_tchh_fn(struct trx_instance *trx, struct trx_ts *ts,</span><br><span style="color: hsl(0, 100%, 40%);">-        struct trx_lchan_state *lchan, uint32_t fn, uint8_t bid);</span><br><span style="color: hsl(120, 100%, 40%);">+            struct trx_lchan_state *lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+        struct sched_burst_req *br);</span><br><span> </span><br><span> int rx_pdtch_fn(struct trx_instance *trx, struct trx_ts *ts,</span><br><span>      struct trx_lchan_state *lchan, uint32_t fn, uint8_t bid,</span><br><span>     const sbit_t *bits, const struct trx_meas_set *meas);</span><br><span> </span><br><span> int tx_pdtch_fn(struct trx_instance *trx, struct trx_ts *ts,</span><br><span style="color: hsl(0, 100%, 40%);">-       struct trx_lchan_state *lchan, uint32_t fn, uint8_t bid);</span><br><span style="color: hsl(120, 100%, 40%);">+             struct trx_lchan_state *lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+                struct sched_burst_req *br);</span><br><span> </span><br><span> const struct trx_lchan_desc trx_lchan_desc[_TRX_CHAN_MAX] = {</span><br><span>    [TRXC_IDLE] = {</span><br><span>diff --git a/src/host/trxcon/sched_lchan_pdtch.c b/src/host/trxcon/sched_lchan_pdtch.c</span><br><span>index 6a68489..abbd480 100644</span><br><span>--- a/src/host/trxcon/sched_lchan_pdtch.c</span><br><span>+++ b/src/host/trxcon/sched_lchan_pdtch.c</span><br><span>@@ -2,7 +2,8 @@</span><br><span>  * OsmocomBB <-> SDR connection bridge</span><br><span>  * TDMA scheduler: handlers for DL / UL bursts on logical channels</span><br><span>  *</span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2018-2020 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2018-2021 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ * Contributions by sysmocom - s.f.m.c. GmbH</span><br><span>  *</span><br><span>  * All Rights Reserved</span><br><span>  *</span><br><span>@@ -117,10 +118,10 @@</span><br><span> </span><br><span> </span><br><span> int tx_pdtch_fn(struct trx_instance *trx, struct trx_ts *ts,</span><br><span style="color: hsl(0, 100%, 40%);">-    struct trx_lchan_state *lchan, uint32_t fn, uint8_t bid)</span><br><span style="color: hsl(120, 100%, 40%);">+              struct trx_lchan_state *lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+                struct sched_burst_req *br)</span><br><span> {</span><br><span>     const struct trx_lchan_desc *lchan_desc;</span><br><span style="color: hsl(0, 100%, 40%);">-        ubit_t burst[GSM_BURST_LEN];</span><br><span>         ubit_t *buffer, *offset;</span><br><span>     const uint8_t *tsc;</span><br><span>  uint8_t *mask;</span><br><span>@@ -131,7 +132,7 @@</span><br><span>         mask = &lchan->tx_burst_mask;</span><br><span>         buffer = lchan->tx_bursts;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       if (bid > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+     if (br->bid > 0) {</span><br><span>             /* If we have encoded bursts */</span><br><span>              if (*mask)</span><br><span>                   goto send_burst;</span><br><span>@@ -155,40 +156,29 @@</span><br><span> </span><br><span> send_burst:</span><br><span>  /* Determine which burst should be sent */</span><br><span style="color: hsl(0, 100%, 40%);">-      offset = buffer + bid * 116;</span><br><span style="color: hsl(120, 100%, 40%);">+  offset = buffer + br->bid * 116;</span><br><span> </span><br><span>      /* Update mask */</span><br><span style="color: hsl(0, 100%, 40%);">-       *mask |= (1 << bid);</span><br><span style="color: hsl(120, 100%, 40%);">+    *mask |= (1 << br->bid);</span><br><span> </span><br><span>        /* Choose proper TSC */</span><br><span>      tsc = sched_nb_training_bits[trx->tsc];</span><br><span> </span><br><span>       /* Compose a new burst */</span><br><span style="color: hsl(0, 100%, 40%);">-       memset(burst, 0, 3); /* TB */</span><br><span style="color: hsl(0, 100%, 40%);">-   memcpy(burst + 3, offset, 58); /* Payload 1/2 */</span><br><span style="color: hsl(0, 100%, 40%);">-        memcpy(burst + 61, tsc, 26); /* TSC */</span><br><span style="color: hsl(0, 100%, 40%);">-  memcpy(burst + 87, offset + 58, 58); /* Payload 2/2 */</span><br><span style="color: hsl(0, 100%, 40%);">-  memset(burst + 145, 0, 3); /* TB */</span><br><span style="color: hsl(120, 100%, 40%);">+   memset(br->burst, 0, 3); /* TB */</span><br><span style="color: hsl(120, 100%, 40%);">+  memcpy(br->burst + 3, offset, 58); /* Payload 1/2 */</span><br><span style="color: hsl(120, 100%, 40%);">+       memcpy(br->burst + 61, tsc, 26); /* TSC */</span><br><span style="color: hsl(120, 100%, 40%);">+ memcpy(br->burst + 87, offset + 58, 58); /* Payload 2/2 */</span><br><span style="color: hsl(120, 100%, 40%);">+ memset(br->burst + 145, 0, 3); /* TB */</span><br><span style="color: hsl(120, 100%, 40%);">+    br->burst_len = GSM_BURST_LEN;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   LOGP(DSCHD, LOGL_DEBUG, "Transmitting %s fn=%u ts=%u burst=%u\n",</span><br><span style="color: hsl(0, 100%, 40%);">-             lchan_desc->name, fn, ts->index, bid);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* Forward burst to scheduler */</span><br><span style="color: hsl(0, 100%, 40%);">-        rc = sched_trx_handle_tx_burst(trx, ts, lchan, fn, burst);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (rc) {</span><br><span style="color: hsl(0, 100%, 40%);">-               /* Forget this primitive */</span><br><span style="color: hsl(0, 100%, 40%);">-             sched_prim_drop(lchan);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         /* Reset mask */</span><br><span style="color: hsl(0, 100%, 40%);">-                *mask = 0x00;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(120, 100%, 40%);">+     LOGP(DSCHD, LOGL_DEBUG, "Scheduled %s fn=%u ts=%u burst=%u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+              lchan_desc->name, br->fn, ts->index, br->bid);</span><br><span> </span><br><span>       /* If we have sent the last (4/4) burst */</span><br><span>   if ((*mask & 0x0f) == 0x0f) {</span><br><span>            /* Confirm data / traffic sending */</span><br><span style="color: hsl(0, 100%, 40%);">-            sched_send_dt_conf(trx, ts, lchan, fn, true);</span><br><span style="color: hsl(120, 100%, 40%);">+         sched_send_dt_conf(trx, ts, lchan, br->fn, true);</span><br><span> </span><br><span>             /* Forget processed primitive */</span><br><span>             sched_prim_drop(lchan);</span><br><span>diff --git a/src/host/trxcon/sched_lchan_rach.c b/src/host/trxcon/sched_lchan_rach.c</span><br><span>index fe5821b..25e1b44 100644</span><br><span>--- a/src/host/trxcon/sched_lchan_rach.c</span><br><span>+++ b/src/host/trxcon/sched_lchan_rach.c</span><br><span>@@ -2,7 +2,8 @@</span><br><span>  * OsmocomBB <-> SDR connection bridge</span><br><span>  * TDMA scheduler: handlers for DL / UL bursts on logical channels</span><br><span>  *</span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2017-2019 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2017-2021 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ * Contributions by sysmocom - s.f.m.c. GmbH</span><br><span>  *</span><br><span>  * All Rights Reserved</span><br><span>  *</span><br><span>@@ -77,13 +78,13 @@</span><br><span> </span><br><span> /* Obtain a to-be-transmitted RACH burst */</span><br><span> int tx_rach_fn(struct trx_instance *trx, struct trx_ts *ts,</span><br><span style="color: hsl(0, 100%, 40%);">-        struct trx_lchan_state *lchan, uint32_t fn, uint8_t bid)</span><br><span style="color: hsl(120, 100%, 40%);">+             struct trx_lchan_state *lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+        struct sched_burst_req *br)</span><br><span> {</span><br><span>      struct l1ctl_ext_rach_req *ext_req = NULL;</span><br><span>   struct l1ctl_rach_req *req = NULL;</span><br><span>   enum rach_synch_seq_t synch_seq;</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t burst[GSM_BURST_LEN];</span><br><span style="color: hsl(0, 100%, 40%);">-   uint8_t *burst_ptr = burst;</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t *burst_ptr = br->burst;</span><br><span>   uint8_t payload[36];</span><br><span>         int i, rc;</span><br><span> </span><br><span>@@ -155,27 +156,19 @@</span><br><span>       burst_ptr += RACH_PAYLOAD_LEN;</span><br><span> </span><br><span>   /* BN85-156: tail bits & extended guard period */</span><br><span style="color: hsl(0, 100%, 40%);">-   memset(burst_ptr, 0, burst + GSM_BURST_LEN - burst_ptr);</span><br><span style="color: hsl(120, 100%, 40%);">+      memset(burst_ptr, 0, br->burst + GSM_BURST_LEN - burst_ptr);</span><br><span style="color: hsl(120, 100%, 40%);">+       br->burst_len = GSM_BURST_LEN;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   LOGP(DSCHD, LOGL_NOTICE, "Transmitting %s RACH (%s) on fn=%u, tn=%u, lchan=%s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+   LOGP(DSCHD, LOGL_NOTICE, "Scheduled %s RACH (%s) on fn=%u, tn=%u, lchan=%s\n",</span><br><span>             PRIM_IS_RACH11(lchan->prim) ? "extended (11-bit)" : "regular (8-bit)",</span><br><span style="color: hsl(0, 100%, 40%);">-           get_value_string(rach_synch_seq_names, synch_seq), fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                get_value_string(rach_synch_seq_names, synch_seq), br->fn,</span><br><span>                ts->index, trx_lchan_desc[lchan->type].name);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Forward burst to scheduler */</span><br><span style="color: hsl(0, 100%, 40%);">-        rc = sched_trx_handle_tx_burst(trx, ts, lchan, fn, burst);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (rc) {</span><br><span style="color: hsl(0, 100%, 40%);">-               /* Forget this primitive */</span><br><span style="color: hsl(0, 100%, 40%);">-             sched_prim_drop(lchan);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>    /* Confirm RACH request */</span><br><span style="color: hsl(0, 100%, 40%);">-      l1ctl_tx_rach_conf(trx->l1l, trx->band_arfcn, fn);</span><br><span style="color: hsl(120, 100%, 40%);">+      l1ctl_tx_rach_conf(trx->l1l, trx->band_arfcn, br->fn);</span><br><span> </span><br><span>  /* Optional GSMTAP logging */</span><br><span style="color: hsl(0, 100%, 40%);">-   sched_gsmtap_send(lchan->type, fn, ts->index,</span><br><span style="color: hsl(120, 100%, 40%);">+   sched_gsmtap_send(lchan->type, br->fn, ts->index,</span><br><span>                     trx->band_arfcn | ARFCN_UPLINK, 0, 0,</span><br><span>                     PRIM_IS_RACH11(lchan->prim) ? (uint8_t *) &ext_req->ra11 : &req->ra,</span><br><span>                        PRIM_IS_RACH11(lchan->prim) ? 2 : 1);</span><br><span>diff --git a/src/host/trxcon/sched_lchan_tchf.c b/src/host/trxcon/sched_lchan_tchf.c</span><br><span>index c5362f0..1e38e96 100644</span><br><span>--- a/src/host/trxcon/sched_lchan_tchf.c</span><br><span>+++ b/src/host/trxcon/sched_lchan_tchf.c</span><br><span>@@ -2,7 +2,8 @@</span><br><span>  * OsmocomBB <-> SDR connection bridge</span><br><span>  * TDMA scheduler: handlers for DL / UL bursts on logical channels</span><br><span>  *</span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2017-2020 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2017-2021 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ * Contributions by sysmocom - s.f.m.c. GmbH</span><br><span>  *</span><br><span>  * All Rights Reserved</span><br><span>  *</span><br><span>@@ -173,10 +174,10 @@</span><br><span> }</span><br><span> </span><br><span> int tx_tchf_fn(struct trx_instance *trx, struct trx_ts *ts,</span><br><span style="color: hsl(0, 100%, 40%);">-     struct trx_lchan_state *lchan, uint32_t fn, uint8_t bid)</span><br><span style="color: hsl(120, 100%, 40%);">+             struct trx_lchan_state *lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+        struct sched_burst_req *br)</span><br><span> {</span><br><span>      const struct trx_lchan_desc *lchan_desc;</span><br><span style="color: hsl(0, 100%, 40%);">-        ubit_t burst[GSM_BURST_LEN];</span><br><span>         ubit_t *buffer, *offset;</span><br><span>     const uint8_t *tsc;</span><br><span>  uint8_t *mask;</span><br><span>@@ -193,7 +194,7 @@</span><br><span>                 goto send_burst;</span><br><span> </span><br><span>         /* Wait until a first burst in period */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (bid > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+       if (br->bid > 0)</span><br><span>               return 0;</span><br><span> </span><br><span>        /* Check the current TCH mode */</span><br><span>@@ -257,40 +258,29 @@</span><br><span> </span><br><span> send_burst:</span><br><span>  /* Determine which burst should be sent */</span><br><span style="color: hsl(0, 100%, 40%);">-      offset = buffer + bid * 116;</span><br><span style="color: hsl(120, 100%, 40%);">+  offset = buffer + br->bid * 116;</span><br><span> </span><br><span>      /* Update mask */</span><br><span style="color: hsl(0, 100%, 40%);">-       *mask |= (1 << bid);</span><br><span style="color: hsl(120, 100%, 40%);">+    *mask |= (1 << br->bid);</span><br><span> </span><br><span>        /* Choose proper TSC */</span><br><span>      tsc = sched_nb_training_bits[trx->tsc];</span><br><span> </span><br><span>       /* Compose a new burst */</span><br><span style="color: hsl(0, 100%, 40%);">-       memset(burst, 0, 3); /* TB */</span><br><span style="color: hsl(0, 100%, 40%);">-   memcpy(burst + 3, offset, 58); /* Payload 1/2 */</span><br><span style="color: hsl(0, 100%, 40%);">-        memcpy(burst + 61, tsc, 26); /* TSC */</span><br><span style="color: hsl(0, 100%, 40%);">-  memcpy(burst + 87, offset + 58, 58); /* Payload 2/2 */</span><br><span style="color: hsl(0, 100%, 40%);">-  memset(burst + 145, 0, 3); /* TB */</span><br><span style="color: hsl(120, 100%, 40%);">+   memset(br->burst, 0, 3); /* TB */</span><br><span style="color: hsl(120, 100%, 40%);">+  memcpy(br->burst + 3, offset, 58); /* Payload 1/2 */</span><br><span style="color: hsl(120, 100%, 40%);">+       memcpy(br->burst + 61, tsc, 26); /* TSC */</span><br><span style="color: hsl(120, 100%, 40%);">+ memcpy(br->burst + 87, offset + 58, 58); /* Payload 2/2 */</span><br><span style="color: hsl(120, 100%, 40%);">+ memset(br->burst + 145, 0, 3); /* TB */</span><br><span style="color: hsl(120, 100%, 40%);">+    br->burst_len = GSM_BURST_LEN;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   LOGP(DSCHD, LOGL_DEBUG, "Transmitting %s fn=%u ts=%u burst=%u\n",</span><br><span style="color: hsl(0, 100%, 40%);">-             lchan_desc->name, fn, ts->index, bid);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* Forward burst to scheduler */</span><br><span style="color: hsl(0, 100%, 40%);">-        rc = sched_trx_handle_tx_burst(trx, ts, lchan, fn, burst);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (rc) {</span><br><span style="color: hsl(0, 100%, 40%);">-               /* Forget this primitive */</span><br><span style="color: hsl(0, 100%, 40%);">-             sched_prim_drop(lchan);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         /* Reset mask */</span><br><span style="color: hsl(0, 100%, 40%);">-                *mask = 0x00;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(120, 100%, 40%);">+     LOGP(DSCHD, LOGL_DEBUG, "Scheduled %s fn=%u ts=%u burst=%u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+              lchan_desc->name, br->fn, ts->index, br->bid);</span><br><span> </span><br><span>       /* If we have sent the last (4/4) burst */</span><br><span>   if (*mask == 0x0f) {</span><br><span>                 /* Confirm data / traffic sending */</span><br><span style="color: hsl(0, 100%, 40%);">-            sched_send_dt_conf(trx, ts, lchan, fn, PRIM_IS_TCH(lchan->prim));</span><br><span style="color: hsl(120, 100%, 40%);">+          sched_send_dt_conf(trx, ts, lchan, br->fn, PRIM_IS_TCH(lchan->prim));</span><br><span> </span><br><span>              /* Forget processed primitive */</span><br><span>             sched_prim_drop(lchan);</span><br><span>diff --git a/src/host/trxcon/sched_lchan_tchh.c b/src/host/trxcon/sched_lchan_tchh.c</span><br><span>index b6f0708..6a5c471 100644</span><br><span>--- a/src/host/trxcon/sched_lchan_tchh.c</span><br><span>+++ b/src/host/trxcon/sched_lchan_tchh.c</span><br><span>@@ -2,8 +2,9 @@</span><br><span>  * OsmocomBB <-> SDR connection bridge</span><br><span>  * TDMA scheduler: handlers for DL / UL bursts on logical channels</span><br><span>  *</span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2018-2020 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2018-2021 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span>  * (C) 2018 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * Contributions by sysmocom - s.f.m.c. GmbH</span><br><span>  *</span><br><span>  * All Rights Reserved</span><br><span>  *</span><br><span>@@ -361,10 +362,10 @@</span><br><span> }</span><br><span> </span><br><span> int tx_tchh_fn(struct trx_instance *trx, struct trx_ts *ts,</span><br><span style="color: hsl(0, 100%, 40%);">-    struct trx_lchan_state *lchan, uint32_t fn, uint8_t bid)</span><br><span style="color: hsl(120, 100%, 40%);">+             struct trx_lchan_state *lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+        struct sched_burst_req *br)</span><br><span> {</span><br><span>      const struct trx_lchan_desc *lchan_desc;</span><br><span style="color: hsl(0, 100%, 40%);">-        ubit_t burst[GSM_BURST_LEN];</span><br><span>         ubit_t *buffer, *offset;</span><br><span>     const uint8_t *tsc;</span><br><span>  uint8_t *mask;</span><br><span>@@ -376,7 +377,7 @@</span><br><span>         mask = &lchan->tx_burst_mask;</span><br><span>         buffer = lchan->tx_bursts;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       if (bid > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+     if (br->bid > 0) {</span><br><span>             /* Align to the first burst */</span><br><span>               if (*mask == 0x00)</span><br><span>                   return 0;</span><br><span>@@ -386,7 +387,7 @@</span><br><span>      if (*mask == 0x00) {</span><br><span>                 /* Align transmission of the first FACCH/H frame */</span><br><span>          if (lchan->tch_mode == GSM48_CMODE_SIGN)</span><br><span style="color: hsl(0, 100%, 40%);">-                     if (!sched_tchh_facch_start(lchan->type, fn, 1))</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (!sched_tchh_facch_start(lchan->type, br->fn, 1))</span><br><span>                           return 0;</span><br><span>    }</span><br><span> </span><br><span>@@ -459,26 +460,24 @@</span><br><span> </span><br><span> send_burst:</span><br><span>     /* Determine which burst should be sent */</span><br><span style="color: hsl(0, 100%, 40%);">-      offset = buffer + bid * 116;</span><br><span style="color: hsl(120, 100%, 40%);">+  offset = buffer + br->bid * 116;</span><br><span> </span><br><span>      /* Update mask */</span><br><span style="color: hsl(0, 100%, 40%);">-       *mask |= (1 << bid);</span><br><span style="color: hsl(120, 100%, 40%);">+    *mask |= (1 << br->bid);</span><br><span> </span><br><span>        /* Choose proper TSC */</span><br><span>      tsc = sched_nb_training_bits[trx->tsc];</span><br><span> </span><br><span>       /* Compose a new burst */</span><br><span style="color: hsl(0, 100%, 40%);">-       memset(burst, 0, 3); /* TB */</span><br><span style="color: hsl(0, 100%, 40%);">-   memcpy(burst + 3, offset, 58); /* Payload 1/2 */</span><br><span style="color: hsl(0, 100%, 40%);">-        memcpy(burst + 61, tsc, 26); /* TSC */</span><br><span style="color: hsl(0, 100%, 40%);">-  memcpy(burst + 87, offset + 58, 58); /* Payload 2/2 */</span><br><span style="color: hsl(0, 100%, 40%);">-  memset(burst + 145, 0, 3); /* TB */</span><br><span style="color: hsl(120, 100%, 40%);">+   memset(br->burst, 0, 3); /* TB */</span><br><span style="color: hsl(120, 100%, 40%);">+  memcpy(br->burst + 3, offset, 58); /* Payload 1/2 */</span><br><span style="color: hsl(120, 100%, 40%);">+       memcpy(br->burst + 61, tsc, 26); /* TSC */</span><br><span style="color: hsl(120, 100%, 40%);">+ memcpy(br->burst + 87, offset + 58, 58); /* Payload 2/2 */</span><br><span style="color: hsl(120, 100%, 40%);">+ memset(br->burst + 145, 0, 3); /* TB */</span><br><span style="color: hsl(120, 100%, 40%);">+    br->burst_len = GSM_BURST_LEN;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   LOGP(DSCHD, LOGL_DEBUG, "Transmitting %s fn=%u ts=%u burst=%u\n",</span><br><span style="color: hsl(0, 100%, 40%);">-             lchan_desc->name, fn, ts->index, bid);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* Forward burst to transceiver */</span><br><span style="color: hsl(0, 100%, 40%);">-      sched_trx_handle_tx_burst(trx, ts, lchan, fn, burst);</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DSCHD, LOGL_DEBUG, "Scheduled %s fn=%u ts=%u burst=%u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+              lchan_desc->name, br->fn, ts->index, br->bid);</span><br><span> </span><br><span>       /* In case of a FACCH/H frame, one block less */</span><br><span>     if (lchan->ul_facch_blocks)</span><br><span>@@ -490,7 +489,7 @@</span><br><span>                  * confirm data / traffic sending</span><br><span>             */</span><br><span>          if (!lchan->ul_facch_blocks)</span><br><span style="color: hsl(0, 100%, 40%);">-                 sched_send_dt_conf(trx, ts, lchan, fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                        sched_send_dt_conf(trx, ts, lchan, br->fn,</span><br><span>                                PRIM_IS_TCH(lchan->prim));</span><br><span> </span><br><span>            /* Forget processed primitive */</span><br><span>diff --git a/src/host/trxcon/sched_lchan_xcch.c b/src/host/trxcon/sched_lchan_xcch.c</span><br><span>index a0b61ad..41677ec 100644</span><br><span>--- a/src/host/trxcon/sched_lchan_xcch.c</span><br><span>+++ b/src/host/trxcon/sched_lchan_xcch.c</span><br><span>@@ -2,7 +2,8 @@</span><br><span>  * OsmocomBB <-> SDR connection bridge</span><br><span>  * TDMA scheduler: handlers for DL / UL bursts on logical channels</span><br><span>  *</span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2017-2020 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2017-2021 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ * Contributions by sysmocom - s.f.m.c. GmbH</span><br><span>  *</span><br><span>  * All Rights Reserved</span><br><span>  *</span><br><span>@@ -119,10 +120,10 @@</span><br><span> }</span><br><span> </span><br><span> int tx_data_fn(struct trx_instance *trx, struct trx_ts *ts,</span><br><span style="color: hsl(0, 100%, 40%);">-       struct trx_lchan_state *lchan, uint32_t fn, uint8_t bid)</span><br><span style="color: hsl(120, 100%, 40%);">+             struct trx_lchan_state *lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+        struct sched_burst_req *br)</span><br><span> {</span><br><span>      const struct trx_lchan_desc *lchan_desc;</span><br><span style="color: hsl(0, 100%, 40%);">-        ubit_t burst[GSM_BURST_LEN];</span><br><span>         ubit_t *buffer, *offset;</span><br><span>     const uint8_t *tsc;</span><br><span>  uint8_t *mask;</span><br><span>@@ -133,7 +134,7 @@</span><br><span>         mask = &lchan->tx_burst_mask;</span><br><span>         buffer = lchan->tx_bursts;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       if (bid > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+     if (br->bid > 0) {</span><br><span>             /* If we have encoded bursts */</span><br><span>              if (*mask)</span><br><span>                   goto send_burst;</span><br><span>@@ -165,40 +166,29 @@</span><br><span> </span><br><span> send_burst:</span><br><span>  /* Determine which burst should be sent */</span><br><span style="color: hsl(0, 100%, 40%);">-      offset = buffer + bid * 116;</span><br><span style="color: hsl(120, 100%, 40%);">+  offset = buffer + br->bid * 116;</span><br><span> </span><br><span>      /* Update mask */</span><br><span style="color: hsl(0, 100%, 40%);">-       *mask |= (1 << bid);</span><br><span style="color: hsl(120, 100%, 40%);">+    *mask |= (1 << br->bid);</span><br><span> </span><br><span>        /* Choose proper TSC */</span><br><span>      tsc = sched_nb_training_bits[trx->tsc];</span><br><span> </span><br><span>       /* Compose a new burst */</span><br><span style="color: hsl(0, 100%, 40%);">-       memset(burst, 0, 3); /* TB */</span><br><span style="color: hsl(0, 100%, 40%);">-   memcpy(burst + 3, offset, 58); /* Payload 1/2 */</span><br><span style="color: hsl(0, 100%, 40%);">-        memcpy(burst + 61, tsc, 26); /* TSC */</span><br><span style="color: hsl(0, 100%, 40%);">-  memcpy(burst + 87, offset + 58, 58); /* Payload 2/2 */</span><br><span style="color: hsl(0, 100%, 40%);">-  memset(burst + 145, 0, 3); /* TB */</span><br><span style="color: hsl(120, 100%, 40%);">+   memset(br->burst, 0, 3); /* TB */</span><br><span style="color: hsl(120, 100%, 40%);">+  memcpy(br->burst + 3, offset, 58); /* Payload 1/2 */</span><br><span style="color: hsl(120, 100%, 40%);">+       memcpy(br->burst + 61, tsc, 26); /* TSC */</span><br><span style="color: hsl(120, 100%, 40%);">+ memcpy(br->burst + 87, offset + 58, 58); /* Payload 2/2 */</span><br><span style="color: hsl(120, 100%, 40%);">+ memset(br->burst + 145, 0, 3); /* TB */</span><br><span style="color: hsl(120, 100%, 40%);">+    br->burst_len = GSM_BURST_LEN;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   LOGP(DSCHD, LOGL_DEBUG, "Transmitting %s fn=%u ts=%u burst=%u\n",</span><br><span style="color: hsl(0, 100%, 40%);">-             lchan_desc->name, fn, ts->index, bid);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* Forward burst to scheduler */</span><br><span style="color: hsl(0, 100%, 40%);">-        rc = sched_trx_handle_tx_burst(trx, ts, lchan, fn, burst);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (rc) {</span><br><span style="color: hsl(0, 100%, 40%);">-               /* Forget this primitive */</span><br><span style="color: hsl(0, 100%, 40%);">-             sched_prim_drop(lchan);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         /* Reset mask */</span><br><span style="color: hsl(0, 100%, 40%);">-                *mask = 0x00;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(120, 100%, 40%);">+     LOGP(DSCHD, LOGL_DEBUG, "Scheduled %s fn=%u ts=%u burst=%u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+              lchan_desc->name, br->fn, ts->index, br->bid);</span><br><span> </span><br><span>       /* If we have sent the last (4/4) burst */</span><br><span>   if ((*mask & 0x0f) == 0x0f) {</span><br><span>            /* Confirm data sending */</span><br><span style="color: hsl(0, 100%, 40%);">-              sched_send_dt_conf(trx, ts, lchan, fn, false);</span><br><span style="color: hsl(120, 100%, 40%);">+                sched_send_dt_conf(trx, ts, lchan, br->fn, false);</span><br><span> </span><br><span>            /* Forget processed primitive */</span><br><span>             sched_prim_drop(lchan);</span><br><span>diff --git a/src/host/trxcon/sched_trx.c b/src/host/trxcon/sched_trx.c</span><br><span>index 91310c0..c5e28a8 100644</span><br><span>--- a/src/host/trxcon/sched_trx.c</span><br><span>+++ b/src/host/trxcon/sched_trx.c</span><br><span>@@ -41,14 +41,18 @@</span><br><span> #include "trx_if.h"</span><br><span> #include "logging.h"</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void sched_trx_a5_burst_enc(struct trx_lchan_state *lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 struct sched_burst_req *br);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void sched_frame_clck_cb(struct trx_sched *sched)</span><br><span> {</span><br><span>   struct trx_instance *trx = (struct trx_instance *) sched->data;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct sched_burst_req br[TRX_TS_COUNT];</span><br><span>     const struct trx_frame *frame;</span><br><span>       struct trx_lchan_state *lchan;</span><br><span>       trx_lchan_tx_func *handler;</span><br><span>  enum trx_lchan_type chan;</span><br><span style="color: hsl(0, 100%, 40%);">-       uint8_t offset, bid;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t offset;</span><br><span>      struct trx_ts *ts;</span><br><span>   int i;</span><br><span> </span><br><span>@@ -59,6 +63,14 @@</span><br><span> </span><br><span>  /* Iterate over timeslot list */</span><br><span>     for (i = 0; i < TRX_TS_COUNT; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               /* Initialize the buffer for this timeslot */</span><br><span style="color: hsl(120, 100%, 40%);">+         br[i] = (struct sched_burst_req) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    .fn = fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                     .tn = i,</span><br><span style="color: hsl(120, 100%, 40%);">+                      .pwr = trx->tx_power,</span><br><span style="color: hsl(120, 100%, 40%);">+                      .burst_len = 0, /* NOPE.ind */</span><br><span style="color: hsl(120, 100%, 40%);">+                };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                 /* Timeslot is not allocated */</span><br><span>              ts = trx->ts_list[i];</span><br><span>             if (ts == NULL)</span><br><span>@@ -73,7 +85,7 @@</span><br><span>          frame = ts->mf_layout->frames + offset;</span><br><span> </span><br><span>            /* Get required info from frame */</span><br><span style="color: hsl(0, 100%, 40%);">-              bid = frame->ul_bid;</span><br><span style="color: hsl(120, 100%, 40%);">+               br[i].bid = frame->ul_bid;</span><br><span>                chan = frame->ul_chan;</span><br><span>            handler = trx_lchan_desc[chan].tx_fn;</span><br><span> </span><br><span>@@ -120,8 +132,16 @@</span><br><span>                     handler = trx_lchan_desc[TRXC_RACH].tx_fn;</span><br><span> </span><br><span>               /* Poke lchan handler */</span><br><span style="color: hsl(0, 100%, 40%);">-                handler(trx, ts, lchan, fn, bid);</span><br><span style="color: hsl(120, 100%, 40%);">+             handler(trx, ts, lchan, &br[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                /* Perform A5/X burst encryption if required */</span><br><span style="color: hsl(120, 100%, 40%);">+               if (lchan->a5.algo)</span><br><span style="color: hsl(120, 100%, 40%);">+                        sched_trx_a5_burst_enc(lchan, br);</span><br><span>   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Send all bursts for this TDMA frame */</span><br><span style="color: hsl(120, 100%, 40%);">+     for (i = 0; i < ARRAY_SIZE(br); i++)</span><br><span style="color: hsl(120, 100%, 40%);">+               trx_if_tx_burst(trx, &br[i]);</span><br><span> }</span><br><span> </span><br><span> int sched_trx_init(struct trx_instance *trx, uint32_t fn_advance)</span><br><span>@@ -602,18 +622,18 @@</span><br><span> }</span><br><span> </span><br><span> static void sched_trx_a5_burst_enc(struct trx_lchan_state *lchan,</span><br><span style="color: hsl(0, 100%, 40%);">-   uint32_t fn, ubit_t *burst)</span><br><span style="color: hsl(120, 100%, 40%);">+                              struct sched_burst_req *br)</span><br><span> {</span><br><span>  ubit_t ks[114];</span><br><span>      int i;</span><br><span> </span><br><span>   /* Generate keystream for an UL burst */</span><br><span style="color: hsl(0, 100%, 40%);">-        osmo_a5(lchan->a5.algo, lchan->a5.key, fn, NULL, ks);</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_a5(lchan->a5.algo, lchan->a5.key, br->fn, NULL, ks);</span><br><span> </span><br><span>       /* Apply keystream over plaintext */</span><br><span>         for (i = 0; i < 57; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-           burst[i + 3] ^= ks[i];</span><br><span style="color: hsl(0, 100%, 40%);">-          burst[i + 88] ^= ks[i + 57];</span><br><span style="color: hsl(120, 100%, 40%);">+          br->burst[i + 3] ^= ks[i];</span><br><span style="color: hsl(120, 100%, 40%);">+         br->burst[i + 88] ^= ks[i + 57];</span><br><span>  }</span><br><span> }</span><br><span> </span><br><span>@@ -764,26 +784,6 @@</span><br><span>    return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int sched_trx_handle_tx_burst(struct trx_instance *trx,</span><br><span style="color: hsl(0, 100%, 40%);">-       struct trx_ts *ts, struct trx_lchan_state *lchan,</span><br><span style="color: hsl(0, 100%, 40%);">-       uint32_t fn, ubit_t *bits)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Perform A5/X burst encryption if required */</span><br><span style="color: hsl(0, 100%, 40%);">- if (lchan->a5.algo)</span><br><span style="color: hsl(0, 100%, 40%);">-          sched_trx_a5_burst_enc(lchan, fn, bits);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Forward burst to transceiver */</span><br><span style="color: hsl(0, 100%, 40%);">-      rc = trx_if_tx_burst(trx, ts->index, fn, trx->tx_power, bits);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (rc) {</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGP(DSCHD, LOGL_ERROR, "Could not send burst to transceiver\n");</span><br><span style="color: hsl(0, 100%, 40%);">-             return rc;</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%);">-       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> #define MEAS_HIST_FIRST(hist) \</span><br><span>        (&hist->buf[0])</span><br><span> #define MEAS_HIST_LAST(hist) \</span><br><span>diff --git a/src/host/trxcon/sched_trx.h b/src/host/trxcon/sched_trx.h</span><br><span>index fb7ecd4..74b41e3 100644</span><br><span>--- a/src/host/trxcon/sched_trx.h</span><br><span>+++ b/src/host/trxcon/sched_trx.h</span><br><span>@@ -97,14 +97,27 @@</span><br><span>      _TRX_CHAN_MAX</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Represents a burst to be transmitted */</span><br><span style="color: hsl(120, 100%, 40%);">+struct sched_burst_req {</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t fn;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t tn;</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t pwr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Internally used by the scheduler */</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t bid;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        ubit_t burst[EDGE_BURST_LEN];</span><br><span style="color: hsl(120, 100%, 40%);">+ size_t burst_len;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> typedef int trx_lchan_rx_func(struct trx_instance *trx,</span><br><span>   struct trx_ts *ts, struct trx_lchan_state *lchan,</span><br><span>    uint32_t fn, uint8_t bid, const sbit_t *bits,</span><br><span>        const struct trx_meas_set *meas);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-typedef int trx_lchan_tx_func(struct trx_instance *trx,</span><br><span style="color: hsl(0, 100%, 40%);">-    struct trx_ts *ts, struct trx_lchan_state *lchan,</span><br><span style="color: hsl(0, 100%, 40%);">-       uint32_t fn, uint8_t bid);</span><br><span style="color: hsl(120, 100%, 40%);">+typedef int trx_lchan_tx_func(struct trx_instance *trx, struct trx_ts *ts,</span><br><span style="color: hsl(120, 100%, 40%);">+                              struct trx_lchan_state *lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+                        struct sched_burst_req *br);</span><br><span> </span><br><span> struct trx_lchan_desc {</span><br><span>    /*! \brief Human-readable name */</span><br><span>@@ -366,9 +379,6 @@</span><br><span> int sched_trx_handle_rx_burst(struct trx_instance *trx, uint8_t tn,</span><br><span>       uint32_t fn, sbit_t *bits, uint16_t nbits,</span><br><span>   const struct trx_meas_set *meas);</span><br><span style="color: hsl(0, 100%, 40%);">-int sched_trx_handle_tx_burst(struct trx_instance *trx,</span><br><span style="color: hsl(0, 100%, 40%);">-        struct trx_ts *ts, struct trx_lchan_state *lchan,</span><br><span style="color: hsl(0, 100%, 40%);">-       uint32_t fn, ubit_t *bits);</span><br><span> </span><br><span> /* Shared declarations for lchan handlers */</span><br><span> extern const uint8_t sched_nb_training_bits[8][26];</span><br><span>diff --git a/src/host/trxcon/trx_if.c b/src/host/trxcon/trx_if.c</span><br><span>index 716fd23..c4561ce 100644</span><br><span>--- a/src/host/trxcon/trx_if.c</span><br><span>+++ b/src/host/trxcon/trx_if.c</span><br><span>@@ -629,10 +629,14 @@</span><br><span>  return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int trx_if_tx_burst(struct trx_instance *trx, uint8_t tn, uint32_t fn,</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t pwr, const ubit_t *bits)</span><br><span style="color: hsl(120, 100%, 40%);">+int trx_if_tx_burst(struct trx_instance *trx,</span><br><span style="color: hsl(120, 100%, 40%);">+                   const struct sched_burst_req *br)</span><br><span> {</span><br><span>   uint8_t buf[TRXD_BUF_SIZE];</span><br><span style="color: hsl(120, 100%, 40%);">+   size_t length;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (br->burst_len == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            return 0;</span><br><span> </span><br><span>        /**</span><br><span>   * We must be sure that we have clock,</span><br><span>@@ -649,17 +653,20 @@</span><br><span>       }</span><br><span> #endif</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DTRXD, LOGL_DEBUG, "TX burst tn=%u fn=%u pwr=%u\n", tn, fn, pwr);</span><br><span style="color: hsl(120, 100%, 40%);">+      LOGP(DTRXD, LOGL_DEBUG, "TX burst tn=%u fn=%u pwr=%u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+         br->tn, br->fn, br->pwr);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     buf[0] = tn;</span><br><span style="color: hsl(0, 100%, 40%);">-    osmo_store32be(fn, buf + 1);</span><br><span style="color: hsl(0, 100%, 40%);">-    buf[5] = pwr;</span><br><span style="color: hsl(120, 100%, 40%);">+ buf[0] = br->tn;</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_store32be(br->fn, buf + 1);</span><br><span style="color: hsl(120, 100%, 40%);">+   buf[5] = br->pwr;</span><br><span style="color: hsl(120, 100%, 40%);">+  length = 6;</span><br><span> </span><br><span>      /* Copy ubits {0,1} */</span><br><span style="color: hsl(0, 100%, 40%);">-  memcpy(buf + 6, bits, 148);</span><br><span style="color: hsl(120, 100%, 40%);">+   memcpy(buf + 6, br->burst, br->burst_len);</span><br><span style="color: hsl(120, 100%, 40%);">+      length += br->burst_len;</span><br><span> </span><br><span>      /* Send data to transceiver */</span><br><span style="color: hsl(0, 100%, 40%);">-  send(trx->trx_ofd_data.fd, buf, 154, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+   send(trx->trx_ofd_data.fd, buf, length, 0);</span><br><span> </span><br><span>   return 0;</span><br><span> }</span><br><span>diff --git a/src/host/trxcon/trx_if.h b/src/host/trxcon/trx_if.h</span><br><span>index 2fafa56..fa66d4a 100644</span><br><span>--- a/src/host/trxcon/trx_if.h</span><br><span>+++ b/src/host/trxcon/trx_if.h</span><br><span>@@ -79,5 +79,5 @@</span><br><span> int trx_if_cmd_measure(struct trx_instance *trx,</span><br><span>  uint16_t band_arfcn_start, uint16_t band_arfcn_stop);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int trx_if_tx_burst(struct trx_instance *trx, uint8_t tn, uint32_t fn,</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t pwr, const ubit_t *bits);</span><br><span style="color: hsl(120, 100%, 40%);">+int trx_if_tx_burst(struct trx_instance *trx,</span><br><span style="color: hsl(120, 100%, 40%);">+                  const struct sched_burst_req *br);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmocom-bb/+/24661">change 24661</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/osmocom-bb/+/24661"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmocom-bb </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Id45b27180c233fdc42ae1ef0b195554dd299a056 </div>
<div style="display:none"> Gerrit-Change-Number: 24661 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>