diff options
| author | Julian Elischer <julian@FreeBSD.org> | 2004-05-29 07:21:46 +0000 |
|---|---|---|
| committer | Julian Elischer <julian@FreeBSD.org> | 2004-05-29 07:21:46 +0000 |
| commit | 991fc65a92691d0d81c3dfda275dc949b6c8dc5b (patch) | |
| tree | 67609d746180f3ac3b3714e8dcaba00a354b8f02 /sys/netgraph | |
| parent | 3eb483729e9089d374f01cbfb4d96c67a72262b4 (diff) | |
Notes
Diffstat (limited to 'sys/netgraph')
| -rw-r--r-- | sys/netgraph/netgraph.h | 5 | ||||
| -rw-r--r-- | sys/netgraph/ng_base.c | 5 | ||||
| -rw-r--r-- | sys/netgraph/ng_tee.c | 28 |
3 files changed, 28 insertions, 10 deletions
diff --git a/sys/netgraph/netgraph.h b/sys/netgraph/netgraph.h index 8981836cd2ed..99adc60d0da4 100644 --- a/sys/netgraph/netgraph.h +++ b/sys/netgraph/netgraph.h @@ -62,7 +62,7 @@ * Change it for NETGRAPH_DEBUG version so we cannot mix debug and non debug * modules. */ -#define _NG_ABI_VERSION 7 +#define _NG_ABI_VERSION 8 #ifdef NETGRAPH_DEBUG /*----------------------------------------------*/ #define NG_ABI_VERSION (_NG_ABI_VERSION + 0x10000) #else /* NETGRAPH_DEBUG */ /*----------------------------------------------*/ @@ -83,6 +83,7 @@ typedef struct ng_hook *hook_p; /* 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 @@ struct ng_type { 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 @@ SYSCTL_DECL(_net_graph); 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 --git a/sys/netgraph/ng_base.c b/sys/netgraph/ng_base.c index 878ec8853c3a..d3acc0173796 100644 --- a/sys/netgraph/ng_base.c +++ b/sys/netgraph/ng_base.c @@ -199,7 +199,6 @@ static int ng_mkpeer(node_p node, const char *name, 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, @@ -694,6 +693,10 @@ ng_rmnode(node_p node, hook_p dummy1, void *dummy2, int dummy3) */ 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) ng_destroy_hook(hook); diff --git a/sys/netgraph/ng_tee.c b/sys/netgraph/ng_tee.c index 1f6fb9a57386..d7d19d595de6 100644 --- a/sys/netgraph/ng_tee.c +++ b/sys/netgraph/ng_tee.c @@ -79,6 +79,7 @@ typedef struct privdata *sc_p; /* 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 @@ static struct ng_type ng_tee_typestruct = { .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 @@ ngt_rcvdata(hook_p hook, item_p item) } /* - * 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) |
