mac80211: fix BSS info reconfiguration
authorJohannes Berg <johannes@sipsolutions.net>
Wed, 5 May 2010 07:44:02 +0000 (09:44 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 7 May 2010 18:55:49 +0000 (14:55 -0400)
When reconfiguring an interface due to a previous
hardware restart, mac80211 will currently include
the new IBSS flag on non-IBSS interfaces which may
confuse drivers.

Instead of doing the ~0 trick, simply spell out
which things are going to be reconfigured.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
include/net/mac80211.h
net/mac80211/util.c

index 00502b1a9e38dd17ad7cb59a78f212a64d6fcdd1..0528615ac8276f85e41a8c84f8d83a0d70299b0f 100644 (file)
@@ -160,6 +160,8 @@ enum ieee80211_bss_change {
        BSS_CHANGED_BEACON_ENABLED      = 1<<9,
        BSS_CHANGED_CQM                 = 1<<10,
        BSS_CHANGED_IBSS                = 1<<11,
+
+       /* when adding here, make sure to change ieee80211_reconfig */
 };
 
 /**
index 2b75b4fb68f42fba375e7fafbb49b33cd87f08e5..5b79d552780a03dd68641e8693835ec818aaf280 100644 (file)
@@ -1160,18 +1160,33 @@ int ieee80211_reconfig(struct ieee80211_local *local)
 
        /* Finally also reconfigure all the BSS information */
        list_for_each_entry(sdata, &local->interfaces, list) {
-               u32 changed = ~0;
+               u32 changed;
+
                if (!ieee80211_sdata_running(sdata))
                        continue;
+
+               /* common change flags for all interface types */
+               changed = BSS_CHANGED_ERP_CTS_PROT |
+                         BSS_CHANGED_ERP_PREAMBLE |
+                         BSS_CHANGED_ERP_SLOT |
+                         BSS_CHANGED_HT |
+                         BSS_CHANGED_BASIC_RATES |
+                         BSS_CHANGED_BEACON_INT |
+                         BSS_CHANGED_BSSID |
+                         BSS_CHANGED_CQM;
+
                switch (sdata->vif.type) {
                case NL80211_IFTYPE_STATION:
-                       /* disable beacon change bits */
-                       changed &= ~(BSS_CHANGED_BEACON |
-                                    BSS_CHANGED_BEACON_ENABLED);
-                       /* fall through */
+                       changed |= BSS_CHANGED_ASSOC;
+                       ieee80211_bss_info_change_notify(sdata, changed);
+                       break;
                case NL80211_IFTYPE_ADHOC:
+                       changed |= BSS_CHANGED_IBSS;
+                       /* fall through */
                case NL80211_IFTYPE_AP:
                case NL80211_IFTYPE_MESH_POINT:
+                       changed |= BSS_CHANGED_BEACON |
+                                  BSS_CHANGED_BEACON_ENABLED;
                        ieee80211_bss_info_change_notify(sdata, changed);
                        break;
                case NL80211_IFTYPE_WDS: