aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Willmann <dwillmann@sysmocom.de>2017-03-02 16:37:03 +0100
committerDaniel Willmann <dwillmann@sysmocom.de>2017-03-02 16:58:25 +0100
commitaa7d574012062d05fe1b772538d41fff0a19490e (patch)
tree5865d659a128ad79f1c492729179b2c2538f7d19
parent8f655c184c373a143d548bd6f95a87a2e76a3246 (diff)
osmo-bsc_nat: Have a default MSC for messages from BSC
Change-Id: I343e6d9d17bcde6dbdf8f48b7b51e998a296680c Ticket: SYS#3208 Sponsored-by: On-Waves ehf.
-rw-r--r--openbsc/include/openbsc/bsc_nat.h2
-rw-r--r--openbsc/src/osmo-bsc_nat/bsc_nat.c8
-rw-r--r--openbsc/src/osmo-bsc_nat/bsc_nat_utils.c12
-rw-r--r--openbsc/src/osmo-bsc_nat/bsc_nat_vty.c9
4 files changed, 28 insertions, 3 deletions
diff --git a/openbsc/include/openbsc/bsc_nat.h b/openbsc/include/openbsc/bsc_nat.h
index 32be4d9dd..f6c1aaa9f 100644
--- a/openbsc/include/openbsc/bsc_nat.h
+++ b/openbsc/include/openbsc/bsc_nat.h
@@ -275,6 +275,7 @@ struct bsc_nat {
/* MSC connections */
struct llist_head msc_configs;
int num_msc;
+ int default_msc;
/* timeouts */
int auth_timeout;
@@ -350,6 +351,7 @@ int bsc_config_handles_lac(struct bsc_config *cfg, int lac);
struct msc_config *msc_config_alloc(struct bsc_nat *nat);
struct msc_config *msc_config_num(struct bsc_nat *nat, int num);
struct msc_config *msc_config_by_con(struct bsc_nat *nat, struct bsc_msc_connection *msc_con);
+struct bsc_msc_connection *msc_conn_by_num(struct bsc_nat *nat, int num);
struct bsc_msc_connection *msc_conn_by_imsi(struct bsc_nat *nat, const char *imsi);
void msc_config_free(struct msc_config *);
diff --git a/openbsc/src/osmo-bsc_nat/bsc_nat.c b/openbsc/src/osmo-bsc_nat/bsc_nat.c
index da923a45d..7936e0dab 100644
--- a/openbsc/src/osmo-bsc_nat/bsc_nat.c
+++ b/openbsc/src/osmo-bsc_nat/bsc_nat.c
@@ -1154,11 +1154,13 @@ static int forward_sccp_to_msc(struct bsc_connection *bsc, struct msgb *msg)
goto exit2;
con = patch_sccp_src_ref_to_msc(msg, parsed, bsc);
-#warning Implement routing by IMSI
- if (!imsi)
- LOGP(DNAT, LOGL_ERROR, "No IMSI for CR\n");
con->msc_con = msc_conn_by_imsi(bsc->nat, imsi);
+ if (!con->msc_con) {
+ /* Fall back to default MSC */
+ LOGP(DNAT, LOGL_NOTICE, "Falling back to default MSC\n");
+ con->msc_con = msc_conn_by_num(bsc->nat, bsc->nat->default_msc);
+ }
con_msc = con->msc_con;
con->filter_state.con_type = con_type;
con->filter_state.imsi_checked = filter;
diff --git a/openbsc/src/osmo-bsc_nat/bsc_nat_utils.c b/openbsc/src/osmo-bsc_nat/bsc_nat_utils.c
index 57c62a4f3..bed5af66c 100644
--- a/openbsc/src/osmo-bsc_nat/bsc_nat_utils.c
+++ b/openbsc/src/osmo-bsc_nat/bsc_nat_utils.c
@@ -250,6 +250,18 @@ struct msc_config *msc_config_by_con(struct bsc_nat *nat, struct bsc_msc_connect
return NULL;
}
+struct bsc_msc_connection *msc_conn_by_num(struct bsc_nat *nat, int num)
+{
+ struct msc_config *conf;
+
+ conf = msc_config_num(nat, num);
+
+ if (!conf)
+ return NULL;
+
+ return conf->msc_con;
+}
+
struct bsc_msc_connection *msc_conn_by_imsi(struct bsc_nat *nat, const char *imsi)
{
struct msc_config *conf;
diff --git a/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c b/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c
index 4c42791b5..5d37b521e 100644
--- a/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c
+++ b/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c
@@ -758,6 +758,14 @@ DEFUN(cfg_nat_use_ipa_for_mgcp,
return CMD_SUCCESS;
}
+DEFUN(cfg_nat_default_msc,
+ cfg_nat_default_msc_cmd,
+ "default msc NR",
+ "The MSC to route messages to by default\n" "MSC number\n")
+{
+ _nat->default_msc = atoi(argv[0]);
+}
+
DEFUN(cfg_nat_sdp_amr_mode_set,
cfg_nat_sdp_amr_mode_set_cmd,
"sdp-ensure-amr-mode-set",
@@ -1279,6 +1287,7 @@ int bsc_nat_vty_init(struct bsc_nat *nat)
install_element(NAT_NODE, &cfg_nat_ussd_token_cmd);
install_element(NAT_NODE, &cfg_nat_ussd_local_cmd);
install_element(NAT_NODE, &cfg_nat_use_ipa_for_mgcp_cmd);
+ install_element(NAT_NODE, &cfg_nat_default_msc_cmd);
bsc_msg_lst_vty_init(nat, &nat->access_lists, NAT_NODE);