All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/2] Stop scheduled scan if netlink client disappears
@ 2014-11-12 11:36 Jukka Rissanen
  2014-11-12 11:36 ` [PATCH v2 1/2] nl80211: Replace interface socket owner attribute with more generic one Jukka Rissanen
  2014-11-12 11:36 ` [PATCH v2 2/2] nl80211: Stop scheduled scan if netlink client disappears Jukka Rissanen
  0 siblings, 2 replies; 5+ messages in thread
From: Jukka Rissanen @ 2014-11-12 11:36 UTC (permalink / raw)
  To: linux-wireless

Hi,

v2:

- split the patch
- In patch 1, use a generic NL80211_ATTR_SOCKET_OWNER attribute and
  convert the old code that uses NL80211_ATTR_IFACE_SOCKET_OWNER to
  use the new value. A define is provided for backward compatibility.
- Any pending schedule scan stop worker is cancelled when interface is
  taken down in patch 2

Cheers,
Jukka


Jukka Rissanen (2):
  nl80211: Replace interface socket owner attribute with more generic
    one
  nl80211: Stop scheduled scan if netlink client disappears

 include/net/cfg80211.h       |  2 ++
 include/uapi/linux/nl80211.h | 11 ++++++++---
 net/wireless/core.c          | 10 +++++++++-
 net/wireless/nl80211.c       | 38 ++++++++++++++++++++++++++++++++++++--
 4 files changed, 55 insertions(+), 6 deletions(-)

-- 
1.8.3.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 1/2] nl80211: Replace interface socket owner attribute with more generic one
  2014-11-12 11:36 [PATCH v2 0/2] Stop scheduled scan if netlink client disappears Jukka Rissanen
@ 2014-11-12 11:36 ` Jukka Rissanen
  2014-11-12 11:47   ` Luca Coelho
  2014-11-12 11:36 ` [PATCH v2 2/2] nl80211: Stop scheduled scan if netlink client disappears Jukka Rissanen
  1 sibling, 1 reply; 5+ messages in thread
From: Jukka Rissanen @ 2014-11-12 11:36 UTC (permalink / raw)
  To: linux-wireless

Replace NL80211_ATTR_IFACE_SOCKET_OWNER attribute with more generic
NL80211_ATTR_SOCKET_OWNER that can be used with other commands
that interface creation.
---
 include/uapi/linux/nl80211.h | 8 +++++---
 net/wireless/nl80211.c       | 4 ++--
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
index 442369f..c410284 100644
--- a/include/uapi/linux/nl80211.h
+++ b/include/uapi/linux/nl80211.h
@@ -1637,9 +1637,9 @@ enum nl80211_commands {
  * @NL80211_ATTR_TDLS_PEER_CAPABILITY: flags for TDLS peer capabilities, u32.
  *	As specified in the &enum nl80211_tdls_peer_capability.
  *
- * @NL80211_ATTR_IFACE_SOCKET_OWNER: flag attribute, if set during interface
+ * @NL80211_ATTR_SOCKET_OWNER: Flag attribute, if set during interface
  *	creation then the new interface will be owned by the netlink socket
- *	that created it and will be destroyed when the socket is closed
+ *	that created it and will be destroyed when the socket is closed.
  *
  * @NL80211_ATTR_TDLS_INITIATOR: flag attribute indicating the current end is
  *	the TDLS link initiator.
@@ -2004,7 +2004,7 @@ enum nl80211_attrs {
 
 	NL80211_ATTR_TDLS_PEER_CAPABILITY,
 
-	NL80211_ATTR_IFACE_SOCKET_OWNER,
+	NL80211_ATTR_SOCKET_OWNER,
 
 	NL80211_ATTR_CSA_C_OFFSETS_TX,
 	NL80211_ATTR_MAX_CSA_COUNTERS,
@@ -2056,6 +2056,8 @@ enum nl80211_attrs {
 #define NL80211_ATTR_KEY NL80211_ATTR_KEY
 #define NL80211_ATTR_KEYS NL80211_ATTR_KEYS
 #define NL80211_ATTR_FEATURE_FLAGS NL80211_ATTR_FEATURE_FLAGS
+#define NL80211_ATTR_IFACE_SOCKET_OWNER NL80211_ATTR_SOCKET_OWNER
+#define NL80211_ATTR_SOCKET_OWNER NL80211_ATTR_SOCKET_OWNER
 
 #define NL80211_MAX_SUPP_RATES			32
 #define NL80211_MAX_SUPP_HT_RATES		77
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index d0a8361..df447c0 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -388,7 +388,7 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = {
 	[NL80211_ATTR_MAC_HINT] = { .len = ETH_ALEN },
 	[NL80211_ATTR_WIPHY_FREQ_HINT] = { .type = NLA_U32 },
 	[NL80211_ATTR_TDLS_PEER_CAPABILITY] = { .type = NLA_U32 },
-	[NL80211_ATTR_IFACE_SOCKET_OWNER] = { .type = NLA_FLAG },
+	[NL80211_ATTR_SOCKET_OWNER] = { .type = NLA_FLAG },
 	[NL80211_ATTR_CSA_C_OFFSETS_TX] = { .type = NLA_BINARY },
 	[NL80211_ATTR_USE_RRM] = { .type = NLA_FLAG },
 	[NL80211_ATTR_TSID] = { .type = NLA_U8 },
@@ -2646,7 +2646,7 @@ static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info)
 		return PTR_ERR(wdev);
 	}
 
-	if (info->attrs[NL80211_ATTR_IFACE_SOCKET_OWNER])
+	if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
 		wdev->owner_nlportid = info->snd_portid;
 
 	switch (type) {
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v2 2/2] nl80211: Stop scheduled scan if netlink client disappears
  2014-11-12 11:36 [PATCH v2 0/2] Stop scheduled scan if netlink client disappears Jukka Rissanen
  2014-11-12 11:36 ` [PATCH v2 1/2] nl80211: Replace interface socket owner attribute with more generic one Jukka Rissanen
