All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jouni Malinen <j@w1.fi>
To: Johannes Berg <johannes@sipsolutions.net>
Cc: Jouni Malinen <jouni.malinen@atheros.com>,
	"John W. Linville" <linville@tuxdriver.com>,
	linux-wireless@vger.kernel.org
Subject: Re: [PATCH] nl80211: Optional IEs into scan request
Date: Fri, 13 Feb 2009 13:15:23 +0200	[thread overview]
Message-ID: <20090213111523.GA22438@jm.kir.nu> (raw)
In-Reply-To: <1234522804.4219.13.camel@johannes.local>

On Fri, Feb 13, 2009 at 12:00:04PM +0100, Johannes Berg wrote:

> Looks like this will conflict with my ibss splitout patch?

Yeah.. Here's a compile-tested, rebased version. I'll send PATCHv2 after
having had a chance to test this more properly.

This extends the NL80211_CMD_TRIGGER_SCAN command to allow applications
to specify a set of information element(s) to be added into Probe
Request frames with NL80211_ATTR_IE. This provides support for the
MLME-SCAN.request primitive parameter VendorSpecificInfo and can be
used, e.g., to implement WPS scanning.

Signed-off-by: Jouni Malinen <jouni.malinen@atheros.com>
Acked-by: Johannes Berg <johannes@sipsolutions.net>

---
 include/net/cfg80211.h     |    4 ++++
 net/mac80211/ieee80211_i.h |    3 ++-
 net/mac80211/mlme.c        |    8 +++++---
 net/mac80211/scan.c        |    3 ++-
 net/mac80211/util.c        |    7 +++++--
 net/wireless/nl80211.c     |   21 ++++++++++++++++++++-
 6 files changed, 38 insertions(+), 8 deletions(-)

--- wireless-testing.orig/include/net/cfg80211.h	2009-02-12 14:43:39.000000000 +0200
+++ wireless-testing/include/net/cfg80211.h	2009-02-13 13:08:37.000000000 +0200
@@ -525,6 +525,8 @@ struct cfg80211_ssid {
  * @n_ssids: number of SSIDs
  * @channels: channels to scan on.
  * @n_channels: number of channels for each band
+ * @ie: optional information element(s) to add into Probe Request or %NULL
+ * @ie_len: length of ie in octets
  * @wiphy: the wiphy this was for
  * @ifidx: the interface index
  */
@@ -533,6 +535,8 @@ struct cfg80211_scan_request {
 	int n_ssids;
 	struct ieee80211_channel **channels;
 	u32 n_channels;
+	u8 *ie;
+	size_t ie_len;
 
 	/* internal */
 	struct wiphy *wiphy;
--- wireless-testing.orig/net/mac80211/scan.c	2009-02-13 13:04:17.000000000 +0200
+++ wireless-testing/net/mac80211/scan.c	2009-02-13 13:08:37.000000000 +0200
@@ -338,7 +338,8 @@ void ieee80211_scan_work(struct work_str
 			ieee80211_send_probe_req(
 				sdata, NULL,
 				local->scan_req->ssids[i].ssid,
-				local->scan_req->ssids[i].ssid_len);
+				local->scan_req->ssids[i].ssid_len,
+				local->scan_req->ie, local->scan_req->ie_len);
 		next_delay = IEEE80211_CHANNEL_TIME;
 		break;
 	}
--- wireless-testing.orig/net/wireless/nl80211.c	2009-02-12 14:43:39.000000000 +0200
+++ wireless-testing/net/wireless/nl80211.c	2009-02-13 13:08:37.000000000 +0200
@@ -2286,6 +2286,7 @@ static int nl80211_trigger_scan(struct s
 	struct wiphy *wiphy;
 	int err, tmp, n_ssids = 0, n_channels = 0, i;
 	enum ieee80211_band band;
+	size_t ie_len;
 
 	err = get_drv_dev_by_info_ifindex(info->attrs, &drv, &dev);
 	if (err)
@@ -2327,9 +2328,15 @@ static int nl80211_trigger_scan(struct s
 		goto out_unlock;
 	}
 
+	if (info->attrs[NL80211_ATTR_IE])
+		ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
+	else
+		ie_len = 0;
+
 	request = kzalloc(sizeof(*request)
 			+ sizeof(*ssid) * n_ssids
-			+ sizeof(channel) * n_channels, GFP_KERNEL);
+			+ sizeof(channel) * n_channels
+			+ ie_len, GFP_KERNEL);
 	if (!request) {
 		err = -ENOMEM;
 		goto out_unlock;
@@ -2340,6 +2347,12 @@ static int nl80211_trigger_scan(struct s
 	if (n_ssids)
 		request->ssids = (void *)(request->channels + n_channels);
 	request->n_ssids = n_ssids;
+	if (ie_len) {
+		if (request->ssids)
+			request->ie = (void *)(request->ssids + n_ssids);
+		else
+			request->ie = (void *)(request->channels + n_channels);
+	}
 
 	if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES]) {
 		/* user specified, bail out if channel not found */
@@ -2380,6 +2393,12 @@ static int nl80211_trigger_scan(struct s
 		}
 	}
 
+	if (info->attrs[NL80211_ATTR_IE]) {
+		request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
+		memcpy(request->ie, nla_data(info->attrs[NL80211_ATTR_IE]),
+		       request->ie_len);
+	}
+
 	request->ifidx = dev->ifindex;
 	request->wiphy = &drv->wiphy;
 
--- wireless-testing.orig/net/mac80211/ieee80211_i.h	2009-02-13 13:11:07.000000000 +0200
+++ wireless-testing/net/mac80211/ieee80211_i.h	2009-02-13 13:11:24.000000000 +0200
@@ -1079,7 +1079,8 @@ void ieee80211_send_auth(struct ieee8021
 			 u8 *extra, size_t extra_len,
 			 const u8 *bssid, int encrypt);
 void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst,
-			      u8 *ssid, size_t ssid_len);
+			      u8 *ssid, size_t ssid_len,
+			      u8 *ie, size_t ie_len);
 
 void ieee80211_sta_def_wmm_params(struct ieee80211_sub_if_data *sdata,
 				  const size_t supp_rates_len,
--- wireless-testing.orig/net/mac80211/mlme.c	2009-02-13 13:10:15.000000000 +0200
+++ wireless-testing/net/mac80211/mlme.c	2009-02-13 13:10:45.000000000 +0200
@@ -716,7 +716,7 @@ static void ieee80211_direct_probe(struc
 	 * will not answer to direct packet in unassociated state.
 	 */
 	ieee80211_send_probe_req(sdata, NULL,
-				 ifmgd->ssid, ifmgd->ssid_len);
+				 ifmgd->ssid, ifmgd->ssid_len, NULL, 0);
 
 	mod_timer(&ifmgd->timer, jiffies + IEEE80211_AUTH_TIMEOUT);
 }
