cfg80211: issue netlink notification when scan starts
authorJohannes Berg <johannes@sipsolutions.net>
Tue, 16 Jun 2009 17:56:42 +0000 (19:56 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 10 Jul 2009 18:57:53 +0000 (14:57 -0400)
To ease multiple apps working together smoothly,
send a notification when a scan is started.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/wireless/nl80211.c
net/wireless/nl80211.h
net/wireless/scan.c

index f91e5d4..5a6c4ca 100644 (file)
@@ -2839,6 +2839,9 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
        drv->scan_req = request;
        err = drv->ops->scan(&drv->wiphy, dev, request);
 
+       if (!err)
+               nl80211_send_scan_start(drv, dev);
+
  out_free:
        if (err) {
                drv->scan_req = NULL;
@@ -3665,11 +3668,11 @@ static int nl80211_add_scan_req(struct sk_buff *msg,
        return -ENOBUFS;
 }
 
-static int nl80211_send_scan_donemsg(struct sk_buff *msg,
-                                    struct cfg80211_registered_device *rdev,
-                                    struct net_device *netdev,
-                                    u32 pid, u32 seq, int flags,
-                                    u32 cmd)
+static int nl80211_send_scan_msg(struct sk_buff *msg,
+                                struct cfg80211_registered_device *rdev,
+                                struct net_device *netdev,
+                                u32 pid, u32 seq, int flags,
+                                u32 cmd)
 {
        void *hdr;
 
@@ -3690,6 +3693,24 @@ static int nl80211_send_scan_donemsg(struct sk_buff *msg,
        return -EMSGSIZE;
 }
 
+void nl80211_send_scan_start(struct cfg80211_registered_device *rdev,
+                            struct net_device *netdev)
+{
+       struct sk_buff *msg;
+
+       msg = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
+       if (!msg)
+               return;
+
+       if (nl80211_send_scan_msg(msg, rdev, netdev, 0, 0, 0,
+                                 NL80211_CMD_TRIGGER_SCAN) < 0) {
+               nlmsg_free(msg);
+               return;
+       }
+
+       genlmsg_multicast(msg, 0, nl80211_scan_mcgrp.id, GFP_KERNEL);
+}
+
 void nl80211_send_scan_done(struct cfg80211_registered_device *rdev,
                            struct net_device *netdev)
 {
@@ -3699,8 +3720,8 @@ void nl80211_send_scan_done(struct cfg80211_registered_device *rdev,
        if (!msg)
                return;
 
-       if (nl80211_send_scan_donemsg(msg, rdev, netdev, 0, 0, 0,
-                                     NL80211_CMD_NEW_SCAN_RESULTS) < 0) {
+       if (nl80211_send_scan_msg(msg, rdev, netdev, 0, 0, 0,
+                                 NL80211_CMD_NEW_SCAN_RESULTS) < 0) {
                nlmsg_free(msg);
                return;
        }
@@ -3717,8 +3738,8 @@ void nl80211_send_scan_aborted(struct cfg80211_registered_device *rdev,
        if (!msg)
                return;
 
-       if (nl80211_send_scan_donemsg(msg, rdev, netdev, 0, 0, 0,
-                                     NL80211_CMD_SCAN_ABORTED) < 0) {
+       if (nl80211_send_scan_msg(msg, rdev, netdev, 0, 0, 0,
+                                 NL80211_CMD_SCAN_ABORTED) < 0) {
                nlmsg_free(msg);
                return;
        }
index 5c12ad1..a3872a4 100644 (file)
@@ -6,6 +6,8 @@
 extern int nl80211_init(void);
 extern void nl80211_exit(void);
 extern void nl80211_notify_dev_rename(struct cfg80211_registered_device *rdev);
+extern void nl80211_send_scan_start(struct cfg80211_registered_device *rdev,
+                                   struct net_device *netdev);
 extern void nl80211_send_scan_done(struct cfg80211_registered_device *rdev,
                                   struct net_device *netdev);
 extern void nl80211_send_scan_aborted(struct cfg80211_registered_device *rdev,
index f8e71b3..261a063 100644 (file)
@@ -647,7 +647,8 @@ int cfg80211_wext_siwscan(struct net_device *dev,
        if (err) {
                rdev->scan_req = NULL;
                kfree(creq);
-       }
+       } else
+               nl80211_send_scan_start(rdev, dev);
  out:
        cfg80211_put_dev(rdev);
        return err;