diff options
author | Harald Welte <laforge@gnumonks.org> | 2010-07-30 11:50:09 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2010-07-30 11:50:09 +0200 |
commit | 9fbff4adacd9b7b4c45482c2b7c8ecf900d76ba7 (patch) | |
tree | ea681cc496fef2d1556afa1c6d15d16d9f758aec /openbsc/src/bsc_init.c | |
parent | 5f827f4edea1a66a5a050edb022be81d2d9f8313 (diff) |
[BSC] Add support for configfile-hardcoded System Information messages
Diffstat (limited to 'openbsc/src/bsc_init.c')
-rw-r--r-- | openbsc/src/bsc_init.c | 46 |
1 files changed, 27 insertions, 19 deletions
diff --git a/openbsc/src/bsc_init.c b/openbsc/src/bsc_init.c index ce668086d..7d9a520aa 100644 --- a/openbsc/src/bsc_init.c +++ b/openbsc/src/bsc_init.c @@ -787,9 +787,12 @@ static int generate_and_rsl_si(struct gsm_bts_trx *trx, enum osmo_sysinfo_type i struct gsm_bts *bts = trx->bts; int rc; - rc = gsm_generate_si(bts, i); - if (rc < 0) - return rc; + /* Only generate SI if this SI is not in "static" (user-defined) mode */ + if (!(bts->si_mode_static & (1 << i))) { + rc = gsm_generate_si(bts, i); + if (rc < 0) + return rc; + } DEBUGP(DRR, "SI%s: %s\n", gsm_sitype_name(i), hexdump(GSM_BTS_SI(bts, i), GSM_MACBLOCK_LEN)); @@ -821,26 +824,31 @@ static int set_system_infos(struct gsm_bts_trx *trx) ms_pwr_ctl_lvl(bts->band, bts->ms_max_power); bts->si_common.cell_sel_par.neci = bts->network->neci; + /* First, we determine which of the SI messages we actually need */ + if (trx == bts->c0) { - for (i = SYSINFO_TYPE_1; i <= SYSINFO_TYPE_4; i++) { - rc = generate_and_rsl_si(trx, i); - if (rc < 0) - goto err_out; - } - if (bts->gprs.mode != BTS_GPRS_NONE) { - rc = generate_and_rsl_si(trx, SYSINFO_TYPE_13); - if (rc < 0) - goto err_out; - } + /* 1...4 are always present on a C0 TRX */ + for (i = SYSINFO_TYPE_1; i <= SYSINFO_TYPE_4; i++) + bts->si_valid |= (1 << i); + + /* 13 is always present on a C0 TRX of a GPRS BTS */ + if (bts->gprs.mode != BTS_GPRS_NONE) + bts->si_valid |= (1 << SYSINFO_TYPE_13); } - rc = generate_and_rsl_si(trx, SYSINFO_TYPE_5); - if (rc < 0) - goto err_out; + /* 5 and 6 are always present on every TRX */ + bts->si_valid |= (1 << SYSINFO_TYPE_5); + bts->si_valid |= (1 << SYSINFO_TYPE_6); - rc = generate_and_rsl_si(trx, SYSINFO_TYPE_6); - if (rc < 0) - goto err_out; + /* Second, we generate and send the selected SI via RSL */ + for (i = SYSINFO_TYPE_1; i < _MAX_SYSINFO_TYPE; i++) { + if (!(bts->si_valid & (1 << i))) + continue; + + rc = generate_and_rsl_si(trx, i); + if (rc < 0) + goto err_out; + } return 0; err_out: |