This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
Harald Welte gerrit-no-reply at lists.osmocom.org
Review at https://gerrit.osmocom.org/6692
host/trxcon/scheduler: handle bursts from TRX interface
Change-Id: Iff15daf897f30cb98d4ec4c88b9fc259cb44ea4e
---
M src/host/trxcon/sched_trx.c
M src/host/trxcon/sched_trx.h
M src/host/trxcon/trx_if.c
3 files changed, 82 insertions(+), 1 deletion(-)
git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/92/6692/1
diff --git a/src/host/trxcon/sched_trx.c b/src/host/trxcon/sched_trx.c
index a0a2ed5..5cf8779 100644
--- a/src/host/trxcon/sched_trx.c
+++ b/src/host/trxcon/sched_trx.c
@@ -326,3 +326,79 @@
return 0;
}
+
+int sched_trx_handle_rx_burst(struct trx_instance *trx, uint8_t ts_num,
+ uint32_t burst_fn, sbit_t *bits, uint16_t nbits, int8_t rssi, float toa)
+{
+ struct trx_lchan_state *lchan;
+ const struct trx_frame *frame;
+ struct trx_ts *ts;
+
+ trx_lchan_rx_func *handler;
+ enum trx_lchan_type chan;
+ uint32_t fn, elapsed;
+ uint8_t offset, bid;
+
+ /* Check whether required timeslot is enabled / configured */
+ ts = sched_trx_find_ts(trx, ts_num);
+ if (ts == NULL) {
+ LOGP(DSCH, LOGL_ERROR, "TDMA timeslot #%u isn't configured, "
+ "ignoring burst...\n", ts_num);
+ return -EINVAL;
+ }
+
+ /* Calculate how many frames have been elapsed */
+ elapsed = (burst_fn + GSM_HYPERFRAME - ts->mf_last_fn);
+ elapsed %= GSM_HYPERFRAME;
+
+ /**
+ * If not too many frames have been elapsed,
+ * start counting from last fn + 1
+ */
+ if (elapsed < 10)
+ fn = (ts->mf_last_fn + 1) % GSM_HYPERFRAME;
+ else
+ fn = burst_fn;
+
+ while (1) {
+ /* Get frame from multiframe */
+ offset = fn % ts->mf_layout->period;
+ frame = ts->mf_layout->frames + offset;
+
+ /* Get required info from frame */
+ bid = frame->dl_bid;
+ chan = frame->dl_chan;
+ handler = trx_lchan_desc[chan].rx_fn;
+
+ /* Omit bursts which have no handler, like IDLE bursts */
+ if (!handler)
+ goto next_frame;
+
+ /* Find required channel state */
+ lchan = sched_trx_find_lchan(ts, chan);
+ if (lchan == NULL) /* FIXME: what should we do here? */
+ goto next_frame;
+
+ /* Ensure that channel is active */
+ if (!lchan->active)
+ goto next_frame;
+
+ /* Put burst to handler */
+ if (fn == burst_fn) {
+ /* TODO: decrypt if required */
+ handler(trx, ts, fn, chan, bid, bits, nbits, rssi, toa);
+ }
+
+next_frame:
+ /* Reached current fn */
+ if (fn == burst_fn)
+ break;
+
+ fn = (fn + 1) % GSM_HYPERFRAME;
+ }
+
+ /* Set last processed frame number */
+ ts->mf_last_fn = fn;
+
+ return 0;
+}
diff --git a/src/host/trxcon/sched_trx.h b/src/host/trxcon/sched_trx.h
index bcb4df9..563ee19 100644
--- a/src/host/trxcon/sched_trx.h
+++ b/src/host/trxcon/sched_trx.h
@@ -252,3 +252,6 @@
int sched_trx_deactivate_lchan(struct trx_ts *ts, enum trx_lchan_type chan);
struct trx_lchan_state *sched_trx_find_lchan(struct trx_ts *ts,
enum trx_lchan_type chan);
+
+int sched_trx_handle_rx_burst(struct trx_instance *trx, uint8_t ts_num,
+ uint32_t burst_fn, sbit_t *bits, uint16_t nbits, int8_t rssi, float toa);
diff --git a/src/host/trxcon/trx_if.c b/src/host/trxcon/trx_if.c
index 83db173..eb868ce 100644
--- a/src/host/trxcon/trx_if.c
+++ b/src/host/trxcon/trx_if.c
@@ -570,7 +570,9 @@
LOGP(DTRX, LOGL_DEBUG, "RX burst tn=%u fn=%u rssi=%d toa=%.2f\n",
tn, fn, rssi, toa);
- /* TODO: poke scheduler here! */
+ /* Poke scheduler */
+ sched_trx_handle_rx_burst(trx, tn, fn, bits, 148, rssi, toa);
+
return 0;
}
--
To view, visit https://gerrit.osmocom.org/6692
To unsubscribe, visit https://gerrit.osmocom.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Iff15daf897f30cb98d4ec4c88b9fc259cb44ea4e
Gerrit-PatchSet: 1
Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <laforge at gnumonks.org>