linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH iw v2 0/4] iw: add scheduled scan support
@ 2015-03-17 14:11 Luca Coelho
  2015-03-17 14:11 ` [PATCH iw v2 1/4] iw: move generic sched scan parsing code out of net detect Luca Coelho
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Luca Coelho @ 2015-03-17 14:11 UTC (permalink / raw)
  To: johannes; +Cc: linux-wireless

From: Luciano Coelho <luciano.coelho@intel.com>

This series adds scheduled scan support to the iw tool (finally! ;).

In v2, just rebased.

Luciano Coelho (4):
  iw: move generic sched scan parsing code out of net detect
  iw: implement scheduled scan
  iw: add support for active scheduled scan
  iw: add randomise option for sched_scan

 event.c  |   9 +++
 info.c   |   6 ++
 iw.h     |   4 +
 scan.c   | 266 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 wowlan.c | 174 ++---------------------------------------
 5 files changed, 292 insertions(+), 167 deletions(-)

-- 
2.1.4


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

* [PATCH iw v2 1/4] iw: move generic sched scan parsing code out of net detect
  2015-03-17 14:11 [PATCH iw v2 0/4] iw: add scheduled scan support Luca Coelho
@ 2015-03-17 14:11 ` Luca Coelho
  2015-03-17 14:11 ` [PATCH iw v2 2/4] iw: implement scheduled scan Luca Coelho
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Luca Coelho @ 2015-03-17 14:11 UTC (permalink / raw)
  To: johannes; +Cc: linux-wireless

From: Luciano Coelho <luciano.coelho@intel.com>

The scheduled scan structure is pretty much the same as the net-detect
WoWLAN trigger's.  Move the bulk of the command line parsing code to
a generic function so we can reuse it for sched_scan.

Signed-off-by: Luciano Coelho <luciano.coelho@intel.com>
---
 iw.h     |   4 ++
 scan.c   | 170 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 wowlan.c | 174 +++------------------------------------------------------------
 3 files changed, 181 insertions(+), 167 deletions(-)

diff --git a/iw.h b/iw.h
index db88a86..efc21d6 100644
--- a/iw.h
+++ b/iw.h
@@ -173,6 +173,10 @@ void print_ies(unsigned char *ie, int ielen, bool unknown,
 void parse_bitrate(struct nlattr *bitrate_attr, char *buf, int buflen);
 void iw_hexdump(const char *prefix, const __u8 *data, size_t len);
 
+#define SCHED_SCAN_OPTIONS "interval <in_msecs> [delay <in_secs>] " \
+	"[freqs <freq>+] [matches [ssid <ssid>]+]]"
+int parse_sched_scan(struct nl_msg *msg, int *argc, char ***argv);
+
 DECLARE_SECTION(set);
 DECLARE_SECTION(get);
 
diff --git a/scan.c b/scan.c
index 538b30e..d1c3bf2 100644
--- a/scan.c
+++ b/scan.c
@@ -99,6 +99,176 @@ static int parse_random_mac_addr(struct nl_msg *msg, char *arg)
 	return -ENOBUFS;
 }
 
+int parse_sched_scan(struct nl_msg *msg, int *argc, char ***argv)
+{
+	struct nl_msg *matchset = NULL, *freqs = NULL;
+	struct nlattr *match = NULL;
+	enum {
+		ND_TOPLEVEL,
+		ND_MATCH,
+		ND_FREQS,
+	} parse_state = ND_TOPLEVEL;
+	int c  = *argc;
+	char *end, **v = *argv;
+	int err = 0, i = 0;
+	unsigned int freq, interval = 0, delay = 0;
+	bool have_matchset = false, have_freqs = false;
+
+	matchset = nlmsg_alloc();
+	if (!matchset) {
+		err = -ENOBUFS;
+		goto out;
+	}
+
+	freqs = nlmsg_alloc();
+	if (!freqs) {
+		err = -ENOBUFS;
+		goto out;
+	}
+
+	while (c) {
+		switch (parse_state) {
+		case ND_TOPLEVEL:
+			if (!strcmp(v[0], "interval")) {
+				c--; v++;
+				if (c == 0) {
+					err = -EINVAL;
+					goto nla_put_failure;
+				}
+
+				if (interval) {
+					err = -EINVAL;
+					goto nla_put_failure;
+				}
+				interval = strtoul(v[0], &end, 10);
+				if (*end || !interval) {
+					err = -EINVAL;
+					goto nla_put_failure;
+				}
+				NLA_PUT_U32(msg,
+					    NL80211_ATTR_SCHED_SCAN_INTERVAL,
+					    interval);
+			} else if (!strcmp(v[0], "delay")) {
+				c--; v++;
+				if (c == 0) {
+					err = -EINVAL;
+					goto nla_put_failure;
+				}
+
+				if (delay) {
+					err = -EINVAL;
+					goto nla_put_failure;
+				}
+				delay = strtoul(v[0], &end, 10);
+				if (*end) {
+					err = -EINVAL;
+					goto nla_put_failure;
+				}
+				NLA_PUT_U32(msg,
+					    NL80211_ATTR_SCHED_SCAN_DELAY,
+					    delay);
+			} else if (!strcmp(v[0], "matches")) {
+				parse_state = ND_MATCH;
+				if (have_matchset) {
+					err = -EINVAL;
+					goto nla_put_failure;
+				}
+
+				i = 0;
+			} else if (!strcmp(v[0], "freqs")) {
+				parse_state = ND_FREQS;
+				if (have_freqs) {
+					err = -EINVAL;
+					goto nla_put_failure;
+				}
+
+				have_freqs = true;
+				i = 0;
+			} else {
+				/* this element is not for us, so
+				 * return to continue parsing.
+				 */
+				goto nla_put_failure;
+			}
+			c--; v++;
+
+			break;
+		case ND_MATCH:
+			if (!strcmp(v[0], "ssid")) {
+				c--; v++;
+				if (c == 0) {
+					err = -EINVAL;
+					goto nla_put_failure;
+				}
+
+				/* TODO: for now we can only have an
+				 * SSID in the match, so we can start
+				 * the match nest here.
+				 */
+				match = nla_nest_start(matchset, i);
+				if (!match) {
+					err = -ENOBUFS;
+					goto nla_put_failure;
+				}
+
+				NLA_PUT(matchset,
+					NL80211_SCHED_SCAN_MATCH_ATTR_SSID,
+					strlen(v[0]), v[0]);
+				nla_nest_end(matchset, match);
+				match = NULL;
+
+				have_matchset = true;
+				i++;
+				c--; v++;
+			} else {
+				/* other element that cannot be part
+				 * of a match indicates the end of the
+				 * match. */
+				/* need at least one match in the matchset */
+				if (i == 0) {
+					err = -EINVAL;
+					goto nla_put_failure;
+				}
+
+				parse_state = ND_TOPLEVEL;
+			}
+
+			break;
+		case ND_FREQS:
+			freq = strtoul(v[0], &end, 10);
+			if (*end) {
+				if (i == 0) {
+					err = -EINVAL;
+					goto nla_put_failure;
+				}
+
+				parse_state = ND_TOPLEVEL;
+			} else {
+				NLA_PUT_U32(freqs, i, freq);
+				i++;
+				c--; v++;
+			}
+			break;
+		}
+	}
+
+	if (have_freqs)
+		nla_put_nested(msg, NL80211_ATTR_SCAN_FREQUENCIES, freqs);
+	if (have_matchset)
+		nla_put_nested(msg, NL80211_ATTR_SCHED_SCAN_MATCH, matchset);
+
+nla_put_failure:
+	if (match)
+		nla_nest_end(msg, match);
+	nlmsg_free(freqs);
+	nlmsg_free(matchset);
+
+out:
+	*argc = c;
+	*argv = v;
+	return err;
+}
+
 static int handle_scan(struct nl80211_state *state,
 		       struct nl_cb *cb,
 		       struct nl_msg *msg,
diff --git a/wowlan.c b/wowlan.c
index 82932e8..3a87665 100644
--- a/wowlan.c
+++ b/wowlan.c
@@ -183,177 +183,17 @@ static int wowlan_parse_tcp_file(struct nl_msg *msg, const char *fn)
 
 static int wowlan_parse_net_detect(struct nl_msg *msg, int *argc, char ***argv)
 {
-	struct nl_msg *matchset = NULL, *freqs = NULL;
-	struct nlattr *nd, *match = NULL;
-	enum {
-		ND_TOPLEVEL,
-		ND_MATCH,
-		ND_FREQS,
-	} parse_state = ND_TOPLEVEL;
-	int c  = *argc;
-	char *end, **v = *argv;
-	int err = 0, i = 0;
-	unsigned int freq, interval = 0, delay = 0;
-	bool have_matchset = false, have_freqs = false;
+	struct nlattr *nd;
+	int err = 0;
 
 	nd = nla_nest_start(msg, NL80211_WOWLAN_TRIG_NET_DETECT);
-	if (!nd) {
-		err = -ENOBUFS;
-		goto out;
-	}
-
-	matchset = nlmsg_alloc();
-	if (!matchset) {
-		err = -ENOBUFS;
-		goto out;
-	}
-
-	freqs = nlmsg_alloc();
-	if (!freqs) {
-		err = -ENOBUFS;
-		goto out;
-	}
-
-	while (c) {
-		switch (parse_state) {
-		case ND_TOPLEVEL:
-			if (!strcmp(v[0], "interval")) {
-				c--; v++;
-				if (c == 0) {
-					err = -EINVAL;
-					goto nla_put_failure;
-				}
-
-				if (interval) {
-					err = -EINVAL;
-					goto nla_put_failure;
-				}
-				interval = strtoul(v[0], &end, 10);
-				if (*end || !interval) {
-					err = -EINVAL;
-					goto nla_put_failure;
-				}
-				NLA_PUT_U32(msg,
-					    NL80211_ATTR_SCHED_SCAN_INTERVAL,
-					    interval);
-			} else if (!strcmp(v[0], "delay")) {
-				c--; v++;
-				if (c == 0) {
-					err = -EINVAL;
-					goto nla_put_failure;
-				}
-
-				if (delay) {
-					err = -EINVAL;
-					goto nla_put_failure;
-				}
-				delay = strtoul(v[0], &end, 10);
-				if (*end) {
-					err = -EINVAL;
-					goto nla_put_failure;
-				}
-				NLA_PUT_U32(msg,
-					    NL80211_ATTR_SCHED_SCAN_DELAY,
-					    delay);
-			} else if (!strcmp(v[0], "matches")) {
-				parse_state = ND_MATCH;
-				if (have_matchset) {
-					err = -EINVAL;
-					goto nla_put_failure;
-				}
-
-				i = 0;
-			} else if (!strcmp(v[0], "freqs")) {
-				parse_state = ND_FREQS;
-				if (have_freqs) {
-					err = -EINVAL;
-					goto nla_put_failure;
-				}
-
-				have_freqs = true;
-				i = 0;
-			} else {
-				/* this element is not for us, so
-				 * return to continue parsing.
-				 */
-				goto nla_put_failure;
-			}
-			c--; v++;
-
-			break;
-		case ND_MATCH:
-			if (!strcmp(v[0], "ssid")) {
-				c--; v++;
-				if (c == 0) {
-					err = -EINVAL;
-					goto nla_put_failure;
-				}
-
-				/* TODO: for now we can only have an
-				 * SSID in the match, so we can start
-				 * the match nest here.
-				 */
-				match = nla_nest_start(matchset, i);
-				if (!match) {
-					err = -ENOBUFS;
-					goto nla_put_failure;
-				}
-
-				NLA_PUT(matchset,
-					NL80211_SCHED_SCAN_MATCH_ATTR_SSID,
-					strlen(v[0]), v[0]);
-				nla_nest_end(matchset, match);
-				match = NULL;
-
-				have_matchset = true;
-				i++;
-				c--; v++;
-			} else {
-				/* other element that cannot be part
-				 * of a match indicates the end of the
-				 * match. */
-				/* need at least one match in the matchset */
-				if (i == 0) {
-					err = -EINVAL;
-					goto nla_put_failure;
-				}
-
-				parse_state = ND_TOPLEVEL;
-			}
-
-			break;
-		case ND_FREQS:
-			freq = strtoul(v[0], &end, 10);
-			if (*end) {
-				if (i == 0) {
-					err = -EINVAL;
-					goto nla_put_failure;
-				}
-
-				parse_state = ND_TOPLEVEL;
-			} else {
-				NLA_PUT_U32(freqs, i, freq);
-				i++;
-				c--; v++;
-			}
-			break;
-		}
-	}
+	if (!nd)
+		return -ENOBUFS;
 
-	if (have_freqs)
-		nla_put_nested(msg, NL80211_ATTR_SCAN_FREQUENCIES, freqs);
-	if (have_matchset)
-		nla_put_nested(msg, NL80211_ATTR_SCHED_SCAN_MATCH, matchset);
+	err = parse_sched_scan(msg, argc, argv);
 
-nla_put_failure:
-	if (match)
-		nla_nest_end(msg, match);
-	nlmsg_free(freqs);
-	nlmsg_free(matchset);
 	nla_nest_end(msg, nd);
-out:
-	*argc = c;
-	*argv = v;
+
 	return err;
 }
 
@@ -473,7 +313,7 @@ static int handle_wowlan_enable(struct nl80211_state *state, struct nl_cb *cb,
 	return err;
 }
 COMMAND(wowlan, enable, "[any] [disconnect] [magic-packet] [gtk-rekey-failure] [eap-identity-request]"
-	" [4way-handshake] [rfkill-release] [net-detect interval <in_msecs> [delay <in_secs>] [freqs <freq>+] [matches [ssid <ssid>]+]]"
+	" [4way-handshake] [rfkill-release] [net-detect " SCHED_SCAN_OPTIONS "]"
 	" [tcp <config-file>] [patterns [offset1+]<pattern1> ...]",
 	NL80211_CMD_SET_WOWLAN, 0, CIB_PHY, handle_wowlan_enable,
 	"Enable WoWLAN with the given triggers.\n"
-- 
2.1.4


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

* [PATCH iw v2 2/4] iw: implement scheduled scan
  2015-03-17 14:11 [PATCH iw v2 0/4] iw: add scheduled scan support Luca Coelho
  2015-03-17 14:11 ` [PATCH iw v2 1/4] iw: move generic sched scan parsing code out of net detect Luca Coelho
