madwifi: fix race condition triggered by active split wds sta interfaces during vap...
authornbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Thu, 31 Jul 2008 22:41:31 +0000 (22:41 +0000)
committernbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Thu, 31 Jul 2008 22:41:31 +0000 (22:41 +0000)
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@12052 3c298f89-4303-0410-b956-a3cf2f4a3e73

package/madwifi/patches/371-wds_sta_separation.patch

index 9126fec..e01b150 100644 (file)
  
  #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 @@