mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-28 17:48:58 +00:00
323e249ce8
This updates mac80211 to version 6.1.97-1. This code is based on Linux 6.1.97 and contains all fixes included in the upstream wireless subsystem from that kernel version. This includes many bugfixes and also some security fixes. The removed patches are already integrated in upstream Linux 6.1.97 or in backports. The following patches were integrated in upstream Linux: ath11k/0013-wifi-ath11k-synchronize-ath11k_mac_he_gi_to_nl80211_.patch ath11k/0035-wifi-ath11k-Use-platform_get_irq-to-get-the-interrup.patch ath11k/0036-wifi-ath11k-fix-SAC-bug-on-peer-addition-with-sta-ba.patch ath11k/0047-wifi-ath11k-fix-deinitialization-of-firmware-resourc.patch ath11k/0053-wifi-ath11k-fix-writing-to-unintended-memory-region.patch ath11k/0060-wifi-ath11k-Ignore-frags-from-uninitialized-peer-in-.patch ath11k/0065-wifi-ath11k-fix-tx-status-reporting-in-encap-offload.patch ath11k/0067-wifi-ath11k-Fix-SKB-corruption-in-REO-destination-ri.patch ath11k/0069-wifi-ath11k-fix-registration-of-6Ghz-only-phy-withou.patch ath11k/0080-wifi-ath11k-add-support-default-regdb-while-searchin.patch ath11k/0085-wifi-ath11k-fix-memory-leak-in-WMI-firmware-stats.patch ath11k/0086-wifi-ath11k-Add-missing-check-for-ioremap.patch ath11k/0096-wifi-ath11k-fix-boot-failure-with-one-MSI-vector.patch subsys/337-wifi-mac80211-fix-race-condition-on-enabling-fast-xm.patch The following patches were integrated in upstream backports: ath11k/901-wifi-ath11k-pci-fix-compilation-in-5.16-and-older.patch build/080-resv_start_op.patch build/110-backport_napi_build_skb.patch The following files are missing in backports, we do not have to remove them any more. Some were already missing before some were removed in this update: include/linux/cordic.h include/linux/crc8.h include/linux/eeprom_93cx6.h include/linux/wl12xx.h include/net/ieee80211.h backport-include/linux/bcm47xx_nvram.h include/linux/ath9k_platform.h include/net/bluetooth/ backports ships a dummy Mediatek wed header for older kernel versions. We backported the feature in our kernel, remove the dummy header: backport-include/linux/soc/mediatek/mtk_wed.h Remove header files for subsystems used form the mainline kernel: include/trace/events/qrtr.h include/net/rsi_91x.h backport-include/linux/platform_data/brcmnand.h Link: https://github.com/openwrt/openwrt/pull/15827 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
150 lines
4.5 KiB
Diff
150 lines
4.5 KiB
Diff
From: Felix Fietkau <nbd@nbd.name>
|
|
Date: Thu, 14 Sep 2023 13:17:16 +0200
|
|
Subject: [PATCH] cfg80211: allow grace period for DFS available after beacon
|
|
shutdown
|
|
|
|
Fixes reconfiguring an AP on a DFS channel in non-ETSI regdomain
|
|
|
|
Fixes: b35a51c7dd25 ("cfg80211: Make pre-CAC results valid only for ETSI domain")
|
|
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|
---
|
|
|
|
--- a/include/net/cfg80211.h
|
|
+++ b/include/net/cfg80211.h
|
|
@@ -175,6 +175,8 @@ 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 {
|
|
@@ -191,6 +193,7 @@ 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;
|
|
};
|
|
|
|
--- a/net/wireless/ap.c
|
|
+++ b/net/wireless/ap.c
|
|
@@ -30,6 +30,9 @@ static int ___cfg80211_stop_ap(struct cf
|
|
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;
|
|
@@ -41,9 +44,6 @@ static int ___cfg80211_stop_ap(struct cf
|
|
if (notify)
|
|
nl80211_send_ap_stopped(wdev);
|
|
|
|
- /* Should we apply the grace period during beaconing interface
|
|
- * shutdown also?
|
|
- */
|
|
cfg80211_sched_dfs_chan_update(rdev);
|
|
}
|
|
|
|
--- a/net/wireless/chan.c
|
|
+++ b/net/wireless/chan.c
|
|
@@ -461,6 +461,8 @@ static void cfg80211_set_chans_dfs_state
|
|
|
|
c->dfs_state = dfs_state;
|
|
c->dfs_state_entered = jiffies;
|
|
+ if (dfs_state == NL80211_DFS_AVAILABLE)
|
|
+ c->dfs_state_last_available = jiffies;
|
|
}
|
|
}
|
|
|
|
@@ -873,6 +875,49 @@ static bool cfg80211_get_chans_dfs_avail
|
|
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)
|
|
{
|
|
--- a/net/wireless/core.h
|
|
+++ b/net/wireless/core.h
|
|
@@ -491,6 +491,8 @@ void cfg80211_set_dfs_state(struct 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,
|
|
--- a/net/wireless/mlme.c
|
|
+++ b/net/wireless/mlme.c
|
|
@@ -904,6 +904,8 @@ void cfg80211_dfs_channels_update_work(s
|
|
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))
|
|
@@ -911,11 +913,10 @@ void cfg80211_dfs_channels_update_work(s
|
|
|
|
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;
|