summaryrefslogtreecommitdiffstats
path: root/net/mac80211
diff options
context:
space:
mode:
authorNaftali Goldstein2019-05-29 14:25:30 +0200
committerJohannes Berg2019-06-14 15:46:33 +0200
commitf8891461a277ec0afc493fd30cd975a38048a038 (patch)
tree054876514c8f092ed77591cebba2e7ebfc7997e6 /net/mac80211
parentcfg80211: use BIT_ULL in cfg80211_parse_mbssid_data() (diff)
downloadkernel-qcow2-linux-f8891461a277ec0afc493fd30cd975a38048a038.tar.gz
kernel-qcow2-linux-f8891461a277ec0afc493fd30cd975a38048a038.tar.xz
kernel-qcow2-linux-f8891461a277ec0afc493fd30cd975a38048a038.zip
mac80211: do not start any work during reconfigure flow
It is not a good idea to try to perform any work (e.g. send an auth frame) during reconfigure flow. Prevent this from happening, and at the end of the reconfigure flow requeue all the works. Signed-off-by: Naftali Goldstein <naftali.goldstein@intel.com> Signed-off-by: Luca Coelho <luciano.coelho@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211')
-rw-r--r--net/mac80211/ieee80211_i.h7
-rw-r--r--net/mac80211/util.c4
2 files changed, 11 insertions, 0 deletions
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index 682d0ab1bf89..a86fcae279a6 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -2038,6 +2038,13 @@ void __ieee80211_flush_queues(struct ieee80211_local *local,
static inline bool ieee80211_can_run_worker(struct ieee80211_local *local)
{
/*
+ * It's unsafe to try to do any work during reconfigure flow.
+ * When the flow ends the work will be requeued.
+ */
+ if (local->in_reconfig)
+ return false;
+
+ /*
* If quiescing is set, we are racing with __ieee80211_suspend.
* __ieee80211_suspend flushes the workers after setting quiescing,
* and we check quiescing / suspended before enqueing new workers.
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index 1c8384f81526..e2edc2a3cc8b 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -2480,6 +2480,10 @@ int ieee80211_reconfig(struct ieee80211_local *local)
mutex_lock(&local->mtx);
ieee80211_start_next_roc(local);
mutex_unlock(&local->mtx);
+
+ /* Requeue all works */
+ list_for_each_entry(sdata, &local->interfaces, list)
+ ieee80211_queue_work(&local->hw, &sdata->work);
}
ieee80211_wake_queues_by_reason(hw, IEEE80211_MAX_QUEUE_MAP,