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
This commit is contained in:
Philipp Maier 2018-10-05 14:59:37 +02:00 committed by Harald Welte
parent d4d4f918a8
commit b5208d45b1
3 changed files with 33 additions and 0 deletions

View File

@ -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);

View File

@ -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;
}

View File

@ -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");