shutdown node VS disconnect all hooks
Gleb Smirnoff
glebius at cell.sick.ru
Fri May 28 11:09:40 GMT 2004
On Fri, May 28, 2004 at 01:31:09AM -0700, Julian Elischer wrote:
J> It'd be best to make the change to sparse initialisers a separate patch
J> that I cold commit separatly,
J> so reduce teh size of the functionality change patch.
And here is next patch, that must be applied after c99-patch. It introduces
a pre-shutdown method - ng_close_t. And it makes ng_tee behave exactly the
way it does in STABLE.
--
Totus tuus, Glebius.
GLEBIUS-RIPN GLEB-RIPE
-------------- next part --------------
diff -ur netgraph.c99/netgraph.h netgraph/netgraph.h
--- netgraph.c99/netgraph.h Fri May 28 14:12:30 2004
+++ netgraph/netgraph.h Fri May 28 15:05:48 2004
@@ -83,6 +83,7 @@
/* node method definitions */
typedef int ng_constructor_t(node_p node);
+typedef int ng_close_t(node_p node);
typedef int ng_shutdown_t(node_p node);
typedef int ng_newhook_t(node_p node, hook_p hook, const char *name);
typedef hook_p ng_findhook_t(node_p node, const char *name);
@@ -1052,6 +1053,7 @@
modeventhand_t mod_event; /* Module event handler (optional) */
ng_constructor_t *constructor; /* Node constructor */
ng_rcvmsg_t *rcvmsg; /* control messages come here */
+ ng_close_t *close; /* warn about forthcoming shutdown */
ng_shutdown_t *shutdown; /* reset, and free resources */
ng_newhook_t *newhook; /* first notification of new hook */
ng_findhook_t *findhook; /* only if you have lots of hooks */
@@ -1112,6 +1114,7 @@
int ng_address_ID(node_p here, item_p item, ng_ID_t ID, ng_ID_t retaddr);
int ng_address_hook(node_p here, item_p item, hook_p hook, ng_ID_t retaddr);
int ng_address_path(node_p here, item_p item, char *address, ng_ID_t raddr);
+int ng_bypass(hook_p hook1, hook_p hook2);
meta_p ng_copy_meta(meta_p meta);
hook_p ng_findhook(node_p node, const char *name);
int ng_make_node_common(struct ng_type *typep, node_p *nodep);
diff -ur netgraph.c99/ng_base.c netgraph/ng_base.c
--- netgraph.c99/ng_base.c Fri May 28 14:12:30 2004
+++ netgraph/ng_base.c Fri May 28 14:29:28 2004
@@ -199,7 +199,6 @@
const char *name2, char *type);
/* imported , these used to be externally visible, some may go back */
-int ng_bypass(hook_p hook1, hook_p hook2);
void ng_destroy_hook(hook_p hook);
node_p ng_name2noderef(node_p node, const char *name);
int ng_path2noderef(node_p here, const char *path,
@@ -693,6 +692,10 @@
* creation
*/
node->nd_flags |= NG_INVALID|NG_CLOSING;
+
+ /* If node has its pre-shutdown method, then call it first*/
+ if (node->nd_type && node->nd_type->close)
+ (*node->nd_type->close)(node);
/* Notify all remaining connected nodes to disconnect */
while ((hook = LIST_FIRST(&node->nd_hooks)) != NULL)
diff -ur netgraph.c99/ng_tee.c netgraph/ng_tee.c
--- netgraph.c99/ng_tee.c Fri May 28 14:12:30 2004
+++ netgraph/ng_tee.c Fri May 28 14:17:20 2004
@@ -79,6 +79,7 @@
/* Netgraph methods */
static ng_constructor_t ngt_constructor;
static ng_rcvmsg_t ngt_rcvmsg;
+static ng_close_t ngt_close;
static ng_shutdown_t ngt_shutdown;
static ng_newhook_t ngt_newhook;
static ng_rcvdata_t ngt_rcvdata;
@@ -132,6 +133,7 @@
.name = NG_TEE_NODE_TYPE,
.constructor = ngt_constructor,
.rcvmsg = ngt_rcvmsg,
+ .close = ngt_close,
.shutdown = ngt_shutdown,
.newhook = ngt_newhook,
.rcvdata = ngt_rcvdata,
@@ -358,15 +360,25 @@
}
/*
- * Shutdown processing
- *
- * This is tricky. If we have both a left and right hook, then we
- * probably want to extricate ourselves and leave the two peers
- * still linked to each other. Otherwise we should just shut down as
- * a normal node would.
+ * We are going to be shut down soon
*
- * To keep the scope of info correct the routine to "extract" a node
- * from two links is in ng_base.c.
+ * If we have both a left and right hook, then we probably want to extricate
+ * ourselves and leave the two peers still linked to each other. Otherwise we
+ * should just shut down as a normal node would.
+ */
+static int
+ngt_close(node_p node)
+{
+ const sc_p privdata = NG_NODE_PRIVATE(node);
+
+ if (privdata->left.hook && privdata->right.hook)
+ ng_bypass(privdata->left.hook, privdata->right.hook);
+
+ return (0);
+}
+
+/*
+ * Shutdown processing
*/
static int
ngt_shutdown(node_p node)
More information about the freebsd-net
mailing list