madwifi: fix race condition triggered by active split wds sta interfaces during vap delete

SVN-Revision: 12052
This commit is contained in:
Felix Fietkau 2008-07-31 22:41:31 +00:00
parent d298a4a411
commit 60f834421c

View file

@ -150,6 +150,37 @@
#ifdef ATH_REVERSE_ENGINEERING
/*
@@ -5890,6 +5905,8 @@
ieee80211_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
{
struct ieee80211vap *vap = dev->priv;
+ struct ieee80211com *ic = vap->iv_ic;
+ struct ieee80211_node *ni;
switch (cmd) {
case SIOCG80211STATS:
@@ -5898,8 +5915,20 @@
case SIOC80211IFDESTROY:
if (!capable(CAP_NET_ADMIN))
return -EPERM;
+ /* drop all node subifs */
+ TAILQ_FOREACH(ni, &ic->ic_sta.nt_node, ni_list) {
+ struct ieee80211vap *avp = ni->ni_subif;
+
+ if (ni->ni_vap != vap)
+ continue;
+ if (!avp)
+ continue;
+ ni->ni_subif = NULL;
+ ieee80211_stop(avp->iv_dev);
+ ic->ic_vap_delete(avp);
+ }
ieee80211_stop(vap->iv_dev); /* force state before cleanup */
- vap->iv_ic->ic_vap_delete(vap);
+ ic->ic_vap_delete(vap);
return 0;
case IEEE80211_IOCTL_GETKEY:
return ieee80211_ioctl_getkey(dev, (struct iwreq *) ifr);
--- a/net80211/ieee80211_node.c
+++ b/net80211/ieee80211_node.c
@@ -47,6 +47,7 @@