summaryrefslogtreecommitdiffstats
path: root/sys/net80211/ieee80211.c
diff options
context:
space:
mode:
authorsam <sam@FreeBSD.org>2009-08-12 21:19:19 +0000
committersam <sam@FreeBSD.org>2009-08-12 21:19:19 +0000
commit3fb9b6ababe4a47f0dd1a506016213fd139feb1c (patch)
treebe8f003dafff32e26fd7676380173bfb06766acd /sys/net80211/ieee80211.c
parent6fe9bef8170faf24982d3b78ebcc890b3509e439 (diff)
downloadFreeBSD-src-3fb9b6ababe4a47f0dd1a506016213fd139feb1c.zip
FreeBSD-src-3fb9b6ababe4a47f0dd1a506016213fd139feb1c.tar.gz
Drain link state event changes posted during vap destroy. This is a
band-aid for the general problem that if_link_state_change can be called between if_detach and if_free leaving a task queued that has been free'd. Spotted by: thompsa Reviewed by: rwatson Approved by: re (rwatson)
Diffstat (limited to 'sys/net80211/ieee80211.c')
-rw-r--r--sys/net80211/ieee80211.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/sys/net80211/ieee80211.c b/sys/net80211/ieee80211.c
index 081c6db..b14f13f 100644
--- a/sys/net80211/ieee80211.c
+++ b/sys/net80211/ieee80211.c
@@ -573,11 +573,13 @@ ieee80211_vap_detach(struct ieee80211vap *vap)
/*
* Flush any deferred vap tasks.
- * NB: must be before ether_ifdetach() and removal from ic_vaps list
*/
ieee80211_draintask(ic, &vap->iv_nstate_task);
ieee80211_draintask(ic, &vap->iv_swbmiss_task);
+ /* XXX band-aid until ifnet handles this for us */
+ taskqueue_drain(taskqueue_swi, &ifp->if_linktask);
+
IEEE80211_LOCK(ic);
KASSERT(vap->iv_state == IEEE80211_S_INIT , ("vap still running"));
TAILQ_REMOVE(&ic->ic_vaps, vap, iv_next);
OpenPOWER on IntegriCloud