[PATCH 3/4] NAT: move BSC config into separate file

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/OpenBSC@lists.osmocom.org/.

msuraev at sysmocom.de msuraev at sysmocom.de
Mon Apr 4 13:30:55 UTC 2016


From: Max <msuraev at sysmocom.de>

Introduce new configuration option bscs-config-file which includes BSC
configuration from the given file. Both absolute and relative (to the
main config file) paths are supported.
Add 'show bscs-config' command to display current BSC configuration.
Note: it is still possible to have BSC configuration in the main
file (provided proper index number is used) and in runtime but BSC
configuration is no longer saved automatically. The management of
included configuration file is left to external tools.
Update configuration examples.

Fixes: OS#1669
Sponsored-by: On-Waves ehf
---
 openbsc/doc/examples/osmo-bsc_nat/bscs.config      | 13 +++++++
 openbsc/doc/examples/osmo-bsc_nat/osmo-bsc_nat.cfg |  8 +----
 openbsc/include/openbsc/bsc_nat.h                  |  5 +++
 openbsc/osmoappdesc.py                             |  3 ++
 openbsc/src/osmo-bsc_nat/bsc_nat.c                 | 13 ++++++-
 openbsc/src/osmo-bsc_nat/bsc_nat_vty.c             | 40 ++++++++++++++++++++--
 6 files changed, 71 insertions(+), 11 deletions(-)
 create mode 100644 openbsc/doc/examples/osmo-bsc_nat/bscs.config

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 0000000..176debe
--- /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 737d104..2e00bc2 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 309adb1..ab1c590 100644
--- a/openbsc/include/openbsc/bsc_nat.h
+++ b/openbsc/include/openbsc/bsc_nat.h
@@ -264,6 +264,10 @@ struct bsc_nat {
 
 	struct bsc_endpoint *bsc_endpoints;
 
+	/* path to file with BSC config */
+	char *include_file;
+	char *include_base;
+
 	/* filter */
 	char *acc_lst_name;
 
@@ -336,6 +340,7 @@ void sccp_connection_destroy(struct nat_sccp_connection *);
 void bsc_close_connection(struct bsc_connection *);
 
 const char *bsc_con_type_to_string(int type);
+const char *bsc_nat_resolve_path(void *ctx, const char *base, const char *name);
 
 /**
  * parse the given message into the above structure
diff --git a/openbsc/osmoappdesc.py b/openbsc/osmoappdesc.py
index 76f03fc..d10ecae 100644
--- a/openbsc/osmoappdesc.py
+++ b/openbsc/osmoappdesc.py
@@ -26,6 +26,9 @@ nitb_e1_configs = [
     "doc/examples/osmo-nitb/rbs2308/openbsc.cfg"
 ]
 
+copy_files = [
+    "doc/examples/osmo-bsc_nat/bscs.config"
+]
 
 app_configs = {
     "osmo-bsc": ["doc/examples/osmo-bsc/osmo-bsc.cfg"],
diff --git a/openbsc/src/osmo-bsc_nat/bsc_nat.c b/openbsc/src/osmo-bsc_nat/bsc_nat.c
index cacb919..7dcacfd 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>
@@ -1451,6 +1452,12 @@ static int ipaccess_listen_bsc_cb(struct osmo_fd *bfd, unsigned int what)
 	return 0;
 }
 
+const char *bsc_nat_resolve_path(void *ctx, const char *base, const char *name)
+{
+	return ('/' == name[0]) ? name : talloc_asprintf(ctx, "%s/%s", base,
+							 name);
+}
+
 static void print_usage()
 {
 	printf("Usage: bsc_nat\n");
@@ -1626,6 +1633,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 +1660,9 @@ int main(int argc, char **argv)
 	/* seed the PRNG */
 	srand(time(NULL));
 
-
+	LOGP(DNAT, LOGL_NOTICE, "BSCs configured from %s\n",
+	     bsc_nat_resolve_path(tall_bsc_ctx, nat->include_base,
+				  nat->include_file));
 
 	/*
 	 * 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 96559b0..8def3ed 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,15 @@ 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",
+		bsc_nat_resolve_path(_nat, _nat->include_base,
+				     _nat->include_file), 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 +506,24 @@ 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.")
+{
+	const char *path = bsc_nat_resolve_path(_nat, _nat->include_base,
+						argv[0]);
+	int rc = vty_read_config_file(path, NULL);
+	if (rc < 0) {
+		vty_out(vty, "Failed to parse the config file %s: %s%s", 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",
@@ -871,8 +900,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;
+			}
 		}
 	}
 
@@ -1185,6 +1217,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);
@@ -1206,6 +1239,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);
@@ -1242,7 +1276,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);
-- 
2.8.1




More information about the OpenBSC mailing list