2013-07-29 08:42:21

by Michal Kazior

[permalink] [raw]
Subject: [RFC] iw: add chan_time scan parameter

The new parameter allows user to specify how long
driver should remain on each channel while
scanning.

Signed-off-by: Michal Kazior <[email protected]>
---
Note: nl/cfg/mac patches were sent separately.

Should this be split into two patches - one
that updates nl80211.h and the other adding
the parameter support?

nl80211.h | 8 ++++++++
scan.c | 16 +++++++++++++---
2 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/nl80211.h b/nl80211.h
index 5abc54d..f9ef050 100644
--- a/nl80211.h
+++ b/nl80211.h
@@ -1469,6 +1469,12 @@ enum nl80211_commands {
*
* @NL80211_ATTR_COALESCE_RULE: Coalesce rule information.
*
+ * @NL80211_ATTR_SCAN_CHAN_TIME: Specifies how many msec should a driver spend
+ * on each channel during scanning. This is optional and the default is
+ * leave the decision up to the driver. This setting may, but preferrably
+ * shouldn't, be ignored by a driver.
+ *
+ *
* @NL80211_ATTR_MAX: highest attribute number currently defined
* @__NL80211_ATTR_AFTER_LAST: internal use
*/
@@ -1771,6 +1777,8 @@ enum nl80211_attrs {

NL80211_ATTR_COALESCE_RULE,

+ NL80211_ATTR_SCAN_CHAN_TIME,
+
/* add attributes here, update the policy in nl80211.c */

__NL80211_ATTR_AFTER_LAST,
diff --git a/scan.c b/scan.c
index 4fb0f23..c5bafd8 100644
--- a/scan.c
+++ b/scan.c
@@ -87,12 +87,13 @@ static int handle_scan(struct nl80211_state *state,
SSID,
MESHID,
DONE,
+ CHANTIME,
} parse = NONE;
int freq;
bool passive = false, have_ssids = false, have_freqs = false;
size_t ies_len = 0, meshid_len = 0;
unsigned char *ies = NULL, *meshid = NULL, *tmpies;
- int flags = 0;
+ int flags = 0, chan_time = 0;

ssids = nlmsg_alloc();
if (!ssids)
@@ -137,6 +138,9 @@ static int handle_scan(struct nl80211_state *state,
} else if (strcmp(argv[i], "meshid") == 0) {
parse = MESHID;
break;
+ } else if (strcmp(argv[i], "chan-time") == 0) {
+ parse = CHANTIME;
+ break;
}
case DONE:
return 1;
@@ -170,6 +174,10 @@ static int handle_scan(struct nl80211_state *state,
meshid_len += 2;
parse = NONE;
break;
+ case CHANTIME:
+ chan_time = strtoul(argv[i], &eptr, 10);
+ parse = NONE;
+ break;
}
}

@@ -198,6 +206,8 @@ static int handle_scan(struct nl80211_state *state,
nla_put_nested(msg, NL80211_ATTR_SCAN_FREQUENCIES, freqs);
if (flags)
NLA_PUT_U32(msg, NL80211_ATTR_SCAN_FLAGS, flags);
+ if (chan_time)
+ NLA_PUT_U32(msg, NL80211_ATTR_SCAN_CHAN_TIME, chan_time);

err = 0;
nla_put_failure:
@@ -1596,7 +1606,7 @@ static int handle_scan_combined(struct nl80211_state *state,
dump_argv[0] = argv[0];
return handle_cmd(state, id, dump_argc, dump_argv);
}
-TOPLEVEL(scan, "[-u] [freq <freq>*] [ies <hex as 00:11:..>] [meshid <meshid>] [lowpri,flush,ap-force] [ssid <ssid>*|passive]", 0, 0,
+TOPLEVEL(scan, "[-u] [freq <freq>*] [ies <hex as 00:11:..>] [meshid <meshid>] [lowpri,flush,ap-force] [chan-time <msec>] [ssid <ssid>*|passive]", 0, 0,
CIB_NETDEV, handle_scan_combined,
"Scan on the given frequencies and probe for the given SSIDs\n"
"(or wildcard if not given) unless passive scanning is requested.\n"
@@ -1606,7 +1616,7 @@ COMMAND(scan, dump, "[-u]",
NL80211_CMD_GET_SCAN, NLM_F_DUMP, CIB_NETDEV, handle_scan_dump,
"Dump the current scan results. If -u is specified, print unknown\n"
"data in scan results.");
-COMMAND(scan, trigger, "[freq <freq>*] [ies <hex as 00:11:..>] [meshid <meshid>] [lowpri,flush,ap-force] [ssid <ssid>*|passive]",
+COMMAND(scan, trigger, "[freq <freq>*] [ies <hex as 00:11:..>] [meshid <meshid>] [lowpri,flush,ap-force] [chan-time <msec>] [ssid <ssid>*|passive]",
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.");
--
1.7.9.5