summaryrefslogtreecommitdiffstats
path: root/sys/netgraph/ng_ppp.c
diff options
context:
space:
mode:
authorarchie <archie@FreeBSD.org>1999-11-19 05:49:54 +0000
committerarchie <archie@FreeBSD.org>1999-11-19 05:49:54 +0000
commitfa49e42d18a01013c958b6f08789a6ec7c4a02d0 (patch)
treee6987aff15b4ec9cd89b24f971b60e940a08667d /sys/netgraph/ng_ppp.c
parent1a2092dbb86a07bd10d1ecff15779422a950511c (diff)
downloadFreeBSD-src-fa49e42d18a01013c958b6f08789a6ec7c4a02d0.zip
FreeBSD-src-fa49e42d18a01013c958b6f08789a6ec7c4a02d0.tar.gz
Fix bug where hook pointers were not getting updated on disconnection.
Diffstat (limited to 'sys/netgraph/ng_ppp.c')
-rw-r--r--sys/netgraph/ng_ppp.c22
1 files changed, 18 insertions, 4 deletions
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);
OpenPOWER on IntegriCloud