diff options
author | Daniel Willmann <dwillmann@sysmocom.de> | 2017-02-28 18:23:31 +0100 |
---|---|---|
committer | Daniel Willmann <daniel@totalueberwachung.de> | 2018-01-25 16:48:23 +0100 |
commit | 68785e6a52cdb313200bf690b3974b018b4fed0d (patch) | |
tree | dbf2e286927b139c4ea25371d4261150e1e85377 /openbsc/src/osmo-bsc_nat | |
parent | 0167c96cc5d4f51e7b34d92fdb5c226287b77c94 (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.c | 36 | ||||
-rw-r--r-- | openbsc/src/osmo-bsc_nat/bsc_nat_utils.c | 25 | ||||
-rw-r--r-- | openbsc/src/osmo-bsc_nat/bsc_nat_vty.c | 123 |
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; |