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