Revert "sunrpc: move the close processing after do recvfrom method"
[safe/jmp/linux-2.6] / net / wireless / wext-sme.c
index fe1a536..5615a88 100644 (file)
@@ -15,6 +15,7 @@ int cfg80211_mgd_wext_connect(struct cfg80211_registered_device *rdev,
                              struct wireless_dev *wdev)
 {
        struct cfg80211_cached_keys *ck = NULL;
+       const u8 *prev_bssid = NULL;
        int err, i;
 
        ASSERT_RDEV_LOCK(rdev);
@@ -25,11 +26,12 @@ int cfg80211_mgd_wext_connect(struct cfg80211_registered_device *rdev,
 
        wdev->wext.connect.ie = wdev->wext.ie;
        wdev->wext.connect.ie_len = wdev->wext.ie_len;
-       wdev->wext.connect.privacy = wdev->wext.default_key != -1;
 
        if (wdev->wext.keys) {
                wdev->wext.keys->def = wdev->wext.default_key;
                wdev->wext.keys->defmgmt = wdev->wext.default_mgmt_key;
+               if (wdev->wext.default_key != -1)
+                       wdev->wext.connect.privacy = true;
        }
 
        if (!wdev->wext.connect.ssid_len)
@@ -42,8 +44,12 @@ int cfg80211_mgd_wext_connect(struct cfg80211_registered_device *rdev,
                for (i = 0; i < 6; i++)
                        ck->params[i].key = ck->data[i];
        }
+
+       if (wdev->wext.prev_bssid_valid)
+               prev_bssid = wdev->wext.prev_bssid;
+
        err = __cfg80211_connect(rdev, wdev->netdev,
-                                &wdev->wext.connect, ck);
+                                &wdev->wext.connect, ck, prev_bssid);
        if (err)
                kfree(ck);
 
@@ -101,7 +107,7 @@ int cfg80211_mgd_wext_siwfreq(struct net_device *dev,
 
        /* SSID is not set, we just want to switch channel */
        if (chan && !wdev->wext.connect.ssid_len) {
-               err = rdev_set_freq(rdev, freq, NL80211_CHAN_NO_HT);
+               err = rdev_set_freq(rdev, wdev, freq, NL80211_CHAN_NO_HT);
                goto out;
        }
 
@@ -184,6 +190,7 @@ int cfg80211_mgd_wext_siwessid(struct net_device *dev,
                        goto out;
        }
 
+       wdev->wext.prev_bssid_valid = false;
        wdev->wext.connect.ssid = wdev->wext.ssid;
        memcpy(wdev->wext.ssid, ssid, len);
        wdev->wext.connect.ssid_len = len;
@@ -223,8 +230,7 @@ int cfg80211_mgd_wext_giwessid(struct net_device *dev,
                data->flags = 1;
                data->length = wdev->wext.connect.ssid_len;
                memcpy(ssid, wdev->wext.connect.ssid, data->length);
-       } else
-               data->flags = 0;
+       }
        wdev_unlock(wdev);
 
        return 0;
@@ -300,8 +306,6 @@ int cfg80211_mgd_wext_giwap(struct net_device *dev,
        wdev_lock(wdev);
        if (wdev->current_bss)
                memcpy(ap_addr->sa_data, wdev->current_bss->pub.bssid, ETH_ALEN);
-       else if (wdev->wext.connect.bssid)
-               memcpy(ap_addr->sa_data, wdev->wext.connect.bssid, ETH_ALEN);
        else
                memset(ap_addr->sa_data, 0, ETH_ALEN);
        wdev_unlock(wdev);