aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2013-01-07 16:22:00 +0100
committerHolger Hans Peter Freyther <zecke@selfish.org>2013-01-07 16:22:00 +0100
commitbac7dcc36751f6b49f5715112f8bab74a2f224a7 (patch)
tree953f51ff7870195c9abb7618d94c6d6dea034fd7
parentff799f091230d5214b4ba9e08e146fd0d989a458 (diff)
parent75077955e9de8814f6254187a62636e2cb759fd6 (diff)
Merge branch 'zecke/feature/improve-audio-codec-selection'
Allow to select the AMR multirate config using the VTY.
-rw-r--r--openbsc/include/openbsc/bsc_api.h7
-rw-r--r--openbsc/include/openbsc/osmo_msc_data.h2
-rw-r--r--openbsc/src/libbsc/bsc_api.c6
-rw-r--r--openbsc/src/osmo-bsc/osmo_bsc_api.c29
-rw-r--r--openbsc/src/osmo-bsc/osmo_bsc_msc.c3
-rw-r--r--openbsc/src/osmo-bsc/osmo_bsc_vty.c51
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);