cfg80211: issue netlink notification when scan starts
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>
This commit is contained in:
parent
222ec50a0a
commit
a538e2d5a3
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue