mirror of
				https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux
				synced 2025-11-04 16:52:06 +10:00 
			
		
		
		
	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 New Issue
	
	Block a user