summaryrefslogtreecommitdiffstats
path: root/sys/net80211/ieee80211_node.c
diff options
context:
space:
mode:
authorsam <sam@FreeBSD.org>2005-07-06 01:51:44 +0000
committersam <sam@FreeBSD.org>2005-07-06 01:51:44 +0000
commit42be4e8353aebfc3cf73c7001101f6addf2df279 (patch)
tree8fb1a3a6f93825235c6f6e42b500f71674b41489 /sys/net80211/ieee80211_node.c
parent9fb6cc8fde85360ec292c60cb811ea4c9bbd701f (diff)
downloadFreeBSD-src-42be4e8353aebfc3cf73c7001101f6addf2df279.zip
FreeBSD-src-42be4e8353aebfc3cf73c7001101f6addf2df279.tar.gz
Fix race condition in handling node reference counts for authenticating
stations in ap mode. Track when a node's first auth frame is received and use this to decide whether or not to bump the refcnt. This insures we only ever bump the refcnt once. Reviewed by: avatar Approved by: re (scottl)
Diffstat (limited to 'sys/net80211/ieee80211_node.c')
-rw-r--r--sys/net80211/ieee80211_node.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/sys/net80211/ieee80211_node.c b/sys/net80211/ieee80211_node.c
index 3811f99..b085855 100644
--- a/sys/net80211/ieee80211_node.c
+++ b/sys/net80211/ieee80211_node.c
@@ -850,6 +850,13 @@ node_cleanup(struct ieee80211_node *ni)
"[%s] power save mode off, %u sta's in ps mode\n",
ether_sprintf(ni->ni_macaddr), ic->ic_ps_sta);
}
+ /*
+ * Clear AREF flag that marks the authorization refcnt bump
+ * has happened. This is probably not needed as the node
+ * should always be removed from the table so not found but
+ * do it just in case.
+ */
+ ni->ni_flags &= ~IEEE80211_NODE_AREF;
/*
* Drain power save queue and, if needed, clear TIM.
@@ -1397,6 +1404,14 @@ restart:
continue;
ni->ni_scangen = gen;
/*
+ * Ignore entries for which have yet to receive an
+ * authentication frame. These are transient and
+ * will be reclaimed when the last reference to them
+ * goes away (when frame xmits complete).
+ */
+ if ((ni->ni_flags & IEEE80211_NODE_AREF) == 0)
+ continue;
+ /*
* Free fragment if not needed anymore
* (last fragment older than 1s).
* XXX doesn't belong here
OpenPOWER on IntegriCloud