]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: mac80211_hwsim: add incumbent signal interference detection support
authorAditya Kumar Singh <aditya.kumar.singh@oss.qualcomm.com>
Fri, 6 Mar 2026 06:09:27 +0000 (11:39 +0530)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 6 Mar 2026 09:54:42 +0000 (10:54 +0100)
Add a debugfs 'simulate_incumbent_signal_interference' with custom
file_operations and a .write that accepts "<freq_mhz> <bitmap>". The
handler selects the 6 GHz chanctx whose primary 20 MHz center matches
<freq_mhz> and reports the event via cfg80211_incumbent_signal_notify().
The bitmap marks affected 20 MHz segments within the current chandef
(lowest bit = lowest segment)

Signed-off-by: Aditya Kumar Singh <aditya.kumar.singh@oss.qualcomm.com>
Signed-off-by: Amith A <amith.a@oss.qualcomm.com>
Link: https://patch.msgid.link/20260306060927.504567-2-amith.a@oss.qualcomm.com
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/virtual/mac80211_hwsim.c

index 32897d88bda3209ed4ca3779280a2aac44baafae..82adcc848189980b137547df7a5f8a5d7952f247 100644 (file)
@@ -36,6 +36,8 @@
 #include <linux/virtio.h>
 #include <linux/virtio_ids.h>
 #include <linux/virtio_config.h>
+#include <linux/uaccess.h>
+#include <linux/string.h>
 #include "mac80211_hwsim.h"
 
 #define WARN_QUEUE 100
@@ -1203,6 +1205,65 @@ static const struct file_operations hwsim_background_cac_ops = {
        .llseek = default_llseek,
 };
 
+struct hwsim_chanctx_iter_arg {
+       struct ieee80211_chanctx_conf *conf;
+       u32 freq_mhz;
+};
+
+static void hwsim_6ghz_chanctx_iter(struct ieee80211_hw *hw,
+                                   struct ieee80211_chanctx_conf *conf,
+                                   void *data)
+{
+       struct hwsim_chanctx_iter_arg *arg = data;
+
+       if (conf->def.chan &&
+           conf->def.chan->band == NL80211_BAND_6GHZ &&
+           conf->def.chan->center_freq == arg->freq_mhz)
+               arg->conf = conf;
+}
+
+static ssize_t hwsim_simulate_incumbent_signal_write(struct file *file,
+                                                    const char __user *ubuf,
+                                                    size_t len, loff_t *ppos)
+{
+       struct mac80211_hwsim_data *data = file->private_data;
+       struct hwsim_chanctx_iter_arg arg = {};
+       u32 bitmap;
+       char buf[64];
+
+       if (!len || len > sizeof(buf) - 1)
+               return -EINVAL;
+
+       if (copy_from_user(buf, ubuf, len))
+               return -EFAULT;
+       buf[len] = '\0';
+
+       if (sscanf(buf, "%u %i", &arg.freq_mhz, &bitmap) != 2)
+               return -EINVAL;
+
+       if (!arg.freq_mhz)
+               return -EINVAL;
+
+       ieee80211_iter_chan_contexts_atomic(data->hw,
+                                           hwsim_6ghz_chanctx_iter,
+                                           &arg);
+
+       if (!arg.conf)
+               return -EINVAL;
+
+       cfg80211_incumbent_signal_notify(data->hw->wiphy,
+                                        &arg.conf->def,
+                                        bitmap,
+                                        GFP_KERNEL);
+
+       return len;
+}
+
+static const struct file_operations hwsim_simulate_incumbent_signal_fops = {
+       .open   = simple_open,
+       .write  = hwsim_simulate_incumbent_signal_write,
+};
+
 static int hwsim_fops_group_read(void *dat, u64 *val)
 {
        struct mac80211_hwsim_data *data = dat;
@@ -5950,6 +6011,9 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
                debugfs_create_file("dfs_background_cac", 0200,
                                    data->debugfs,
                                    data, &hwsim_background_cac_ops);
+       debugfs_create_file("simulate_incumbent_signal_interference", 0200,
+                           data->debugfs,
+                           data, &hwsim_simulate_incumbent_signal_fops);
 
        if (param->pmsr_capa) {
                data->pmsr_capa = *param->pmsr_capa;