blob: 85ed6456d64396bbee8e0318c3ca0ed73b4953b6 [file] [log] [blame]
From e8e5a4977e817047060b36827e835bc26194b5c1 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 03/40] 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 45068d6..7676475 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 3750cb9..37ed7c6 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;
}
}
@@ -875,49 +873,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 a8da284..70fc2e6 100644
--- a/net/wireless/core.h
+++ b/net/wireless/core.h
@@ -487,8 +487,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);
unsigned int
cfg80211_chandef_dfs_cac_time(struct wiphy *wiphy,
diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c
index f6e2c2d..8b87bc9 100644
--- a/net/wireless/mlme.c
+++ b/net/wireless/mlme.c
@@ -915,8 +915,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))
@@ -924,10 +922,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