diff options
Diffstat (limited to 'net/mac80211/cfg.c')
| -rw-r--r-- | net/mac80211/cfg.c | 17 | 
1 files changed, 15 insertions, 2 deletions
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 5c61677487c..0479c64aa83 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c @@ -164,7 +164,17 @@ static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev,  			sta = sta_info_get(sdata, mac_addr);  		else  			sta = sta_info_get_bss(sdata, mac_addr); -		if (!sta) { +		/* +		 * The ASSOC test makes sure the driver is ready to +		 * receive the key. When wpa_supplicant has roamed +		 * using FT, it attempts to set the key before +		 * association has completed, this rejects that attempt +		 * so it will set the key again after assocation. +		 * +		 * TODO: accept the key if we have a station entry and +		 *       add it to the device after the station. +		 */ +		if (!sta || !test_sta_flag(sta, WLAN_STA_ASSOC)) {  			ieee80211_key_free(sdata->local, key);  			err = -ENOENT;  			goto out_unlock; @@ -1009,6 +1019,8 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev)  	if (old_probe_resp)  		kfree_rcu(old_probe_resp, rcu_head); +	list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) +		sta_info_flush(local, vlan);  	sta_info_flush(local, sdata);  	ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED); @@ -1992,7 +2004,8 @@ static int ieee80211_set_mcast_rate(struct wiphy *wiphy, struct net_device *dev,  {  	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); -	memcpy(sdata->vif.bss_conf.mcast_rate, rate, sizeof(rate)); +	memcpy(sdata->vif.bss_conf.mcast_rate, rate, +	       sizeof(int) * IEEE80211_NUM_BANDS);  	return 0;  }  |