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;
|
drv->scan_req = request;
|
||||||
err = drv->ops->scan(&drv->wiphy, dev, request);
|
err = drv->ops->scan(&drv->wiphy, dev, request);
|
||||||
|
|
||||||
|
if (!err)
|
||||||
|
nl80211_send_scan_start(drv, dev);
|
||||||
|
|
||||||
out_free:
|
out_free:
|
||||||
if (err) {
|
if (err) {
|
||||||
drv->scan_req = NULL;
|
drv->scan_req = NULL;
|
||||||
|
@ -3665,11 +3668,11 @@ static int nl80211_add_scan_req(struct sk_buff *msg,
|
||||||
return -ENOBUFS;
|
return -ENOBUFS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nl80211_send_scan_donemsg(struct sk_buff *msg,
|
static int nl80211_send_scan_msg(struct sk_buff *msg,
|
||||||
struct cfg80211_registered_device *rdev,
|
struct cfg80211_registered_device *rdev,
|
||||||
struct net_device *netdev,
|
struct net_device *netdev,
|
||||||
u32 pid, u32 seq, int flags,
|
u32 pid, u32 seq, int flags,
|
||||||
u32 cmd)
|
u32 cmd)
|
||||||
{
|
{
|
||||||
void *hdr;
|
void *hdr;
|
||||||
|
|
||||||
|
@ -3690,6 +3693,24 @@ static int nl80211_send_scan_donemsg(struct sk_buff *msg,
|
||||||
return -EMSGSIZE;
|
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,
|
void nl80211_send_scan_done(struct cfg80211_registered_device *rdev,
|
||||||
struct net_device *netdev)
|
struct net_device *netdev)
|
||||||
{
|
{
|
||||||
|
@ -3699,8 +3720,8 @@ void nl80211_send_scan_done(struct cfg80211_registered_device *rdev,
|
||||||
if (!msg)
|
if (!msg)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (nl80211_send_scan_donemsg(msg, rdev, netdev, 0, 0, 0,
|
if (nl80211_send_scan_msg(msg, rdev, netdev, 0, 0, 0,
|
||||||
NL80211_CMD_NEW_SCAN_RESULTS) < 0) {
|
NL80211_CMD_NEW_SCAN_RESULTS) < 0) {
|
||||||
nlmsg_free(msg);
|
nlmsg_free(msg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -3717,8 +3738,8 @@ void nl80211_send_scan_aborted(struct cfg80211_registered_device *rdev,
|
||||||
if (!msg)
|
if (!msg)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (nl80211_send_scan_donemsg(msg, rdev, netdev, 0, 0, 0,
|
if (nl80211_send_scan_msg(msg, rdev, netdev, 0, 0, 0,
|
||||||
NL80211_CMD_SCAN_ABORTED) < 0) {
|
NL80211_CMD_SCAN_ABORTED) < 0) {
|
||||||
nlmsg_free(msg);
|
nlmsg_free(msg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
extern int nl80211_init(void);
|
extern int nl80211_init(void);
|
||||||
extern void nl80211_exit(void);
|
extern void nl80211_exit(void);
|
||||||
extern void nl80211_notify_dev_rename(struct cfg80211_registered_device *rdev);
|
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,
|
extern void nl80211_send_scan_done(struct cfg80211_registered_device *rdev,
|
||||||
struct net_device *netdev);
|
struct net_device *netdev);
|
||||||
extern void nl80211_send_scan_aborted(struct cfg80211_registered_device *rdev,
|
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) {
|
if (err) {
|
||||||
rdev->scan_req = NULL;
|
rdev->scan_req = NULL;
|
||||||
kfree(creq);
|
kfree(creq);
|
||||||
}
|
} else
|
||||||
|
nl80211_send_scan_start(rdev, dev);
|
||||||
out:
|
out:
|
||||||
cfg80211_put_dev(rdev);
|
cfg80211_put_dev(rdev);
|
||||||
return err;
|
return err;
|
||||||
|
|
Loading…
Reference in New Issue