wifi: mac80211_hwsim: add incumbent signal interference detection support

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>
This commit is contained in:
Aditya Kumar Singh 2026-03-06 11:39:27 +05:30 committed by Johannes Berg
parent 35de87bf59
commit 4e0417a009

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