mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 13:44:15 +08:00
wifi: mac80211: call drv_sta_state() under sdata_lock() in reconfig
Currently, other paths calling drv_sta_state() hold the mutex and therefore drivers can assume that, and look at links with that protection. Fix that for the reconfig path as well; to do it more easily use ieee80211_reconfig_stations() for the AP/AP_VLAN station reconfig as well. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
6522047c65
commit
48c5d82aba
@ -2530,7 +2530,6 @@ int ieee80211_reconfig(struct ieee80211_local *local)
|
||||
if (link)
|
||||
ieee80211_assign_chanctx(local, sdata, link);
|
||||
}
|
||||
sdata_unlock(sdata);
|
||||
|
||||
switch (sdata->vif.type) {
|
||||
case NL80211_IFTYPE_AP_VLAN:
|
||||
@ -2549,6 +2548,7 @@ int ieee80211_reconfig(struct ieee80211_local *local)
|
||||
&sdata->deflink.tx_conf[i]);
|
||||
break;
|
||||
}
|
||||
sdata_unlock(sdata);
|
||||
|
||||
/* common change flags for all interface types */
|
||||
changed = BSS_CHANGED_ERP_CTS_PROT |
|
||||
@ -2657,23 +2657,21 @@ int ieee80211_reconfig(struct ieee80211_local *local)
|
||||
}
|
||||
|
||||
/* APs are now beaconing, add back stations */
|
||||
mutex_lock(&local->sta_mtx);
|
||||
list_for_each_entry(sta, &local->sta_list, list) {
|
||||
enum ieee80211_sta_state state;
|
||||
|
||||
if (!sta->uploaded)
|
||||
list_for_each_entry(sdata, &local->interfaces, list) {
|
||||
if (!ieee80211_sdata_running(sdata))
|
||||
continue;
|
||||
|
||||
if (sta->sdata->vif.type != NL80211_IFTYPE_AP &&
|
||||
sta->sdata->vif.type != NL80211_IFTYPE_AP_VLAN)
|
||||
continue;
|
||||
|
||||
for (state = IEEE80211_STA_NOTEXIST;
|
||||
state < sta->sta_state; state++)
|
||||
WARN_ON(drv_sta_state(local, sta->sdata, sta, state,
|
||||
state + 1));
|
||||
sdata_lock(sdata);
|
||||
switch (sdata->vif.type) {
|
||||
case NL80211_IFTYPE_AP_VLAN:
|
||||
case NL80211_IFTYPE_AP:
|
||||
ieee80211_reconfig_stations(sdata);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
sdata_unlock(sdata);
|
||||
}
|
||||
mutex_unlock(&local->sta_mtx);
|
||||
|
||||
/* add back keys */
|
||||
list_for_each_entry(sdata, &local->interfaces, list)
|
||||
|
Loading…
Reference in New Issue
Block a user