socsvn commit: r289127 - in soc2015/roam/ports/net/sixxs-aiccu: . files

roam at FreeBSD.org roam at FreeBSD.org
Sun Aug 2 22:51:59 UTC 2015


Author: roam
Date: Sun Aug  2 22:51:58 2015
New Revision: 289127
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=289127

Log:
  Teach AICCU about the ng_ayiya node.

Added:
  soc2015/roam/ports/net/sixxs-aiccu/files/netgraph.patch
Modified:
  soc2015/roam/ports/net/sixxs-aiccu/Makefile

Modified: soc2015/roam/ports/net/sixxs-aiccu/Makefile
==============================================================================
--- soc2015/roam/ports/net/sixxs-aiccu/Makefile	Sun Aug  2 22:51:51 2015	(r289126)
+++ soc2015/roam/ports/net/sixxs-aiccu/Makefile	Sun Aug  2 22:51:58 2015	(r289127)
@@ -25,9 +25,10 @@
 BUILD_WRKSRC=	${WRKDIR}/aiccu/unix-console
 PORTDOCS=	README
 
-OPTIONS_DEFINE=	GNUTLS LOG_DAEMON DOCS
+OPTIONS_DEFINE=	GNUTLS LOG_DAEMON DOCS NETGRAPH
 GNUTLS_DESC=	Use gnutls to secure TIC supporting starttls
 LOG_DAEMON_DESC=Log to LOG_DAEMON instead to LOG_LOCAL7
+NETGRAPH_DESC=	Use the ng_ayiya Netgraph node as an AYIYA implementation
 
 OPTIONS_DEFAULT+=	GNUTLS
 
@@ -39,6 +40,14 @@
 LDFLAGS+=	-lgnutls
 .endif
 
+.if ${PORT_OPTIONS:MGNUTLS}
+BUILD_DEPENDS+=	ng_ayiya>=0:${PORTSDIR}/net/ng_ayiya
+RUN_DEPENDS+=	ng_ayiya>=0:${PORTSDIR}/net/ng_ayiya
+EXTRA_PATCHES+=	${FILESDIR}/netgraph.patch
+CFLAGS+=	-DAICCU_NETGRAPH
+LDFLAGS+=	-lnetgraph
+.endif
+
 post-patch:
 	@${REINPLACE_CMD} \
 		-e 's:verbose true:verbose false:' \