@ 2014-11-12 11:36 ` Jukka Rissanen
  1 sibling, 0 replies; 5+ messages in thread
From: Jukka Rissanen @ 2014-11-12 11:36 UTC (permalink / raw)
  To: linux-wireless

An attribute NL80211_ATTR_SOCKET_OWNER can be set by the scan initiator.
If present, the attribute will cause the scan to be stopped if the client
dies.
---
 include/net/cfg80211.h       |  2 ++
 include/uapi/linux/nl80211.h |  3 +++
 net/wireless/core.c          | 10 +++++++++-
 net/wireless/nl80211.c       | 34 ++++++++++++++++++++++++++++++++++
 4 files changed, 48 insertions(+), 1 deletion(-)

diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 220d5f5..84378bf 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -1512,6 +1512,8 @@ struct cfg80211_sched_scan_request {
 	struct wiphy *wiphy;
 	struct net_device *dev;
 	unsigned long scan_start;
+	u32 owner_nlportid;
+	struct work_struct sched_scan_stop_wk;
 
 	/* keep last */
 	struct ieee80211_channel *channels[0];
diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
index c410284..310dc9b 100644
--- a/include/uapi/linux/nl80211.h
+++ b/include/uapi/linux/nl80211.h
@@ -1640,6 +1640,9 @@ enum nl80211_commands {
  * @NL80211_ATTR_SOCKET_OWNER: Flag attribute, if set during interface
  *	creation then the new interface will be owned by the netlink socket
  *	that created it and will be destroyed when the socket is closed.
+ *	If set during scheduled scan start then the new scan req will be
+ *	owned by the netlink socket that created it and the scheduled scan will
+ *	be stopped when the socket is closed.
  *
  * @NL80211_ATTR_TDLS_INITIATOR: flag attribute indicating the current end is
  *	the TDLS link initiator.
diff --git a/net/wireless/core.c b/net/wireless/core.c
index a4d2792..88898d9 100644
--- a/net/wireless/core.c
+++ b/net/wireless/core.c
@@ -840,6 +840,8 @@ void __cfg80211_leave(struct cfg80211_registered_device *rdev,
 		      struct wireless_dev *wdev)
 {
 	struct net_device *dev = wdev->netdev;
+	struct cfg80211_sched_scan_request *sched_scan_req =
+		rdev->sched_scan_req;
 
 	ASSERT_RTNL();
 	ASSERT_WDEV_LOCK(wdev);
@@ -850,8 +852,10 @@ void __cfg80211_leave(struct cfg80211_registered_device *rdev,
 		break;
 	case NL80211_IFTYPE_P2P_CLIENT:
 	case NL80211_IFTYPE_STATION:
-		if (rdev->sched_scan_req && dev == rdev->sched_scan_req->dev)
+		if (sched_scan_req && dev == sched_scan_req->dev) {
+			cancel_work_sync(&sched_scan_req->sched_scan_stop_wk);
 			__cfg80211_stop_sched_scan(rdev, false);
+		}
 
 #ifdef CONFIG_CFG80211_WEXT
 		kfree(wdev->wext.ie);
@@ -991,6 +995,10 @@ static int cfg80211_netdev_notifier_call(struct notifier_block *nb,
 
 		if (WARN_ON(rdev->sched_scan_req &&
 			    rdev->sched_scan_req->dev == wdev->netdev)) {
+			struct cfg80211_sched_scan_request *sched_scan_req =
+				rdev->sched_scan_req;
+
+			cancel_work_sync(&sched_scan_req->sched_scan_stop_wk);
 			__cfg80211_stop_sched_scan(rdev, false);
 		}
 
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index df447c0..8fc500d 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -5681,6 +5681,21 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
 	return err;
 }
 
+static void nl80211_sched_scan_stop_wk(struct work_struct *work)
+{
+	struct cfg80211_sched_scan_request *req;
+	struct cfg80211_registered_device *rdev;
+
+	req = container_of(work, struct cfg80211_sched_scan_request,
+			   sched_scan_stop_wk);
+
+	rdev = wiphy_to_rdev(req->wiphy);
+
+	rtnl_lock();
+	__cfg80211_stop_sched_scan(rdev, false);
+	rtnl_unlock();
+}
+
 static int nl80211_start_sched_scan(struct sk_buff *skb,
 				    struct genl_info *info)
 {
@@ -5955,6 +5970,13 @@ static int nl80211_start_sched_scan(struct sk_buff *skb,
 
 	err = rdev_sched_scan_start(rdev, dev, request);
 	if (!err) {
+		if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
+			INIT_WORK(&request->sched_scan_stop_wk,
+				  nl80211_sched_scan_stop_wk);
+
+			request->owner_nlportid = info->snd_portid;
+		}
+
 		rdev->sched_scan_req = request;
 		nl80211_send_sched_scan(rdev, dev,
 					NL80211_CMD_START_SCHED_SCAN);
@@ -12127,6 +12149,12 @@ static int nl80211_netlink_notify(struct notifier_block * nb,
 
 	list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) {
 		bool schedule_destroy_work = false;
+		bool schedule_scan_stop = false;
+		struct cfg80211_sched_scan_request *req = rdev->sched_scan_req;
+
+		if (req && req->owner_nlportid == notify->portid &&
+		    notify->portid)
+			schedule_scan_stop = true;
 
 		list_for_each_entry_rcu(wdev, &rdev->wdev_list, list) {
 			cfg80211_mlme_unregister_socket(wdev, notify->portid);
@@ -12157,6 +12185,12 @@ static int nl80211_netlink_notify(struct notifier_block * nb,
 				spin_unlock(&rdev->destroy_list_lock);
 				schedule_work(&rdev->destroy_work);
 			}
+		} else if (schedule_scan_stop) {
+			req->owner_nlportid = 0;
+
+			if (rdev->ops->sched_scan_stop &&
+			    rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN)
+				schedule_work(&req->sched_scan_stop_wk);
 		}
 	}
 
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 1/2] nl80211: Replace interface socket owner attribute with more generic one
  2014-11-12 11:36 ` [PATCH v2 1/2] nl80211: Replace interface socket owner attribute with more generic one Jukka Rissanen
