From 6ae04d7b344f85d7b37f073e3e25a584ea94efcd Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Sat, 8 Dec 2018 00:39:00 +0200 Subject: [PATCH] HS 2.0: Allow Hotspot 2.0 release number to be configured The new hostapd configuration parameter hs20_release can be used to configure the AP to advertise a specific Hotspot 2.0 release number instead of the latest supported release. This is mainly for testing purposes. Signed-off-by: Jouni Malinen --- hostapd/config_file.c | 10 ++++++++++ src/ap/ap_config.c | 4 ++++ src/ap/ap_config.h | 1 + src/ap/hs20.c | 13 ++++++++----- src/ap/ieee802_1x.c | 5 ++--- 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/hostapd/config_file.c b/hostapd/config_file.c index 1bc835ab2..0452b7872 100644 --- a/hostapd/config_file.c +++ b/hostapd/config_file.c @@ -3717,6 +3717,16 @@ static int hostapd_config_fill(struct hostapd_config *conf, #ifdef CONFIG_HS20 } else if (os_strcmp(buf, "hs20") == 0) { bss->hs20 = atoi(pos); + } else if (os_strcmp(buf, "hs20_release") == 0) { + int val = atoi(pos); + + if (val < 1 || val > (HS20_VERSION >> 4) + 1) { + wpa_printf(MSG_ERROR, + "Line %d: Unsupported hs20_release: %s", + line, pos); + return 1; + } + bss->hs20_release = val; } else if (os_strcmp(buf, "disable_dgaf") == 0) { bss->disable_dgaf = atoi(pos); } else if (os_strcmp(buf, "na_mcast_to_ucast") == 0) { diff --git a/src/ap/ap_config.c b/src/ap/ap_config.c index e6b1f10f1..cf96eb4fd 100644 --- a/src/ap/ap_config.c +++ b/src/ap/ap_config.c @@ -133,6 +133,10 @@ void hostapd_config_defaults_bss(struct hostapd_bss_config *bss) bss->tls_flags = TLS_CONN_DISABLE_TLSv1_3; bss->send_probe_response = 1; + +#ifdef CONFIG_HS20 + bss->hs20_release = (HS20_VERSION >> 4) + 1; +#endif /* CONFIG_HS20 */ } diff --git a/src/ap/ap_config.h b/src/ap/ap_config.h index bd440af94..bd2b96791 100644 --- a/src/ap/ap_config.h +++ b/src/ap/ap_config.h @@ -557,6 +557,7 @@ struct hostapd_bss_config { int na_mcast_to_ucast; #ifdef CONFIG_HS20 int hs20; + int hs20_release; int disable_dgaf; u16 anqp_domain_id; unsigned int hs20_oper_friendly_name_count; diff --git a/src/ap/hs20.c b/src/ap/hs20.c index e265569ae..b2114b35a 100644 --- a/src/ap/hs20.c +++ b/src/ap/hs20.c @@ -25,17 +25,20 @@ u8 * hostapd_eid_hs20_indication(struct hostapd_data *hapd, u8 *eid) if (!hapd->conf->hs20) return eid; *eid++ = WLAN_EID_VENDOR_SPECIFIC; - *eid++ = 7; + *eid++ = hapd->conf->hs20_release < 2 ? 5 : 7; WPA_PUT_BE24(eid, OUI_WFA); eid += 3; *eid++ = HS20_INDICATION_OUI_TYPE; - conf = HS20_VERSION; /* Release Number */ - conf |= HS20_ANQP_DOMAIN_ID_PRESENT; + conf = (hapd->conf->hs20_release - 1) << 4; /* Release Number */ + if (hapd->conf->hs20_release >= 2) + conf |= HS20_ANQP_DOMAIN_ID_PRESENT; if (hapd->conf->disable_dgaf) conf |= HS20_DGAF_DISABLED; *eid++ = conf; - WPA_PUT_LE16(eid, hapd->conf->anqp_domain_id); - eid += 2; + if (hapd->conf->hs20_release >= 2) { + WPA_PUT_LE16(eid, hapd->conf->anqp_domain_id); + eid += 2; + } return eid; } diff --git a/src/ap/ieee802_1x.c b/src/ap/ieee802_1x.c index 185279f9e..efcbe6f1a 100644 --- a/src/ap/ieee802_1x.c +++ b/src/ap/ieee802_1x.c @@ -682,9 +682,8 @@ void ieee802_1x_encapsulate_radius(struct hostapd_data *hapd, #ifdef CONFIG_HS20 if (hapd->conf->hs20) { - u8 ver = 1; /* Release 2 */ - if (HS20_VERSION > 0x10) - ver = 2; /* Release 3 */ + u8 ver = hapd->conf->hs20_release - 1; + if (!radius_msg_add_wfa( msg, RADIUS_VENDOR_ATTR_WFA_HS20_AP_VERSION, &ver, 1)) {