Commit 69068036 authored by Johannes Berg's avatar Johannes Berg Committed by John W. Linville

mac80211_hwsim: add fake hw scan handler

For debugging hardware scan trigger/complete
functionality, it was useful to have code in
hwsim that pretends to do a hardware scan.

This code could be extended to actually do the
scan, but for now it was sufficient for me to
only pretend. Since hwsim was written to ease
debugging, it only makes sense to add it to it
permanently.
Signed-off-by: default avatarJohannes Berg <johannes@sipsolutions.net>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 6e7e6213
...@@ -32,6 +32,10 @@ static int radios = 2; ...@@ -32,6 +32,10 @@ static int radios = 2;
module_param(radios, int, 0444); module_param(radios, int, 0444);
MODULE_PARM_DESC(radios, "Number of simulated radios"); MODULE_PARM_DESC(radios, "Number of simulated radios");
static bool fake_hw_scan;
module_param(fake_hw_scan, bool, 0444);
MODULE_PARM_DESC(fake_hw_scan, "Install fake (no-op) hw-scan handler");
/** /**
* enum hwsim_regtest - the type of regulatory tests we offer * enum hwsim_regtest - the type of regulatory tests we offer
* *
...@@ -908,8 +912,43 @@ static void mac80211_hwsim_flush(struct ieee80211_hw *hw, bool drop) ...@@ -908,8 +912,43 @@ static void mac80211_hwsim_flush(struct ieee80211_hw *hw, bool drop)
*/ */
} }
struct hw_scan_done {
struct delayed_work w;
struct ieee80211_hw *hw;
};
static void hw_scan_done(struct work_struct *work)
{
struct hw_scan_done *hsd =
container_of(work, struct hw_scan_done, w.work);
ieee80211_scan_completed(hsd->hw, false);
kfree(hsd);
}
static int mac80211_hwsim_hw_scan(struct ieee80211_hw *hw,
struct cfg80211_scan_request *req)
{
struct hw_scan_done *hsd = kzalloc(sizeof(*hsd), GFP_KERNEL);
int i;
if (!hsd)
return -ENOMEM;
hsd->hw = hw;
INIT_DELAYED_WORK(&hsd->w, hw_scan_done);
printk(KERN_DEBUG "hwsim scan request\n");
for (i = 0; i < req->n_channels; i++)
printk(KERN_DEBUG "hwsim scan freq %d\n",
req->channels[i]->center_freq);
ieee80211_queue_delayed_work(hw, &hsd->w, 2 * HZ);
static const struct ieee80211_ops mac80211_hwsim_ops = return 0;
}
static struct ieee80211_ops mac80211_hwsim_ops =
{ {
.tx = mac80211_hwsim_tx, .tx = mac80211_hwsim_tx,
.start = mac80211_hwsim_start, .start = mac80211_hwsim_start,
...@@ -1119,6 +1158,9 @@ static int __init init_mac80211_hwsim(void) ...@@ -1119,6 +1158,9 @@ static int __init init_mac80211_hwsim(void)
if (radios < 1 || radios > 100) if (radios < 1 || radios > 100)
return -EINVAL; return -EINVAL;
if (fake_hw_scan)
mac80211_hwsim_ops.hw_scan = mac80211_hwsim_hw_scan;
spin_lock_init(&hwsim_radio_lock); spin_lock_init(&hwsim_radio_lock);
INIT_LIST_HEAD(&hwsim_radios); INIT_LIST_HEAD(&hwsim_radios);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment