diff options
author | Vadim Yanitskiy <vyanitskiy@sysmocom.de> | 2021-05-17 02:28:28 +0200 |
---|---|---|
committer | Vadim Yanitskiy <vyanitskiy@sysmocom.de> | 2021-05-20 19:03:05 +0200 |
commit | 1c2c92da172e3a1c0cfe873ad4acf7e288c7b4ff (patch) | |
tree | 5f012112f5c958474d66c452882de00d34217723 | |
parent | f4c2b61e3e6654bf51cf7facf38cdb1cad20fa15 (diff) |
osmo-bts-trx: fix hopping pointer bug in trx_sched_fn()
In change [1] together with the actual implementation I introduced
a serious bug to trx_sched_fn(): if a timeslot is configured to use
frequency hopping, both 'pinst' and 'l1h' pointers are *overwriten*
in the inner loop, so the Downlink burst is re-directed to the
approproate PHY instance. However, if a subsequent timeslot is not
hopping, the Downlink burst would be re-directed to the wrong PHY
instance because both pointers were overwriten during a previous
iteration.
Let's add another 'struct phy_instance' pointer to the inner loop,
so it's properly re-initialized for each timeslot iteration.
Change-Id: I9afbbef8dc5d885763356470c27d4392dce8e815
Fixes: [1] I68f4ae09fd0789ad0d8f1c1e17e17dfc4de8e462
Related: SYS#4868, OS#4546
-rw-r--r-- | src/osmo-bts-trx/scheduler_trx.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/src/osmo-bts-trx/scheduler_trx.c b/src/osmo-bts-trx/scheduler_trx.c index bf0650d5..e1340b56 100644 --- a/src/osmo-bts-trx/scheduler_trx.c +++ b/src/osmo-bts-trx/scheduler_trx.c @@ -107,9 +107,9 @@ static void trx_sched_fn(struct gsm_bts *bts, const uint32_t fn) /* process every TRX */ llist_for_each_entry(trx, &bts->trx_list, list) { - struct phy_instance *pinst = trx_phy_instance(trx); - struct phy_link *plink = pinst->phy_link; - struct trx_l1h *l1h = pinst->u.osmotrx.hdl; + const struct phy_instance *_pinst = trx_phy_instance(trx); + const struct phy_link *plink = _pinst->phy_link; + struct trx_l1h *l1h = _pinst->u.osmotrx.hdl; struct l1sched_trx *l1t = &l1h->l1s; /* we don't schedule, if power is off */ @@ -122,6 +122,8 @@ static void trx_sched_fn(struct gsm_bts *bts, const uint32_t fn) /* process every TS of TRX */ for (tn = 0; tn < ARRAY_SIZE(l1t->ts); tn++) { + const struct phy_instance *pinst = _pinst; + /* ready-to-send */ _sched_rts(l1t, tn, GSM_TDMA_FN_SUM(sched_fn, plink->u.osmotrx.rts_advance)); @@ -143,7 +145,6 @@ static void trx_sched_fn(struct gsm_bts *bts, const uint32_t fn) pinst = dlfh_route_br(&br, &trx->ts[tn]); if (pinst == NULL) continue; - l1h = pinst->u.osmotrx.hdl; } if (pinst->trx == bts->c0) { @@ -153,7 +154,7 @@ static void trx_sched_fn(struct gsm_bts *bts, const uint32_t fn) br.att = 0; } - trx_if_send_burst(l1h, &br); + trx_if_send_burst(pinst->u.osmotrx.hdl, &br); } } |