Commit 48c5d82a authored by Johannes Berg's avatar Johannes Berg
Browse files

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: default avatarJohannes Berg <johannes.berg@intel.com>
parent 6522047c
Loading
Loading
Loading
Loading
+13 −15
Original line number Diff line number Diff line
@@ -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)
			continue;

		if (sta->sdata->vif.type != NL80211_IFTYPE_AP &&
		    sta->sdata->vif.type != NL80211_IFTYPE_AP_VLAN)
	list_for_each_entry(sdata, &local->interfaces, list) {
		if (!ieee80211_sdata_running(sdata))
			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)