WPS: Added support for wildcard SSID matching in ap_scan=2 mode
Change association behavior to match with ap_scan=1 when WPS is used in ap_scan=2 mode with wildcard SSID matching. In addition, allow hardcoded BSSID to be used to select AP even if selected registrar attribute is not present.
This commit is contained in:
parent
3c1e276507
commit
24c23d1b3c
4 changed files with 47 additions and 1 deletions
|
@ -629,7 +629,8 @@ static void wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s)
|
||||||
wpas_wps_notify_scan_results(wpa_s);
|
wpas_wps_notify_scan_results(wpa_s);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wpa_s->conf->ap_scan == 2 || wpa_s->disconnected)
|
if ((wpa_s->conf->ap_scan == 2 && !wpas_wps_searching(wpa_s)) ||
|
||||||
|
wpa_s->disconnected)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
while (selected == NULL) {
|
while (selected == NULL) {
|
||||||
|
|
|
@ -935,6 +935,17 @@ void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
|
||||||
wpa_ft_prepare_auth_request(wpa_s->wpa);
|
wpa_ft_prepare_auth_request(wpa_s->wpa);
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_IEEE80211R */
|
#endif /* CONFIG_IEEE80211R */
|
||||||
|
#ifdef CONFIG_WPS
|
||||||
|
} else if ((ssid->ssid == NULL || ssid->ssid_len == 0) &&
|
||||||
|
wpa_s->conf->ap_scan == 2 &&
|
||||||
|
(ssid->key_mgmt & WPA_KEY_MGMT_WPS)) {
|
||||||
|
/* Use ap_scan==1 style network selection to find the network
|
||||||
|
*/
|
||||||
|
wpa_s->scan_req = 2;
|
||||||
|
wpa_s->reassociate = 1;
|
||||||
|
wpa_supplicant_req_scan(wpa_s, 0, 0);
|
||||||
|
return;
|
||||||
|
#endif /* CONFIG_WPS */
|
||||||
} else {
|
} else {
|
||||||
wpa_msg(wpa_s, MSG_INFO, "Trying to associate with SSID '%s'",
|
wpa_msg(wpa_s, MSG_INFO, "Trying to associate with SSID '%s'",
|
||||||
wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
|
wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
|
||||||
|
@ -1418,6 +1429,14 @@ struct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s)
|
||||||
(!entry->bssid_set ||
|
(!entry->bssid_set ||
|
||||||
os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
|
os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
|
||||||
return entry;
|
return entry;
|
||||||
|
#ifdef CONFIG_WPS
|
||||||
|
if (!entry->disabled &&
|
||||||
|
(entry->key_mgmt & WPA_KEY_MGMT_WPS) &&
|
||||||
|
(entry->ssid == NULL || entry->ssid_len == 0) &&
|
||||||
|
(!entry->bssid_set ||
|
||||||
|
os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
|
||||||
|
return entry;
|
||||||
|
#endif /* CONFIG_WPS */
|
||||||
entry = entry->next;
|
entry = entry->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -286,6 +286,7 @@ static struct wpa_ssid * wpas_wps_add_network(struct wpa_supplicant *wpa_s,
|
||||||
struct wpa_scan_res *res;
|
struct wpa_scan_res *res;
|
||||||
|
|
||||||
os_memcpy(ssid->bssid, bssid, ETH_ALEN);
|
os_memcpy(ssid->bssid, bssid, ETH_ALEN);
|
||||||
|
ssid->bssid_set = 1;
|
||||||
|
|
||||||
/* Try to get SSID from scan results */
|
/* Try to get SSID from scan results */
|
||||||
if (wpa_s->scan_res == NULL &&
|
if (wpa_s->scan_res == NULL &&
|
||||||
|
@ -538,6 +539,12 @@ int wpas_wps_ssid_wildcard_ok(struct wpa_ssid *ssid,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!ret && ssid->bssid_set &&
|
||||||
|
os_memcmp(ssid->bssid, bss->bssid, ETH_ALEN) == 0) {
|
||||||
|
/* allow wildcard SSID due to hardcoded BSSID match */
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
|
||||||
wpabuf_free(wps_ie);
|
wpabuf_free(wps_ie);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -629,3 +636,16 @@ void wpas_wps_notify_scan_results(struct wpa_supplicant *wpa_s)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int wpas_wps_searching(struct wpa_supplicant *wpa_s)
|
||||||
|
{
|
||||||
|
struct wpa_ssid *ssid;
|
||||||
|
|
||||||
|
for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) {
|
||||||
|
if ((ssid->key_mgmt & WPA_KEY_MGMT_WPS) && !ssid->disabled)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@ int wpas_wps_scan_pbc_overlap(struct wpa_supplicant *wpa_s,
|
||||||
struct wpa_scan_res *selected,
|
struct wpa_scan_res *selected,
|
||||||
struct wpa_ssid *ssid);
|
struct wpa_ssid *ssid);
|
||||||
void wpas_wps_notify_scan_results(struct wpa_supplicant *wpa_s);
|
void wpas_wps_notify_scan_results(struct wpa_supplicant *wpa_s);
|
||||||
|
int wpas_wps_searching(struct wpa_supplicant *wpa_s);
|
||||||
|
|
||||||
#else /* CONFIG_WPS */
|
#else /* CONFIG_WPS */
|
||||||
|
|
||||||
|
@ -77,6 +78,11 @@ static inline void wpas_wps_notify_scan_results(struct wpa_supplicant *wpa_s)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int wpas_wps_searching(struct wpa_supplicant *wpa_s)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_WPS */
|
#endif /* CONFIG_WPS */
|
||||||
|
|
||||||
#endif /* WPS_SUPPLICANT_H */
|
#endif /* WPS_SUPPLICANT_H */
|
||||||
|
|
Loading…
Reference in a new issue