@@ -946,7 +946,8 @@ static void ieee80211_associated(struct 
 			} else
 				ieee80211_send_probe_req(sdata, ifmgd->bssid,
 							 ifmgd->ssid,
-							 ifmgd->ssid_len);
+							 ifmgd->ssid_len,
+							 NULL, 0);
 			ifmgd->flags ^= IEEE80211_STA_PROBEREQ_POLL;
 		} else {
 			ifmgd->flags &= ~IEEE80211_STA_PROBEREQ_POLL;
@@ -955,7 +956,8 @@ static void ieee80211_associated(struct 
 				ifmgd->last_probe = jiffies;
 				ieee80211_send_probe_req(sdata, ifmgd->bssid,
 							 ifmgd->ssid,
-							 ifmgd->ssid_len);
+							 ifmgd->ssid_len,
+							 NULL, 0);
 			}
 		}
 	}
--- wireless-testing.orig/net/mac80211/util.c	2009-02-13 13:08:44.000000000 +0200
+++ wireless-testing/net/mac80211/util.c	2009-02-13 13:11:58.000000000 +0200
@@ -835,7 +835,8 @@ void ieee80211_send_auth(struct ieee8021
 }
 
 void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst,
-			      u8 *ssid, size_t ssid_len)
+			      u8 *ssid, size_t ssid_len,
+			      u8 *ie, size_t ie_len)
 {
 	struct ieee80211_local *local = sdata->local;
 	struct ieee80211_supported_band *sband;
@@ -854,7 +855,7 @@ void ieee80211_send_probe_req(struct iee
 	}
 
 	skb = dev_alloc_skb(local->hw.extra_tx_headroom + sizeof(*mgmt) + 200 +
-			    extra_preq_ie_len);
+			    ie_len + extra_preq_ie_len);
 	if (!skb) {
 		printk(KERN_DEBUG "%s: failed to allocate buffer for probe "
 		       "request\n", sdata->dev->name);
@@ -901,6 +902,8 @@ void ieee80211_send_probe_req(struct iee
 		*pos = rate->bitrate / 5;
 	}
 
+	if (ie)
+		memcpy(skb_put(skb, ie_len), ie, ie_len);
 	if (extra_preq_ie)
 		memcpy(skb_put(skb, extra_preq_ie_len), extra_preq_ie,
 		       extra_preq_ie_len);

-- 
Jouni Malinen                                            PGP id EFC895FA

  reply	other threads:[~2009-02-13 11:15 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-02-13 10:53 [PATCH] nl80211: Optional IEs into scan request Jouni Malinen
2009-02-13 11:00 ` Johannes Berg
2009-02-13 11:15   ` Jouni Malinen [this message]
2009-02-15 13:09     ` Tomas Winkler
2009-02-15 15:44       ` Jouni Malinen
2009-02-15 20:40         ` Tomas Winkler
2009-03-25 15:38           ` Tomas Winkler
2009-03-25 16:32             ` Jouni Malinen
2009-02-15 16:12       ` Johannes Berg
2009-02-15 20:45         ` Tomas Winkler

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20090213111523.GA22438@jm.kir.nu \
    --to=j@w1.fi \
    --cc=johannes@sipsolutions.net \
    --cc=jouni.malinen@atheros.com \
    --cc=linux-wireless@vger.kernel.org \
    --cc=linville@tuxdriver.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.