[PATCH] osmocom-bb[master]: host/trxcon/scheduler: handle bursts from TRX interface

Harald Welte gerrit-no-reply at lists.osmocom.org
Thu Feb 22 15:32:35 UTC 2018


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>


More information about the gerrit-log mailing list