]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
nl80211: Handle MAC address randomization in scan/sched_scan
authorIlan Peer <ilan.peer@intel.com>
Mon, 29 Dec 2014 06:41:05 +0000 (01:41 -0500)
committerJouni Malinen <j@w1.fi>
Sun, 4 Jan 2015 21:06:31 +0000 (23:06 +0200)
1. Process supported driver capabilities.
2. Populate scan request with MAC address randomization data

Signed-off-by: Ilan Peer <ilan.peer@intel.com>
src/drivers/driver_nl80211.c
src/drivers/driver_nl80211_capa.c
src/drivers/driver_nl80211_scan.c

index c86ba811cff5afeb00b22fedfc8415f504197aa2..b20be20ed67cf7e3b328e8c445d7c9bd80b676bd 100644 (file)
@@ -7310,7 +7310,9 @@ static int wpa_driver_nl80211_status(void *priv, char *buf, size_t buflen)
                                  "capa.max_stations=%u\n"
                                  "capa.probe_resp_offloads=0x%x\n"
                                  "capa.max_acl_mac_addrs=%u\n"
-                                 "capa.num_multichan_concurrent=%u\n",
+                                 "capa.num_multichan_concurrent=%u\n"
+                                 "capa.mac_addr_rand_sched_scan_supported=%d\n"
+                                 "capa.mac_addr_rand_scan_supported=%d\n",
                                  drv->capa.key_mgmt,
                                  drv->capa.enc,
                                  drv->capa.auth,
@@ -7324,7 +7326,9 @@ static int wpa_driver_nl80211_status(void *priv, char *buf, size_t buflen)
                                  drv->capa.max_stations,
                                  drv->capa.probe_resp_offloads,
                                  drv->capa.max_acl_mac_addrs,
-                                 drv->capa.num_multichan_concurrent);
+                                 drv->capa.num_multichan_concurrent,
+                                 drv->capa.mac_addr_rand_sched_scan_supported,
+                                 drv->capa.mac_addr_rand_scan_supported);
                if (os_snprintf_error(end - pos, res))
                        return pos - buf;
                pos += res;
index c38d75db73c308f60773752bcbf8da6c47aece99..6661a894ce3f1c245b26e728402cc5e19bac0f14 100644 (file)
@@ -76,6 +76,8 @@ struct wiphy_info_data {
        unsigned int set_qos_map_supported:1;
        unsigned int have_low_prio_scan:1;
        unsigned int wmm_ac_supported:1;
+       unsigned int mac_addr_rand_scan_supported:1;
+       unsigned int mac_addr_rand_sched_scan_supported:1;
 };
 
 
@@ -366,6 +368,12 @@ static void wiphy_info_feature_flags(struct wiphy_info_data *info,
        if (flags & NL80211_FEATURE_LOW_PRIORITY_SCAN)
                info->have_low_prio_scan = 1;
 
+       if (flags & NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR)
+               info->mac_addr_rand_scan_supported = 1;
+
+       if (flags & NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR)
+               info->mac_addr_rand_sched_scan_supported = 1;
+
        if (flags & NL80211_FEATURE_STATIC_SMPS)
                capa->smps_modes |= WPA_DRIVER_SMPS_MODE_STATIC;
 
@@ -635,6 +643,11 @@ static int wpa_driver_nl80211_get_info(struct wpa_driver_nl80211_data *drv,
                drv->capa.flags |= WPA_DRIVER_FLAGS_AP_CSA;
        drv->capa.wmm_ac_supported = info->wmm_ac_supported;
 
+       drv->capa.mac_addr_rand_sched_scan_supported =
+               info->mac_addr_rand_sched_scan_supported;
+       drv->capa.mac_addr_rand_scan_supported =
+               info->mac_addr_rand_scan_supported;
+
        return 0;
 }
 
index 89f22797aba128bc97348640cc5f01986b5a7743..7538d602412768556473b9b14f72c48795a5af8c 100644 (file)
@@ -171,6 +171,28 @@ nl80211_scan_common(struct i802_bss *bss, u8 cmd,
                scan_flags |= NL80211_SCAN_FLAG_LOW_PRIORITY;
        }
 
+       if (params->mac_addr_rand) {
+               wpa_printf(MSG_DEBUG,
+                          "nl80211: Add NL80211_SCAN_FLAG_RANDOM_ADDR");
+               scan_flags |= NL80211_SCAN_FLAG_RANDOM_ADDR;
+
+               if (params->mac_addr) {
+                       wpa_printf(MSG_DEBUG, "nl80211: MAC address: " MACSTR,
+                                  MAC2STR(params->mac_addr));
+                       if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN,
+                                   params->mac_addr))
+                               goto fail;
+               }
+
+               if (params->mac_addr_mask) {
+                       wpa_printf(MSG_DEBUG, "nl80211: MAC address mask: "
+                                  MACSTR, MAC2STR(params->mac_addr_mask));
+                       if (nla_put(msg, NL80211_ATTR_MAC_MASK, ETH_ALEN,
+                                   params->mac_addr_mask))
+                               goto fail;
+               }
+       }
+
        if (scan_flags &&
            nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, scan_flags))
                goto fail;