@ 2015-03-17 14:11 ` Luca Coelho
  2015-03-17 14:11 ` [PATCH iw v2 3/4] iw: add support for active " Luca Coelho
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Luca Coelho @ 2015-03-17 14:11 UTC (permalink / raw)
  To: johannes; +Cc: linux-wireless

From: Luciano Coelho <luciano.coelho@nokia.com>

Add sched_start, sched_stop and events parsing for scheduled scan.
For now, only passive scans are supported.

Signed-off-by: Luciano Coelho <luciano.coelho@intel.com>
---
 event.c |  9 +++++++++
 info.c  |  6 ++++++
 scan.c  | 29 +++++++++++++++++++++++++++++
 3 files changed, 44 insertions(+)

diff --git a/event.c b/event.c
index 71ab7f7..929854b 100644
--- a/event.c
+++ b/event.c
@@ -359,6 +359,15 @@ static int print_event(struct nl_msg *msg, void *arg)
 		}
 		printf("\n");
 		break;
+	case NL80211_CMD_START_SCHED_SCAN:
+		printf("scheduled scan started\n");
+		break;
+	case NL80211_CMD_SCHED_SCAN_STOPPED:
+		printf("sched scan stopped\n");
+		break;
+	case NL80211_CMD_SCHED_SCAN_RESULTS:
+		printf("got scheduled scan results\n");
+		break;
 	case NL80211_CMD_REG_CHANGE:
 		printf("regulatory domain change: ");
 
