fixeria has submitted this change. ( https://gerrit.osmocom.org/c/osmo-bsc/+/16352 )
Change subject: fix inp_sig_cb(): dispatch TS_EV_OML_DOWN to all transceivers ......................................................................
fix inp_sig_cb(): dispatch TS_EV_OML_DOWN to all transceivers
When running a multi-trx setup, upon stopping osmo-bts one can see:
DCHAN ERROR lchan_fsm.c:80 lchan(0-1-7-TCH_F-0)[0x612000010120]{UNUSED}: (type=NONE) lchan allocation failed in state UNUSED: LCHAN_EV_TS_ERROR DCHAN ERROR lchan_fsm.c:144 lchan(0-1-7-TCH_F-0)[0x612000010120]{UNUSED}: (type=NONE) lchan activation failed (lchan allocation failed in state UNUSED: LCHAN_EV_TS_ERROR)
These messages show up when the following conditions are met:
* BTS model speaks A-bis over IP (ip.access, e.g. nanoBTS), and * BTS has more than one transceiver configured.
The problem is that unlike traditional E1 based BTS models, ip.access ones have a single global A-bis/OML link for all transceivers. Thus when it goes down, in inp_sig_cb() we need to notify all timeslots *of all TRXes*, not just TRX0.
Change-Id: I3dc657ac5a2c5334747bd4f4db1a658acb323942 Fixes: OS#5479 --- M src/osmo-bsc/osmo_bsc_main.c 1 file changed, 6 insertions(+), 1 deletion(-)
Approvals: laforge: Looks good to me, approved pespin: Looks good to me, but someone else must approve Jenkins Builder: Verified
diff --git a/src/osmo-bsc/osmo_bsc_main.c b/src/osmo-bsc/osmo_bsc_main.c index 167b0a3..3c8f381 100644 --- a/src/osmo-bsc/osmo_bsc_main.c +++ b/src/osmo-bsc/osmo_bsc_main.c @@ -465,7 +465,12 @@
if (isd->link_type == E1INP_SIGN_OML) { rate_ctr_inc(rate_ctr_group_get_ctr(trx->bts->bts_ctrs, BTS_CTR_BTS_OML_FAIL)); - all_ts_dispatch_event(trx, TS_EV_OML_DOWN); + /* ip.access BTS models have a single global A-bis/OML link for all + * transceivers, so once it's lost we need to notify them all. */ + if (is_ipaccess_bts(trx->bts)) + gsm_bts_all_ts_dispatch(trx->bts, TS_EV_OML_DOWN, NULL); + else /* Other BTS models (e.g. Ericsson) have per-TRX OML links */ + gsm_trx_all_ts_dispatch(trx, TS_EV_OML_DOWN, NULL); } else if (isd->link_type == E1INP_SIGN_RSL) { rate_ctr_inc(rate_ctr_group_get_ctr(trx->bts->bts_ctrs, BTS_CTR_BTS_RSL_FAIL)); acc_ramp_abort(&trx->bts->acc_ramp);