nat: Move MSC ip address into the config..

The address can still be specified on the cli and it will
overwrite the config in the config file.
diff --git a/openbsc/src/nat/bsc_nat.c b/openbsc/src/nat/bsc_nat.c
index 65e491d..f4180ab 100644
--- a/openbsc/src/nat/bsc_nat.c
+++ b/openbsc/src/nat/bsc_nat.c
@@ -51,10 +51,10 @@
 
 struct log_target *stderr_target;
 static const char *config_file = "bsc-nat.cfg";
-static char *msc_address = "127.0.0.1";
 static struct in_addr local_addr;
 static struct bsc_msc_connection *msc_con;
 static struct bsc_fd bsc_listen;
+static const char *msc_ip = NULL;
 
 
 static struct bsc_nat *nat;
@@ -782,7 +782,7 @@
 			log_set_print_timestamp(stderr_target, 1);
 			break;
 		case 'm':
-			msc_address = strdup(optarg);
+			msc_ip = optarg;
 			break;
 		case 'l':
 			inet_aton(optarg, &local_addr);
@@ -815,10 +815,6 @@
 	log_add_target(stderr_target);
 	log_set_all_filter(stderr_target, 1);
 
-	/* parse options */
-	local_addr.s_addr = INADDR_ANY;
-	handle_options(argc, argv);
-
 	nat = bsc_nat_alloc();
 	if (!nat) {
 		fprintf(stderr, "Failed to allocate the BSC nat.\n");
@@ -826,6 +822,14 @@
 	}
 
 	nat->mgcp_cfg = talloc_zero(nat, struct mgcp_config);
+	if (!nat->mgcp_cfg) {
+		fprintf(stderr, "Failed to allocate MGCP cfg.\n");
+		return -5;
+	}
+
+	/* parse options */
+	local_addr.s_addr = INADDR_ANY;
+	handle_options(argc, argv);
 
 	/* init vty and parse */
 	bsc_nat_vty_init(nat);
@@ -835,6 +839,10 @@
 		return -3;
 	}
 
+	/* over rule the VTY config */
+	if (msc_ip)
+		bsc_nat_set_msc_ip(nat, msc_ip);
+
 	/* seed the PRNG */
 	srand(time(NULL));
 
@@ -845,7 +853,7 @@
 		return -4;
 
 	/* connect to the MSC */
-	msc_con = bsc_msc_create(msc_address, 5000);
+	msc_con = bsc_msc_create(nat->msc_ip, 5000);
 	if (!msc_con) {
 		fprintf(stderr, "Creating a bsc_msc_connection failed.\n");
 		exit(1);
diff --git a/openbsc/src/nat/bsc_nat_utils.c b/openbsc/src/nat/bsc_nat_utils.c
index 1583306..623bec5 100644
--- a/openbsc/src/nat/bsc_nat_utils.c
+++ b/openbsc/src/nat/bsc_nat_utils.c
@@ -51,9 +51,17 @@
 	nat->stats.bsc.reconn = counter_alloc("nat.bsc.conn");
 	nat->stats.bsc.auth_fail = counter_alloc("nat.bsc.auth_fail");
 	nat->stats.msc.reconn = counter_alloc("nat.msc.conn");
+	nat->msc_ip = talloc_strdup(nat, "127.0.0.1");
 	return nat;
 }
 
+void bsc_nat_set_msc_ip(struct bsc_nat *nat, const char *ip)
+{
+	if (nat->msc_ip)
+		talloc_free(nat->msc_ip);
+	nat->msc_ip = talloc_strdup(nat, ip);
+}
+
 struct bsc_connection *bsc_connection_alloc(struct bsc_nat *nat)
 {
 	struct bsc_connection *con = talloc_zero(nat, struct bsc_connection);
diff --git a/openbsc/src/nat/bsc_nat_vty.c b/openbsc/src/nat/bsc_nat_vty.c
index f0adfaa..a91da7c 100644
--- a/openbsc/src/nat/bsc_nat_vty.c
+++ b/openbsc/src/nat/bsc_nat_vty.c
@@ -55,6 +55,7 @@
 		vty_out(vty, " imsi allow %s%s", _nat->imsi_allow, VTY_NEWLINE);
 	if (_nat->imsi_deny)
 		vty_out(vty, " insi deny %s%s", _nat->imsi_deny, VTY_NEWLINE);
+	vty_out(vty, " msc ip %s%s", _nat->msc_ip, VTY_NEWLINE);
 	return CMD_SUCCESS;
 }
 
@@ -203,6 +204,15 @@
 	return CMD_SUCCESS;
 }
 
+DEFUN(cfg_nat_msc_ip,
+      cfg_nat_msc_ip_cmd,
+      "msc ip IP",
+      "Set the IP address of the MSC.")
+{
+	bsc_nat_set_msc_ip(_nat, argv[0]);
+	return CMD_SUCCESS;
+}
+
 /* per BSC configuration */
 DEFUN(cfg_bsc, cfg_bsc_cmd, "bsc BSC_NR", "Select a BSC to configure\n")
 {
@@ -316,6 +326,7 @@
 	install_default(NAT_NODE);
 	install_element(NAT_NODE, &cfg_nat_imsi_allow_cmd);
 	install_element(NAT_NODE, &cfg_nat_imsi_deny_cmd);
+	install_element(NAT_NODE, &cfg_nat_msc_ip_cmd);
 
 	/* BSC subgroups */
 	install_element(NAT_NODE, &cfg_bsc_cmd);