diff options
author | Johannes Berg <johannes@sipsolutions.net> | 2009-05-14 07:10:14 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-05-20 14:46:37 -0400 |
commit | 9cef873798dfcdc10ff40b02abf1de935ceeba85 (patch) | |
tree | bf44fb189c0db0b5b68a62006d82c242146fdd72 /net/mac80211/mlme.c | |
parent | bbcf3f02771e069d0e113fe9bb62c27b671abf97 (diff) |
mac80211: fix managed mode BSSID handling
Currently, we will ask the driver to configure right away
when somebody changes the desired BSSID. That's totally
strange because then we will configure the driver without
even knowing whether the BSS exists. Change this to only
configure the BSSID when associated, and configure a zero
BSSID when not associated.
As a side effect, this fixes an issue with the iwlwifi
driver which doesn't implement sta_notify properly and
uses the BSSID instead and gets very confused if the
BSSID is cleared before we disassociate, which results
in the warning Marcel posted [1] and iwlwifi bug 1995 [2].
[1] http://thread.gmane.org/gmane.linux.kernel.wireless.general/32598
[2] http://www.intellinuxwireless.org/bugzilla/show_bug.cgi?id=1995
Cc: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/mlme.c')
-rw-r--r-- | net/mac80211/mlme.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 87743e47a05f..b7f9c60793dd 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -977,6 +977,10 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata, | |||
977 | * changed or not. | 977 | * changed or not. |
978 | */ | 978 | */ |
979 | bss_info_changed |= BSS_CHANGED_BASIC_RATES; | 979 | bss_info_changed |= BSS_CHANGED_BASIC_RATES; |
980 | |||
981 | /* And the BSSID changed - we're associated now */ | ||
982 | bss_info_changed |= BSS_CHANGED_BSSID; | ||
983 | |||
980 | ieee80211_bss_info_change_notify(sdata, bss_info_changed); | 984 | ieee80211_bss_info_change_notify(sdata, bss_info_changed); |
981 | 985 | ||
982 | /* will be same as sdata */ | 986 | /* will be same as sdata */ |
@@ -1176,6 +1180,9 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, | |||
1176 | } | 1180 | } |
1177 | 1181 | ||
1178 | ieee80211_hw_config(local, config_changed); | 1182 | ieee80211_hw_config(local, config_changed); |
1183 | |||
1184 | /* And the BSSID changed -- not very interesting here */ | ||
1185 | changed |= BSS_CHANGED_BSSID; | ||
1179 | ieee80211_bss_info_change_notify(sdata, changed); | 1186 | ieee80211_bss_info_change_notify(sdata, changed); |
1180 | 1187 | ||
1181 | rcu_read_lock(); | 1188 | rcu_read_lock(); |
@@ -2481,9 +2488,6 @@ int ieee80211_sta_set_bssid(struct ieee80211_sub_if_data *sdata, u8 *bssid) | |||
2481 | ifmgd->flags &= ~IEEE80211_STA_BSSID_SET; | 2488 | ifmgd->flags &= ~IEEE80211_STA_BSSID_SET; |
2482 | } | 2489 | } |
2483 | 2490 | ||
2484 | if (netif_running(sdata->dev)) | ||
2485 | ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); | ||
2486 | |||
2487 | return ieee80211_sta_commit(sdata); | 2491 | return ieee80211_sta_commit(sdata); |
2488 | } | 2492 | } |
2489 | 2493 | ||