aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/osmo-bsc_nat
diff options
context:
space:
mode:
authorDaniel Willmann <dwillmann@sysmocom.de>2017-02-28 18:23:31 +0100
committerDaniel Willmann <daniel@totalueberwachung.de>2018-01-25 16:48:23 +0100
commit68785e6a52cdb313200bf690b3974b018b4fed0d (patch)
treedbf2e286927b139c4ea25371d4261150e1e85377 /openbsc/src/osmo-bsc_nat
parent0167c96cc5d4f51e7b34d92fdb5c226287b77c94 (diff)
osmo-bsc_nat: Support multiple MSCs in VTY/config
Change-Id: I2e9009b52c6ecc17fc2da8402736412b9093ce19 Ticket: SYS#3208 Sponsored-by: On-Waves ehf.
Diffstat (limited to 'openbsc/src/osmo-bsc_nat')
-rw-r--r--openbsc/src/osmo-bsc_nat/bsc_nat.c36
-rw-r--r--openbsc/src/osmo-bsc_nat/bsc_nat_utils.c25
-rw-r--r--openbsc/src/osmo-bsc_nat/bsc_nat_vty.c123
3 files changed, 117 insertions, 67 deletions
diff --git a/openbsc/src/osmo-bsc_nat/bsc_nat.c b/openbsc/src/osmo-bsc_nat/bsc_nat.c
index 5016c4d40..7aed9e6d4 100644
--- a/openbsc/src/osmo-bsc_nat/bsc_nat.c
+++ b/openbsc/src/osmo-bsc_nat/bsc_nat.c
@@ -1648,13 +1648,6 @@ int main(int argc, char **argv)
if (bsc_mgcp_nat_init(nat) != 0)
return -4;
- /* connect to the MSC */
- nat->msc_con = bsc_msc_create(nat, &nat->dests);
- if (!nat->msc_con) {
- fprintf(stderr, "Creating a bsc_msc_connection failed.\n");
- exit(1);
- }
-
/* start control interface after reading config for
* ctrl_vty_get_bind_addr() */
nat->ctrl = bsc_nat_controlif_setup(nat, ctrl_vty_get_bind_addr(),
@@ -1664,13 +1657,28 @@ int main(int argc, char **argv)
exit(1);
}
- nat->msc_con->name = "main MSC";
- nat->msc_con->connection_loss = msc_connection_was_lost;
- nat->msc_con->connected = msc_connection_connected;
- nat->msc_con->write_queue.read_cb = ipaccess_msc_read_cb;
- nat->msc_con->write_queue.write_cb = ipaccess_msc_write_cb;;
- nat->msc_con->write_queue.bfd.data = nat->msc_con;
- bsc_msc_connect(nat->msc_con);
+ /* connect to the MSCs */
+ struct msc_config *conf;
+ struct bsc_msc_connection *msc_con;
+
+ llist_for_each_entry(conf, &nat->msc_configs, entry) {
+ msc_con = bsc_msc_create(nat, &conf->dests);
+ if (!msc_con) {
+ fprintf(stderr, "Creating a bsc_msc_connection failed.\n");
+ exit(1);
+ }
+
+ msc_con->name = "main MSC";
+ msc_con->connection_loss = msc_connection_was_lost;
+ msc_con->connected = msc_connection_connected;
+ msc_con->write_queue.read_cb = ipaccess_msc_read_cb;
+ msc_con->write_queue.write_cb = ipaccess_msc_write_cb;;
+ msc_con->write_queue.bfd.data = msc_con;
+
+ conf->msc_con = msc_con;
+
+ bsc_msc_connect(msc_con);
+ }
/* wait for the BSC */
rc = make_sock(&bsc_listen, IPPROTO_TCP, ntohl(local_addr.s_addr),
diff --git a/openbsc/src/osmo-bsc_nat/bsc_nat_utils.c b/openbsc/src/osmo-bsc_nat/bsc_nat_utils.c
index 6746518e3..d13749912 100644
--- a/openbsc/src/osmo-bsc_nat/bsc_nat_utils.c
+++ b/openbsc/src/osmo-bsc_nat/bsc_nat_utils.c
@@ -75,18 +75,12 @@ struct bsc_nat *bsc_nat_alloc(void)
if (!nat)
return NULL;
- nat->main_dest = talloc_zero(nat, struct bsc_msc_dest);
- if (!nat->main_dest) {
- talloc_free(nat);
- return NULL;
- }
-
+ INIT_LLIST_HEAD(&nat->msc_configs);
INIT_LLIST_HEAD(&nat->sccp_connections);
INIT_LLIST_HEAD(&nat->bsc_connections);
INIT_LLIST_HEAD(&nat->paging_groups);
INIT_LLIST_HEAD(&nat->bsc_configs);
INIT_LLIST_HEAD(&nat->access_lists);
- INIT_LLIST_HEAD(&nat->dests);
INIT_LLIST_HEAD(&nat->num_rewr);
INIT_LLIST_HEAD(&nat->num_rewr_post);
INIT_LLIST_HEAD(&nat->smsc_rewr);
@@ -104,20 +98,19 @@ struct bsc_nat *bsc_nat_alloc(void)
nat->ping_timeout = 20;
nat->pong_timeout = 5;
- llist_add(&nat->main_dest->list, &nat->dests);
- nat->main_dest->ip = talloc_strdup(nat, "127.0.0.1");
- nat->main_dest->port = 5000;
-
return nat;
}
void bsc_nat_free(struct bsc_nat *nat)
{
- struct bsc_config *cfg, *tmp;
+ struct bsc_config *bcfg, *btmp;
+ struct msc_config *mcfg, *mtmp;
struct bsc_msg_acc_lst *lst, *tmp_lst;
- llist_for_each_entry_safe(cfg, tmp, &nat->bsc_configs, entry)
- bsc_config_free(cfg);
+ llist_for_each_entry_safe(mcfg, mtmp, &nat->msc_configs, entry)
+ msc_config_free(mcfg);
+ llist_for_each_entry_safe(bcfg, btmp, &nat->bsc_configs, entry)
+ bsc_config_free(bcfg);
llist_for_each_entry_safe(lst, tmp_lst, &nat->access_lists, list)
bsc_msg_acc_lst_delete(lst);
@@ -137,9 +130,9 @@ void bsc_nat_free(struct bsc_nat *nat)
talloc_free(nat);
}
-void bsc_nat_set_msc_ip(struct bsc_nat *nat, const char *ip)
+void bsc_nat_set_msc_ip(struct msc_config *cfg, const char *ip)
{
- osmo_talloc_replace_string(nat, &nat->main_dest->ip, ip);
+ osmo_talloc_replace_string(cfg, &cfg->main_dest->ip, ip);
}
struct bsc_connection *bsc_connection_alloc(struct bsc_nat *nat)
diff --git a/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c b/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c
index dfca04779..f2cc8a24f 100644
--- a/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c
+++ b/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c
@@ -98,15 +98,11 @@ static int config_write_nat(struct vty *vty)
struct bsc_nat_paging_group *pgroup;
vty_out(vty, "nat%s", VTY_NEWLINE);
- vty_out(vty, " msc ip %s%s", _nat->main_dest->ip, VTY_NEWLINE);
- vty_out(vty, " msc port %d%s", _nat->main_dest->port, VTY_NEWLINE);
vty_out(vty, " timeout auth %d%s", _nat->auth_timeout, VTY_NEWLINE);
vty_out(vty, " timeout ping %d%s", _nat->ping_timeout, VTY_NEWLINE);
vty_out(vty, " timeout pong %d%s", _nat->pong_timeout, VTY_NEWLINE);
if (_nat->include_file)
vty_out(vty, " bscs-config-file %s%s", _nat->include_file, VTY_NEWLINE);
- if (_nat->token)
- vty_out(vty, " token %s%s", _nat->token, VTY_NEWLINE);
vty_out(vty, " ip-dscp %d%s", _nat->bsc_ip_dscp, VTY_NEWLINE);
if (_nat->acc_lst_name)
vty_out(vty, " access-list-name %s%s", _nat->acc_lst_name, VTY_NEWLINE);
@@ -156,6 +152,24 @@ static int config_write_nat(struct vty *vty)
return CMD_SUCCESS;
}
+static void config_write_msc_single(struct vty *vty, struct msc_config *msc)
+{
+ vty_out(vty, " msc %u%s", msc->nr, VTY_NEWLINE);
+ vty_out(vty, " ip %s%s", msc->main_dest->ip, VTY_NEWLINE);
+ vty_out(vty, " port %d%s", msc->main_dest->port, VTY_NEWLINE);
+ if (msc->token)
+ vty_out(vty, " token %s%s", msc->token, VTY_NEWLINE);
+}
+
+static int config_write_msc(struct vty *vty)
+{
+ struct msc_config *msc;
+
+ llist_for_each_entry(msc, &_nat->msc_configs, entry)
+ config_write_msc_single(vty, msc);
+ return CMD_SUCCESS;
+}
+
static void config_write_bsc_single(struct vty *vty, struct bsc_config *bsc)
{
vty_out(vty, " bsc %u%s", bsc->nr, VTY_NEWLINE);
@@ -426,27 +440,6 @@ DEFUN(cfg_nat, cfg_nat_cmd, "nat", "Configure the NAT")
return CMD_SUCCESS;
}
-DEFUN(cfg_nat_msc_ip,
- cfg_nat_msc_ip_cmd,
- "msc ip A.B.C.D",
- "MSC related configuration\n"
- "Configure the IP address\n" IP_STR)
-{
- bsc_nat_set_msc_ip(_nat, argv[0]);
- return CMD_SUCCESS;
-}
-
-DEFUN(cfg_nat_msc_port,
- cfg_nat_msc_port_cmd,
- "msc port <1-65500>",
- "MSC related configuration\n"
- "Configure the port\n"
- "Port number\n")
-{
- _nat->main_dest->port = atoi(argv[0]);
- return CMD_SUCCESS;
-}
-
DEFUN(cfg_nat_auth_time,
cfg_nat_auth_time_cmd,
"timeout auth <1-256>",
@@ -480,15 +473,6 @@ DEFUN(cfg_nat_pong_time,
return CMD_SUCCESS;
}
-DEFUN(cfg_nat_token, cfg_nat_token_cmd,
- "token TOKEN",
- "Authentication token configuration\n"
- "Token of the BSC, currently transferred in cleartext\n")
-{
- osmo_talloc_replace_string(_nat, &_nat->token, argv[0]);
- return CMD_SUCCESS;
-}
-
DEFUN(cfg_nat_bsc_ip_dscp, cfg_nat_bsc_ip_dscp_cmd,
"ip-dscp <0-255>",
"Set the IP DSCP for the BSCs to use\n" "Set the IP_TOS attribute")
@@ -1069,6 +1053,67 @@ DEFUN(cfg_bsc_no_paging_grp,
return CMD_SUCCESS;
}
+/* per MSC configuration */
+DEFUN(cfg_msc, cfg_msc_cmd, "msc MSC_NR",
+ "MSC configuration\n" "Identifier of the MSC\n")
+{
+ int msc_nr = atoi(argv[0]);
+ struct msc_config *msc;
+
+ if (msc_nr > _nat->num_msc) {
+ vty_out(vty, "%% The next unused MSC number is %u%s",
+ _nat->num_msc, VTY_NEWLINE);
+ return CMD_WARNING;
+ } else if (msc_nr == _nat->num_msc) {
+ /* allocate a new one */
+ msc = msc_config_alloc(_nat);
+ } else
+ msc = msc_config_num(_nat, msc_nr);
+
+ if (!msc)
+ return CMD_WARNING;
+
+ vty->index = msc;
+ vty->node = NAT_MSC_NODE;
+
+ return CMD_SUCCESS;
+}
+
+DEFUN(cfg_msc_token, cfg_msc_token_cmd, "token TOKEN",
+ "Authentication token configuration\n"
+ "Token of the BSC, currently transferred in cleartext\n")
+{
+ struct msc_config *conf = vty->index;
+
+ osmo_talloc_replace_string(conf, &conf->token, argv[0]);
+ return CMD_SUCCESS;
+}
+
+DEFUN(cfg_msc_ip,
+ cfg_msc_ip_cmd,
+ "ip A.B.C.D",
+ "MSC related configuration\n"
+ "Configure the IP address\n" IP_STR)
+{
+ struct msc_config *conf = vty->index;
+
+ bsc_nat_set_msc_ip(conf, argv[0]);
+ return CMD_SUCCESS;
+}
+
+DEFUN(cfg_msc_port,
+ cfg_msc_port_cmd,
+ "port <1-65500>",
+ "MSC related configuration\n"
+ "Configure the port\n"
+ "Port number\n")
+{
+ struct msc_config *conf = vty->index;
+
+ conf->main_dest->port = atoi(argv[0]);
+ return CMD_SUCCESS;
+}
+
DEFUN(test_regex, test_regex_cmd,
"test regex PATTERN STRING",
"Test utilities\n"
@@ -1263,12 +1308,9 @@ int bsc_nat_vty_init(struct bsc_nat *nat)
/* nat group */
install_element(CONFIG_NODE, &cfg_nat_cmd);
install_node(&nat_node, config_write_nat);
- install_element(NAT_NODE, &cfg_nat_msc_ip_cmd);
- install_element(NAT_NODE, &cfg_nat_msc_port_cmd);
install_element(NAT_NODE, &cfg_nat_auth_time_cmd);
install_element(NAT_NODE, &cfg_nat_ping_time_cmd);
install_element(NAT_NODE, &cfg_nat_pong_time_cmd);
- install_element(NAT_NODE, &cfg_nat_token_cmd);
install_element(NAT_NODE, &cfg_nat_bsc_ip_dscp_cmd);
install_element(NAT_NODE, &cfg_nat_bsc_ip_tos_cmd);
install_element(NAT_NODE, &cfg_nat_acc_lst_name_cmd);
@@ -1325,6 +1367,13 @@ int bsc_nat_vty_init(struct bsc_nat *nat)
install_element(NAT_BSC_NODE, &cfg_bsc_no_paging_grp_cmd);
install_element(NAT_BSC_NODE, &cfg_bsc_osmux_cmd);
+ /* MSC subgroups */
+ install_element(NAT_NODE, &cfg_msc_cmd);
+ install_node(&msc_node, config_write_msc);
+ install_element(NAT_MSC_NODE, &cfg_msc_token_cmd);
+ install_element(NAT_MSC_NODE, &cfg_msc_ip_cmd);
+ install_element(NAT_MSC_NODE, &cfg_msc_port_cmd);
+
mgcp_vty_init();
return 0;