From fa49e42d18a01013c958b6f08789a6ec7c4a02d0 Mon Sep 17 00:00:00 2001 From: archie Date: Fri, 19 Nov 1999 05:49:54 +0000 Subject: Fix bug where hook pointers were not getting updated on disconnection. --- sys/netgraph/ng_ppp.c | 22 ++++++++++++++++++---- sys/netgraph/ng_vjc.c | 24 ++++++++++++++++++++---- 2 files changed, 38 insertions(+), 8 deletions(-) (limited to 'sys') diff --git a/sys/netgraph/ng_ppp.c b/sys/netgraph/ng_ppp.c index b488889..169e65b 100644 --- a/sys/netgraph/ng_ppp.c +++ b/sys/netgraph/ng_ppp.c @@ -162,7 +162,7 @@ static const char *const ng_ppp_hook_names[] = { #define HOOK_INDEX(hook) (*((int16_t *) &(hook)->private)) /* Node private data */ -struct private { +struct ng_ppp_private { struct ng_ppp_node_config conf; struct ng_ppp_link_stat bundleStats; struct ng_ppp_link_stat linkStats[NG_PPP_MAX_LINKS]; @@ -178,7 +178,7 @@ struct private { frags; /* incoming fragments */ int mpSeqOut; /* next out MP seq # */ }; -typedef struct private *priv_p; +typedef struct ng_ppp_private *priv_p; /* Netgraph node methods */ static ng_constructor_t ng_ppp_constructor; @@ -625,7 +625,20 @@ ng_ppp_rmnode(node_p node) static int ng_ppp_disconnect(hook_p hook) { - if (hook->node->numhooks == 0) + const node_p node = hook->node; + const priv_p priv = node->private; + const int index = HOOK_INDEX(hook); + + /* Zero out hook pointer */ + if (index < 0) + priv->links[~index] = NULL; + else + priv->hooks[index] = NULL; + + /* Update derived info (or go away if no hooks left) */ + if (node->numhooks > 0) + ng_ppp_update(node, 0); + else ng_rmnode(hook->node); return (0); } @@ -1062,7 +1075,8 @@ deliver: meta2 = meta; /* Send fragment */ - error = ng_ppp_output(node, 0, PROT_MP, linkNum, m2, meta2); + error = ng_ppp_output(node, 0, + PROT_MP, linkNum, m2, meta2); if (error != 0) { if (!lastFragment) NG_FREE_DATA(m, meta); diff --git a/sys/netgraph/ng_vjc.c b/sys/netgraph/ng_vjc.c index 874a5bf..db96f1c 100644 --- a/sys/netgraph/ng_vjc.c +++ b/sys/netgraph/ng_vjc.c @@ -76,7 +76,7 @@ #define MAX_VJHEADER 19 /* Node private data */ -struct private { +struct ng_vjc_private { struct ngm_vjc_config conf; struct slcompress slc; hook_p ip; @@ -84,7 +84,7 @@ struct private { hook_p vjuncomp; hook_p vjip; }; -typedef struct private *priv_p; +typedef struct ng_vjc_private *priv_p; #define ERROUT(x) do { error = (x); goto done; } while (0) @@ -414,8 +414,24 @@ ng_vjc_rmnode(node_p node) static int ng_vjc_disconnect(hook_p hook) { - if (hook->node->numhooks == 0) - ng_rmnode(hook->node); + const node_p node = hook->node; + const priv_p priv = node->private; + + /* Zero out hook pointer */ + if (hook == priv->ip) + priv->ip = NULL; + else if (hook == priv->vjcomp) + priv->vjcomp = NULL; + else if (hook == priv->vjuncomp) + priv->vjuncomp = NULL; + else if (hook == priv->vjip) + priv->vjip = NULL; + else + panic("%s: unknown hook", __FUNCTION__); + + /* Go away if no hooks left */ + if (node->numhooks == 0) + ng_rmnode(node); return (0); } -- cgit v1.1