diff options
author | Archie Cobbs <archie@FreeBSD.org> | 1999-11-19 05:49:54 +0000 |
---|---|---|
committer | Archie Cobbs <archie@FreeBSD.org> | 1999-11-19 05:49:54 +0000 |
commit | 62838fae89bb09d966b5e345bb7039d63458c251 (patch) | |
tree | e6987aff15b4ec9cd89b24f971b60e940a08667d /sys/netgraph/ng_ppp.c | |
parent | da0929306d46257160a42bb81b33f80560969f6f (diff) | |
download | src-62838fae89bb09d966b5e345bb7039d63458c251.tar.gz src-62838fae89bb09d966b5e345bb7039d63458c251.zip |
Fix bug where hook pointers were not getting updated on disconnection.
Notes
Notes:
svn path=/head/; revision=53406
Diffstat (limited to 'sys/netgraph/ng_ppp.c')
-rw-r--r-- | sys/netgraph/ng_ppp.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/sys/netgraph/ng_ppp.c b/sys/netgraph/ng_ppp.c index b488889638f3..169e65bd0bc7 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); |