aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211
diff options
context:
space:
mode:
Diffstat (limited to 'net/mac80211')
-rw-r--r--net/mac80211/driver-ops.h2
-rw-r--r--net/mac80211/iface.c7
-rw-r--r--net/mac80211/main.c20
-rw-r--r--net/mac80211/mesh.c3
-rw-r--r--net/mac80211/pm.c3
5 files changed, 15 insertions, 20 deletions
diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h
index cccc486ae3d0..0c07f94c5378 100644
--- a/net/mac80211/driver-ops.h
+++ b/net/mac80211/driver-ops.h
@@ -212,6 +212,8 @@ static inline void drv_bss_info_changed(struct ieee80211_local *local,
212 sdata->vif.type != NL80211_IFTYPE_AP && 212 sdata->vif.type != NL80211_IFTYPE_AP &&
213 sdata->vif.type != NL80211_IFTYPE_ADHOC && 213 sdata->vif.type != NL80211_IFTYPE_ADHOC &&
214 sdata->vif.type != NL80211_IFTYPE_MESH_POINT); 214 sdata->vif.type != NL80211_IFTYPE_MESH_POINT);
215 WARN_ON_ONCE(sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE &&
216 changed & ~BSS_CHANGED_IDLE);
215 217
216 check_sdata_in_driver(sdata); 218 check_sdata_in_driver(sdata);
217 219
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
index 1ab7d8e57d39..06fac2991d40 100644
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
@@ -1227,6 +1227,7 @@ static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata,
1227 case NL80211_IFTYPE_AP: 1227 case NL80211_IFTYPE_AP:
1228 skb_queue_head_init(&sdata->u.ap.ps.bc_buf); 1228 skb_queue_head_init(&sdata->u.ap.ps.bc_buf);
1229 INIT_LIST_HEAD(&sdata->u.ap.vlans); 1229 INIT_LIST_HEAD(&sdata->u.ap.vlans);
1230 sdata->vif.bss_conf.bssid = sdata->vif.addr;
1230 break; 1231 break;
1231 case NL80211_IFTYPE_P2P_CLIENT: 1232 case NL80211_IFTYPE_P2P_CLIENT:
1232 type = NL80211_IFTYPE_STATION; 1233 type = NL80211_IFTYPE_STATION;
@@ -1234,9 +1235,11 @@ static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata,
1234 sdata->vif.p2p = true; 1235 sdata->vif.p2p = true;
1235 /* fall through */ 1236 /* fall through */
1236 case NL80211_IFTYPE_STATION: 1237 case NL80211_IFTYPE_STATION:
1238 sdata->vif.bss_conf.bssid = sdata->u.mgd.bssid;
1237 ieee80211_sta_setup_sdata(sdata); 1239 ieee80211_sta_setup_sdata(sdata);
1238 break; 1240 break;
1239 case NL80211_IFTYPE_ADHOC: 1241 case NL80211_IFTYPE_ADHOC:
1242 sdata->vif.bss_conf.bssid = sdata->u.ibss.bssid;
1240 ieee80211_ibss_setup_sdata(sdata); 1243 ieee80211_ibss_setup_sdata(sdata);
1241 break; 1244 break;
1242 case NL80211_IFTYPE_MESH_POINT: 1245 case NL80211_IFTYPE_MESH_POINT:
@@ -1250,8 +1253,12 @@ static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata,
1250 MONITOR_FLAG_OTHER_BSS; 1253 MONITOR_FLAG_OTHER_BSS;
1251 break; 1254 break;
1252 case NL80211_IFTYPE_WDS: 1255 case NL80211_IFTYPE_WDS:
1256 sdata->vif.bss_conf.bssid = NULL;
1257 break;
1253 case NL80211_IFTYPE_AP_VLAN: 1258 case NL80211_IFTYPE_AP_VLAN:
1259 break;
1254 case NL80211_IFTYPE_P2P_DEVICE: 1260 case NL80211_IFTYPE_P2P_DEVICE:
1261 sdata->vif.bss_conf.bssid = sdata->vif.addr;
1255 break; 1262 break;
1256 case NL80211_IFTYPE_UNSPECIFIED: 1263 case NL80211_IFTYPE_UNSPECIFIED:
1257 case NUM_NL80211_IFTYPES: 1264 case NUM_NL80211_IFTYPES:
diff --git a/net/mac80211/main.c b/net/mac80211/main.c
index b719a16eabde..e6514f240fce 100644
--- a/net/mac80211/main.c
+++ b/net/mac80211/main.c
@@ -207,30 +207,10 @@ void ieee80211_bss_info_change_notify(struct ieee80211_sub_if_data *sdata,
207 u32 changed) 207 u32 changed)
208{ 208{
209 struct ieee80211_local *local = sdata->local; 209 struct ieee80211_local *local = sdata->local;
210 static const u8 zero[ETH_ALEN] = { 0 };
211 210
212 if (!changed) 211 if (!changed)
213 return; 212 return;
214 213
215 if (sdata->vif.type == NL80211_IFTYPE_STATION) {
216 sdata->vif.bss_conf.bssid = sdata->u.mgd.bssid;
217 } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
218 sdata->vif.bss_conf.bssid = sdata->u.ibss.bssid;
219 else if (sdata->vif.type == NL80211_IFTYPE_AP)
220 sdata->vif.bss_conf.bssid = sdata->vif.addr;
221 else if (sdata->vif.type == NL80211_IFTYPE_WDS)
222 sdata->vif.bss_conf.bssid = NULL;
223 else if (ieee80211_vif_is_mesh(&sdata->vif)) {
224 sdata->vif.bss_conf.bssid = zero;
225 } else if (sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE) {
226 sdata->vif.bss_conf.bssid = sdata->vif.addr;
227 WARN_ONCE(changed & ~(BSS_CHANGED_IDLE),
228 "P2P Device BSS changed %#x", changed);
229 } else {
230 WARN_ON(1);
231 return;
232 }
233
234 drv_bss_info_changed(local, sdata, &sdata->vif.bss_conf, changed); 214 drv_bss_info_changed(local, sdata, &sdata->vif.bss_conf, changed);
235} 215}
236 216
diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c
index fcfa7ef9af98..245885841c8d 100644
--- a/net/mac80211/mesh.c
+++ b/net/mac80211/mesh.c
@@ -810,6 +810,7 @@ void ieee80211_mesh_notify_scan_completed(struct ieee80211_local *local)
810void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data *sdata) 810void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data *sdata)
811{ 811{
812 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; 812 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
813 static u8 zero_addr[ETH_ALEN] = {};
813 814
814 setup_timer(&ifmsh->housekeeping_timer, 815 setup_timer(&ifmsh->housekeeping_timer,
815 ieee80211_mesh_housekeeping_timer, 816 ieee80211_mesh_housekeeping_timer,
@@ -835,4 +836,6 @@ void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data *sdata)
835 INIT_LIST_HEAD(&ifmsh->preq_queue.list); 836 INIT_LIST_HEAD(&ifmsh->preq_queue.list);
836 spin_lock_init(&ifmsh->mesh_preq_queue_lock); 837 spin_lock_init(&ifmsh->mesh_preq_queue_lock);
837 spin_lock_init(&ifmsh->sync_offset_lock); 838 spin_lock_init(&ifmsh->sync_offset_lock);
839
840 sdata->vif.bss_conf.bssid = zero_addr;
838} 841}
diff --git a/net/mac80211/pm.c b/net/mac80211/pm.c
index 8a67d7e982f7..f81fd30581d9 100644
--- a/net/mac80211/pm.c
+++ b/net/mac80211/pm.c
@@ -121,6 +121,7 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan)
121 121
122 /* remove all interfaces */ 122 /* remove all interfaces */
123 list_for_each_entry(sdata, &local->interfaces, list) { 123 list_for_each_entry(sdata, &local->interfaces, list) {
124 static u8 zero_addr[ETH_ALEN] = {};
124 u32 changed = 0; 125 u32 changed = 0;
125 126
126 if (!ieee80211_sdata_running(sdata)) 127 if (!ieee80211_sdata_running(sdata))
@@ -152,6 +153,8 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan)
152 sdata->suspend_bss_conf = sdata->vif.bss_conf; 153 sdata->suspend_bss_conf = sdata->vif.bss_conf;
153 memset(&sdata->vif.bss_conf, 0, sizeof(sdata->vif.bss_conf)); 154 memset(&sdata->vif.bss_conf, 0, sizeof(sdata->vif.bss_conf));
154 sdata->vif.bss_conf.idle = true; 155 sdata->vif.bss_conf.idle = true;
156 if (sdata->suspend_bss_conf.bssid)
157 sdata->vif.bss_conf.bssid = zero_addr;
155 158
156 /* disable beaconing or remove association */ 159 /* disable beaconing or remove association */
157 ieee80211_bss_info_change_notify(sdata, changed); 160 ieee80211_bss_info_change_notify(sdata, changed);