* [PATCH wireless-next 0/4] DFS/CAC changes
@ 2026-02-03 18:53 Janusz Dziedzic
2026-02-03 18:53 ` [PATCH wireless-next 1/4] wifi: cfg80211: fix background CAC Janusz Dziedzic
` (4 more replies)
0 siblings, 5 replies; 8+ messages in thread
From: Janusz Dziedzic @ 2026-02-03 18:53 UTC (permalink / raw)
To: linux-wireless; +Cc: johannes, Janusz Dziedzic
- report CAC ongoing to user mode
- add hwsim support for background CAC
Janusz Dziedzic (4):
wifi: cfg80211: fix background CAC
wifi: cfg80211: set and report chandef CAC ongoing
wifi: cfg80211: events, report background radar
wifi: mac80211_hwsim: background CAC support
drivers/net/wireless/virtual/mac80211_hwsim.c | 77 +++++++++++++++++++
drivers/net/wireless/virtual/mac80211_hwsim.h | 2 +
include/net/cfg80211.h | 3 +
include/uapi/linux/nl80211.h | 6 ++
net/wireless/chan.c | 27 +++++++
net/wireless/core.h | 4 +
net/wireless/mlme.c | 51 ++++++------
net/wireless/nl80211.c | 14 ++++
8 files changed, 162 insertions(+), 22 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH wireless-next 1/4] wifi: cfg80211: fix background CAC
2026-02-03 18:53 [PATCH wireless-next 0/4] DFS/CAC changes Janusz Dziedzic
@ 2026-02-03 18:53 ` Janusz Dziedzic
2026-02-03 18:53 ` [PATCH wireless-next 2/4] wifi: cfg80211: set and report chandef CAC ongoing Janusz Dziedzic
` (3 subsequent siblings)
4 siblings, 0 replies; 8+ messages in thread
From: Janusz Dziedzic @ 2026-02-03 18:53 UTC (permalink / raw)
To: linux-wireless; +Cc: johannes, Janusz Dziedzic
Fix:
- Send CAC_ABORT event when background CAC is canceled
- Cancel CAC done workqueue when radar is detected
- Release background wdev ownership when CAC is aborted or passed
- Clean lower layer background radar state when CAC is aborted or passed
- Prevent sending abort event when radar event is sent
Signed-off-by: Janusz Dziedzic <janusz.dziedzic@gmail.com>
---
net/wireless/mlme.c | 40 +++++++++++++++++++---------------------
1 file changed, 19 insertions(+), 21 deletions(-)
diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c
index 3fc175f9f868..212178d04efa 100644
--- a/net/wireless/mlme.c
+++ b/net/wireless/mlme.c
@@ -1115,8 +1115,10 @@ void __cfg80211_radar_event(struct wiphy *wiphy,
*/
cfg80211_set_dfs_state(wiphy, chandef, NL80211_DFS_UNAVAILABLE);
- if (offchan)
+ if (offchan) {
+ cancel_delayed_work(&rdev->background_cac_done_wk);
queue_work(cfg80211_wq, &rdev->background_cac_abort_wk);
+ }
cfg80211_sched_dfs_chan_update(rdev);
@@ -1187,21 +1189,16 @@ __cfg80211_background_cac_event(struct cfg80211_registered_device *rdev,
if (!cfg80211_chandef_valid(chandef))
return;
- if (!rdev->background_radar_wdev)
- return;
-
switch (event) {
case NL80211_RADAR_CAC_FINISHED:
cfg80211_set_dfs_state(wiphy, chandef, NL80211_DFS_AVAILABLE);
memcpy(&rdev->cac_done_chandef, chandef, sizeof(*chandef));
queue_work(cfg80211_wq, &rdev->propagate_cac_done_wk);
cfg80211_sched_dfs_chan_update(rdev);
- wdev = rdev->background_radar_wdev;
break;
case NL80211_RADAR_CAC_ABORTED:
if (!cancel_delayed_work(&rdev->background_cac_done_wk))
return;
- wdev = rdev->background_radar_wdev;
break;
case NL80211_RADAR_CAC_STARTED:
break;
@@ -1213,17 +1210,6 @@ __cfg80211_background_cac_event(struct cfg80211_registered_device *rdev,
nl80211_radar_notify(rdev, chandef, event, netdev, GFP_KERNEL);
}
-static void
-cfg80211_background_cac_event(struct cfg80211_registered_device *rdev,
- const struct cfg80211_chan_def *chandef,
- enum nl80211_radar_event event)
-{
- guard(wiphy)(&rdev->wiphy);
-
- __cfg80211_background_cac_event(rdev, rdev->background_radar_wdev,
- chandef, event);
-}
-
void cfg80211_background_cac_done_wk(struct work_struct *work)
{
struct delayed_work *delayed_work = to_delayed_work(work);
@@ -1231,18 +1217,30 @@ void cfg80211_background_cac_done_wk(struct work_struct *work)
rdev = container_of(delayed_work, struct cfg80211_registered_device,
background_cac_done_wk);
- cfg80211_background_cac_event(rdev, &rdev->background_radar_chandef,
- NL80211_RADAR_CAC_FINISHED);
+
+ guard(wiphy)(&rdev->wiphy);
+
+ rdev_set_radar_background(rdev, NULL);
+ rdev->background_radar_wdev = NULL;
+
+ __cfg80211_background_cac_event(rdev, rdev->background_radar_wdev,
+ &rdev->background_radar_chandef,
+ NL80211_RADAR_CAC_FINISHED);
}
void cfg80211_background_cac_abort_wk(struct work_struct *work)
{
struct cfg80211_registered_device *rdev;
+ struct wireless_dev *wdev;
rdev = container_of(work, struct cfg80211_registered_device,
background_cac_abort_wk);
- cfg80211_background_cac_event(rdev, &rdev->background_radar_chandef,
- NL80211_RADAR_CAC_ABORTED);
+
+ guard(wiphy)(&rdev->wiphy);
+
+ wdev = rdev->background_radar_wdev;
+ if (wdev)
+ cfg80211_stop_background_radar_detection(wdev);
}
void cfg80211_background_cac_abort(struct wiphy *wiphy)
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH wireless-next 2/4] wifi: cfg80211: set and report chandef CAC ongoing
2026-02-03 18:53 [PATCH wireless-next 0/4] DFS/CAC changes Janusz Dziedzic
2026-02-03 18:53 ` [PATCH wireless-next 1/4] wifi: cfg80211: fix background CAC Janusz Dziedzic
@ 2026-02-03 18:53 ` Janusz Dziedzic
2026-02-03 18:53 ` [PATCH wireless-next 3/4] wifi: cfg80211: events, report background radar Janusz Dziedzic
` (2 subsequent siblings)
4 siblings, 0 replies; 8+ messages in thread
From: Janusz Dziedzic @ 2026-02-03 18:53 UTC (permalink / raw)
To: linux-wireless; +Cc: johannes, Janusz Dziedzic
Allow to track and check CAC state from user mode by
simple check phy channels eg. using iw phy1 channels
command.
This is done for regular CAC and background CAC.
It is important for background CAC while we can start
it from any app (eg. iw or hostapd).
Signed-off-by: Janusz Dziedzic <janusz.dziedzic@gmail.com>
---
include/net/cfg80211.h | 3 +++
include/uapi/linux/nl80211.h | 6 ++++++
net/wireless/chan.c | 27 +++++++++++++++++++++++++++
net/wireless/core.h | 4 ++++
net/wireless/mlme.c | 7 +++++++
net/wireless/nl80211.c | 7 +++++++
6 files changed, 54 insertions(+)
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index fc01de19c798..e00045c150e7 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -190,6 +190,8 @@ enum ieee80211_channel_flags {
* on this channel.
* @dfs_state_entered: timestamp (jiffies) when the dfs state was entered.
* @dfs_cac_ms: DFS CAC time in milliseconds, this is valid for DFS channels.
+ * @cac_start_time: timestamp (CLOCK_BOOTTIME, nanoseconds) when CAC was
+ * started on this channel. Zero when CAC is not in progress.
* @psd: power spectral density (in dBm)
*/
struct ieee80211_channel {
@@ -207,6 +209,7 @@ struct ieee80211_channel {
enum nl80211_dfs_state dfs_state;
unsigned long dfs_state_entered;
unsigned int dfs_cac_ms;
+ u64 cac_start_time;
s8 psd;
};
diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
index b63f71850906..c75aa039f096 100644
--- a/include/uapi/linux/nl80211.h
+++ b/include/uapi/linux/nl80211.h
@@ -4480,6 +4480,10 @@ enum nl80211_wmm_rule {
* as a non-primary subchannel. Only applicable to S1G channels.
* @NL80211_FREQUENCY_ATTR_NO_UHR: UHR operation is not allowed on this channel
* in current regulatory domain.
+ * @NL80211_FREQUENCY_ATTR_CAC_START_TIME: Channel Availability Check (CAC)
+ * start time (CLOCK_BOOTTIME, nanoseconds). Only present when CAC is
+ * currently in progress on this channel.
+ * @NL80211_FREQUENCY_ATTR_PAD: attribute used for padding for 64-bit alignment
* @NL80211_FREQUENCY_ATTR_MAX: highest frequency attribute number
* currently defined
* @__NL80211_FREQUENCY_ATTR_AFTER_LAST: internal use
@@ -4530,6 +4534,8 @@ enum nl80211_frequency_attr {
NL80211_FREQUENCY_ATTR_NO_16MHZ,
NL80211_FREQUENCY_ATTR_S1G_NO_PRIMARY,
NL80211_FREQUENCY_ATTR_NO_UHR,
+ NL80211_FREQUENCY_ATTR_CAC_START_TIME,
+ NL80211_FREQUENCY_ATTR_PAD,
/* keep last */
__NL80211_FREQUENCY_ATTR_AFTER_LAST,
diff --git a/net/wireless/chan.c b/net/wireless/chan.c
index 68221b1ab45e..dfe319565280 100644
--- a/net/wireless/chan.c
+++ b/net/wireless/chan.c
@@ -642,6 +642,33 @@ void cfg80211_set_dfs_state(struct wiphy *wiphy,
}
}
+void cfg80211_set_cac_state(struct wiphy *wiphy,
+ const struct cfg80211_chan_def *chandef,
+ bool cac_ongoing)
+{
+ struct ieee80211_channel *c;
+ int width;
+ u64 cac_time;
+
+ if (WARN_ON(!cfg80211_chandef_valid(chandef)))
+ return;
+
+ width = cfg80211_chandef_get_width(chandef);
+ if (width < 0)
+ return;
+
+ /* Get the same timestamp for all subchannels */
+ cac_time = cac_ongoing ? ktime_get_boottime_ns() : 0;
+
+ for_each_subchan(chandef, freq, cf) {
+ c = ieee80211_get_channel_khz(wiphy, freq);
+ if (!c)
+ continue;
+
+ c->cac_start_time = cac_time;
+ }
+}
+
static bool
cfg80211_dfs_permissive_check_wdev(struct cfg80211_registered_device *rdev,
enum nl80211_iftype iftype,
diff --git a/net/wireless/core.h b/net/wireless/core.h
index 6ac57b7b2615..6cace846d7a3 100644
--- a/net/wireless/core.h
+++ b/net/wireless/core.h
@@ -481,6 +481,10 @@ void cfg80211_set_dfs_state(struct wiphy *wiphy,
const struct cfg80211_chan_def *chandef,
enum nl80211_dfs_state dfs_state);
+void cfg80211_set_cac_state(struct wiphy *wiphy,
+ const struct cfg80211_chan_def *chandef,
+ bool cac_ongoing);
+
void cfg80211_dfs_channels_update_work(struct work_struct *work);
void cfg80211_sched_dfs_chan_update(struct cfg80211_registered_device *rdev);
diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c
index 212178d04efa..cafb39596a40 100644
--- a/net/wireless/mlme.c
+++ b/net/wireless/mlme.c
@@ -1162,9 +1162,11 @@ void cfg80211_cac_event(struct net_device *netdev,
fallthrough;
case NL80211_RADAR_CAC_ABORTED:
wdev->links[link_id].cac_started = false;
+ cfg80211_set_cac_state(wiphy, chandef, false);
break;
case NL80211_RADAR_CAC_STARTED:
wdev->links[link_id].cac_started = true;
+ cfg80211_set_cac_state(wiphy, chandef, true);
break;
default:
WARN_ON(1);
@@ -1192,15 +1194,18 @@ __cfg80211_background_cac_event(struct cfg80211_registered_device *rdev,
switch (event) {
case NL80211_RADAR_CAC_FINISHED:
cfg80211_set_dfs_state(wiphy, chandef, NL80211_DFS_AVAILABLE);
+ cfg80211_set_cac_state(wiphy, chandef, false);
memcpy(&rdev->cac_done_chandef, chandef, sizeof(*chandef));
queue_work(cfg80211_wq, &rdev->propagate_cac_done_wk);
cfg80211_sched_dfs_chan_update(rdev);
break;
case NL80211_RADAR_CAC_ABORTED:
+ cfg80211_set_cac_state(wiphy, chandef, false);
if (!cancel_delayed_work(&rdev->background_cac_done_wk))
return;
break;
case NL80211_RADAR_CAC_STARTED:
+ cfg80211_set_cac_state(wiphy, chandef, true);
break;
default:
return;
@@ -1306,7 +1311,9 @@ void cfg80211_stop_radar_detection(struct wireless_dev *wdev)
continue;
chandef = *wdev_chandef(wdev, link_id);
+ wdev->links[link_id].cac_started = false;
rdev_end_cac(rdev, wdev->netdev, link_id);
+ cfg80211_set_cac_state(wiphy, &chandef, false);
nl80211_radar_notify(rdev, &chandef, NL80211_RADAR_CAC_ABORTED,
wdev->netdev, GFP_KERNEL);
}
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 6e58b238a1f8..f9a739d1ebfb 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -1334,6 +1334,12 @@ static int nl80211_msg_put_channel(struct sk_buff *msg, struct wiphy *wiphy,
if ((chan->flags & IEEE80211_CHAN_NO_UHR) &&
nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_UHR))
goto nla_put_failure;
+ if (chan->cac_start_time &&
+ nla_put_u64_64bit(msg,
+ NL80211_FREQUENCY_ATTR_CAC_START_TIME,
+ chan->cac_start_time,
+ NL80211_FREQUENCY_ATTR_PAD))
+ goto nla_put_failure;
}
if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER,
@@ -11354,6 +11360,7 @@ static int nl80211_start_radar_detection(struct sk_buff *skb,
wdev->links[link_id].cac_started = true;
wdev->links[link_id].cac_start_time = jiffies;
wdev->links[link_id].cac_time_ms = cac_time_ms;
+ cfg80211_set_cac_state(wiphy, &chandef, true);
return 0;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH wireless-next 3/4] wifi: cfg80211: events, report background radar
2026-02-03 18:53 [PATCH wireless-next 0/4] DFS/CAC changes Janusz Dziedzic
2026-02-03 18:53 ` [PATCH wireless-next 1/4] wifi: cfg80211: fix background CAC Janusz Dziedzic
2026-02-03 18:53 ` [PATCH wireless-next 2/4] wifi: cfg80211: set and report chandef CAC ongoing Janusz Dziedzic
@ 2026-02-03 18:53 ` Janusz Dziedzic
2026-02-03 18:53 ` [PATCH wireless-next 4/4] wifi: mac80211_hwsim: background CAC support Janusz Dziedzic
2026-02-04 12:05 ` [PATCH wireless-next 0/4] DFS/CAC changes Johannes Berg
4 siblings, 0 replies; 8+ messages in thread
From: Janusz Dziedzic @ 2026-02-03 18:53 UTC (permalink / raw)
To: linux-wireless; +Cc: johannes, Janusz Dziedzic
In case we report radar event add also information
this is connected with background one, so user mode
application like hostapd, could check it and behave
correctly.
Signed-off-by: Janusz Dziedzic <janusz.dziedzic@gmail.com>
---
net/wireless/mlme.c | 6 ++++--
net/wireless/nl80211.c | 7 +++++++
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c
index cafb39596a40..da3786417713 100644
--- a/net/wireless/mlme.c
+++ b/net/wireless/mlme.c
@@ -1226,11 +1226,12 @@ void cfg80211_background_cac_done_wk(struct work_struct *work)
guard(wiphy)(&rdev->wiphy);
rdev_set_radar_background(rdev, NULL);
- rdev->background_radar_wdev = NULL;
__cfg80211_background_cac_event(rdev, rdev->background_radar_wdev,
&rdev->background_radar_chandef,
NL80211_RADAR_CAC_FINISHED);
+
+ rdev->background_radar_wdev = NULL;
}
void cfg80211_background_cac_abort_wk(struct work_struct *work)
@@ -1330,11 +1331,12 @@ void cfg80211_stop_background_radar_detection(struct wireless_dev *wdev)
return;
rdev_set_radar_background(rdev, NULL);
- rdev->background_radar_wdev = NULL; /* Release offchain ownership */
__cfg80211_background_cac_event(rdev, wdev,
&rdev->background_radar_chandef,
NL80211_RADAR_CAC_ABORTED);
+
+ rdev->background_radar_wdev = NULL;
}
int cfg80211_assoc_ml_reconf(struct cfg80211_registered_device *rdev,
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index f9a739d1ebfb..47b7e0559c73 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -21238,6 +21238,13 @@ nl80211_radar_notify(struct cfg80211_registered_device *rdev,
goto nla_put_failure;
}
+ if (rdev->background_radar_wdev &&
+ cfg80211_chandef_identical(&rdev->background_radar_chandef,
+ chandef)) {
+ if (nla_put_flag(msg, NL80211_ATTR_RADAR_BACKGROUND))
+ goto nla_put_failure;
+ }
+
if (nla_put_u32(msg, NL80211_ATTR_RADAR_EVENT, event))
goto nla_put_failure;
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH wireless-next 4/4] wifi: mac80211_hwsim: background CAC support
2026-02-03 18:53 [PATCH wireless-next 0/4] DFS/CAC changes Janusz Dziedzic
` (2 preceding siblings ...)
2026-02-03 18:53 ` [PATCH wireless-next 3/4] wifi: cfg80211: events, report background radar Janusz Dziedzic
@ 2026-02-03 18:53 ` Janusz Dziedzic
2026-02-04 12:05 ` [PATCH wireless-next 0/4] DFS/CAC changes Johannes Berg
4 siblings, 0 replies; 8+ messages in thread
From: Janusz Dziedzic @ 2026-02-03 18:53 UTC (permalink / raw)
To: linux-wireless; +Cc: johannes, Janusz Dziedzic
Report background CAC support and add allow
to cancel background CAC and simulate radar.
echo cancel > /sys/kernel/debug/ieee80211/phy2/hwsim/dfs_background_cac
echo radar > /sys/kernel/debug/ieee80211/phy2/hwsim/dfs_background_cac
Signed-off-by: Janusz Dziedzic <janusz.dziedzic@gmail.com>
---
drivers/net/wireless/virtual/mac80211_hwsim.c | 77 +++++++++++++++++++
drivers/net/wireless/virtual/mac80211_hwsim.h | 2 +
2 files changed, 79 insertions(+)
diff --git a/drivers/net/wireless/virtual/mac80211_hwsim.c b/drivers/net/wireless/virtual/mac80211_hwsim.c
index 4d9f5f87e814..8b5618c2111f 100644
--- a/drivers/net/wireless/virtual/mac80211_hwsim.c
+++ b/drivers/net/wireless/virtual/mac80211_hwsim.c
@@ -715,6 +715,7 @@ struct mac80211_hwsim_data {
} ps;
bool ps_poll_pending;
struct dentry *debugfs;
+ struct cfg80211_chan_def radar_background_chandef;
atomic_t pending_cookie;
struct sk_buff_head pending; /* packets pending */
@@ -936,6 +937,7 @@ static const struct nla_policy hwsim_genl_policy[HWSIM_ATTR_MAX + 1] = {
[HWSIM_ATTR_PMSR_RESULT] = NLA_POLICY_NESTED(hwsim_pmsr_peers_result_policy),
[HWSIM_ATTR_MULTI_RADIO] = { .type = NLA_FLAG },
[HWSIM_ATTR_SUPPORT_NAN_DEVICE] = { .type = NLA_FLAG },
+ [HWSIM_ATTR_SUPPORT_BACKGROUND_RADAR] = { .type = NLA_FLAG },
};
#if IS_REACHABLE(CONFIG_VIRTIO)
@@ -1164,6 +1166,41 @@ static int hwsim_write_simulate_radar(void *dat, u64 val)
DEFINE_DEBUGFS_ATTRIBUTE(hwsim_simulate_radar, NULL,
hwsim_write_simulate_radar, "%llu\n");
+static ssize_t hwsim_background_cac_write(struct file *file,
+ const char __user *user_buf,
+ size_t count, loff_t *ppos)
+{
+ struct mac80211_hwsim_data *data = file->private_data;
+ char buf[8] = {};
+
+ if (count >= sizeof(buf))
+ return -EINVAL;
+
+ if (copy_from_user(buf, user_buf, count))
+ return -EFAULT;
+
+ /* Check if background radar channel is configured */
+ if (!data->radar_background_chandef.chan)
+ return -ENOENT;
+
+ if (sysfs_streq(buf, "radar"))
+ cfg80211_background_radar_event(data->hw->wiphy,
+ &data->radar_background_chandef,
+ GFP_KERNEL);
+ else if (sysfs_streq(buf, "cancel"))
+ cfg80211_background_cac_abort(data->hw->wiphy);
+ else
+ return -EINVAL;
+
+ return count;
+}
+
+static const struct file_operations hwsim_background_cac_ops = {
+ .write = hwsim_background_cac_write,
+ .open = simple_open,
+ .llseek = default_llseek,
+};
+
static int hwsim_fops_group_read(void *dat, u64 *val)
{
struct mac80211_hwsim_data *data = dat;
@@ -4154,6 +4191,24 @@ static int mac80211_hwsim_change_nan_config(struct ieee80211_hw *hw,
return 0;
}
+static int mac80211_hwsim_set_radar_background(struct ieee80211_hw *hw,
+ struct cfg80211_chan_def *chan)
+{
+ struct mac80211_hwsim_data *data = hw->priv;
+
+ if (!wiphy_ext_feature_isset(hw->wiphy,
+ NL80211_EXT_FEATURE_RADAR_BACKGROUND))
+ return -EOPNOTSUPP;
+
+ if (chan)
+ data->radar_background_chandef = *chan;
+ else
+ memset(&data->radar_background_chandef, 0,
+ sizeof(data->radar_background_chandef));
+
+ return 0;
+}
+
#ifdef CONFIG_MAC80211_DEBUGFS
#define HWSIM_DEBUGFS_OPS \
.link_add_debugfs = mac80211_hwsim_link_add_debugfs,
@@ -4189,6 +4244,7 @@ static int mac80211_hwsim_change_nan_config(struct ieee80211_hw *hw,
.start_nan = mac80211_hwsim_start_nan, \
.stop_nan = mac80211_hwsim_stop_nan, \
.nan_change_conf = mac80211_hwsim_change_nan_config, \
+ .set_radar_background = mac80211_hwsim_set_radar_background, \
HWSIM_DEBUGFS_OPS
#define HWSIM_NON_MLO_OPS \
@@ -4255,6 +4311,7 @@ struct hwsim_new_radio_params {
bool mlo;
const struct cfg80211_pmsr_capabilities *pmsr_capa;
bool nan_device;
+ bool background_radar;
};
static void hwsim_mcast_config_msg(struct sk_buff *mcast_skb,
@@ -4340,6 +4397,12 @@ static int append_radio_msg(struct sk_buff *skb, int id,
if (ret < 0)
return ret;
}
+
+ if (param->background_radar) {
+ ret = nla_put_flag(skb, HWSIM_ATTR_SUPPORT_BACKGROUND_RADAR);
+ if (ret < 0)
+ return ret;
+ }
return 0;
}
@@ -5794,6 +5857,9 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
wiphy_ext_feature_set(hw->wiphy,
NL80211_EXT_FEATURE_DFS_CONCURRENT);
+ if (param->background_radar)
+ wiphy_ext_feature_set(hw->wiphy,
+ NL80211_EXT_FEATURE_RADAR_BACKGROUND);
if (param->no_vif)
ieee80211_hw_set(hw, NO_AUTO_VIF);
@@ -5832,6 +5898,10 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
debugfs_create_file("dfs_simulate_radar", 0222,
data->debugfs,
data, &hwsim_simulate_radar);
+ if (param->background_radar)
+ debugfs_create_file("dfs_background_cac", 0200,
+ data->debugfs,
+ data, &hwsim_background_cac_ops);
if (param->pmsr_capa) {
data->pmsr_capa = *param->pmsr_capa;
@@ -5950,6 +6020,9 @@ static int mac80211_hwsim_get_radio(struct sk_buff *skb,
param.channels = data->channels;
param.hwname = wiphy_name(data->hw->wiphy);
param.pmsr_capa = &data->pmsr_capa;
+ param.background_radar =
+ wiphy_ext_feature_isset(data->hw->wiphy,
+ NL80211_EXT_FEATURE_RADAR_BACKGROUND);
res = append_radio_msg(skb, data->idx, ¶m);
if (res < 0)
@@ -6387,6 +6460,9 @@ static int hwsim_new_radio_nl(struct sk_buff *msg, struct genl_info *info)
if (info->attrs[HWSIM_ATTR_MULTI_RADIO])
param.multi_radio = true;
+ if (info->attrs[HWSIM_ATTR_SUPPORT_BACKGROUND_RADAR])
+ param.background_radar = true;
+
if (info->attrs[HWSIM_ATTR_REG_HINT_ALPHA2])
param.reg_alpha2 =
nla_data(info->attrs[HWSIM_ATTR_REG_HINT_ALPHA2]);
@@ -7165,6 +7241,7 @@ static int __init init_mac80211_hwsim(void)
param.p2p_device = support_p2p_device;
param.mlo = mlo;
param.multi_radio = multi_radio;
+ param.background_radar = true;
param.use_chanctx = channels > 1 || mlo || multi_radio;
param.iftypes = HWSIM_IFTYPE_SUPPORT_MASK;
if (param.p2p_device)
diff --git a/drivers/net/wireless/virtual/mac80211_hwsim.h b/drivers/net/wireless/virtual/mac80211_hwsim.h
index c2d06cf852a5..a022cd5c0f1c 100644
--- a/drivers/net/wireless/virtual/mac80211_hwsim.h
+++ b/drivers/net/wireless/virtual/mac80211_hwsim.h
@@ -161,6 +161,7 @@ enum hwsim_commands {
* Adds one radio for each band. Number of supported channels will be set for
* each radio instead of for the wiphy.
* @HWSIM_ATTR_SUPPORT_NAN_DEVICE: support NAN Device virtual interface (flag)
+ * @HWSIM_ATTR_SUPPORT_BACKGROUND_RADAR: background radar/CAC support (flag)
* @__HWSIM_ATTR_MAX: enum limit
*/
enum hwsim_attrs {
@@ -195,6 +196,7 @@ enum hwsim_attrs {
HWSIM_ATTR_PMSR_RESULT,
HWSIM_ATTR_MULTI_RADIO,
HWSIM_ATTR_SUPPORT_NAN_DEVICE,
+ HWSIM_ATTR_SUPPORT_BACKGROUND_RADAR,
__HWSIM_ATTR_MAX,
};
#define HWSIM_ATTR_MAX (__HWSIM_ATTR_MAX - 1)
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH wireless-next 0/4] DFS/CAC changes
2026-02-03 18:53 [PATCH wireless-next 0/4] DFS/CAC changes Janusz Dziedzic
` (3 preceding siblings ...)
2026-02-03 18:53 ` [PATCH wireless-next 4/4] wifi: mac80211_hwsim: background CAC support Janusz Dziedzic
@ 2026-02-04 12:05 ` Johannes Berg
2026-02-04 17:08 ` Janusz Dziedzic
4 siblings, 1 reply; 8+ messages in thread
From: Johannes Berg @ 2026-02-04 12:05 UTC (permalink / raw)
To: Janusz Dziedzic, linux-wireless
Hmm.
This patchset causes dfs_cac_restart_on_enable and
dfs_us_chan_switch_precac tests from upstream hostap to fail for me, so
I'm dropping it for now.
johannes
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH wireless-next 0/4] DFS/CAC changes
2026-02-04 12:05 ` [PATCH wireless-next 0/4] DFS/CAC changes Johannes Berg
@ 2026-02-04 17:08 ` Janusz Dziedzic
2026-02-06 8:13 ` Johannes Berg
0 siblings, 1 reply; 8+ messages in thread
From: Janusz Dziedzic @ 2026-02-04 17:08 UTC (permalink / raw)
To: Johannes Berg; +Cc: linux-wireless
śr., 4 lut 2026 o 13:05 Johannes Berg <johannes@sipsolutions.net> napisał(a):
>
> Hmm.
>
> This patchset causes dfs_cac_restart_on_enable and
> dfs_us_chan_switch_precac tests from upstream hostap to fail for me, so
> I'm dropping it for now.
>
Doing smth wrong (hostap/main)?
janusz@hp:~/github/hostap/tests/hwsim$ sudo ./run-tests.py --long
dfs_us_chan_switch_precac
DEV: wlan0: 02:00:00:00:00:00
DEV: wlan1: 02:00:00:00:01:00
DEV: wlan2: 02:00:00:00:02:00
APDEV: wlan3
APDEV: wlan4
START dfs_us_chan_switch_precac 1/1
Test: DFS channel switch pre CAC - FCC domain
Starting AP wlan3 on DFS channel
Starting AP wlan3
Country code at the end: 00
PASS dfs_us_chan_switch_precac 63.1016 2026-02-04 17:20:00.697138
passed all 1 test case(s)
janusz@hp:~/github/hostap/tests/hwsim$
janusz@hp:~/github/hostap/tests/hwsim$ sudo ./run-tests.py --long -f dfs
DEV: wlan0: 02:00:00:00:00:00
DEV: wlan1: 02:00:00:00:01:00
DEV: wlan2: 02:00:00:00:02:00
APDEV: wlan3
APDEV: wlan4
....
PASS dfs_us_chan_switch_precac 63.095247 2026-02-04 17:54:42.043840
passed all 22 test case(s)
janusz@hp:~/github/hostap/tests/hwsim$
janusz@hp:~/github/hostap/tests/hwsim$ uname -a
Linux hp 6.19.0-rc7+ #58 SMP PREEMPT_DYNAMIC Wed Feb 4 16:03:27 CET
2026 x86_64 x86_64 x86_64 GNU/Linux
janusz@hp:~/github/hostap/tests/hwsim$
janusz@hp:~/github/hostap/tests/hwsim$ sudo ls
/sys/kernel/debug/ieee80211/phy15/hwsim/
dfs_background_cac dfs_simulate_radar group ps rx_rssi
janusz@hp:~/github/hostap/tests/hwsim$ iw phy15 info |grep BACKG
* [ RADAR_BACKGROUND ]: Radar background support
janusz@hp:~/github/hostap/tests/hwsim$
Seems today hostapd DFS test cases don't touch background cac.
Any idea?
BR
Janusz
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH wireless-next 0/4] DFS/CAC changes
2026-02-04 17:08 ` Janusz Dziedzic
@ 2026-02-06 8:13 ` Johannes Berg
0 siblings, 0 replies; 8+ messages in thread
From: Johannes Berg @ 2026-02-06 8:13 UTC (permalink / raw)
To: Janusz Dziedzic; +Cc: linux-wireless
On Wed, 2026-02-04 at 18:08 +0100, Janusz Dziedzic wrote:
> śr., 4 lut 2026 o 13:05 Johannes Berg <johannes@sipsolutions.net> napisał(a):
> >
> > Hmm.
> >
> > This patchset causes dfs_cac_restart_on_enable and
> > dfs_us_chan_switch_precac tests from upstream hostap to fail for me, so
> > I'm dropping it for now.
> >
>
> Doing smth wrong (hostap/main)?
>
> janusz@hp:~/github/hostap/tests/hwsim$ sudo ./run-tests.py --long
> dfs_us_chan_switch_precac
I guess you're running on HW while I'm running on UML:
$ ./tests/hwsim/vm/vm-run.sh dfs_cac_restart_on_enable dfs_us_chan_switch_precac
Starting test run in a virtual machine
./run-all.sh: running inside a VM
./run-all.sh: passing the following args to run-tests.py: --long dfs_cac_restart_on_enable dfs_us_chan_switch_precac
START dfs_cac_restart_on_enable 1/2
FAIL dfs_cac_restart_on_enable 6.219229 2026-02-06 08:10:21.198402
START dfs_us_chan_switch_precac 2/2
FAIL dfs_us_chan_switch_precac 68.059958 2026-02-06 08:11:29.258403
failed tests: dfs_cac_restart_on_enable dfs_us_chan_switch_precac
Oh! It fails with a kernel warning:
WARNING: net/mac80211/driver-ops.c:366 at drv_unassign_vif_chanctx+0x1d3/0x39e, CPU#0: hostapd/496
wlan3: Failed check-sdata-in-driver check, flags: 0x0
Modules linked in:
CPU: 0 UID: 0 PID: 496 Comm: hostapd Tainted: G W 6.19.0-rc7-01110-gad3a0d7c543a
Tainted: [W]=WARN
Stack:
00000000 00000001 ffffff00 60a32e7b
6d56f5a0 60031ac4 6d56f520 6003a286
00000000 60b341d8 60730181 00000000
Call Trace:
[<60031ac4>] ? _printk+0x0/0x49
[<6003f6f9>] show_stack+0x10e/0x11a
[<60031ac4>] ? _printk+0x0/0x49
[<6003a286>] dump_stack_lvl+0x74/0xbc
[<60730181>] ? drv_unassign_vif_chanctx+0x1d3/0x39e
[<6003a2ec>] dump_stack+0x1e/0x20
[<60058e4d>] __warn+0x113/0x221
[<60059008>] warn_slowpath_fmt+0xad/0x108
[<60730181>] drv_unassign_vif_chanctx+0x1d3/0x39e
[<607a8422>] ieee80211_assign_link_chanctx+0x176/0x4fd
[<607aa0ee>] __ieee80211_link_release_channel+0x171/0x1c4
[<6043bae1>] ? rtnl_is_locked+0x0/0x23
[<607aaa2f>] ieee80211_link_release_channel+0x94/0x9a
[<6075e998>] ieee80211_link_stop+0x143/0x14b
[<607570e9>] ieee80211_teardown_sdata+0xd1/0xd6
[<6075d453>] ieee80211_if_change_type+0x384/0x3b8
[<6076b076>] ieee80211_change_iface+0x88/0x194
[<606ba5b2>] cfg80211_change_iface+0x36e/0x4b7
[<606f4f9f>] nl80211_set_interface+0x24e/0x2b2
But it's consistent with your patches, and doesn't appear without them.
johannes
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2026-02-06 8:13 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-03 18:53 [PATCH wireless-next 0/4] DFS/CAC changes Janusz Dziedzic
2026-02-03 18:53 ` [PATCH wireless-next 1/4] wifi: cfg80211: fix background CAC Janusz Dziedzic
2026-02-03 18:53 ` [PATCH wireless-next 2/4] wifi: cfg80211: set and report chandef CAC ongoing Janusz Dziedzic
2026-02-03 18:53 ` [PATCH wireless-next 3/4] wifi: cfg80211: events, report background radar Janusz Dziedzic
2026-02-03 18:53 ` [PATCH wireless-next 4/4] wifi: mac80211_hwsim: background CAC support Janusz Dziedzic
2026-02-04 12:05 ` [PATCH wireless-next 0/4] DFS/CAC changes Johannes Berg
2026-02-04 17:08 ` Janusz Dziedzic
2026-02-06 8:13 ` Johannes Berg
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox