diff --git a/net/mac80211/ieee80211.c b/net/mac80211/ieee80211.c index 566bdca32b86..f811a260ee9c 100644 --- a/net/mac80211/ieee80211.c +++ b/net/mac80211/ieee80211.c @@ -375,6 +375,18 @@ static void ieee80211_start_hard_monitor(struct ieee80211_local *local) } } +static void ieee80211_if_open(struct net_device *dev) +{ + struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); + + switch (sdata->type) { + case IEEE80211_IF_TYPE_STA: + case IEEE80211_IF_TYPE_IBSS: + sdata->u.sta.prev_bssid_set = 0; + break; + } +} + static int ieee80211_open(struct net_device *dev) { struct ieee80211_sub_if_data *sdata, *nsdata; @@ -408,6 +420,7 @@ static int ieee80211_open(struct net_device *dev) local->hw.conf.flags |= IEEE80211_CONF_RADIOTAP; return 0; } + ieee80211_if_open(dev); ieee80211_start_soft_monitor(local); conf.if_id = dev->ifindex; diff --git a/net/mac80211/ieee80211_sta.c b/net/mac80211/ieee80211_sta.c index 9aee1abae127..8e6548974a9f 100644 --- a/net/mac80211/ieee80211_sta.c +++ b/net/mac80211/ieee80211_sta.c @@ -1187,8 +1187,10 @@ static void ieee80211_rx_mgmt_assoc_resp(struct net_device *dev, if (status_code != WLAN_STATUS_SUCCESS) { printk(KERN_DEBUG "%s: AP denied association (code=%d)\n", dev->name, status_code); - if (status_code == WLAN_STATUS_REASSOC_NO_ASSOC) - ifsta->prev_bssid_set = 0; + /* if this was a reassociation, ensure we try a "full" + * association next time. This works around some broken APs + * which do not correctly reject reassociation requests. */ + ifsta->prev_bssid_set = 0; return; }