diff options
author | Philipp Maier <pmaier@sysmocom.de> | 2018-10-05 14:59:37 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2018-10-08 09:50:12 +0000 |
commit | b5208d45b1d3a5138635bd173e26833fe332e76e (patch) | |
tree | c7e38ed54c0b890d112e13f694ff36ae183c88df | |
parent | d4d4f918a852bb16459d6d51a7799dd03c56979b (diff) |
codec_pref: check codec configuration before start
In networks with a couple of different BTSs it may be likely that one
accidently sets up a codec configuration (codec-support)) that will be
mutually exclusive towards the codec configuration for the MSC
(codec-list). We need a check that validates the configuration before
start to catch such configuration flaws quickly.
- Add a check that checks each MSC codec-list against each BTS
codec-support setting.
Change-Id: Ice827896bab1a2330741e0fccc731a04f1a07d38
Related: OS#3625
-rw-r--r-- | include/osmocom/bsc/codec_pref.h | 2 | ||||
-rw-r--r-- | src/osmo-bsc/codec_pref.c | 26 | ||||
-rw-r--r-- | src/osmo-bsc/osmo_bsc_main.c | 5 |
3 files changed, 33 insertions, 0 deletions
diff --git a/include/osmocom/bsc/codec_pref.h b/include/osmocom/bsc/codec_pref.h index 3085ad4f9..d62d29ff8 100644 --- a/include/osmocom/bsc/codec_pref.h +++ b/include/osmocom/bsc/codec_pref.h @@ -21,3 +21,5 @@ int match_codec_pref(enum gsm48_chan_mode *chan_mode, void gen_bss_supported_codec_list(struct gsm0808_speech_codec_list *scl, const struct bsc_msc_data *msc, const struct gsm_bts *bts); + +int check_codec_pref(struct llist_head *mscs); diff --git a/src/osmo-bsc/codec_pref.c b/src/osmo-bsc/codec_pref.c index afecaa3ad..0f0ffa546 100644 --- a/src/osmo-bsc/codec_pref.c +++ b/src/osmo-bsc/codec_pref.c @@ -348,3 +348,29 @@ void gen_bss_supported_codec_list(struct gsm0808_speech_codec_list *scl, } } +/*! Visit the codec settings for the MSC and for each BTS in order to make sure + * that the configuration does not contain any combinations that lead into a + * mutually exclusive codec configuration (empty intersection). + * \param[in] mscs list head of the msc list. + * \returns 0 on success, -1 in case an invalid setting is found. */ +int check_codec_pref(struct llist_head *mscs) +{ + struct bsc_msc_data *msc; + struct gsm_bts *bts; + struct gsm0808_speech_codec_list scl; + int rc = 0; + + llist_for_each_entry(msc, mscs, entry) { + llist_for_each_entry(bts, &msc->network->bts_list, list) { + gen_bss_supported_codec_list(&scl, msc, bts); + if (scl.len <= 0) { + LOGP(DMSC, LOGL_FATAL, + "codec-support of BTS %u does not intersect with codec-list of MSC %u\n", + bts->nr, msc->nr); + rc = -1; + } + } + } + + return rc; +} diff --git a/src/osmo-bsc/osmo_bsc_main.c b/src/osmo-bsc/osmo_bsc_main.c index 468b58e2b..67fccd337 100644 --- a/src/osmo-bsc/osmo_bsc_main.c +++ b/src/osmo-bsc/osmo_bsc_main.c @@ -59,6 +59,7 @@ #include <osmocom/bsc/abis_rsl.h> #include <osmocom/bsc/chan_alloc.h> #include <osmocom/bsc/e1_config.h> +#include <osmocom/bsc/codec_pref.h> #include <osmocom/mgcp_client/mgcp_client.h> @@ -881,6 +882,10 @@ int main(int argc, char **argv) exit(1); } + rc = check_codec_pref(&bsc_gsmnet->bsc_data->mscs); + if (rc < 0) + LOGP(DMSC, LOGL_ERROR, "Configuration contains mutually exclusive codec settings -- check configuration!\n"); + llist_for_each_entry(msc, &bsc_gsmnet->bsc_data->mscs, entry) { if (osmo_bsc_msc_init(msc) != 0) { LOGP(DNAT, LOGL_ERROR, "Failed to start up. Exiting.\n"); |