diff --git a/info.c b/info.c
index 1df503f..66887e3 100644
--- a/info.c
+++ b/info.c
@@ -232,6 +232,12 @@ next:
 	if (tb_msg[NL80211_ATTR_MAX_SCAN_IE_LEN])
 		printf("\tmax scan IEs length: %d bytes\n",
 		       nla_get_u16(tb_msg[NL80211_ATTR_MAX_SCAN_IE_LEN]));
+	if (tb_msg[NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS])
+		printf("\tmax # sched scan SSIDs: %d\n",
+		       nla_get_u8(tb_msg[NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS]));
+	if (tb_msg[NL80211_ATTR_MAX_MATCH_SETS])
+		printf("\tmax # match sets: %d\n",
+		       nla_get_u8(tb_msg[NL80211_ATTR_MAX_MATCH_SETS]));
 
 	if (tb_msg[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) {
 		unsigned int frag;
diff --git a/scan.c b/scan.c
index d1c3bf2..e534fd4 100644
--- a/scan.c
+++ b/scan.c
@@ -1980,3 +1980,32 @@ COMMAND(scan, trigger, "[freq <freq>*] [ies <hex as 00:11:..>] [meshid <meshid>]
 	NL80211_CMD_TRIGGER_SCAN, 0, CIB_NETDEV, handle_scan,
 	 "Trigger a scan on the given frequencies with probing for the given\n"
 	 "SSIDs (or wildcard if not given) unless passive scanning is requested.");
+
+
+static int handle_start_sched_scan(struct nl80211_state *state,
+				   struct nl_cb *cb, struct nl_msg *msg,
+				   int argc, char **argv, enum id_input id)
+{
+	return parse_sched_scan(msg, &argc, &argv);
+}
+
+static int handle_stop_sched_scan(struct nl80211_state *state, struct nl_cb *cb,
+				  struct nl_msg *msg, int argc, char **argv,
+				  enum id_input id)
+{
+	if (argc != 0)
+		return 1;
+
+	return 0;
+}
+
+COMMAND(scan, sched_start,
+	SCHED_SCAN_OPTIONS,
+	NL80211_CMD_START_SCHED_SCAN, 0, CIB_NETDEV, handle_start_sched_scan,
+	"Start a scheduled scan at the specified interval on the given frequencies\n"
+	"with probing for the given SSIDs (or wildcard if not given) unless passive\n"
+	"scanning is requested.  If matches are specified, only matching results\n"
+	"will be returned.");
+COMMAND(scan, sched_stop, "",
+	NL80211_CMD_STOP_SCHED_SCAN, 0, CIB_NETDEV, handle_stop_sched_scan,
+	"Stop an ongoing scheduled scan.");
-- 
2.1.4


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

* [PATCH iw v2 3/4] iw: add support for active scheduled scan
  2015-03-17 14:11 [PATCH iw v2 0/4] iw: add scheduled scan support Luca Coelho
  2015-03-17 14:11 ` [PATCH iw v2 1/4] iw: move generic sched scan parsing code out of net detect Luca Coelho
  2015-03-17 14:11 ` [PATCH iw v2 2/4] iw: implement scheduled scan Luca Coelho
@ 2015-03-17 14:11 ` Luca Coelho
  2015-03-17 14:11 ` [PATCH iw v2 4/4] iw: add randomise option for sched_scan Luca Coelho
  2015-03-17 15:10 ` [PATCH iw v2 0/4] iw: add scheduled scan support Johannes Berg
  4 siblings, 0 replies; 6+ messages in thread
From: Luca Coelho @ 2015-03-17 14:11 UTC (permalink / raw)
  To: johannes; +Cc: linux-wireless

From: Luciano Coelho <luciano.coelho@intel.com>

Add options to explicitly use active or passive scans on schedule
scans (and net-detect).  If neither active nor passive parameters are
passed, the default is to do active scans with the wildcard SSID.

Signed-off-by: Luciano Coelho <luciano.coelho@intel.com>
---
 iw.h   |  2 +-
 scan.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 59 insertions(+), 3 deletions(-)

diff --git a/iw.h b/iw.h
index efc21d6..fc20838 100644
--- a/iw.h
+++ b/iw.h
@@ -174,7 +174,7 @@ void parse_bitrate(struct nlattr *bitrate_attr, char *buf, int buflen);
 void iw_hexdump(const char *prefix, const __u8 *data, size_t len);
 
 #define SCHED_SCAN_OPTIONS "interval <in_msecs> [delay <in_secs>] " \
-	"[freqs <freq>+] [matches [ssid <ssid>]+]]"
+	"[freqs <freq>+] [matches [ssid <ssid>]+]] [active [ssid <ssid>]+|passive] "
 int parse_sched_scan(struct nl_msg *msg, int *argc, char ***argv);
 
 DECLARE_SECTION(set);
diff --git a/scan.c b/scan.c
index e534fd4..7ff04ec 100644
--- a/scan.c
+++ b/scan.c
@@ -101,18 +101,20 @@ static int parse_random_mac_addr(struct nl_msg *msg, char *arg)
 
 int parse_sched_scan(struct nl_msg *msg, int *argc, char ***argv)
 {
-	struct nl_msg *matchset = NULL, *freqs = NULL;
+	struct nl_msg *matchset = NULL, *freqs = NULL, *ssids = NULL;
 	struct nlattr *match = NULL;
 	enum {
 		ND_TOPLEVEL,
 		ND_MATCH,
 		ND_FREQS,
+		ND_ACTIVE,
 	} parse_state = ND_TOPLEVEL;
 	int c  = *argc;
 	char *end, **v = *argv;
 	int err = 0, i = 0;
 	unsigned int freq, interval = 0, delay = 0;
-	bool have_matchset = false, have_freqs = false;
+	bool have_matchset = false, have_freqs = false, have_ssids = false;
+	bool have_active = false, have_passive = false;
 
 	matchset = nlmsg_alloc();
 	if (!matchset) {
@@ -126,6 +128,12 @@ int parse_sched_scan(struct nl_msg *msg, int *argc, char ***argv)
 		goto out;
 	}
 
+	ssids = nlmsg_alloc();
+	if (!ssids) {
+		err = -ENOMEM;
+		goto out;
+	}
+
 	while (c) {
 		switch (parse_state) {
 		case ND_TOPLEVEL:
@@ -184,6 +192,22 @@ int parse_sched_scan(struct nl_msg *msg, int *argc, char ***argv)
 
 				have_freqs = true;
 				i = 0;
+			} else if (!strcmp(v[0], "active")) {
+				parse_state = ND_ACTIVE;
+				if (have_active || have_passive) {
+					err = -EINVAL;
+					goto nla_put_failure;
+				}
+
+				have_active = true;
+				i = 0;
+			} else if (!strcmp(v[0], "passive")) {
+				if (have_active || have_passive) {
+					err = -EINVAL;
+					goto nla_put_failure;
+				}
+
+				have_passive = true;
 			} else {
 				/* this element is not for us, so
 				 * return to continue parsing.
@@ -249,9 +273,41 @@ int parse_sched_scan(struct nl_msg *msg, int *argc, char ***argv)
 				c--; v++;
 			}
 			break;
+		case ND_ACTIVE:
+			if (!strcmp(v[0], "ssid")) {
+				c--; v++;
+				if (c == 0) {
+					err = -EINVAL;
+					goto nla_put_failure;
+				}
+
+				NLA_PUT(ssids,
+					NL80211_SCHED_SCAN_MATCH_ATTR_SSID,
+					strlen(v[0]), v[0]);
+
+				have_ssids = true;
+				i++;
+				c--; v++;
+			} else {
+				/* other element that cannot be part
+				 * of a match indicates the end of the
+				 * active set. */
+				/* need at least one item in the set */
+				if (i == 0) {
+					err = -EINVAL;
+					goto nla_put_failure;
+				}
+
+				parse_state = ND_TOPLEVEL;
+			}
+			break;
 		}
 	}
 
+	if (!have_ssids)
+		NLA_PUT(ssids, 1, 0, "");
+	if (!have_passive)
+		nla_put_nested(msg, NL80211_ATTR_SCAN_SSIDS, ssids);
 	if (have_freqs)
 		nla_put_nested(msg, NL80211_ATTR_SCAN_FREQUENCIES, freqs);
 	if (have_matchset)
-- 
2.1.4


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

* [PATCH iw v2 4/4] iw: add randomise option for sched_scan
  2015-03-17 14:11 [PATCH iw v2 0/4] iw: add scheduled scan support Luca Coelho
                   ` (2 preceding siblings ...)
  2015-03-17 14:11 ` [PATCH iw v2 3/4] iw: add support for active " Luca Coelho
@ 2015-03-17 14:11 ` Luca Coelho
  2015-03-17 15:10 ` [PATCH iw v2 0/4] iw: add scheduled scan support Johannes Berg
  4 siblings, 0 replies; 6+ messages in thread
From: Luca Coelho @ 2015-03-17 14:11 UTC (permalink / raw)
  To: johannes; +Cc: linux-wireless

From: Luciano Coelho <luciano.coelho@intel.com>

Like with normal scans, we can randomise the MAC address sent out in
active scheduled scans.  Add the randomise option to sched_scan (and
net-detect) parsing code.

Signed-off-by: Luciano Coelho <luciano.coelho@intel.com>
---
 iw.h   |  2 +-
 scan.c | 11 +++++++++++
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/iw.h b/iw.h
index fc20838..78195ea 100644
--- a/iw.h
+++ b/iw.h
@@ -174,7 +174,7 @@ void parse_bitrate(struct nlattr *bitrate_attr, char *buf, int buflen);
 void iw_hexdump(const char *prefix, const __u8 *data, size_t len);
 
 #define SCHED_SCAN_OPTIONS "interval <in_msecs> [delay <in_secs>] " \
-	"[freqs <freq>+] [matches [ssid <ssid>]+]] [active [ssid <ssid>]+|passive] "
+	"[freqs <freq>+] [matches [ssid <ssid>]+]] [active [ssid <ssid>]+|passive] [randomise[=<addr>/<mask>]]"
 int parse_sched_scan(struct nl_msg *msg, int *argc, char ***argv);
 
 DECLARE_SECTION(set);
diff --git a/scan.c b/scan.c
index 7ff04ec..e959c1b 100644
--- a/scan.c
+++ b/scan.c
@@ -115,6 +115,7 @@ int parse_sched_scan(struct nl_msg *msg, int *argc, char ***argv)
 	unsigned int freq, interval = 0, delay = 0;
 	bool have_matchset = false, have_freqs = false, have_ssids = false;
 	bool have_active = false, have_passive = false;
+	uint32_t flags = 0;
 
 	matchset = nlmsg_alloc();
 	if (!matchset) {
@@ -208,6 +209,14 @@ int parse_sched_scan(struct nl_msg *msg, int *argc, char ***argv)
 				}
 
 				have_passive = true;
+			} else if (!strncmp(v[0], "randomise", 9) ||
+				   !strncmp(v[0], "randomize", 9)) {
+				flags |= NL80211_SCAN_FLAG_RANDOM_ADDR;
+				if (c > 0) {
+					err = parse_random_mac_addr(msg, v[0]);
+					if (err)
+						goto nla_put_failure;
+				}
 			} else {
 				/* this element is not for us, so
 				 * return to continue parsing.
@@ -312,6 +321,8 @@ int parse_sched_scan(struct nl_msg *msg, int *argc, char ***argv)
 		nla_put_nested(msg, NL80211_ATTR_SCAN_FREQUENCIES, freqs);
 	if (have_matchset)
 		nla_put_nested(msg, NL80211_ATTR_SCHED_SCAN_MATCH, matchset);
+	if (flags)
+		NLA_PUT_U32(msg, NL80211_ATTR_SCAN_FLAGS, flags);
 
 nla_put_failure:
 	if (match)
-- 
2.1.4


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

* Re: [PATCH iw v2 0/4] iw: add scheduled scan support
  2015-03-17 14:11 [PATCH iw v2 0/4] iw: add scheduled scan support Luca Coelho
                   ` (3 preceding siblings ...)
  2015-03-17 14:11 ` [PATCH iw v2 4/4] iw: add randomise option for sched_scan Luca Coelho
@ 2015-03-17 15:10 ` Johannes Berg
  4 siblings, 0 replies; 6+ messages in thread
From: Johannes Berg @ 2015-03-17 15:10 UTC (permalink / raw)
  To: Luca Coelho; +Cc: linux-wireless

On Tue, 2015-03-17 at 16:11 +0200, Luca Coelho wrote:
> From: Luciano Coelho <luciano.coelho@intel.com>
> 
> This series adds scheduled scan support to the iw tool (finally! ;).
> 
> In v2, just rebased.

Great, thanks; all applied.

johannes


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

end of thread, other threads:[~2015-03-17 15:10 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-03-17 14:11 [PATCH iw v2 0/4] iw: add scheduled scan support Luca Coelho
2015-03-17 14:11 ` [PATCH iw v2 1/4] iw: move generic sched scan parsing code out of net detect Luca Coelho
2015-03-17 14:11 ` [PATCH iw v2 2/4] iw: implement scheduled scan Luca Coelho
2015-03-17 14:11 ` [PATCH iw v2 3/4] iw: add support for active " Luca Coelho
2015-03-17 14:11 ` [PATCH iw v2 4/4] iw: add randomise option for sched_scan Luca Coelho
2015-03-17 15:10 ` [PATCH iw v2 0/4] iw: add scheduled scan support Johannes Berg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).