nl80211: add request id in scheduled scan event messages
authorArend Van Spriel <arend.vanspriel@broadcom.com>
Thu, 13 Apr 2017 12:06:27 +0000 (13:06 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 18 Apr 2017 08:23:50 +0000 (10:23 +0200)
For multi-scheduled scan support in subsequent patch a request id
will be added. This patch add this request id to the scheduled
scan event messages. For now the request id will always be zero.
With multi-scheduled scan its value will inform user-space to which
scan the event relates.

Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
Reviewed-by: Franky Lin <franky.lin@broadcom.com>
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/cfg80211.h
net/wireless/nl80211.c
net/wireless/nl80211.h
net/wireless/scan.c

index 89fa4995ddca31be12ba5048d4fad6b5e60434ea..2a200b964b7a9c074f26a78bf55adeff5d52530c 100644 (file)
@@ -1649,6 +1649,7 @@ struct cfg80211_bss_select_adjust {
 /**
  * struct cfg80211_sched_scan_request - scheduled scan request description
  *
+ * @reqid: identifies this request.
  * @ssids: SSIDs to scan for (passed in the probe_reqs in active scans)
  * @n_ssids: number of SSIDs
  * @n_channels: total number of channels to scan
@@ -1693,6 +1694,7 @@ struct cfg80211_bss_select_adjust {
  *     comparisions.
  */
 struct cfg80211_sched_scan_request {
+       u64 reqid;
        struct cfg80211_ssid *ssids;
        int n_ssids;
        u32 n_channels;
index 671b635c0625ca3bef0aca2248ded63368080181..a047992e5df1ba80e1a5aecf7d72b8ab5850b2e4 100644 (file)
@@ -7371,8 +7371,7 @@ static int nl80211_start_sched_scan(struct sk_buff *skb,
 
        rcu_assign_pointer(rdev->sched_scan_req, sched_scan_req);
 
-       nl80211_send_sched_scan(rdev, dev,
-                               NL80211_CMD_START_SCHED_SCAN);
+       nl80211_send_sched_scan(sched_scan_req, NL80211_CMD_START_SCHED_SCAN);
        return 0;
 
 out_free:
@@ -13219,18 +13218,19 @@ static int nl80211_prep_scan_msg(struct sk_buff *msg,
 
 static int
 nl80211_prep_sched_scan_msg(struct sk_buff *msg,
-                           struct cfg80211_registered_device *rdev,
-                           struct net_device *netdev,
-                           u32 portid, u32 seq, int flags, u32 cmd)
+                           struct cfg80211_sched_scan_request *req, u32 cmd)
 {
        void *hdr;
 
-       hdr = nl80211hdr_put(msg, portid, seq, flags, cmd);
+       hdr = nl80211hdr_put(msg, 0, 0, 0, cmd);
        if (!hdr)
                return -1;
 
-       if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
-           nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
+       if (nla_put_u32(msg, NL80211_ATTR_WIPHY,
+                       wiphy_to_rdev(req->wiphy)->wiphy_idx) ||
+           nla_put_u32(msg, NL80211_ATTR_IFINDEX, req->dev->ifindex) ||
+           nla_put_u64_64bit(msg, NL80211_ATTR_COOKIE, req->reqid,
+                             NL80211_ATTR_PAD))
                goto nla_put_failure;
 
        genlmsg_end(msg, hdr);
@@ -13290,8 +13290,7 @@ void nl80211_send_scan_msg(struct cfg80211_registered_device *rdev,
                                NL80211_MCGRP_SCAN, GFP_KERNEL);
 }
 
-void nl80211_send_sched_scan(struct cfg80211_registered_device *rdev,
-                            struct net_device *netdev, u32 cmd)
+void nl80211_send_sched_scan(struct cfg80211_sched_scan_request *req, u32 cmd)
 {
        struct sk_buff *msg;
 
@@ -13299,12 +13298,12 @@ void nl80211_send_sched_scan(struct cfg80211_registered_device *rdev,
        if (!msg)
                return;
 
-       if (nl80211_prep_sched_scan_msg(msg, rdev, netdev, 0, 0, 0, cmd) < 0) {
+       if (nl80211_prep_sched_scan_msg(msg, req, cmd) < 0) {
                nlmsg_free(msg);
                return;
        }
 
-       genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
+       genlmsg_multicast_netns(&nl80211_fam, wiphy_net(req->wiphy), msg, 0,
                                NL80211_MCGRP_SCAN, GFP_KERNEL);
 }
 
index 3cb17cd9577f5cad13b1c25a01fc2b674d00a634..d5f6860e62ab82941c2766192721c3a8beb3082c 100644 (file)
@@ -16,8 +16,7 @@ struct sk_buff *nl80211_build_scan_msg(struct cfg80211_registered_device *rdev,
                                       struct wireless_dev *wdev, bool aborted);
 void nl80211_send_scan_msg(struct cfg80211_registered_device *rdev,
                           struct sk_buff *msg);
-void nl80211_send_sched_scan(struct cfg80211_registered_device *rdev,
-                            struct net_device *netdev, u32 cmd);
+void nl80211_send_sched_scan(struct cfg80211_sched_scan_request *req, u32 cmd);
 void nl80211_common_reg_change_event(enum nl80211_commands cmd_id,
                                     struct regulatory_request *request);
 
index 21be56b3128ee74c4119ee67d5f0b85fecfe0b2e..6f4996c0f4df16c4e85fabef1bf4c16f8fce5538 100644 (file)
@@ -321,8 +321,7 @@ void __cfg80211_sched_scan_results(struct work_struct *wk)
                        spin_unlock_bh(&rdev->bss_lock);
                        request->scan_start = jiffies;
                }
-               nl80211_send_sched_scan(rdev, request->dev,
-                                       NL80211_CMD_SCHED_SCAN_RESULTS);
+               nl80211_send_sched_scan(request, NL80211_CMD_SCHED_SCAN_RESULTS);
        }
 
        rtnl_unlock();
@@ -379,7 +378,7 @@ int __cfg80211_stop_sched_scan(struct cfg80211_registered_device *rdev,
                        return err;
        }
 
-       nl80211_send_sched_scan(rdev, dev, NL80211_CMD_SCHED_SCAN_STOPPED);
+       nl80211_send_sched_scan(sched_scan_req, NL80211_CMD_SCHED_SCAN_STOPPED);
 
        RCU_INIT_POINTER(rdev->sched_scan_req, NULL);
        kfree_rcu(sched_scan_req, rcu_head);