Added: soc2015/roam/ports/net/sixxs-aiccu/files/netgraph.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ soc2015/roam/ports/net/sixxs-aiccu/files/netgraph.patch	Sun Aug  2 22:51:58 2015	(r289127)
@@ -0,0 +1,623 @@
+From ec5025bff45bf0f84317c31555fdf95a9a29ce17 Mon Sep 17 00:00:00 2001
+From: Peter Pentchev <roam at ringlet.net>
+Date: Fri, 31 Jul 2015 15:37:40 +0000
+Subject: [PATCH] Try to teach AICCU about ng_ayiya.
+
+TODO: Make it stop, i.e. get ng_ayiya to send a message down
+the control hook upon receiving a "shutdown" message and get
+AICCU to hear that message and, well, stop.
+---
+ common/aiccu.h          |   1 +
+ common/aiccu_freebsd4.c |   8 ++
+ common/aiccu_kame.c     |  25 +++++++
+ common/aiccu_netgraph.h |  20 +++++
+ common/ayiya.c          |  19 ++++-
+ common/common.c         |  60 ++++++++++++---
+ common/common.h         |   2 +-
+ common/tic.c            |   2 +-
+ common/tun.c            | 190 ++++++++++++++++++++++++++++++++++++++++++++++++
+ unix-console/Makefile   |   5 ++
+ unix-console/main.c     |   5 ++
+ 11 files changed, 323 insertions(+), 14 deletions(-)
+ create mode 100644 common/aiccu_netgraph.h
+
+diff --git common/aiccu.h common/aiccu.h
+index ef65000..1c0c1f2 100755
+--- common/aiccu.h
++++ common/aiccu.h
+@@ -19,6 +19,7 @@
+ #include "heartbeat.h"
+ #include "ayiya.h"
+ #include "resolver.h"
++#include "aiccu_netgraph.h"
+ 
+ #ifdef NEWSTUFF_TSP
+ #include "tsp.h"
+diff --git common/aiccu_freebsd4.c common/aiccu_freebsd4.c
+index 95a6554..c2e1cc2 100755
+--- common/aiccu_freebsd4.c
++++ common/aiccu_freebsd4.c
+@@ -19,6 +19,9 @@ bool aiccu_os_install(void)
+ 
+ bool aiccu_os_setup(struct TIC_Tunnel *hTunnel)
+ {
++#ifdef AICCU_NETGRAPH
++	do_log(LOG_ERR, "RDBG aiccu_os_setup(): configure the Netgraph node\n"); exit(42);
++#else
+ 	if (hTunnel->uses_tundev == 0)
+ 	{
+ 		/* Create the tunnel device */
+@@ -76,6 +79,7 @@ bool aiccu_os_setup(struct TIC_Tunnel *hTunnel)
+ 	}
+ 
+ 	return true;
++#endif /* AICCU_NETGRAPH */
+ }
+ 
+ void aiccu_os_reconfig(struct TIC_Tunnel *hTunnel)
+@@ -93,6 +97,9 @@ void aiccu_os_reconfig(struct TIC_Tunnel *hTunnel)
+ 
+ void aiccu_os_delete(struct TIC_Tunnel *hTunnel)
+ {
++#ifdef AICCU_NETGRAPH
++	dolog(LOG_ERR, "RDBG FIXME: tear down the Netgraph structure\n"); exit(42);
++#else
+ 	hTunnel = hTunnel;
+ 
+ 	/* Mark the interface down */
+@@ -107,5 +114,6 @@ void aiccu_os_delete(struct TIC_Tunnel *hTunnel)
+ 			"ifconfig %s destroy",
+ 			g_aiccu->ipv6_interface);
+ 	}
++#endif /* AICCU_NETGRAPH */
+ }
+ 
+diff --git common/aiccu_kame.c common/aiccu_kame.c
+index c6d1ea3..9d79282 100755
+--- common/aiccu_kame.c
++++ common/aiccu_kame.c
+@@ -65,6 +65,24 @@ bool aiccu_os_setup(struct TIC_Tunnel *hTunnel)
+ 			hTunnel->sIPv6_POP);
+ 	}
+ 
++#ifdef AICCU_NETGRAPH
++	if (NgSendMsg(ng_sock.cs, "c", NGM_AYIYA_COOKIE, NGM_AYIYA_CONFIGURE,
++	    NULL, 0) == -1)
++	{
++		dolog(LOG_ERR, "Could not send the 'configure' message to the '%s' Netgraph node: %s (%d)\n",
++		    ng_node_name, strerror(errno), errno);
++		return false;
++	}
++	int32_t resp;
++	if (!ng_get_msg_response("configure", &resp, sizeof(resp)))
++		return false;
++	if (resp != 0) {
++		dolog(LOG_ERR, "Could not complete the '%s' Netgraph's node configuration: %s (%d)\n",
++		    ng_node_name, strerror(resp), resp);
++		return false;
++	}
++#endif
++
+ 	return true;
+ }
+ 
+@@ -82,6 +100,7 @@ void aiccu_os_reconfig(struct TIC_Tunnel *hTunnel)
+ 
+ void aiccu_os_delete(struct TIC_Tunnel *hTunnel)
+ {
++#ifndef AICCU_NETGRAPH
+ 	hTunnel = hTunnel;
+ 	aiccu_exec(
+ 		"ifconfig %s down",
+@@ -93,5 +112,11 @@ void aiccu_os_delete(struct TIC_Tunnel *hTunnel)
+ 			"ifconfig %s deletetunnel",
+ 			g_aiccu->ipv6_interface);
+ 	}
++#else
++	(void)hTunnel;
++	if (!tun_ng_connect("stop", true))
++		return;
++	tun_ng_shutdown("stop", true);
++#endif
+ }
+ 
+diff --git common/aiccu_netgraph.h common/aiccu_netgraph.h
+new file mode 100644
+index 0000000..3e2291e
+--- /dev/null
++++ common/aiccu_netgraph.h
+@@ -0,0 +1,20 @@
++#ifndef AICCU_NETGRAPH_H
++#define AICCU_NETGRAPH_H
++
++#include <netgraph.h>
++#include <netgraph/ng_ksocket.h>
++
++#include <netgraph/ng_ayiya.h>
++
++struct ng_connection_sock {
++	int cs, ds;
++};
++
++extern struct ng_connection_sock ng_sock;
++extern char ng_node_name[NG_NODESIZ];
++extern bool ng_connected;
++
++bool tun_ng_connect(const char *what, bool disconnect);
++bool tun_ng_shutdown(const char *what, bool self);
++bool ng_get_msg_response(const char *what, void *buf, size_t size);
++#endif
+diff --git common/ayiya.c common/ayiya.c
+index f4ed0aa..4068d3e 100755
+--- common/ayiya.c
++++ common/ayiya.c
+@@ -155,6 +155,9 @@ DWORD WINAPI ayiya_writer(LPVOID arg);
+ DWORD WINAPI ayiya_writer(LPVOID arg)
+ #endif
+ {
++#ifdef AICCU_NETGRAPH
++	/* Do nothing, really.  Everything is handled by the Netgraph node. */
++#else
+ 	unsigned char		buf[2048];
+ 	struct pseudo_ayh	*s = (struct pseudo_ayh *)buf;
+ 	struct sockaddr_storage	ci;
+@@ -272,11 +275,15 @@ DWORD WINAPI ayiya_writer(LPVOID arg)
+ #else
+ 	return 0;
+ #endif
++#endif /* AICCU_NETGRAPH */
+ }
+ 
+ /* Construct a beat and send it outwards */
+ void ayiya_beat(void)
+ {
++#ifdef AICCU_NETGRAPH
++	dolog(LOG_ERR, "RDBG FIXME: send a Netgraph heartbeat\n");
++#else
+ 	SHA_CTX			sha1;
+ 	sha1_byte		hash[SHA1_DIGEST_LENGTH];
+ 	struct sockaddr_in	target;
+@@ -340,6 +347,7 @@ void ayiya_beat(void)
+ 	{
+ 		ayiya_log(LOG_ERR, beat_name, NULL, 0, "Only %u of %u bytes sent to network: %s (%d)\n", lenout, n, strerror(errno), errno);
+ 	}
++#endif /* AICCU_NETGRAPH */
+ }
+ 
+ bool ayiya(struct TIC_Tunnel *hTunnel)
+@@ -444,9 +452,18 @@ bool ayiya(struct TIC_Tunnel *hTunnel)
+ 	SHA1_Init(&sha1);
+ 	SHA1_Update(&sha1, (const sha1_byte *)hTunnel->sPassword, (unsigned int)strlen(hTunnel->sPassword));
+ 	SHA1_Final(ayiya_hash, &sha1);
++#ifdef AICCU_NETGRAPH
++	if (NgSendMsg(ng_sock.cs, "c", NGM_AYIYA_COOKIE, NGM_AYIYA_SECRETHASH,
++	    ayiya_hash, sizeof(ayiya_hash)) == -1)
++	{
++		dolog(LOG_ERR, "Could not send the secret hash to the Netgraph node: %s (%d)\n",
++		    strerror(errno), errno);
++		return false;
++	}
++#endif
+ 
+ 	/* Setup listening socket */
+-	ayiya_socket = connect_client(hTunnel->sIPv4_POP , AYIYA_PORT, AF_INET, SOCK_DGRAM);
++	ayiya_socket = connect_client(hTunnel->sIPv4_POP , AYIYA_PORT, AF_INET, SOCK_DGRAM, true);
+ 	if (!ayiya_socket)
+ 	{
+ 		ayiya_log(LOG_ERR, "start", NULL, 0, "Connection error:: could not create connection to AYIYA server\n");
+diff --git common/common.c common/common.c
+index 488c145..d3216b8 100755
+--- common/common.c
++++ common/common.c
+@@ -340,13 +340,20 @@ void sock_free(TLSSOCKET sock)
+ }
+ 
+ /* Connect this client to a server */
+-TLSSOCKET connect_client(const char *hostname, const char *service, int family, int socktype)
++TLSSOCKET connect_client(const char *hostname, const char *service, int family, int socktype, bool ng_ayiya)
+ {
+-	TLSSOCKET	sock;
+ 	struct addrinfo	hints, *res, *ressave;
++	TLSSOCKET	sock;
+ 	
+-	sock = sock_alloc();
+-	if (!sock) return NULL;
++#ifndef AICCU_NETGRAPH
++	ng_ayiya = false;
++#endif
++
++	if (!ng_ayiya)
++	{
++		sock = sock_alloc();
++		if (!sock) return NULL;
++	}
+ 
+ 	memset(&hints, 0, sizeof(struct addrinfo));
+ 	hints.ai_family = family;
+@@ -355,28 +362,59 @@ TLSSOCKET connect_client(const char *hostname, const char *service, int family,
+ 	if (getaddrinfo(hostname, service, &hints, &res) != 0)
+ 	{
+ 		dolog(LOG_ERR, "Couldn't resolve host %s, service %s\n", hostname, service);
+-		sock_free(sock);
++		if (!ng_ayiya)
++			sock_free(sock);
+ 		return NULL;
+ 	}
+ 
+ 	ressave = res;
+ 
++	int s = -1;
+ 	while (res)
+ 	{
+-		sock->socket = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
+-		if (sock->socket == -1) continue;
+-		if (connect(sock->socket, res->ai_addr, (unsigned int)res->ai_addrlen) == 0) break;
+-		closesocket(sock->socket);
+-		sock->socket = -1;
++		if (!ng_ayiya)
++		{
++			s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
++		} else {
++			struct ngm_mkpeer m = {
++				.type = "ksocket",
++				.ourhook = "ayiya",
++			};
++			snprintf(m.peerhook, sizeof(m.peerhook), "%d/%d/%d",
++			    res->ai_family, res->ai_socktype, res->ai_protocol);
++			s = NgSendMsg(ng_sock.cs, "c", NGM_GENERIC_COOKIE, NGM_MKPEER,
++			    &m, sizeof(m));
++		}
++		if (s == -1) continue;
++
++		int r;
++		if (!ng_ayiya)
++			r = connect(s, res->ai_addr, (unsigned int)res->ai_addrlen);
++		else
++			r = NgSendMsg(ng_sock.cs, "c.ayiya", NGM_KSOCKET_COOKIE,
++			    NGM_KSOCKET_CONNECT, res->ai_addr, res->ai_addrlen) == -1;
++		if (r == 0) break;
++		if (!ng_ayiya)
++			closesocket(s);
++		else if (NgSendMsg(ng_sock.cs, "c.ayiya", NGM_GENERIC_COOKIE,
++		    NGM_SHUTDOWN, NULL, 0) == -1)
++			dolog(LOG_ERR, "Could not shut down the ksocket node: %s (%d)\n",
++			    ng_node_name, strerror(errno), errno);
++		s = -1;
+ 		res = res->ai_next;
+ 	}
+ 
+ 	freeaddrinfo(ressave);
+ 	
+-	if (sock->socket == -1)
++	if (ng_ayiya)
++		return (TLSSOCKET)(s != -1);
++
++	if (s == -1)
+ 	{
+ 		sock_free(sock);
+ 		sock = NULL;
++	} else {
++		sock->socket = s;
+ 	}
+ 
+ 	return sock;
+diff --git common/common.h common/common.h
+index 575d854..6982331 100755
+--- common/common.h
++++ common/common.h
+@@ -398,7 +398,7 @@ void vsyslog(int priority, const char *format, va_list ap);
+ /* Networking functions */
+ void sock_printf(TLSSOCKET sock, const char *fmt, ...);
+ int sock_getline(TLSSOCKET sock, char *rbuf, unsigned int rbuflen, unsigned int *filled, char *ubuf, unsigned int ubuflen);
+-TLSSOCKET connect_client(const char *hostname, const char *service, int family, int socktype);
++TLSSOCKET connect_client(const char *hostname, const char *service, int family, int socktype, bool ng_ayiya);
+ TLSSOCKET listen_server(const char *description, const char *hostname, const char *service, int family, int socktype);
+ void sock_free(TLSSOCKET sock);
+ #ifdef AICCU_GNUTLS
+diff --git common/tic.c common/tic.c
+index e0d70fe..8292a0a 100755
+--- common/tic.c
++++ common/tic.c
+@@ -76,7 +76,7 @@ bool tic_Login(struct TIC_conf *tic, const char *username, const char *password,
+ 	D(dolog(LOG_DEBUG, "Trying to connect to TIC server %s\n", server));
+ 
+ 	/* Connect to the TIC server */
+-	tic->sock = connect_client(server, TIC_PORT, AF_INET, SOCK_STREAM);
++	tic->sock = connect_client(server, TIC_PORT, AF_INET, SOCK_STREAM, false);
+ 	if (!tic->sock)
+ 	{
+ 		dolog(LOG_ERR, "Couldn't connect to the TIC server %s\n", server);
+diff --git common/tun.c common/tun.c
+index c5b6323..b4fa558 100755
+--- common/tun.c
++++ common/tun.c
+@@ -48,6 +48,11 @@ struct ether_header
+ 
+ #endif
+ 
++#ifdef AICCU_NETGRAPH
++struct ng_connection_sock ng_sock = { .cs = -1, .ds = -1 };
++char ng_node_name[NG_NODESIZ];
++#endif
++
+ void tun_log(int level, const char *what, const char *fmt, ...);
+ void tun_log(int level, const char *what, const char *fmt, ...)
+ {
+@@ -68,8 +73,10 @@ void tun_log(int level, const char *what, const char *fmt, ...)
+ 	dolog(level, buf);
+ }
+ 
++#ifndef AICCU_NETGRAPH
+ static const char reader_name[] = "tundev->tun";
+ static const char writer_name[] = "tun->tundev";
++#endif
+ 
+ #ifdef _WIN32
+ /* Windows doesn't have writev() but does have WSASend */
+@@ -148,6 +155,10 @@ DWORD WINAPI tun_reader(LPVOID arg);
+ DWORD WINAPI tun_reader(LPVOID arg)
+ #endif
+ {
++#ifdef AICCU_NETGRAPH
++	/* Nothing to do; the Netgraph node handles everything. */
++	(void)arg;
++#else
+ 	unsigned char		buf[2048];
+ 
+ 	/* The function that actually does something with the buffer */
+@@ -269,6 +280,7 @@ DWORD WINAPI tun_reader(LPVOID arg)
+ 		tun->function((char *)&buf[sizeof(struct ether)], (unsigned int)lenin - sizeof(struct ether));
+ #endif
+ 	}
++#endif /* AICCU_NETGRAPH */
+ 
+ 	D(dolog(LOG_DEBUG, "TUN Reader stopping\n"));
+ #ifndef _WIN32
+@@ -278,6 +290,7 @@ DWORD WINAPI tun_reader(LPVOID arg)
+ #endif
+ }
+ 
++#ifndef AICCU_NETGRAPH
+ /* Socket -> Tun */
+ void tun_write(char *buf, unsigned int length)
+ {
+@@ -357,6 +370,7 @@ void tun_write(char *buf, unsigned int length)
+ 	}
+ #endif
+ }
++#endif
+ 
+ #ifdef _WIN32
+ 
+@@ -687,6 +701,105 @@ bool tun_fixup_adapters(void)
+ 
+ #endif
+ 
++#ifdef AICCU_NETGRAPH
++static void
++tun_ng_disconnect(void)
++{
++	close(ng_sock.ds);
++	ng_sock.ds = -1;
++	close(ng_sock.cs);
++	ng_sock.cs = -1;
++}
++
++bool
++tun_ng_connect(const char *what, bool disconnect)
++{
++	if (ng_sock.cs != -1 || ng_sock.ds != -1)
++	{
++		if (disconnect)
++		{
++			tun_ng_disconnect();
++		} else {
++			tun_log(LOG_ERR, what, "The Netgraph socket seems to be already initialized\n");
++			return false;
++		}
++	}
++	if (ng_node_name[0] == '\0')
++	{
++		tun_log(LOG_ERR, what, "Internal error: the Netgraph node name has not been initialized\n");
++		return false;
++	}
++
++	char name[NG_NODESIZ];
++	snprintf(name, sizeof(name), "%s_%s_%ld",
++	    ng_node_name, what, (long)getpid());
++	if (NgMkSockNode(name, &ng_sock.cs, &ng_sock.ds) == -1)
++	{
++		tun_log(LOG_ERR, what, "Could not create the Netgraph socket node: %s (%d)\n",
++			strerror(errno), errno);
++		return false;
++	}
++	return true;
++}
++
++static bool
++tun_ng_shutdown_node(const char *what, const char *hook)
++{
++	char path[NG_PATHSIZ];
++
++	snprintf(path, sizeof(path), "%s:%s", ng_node_name, hook);
++	if (NgSendMsg(ng_sock.cs, path, NGM_GENERIC_COOKIE, NGM_SHUTDOWN,
++	    NULL, 0) == -1 && errno != ENOENT)
++	{
++		tun_log(LOG_ERR, what, "Could not shut down the %s Netgraph node: %s (%d)\n",
++		    path, strerror(errno), errno);
++		return false;
++	}
++	return true;
++}
++
++bool
++tun_ng_shutdown(const char *what, bool self)
++{
++	if (!tun_ng_shutdown_node(what, "ayiya") ||
++	    !tun_ng_shutdown_node(what, "inet6") ||
++	    self && !tun_ng_shutdown_node(what, ""))
++		return false;
++
++	if (self)
++		tun_ng_disconnect();
++	return true;
++}
++
++bool
++ng_get_msg_response(const char *what, void *buf, size_t size)
++{
++	static char ng_path[NG_PATHSIZ];
++	static struct {
++		struct ng_mesg msg;
++		char data[8192];
++	} __attribute__((packed)) ng_buf;
++
++	int len = NgRecvMsg(ng_sock.cs, &ng_buf.msg, sizeof(ng_buf), ng_path);
++	size_t expected = sizeof(ng_buf.msg) + size;
++	if (len < 0)
++	{
++		dolog(LOG_ERR, "Could not get the %s Netgraph response: %s (%d)\n",
++		    what, strerror(errno), errno);
++		return false;
++	}
++	else if ((size_t)len < expected)
++	{
++		dolog(LOG_ERR, "Received a short %s Netgraph response (%d out of %u bytes)\n",
++		    what, len, errno);
++		return false;
++	}
++	len -= sizeof(ng_buf.msg);
++	memcpy(buf, ng_buf.data, size);
++	return true;
++}
++#endif
++
+ bool tun_start(struct tun_reader *tun)
+ {
+ #ifndef _WIN32
+@@ -716,6 +829,82 @@ bool tun_start(struct tun_reader *tun)
+ 	}
+ 
+ #else /* *BSD/Darwin */
++#ifdef AICCU_NETGRAPH
++	if (!tun_ng_connect("start", false))
++		return false;
++
++	struct ngm_connect c = {
++		.ourhook = "c",
++		.peerhook = "control",
++	};
++	snprintf(c.path, sizeof(c.path), "%s:", ng_node_name);
++	if (NgSendMsg(ng_sock.cs, ".", NGM_GENERIC_COOKIE, NGM_CONNECT,
++	    &c, sizeof(c)) == -1) {
++		if (errno == ENOENT) {
++			tun_log(LOG_DEBUG, "start", "About to create the '%s' Netgraph node\n",
++			    ng_node_name);
++			struct ngm_mkpeer m = {
++				.type = "ayiya",
++				.ourhook = "c",
++				.peerhook = "control",
++			};
++			if (NgSendMsg(ng_sock.cs, ".", NGM_GENERIC_COOKIE,
++			    NGM_MKPEER, &m, sizeof(m)) == -1)
++			{
++				tun_log(LOG_ERR, "start", "Could not create a '%s' Netgraph node: %s (%s)\n",
++				    m.type, strerror(errno), errno);
++				return false;
++			}
++
++			if (NgNameNode(ng_sock.cs, "c", "%s", ng_node_name) == -1)
++			{
++				tun_log(LOG_ERR, "start", "Could not set the Netgraph node's name to '%s': %s (%d)\n",
++				    ng_node_name, strerror(errno), errno);
++				return false;
++			}
++		} else if (errno == EEXIST) {
++			tun_log(LOG_ERR, "start", "Something is already connected to the '%s' Netgraph node's '%s' hook\n",
++			    ng_node_name, c.peerhook);
++			return false;
++		} else {
++			tun_log(LOG_ERR, "start", "Could not connect to the '%s' hook of the '%s' Netgraph node: %s (%d)\n",
++			    c.peerhook, ng_node_name, strerror(errno), errno);
++			return false;
++		}
++	} else {
++		tun_log(LOG_DEBUG, "start", "Connected to the %s Netgraph node\n",
++		    ng_node_name);
++	}
++
++	if (!tun_ng_shutdown("start", false))
++		return false;
++
++	struct ngm_mkpeer m = {
++		.type = "iface",
++		.ourhook = "inet6",
++		.peerhook = "inet6",
++	};
++	if (NgSendMsg(ng_sock.cs, "c", NGM_GENERIC_COOKIE, NGM_MKPEER,
++	    &m, sizeof(m)) == -1)
++	{
++		tun_log(LOG_ERR, "start", "Could not create a '%s' Netgraph node: %s (%s)\n",
++		    m.type, strerror(errno), errno);
++		return false;
++	}
++	if (NgSendMsg(ng_sock.cs, "c.inet6", NGM_GENERIC_COOKIE, NGM_NODEINFO,
++	    NULL, 0) == -1)
++	{
++		tun_log(LOG_ERR, "start", "Could not query the '%s' Netgraph node's name: %s (%d)\n",
++		    m.type, strerror(errno), errno);
++		return false;
++	}
++	struct nodeinfo inf;
++	if (!ng_get_msg_response("nodeinfo", &inf, sizeof(inf)))
++		return false;
++	tun_log(LOG_DEBUG, "start", "Got Netgraph interface node info: name '%s' type '%s' id '%lld' hooks %u\n", inf.name, inf.type, (long long)inf.id, inf.hooks);
++	if (g_aiccu->ipv6_interface) free(g_aiccu->ipv6_interface);
++	g_aiccu->ipv6_interface = strdup(inf.name);
++#else
+ 
+ 	char		buf[128];
+ 	unsigned int	i;
+@@ -781,6 +970,7 @@ bool tun_start(struct tun_reader *tun)
+ 	}
+ #endif
+ 
++#endif /* AICCU_NETGRAPH */
+ #endif /* linux */
+ 
+ 
+diff --git unix-console/Makefile unix-console/Makefile
+index d5e5c07..a661111 100755
+--- unix-console/Makefile
++++ unix-console/Makefile
+@@ -34,6 +34,11 @@ ifeq ($(shell echo $(CFLAGS) | grep -c "\-O"),0)
+ CFLAGS	+= -O3
+ endif
+ 
++# Link with the Netgraph library if needed
++ifneq ($(shell echo $(CFLAGS) | grep -c "\-DAICCU_NETGRAPH"),0)
++LDFLAGS	+= -lnetgraph
++endif
++
+ # This is a console client
+ CFLAGS	+= -D AICCU_CONSOLE
+ 
+diff --git unix-console/main.c unix-console/main.c
+index 8a4d9a9..527868f 100755
+--- unix-console/main.c
++++ unix-console/main.c
+@@ -348,6 +348,11 @@ int main(int argc, char *argv[])
+ 	tic_Logout(g_aiccu->tic, NULL);
+ 	g_aiccu->tic = NULL;
+ 
++#ifdef AICCU_NETGRAPH
++	snprintf(ng_node_name, sizeof(ng_node_name), "aiccu_%s", hTunnel->sId);
++	dolog(LOG_DEBUG, "Using Netgraph node name %s\n", ng_node_name);
++#endif
++
+ 	if (g_aiccu->verbose)
+ 	{
+ 		printf("Tunnel Information for %s:\n",hTunnel->sId);
+-- 
+2.4.6
+


More information about the svn-soc-all mailing list