[GPRS] NS: VTY: Move all local ip/port bind values into 'ns' node

This removes the requirement for gb_proxy and sgsn to have duplicate
vty parsing code
diff --git a/openbsc/src/gprs/gb_proxy_main.c b/openbsc/src/gprs/gb_proxy_main.c
index 1b39a2e..71d6086 100644
--- a/openbsc/src/gprs/gb_proxy_main.c
+++ b/openbsc/src/gprs/gb_proxy_main.c
@@ -238,20 +238,17 @@
 		exit(2);
 	}
 
-	rc = nsip_listen(bssgp_nsi, gbcfg.nsip_listen_ip,
-			 gbcfg.nsip_listen_port);
+	rc = gprs_ns_nsip_listen(bssgp_nsi);
 	if (rc < 0) {
 		LOGP(DGPRS, LOGL_FATAL, "Cannot bind/listen on NSIP socket\n");
 		exit(2);
 	}
 
-	if (gbcfg.frgre_enabled) {
-		rc = gprs_ns_frgre_listen(bssgp_nsi, gbcfg.nsip_listen_ip);
-		if (rc < 0) {
-			LOGP(DGPRS, LOGL_FATAL, "Cannot bind/listen GRE "
-				"socket. Do you have CAP_NET_RAW?\n");
-			exit(2);
-		}
+	rc = gprs_ns_frgre_listen(bssgp_nsi);
+	if (rc < 0) {
+		LOGP(DGPRS, LOGL_FATAL, "Cannot bind/listen GRE "
+			"socket. Do you have CAP_NET_RAW?\n");
+		exit(2);
 	}
 
 	/* Reset all the persistent NS-VCs that we've read from the config */
diff --git a/openbsc/src/gprs/gb_proxy_vty.c b/openbsc/src/gprs/gb_proxy_vty.c
index 4b71b1b..e761720 100644
--- a/openbsc/src/gprs/gb_proxy_vty.c
+++ b/openbsc/src/gprs/gb_proxy_vty.c
@@ -51,14 +51,7 @@
 
 	vty_out(vty, "gbproxy%s", VTY_NEWLINE);
 
-	if (g_cfg->nsip_listen_ip) {
-		ia.s_addr = htonl(g_cfg->nsip_listen_ip);
-		vty_out(vty, " nsip bss local ip %s%s", inet_ntoa(ia),
-			VTY_NEWLINE);
-	}
-	vty_out(vty, " nsip bss local port %u%s", g_cfg->nsip_listen_port,
-		VTY_NEWLINE);
-	vty_out(vty, " nsip sgsn nsei %u%s", g_cfg->nsip_sgsn_nsei,
+	vty_out(vty, " sgsn nsei %u%s", g_cfg->nsip_sgsn_nsei,
 		VTY_NEWLINE);
 
 	return CMD_SUCCESS;
@@ -73,33 +66,9 @@
 	return CMD_SUCCESS;
 }
 
-DEFUN(cfg_nsip_bss_local_ip,
-      cfg_nsip_bss_local_ip_cmd,
-      "nsip bss local ip A.B.C.D",
-      "Set the IP address on which we listen for BSS connects")
-{
-	struct in_addr ia;
-
-	inet_aton(argv[0], &ia);
-	g_cfg->nsip_listen_ip = ntohl(ia.s_addr);
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_nsip_bss_local_port,
-      cfg_nsip_bss_local_port_cmd,
-      "nsip bss local port <0-65534>",
-      "Set the UDP port on which we listen for BSS connects")
-{
-	unsigned int port = atoi(argv[0]);
-
-	g_cfg->nsip_listen_port = port;
-	return CMD_SUCCESS;
-}
-
 DEFUN(cfg_nsip_sgsn_nsei,
       cfg_nsip_sgsn_nsei_cmd,
-      "nsip sgsn nsei <0-65534>",
+      "sgsn nsei <0-65534>",
       "Set the NSEI to be used in the connection with the SGSN")
 {
 	unsigned int port = atoi(argv[0]);
@@ -117,8 +86,6 @@
 	install_default(GBPROXY_NODE);
 	install_element(GBPROXY_NODE, &ournode_exit_cmd);
 	install_element(GBPROXY_NODE, &ournode_end_cmd);
-	install_element(GBPROXY_NODE, &cfg_nsip_bss_local_ip_cmd);
-	install_element(GBPROXY_NODE, &cfg_nsip_bss_local_port_cmd);
 	install_element(GBPROXY_NODE, &cfg_nsip_sgsn_nsei_cmd);
 
 	return 0;
diff --git a/openbsc/src/gprs/gprs_ns.c b/openbsc/src/gprs/gprs_ns.c
index 4ef3603..8b226b8 100644
--- a/openbsc/src/gprs/gprs_ns.c
+++ b/openbsc/src/gprs/gprs_ns.c
@@ -903,11 +903,12 @@
 }
 
 /* Listen for incoming GPRS packets */
-int nsip_listen(struct gprs_ns_inst *nsi, uint32_t ip, uint16_t udp_port)
+int gprs_ns_nsip_listen(struct gprs_ns_inst *nsi)
 {
 	int ret;
 
-	ret = make_sock(&nsi->nsip.fd, IPPROTO_UDP, ip, udp_port, nsip_fd_cb);
+	ret = make_sock(&nsi->nsip.fd, IPPROTO_UDP, nsi->nsip.local_ip,
+			nsi->nsip.local_port, nsip_fd_cb);
 	if (ret < 0)
 		return ret;
 
diff --git a/openbsc/src/gprs/gprs_ns_frgre.c b/openbsc/src/gprs/gprs_ns_frgre.c
index d58c1d9..979442b 100644
--- a/openbsc/src/gprs/gprs_ns_frgre.c
+++ b/openbsc/src/gprs/gprs_ns_frgre.c
@@ -202,7 +202,7 @@
 	return rc;
 }
 
-int gprs_ns_frgre_listen(struct gprs_ns_inst *nsi, uint32_t ip)
+int gprs_ns_frgre_listen(struct gprs_ns_inst *nsi)
 {
 	int rc;
 
@@ -210,7 +210,11 @@
 	if (nsi->frgre.fd.fd)
 		close(nsi->frgre.fd.fd);
 
-	rc = make_sock(&nsi->frgre.fd, IPPROTO_GRE, ip, 0, nsfrgre_fd_cb);
+	if (!nsi->frgre.enabled)
+		return 0;
+
+	rc = make_sock(&nsi->frgre.fd, IPPROTO_GRE, nsi->frgre.local_ip,
+			0, nsfrgre_fd_cb);
 	if (rc < 0) {
 		LOGP(DNS, LOGL_ERROR, "Error creating GRE socket (%s)\n",
 			strerror(errno));
diff --git a/openbsc/src/gprs/gprs_ns_vty.c b/openbsc/src/gprs/gprs_ns_vty.c
index 7d43944..1922b02 100644
--- a/openbsc/src/gprs/gprs_ns_vty.c
+++ b/openbsc/src/gprs/gprs_ns_vty.c
@@ -68,6 +68,7 @@
 {
 	struct gprs_nsvc *nsvc;
 	unsigned int i;
+	struct in_addr ia;
 
 	vty_out(vty, "ns%s", VTY_NEWLINE);
 
@@ -111,6 +112,21 @@
 			get_value_string(gprs_ns_timer_strs, i),
 			vty_nsi->timeout[i], VTY_NEWLINE);
 
+	if (vty_nsi->nsip.local_ip) {
+		ia.s_addr = htonl(vty_nsi->nsip.local_ip);
+		vty_out(vty, " encapsulation udp local-ip %s%s",
+			inet_ntoa(ia), VTY_NEWLINE);
+		vty_out(vty, " encapsulation udp local-port %u%s",
+			vty_nsi->nsip.local_port);
+	}
+	vty_out(vty, " encapsulation framerelay-gre enabled %u%s",
+		vty_nsi->frgre.enabled ? 1 : 0, VTY_NEWLINE);
+	if (vty_nsi->frgre.enabled) {
+		ia.s_addr = htonl(vty_nsi->frgre.local_ip);
+		vty_out(vty, " encapsulation framerelay-gre local-ip %s%s",
+			inet_ntoa(ia), VTY_NEWLINE);
+	}
+
 	return CMD_SUCCESS;
 }
 
@@ -142,6 +158,15 @@
 static void dump_ns(struct vty *vty, struct gprs_ns_inst *nsi, int stats)
 {
 	struct gprs_nsvc *nsvc;
+	struct in_addr ia;
+
+	ia.s_addr = htonl(vty_nsi->nsip.local_ip);
+	vty_out(vty, "NS-UDP-IP Encapsulation: Local IP: %s, UDP Port: %u%s",
+		inet_ntoa(ia), vty_nsi->nsip.local_port, VTY_NEWLINE);
+
+	ia.s_addr = htonl(vty_nsi->frgre.local_ip);
+	vty_out(vty, "NS-FR-GRE-IP Encapsulation: Local IP: %s%s",
+		inet_ntoa(ia), VTY_NEWLINE);
 
 	llist_for_each_entry(nsvc, &nsi->gprs_nsvcs, list) {
 		if (nsvc == nsi->unknown_nsvc)
@@ -387,6 +412,66 @@
 	return CMD_SUCCESS;
 }
 
+#define ENCAPS_STR "NS encapsulation options\n"
+
+DEFUN(cfg_nsip_local_ip, cfg_nsip_local_ip_cmd,
+      "encapsulation udp local-ip A.B.C.D",
+	ENCAPS_STR "NS over UDP Encapsulation\n"
+	"Set the IP address on which we listen for NS/UDP\n"
+	"IP Address\n")
+{
+	struct in_addr ia;
+
+	inet_aton(argv[0], &ia);
+	vty_nsi->nsip.local_ip = ntohl(ia.s_addr);
+
+	return CMD_SUCCESS;
+}
+
+DEFUN(cfg_nsip_local_port, cfg_nsip_local_port_cmd,
+      "encapsulation udp local-port <0-65535>",
+	ENCAPS_STR "NS over UDP Encapsulation\n"
+	"Set the UDP port on which we listen for NS/UDP\n"
+	"UDP port number\n")
+{
+	unsigned int port = atoi(argv[0]);
+
+	vty_nsi->nsip.local_port = port;
+
+	return CMD_SUCCESS;
+}
+
+DEFUN(cfg_frgre_local_ip, cfg_frgre_local_ip_cmd,
+      "encapsulation framerelay-gre local-ip A.B.C.D",
+	ENCAPS_STR "NS over Frame Relay over GRE Encapsulation\n"
+	"Set the IP address on which we listen for NS/FR/GRE\n"
+	"IP Address\n")
+{
+	struct in_addr ia;
+
+	if (!vty_nsi->frgre.enabled) {
+		vty_out(vty, "FR/GRE is not enabled%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+	inet_aton(argv[0], &ia);
+	vty_nsi->frgre.local_ip = ntohl(ia.s_addr);
+
+	return CMD_SUCCESS;
+}
+
+DEFUN(cfg_frgre_enable, cfg_frgre_enable_cmd,
+      "encapsulation framerelay-gre enabled (1|0)",
+	ENCAPS_STR "NS over Frame Relay over GRE Encapsulation\n"
+	"Enable or disable Frame Relay over GRE\n"
+	"Enable\n" "Disable\n")
+{
+	int enabled = atoi(argv[0]);
+
+	vty_nsi->frgre.enabled = enabled;
+
+	return CMD_SUCCESS;
+}
+
 DEFUN(nsvc_nsei, nsvc_nsei_cmd,
 	"nsvc nsei <0-65535> (block|unblock|reset)",
 	"Perform an operation on a NSVC\n"
@@ -472,6 +557,10 @@
 	install_element(NS_NODE, &cfg_nse_remoterole_cmd);
 	install_element(NS_NODE, &cfg_no_nse_cmd);
 	install_element(NS_NODE, &cfg_ns_timer_cmd);
+	install_element(NS_NODE, &cfg_nsip_local_ip_cmd);
+	install_element(NS_NODE, &cfg_nsip_local_port_cmd);
+	install_element(NS_NODE, &cfg_frgre_enable_cmd);
+	install_element(NS_NODE, &cfg_frgre_local_ip_cmd);
 
 	install_element(ENABLE_NODE, &nsvc_nsei_cmd);
 
diff --git a/openbsc/src/gprs/osmo_gbproxy.cfg b/openbsc/src/gprs/osmo_gbproxy.cfg
index 79f391f..d6b5619 100644
--- a/openbsc/src/gprs/osmo_gbproxy.cfg
+++ b/openbsc/src/gprs/osmo_gbproxy.cfg
@@ -6,11 +6,19 @@
  no login
 !
 gbproxy
- nsip bss local port 23000
- nsip sgsn nsei 101
+ sgsn nsei 101
 ns
  nse 101 nsvci 101
- nse 101 remote-ip 192.168.100.239
- nse 101 remote-port 7777
  nse 101 remote-role sgsn
  nse 101 encapsulation udp
+ nse 101 remote-ip 192.168.100.239
+ nse 101 remote-port 7777
+ timer tns-block 3
+ timer tns-block-retries 3
+ timer tns-reset 3
+ timer tns-reset-retries 3
+ timer tns-test 30
+ timer tns-alive 3
+ timer tns-alive-retries 10
+ encapsulation framerelay-gre enabled 1
+ encapsulation framerelay-gre local-ip 0.0.0.0
diff --git a/openbsc/src/gprs/sgsn_main.c b/openbsc/src/gprs/sgsn_main.c
index 63ef9f5..1956428 100644
--- a/openbsc/src/gprs/sgsn_main.c
+++ b/openbsc/src/gprs/sgsn_main.c
@@ -175,8 +175,9 @@
 	if (rc)
 		exit(2);
 
-	nsip_listen(sgsn_nsi, sgsn_inst.cfg.nsip_listen_ip,
-		    sgsn_inst.cfg.nsip_listen_port);
+	rc = gprs_ns_nsip_listen(sgsn_nsi);
+	if (rc)
+		exit(2);
 
 	while (1) {
 		rc = bsc_select_main(0);
diff --git a/openbsc/src/gprs/sgsn_vty.c b/openbsc/src/gprs/sgsn_vty.c
index a065ba4..2532a88 100644
--- a/openbsc/src/gprs/sgsn_vty.c
+++ b/openbsc/src/gprs/sgsn_vty.c
@@ -54,18 +54,10 @@
 
 	vty_out(vty, "sgsn%s", VTY_NEWLINE);
 
-	if (g_cfg->nsip_listen_ip) {
-		ia.s_addr = htonl(g_cfg->nsip_listen_ip);
-		vty_out(vty, "  nsip local ip %s%s", inet_ntoa(ia),
-			VTY_NEWLINE);
-	}
-	vty_out(vty, "  nsip local port %u%s", g_cfg->nsip_listen_port,
-		VTY_NEWLINE);
-
 	llist_for_each_entry(gctx, &sgsn_ggsn_ctxts, list) {
-		vty_out(vty, "  ggsn %u remote-ip %s%s", gctx->id,
+		vty_out(vty, " ggsn %u remote-ip %s%s", gctx->id,
 			inet_ntoa(gctx->remote_addr), VTY_NEWLINE);
-		vty_out(vty, "  ggsn %u gtp-version %u%s", gctx->id,
+		vty_out(vty, " ggsn %u gtp-version %u%s", gctx->id,
 			gctx->gtp_version, VTY_NEWLINE);
 	}
 
@@ -81,32 +73,6 @@
 	return CMD_SUCCESS;
 }
 
-
-DEFUN(cfg_nsip_local_ip,
-      cfg_nsip_local_ip_cmd,
-      "nsip local ip A.B.C.D",
-      "Set the IP address on which we listen for BSS connects")
-{
-	struct in_addr ia;
-
-	inet_aton(argv[0], &ia);
-	g_cfg->nsip_listen_ip = ntohl(ia.s_addr);
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_nsip_local_port,
-      cfg_nsip_local_port_cmd,
-      "nsip local port <0-65534>",
-      "Set the UDP port on which we listen for BSS connects")
-{
-	unsigned int port = atoi(argv[0]);
-
-	g_cfg->nsip_listen_port = port;
-
-	return CMD_SUCCESS;
-}
-
 DEFUN(cfg_ggsn_remote_ip, cfg_ggsn_remote_ip_cmd,
 	"ggsn <0-255> remote-ip A.B.C.D",
 	"")
@@ -288,8 +254,6 @@
 	install_default(SGSN_NODE);
 	install_element(SGSN_NODE, &ournode_exit_cmd);
 	install_element(SGSN_NODE, &ournode_end_cmd);
-	install_element(SGSN_NODE, &cfg_nsip_local_ip_cmd);
-	install_element(SGSN_NODE, &cfg_nsip_local_port_cmd);
 	install_element(SGSN_NODE, &cfg_ggsn_remote_ip_cmd);
 	//install_element(SGSN_NODE, &cfg_ggsn_remote_port_cmd);
 	install_element(SGSN_NODE, &cfg_ggsn_gtp_version_cmd);