aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2014-01-24 04:53:53 -0500
committerJohannes Berg <johannes.berg@intel.com>2014-02-04 15:58:12 -0500
commitea73cbce4e1fd93113301532ad98041b119bc85a (patch)
tree40f4fc8b5966ab5b15dfe38ad154ce4b9267685b /include
parent9fa37a3d6604fcdd1372bc0d2d724c3371ecb7f9 (diff)
nl80211: fix scheduled scan RSSI matchset attribute confusion
The scheduled scan matchsets were intended to be a list of filters, with the found BSS having to pass at least one of them to be passed to the host. When the RSSI attribute was added, however, this was broken and currently wpa_supplicant adds that attribute in its own matchset; however, it doesn't intend that to mean that anything that passes the RSSI filter should be passed to the host, instead it wants it to mean that everything needs to also have higher RSSI. This is semantically problematic because we have a list of filters like [ SSID1, SSID2, SSID3, RSSI ] with no real indication which one should be OR'ed and which one AND'ed. To fix this, move the RSSI filter attribute into each matchset. As we need to stay backward compatible, treat a matchset with only the RSSI attribute as a "default RSSI filter" for all other matchsets, but only if there are other matchsets (an RSSI-only matchset by itself is still desirable.) To make driver implementation easier, keep a global min_rssi_thold for the entire request as well. The only affected driver is ath6kl. I found this when I looked into the code after Raja Mani submitted a patch fixing the n_match_sets calculation to disregard the RSSI, but that patch didn't address the semantic issue. Reported-by: Raja Mani <rmani@qti.qualcomm.com> Acked-by: Luciano Coelho <luciano.coelho@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'include')
-rw-r--r--include/net/cfg80211.h9
-rw-r--r--include/uapi/linux/nl80211.h10
2 files changed, 14 insertions, 5 deletions
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index d5e57bf678a6..009290e36d15 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -1394,10 +1394,12 @@ struct cfg80211_scan_request {
1394/** 1394/**
1395 * struct cfg80211_match_set - sets of attributes to match 1395 * struct cfg80211_match_set - sets of attributes to match
1396 * 1396 *
1397 * @ssid: SSID to be matched 1397 * @ssid: SSID to be matched; may be zero-length for no match (RSSI only)
1398 * @rssi_thold: don't report scan results below this threshold (in s32 dBm)
1398 */ 1399 */
1399struct cfg80211_match_set { 1400struct cfg80211_match_set {
1400 struct cfg80211_ssid ssid; 1401 struct cfg80211_ssid ssid;
1402 s32 rssi_thold;
1401}; 1403};
1402 1404
1403/** 1405/**
@@ -1420,7 +1422,8 @@ struct cfg80211_match_set {
1420 * @dev: the interface 1422 * @dev: the interface
1421 * @scan_start: start time of the scheduled scan 1423 * @scan_start: start time of the scheduled scan
1422 * @channels: channels to scan 1424 * @channels: channels to scan
1423 * @rssi_thold: don't report scan results below this threshold (in s32 dBm) 1425 * @min_rssi_thold: for drivers only supporting a single threshold, this
1426 * contains the minimum over all matchsets
1424 */ 1427 */
1425struct cfg80211_sched_scan_request { 1428struct cfg80211_sched_scan_request {
1426 struct cfg80211_ssid *ssids; 1429 struct cfg80211_ssid *ssids;
@@ -1433,7 +1436,7 @@ struct cfg80211_sched_scan_request {
1433 u32 flags; 1436 u32 flags;
1434 struct cfg80211_match_set *match_sets; 1437 struct cfg80211_match_set *match_sets;
1435 int n_match_sets; 1438 int n_match_sets;
1436 s32 rssi_thold; 1439 s32 min_rssi_thold;
1437 1440
1438 /* internal */ 1441 /* internal */
1439 struct wiphy *wiphy; 1442 struct wiphy *wiphy;
diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
index 53e56cf7c0fe..474ce32e0797 100644
--- a/include/uapi/linux/nl80211.h
+++ b/include/uapi/linux/nl80211.h
@@ -2467,9 +2467,15 @@ enum nl80211_reg_rule_attr {
2467 * enum nl80211_sched_scan_match_attr - scheduled scan match attributes 2467 * enum nl80211_sched_scan_match_attr - scheduled scan match attributes
2468 * @__NL80211_SCHED_SCAN_MATCH_ATTR_INVALID: attribute number 0 is reserved 2468 * @__NL80211_SCHED_SCAN_MATCH_ATTR_INVALID: attribute number 0 is reserved
2469 * @NL80211_SCHED_SCAN_MATCH_ATTR_SSID: SSID to be used for matching, 2469 * @NL80211_SCHED_SCAN_MATCH_ATTR_SSID: SSID to be used for matching,
2470 * only report BSS with matching SSID. 2470 * only report BSS with matching SSID.
2471 * @NL80211_SCHED_SCAN_MATCH_ATTR_RSSI: RSSI threshold (in dBm) for reporting a 2471 * @NL80211_SCHED_SCAN_MATCH_ATTR_RSSI: RSSI threshold (in dBm) for reporting a
2472 * BSS in scan results. Filtering is turned off if not specified. 2472 * BSS in scan results. Filtering is turned off if not specified. Note that
2473 * if this attribute is in a match set of its own, then it is treated as
2474 * the default value for all matchsets with an SSID, rather than being a
2475 * matchset of its own without an RSSI filter. This is due to problems with
2476 * how this API was implemented in the past. Also, due to the same problem,
2477 * the only way to create a matchset with only an RSSI filter (with this
2478 * attribute) is if there's only a single matchset with the RSSI attribute.
2473 * @NL80211_SCHED_SCAN_MATCH_ATTR_MAX: highest scheduled scan filter 2479 * @NL80211_SCHED_SCAN_MATCH_ATTR_MAX: highest scheduled scan filter
2474 * attribute number currently defined 2480 * attribute number currently defined
2475 * @__NL80211_SCHED_SCAN_MATCH_ATTR_AFTER_LAST: internal use 2481 * @__NL80211_SCHED_SCAN_MATCH_ATTR_AFTER_LAST: internal use