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:
parent
d4d4f918a8
commit
b5208d45b1
|
@ -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,
|
void gen_bss_supported_codec_list(struct gsm0808_speech_codec_list *scl,
|
||||||
const struct bsc_msc_data *msc,
|
const struct bsc_msc_data *msc,
|
||||||
const struct gsm_bts *bts);
|
const struct gsm_bts *bts);
|
||||||
|
|
||||||
|
int check_codec_pref(struct llist_head *mscs);
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -59,6 +59,7 @@
|
||||||
#include <osmocom/bsc/abis_rsl.h>
|
#include <osmocom/bsc/abis_rsl.h>
|
||||||
#include <osmocom/bsc/chan_alloc.h>
|
#include <osmocom/bsc/chan_alloc.h>
|
||||||
#include <osmocom/bsc/e1_config.h>
|
#include <osmocom/bsc/e1_config.h>
|
||||||
|
#include <osmocom/bsc/codec_pref.h>
|
||||||
|
|
||||||
#include <osmocom/mgcp_client/mgcp_client.h>
|
#include <osmocom/mgcp_client/mgcp_client.h>
|
||||||
|
|
||||||
|
@ -881,6 +882,10 @@ int main(int argc, char **argv)
|
||||||
exit(1);
|
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) {
|
llist_for_each_entry(msc, &bsc_gsmnet->bsc_data->mscs, entry) {
|
||||||
if (osmo_bsc_msc_init(msc) != 0) {
|
if (osmo_bsc_msc_init(msc) != 0) {
|
||||||
LOGP(DNAT, LOGL_ERROR, "Failed to start up. Exiting.\n");
|
LOGP(DNAT, LOGL_ERROR, "Failed to start up. Exiting.\n");
|
||||||
|
|
Loading…
Reference in New Issue