gtphub: ares vty and init

From sgsn_vty.c, copy the cfg_grx_ggsn_cmd to add an ares server to the static
sgsn_instance.

This is sort of preliminary. As described in comments, the sgsn_ares functions
should actually be separated from the static sgsn structure. gtphub keeps such
an sgsn structure just for the sgsn_ares functions.

Sponsored-by: On-Waves ehi
diff --git a/openbsc/src/gprs/gtphub.c b/openbsc/src/gprs/gtphub.c
index 8af3ff7..8e16497 100644
--- a/openbsc/src/gprs/gtphub.c
+++ b/openbsc/src/gprs/gtphub.c
@@ -1781,7 +1781,14 @@
 	int rc;
 
 	gtphub_init(hub);
-	gtphub_ares_init(hub);
+
+	/* If a Ctrl plane proxy is configured, ares will never be used. */
+	if (!cfg->ggsn_proxy[GTPH_PLANE_CTRL].addr_str) {
+		if (gtphub_ares_init(hub) != 0) {
+			LOG(LOGL_FATAL, "Failed to initialize ares\n");
+			return -1;
+		}
+	}
 
 	/* TODO set hub->restart_counter from external file. */
 
@@ -1806,7 +1813,6 @@
 		}
 	}
 
-
 	for (plane_idx = 0; plane_idx < GTPH_PLANE_N; plane_idx++) {
 		if (gtphub_make_proxy(hub,
 				      &hub->sgsn_proxy[plane_idx],
diff --git a/openbsc/src/gprs/gtphub_ares.c b/openbsc/src/gprs/gtphub_ares.c
index 8522556..7688b47 100644
--- a/openbsc/src/gprs/gtphub_ares.c
+++ b/openbsc/src/gprs/gtphub_ares.c
@@ -197,7 +197,7 @@
 			LOGP(DGTPHUB, LOGL_DEBUG,
 			     "GGSN resolved from cache: %s -> %s\n",
 			     lookup->apn_oi_str,
-			     gtphub_peer_str(resolved->peer));
+			     gtphub_port_str(resolved->peer));
 			return resolved->peer;
 		}
 	}
diff --git a/openbsc/src/gprs/gtphub_vty.c b/openbsc/src/gprs/gtphub_vty.c
index aead178..29a7316 100644
--- a/openbsc/src/gprs/gtphub_vty.c
+++ b/openbsc/src/gprs/gtphub_vty.c
@@ -20,12 +20,22 @@
 
 #include <string.h>
 
+#include <ares.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
 #include <osmocom/core/talloc.h>
 #include <osmocom/vty/command.h>
 
 #include <openbsc/vty.h>
 #include <openbsc/gtphub.h>
 
+/* TODO split GRX ares from sgsn into a separate struct and allow use without
+ * globals. */
+#include <openbsc/sgsn.h>
+extern struct sgsn_instance *sgsn;
+
 static struct gtphub_cfg *g_cfg = 0;
 
 static struct cmd_node gtphub_node = {
@@ -57,6 +67,10 @@
 		c->addr_str, (int)c->port,
 		u->addr_str, (int)u->port,
 		VTY_NEWLINE);
+
+	struct ares_addr_node *server;
+	for (server = sgsn->ares_servers; server; server = server->next)
+		vty_out(vty, " grx-dns-add %s%s", inet_ntoa(server->addr.addr4), VTY_NEWLINE);
 }
 
 static int config_write_gtphub(struct vty *vty)
@@ -214,6 +228,22 @@
 	return CMD_SUCCESS;
 }
 
+
+/* Copied from sgsn_vty.h */
+DEFUN(cfg_grx_ggsn, cfg_grx_ggsn_cmd,
+	"grx-dns-add A.B.C.D",
+	"Add DNS server\nIPv4 address\n")
+{
+	struct ares_addr_node *node = talloc_zero(tall_bsc_ctx, struct ares_addr_node);
+	node->family = AF_INET;
+	inet_aton(argv[0], &node->addr.addr4);
+
+	node->next = sgsn->ares_servers;
+	sgsn->ares_servers = node;
+	return CMD_SUCCESS;
+}
+
+
 DEFUN(show_gtphub, show_gtphub_cmd, "show gtphub",
       SHOW_STR "Display information about the GTP hub")
 {
@@ -238,6 +268,7 @@
 	install_element(GTPHUB_NODE, &cfg_gtphub_ggsn_proxy_cmd);
 	install_element(GTPHUB_NODE, &cfg_gtphub_sgsn_proxy_short_cmd);
 	install_element(GTPHUB_NODE, &cfg_gtphub_sgsn_proxy_cmd);
+	install_element(GTPHUB_NODE, &cfg_grx_ggsn_cmd);
 
 	return 0;
 }