cfg80211: clear WEXT SSID when clearing IBSS
authorJohannes Berg <johannes@sipsolutions.net>
Mon, 20 Apr 2009 16:43:46 +0000 (18:43 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 22 Apr 2009 20:57:17 +0000 (16:57 -0400)
When we leave an IBSS, we should clear the SSID and not just the
BSSID, but since WEXT allows configuring while the interface is
down we must not clear it when leaving due to taking the iface
down, so some complications are needed.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/wireless/core.c
net/wireless/core.h
net/wireless/ibss.c
net/wireless/nl80211.c

index f256b4f7e83325d1701a9df5baf4f741208f42d7..2006a4ee60eb40666ec85e4a7db245d647bdb1ad 100644 (file)
@@ -464,7 +464,7 @@ static int cfg80211_netdev_notifier_call(struct notifier_block * nb,
                        break;
                if (!dev->ieee80211_ptr->ssid_len)
                        break;
-               cfg80211_leave_ibss(rdev, dev);
+               cfg80211_leave_ibss(rdev, dev, true);
                break;
        case NETDEV_UP:
 #ifdef CONFIG_WIRELESS_EXT
index 89a8159ef0b14d4662ee129b002e36c396b48d6e..3e49d339931139bac22d63eadf4d02d4bad96ace 100644 (file)
@@ -147,8 +147,8 @@ void cfg80211_bss_age(struct cfg80211_registered_device *dev,
 int cfg80211_join_ibss(struct cfg80211_registered_device *rdev,
                       struct net_device *dev,
                       struct cfg80211_ibss_params *params);
-void cfg80211_clear_ibss(struct net_device *dev);
+void cfg80211_clear_ibss(struct net_device *dev, bool nowext);
 int cfg80211_leave_ibss(struct cfg80211_registered_device *rdev,
-                       struct net_device *dev);
+                       struct net_device *dev, bool nowext);
 
 #endif /* __NET_WIRELESS_CORE_H */
index 4e1fcb0c9e4cd68b0855d6957420e90ccbcabb5b..b5c601e1b1b7a8240c0b2de0b1bda47b4e8b3700 100644 (file)
@@ -76,7 +76,7 @@ int cfg80211_join_ibss(struct cfg80211_registered_device *rdev,
        return 0;
 }
 
-void cfg80211_clear_ibss(struct net_device *dev)
+void cfg80211_clear_ibss(struct net_device *dev, bool nowext)
 {
        struct wireless_dev *wdev = dev->ieee80211_ptr;
 
@@ -88,10 +88,14 @@ void cfg80211_clear_ibss(struct net_device *dev)
        wdev->current_bss = NULL;
        wdev->ssid_len = 0;
        memset(wdev->bssid, 0, ETH_ALEN);
+#ifdef CONFIG_WIRELESS_EXT
+       if (!nowext)
+               wdev->wext.ssid_len = 0;
+#endif
 }
 
 int cfg80211_leave_ibss(struct cfg80211_registered_device *rdev,
-                       struct net_device *dev)
+                       struct net_device *dev, bool nowext)
 {
        int err;
 
@@ -100,7 +104,7 @@ int cfg80211_leave_ibss(struct cfg80211_registered_device *rdev,
        if (err)
                return err;
 
-       cfg80211_clear_ibss(dev);
+       cfg80211_clear_ibss(dev, nowext);
 
        return 0;
 }
@@ -179,7 +183,8 @@ int cfg80211_ibss_wext_siwfreq(struct net_device *dev,
                return 0;
 
        if (wdev->ssid_len) {
-               err = cfg80211_leave_ibss(wiphy_to_dev(wdev->wiphy), dev);
+               err = cfg80211_leave_ibss(wiphy_to_dev(wdev->wiphy),
+                                         dev, true);
                if (err)
                        return err;
        }
@@ -241,7 +246,8 @@ int cfg80211_ibss_wext_siwessid(struct net_device *dev,
                return -EOPNOTSUPP;
 
        if (wdev->ssid_len) {
-               err = cfg80211_leave_ibss(wiphy_to_dev(wdev->wiphy), dev);
+               err = cfg80211_leave_ibss(wiphy_to_dev(wdev->wiphy),
+                                         dev, true);
                if (err)
                        return err;
        }
@@ -275,7 +281,7 @@ int cfg80211_ibss_wext_giwessid(struct net_device *dev,
                data->flags = 1;
                data->length = wdev->ssid_len;
                memcpy(ssid, wdev->ssid, data->length);
-       } else if (wdev->wext.ssid) {
+       } else if (wdev->wext.ssid && wdev->wext.ssid_len) {
                data->flags = 1;
                data->length = wdev->wext.ssid_len;
                memcpy(ssid, wdev->wext.ssid, data->length);
@@ -318,7 +324,8 @@ int cfg80211_ibss_wext_siwap(struct net_device *dev,
                return 0;
 
        if (wdev->ssid_len) {
-               err = cfg80211_leave_ibss(wiphy_to_dev(wdev->wiphy), dev);
+               err = cfg80211_leave_ibss(wiphy_to_dev(wdev->wiphy),
+                                         dev, true);
                if (err)
                        return err;
        }
index 5a9a5c6c71dbd351a8c6359806a6c18d8602f268..97bb5c80125d2cc592a0768977d5098a4fd81927 100644 (file)
@@ -833,7 +833,7 @@ static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info)
 
        if (dev && !err && (ntype != otype)) {
                if (otype == NL80211_IFTYPE_ADHOC)
-                       cfg80211_clear_ibss(dev);
+                       cfg80211_clear_ibss(dev, false);
        }
 
  unlock:
@@ -3249,7 +3249,7 @@ static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info)
                goto out;
        }
 
-       err = cfg80211_leave_ibss(drv, dev);
+       err = cfg80211_leave_ibss(drv, dev, false);
 
 out:
        cfg80211_put_dev(drv);