aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVadim Yanitskiy <vyanitskiy@sysmocom.de>2022-03-31 16:51:52 +0300
committerlaforge <laforge@osmocom.org>2022-03-31 17:37:31 +0000
commit041411cb706249f0aafcda250e4a744b00f0de30 (patch)
treeee8c6fe94486e70e5c41f4f0a6a87db29052bd81
parent79d2af9b31a80c6935dca1aa3da000385aabb5d1 (diff)
fix gsm_bts_get_cbch(): CBCH can be allocated on Cn
According to 3GPP TS 45.002, table 3, unlike the CCCH+SDCCH/4+CBCH combination, which can only be allocated on C0/TS0, the SDCCH/8+CBCH can be allocated on C0..n/TS0..3. In other words, having CBCH on e.g. TRX1/C1 is perfectly legal. This is why in gsm_bts_get_cbch() we should check all transceivers, not just the C0. Change-Id: Ie79ccff4f8f0f1134757ec0c35e18b58081cc158 Related: SYS#5905
-rw-r--r--src/osmo-bsc/bts.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/src/osmo-bsc/bts.c b/src/osmo-bsc/bts.c
index d09aa4827..843d7111b 100644
--- a/src/osmo-bsc/bts.c
+++ b/src/osmo-bsc/bts.c
@@ -562,22 +562,23 @@ void gsm_bts_cell_id_list(struct gsm0808_cell_id_list2 *cell_id_list, const stru
/* return the gsm_lchan for the CBCH (if it exists at all) */
struct gsm_lchan *gsm_bts_get_cbch(struct gsm_bts *bts)
{
- struct gsm_lchan *lchan = NULL;
struct gsm_bts_trx *trx = bts->c0;
+ /* According to 3GPP TS 45.002, table 3, CBCH can be allocated
+ * either on C0/TS0 (CCCH+SDCCH4) or on C0..n/TS0..3 (SDCCH/8). */
if (trx->ts[0].pchan_from_config == GSM_PCHAN_CCCH_SDCCH4_CBCH)
- lchan = &trx->ts[0].lchan[2];
- else {
- int i;
- for (i = 0; i < 8; i++) {
- if (trx->ts[i].pchan_from_config == GSM_PCHAN_SDCCH8_SACCH8C_CBCH) {
- lchan = &trx->ts[i].lchan[2];
- break;
- }
+ return &trx->ts[0].lchan[2]; /* C0/TS0 */
+
+ llist_for_each_entry(trx, &bts->trx_list, list) { /* C0..n */
+ unsigned int tn;
+ for (tn = 0; tn < 4; tn++) { /* TS0..3 */
+ struct gsm_bts_trx_ts *ts = &trx->ts[tn];
+ if (ts->pchan_from_config == GSM_PCHAN_SDCCH8_SACCH8C_CBCH)
+ return &ts->lchan[2];
}
}
- return lchan;
+ return NULL;
}
int gsm_set_bts_type(struct gsm_bts *bts, enum gsm_bts_type type)