All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] cfg80211: Add option to specify previous BSSID for Connect command
@ 2016-03-29 10:53 Jouni Malinen
  2016-03-29 10:53 ` [PATCH 2/2] cfg80211: Allow reassociation to be requested with internal SME Jouni Malinen
  0 siblings, 1 reply; 3+ messages in thread
From: Jouni Malinen @ 2016-03-29 10:53 UTC (permalink / raw)
  To: Johannes Berg; +Cc: linux-wireless

This extends NL80211_CMD_CONNECT to allow the NL80211_ATTR_PREV_BSSID
attribute to be used similarly to way this was already allowed with
NL80211_CMD_ASSOCIATE. This allows user space to request reassociation
(instead of association) when already connected to an AP. This provides
an option to reassociate within an ESS without having to disconnect and
associate with the AP.

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
---
 include/net/cfg80211.h | 2 ++
 net/wireless/nl80211.c | 4 ++++
 net/wireless/trace.h   | 6 ++++--
 3 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 0bbfbf3..5fbb14d 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -1923,6 +1923,7 @@ struct cfg80211_bss_selection {
  * @pbss: if set, connect to a PCP instead of AP. Valid for DMG
  *	networks.
  * @bss_select: criteria to be used for BSS selection.
+ * @prev_bssid: previous BSSID, if not %NULL use reassociate frame
  */
 struct cfg80211_connect_params {
 	struct ieee80211_channel *channel;
@@ -1947,6 +1948,7 @@ struct cfg80211_connect_params {
 	struct ieee80211_vht_cap vht_capa_mask;
 	bool pbss;
 	struct cfg80211_bss_selection bss_select;
+	const u8 *prev_bssid;
 };
 
 /**
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index d6c6449..a98665a 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -8024,6 +8024,10 @@ static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
 		connect.mfp = NL80211_MFP_NO;
 	}
 
+	if (info->attrs[NL80211_ATTR_PREV_BSSID])
+		connect.prev_bssid =
+			nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
+
 	if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
 		connect.channel = nl80211_get_valid_chan(
 			wiphy, info->attrs[NL80211_ATTR_WIPHY_FREQ]);
diff --git a/net/wireless/trace.h b/net/wireless/trace.h
index 09b242b..8da1fae 100644
--- a/net/wireless/trace.h
+++ b/net/wireless/trace.h
@@ -1259,6 +1259,7 @@ TRACE_EVENT(rdev_connect,
 		__field(bool, privacy)
 		__field(u32, wpa_versions)
 		__field(u32, flags)
+		MAC_ENTRY(prev_bssid)
 	),
 	TP_fast_assign(
 		WIPHY_ASSIGN;
@@ -1270,13 +1271,14 @@ TRACE_EVENT(rdev_connect,
 		__entry->privacy = sme->privacy;
 		__entry->wpa_versions = sme->crypto.wpa_versions;
 		__entry->flags = sme->flags;
+		MAC_ASSIGN(prev_bssid, sme->prev_bssid);
 	),
 	TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", bssid: " MAC_PR_FMT
 		  ", ssid: %s, auth type: %d, privacy: %s, wpa versions: %u, "
-		  "flags: %u",
+		  "flags: %u, previous bssid: " MAC_PR_FMT,
 		  WIPHY_PR_ARG, NETDEV_PR_ARG, MAC_PR_ARG(bssid), __entry->ssid,
 		  __entry->auth_type, BOOL_TO_STR(__entry->privacy),
-		  __entry->wpa_versions, __entry->flags)
+		  __entry->wpa_versions, __entry->flags, MAC_PR_ARG(prev_bssid))
 );
 
 TRACE_EVENT(rdev_set_cqm_rssi_config,
-- 
1.9.1


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

* [PATCH 2/2] cfg80211: Allow reassociation to be requested with internal SME
  2016-03-29 10:53 [PATCH 1/2] cfg80211: Add option to specify previous BSSID for Connect command Jouni Malinen
@ 2016-03-29 10:53 ` Jouni Malinen
  2016-04-06 13:09   ` Johannes Berg
  0 siblings, 1 reply; 3+ messages in thread
From: Jouni Malinen @ 2016-03-29 10:53 UTC (permalink / raw)
  To: Johannes Berg; +Cc: linux-wireless

If the user space issues a NL80211_CMD_CONNECT with
NL80211_ATTR_PREV_BSSID when there is already a connection, allow this
to proceed as a reassociation instead of rejecting the new connect
command with EALREADY.

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
---
 net/wireless/nl80211.c |  3 ++-
 net/wireless/sme.c     | 11 +++++++++--
 2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index a98665a..773b20f 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -8117,7 +8117,8 @@ static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
 	}
 
 	wdev_lock(dev->ieee80211_ptr);
-	err = cfg80211_connect(rdev, dev, &connect, connkeys, NULL);
+	err = cfg80211_connect(rdev, dev, &connect, connkeys,
+			       connect.prev_bssid);
 	wdev_unlock(dev->ieee80211_ptr);
 	if (err)
 		kzfree(connkeys);
diff --git a/net/wireless/sme.c b/net/wireless/sme.c
index 65882d2..ce32492 100644
--- a/net/wireless/sme.c
+++ b/net/wireless/sme.c
@@ -492,8 +492,15 @@ static int cfg80211_sme_connect(struct wireless_dev *wdev,
 	if (!rdev->ops->auth || !rdev->ops->assoc)
 		return -EOPNOTSUPP;
 
-	if (wdev->current_bss)
-		return -EALREADY;
+	if (wdev->current_bss) {
+		if (!prev_bssid)
+			return -EALREADY;
+		cfg80211_unhold_bss(wdev->current_bss);
+		cfg80211_put_bss(wdev->wiphy, &wdev->current_bss->pub);
+		wdev->current_bss = NULL;
+
+		cfg80211_sme_free(wdev);
+	}
 
 	if (WARN_ON(wdev->conn))
 		return -EINPROGRESS;
-- 
1.9.1


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

* Re: [PATCH 2/2] cfg80211: Allow reassociation to be requested with internal SME
  2016-03-29 10:53 ` [PATCH 2/2] cfg80211: Allow reassociation to be requested with internal SME Jouni Malinen
