blob: ad5ef2eb72d9c00b6829404f77c77a9192836b65 [file] [log] [blame]
From 23681abf649eaf1eda27dcfd3d17b80e1edeb951 Mon Sep 17 00:00:00 2001
From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
Date: Thu, 19 Oct 2023 09:59:24 +0800
Subject: [PATCH 3/3] backports: Revert cfg80211: allow grace period for DFS
available after beacon shutdown
revert 320-cfg80211-allow-grace-period-for-DFS-available-after-.patch
This patch will lead to channel switch fail when background radar is
enabled.
When AP channel switch to USABLE DFS channel,
1. AP will restart, and the DFS state of the previously operated DFS channel
will not be cleared immediately if this patch is applied.
2. Background radar will perform CAC on the specified DFS channel for AP.
3. AP will choose an AVAILABLE channel to operate on.
Therefore, AP might select those DFS channels whose DFS state would be
cleared after the grace period, resulting in channel switch failure.
Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
---
include/net/cfg80211.h | 3 ---
net/wireless/ap.c | 6 +++---
net/wireless/chan.c | 45 ------------------------------------------
net/wireless/core.h | 2 --
net/wireless/mlme.c | 7 +++----
5 files changed, 6 insertions(+), 57 deletions(-)
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index a77e8a5..0a825af 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -175,8 +175,6 @@ enum ieee80211_channel_flags {
* @dfs_state: current state of this channel. Only relevant if radar is required
* on this channel.
* @dfs_state_entered: timestamp (jiffies) when the dfs state was entered.
- * @dfs_state_last_available: timestamp (jiffies) of the last time when the
- * channel was available.
* @dfs_cac_ms: DFS CAC time in milliseconds, this is valid for DFS channels.
*/
struct ieee80211_channel {
@@ -193,7 +191,6 @@ struct ieee80211_channel {
int orig_mag, orig_mpwr;
enum nl80211_dfs_state dfs_state;
unsigned long dfs_state_entered;
- unsigned long dfs_state_last_available;
unsigned int dfs_cac_ms;
};
diff --git a/net/wireless/ap.c b/net/wireless/ap.c
index 63641aa..0962770 100644
--- a/net/wireless/ap.c
+++ b/net/wireless/ap.c
@@ -30,9 +30,6 @@ static int ___cfg80211_stop_ap(struct cfg80211_registered_device *rdev,
if (!wdev->links[link_id].ap.beacon_interval)
return -ENOENT;
- cfg80211_update_last_available(wdev->wiphy,
- &wdev->links[link_id].ap.chandef);
-
err = rdev_stop_ap(rdev, dev, link_id);
if (!err) {
wdev->conn_owner_nlportid = 0;
@@ -44,6 +41,9 @@ static int ___cfg80211_stop_ap(struct cfg80211_registered_device *rdev,
if (notify)
nl80211_send_ap_stopped(wdev, link_id);
+ /* Should we apply the grace period during beaconing interface
+ * shutdown also?
+ */
cfg80211_sched_dfs_chan_update(rdev);
}
diff --git a/net/wireless/chan.c b/net/wireless/chan.c
index f8348bc..510079f 100644
--- a/net/wireless/chan.c
+++ b/net/wireless/chan.c
@@ -461,8 +461,6 @@ static void cfg80211_set_chans_dfs_state(struct wiphy *wiphy, u32 center_freq,
c->dfs_state = dfs_state;
c->dfs_state_entered = jiffies;
- if (dfs_state == NL80211_DFS_AVAILABLE)
- c->dfs_state_last_available = jiffies;
}
}
@@ -876,49 +874,6 @@ static bool cfg80211_get_chans_dfs_available(struct wiphy *wiphy,
return true;
}
-static void
-__cfg80211_update_last_available(struct wiphy *wiphy,
- u32 center_freq,
- u32 bandwidth)
-{
- struct ieee80211_channel *c;
- u32 freq, start_freq, end_freq;
-
- start_freq = cfg80211_get_start_freq(center_freq, bandwidth);
- end_freq = cfg80211_get_end_freq(center_freq, bandwidth);
-
- /*
- * Check entire range of channels for the bandwidth.
- * If any channel in between is disabled or has not
- * had gone through CAC return false
- */
- for (freq = start_freq; freq <= end_freq; freq += MHZ_TO_KHZ(20)) {
- c = ieee80211_get_channel_khz(wiphy, freq);
- if (!c)
- return;
-
- c->dfs_state_last_available = jiffies;
- }
-}
-
-void cfg80211_update_last_available(struct wiphy *wiphy,
- const struct cfg80211_chan_def *chandef)
-{
- int width;
-
- width = cfg80211_chandef_get_width(chandef);
- if (width < 0)
- return;
-
- __cfg80211_update_last_available(wiphy, MHZ_TO_KHZ(chandef->center_freq1),
- width);
- if (chandef->width != NL80211_CHAN_WIDTH_80P80)
- return;
-
- __cfg80211_update_last_available(wiphy, MHZ_TO_KHZ(chandef->center_freq2),
- width);
-}
-
static bool cfg80211_chandef_dfs_available(struct wiphy *wiphy,
const struct cfg80211_chan_def *chandef)
{
diff --git a/net/wireless/core.h b/net/wireless/core.h
index 9aef18e..46aa2a0 100644
--- a/net/wireless/core.h
+++ b/net/wireless/core.h
@@ -481,8 +481,6 @@ void cfg80211_set_dfs_state(struct wiphy *wiphy,
enum nl80211_dfs_state dfs_state);
void cfg80211_dfs_channels_update_work(struct work_struct *work);
-void cfg80211_update_last_available(struct wiphy *wiphy,
- const struct cfg80211_chan_def *chandef);
void cfg80211_sched_dfs_chan_update(struct cfg80211_registered_device *rdev);
diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c
index 0002464..3cdfbd2 100644
--- a/net/wireless/mlme.c
+++ b/net/wireless/mlme.c
@@ -930,8 +930,6 @@ void cfg80211_dfs_channels_update_work(struct work_struct *work)
if (c->dfs_state == NL80211_DFS_UNAVAILABLE) {
time_dfs_update = IEEE80211_DFS_MIN_NOP_TIME_MS;
radar_event = NL80211_RADAR_NOP_FINISHED;
- timeout = c->dfs_state_entered +
- msecs_to_jiffies(time_dfs_update);
} else {
if (regulatory_pre_cac_allowed(wiphy) ||
cfg80211_any_wiphy_oper_chan(wiphy, c))
@@ -939,10 +937,11 @@ void cfg80211_dfs_channels_update_work(struct work_struct *work)
time_dfs_update = REG_PRE_CAC_EXPIRY_GRACE_MS;
radar_event = NL80211_RADAR_PRE_CAC_EXPIRED;
- timeout = c->dfs_state_last_available +
- msecs_to_jiffies(time_dfs_update);
}
+ timeout = c->dfs_state_entered +
+ msecs_to_jiffies(time_dfs_update);
+
if (time_after_eq(jiffies, timeout)) {
c->dfs_state = NL80211_DFS_USABLE;
c->dfs_state_entered = jiffies;
--
2.18.0