| 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 |
| |