nl80211: Handle MAC address randomization in scan/sched_scan

1. Process supported driver capabilities.
2. Populate scan request with MAC address randomization data

Signed-off-by: Ilan Peer <ilan.peer@intel.com>
This commit is contained in:
Ilan Peer 2014-12-29 01:41:05 -05:00 committed by Jouni Malinen
parent ff23ed221d
commit 86056fea63
3 changed files with 41 additions and 2 deletions

View file

@ -7310,7 +7310,9 @@ static int wpa_driver_nl80211_status(void *priv, char *buf, size_t buflen)
"capa.max_stations=%u\n" "capa.max_stations=%u\n"
"capa.probe_resp_offloads=0x%x\n" "capa.probe_resp_offloads=0x%x\n"
"capa.max_acl_mac_addrs=%u\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.key_mgmt,
drv->capa.enc, drv->capa.enc,
drv->capa.auth, 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.max_stations,
drv->capa.probe_resp_offloads, drv->capa.probe_resp_offloads,
drv->capa.max_acl_mac_addrs, 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)) if (os_snprintf_error(end - pos, res))
return pos - buf; return pos - buf;
pos += res; pos += res;

View file

@ -76,6 +76,8 @@ struct wiphy_info_data {
unsigned int set_qos_map_supported:1; unsigned int set_qos_map_supported:1;
unsigned int have_low_prio_scan:1; unsigned int have_low_prio_scan:1;
unsigned int wmm_ac_supported: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) if (flags & NL80211_FEATURE_LOW_PRIORITY_SCAN)
info->have_low_prio_scan = 1; 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) if (flags & NL80211_FEATURE_STATIC_SMPS)
capa->smps_modes |= WPA_DRIVER_SMPS_MODE_STATIC; 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.flags |= WPA_DRIVER_FLAGS_AP_CSA;
drv->capa.wmm_ac_supported = info->wmm_ac_supported; 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; return 0;
} }

View file

@ -171,6 +171,28 @@ nl80211_scan_common(struct i802_bss *bss, u8 cmd,
scan_flags |= NL80211_SCAN_FLAG_LOW_PRIORITY; 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 && if (scan_flags &&
nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, scan_flags)) nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, scan_flags))
goto fail; goto fail;