mirror of
https://github.com/torvalds/linux.git
synced 2026-05-24 15:12:13 +02:00
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:
parent
35de87bf59
commit
4e0417a009
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user