Change in osmo-bts[master]: osmo-bts-trx/scheduler: implement baseband frequency hopping

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

fixeria gerrit-no-reply at lists.osmocom.org
Sun Jun 28 13:39:17 UTC 2020


fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-bts/+/19030 )


Change subject: osmo-bts-trx/scheduler: implement baseband frequency hopping
......................................................................

osmo-bts-trx/scheduler: implement baseband frequency hopping

Change-Id: I68f4ae09fd0789ad0d8f1c1e17e17dfc4de8e462
Related: OS#4546
---
M include/osmo-bts/scheduler.h
M src/osmo-bts-trx/scheduler_trx.c
M src/osmo-bts-trx/trx_if.c
3 files changed, 78 insertions(+), 2 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/30/19030/1

diff --git a/include/osmo-bts/scheduler.h b/include/osmo-bts/scheduler.h
index e65665f..6f93812 100644
--- a/include/osmo-bts/scheduler.h
+++ b/include/osmo-bts/scheduler.h
@@ -270,6 +270,7 @@
 };
 
 /*! Handle an UL burst received by PHY */
+int trx_sched_route_burst_ind(struct l1sched_trx *l1t, struct trx_ul_burst_ind *bi);
 int trx_sched_ul_burst(struct l1sched_trx *l1t, struct trx_ul_burst_ind *bi);
 
 #endif /* TRX_SCHEDULER_H */
diff --git a/src/osmo-bts-trx/scheduler_trx.c b/src/osmo-bts-trx/scheduler_trx.c
index 8e1ccfa..eecc65e 100644
--- a/src/osmo-bts-trx/scheduler_trx.c
+++ b/src/osmo-bts-trx/scheduler_trx.c
@@ -34,6 +34,7 @@
 #include <osmocom/core/timer_compat.h>
 #include <osmocom/core/bits.h>
 #include <osmocom/gsm/a5.h>
+#include <osmocom/gsm/gsm0502.h>
 
 
 #include <osmo-bts/gsm_data.h>
@@ -55,6 +56,30 @@
 	return 0;
 }
 
+/* Find a route (PHY instance) for a given Downlink burst request */
+static struct phy_instance *dlfh_route_br(const struct gsm_bts_trx_ts *ts,
+					  const struct trx_dl_burst_req *br)
+{
+	const struct gsm_bts_trx *trx;
+	struct gsm_time time;
+	uint16_t arfcn;
+
+	gsm_fn2gsmtime(&time, br->fn);
+
+	/* TODO: implement a "cache", so we could avoid frequent lookups */
+	arfcn = gsm0502_hop_seq_gen(&time, ts->hopping.hsn, ts->hopping.maio,
+				    ts->hopping.ma_len, ts->hopping.ma);
+	llist_for_each_entry(trx, &ts->trx->bts->trx_list, list) {
+		if (trx->arfcn == arfcn)
+			return trx->role_bts.l1h;
+	}
+
+	LOGP(DL1C, LOGL_FATAL, "Failed to resolve TDMA fn=%u "
+			       "(hsn=%u, maio=%u, ma_len=%u)\n",
+	     br->fn, ts->hopping.hsn, ts->hopping.maio, ts->hopping.ma_len);
+	return ts->trx->role_bts.l1h; /* fall-back to the current trx */
+}
+
 /* schedule all frames of all TRX for given FN */
 static void trx_sched_fn(struct gsm_bts *bts, const uint32_t fn)
 {
@@ -100,8 +125,14 @@
 				continue;
 			}
 
+			/* resolve PHY instance if freq. hopping is enabled */
+			if (trx->ts[tn].hopping.enabled) {
+				pinst = dlfh_route_br(&trx->ts[tn], &br);
+				l1h = pinst->u.osmotrx.hdl;
+			}
+
 			/* update dummy burst mask for C0 */
-			if (trx == bts->c0)
+			if (pinst->trx == bts->c0)
 				c0_mask |= (1 << tn);
 
 			trx_if_send_burst(l1h, &br);
@@ -127,6 +158,50 @@
 	}
 }
 
+/* Find a route (TRX instance) for a given Uplink burst indication */
+static struct gsm_bts_trx *ulfh_route_bi(const struct gsm_bts_trx *src_trx,
+					 const struct trx_ul_burst_ind *bi)
+{
+	struct gsm_bts_trx *trx;
+	struct gsm_time time;
+	uint16_t arfcn;
+
+	gsm_fn2gsmtime(&time, bi->fn);
+
+	/* TODO: implement a "cache", so we could avoid frequent lookups */
+	llist_for_each_entry(trx, &src_trx->bts->trx_list, list) {
+		const struct gsm_bts_trx_ts *ts = &trx->ts[bi->tn];
+		if (!ts->hopping.enabled)
+			continue;
+
+		arfcn = gsm0502_hop_seq_gen(&time, ts->hopping.hsn, ts->hopping.maio,
+					    ts->hopping.ma_len, ts->hopping.ma);
+		if (src_trx->arfcn == arfcn)
+			return trx;
+	}
+
+	LOGP(DL1C, LOGL_FATAL, "Failed to find transceiver for an Uplink burst fn=%u\n", bi->fn);
+	return (struct gsm_bts_trx *) src_trx; /* fall-back to the originating trx */
+}
+
+/* Route a given Uplink burst indication to the scheduler depending on freq. hopping state */
+int trx_sched_route_burst_ind(struct l1sched_trx *l1t, struct trx_ul_burst_ind *bi)
+{
+	const struct phy_instance *pinst;
+	const struct gsm_bts_trx *trx;
+	struct trx_l1h *l1h;
+
+	/* no frequency hopping => nothing to do */
+	if (!l1t->trx->ts[bi->tn].hopping.enabled)
+		return trx_sched_ul_burst(l1t, bi);
+
+	trx = ulfh_route_bi(l1t->trx, bi);
+	pinst = trx_phy_instance(trx);
+	l1h = pinst->u.osmotrx.hdl;
+
+	return trx_sched_ul_burst(&l1h->l1s, bi);
+}
+
 /*! maximum number of 'missed' frame periods we can tolerate of OS doesn't schedule us*/
 #define MAX_FN_SKEW		50
 /*! maximum number of frame periods we can tolerate without TRX Clock Indication*/
diff --git a/src/osmo-bts-trx/trx_if.c b/src/osmo-bts-trx/trx_if.c
index 58f7455..2b74cd8 100644
--- a/src/osmo-bts-trx/trx_if.c
+++ b/src/osmo-bts-trx/trx_if.c
@@ -1097,7 +1097,7 @@
 		hdr_ver, trx_data_desc_msg(&bi));
 
 	/* feed received burst into scheduler code */
-	trx_sched_ul_burst(&l1h->l1s, &bi);
+	trx_sched_route_burst_ind(&l1h->l1s, &bi);
 
 	return 0;
 }

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-bts/+/19030
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-Change-Id: I68f4ae09fd0789ad0d8f1c1e17e17dfc4de8e462
Gerrit-Change-Number: 19030
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy at sysmocom.de>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200628/10988af0/attachment.htm>


More information about the gerrit-log mailing list