aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--openbsc/doc/examples/osmo-bsc_nat/bscs.config13
-rw-r--r--openbsc/doc/examples/osmo-bsc_nat/osmo-bsc_nat.cfg8
-rw-r--r--openbsc/include/openbsc/bsc_nat.h5
-rw-r--r--openbsc/src/osmo-bsc_nat/bsc_nat.c5
-rw-r--r--openbsc/src/osmo-bsc_nat/bsc_nat_vty.c49
5 files changed, 69 insertions, 11 deletions
diff --git a/openbsc/doc/examples/osmo-bsc_nat/bscs.config b/openbsc/doc/examples/osmo-bsc_nat/bscs.config
new file mode 100644
index 000000000..176debe42
--- /dev/null
+++ b/openbsc/doc/examples/osmo-bsc_nat/bscs.config
@@ -0,0 +1,13 @@
+nat
+ bsc 0
+ token lol
+ location_area_code 1234
+ description bsc
+ max-endpoints 32
+ paging forbidden 0
+ bsc 1
+ token wat
+ location_area_code 5678
+ description bsc
+ max-endpoints 32
+ paging forbidden 0
diff --git a/openbsc/doc/examples/osmo-bsc_nat/osmo-bsc_nat.cfg b/openbsc/doc/examples/osmo-bsc_nat/osmo-bsc_nat.cfg
index 737d10474..2e00bc2c3 100644
--- a/openbsc/doc/examples/osmo-bsc_nat/osmo-bsc_nat.cfg
+++ b/openbsc/doc/examples/osmo-bsc_nat/osmo-bsc_nat.cfg
@@ -62,11 +62,5 @@ nat
timeout ping 20
timeout pong 5
ip-dscp 0
+ bscs-config-file bscs.config
access-list bla imsi-allow ^11$
-
- bsc 0
- token bla
- location_area_code 1234
- description bsc
- max-endpoints 32
- paging forbidden 0
diff --git a/openbsc/include/openbsc/bsc_nat.h b/openbsc/include/openbsc/bsc_nat.h
index c5fefe172..5ccc02e18 100644
--- a/openbsc/include/openbsc/bsc_nat.h
+++ b/openbsc/include/openbsc/bsc_nat.h
@@ -264,6 +264,11 @@ struct bsc_nat {
struct bsc_endpoint *bsc_endpoints;
+ /* path to file with BSC config */
+ char *include_file;
+ char *include_base;
+ char *resolved_path;
+
/* filter */
char *acc_lst_name;
diff --git a/openbsc/src/osmo-bsc_nat/bsc_nat.c b/openbsc/src/osmo-bsc_nat/bsc_nat.c
index ab82adf17..f433324f8 100644
--- a/openbsc/src/osmo-bsc_nat/bsc_nat.c
+++ b/openbsc/src/osmo-bsc_nat/bsc_nat.c
@@ -34,6 +34,7 @@
#include <time.h>
#include <unistd.h>
#include <fcntl.h>
+#include <libgen.h>
#define _GNU_SOURCE
#include <getopt.h>
@@ -1626,6 +1627,8 @@ int main(int argc, char **argv)
local_addr.s_addr = INADDR_ANY;
handle_options(argc, argv);
+ nat->include_base = dirname(talloc_strdup(tall_bsc_ctx, config_file));
+
rate_ctr_init(tall_bsc_ctx);
osmo_stats_init(tall_bsc_ctx);
@@ -1651,7 +1654,7 @@ int main(int argc, char **argv)
/* seed the PRNG */
srand(time(NULL));
-
+ LOGP(DNAT, LOGL_NOTICE, "BSCs configured from %s\n", nat->resolved_path);
/*
* Setup the MGCP code..
diff --git a/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c b/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c
index 4348d6fb8..b7b49e63a 100644
--- a/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c
+++ b/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c
@@ -96,6 +96,8 @@ static int config_write_nat(struct vty *vty)
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);
@@ -181,6 +183,14 @@ static int config_write_bsc(struct vty *vty)
return CMD_SUCCESS;
}
+DEFUN(show_bscs, show_bscs_cmd, "show bscs-config",
+ SHOW_STR "Show configured BSCs\n"
+ "Both from included file and vty\n")
+{
+ vty_out(vty, "BSCs configuration loaded from %s:%s", _nat->resolved_path,
+ VTY_NEWLINE);
+ return config_write_bsc(vty);
+}
DEFUN(show_sccp, show_sccp_cmd, "show sccp connections",
SHOW_STR "Display information about SCCP\n"
@@ -495,6 +505,34 @@ DEFUN(cfg_nat_acc_lst_name,
return CMD_SUCCESS;
}
+DEFUN(cfg_nat_include,
+ cfg_nat_include_cmd,
+ "bscs-config-file NAME",
+ "Set the filename of the BSC configuration to include.\n"
+ "The filename to be included.")
+{
+ char *path;
+ int rc;
+
+ if ('/' == argv[0][0])
+ bsc_replace_string(_nat, &_nat->resolved_path, argv[0]);
+ else {
+ path = talloc_asprintf(_nat, "%s/%s", _nat->include_base,
+ argv[0]);
+ bsc_replace_string(_nat, &_nat->resolved_path, path);
+ talloc_free(path);
+ }
+
+ rc = vty_read_config_file(_nat->resolved_path, NULL);
+ if (rc < 0) {
+ vty_out(vty, "Failed to parse the config file %s: %s%s",
+ _nat->resolved_path, strerror(-rc), VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ bsc_replace_string(_nat, &_nat->include_file, argv[0]);
+ return CMD_SUCCESS;
+}
+
DEFUN(cfg_nat_no_acc_lst_name,
cfg_nat_no_acc_lst_name_cmd,
"no access-list-name",
@@ -865,8 +903,11 @@ DEFUN(cfg_bsc_lac, cfg_bsc_lac_cmd, "location_area_code <0-65535>",
/* verify that the LACs are unique */
llist_for_each_entry(tmp, &_nat->bsc_configs, entry) {
if (bsc_config_handles_lac(tmp, lac)) {
- vty_out(vty, "%% LAC %d is already used.%s", lac, VTY_NEWLINE);
- return CMD_ERR_INCOMPLETE;
+ if (tmp->nr != conf->nr) {
+ vty_out(vty, "%% LAC %d is already used.%s", lac,
+ VTY_NEWLINE);
+ return CMD_ERR_INCOMPLETE;
+ }
}
}
@@ -1179,6 +1220,7 @@ int bsc_nat_vty_init(struct bsc_nat *nat)
install_element_ve(&show_msc_cmd);
install_element_ve(&test_regex_cmd);
install_element_ve(&show_bsc_mgcp_cmd);
+ install_element_ve(&show_bscs_cmd);
install_element_ve(&show_bar_lst_cmd);
install_element_ve(&show_prefix_tree_cmd);
install_element_ve(&show_ussd_connection_cmd);
@@ -1200,6 +1242,7 @@ int bsc_nat_vty_init(struct bsc_nat *nat)
install_element(NAT_NODE, &cfg_nat_bsc_ip_tos_cmd);
install_element(NAT_NODE, &cfg_nat_acc_lst_name_cmd);
install_element(NAT_NODE, &cfg_nat_no_acc_lst_name_cmd);
+ install_element(NAT_NODE, &cfg_nat_include_cmd);
install_element(NAT_NODE, &cfg_nat_imsi_black_list_fn_cmd);
install_element(NAT_NODE, &cfg_nat_no_imsi_black_list_fn_cmd);
install_element(NAT_NODE, &cfg_nat_ussd_lst_name_cmd);
@@ -1236,7 +1279,7 @@ int bsc_nat_vty_init(struct bsc_nat *nat)
/* BSC subgroups */
install_element(NAT_NODE, &cfg_bsc_cmd);
- install_node(&bsc_node, config_write_bsc);
+ install_node(&bsc_node, NULL);
vty_install_default(NAT_BSC_NODE);
install_element(NAT_BSC_NODE, &cfg_bsc_token_cmd);
install_element(NAT_BSC_NODE, &cfg_bsc_auth_key_cmd);