diff options
-rw-r--r-- | openbsc/include/openbsc/bsc_api.h | 7 | ||||
-rw-r--r-- | openbsc/include/openbsc/osmo_msc_data.h | 2 | ||||
-rw-r--r-- | openbsc/src/libbsc/bsc_api.c | 6 | ||||
-rw-r--r-- | openbsc/src/osmo-bsc/osmo_bsc_api.c | 29 | ||||
-rw-r--r-- | openbsc/src/osmo-bsc/osmo_bsc_msc.c | 3 | ||||
-rw-r--r-- | openbsc/src/osmo-bsc/osmo_bsc_vty.c | 51 |
6 files changed, 98 insertions, 0 deletions
diff --git a/openbsc/include/openbsc/bsc_api.h b/openbsc/include/openbsc/bsc_api.h index 472c8e471..f52984f39 100644 --- a/openbsc/include/openbsc/bsc_api.h +++ b/openbsc/include/openbsc/bsc_api.h @@ -34,6 +34,13 @@ struct bsc_api { void (*classmark_chg)(struct gsm_subscriber_connection *conn, const uint8_t *cm2, uint8_t cm2_len, const uint8_t *cm3, uint8_t cm3_len); + + /** + * Configure the multirate setting on this channel. If it is + * not implemented AMR5.9 will be used. + */ + void (*mr_config)(struct gsm_subscriber_connection *conn, + struct gsm48_multi_rate_conf *conf); }; int bsc_api_init(struct gsm_network *network, struct bsc_api *api); diff --git a/openbsc/include/openbsc/osmo_msc_data.h b/openbsc/include/openbsc/osmo_msc_data.h index 6eebcdd41..8e255a0fd 100644 --- a/openbsc/include/openbsc/osmo_msc_data.h +++ b/openbsc/include/openbsc/osmo_msc_data.h @@ -26,6 +26,7 @@ #include "bsc_msc.h" #include <osmocom/core/timer.h> +#include <osmocom/gsm/protocol/gsm_04_08.h> #include <regex.h> @@ -68,6 +69,7 @@ struct osmo_msc_data { int rtp_base; /* audio codecs */ + struct gsm48_multi_rate_conf amr_conf; struct gsm_audio_support **audio_support; int audio_length; diff --git a/openbsc/src/libbsc/bsc_api.c b/openbsc/src/libbsc/bsc_api.c index ad89fb2a6..2fab20b11 100644 --- a/openbsc/src/libbsc/bsc_api.c +++ b/openbsc/src/libbsc/bsc_api.c @@ -155,6 +155,12 @@ static void assignment_t10_timeout(void *_conn) static void handle_mr_config(struct gsm_subscriber_connection *conn, struct gsm_lchan *lchan) { + struct bsc_api *api; + api = conn->bts->network->bsc_api; + + if (api->mr_config) + return api->mr_config(conn, &lchan->mr_conf); + lchan->mr_conf.ver = 1; lchan->mr_conf.icmi = 1; lchan->mr_conf.m5_90 = 1; diff --git a/openbsc/src/osmo-bsc/osmo_bsc_api.c b/openbsc/src/osmo-bsc/osmo_bsc_api.c index 87d3f6e61..df8c0444f 100644 --- a/openbsc/src/osmo-bsc/osmo_bsc_api.c +++ b/openbsc/src/osmo-bsc/osmo_bsc_api.c @@ -316,6 +316,34 @@ static void bsc_cm_update(struct gsm_subscriber_connection *conn, queue_msg_or_return(resp); } +static void bsc_mr_config(struct gsm_subscriber_connection *conn, + struct gsm48_multi_rate_conf *conf) +{ + struct osmo_msc_data *msc; + + if (!conn->sccp_con) { + LOGP(DMSC, LOGL_ERROR, + "No msc data available on conn %p. Audio will be broken.\n", + conn); + return; + } + + msc = conn->sccp_con->msc; + + conf->ver = 1; + conf->icmi = 1; + + /* maybe gcc see's it is copy of _one_ byte */ + conf->m4_75 = msc->amr_conf.m4_75; + conf->m5_15 = msc->amr_conf.m5_15; + conf->m5_90 = msc->amr_conf.m5_90; + conf->m6_70 = msc->amr_conf.m6_70; + conf->m7_40 = msc->amr_conf.m7_40; + conf->m7_95 = msc->amr_conf.m7_95; + conf->m10_2 = msc->amr_conf.m10_2; + conf->m12_2 = msc->amr_conf.m12_2; +} + static struct bsc_api bsc_handler = { .sapi_n_reject = bsc_sapi_n_reject, .cipher_mode_compl = bsc_cipher_mode_compl, @@ -325,6 +353,7 @@ static struct bsc_api bsc_handler = { .assign_fail = bsc_assign_fail, .clear_request = bsc_clear_request, .classmark_chg = bsc_cm_update, + .mr_config = bsc_mr_config, }; struct bsc_api *osmo_bsc_api() diff --git a/openbsc/src/osmo-bsc/osmo_bsc_msc.c b/openbsc/src/osmo-bsc/osmo_bsc_msc.c index 55532dbd4..a97968175 100644 --- a/openbsc/src/osmo-bsc/osmo_bsc_msc.c +++ b/openbsc/src/osmo-bsc/osmo_bsc_msc.c @@ -494,5 +494,8 @@ struct osmo_msc_data *osmo_msc_data_alloc(struct gsm_network *net, int nr) msc_data->nr = nr; msc_data->allow_emerg = 1; + /* Defaults for the audio setup */ + msc_data->amr_conf.m5_90 = 1; + return msc_data; } diff --git a/openbsc/src/osmo-bsc/osmo_bsc_vty.c b/openbsc/src/osmo-bsc/osmo_bsc_vty.c index a3bf5afaa..f50268314 100644 --- a/openbsc/src/osmo-bsc/osmo_bsc_vty.c +++ b/openbsc/src/osmo-bsc/osmo_bsc_vty.c @@ -75,6 +75,24 @@ DEFUN(cfg_net_bsc, cfg_net_bsc_cmd, return CMD_SUCCESS; } +static void write_msc_amr_options(struct vty *vty, struct osmo_msc_data *msc) +{ +#define WRITE_AMR(vty, msc, name, var) \ + vty_out(vty, " amr-config %s %s%s", \ + name, msc->amr_conf.var ? "allowed" : "forbidden", \ + VTY_NEWLINE); + + WRITE_AMR(vty, msc, "12_2k", m12_2); + WRITE_AMR(vty, msc, "10_2k", m10_2); + WRITE_AMR(vty, msc, "7_95k", m7_95); + WRITE_AMR(vty, msc, "7_40k", m7_40); + WRITE_AMR(vty, msc, "6_70k", m6_70); + WRITE_AMR(vty, msc, "5_90k", m5_90); + WRITE_AMR(vty, msc, "5_15k", m5_15); + WRITE_AMR(vty, msc, "4_75k", m4_75); +#undef WRITE_AMR +} + static void write_msc(struct vty *vty, struct osmo_msc_data *msc) { struct bsc_msc_dest *dest; @@ -122,6 +140,9 @@ static void write_msc(struct vty *vty, struct osmo_msc_data *msc) if (msc->local_pref) vty_out(vty, " local-prefix %s%s", msc->local_pref, VTY_NEWLINE); + + /* write amr options */ + write_msc_amr_options(vty, msc); } static int config_write_msc(struct vty *vty) @@ -383,6 +404,28 @@ DEFUN(cfg_net_msc_local_prefix, return CMD_SUCCESS; } +#define AMR_CONF_STR "AMR Multirate Configuration\n" +#define AMR_COMMAND(name) \ + DEFUN(cfg_net_msc_amr_##name, \ + cfg_net_msc_amr_##name##_cmd, \ + "amr-config " #name "k (allowed|forbidden)", \ + AMR_CONF_STR "Bitrate\n" "Allowed\n" "Forbidden\n") \ +{ \ + struct osmo_msc_data *msc = osmo_msc_data(vty); \ + \ + msc->amr_conf.m##name = strcmp(argv[0], "allowed") == 0; \ + return CMD_SUCCESS; \ +} + +AMR_COMMAND(12_2) +AMR_COMMAND(10_2) +AMR_COMMAND(7_95) +AMR_COMMAND(7_40) +AMR_COMMAND(6_70) +AMR_COMMAND(5_90) +AMR_COMMAND(5_15) +AMR_COMMAND(4_75) + DEFUN(cfg_net_bsc_mid_call_text, cfg_net_bsc_mid_call_text_cmd, "mid-call-text .TEXT", @@ -473,6 +516,14 @@ int bsc_vty_init_extra(void) install_element(MSC_NODE, &cfg_net_msc_type_cmd); install_element(MSC_NODE, &cfg_net_msc_emerg_cmd); install_element(MSC_NODE, &cfg_net_msc_local_prefix_cmd); + install_element(MSC_NODE, &cfg_net_msc_amr_12_2_cmd); + install_element(MSC_NODE, &cfg_net_msc_amr_10_2_cmd); + install_element(MSC_NODE, &cfg_net_msc_amr_7_95_cmd); + install_element(MSC_NODE, &cfg_net_msc_amr_7_40_cmd); + install_element(MSC_NODE, &cfg_net_msc_amr_6_70_cmd); + install_element(MSC_NODE, &cfg_net_msc_amr_5_90_cmd); + install_element(MSC_NODE, &cfg_net_msc_amr_5_15_cmd); + install_element(MSC_NODE, &cfg_net_msc_amr_4_75_cmd); install_element_ve(&show_statistics_cmd); install_element_ve(&show_mscs_cmd); |