nl80211: Introduce scan flags to emphasize requested scan behavior
authorSunil Dutt <usdutt@qti.qualcomm.com>
Thu, 25 Jan 2018 15:13:37 +0000 (17:13 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 31 Jan 2018 11:48:30 +0000 (12:48 +0100)
This commit defines new scan flags (LOW_SPAN, LOW_POWER, HIGH_LATENCY)
to emphasize the requested scan behavior for the driver. These flags
are optional and are mutually exclusive. The implementation of the
respective functionality can be driver/hardware specific.

These flags can be used to control the compromise between how long
a scan takes, how much power it uses, and high accurate/complete
the scan is in finding the BSSs.

Signed-off-by: Sunil Dutt <usdutt@qti.qualcomm.com>
Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/uapi/linux/nl80211.h
net/wireless/nl80211.c

index c587a61c32bfbc04c838db73df2cea737496803e..6f60503fa617eea05e1a455e8e05b9d9ca72a59d 100644 (file)
@@ -4945,6 +4945,9 @@ enum nl80211_feature_flags {
  *     probe request tx deferral and suppression
  * @NL80211_EXT_FEATURE_MFP_OPTIONAL: Driver supports the %NL80211_MFP_OPTIONAL
  *     value in %NL80211_ATTR_USE_MFP.
+ * @NL80211_EXT_FEATURE_LOW_SPAN_SCAN: Driver supports low span scan.
+ * @NL80211_EXT_FEATURE_LOW_POWER_SCAN: Driver supports low power scan.
+ * @NL80211_EXT_FEATURE_HIGH_ACCURACY_SCAN: Driver supports high accuracy scan.
  *
  * @NUM_NL80211_EXT_FEATURES: number of extended features.
  * @MAX_NL80211_EXT_FEATURES: highest extended feature index.
@@ -4972,6 +4975,9 @@ enum nl80211_ext_feature_index {
        NL80211_EXT_FEATURE_OCE_PROBE_REQ_HIGH_TX_RATE,
        NL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION,
        NL80211_EXT_FEATURE_MFP_OPTIONAL,
+       NL80211_EXT_FEATURE_LOW_SPAN_SCAN,
+       NL80211_EXT_FEATURE_LOW_POWER_SCAN,
+       NL80211_EXT_FEATURE_HIGH_ACCURACY_SCAN,
 
        /* add new features before the definition below */
        NUM_NL80211_EXT_FEATURES,
@@ -5032,6 +5038,10 @@ enum nl80211_timeout_reason {
  * of NL80211_CMD_TRIGGER_SCAN and NL80211_CMD_START_SCHED_SCAN
  * requests.
  *
+ * NL80211_SCAN_FLAG_LOW_SPAN, NL80211_SCAN_FLAG_LOW_POWER, and
+ * NL80211_SCAN_FLAG_HIGH_ACCURACY flags are exclusive of each other, i.e., only
+ * one of them can be used in the request.
+ *
  * @NL80211_SCAN_FLAG_LOW_PRIORITY: scan request has low priority
  * @NL80211_SCAN_FLAG_FLUSH: flush cache before scanning
  * @NL80211_SCAN_FLAG_AP: force a scan even if the interface is configured
@@ -5059,7 +5069,20 @@ enum nl80211_timeout_reason {
  *     and suppression (if it has received a broadcast Probe Response frame,
  *     Beacon frame or FILS Discovery frame from an AP that the STA considers
  *     a suitable candidate for (re-)association - suitable in terms of
- *     SSID and/or RSSI
+ *     SSID and/or RSSI.
+ * @NL80211_SCAN_FLAG_LOW_SPAN: Span corresponds to the total time taken to
+ *     accomplish the scan. Thus, this flag intends the driver to perform the
+ *     scan request with lesser span/duration. It is specific to the driver
+ *     implementations on how this is accomplished. Scan accuracy may get
+ *     impacted with this flag.
+ * @NL80211_SCAN_FLAG_LOW_POWER: This flag intends the scan attempts to consume
+ *     optimal possible power. Drivers can resort to their specific means to
+ *     optimize the power. Scan accuracy may get impacted with this flag.
+ * @NL80211_SCAN_FLAG_HIGH_ACCURACY: Accuracy here intends to the extent of scan
+ *     results obtained. Thus HIGH_ACCURACY scan flag aims to get maximum
+ *     possible scan results. This flag hints the driver to use the best
+ *     possible scan configuration to improve the accuracy in scanning.
+ *     Latency and power use may get impacted with this flag.
  */
 enum nl80211_scan_flags {
        NL80211_SCAN_FLAG_LOW_PRIORITY                          = 1<<0,
@@ -5070,6 +5093,9 @@ enum nl80211_scan_flags {
        NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP               = 1<<5,
        NL80211_SCAN_FLAG_OCE_PROBE_REQ_HIGH_TX_RATE            = 1<<6,
        NL80211_SCAN_FLAG_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION    = 1<<7,
+       NL80211_SCAN_FLAG_LOW_SPAN                              = 1<<8,
+       NL80211_SCAN_FLAG_LOW_POWER                             = 1<<9,
+       NL80211_SCAN_FLAG_HIGH_ACCURACY                         = 1<<10,
 };
 
 /**
index ab0c687d0c44d7786c1af3a36f6177b7ebd00480..dd249ec9f2288b12e290600c6dc1bfbfa765093f 100644 (file)
@@ -6715,8 +6715,17 @@ nl80211_check_scan_flags(struct wiphy *wiphy, struct wireless_dev *wdev,
 
        *flags = nla_get_u32(attrs[NL80211_ATTR_SCAN_FLAGS]);
 
-       if ((*flags & NL80211_SCAN_FLAG_LOW_PRIORITY) &&
-           !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN))
+       if (((*flags & NL80211_SCAN_FLAG_LOW_PRIORITY) &&
+            !(wiphy->features & NL80211_FEATURE_LOW_PRIORITY_SCAN)) ||
+           ((*flags & NL80211_SCAN_FLAG_LOW_SPAN) &&
+            !wiphy_ext_feature_isset(wiphy,
+                                     NL80211_EXT_FEATURE_LOW_SPAN_SCAN)) ||
+           ((*flags & NL80211_SCAN_FLAG_LOW_POWER) &&
+            !wiphy_ext_feature_isset(wiphy,
+                                     NL80211_EXT_FEATURE_LOW_POWER_SCAN)) ||
+           ((*flags & NL80211_SCAN_FLAG_HIGH_ACCURACY) &&
+            !wiphy_ext_feature_isset(wiphy,
+                                     NL80211_EXT_FEATURE_HIGH_ACCURACY_SCAN)))
                return -EOPNOTSUPP;
 
        if (*flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {