summaryrefslogtreecommitdiff
path: root/net/wireless/scan.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/wireless/scan.c')
-rw-r--r--net/wireless/scan.c84
1 files changed, 77 insertions, 7 deletions
diff --git a/net/wireless/scan.c b/net/wireless/scan.c
index 41b0f96a933..609d74d188c 100644
--- a/net/wireless/scan.c
+++ b/net/wireless/scan.c
@@ -265,7 +265,8 @@ void __cfg80211_sched_scan_results(struct work_struct *wk)
__cfg80211_bss_expire(rdev, request->scan_start);
spin_unlock_bh(&rdev->bss_lock);
request->scan_start =
- jiffies + msecs_to_jiffies(request->interval);
+ jiffies +
+ msecs_to_jiffies(request->long_interval);
}
nl80211_send_sched_scan_results(rdev, request->dev);
}
@@ -295,9 +296,17 @@ void cfg80211_sched_scan_stopped(struct wiphy *wiphy)
}
EXPORT_SYMBOL(cfg80211_sched_scan_stopped);
+struct cfg80211_sched_scan_request *
+cfg80211_current_sched_scan_request(struct wiphy *wiphy)
+{
+ return wiphy_to_dev(wiphy)->sched_scan_req;
+}
+EXPORT_SYMBOL(cfg80211_current_sched_scan_request);
+
int __cfg80211_stop_sched_scan(struct cfg80211_registered_device *rdev,
bool driver_initiated)
{
+ int err = 0;
struct net_device *dev;
lockdep_assert_held(&rdev->sched_scan_mtx);
@@ -308,16 +317,77 @@ int __cfg80211_stop_sched_scan(struct cfg80211_registered_device *rdev,
dev = rdev->sched_scan_req->dev;
if (!driver_initiated) {
- int err = rdev_sched_scan_stop(rdev, dev);
- if (err)
- return err;
+ err = rdev->ops->sched_scan_stop(&rdev->wiphy, dev);
+ } else {
+ nl80211_send_sched_scan(rdev, dev,
+ NL80211_CMD_SCHED_SCAN_STOPPED);
+ kfree(rdev->sched_scan_req);
+ rdev->sched_scan_req = NULL;
}
- nl80211_send_sched_scan(rdev, dev, NL80211_CMD_SCHED_SCAN_STOPPED);
+ return err;
+}
+
+void __cfg80211_send_intermediate_result(struct net_device *dev,
+ struct cfg80211_event *ev)
+{
+ struct wireless_dev *wdev;
+ struct cfg80211_registered_device *rdev;
+
+ if (!dev)
+ return;
+
+ wdev = dev->ieee80211_ptr;
+ rdev = wiphy_to_dev(wdev->wiphy);
+
+ if (rdev->scan_req)
+ nl80211_send_intermediate_result(rdev, dev, ev);
+}
- kfree(rdev->sched_scan_req);
- rdev->sched_scan_req = NULL;
+void cfg80211_send_intermediate_result(struct net_device *dev,
+ struct cfg80211_bss *cbss)
+{
+ struct cfg80211_event *ev;
+ unsigned long flags;
+ struct wireless_dev *wdev = dev->ieee80211_ptr;
+ struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
+
+ if (!rdev->im_scan_result_snd_pid || !rdev->scan_req || !cbss)
+ return;
+
+ if ((rdev->im_scan_result_min_rssi_mbm) &&
+ (rdev->im_scan_result_min_rssi_mbm > cbss->signal))
+ return;
+
+ ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
+ if (!ev)
+ return;
+
+ ev->type = EVENT_IM_SCAN_RESULT;
+ ev->im.signal = cbss->signal;
+ if (cbss->bssid)
+ memcpy(ev->im.bssid, cbss->bssid, ETH_ALEN);
+
+ spin_lock_irqsave(&wdev->event_lock, flags);
+ list_add_tail(&ev->list, &wdev->event_list);
+ spin_unlock_irqrestore(&wdev->event_lock, flags);
+ queue_work(cfg80211_wq, &rdev->event_work);
+}
+EXPORT_SYMBOL(cfg80211_send_intermediate_result);
+
+int cfg80211_scan_cancel(struct cfg80211_registered_device *rdev)
+{
+ struct net_device *dev;
+
+ ASSERT_RDEV_LOCK(rdev);
+
+ if (!rdev->ops->scan_cancel)
+ return -EOPNOTSUPP;
+ if (!rdev->scan_req)
+ return -ENOENT;
+ dev = rdev->scan_req->wdev->netdev;
+ rdev->ops->scan_cancel(&rdev->wiphy, dev);
return 0;
}