@ 2016-04-06 13:09   ` Johannes Berg
  0 siblings, 0 replies; 3+ messages in thread
From: Johannes Berg @ 2016-04-06 13:09 UTC (permalink / raw)
  To: Jouni Malinen; +Cc: linux-wireless

On Tue, 2016-03-29 at 13:53 +0300, Jouni Malinen wrote:
> If the user space issues a NL80211_CMD_CONNECT with
> NL80211_ATTR_PREV_BSSID when there is already a connection, allow
> this
> to proceed as a reassociation instead of rejecting the new connect
> command with EALREADY.
> 
> Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
> ---
>  net/wireless/nl80211.c |  3 ++-
>  net/wireless/sme.c     | 11 +++++++++--
>  2 files changed, 11 insertions(+), 3 deletions(-)
> 
> diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
> index a98665a..773b20f 100644
> --- a/net/wireless/nl80211.c
> +++ b/net/wireless/nl80211.c
> @@ -8117,7 +8117,8 @@ static int nl80211_connect(struct sk_buff *skb,
> struct genl_info *info)
>  	}
>  
>  	wdev_lock(dev->ieee80211_ptr);
> -	err = cfg80211_connect(rdev, dev, &connect, connkeys, NULL);
> +	err = cfg80211_connect(rdev, dev, &connect, connkeys,
> +			       connect.prev_bssid);
>  	wdev_unlock(dev->ieee80211_ptr);
>  	if (err)
>  		kzfree(connkeys);
> diff --git a/net/wireless/sme.c b/net/wireless/sme.c
> index 65882d2..ce32492 100644
> --- a/net/wireless/sme.c
> +++ b/net/wireless/sme.c
> @@ -492,8 +492,15 @@ static int cfg80211_sme_connect(struct
> wireless_dev *wdev,
>  	if (!rdev->ops->auth || !rdev->ops->assoc)
>  		return -EOPNOTSUPP;
>  
> -	if (wdev->current_bss)
> -		return -EALREADY;
> +	if (wdev->current_bss) {
> +		if (!prev_bssid)
> +			return -EALREADY;
> +		cfg80211_unhold_bss(wdev->current_bss);
> +		cfg80211_put_bss(wdev->wiphy, &wdev->current_bss-
> >pub);
> +		wdev->current_bss = NULL;
> +
> +		cfg80211_sme_free(wdev);
> +	}
> 
Since we know the previous BSSID, I've added a check here for it.

johannes

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

end of thread, other threads:[~2016-04-06 13:09 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-03-29 10:53 [PATCH 1/2] cfg80211: Add option to specify previous BSSID for Connect command Jouni Malinen
2016-03-29 10:53 ` [PATCH 2/2] cfg80211: Allow reassociation to be requested with internal SME Jouni Malinen
2016-04-06 13:09   ` Johannes Berg

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.