提交 91d3ab46 编写于 作者: V Vidyullatha Kanchanapally 提交者: Johannes Berg

cfg80211: Add support for aborting an ongoing scan

Implement new functionality for aborting an ongoing scan.

Add NL80211_CMD_ABORT_SCAN to the nl80211 interface. After
aborting the scan, driver shall provide the scan status by
calling cfg80211_scan_done().
Reviewed-by: NJouni Malinen <jouni@qca.qualcomm.com>
Signed-off-by: NVidyullatha Kanchanapally <vkanchan@qti.qualcomm.com>
Signed-off-by: NSunil Dutt <usdutt@qti.qualcomm.com>
[change command to take wdev instead of netdev so that it
 can be used on p2p-device scans]
Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
上级 b115b972
...@@ -2321,6 +2321,8 @@ struct cfg80211_qos_map { ...@@ -2321,6 +2321,8 @@ struct cfg80211_qos_map {
* the driver, and will be valid until passed to cfg80211_scan_done(). * the driver, and will be valid until passed to cfg80211_scan_done().
* For scan results, call cfg80211_inform_bss(); you can call this outside * For scan results, call cfg80211_inform_bss(); you can call this outside
* the scan/scan_done bracket too. * the scan/scan_done bracket too.
* @abort_scan: Tell the driver to abort an ongoing scan. The driver shall
* indicate the status of the scan through cfg80211_scan_done().
* *
* @auth: Request to authenticate with the specified peer * @auth: Request to authenticate with the specified peer
* (invoked with the wireless_dev mutex held) * (invoked with the wireless_dev mutex held)
...@@ -2593,6 +2595,7 @@ struct cfg80211_ops { ...@@ -2593,6 +2595,7 @@ struct cfg80211_ops {
int (*scan)(struct wiphy *wiphy, int (*scan)(struct wiphy *wiphy,
struct cfg80211_scan_request *request); struct cfg80211_scan_request *request);
void (*abort_scan)(struct wiphy *wiphy, struct wireless_dev *wdev);
int (*auth)(struct wiphy *wiphy, struct net_device *dev, int (*auth)(struct wiphy *wiphy, struct net_device *dev,
struct cfg80211_auth_request *req); struct cfg80211_auth_request *req);
......
...@@ -820,6 +820,10 @@ ...@@ -820,6 +820,10 @@
* as an event to indicate changes for devices with wiphy-specific regdom * as an event to indicate changes for devices with wiphy-specific regdom
* management. * management.
* *
* @NL80211_CMD_ABORT_SCAN: Stop an ongoing scan. Returns -ENOENT if a scan is
* not running. The driver indicates the status of the scan through
* cfg80211_scan_done().
*
* @NL80211_CMD_MAX: highest used command number * @NL80211_CMD_MAX: highest used command number
* @__NL80211_CMD_AFTER_LAST: internal use * @__NL80211_CMD_AFTER_LAST: internal use
*/ */
...@@ -1006,6 +1010,8 @@ enum nl80211_commands { ...@@ -1006,6 +1010,8 @@ enum nl80211_commands {
NL80211_CMD_WIPHY_REG_CHANGE, NL80211_CMD_WIPHY_REG_CHANGE,
NL80211_CMD_ABORT_SCAN,
/* add new commands above here */ /* add new commands above here */
/* used to define NL80211_CMD_MAX below */ /* used to define NL80211_CMD_MAX below */
......
...@@ -5997,6 +5997,24 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info) ...@@ -5997,6 +5997,24 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
return err; return err;
} }
static int nl80211_abort_scan(struct sk_buff *skb, struct genl_info *info)
{
struct cfg80211_registered_device *rdev = info->user_ptr[0];
struct wireless_dev *wdev = info->user_ptr[1];
if (!rdev->ops->abort_scan)
return -EOPNOTSUPP;
if (rdev->scan_msg)
return 0;
if (!rdev->scan_req)
return -ENOENT;
rdev_abort_scan(rdev, wdev);
return 0;
}
static int static int
nl80211_parse_sched_scan_plans(struct wiphy *wiphy, int n_plans, nl80211_parse_sched_scan_plans(struct wiphy *wiphy, int n_plans,
struct cfg80211_sched_scan_request *request, struct cfg80211_sched_scan_request *request,
...@@ -10944,6 +10962,14 @@ static const struct genl_ops nl80211_ops[] = { ...@@ -10944,6 +10962,14 @@ static const struct genl_ops nl80211_ops[] = {
.internal_flags = NL80211_FLAG_NEED_WDEV_UP | .internal_flags = NL80211_FLAG_NEED_WDEV_UP |
NL80211_FLAG_NEED_RTNL, NL80211_FLAG_NEED_RTNL,
}, },
{
.cmd = NL80211_CMD_ABORT_SCAN,
.doit = nl80211_abort_scan,
.policy = nl80211_policy,
.flags = GENL_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
NL80211_FLAG_NEED_RTNL,
},
{ {
.cmd = NL80211_CMD_GET_SCAN, .cmd = NL80211_CMD_GET_SCAN,
.policy = nl80211_policy, .policy = nl80211_policy,
......
...@@ -427,6 +427,14 @@ static inline int rdev_scan(struct cfg80211_registered_device *rdev, ...@@ -427,6 +427,14 @@ static inline int rdev_scan(struct cfg80211_registered_device *rdev,
return ret; return ret;
} }
static inline void rdev_abort_scan(struct cfg80211_registered_device *rdev,
struct wireless_dev *wdev)
{
trace_rdev_abort_scan(&rdev->wiphy, wdev);
rdev->ops->abort_scan(&rdev->wiphy, wdev);
trace_rdev_return_void(&rdev->wiphy);
}
static inline int rdev_auth(struct cfg80211_registered_device *rdev, static inline int rdev_auth(struct cfg80211_registered_device *rdev,
struct net_device *dev, struct net_device *dev,
struct cfg80211_auth_request *req) struct cfg80211_auth_request *req)
......
...@@ -2917,6 +2917,10 @@ TRACE_EVENT(rdev_set_coalesce, ...@@ -2917,6 +2917,10 @@ TRACE_EVENT(rdev_set_coalesce,
WIPHY_PR_ARG, __entry->n_rules) WIPHY_PR_ARG, __entry->n_rules)
); );
DEFINE_EVENT(wiphy_wdev_evt, rdev_abort_scan,
TP_PROTO(struct wiphy *wiphy, struct wireless_dev *wdev),
TP_ARGS(wiphy, wdev)
);
#endif /* !__RDEV_OPS_TRACE || TRACE_HEADER_MULTI_READ */ #endif /* !__RDEV_OPS_TRACE || TRACE_HEADER_MULTI_READ */
#undef TRACE_INCLUDE_PATH #undef TRACE_INCLUDE_PATH
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册