socsvn commit: r287329 - soc2015/roam/ng_ayiya
roam at FreeBSD.org
roam at FreeBSD.org
Fri Jun 19 15:28:22 UTC 2015
Author: roam
Date: Fri Jun 19 15:28:21 2015
New Revision: 287329
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=287329
Log:
Configure with AYIYA, send a heartbeat packet.
Move the configuration after the AYIYA socket has been connected, and
as the last part of the configuration, send an AYIYA heartbeat packet.
ObQuote: "Is there anybody out there?"
Modified:
soc2015/roam/ng_ayiya/ng_ayiya.c
soc2015/roam/ng_ayiya/scaffold.pl
Modified: soc2015/roam/ng_ayiya/ng_ayiya.c
==============================================================================
--- soc2015/roam/ng_ayiya/ng_ayiya.c Fri Jun 19 15:28:18 2015 (r287328)
+++ soc2015/roam/ng_ayiya/ng_ayiya.c Fri Jun 19 15:28:21 2015 (r287329)
@@ -123,6 +123,8 @@
};
typedef struct ng_ayiya_private *priv_p;
+static int send_heartbeat(const node_p node);
+
static int
ng_ayiya_constructor(const node_p node)
{
@@ -279,7 +281,8 @@
{
const priv_p priv = NG_NODE_PRIVATE(node);
if (msg->header.arglen != 0 || priv->configured ||
- !priv->hooks[AYIYA_HOOK_INET6])
+ !priv->hooks[AYIYA_HOOK_INET6] ||
+ !priv->hooks[AYIYA_HOOK_AYIYA])
ERROUT(EINVAL);
if (priv->configuring)
ERROUT(EINPROGRESS);
@@ -337,7 +340,13 @@
}
if_rele(ifp);
- configuring_respond(node, found? 0: ENOENT);
+ if (!found) {
+ configuring_respond(node, ENOENT);
+ break;
+ }
+
+ configuring_respond(node, 0);
+ send_heartbeat(node);
break;
}
@@ -393,7 +402,8 @@
if (idx == AYIYA_HOOK_LAST)
panic("%s", __func__);
priv->hooks[idx] = NULL;
- if (priv->configuring && idx == AYIYA_HOOK_INET6)
+ if (priv->configuring &&
+ (idx == AYIYA_HOOK_INET6 || idx == AYIYA_HOOK_AYIYA))
configuring_respond(node, ECONNABORTED);
return (0);
}
@@ -433,7 +443,21 @@
{
struct mbuf *m = *mb;
- M_PREPEND(m, sizeof(struct ng_ayiya_packet), M_NOWAIT);
+ if (m == NULL) {
+ size_t left = sizeof(struct ng_ayiya_packet);
+ m = m_getm2(NULL, left, M_NOWAIT, MT_DATA, M_PKTHDR);
+ if (m == NULL)
+ return (ENOMEM);
+ for (struct mbuf *mm = m; mm != NULL && left > 0; mm = mm->m_next)
+ {
+ const size_t len = min(M_TRAILINGSPACE(mm), left);
+ mm->m_len = len;
+ m->m_pkthdr.len += len;
+ left -= len;
+ }
+ } else {
+ M_PREPEND(m, sizeof(struct ng_ayiya_packet), M_NOWAIT);
+ }
if (m->m_next)
m = m_defrag(m, M_NOWAIT);
if (m == NULL)
@@ -569,6 +593,20 @@
}
static int
+send_heartbeat(const node_p node)
+{
+ const priv_p priv = NG_NODE_PRIVATE(node);
+
+ struct mbuf *m = NULL;
+ int error = ayiya_build(&m, 0, IPPROTO_NONE, priv);
+ if (error != 0)
+ return (error);
+
+ NG_SEND_DATA_ONLY(error, priv->hooks[AYIYA_HOOK_AYIYA], m);
+ return (error);
+}
+
+static int
ng_ayiya_rcvdata(const hook_p hook, const item_p item)
{
const priv_p priv = NG_NODE_PRIVATE(NG_HOOK_NODE(hook));
@@ -581,7 +619,7 @@
switch (hidx) {
case AYIYA_HOOK_INET6:
{
- if (!priv->configured || priv->hooks[AYIYA_HOOK_AYIYA] == NULL)
+ if (!priv->configured)
{
/* FIXME: enqueue the packet? */
m_freem(m);
Modified: soc2015/roam/ng_ayiya/scaffold.pl
==============================================================================
--- soc2015/roam/ng_ayiya/scaffold.pl Fri Jun 19 15:28:18 2015 (r287328)
+++ soc2015/roam/ng_ayiya/scaffold.pl Fri Jun 19 15:28:21 2015 (r287329)
@@ -420,9 +420,6 @@
run_command 'ifconfig', $iface, 'inet6', $t->ipv6_local;
# FIXME: Add a default route here, too.
-
- debug "Trying to get the node to configure itself";
- ngctl 'msg', "$c->{name}:", 'configure';
}
sub get_tic_tunnel($)
@@ -499,5 +496,7 @@
die "Could not query the newly-created ng_ksocket node\n";
}
ngctl 'msg', "$pname:", 'connect', 'inet/'.$t->ipv4_pop.':5072';
- ...;
+
+ debug "Trying to get the node to configure itself";
+ ngctl 'msg', "$c->{name}:", 'configure';
}
More information about the svn-soc-all
mailing list