iwmc3200wifi: invalidate keys when changing the BSSID
authorSamuel Ortiz <samuel.ortiz@intel.com>
Mon, 15 Jun 2009 19:59:50 +0000 (21:59 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 10 Jul 2009 18:57:51 +0000 (14:57 -0400)
While associated, we have to invalidate our key cache if we clear our BSSID
through siwap.

Signed-off-by: Samuel Ortiz <samuel.ortiz@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/iwmc3200wifi/wext.c

index 584c94d0f399804efc461c3f0eb47a58eee3fa0c..889194931b4ed0388b719eb0fc7781db4210475a 100644 (file)
@@ -82,6 +82,7 @@ static int iwm_wext_siwap(struct net_device *dev, struct iw_request_info *info,
                          struct sockaddr *ap_addr, char *extra)
 {
        struct iwm_priv *iwm = ndev_to_iwm(dev);
+       int ret;
 
        if (iwm->conf.mode == UMAC_MODE_IBSS)
                return cfg80211_ibss_wext_siwap(dev, info, ap_addr, extra);
@@ -104,10 +105,26 @@ static int iwm_wext_siwap(struct net_device *dev, struct iw_request_info *info,
        }
 
        if (iwm->umac_profile_active) {
+               int i;
+
                if (!memcmp(&iwm->umac_profile->bssid[0], iwm->bssid, ETH_ALEN))
                        return 0;
 
-               iwm_invalidate_mlme_profile(iwm);
+               /*
+                * If we're clearing the BSSID, and we're associated,
+                * we have to clear the keys as they're no longer valid.
+                */
+               if (is_zero_ether_addr(ap_addr->sa_data)) {
+                       for (i = 0; i < IWM_NUM_KEYS; i++)
+                               iwm->keys[i].in_use = 0;
+
+               }
+
+               ret = iwm_invalidate_mlme_profile(iwm);
+               if (ret < 0) {
+                       IWM_ERR(iwm, "Couldn't invalidate profile\n");
+                       return ret;
+               }
        }
 
        if (iwm->umac_profile->ssid.ssid_len)