HS 2.0: Use roaming_consortiums list to match OIs for access
This extends Hotspot 2.0 credential matching to consider the roaming_consortiums parameter when determining whether the cred block matches the information advertised by an AP. Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
This commit is contained in:
parent
2e88032f1b
commit
5b7695275c
1 changed files with 29 additions and 9 deletions
|
@ -148,6 +148,8 @@ static int cred_with_roaming_consortium(struct wpa_supplicant *wpa_s)
|
||||||
return 1;
|
return 1;
|
||||||
if (cred->required_roaming_consortium_len)
|
if (cred->required_roaming_consortium_len)
|
||||||
return 1;
|
return 1;
|
||||||
|
if (cred->num_roaming_consortiums)
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1145,6 +1147,23 @@ static int roaming_consortium_match(const u8 *ie, const struct wpabuf *anqp,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int cred_roaming_consortiums_match(const u8 *ie,
|
||||||
|
const struct wpabuf *anqp,
|
||||||
|
const struct wpa_cred *cred)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for (i = 0; i < cred->num_roaming_consortiums; i++) {
|
||||||
|
if (roaming_consortium_match(ie, anqp,
|
||||||
|
cred->roaming_consortiums[i],
|
||||||
|
cred->roaming_consortiums_len[i]))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int cred_no_required_oi_match(struct wpa_cred *cred, struct wpa_bss *bss)
|
static int cred_no_required_oi_match(struct wpa_cred *cred, struct wpa_bss *bss)
|
||||||
{
|
{
|
||||||
const u8 *ie;
|
const u8 *ie;
|
||||||
|
@ -1349,27 +1368,28 @@ static struct wpa_cred * interworking_credentials_available_roaming_consortium(
|
||||||
{
|
{
|
||||||
struct wpa_cred *cred, *selected = NULL;
|
struct wpa_cred *cred, *selected = NULL;
|
||||||
const u8 *ie;
|
const u8 *ie;
|
||||||
|
const struct wpabuf *anqp;
|
||||||
int is_excluded = 0;
|
int is_excluded = 0;
|
||||||
|
|
||||||
ie = wpa_bss_get_ie(bss, WLAN_EID_ROAMING_CONSORTIUM);
|
ie = wpa_bss_get_ie(bss, WLAN_EID_ROAMING_CONSORTIUM);
|
||||||
|
anqp = bss->anqp ? bss->anqp->roaming_consortium : NULL;
|
||||||
|
|
||||||
if (ie == NULL &&
|
if (!ie && !anqp)
|
||||||
(bss->anqp == NULL || bss->anqp->roaming_consortium == NULL))
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (wpa_s->conf->cred == NULL)
|
if (wpa_s->conf->cred == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
for (cred = wpa_s->conf->cred; cred; cred = cred->next) {
|
for (cred = wpa_s->conf->cred; cred; cred = cred->next) {
|
||||||
if (cred->roaming_consortium_len == 0)
|
if (cred->roaming_consortium_len == 0 &&
|
||||||
|
cred->num_roaming_consortiums == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!roaming_consortium_match(ie,
|
if ((cred->roaming_consortium_len == 0 ||
|
||||||
bss->anqp ?
|
!roaming_consortium_match(ie, anqp,
|
||||||
bss->anqp->roaming_consortium :
|
cred->roaming_consortium,
|
||||||
NULL,
|
cred->roaming_consortium_len)) &&
|
||||||
cred->roaming_consortium,
|
!cred_roaming_consortiums_match(ie, anqp, cred))
|
||||||
cred->roaming_consortium_len))
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (cred_no_required_oi_match(cred, bss))
|
if (cred_no_required_oi_match(cred, bss))
|
||||||
|
|
Loading…
Reference in a new issue