Commit 10d78f27 authored by Michal Kazior's avatar Michal Kazior Committed by Johannes Berg

mac80211: use csa counter offsets instead of csa_active

vif->csa_active is protected by mutexes only. This
means it is unreliable to depend on it on codeflow
in non-sleepable beacon and CSA code. There was no
guarantee to have vif->csa_active update be
visible before beacons are updated on SMP systems.

Using csa counter offsets which are embedded in
beacon struct (and thus are protected with single
RCU assignment) is much safer.
Signed-off-by: default avatarMichal Kazior <michal.kazior@tieto.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent af296bdb
...@@ -2538,6 +2538,9 @@ bool ieee80211_csa_is_complete(struct ieee80211_vif *vif) ...@@ -2538,6 +2538,9 @@ bool ieee80211_csa_is_complete(struct ieee80211_vif *vif)
goto out; goto out;
} }
if (!beacon->csa_counter_offsets[0])
goto out;
if (WARN_ON_ONCE(beacon->csa_counter_offsets[0] > beacon_data_len)) if (WARN_ON_ONCE(beacon->csa_counter_offsets[0] > beacon_data_len))
goto out; goto out;
...@@ -2582,7 +2585,7 @@ __ieee80211_beacon_get(struct ieee80211_hw *hw, ...@@ -2582,7 +2585,7 @@ __ieee80211_beacon_get(struct ieee80211_hw *hw,
beacon = rcu_dereference(ap->beacon); beacon = rcu_dereference(ap->beacon);
if (beacon) { if (beacon) {
if (sdata->vif.csa_active) { if (beacon->csa_counter_offsets[0]) {
if (!is_template) if (!is_template)
ieee80211_csa_update_counter(vif); ieee80211_csa_update_counter(vif);
...@@ -2628,7 +2631,7 @@ __ieee80211_beacon_get(struct ieee80211_hw *hw, ...@@ -2628,7 +2631,7 @@ __ieee80211_beacon_get(struct ieee80211_hw *hw,
if (!beacon) if (!beacon)
goto out; goto out;
if (sdata->vif.csa_active) { if (beacon->csa_counter_offsets[0]) {
if (!is_template) if (!is_template)
ieee80211_csa_update_counter(vif); ieee80211_csa_update_counter(vif);
...@@ -2653,7 +2656,7 @@ __ieee80211_beacon_get(struct ieee80211_hw *hw, ...@@ -2653,7 +2656,7 @@ __ieee80211_beacon_get(struct ieee80211_hw *hw,
if (!beacon) if (!beacon)
goto out; goto out;
if (sdata->vif.csa_active) { if (beacon->csa_counter_offsets[0]) {
if (!is_template) if (!is_template)
/* TODO: For mesh csa_counter is in TU, so /* TODO: For mesh csa_counter is in TU, so
* decrementing it by one isn't correct, but * decrementing it by one isn't correct, but
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment