Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

nl80211/cfg80211: add 'scan_cancel' command (INTERNAL)

Mostly from an energy consumption and cpu load perspective,
it can be useful to stop a triggered scan earlier, when one
finds the desired scan results.
Adding the ability to stop a scan from user space by exposing
new NL80211_CMD_SCAN_CANCEL API.

Signed-off-by: Victor Goldenshtein <victorg@ti.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
  • Loading branch information...
commit 98491292e49ba9a51baad32c1ed553f1498d92f1 1 parent 3d19e5c
@victorgld victorgld authored ariknem committed
View
7 include/linux/nl80211.h
@@ -565,6 +565,11 @@
* %NL80211_ATTR_IFINDEX is now on %NL80211_ATTR_WIPHY_FREQ with
* %NL80211_ATTR_WIPHY_CHANNEL_TYPE.
*
+ * @NL80211_CMD_SCAN_CANCEL: Stop currently running scan (both sw and hw).
+ * This operation will eventually invoke %NL80211_CMD_SCAN_ABORTED
+ * event, partial scan results will be available. Returns -ENOENT
+ * if scan is not running.
+ *
* @NL80211_CMD_MAX: highest used command number
* @__NL80211_CMD_AFTER_LAST: internal use
*/
@@ -708,6 +713,8 @@ enum nl80211_commands {
NL80211_CMD_CH_SWITCH_NOTIFY,
+ NL80211_CMD_SCAN_CANCEL,
+
/* add new commands above here */
/* used to define NL80211_CMD_MAX below */
View
2  include/net/cfg80211.h
@@ -1510,6 +1510,7 @@ struct cfg80211_gtk_rekey_data {
* the driver, and will be valid until passed to cfg80211_scan_done().
* For scan results, call cfg80211_inform_bss(); you can call this outside
* the scan/scan_done bracket too.
+ * @scan_cancel: Stop currently running scan (both sw and hw).
*
* @auth: Request to authenticate with the specified peer
* @assoc: Request to (re)associate with the specified peer
@@ -1701,6 +1702,7 @@ struct cfg80211_ops {
int (*scan)(struct wiphy *wiphy, struct net_device *dev,
struct cfg80211_scan_request *request);
+ void (*scan_cancel)(struct wiphy *wiphy, struct net_device *dev);
int (*auth)(struct wiphy *wiphy, struct net_device *dev,
struct cfg80211_auth_request *req);
View
1  net/wireless/core.h
@@ -424,6 +424,7 @@ void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev, bool leak);
void __cfg80211_sched_scan_results(struct work_struct *wk);
int __cfg80211_stop_sched_scan(struct cfg80211_registered_device *rdev,
bool driver_initiated);
+int cfg80211_scan_cancel(struct cfg80211_registered_device *rdev);
void cfg80211_upload_connect_keys(struct wireless_dev *wdev);
int cfg80211_change_iface(struct cfg80211_registered_device *rdev,
struct net_device *dev, enum nl80211_iftype ntype,
View
13 net/wireless/nl80211.c
@@ -4462,6 +4462,11 @@ static int nl80211_stop_sched_scan(struct sk_buff *skb,
return err;
}
+static int nl80211_scan_cancel(struct sk_buff *skb, struct genl_info *info)
+{
+ return cfg80211_scan_cancel(info->user_ptr[0]);
+}
+
static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb,
u32 seq, int flags,
struct cfg80211_registered_device *rdev,
@@ -6929,6 +6934,14 @@ static struct genl_ops nl80211_ops[] = {
NL80211_FLAG_NEED_RTNL,
},
{
+ .cmd = NL80211_CMD_SCAN_CANCEL,
+ .doit = nl80211_scan_cancel,
+ .policy = nl80211_policy,
+ .flags = GENL_ADMIN_PERM,
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
+ NL80211_FLAG_NEED_RTNL,
+ },
+ {
.cmd = NL80211_CMD_GET_SCAN,
.policy = nl80211_policy,
.dumpit = nl80211_dump_scan,
View
16 net/wireless/scan.c
@@ -155,6 +155,22 @@ int __cfg80211_stop_sched_scan(struct cfg80211_registered_device *rdev,
return err;
}
+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->dev;
+ rdev->ops->scan_cancel(&rdev->wiphy, dev);
+ return 0;
+}
+
static void bss_release(struct kref *ref)
{
struct cfg80211_internal_bss *bss;
Please sign in to comment.
Something went wrong with that request. Please try again.