@ 2014-11-12 11:47   ` Luca Coelho
  2014-11-12 11:52     ` Johannes Berg
  0 siblings, 1 reply; 5+ messages in thread
From: Luca Coelho @ 2014-11-12 11:47 UTC (permalink / raw)
  To: Jukka Rissanen; +Cc: linux-wireless

On Wed, 2014-11-12 at 13:36 +0200, Jukka Rissanen wrote:
> @@ -2056,6 +2056,8 @@ enum nl80211_attrs {
>  #define NL80211_ATTR_KEY NL80211_ATTR_KEY
>  #define NL80211_ATTR_KEYS NL80211_ATTR_KEYS
>  #define NL80211_ATTR_FEATURE_FLAGS NL80211_ATTR_FEATURE_FLAGS
> +#define NL80211_ATTR_IFACE_SOCKET_OWNER NL80211_ATTR_SOCKET_OWNER
> +#define NL80211_ATTR_SOCKET_OWNER NL80211_ATTR_SOCKET_OWNER

The second define seems to be a mistake?

--
Luca.


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 1/2] nl80211: Replace interface socket owner attribute with more generic one
  2014-11-12 11:47   ` Luca Coelho
@ 2014-11-12 11:52     ` Johannes Berg
  0 siblings, 0 replies; 5+ messages in thread
From: Johannes Berg @ 2014-11-12 11:52 UTC (permalink / raw)
  To: Luca Coelho; +Cc: Jukka Rissanen, linux-wireless

On Wed, 2014-11-12 at 13:47 +0200, Luca Coelho wrote:
> On Wed, 2014-11-12 at 13:36 +0200, Jukka Rissanen wrote:
> > @@ -2056,6 +2056,8 @@ enum nl80211_attrs {
> >  #define NL80211_ATTR_KEY NL80211_ATTR_KEY
> >  #define NL80211_ATTR_KEYS NL80211_ATTR_KEYS
> >  #define NL80211_ATTR_FEATURE_FLAGS NL80211_ATTR_FEATURE_FLAGS
> > +#define NL80211_ATTR_IFACE_SOCKET_OWNER NL80211_ATTR_SOCKET_OWNER
> > +#define NL80211_ATTR_SOCKET_OWNER NL80211_ATTR_SOCKET_OWNER
> 
> The second define seems to be a mistake?

Yes, both are wrong here. We played with defining some attributes to
themselves to allow #ifdef feature detection, but that didn't really
work out well and now we just copy nl80211.h to the userspace tools
needing a recent version. I think that's no longer needed now.

There should already be a second block of #ifdefs though that has
renamed ones, so you should add this one there.

Your patch is also missing signed-off-by.

johannes


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2014-11-12 11:52 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-11-12 11:36 [PATCH v2 0/2] Stop scheduled scan if netlink client disappears Jukka Rissanen
2014-11-12 11:36 ` [PATCH v2 1/2] nl80211: Replace interface socket owner attribute with more generic one Jukka Rissanen
2014-11-12 11:47   ` Luca Coelho
2014-11-12 11:52     ` Johannes Berg
2014-11-12 11:36 ` [PATCH v2 2/2] nl80211: Stop scheduled scan if netlink client disappears Jukka Rissanen

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.