]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
nl80211: Add support for additional scan parameters for beacon report
authorAvraham Stern <avraham.stern@intel.com>
Wed, 28 Dec 2016 13:06:41 +0000 (15:06 +0200)
committerJouni Malinen <j@w1.fi>
Tue, 3 Jan 2017 13:18:29 +0000 (15:18 +0200)
Add support for:
 1. Setting scan dwell time
 2. Parsing scan start TSF and beacon received TSF reported
    by the driver
 3. Setting driver capabilities for the above

These capabilities are needed for Beacon Report radio measurement.

Signed-off-by: Avraham Stern <avraham.stern@intel.com>
src/drivers/driver_nl80211_capa.c
src/drivers/driver_nl80211_event.c
src/drivers/driver_nl80211_scan.c

index 85706efe415ca97c52816346241094f6f4d5f174..1baffefbedc1f646258f6bcd12f0ffeb93f8378c 100644 (file)
@@ -377,6 +377,18 @@ static void wiphy_info_ext_feature_flags(struct wiphy_info_data *info,
        if (ext_feature_isset(ext_features, len,
                              NL80211_EXT_FEATURE_BEACON_RATE_VHT))
                capa->flags |= WPA_DRIVER_FLAGS_BEACON_RATE_VHT;
+
+       if (ext_feature_isset(ext_features, len,
+                             NL80211_EXT_FEATURE_SET_SCAN_DWELL))
+               capa->rrm_flags |= WPA_DRIVER_FLAGS_SUPPORT_SET_SCAN_DWELL;
+
+       if (ext_feature_isset(ext_features, len,
+                             NL80211_EXT_FEATURE_SCAN_START_TIME) &&
+           ext_feature_isset(ext_features, len,
+                             NL80211_EXT_FEATURE_BSS_PARENT_TSF) &&
+           ext_feature_isset(ext_features, len,
+                             NL80211_EXT_FEATURE_SET_SCAN_DWELL))
+               capa->rrm_flags |= WPA_DRIVER_FLAGS_SUPPORT_BEACON_REPORT;
 }
 
 
index 66cfb72009fd8fa1a68a70b37de3a5bf23f7e549..de539b1c5d27fa36d19a3c2389bf015f251a0d79 100644 (file)
@@ -1110,6 +1110,16 @@ static void send_scan_event(struct wpa_driver_nl80211_data *drv, int aborted,
                wpa_printf(MSG_DEBUG, "nl80211: Scan included frequencies:%s",
                           msg);
        }
+
+       if (tb[NL80211_ATTR_SCAN_START_TIME_TSF] &&
+           tb[NL80211_ATTR_SCAN_START_TIME_TSF_BSSID]) {
+               info->scan_start_tsf =
+                       nla_get_u64(tb[NL80211_ATTR_SCAN_START_TIME_TSF]);
+               os_memcpy(info->scan_start_tsf_bssid,
+                         nla_data(tb[NL80211_ATTR_SCAN_START_TIME_TSF_BSSID]),
+                         ETH_ALEN);
+       }
+
        wpa_supplicant_event(drv->ctx, EVENT_SCAN_RESULTS, &event);
 }
 
index d7b61f67785ba32701cc545a322c108f656ba822..3ad0d83c68dc2890135d05f1ec72690a81189c29 100644 (file)
@@ -270,6 +270,19 @@ nl80211_scan_common(struct i802_bss *bss, u8 cmd,
                }
        }
 
+       if (params->duration) {
+               if (!(drv->capa.rrm_flags &
+                     WPA_DRIVER_FLAGS_SUPPORT_SET_SCAN_DWELL) ||
+                   nla_put_u16(msg, NL80211_ATTR_MEASUREMENT_DURATION,
+                               params->duration))
+                       goto fail;
+
+               if (params->duration_mandatory &&
+                   nla_put_flag(msg,
+                                NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY))
+                       goto fail;
+       }
+
        if (scan_flags &&
            nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, scan_flags))
                goto fail;
@@ -645,6 +658,8 @@ nl80211_parse_bss_info(struct wpa_driver_nl80211_data *drv,
                [NL80211_BSS_STATUS] = { .type = NLA_U32 },
                [NL80211_BSS_SEEN_MS_AGO] = { .type = NLA_U32 },
                [NL80211_BSS_BEACON_IES] = { .type = NLA_UNSPEC },
+               [NL80211_BSS_PARENT_TSF] = { .type = NLA_U64 },
+               [NL80211_BSS_PARENT_BSSID] = { .type = NLA_UNSPEC },
        };
        struct wpa_scan_res *r;
        const u8 *ie, *beacon_ie;
@@ -730,6 +745,12 @@ nl80211_parse_bss_info(struct wpa_driver_nl80211_data *drv,
                }
        }
 
+       if (bss[NL80211_BSS_PARENT_TSF] && bss[NL80211_BSS_PARENT_BSSID]) {
+               r->parent_tsf = nla_get_u64(bss[NL80211_BSS_PARENT_TSF]);
+               os_memcpy(r->tsf_bssid, nla_data(bss[NL80211_BSS_PARENT_BSSID]),
+                         ETH_ALEN);
+       }
+
        return r;
 }