According to the Draft IEEE802.11ax/D4.1 (clause 11.1.4.3.4), AP should answer to probe requests if either SSID or Short SSID match and in addition it should also consider co-located BSSs. Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@xxxxxxxxx> --- src/ap/beacon.c | 58 +++++++++++++++++++++++++--------- src/common/ieee802_11_common.c | 4 +++ src/common/ieee802_11_common.h | 2 ++ src/common/ieee802_11_defs.h | 1 + 4 files changed, 50 insertions(+), 15 deletions(-) diff --git a/src/ap/beacon.c b/src/ap/beacon.c index 724e1d8ca5..01e93c4bf3 100644 --- a/src/ap/beacon.c +++ b/src/ap/beacon.c @@ -654,7 +654,9 @@ enum ssid_match_result { static enum ssid_match_result ssid_match(struct hostapd_data *hapd, const u8 *ssid, size_t ssid_len, const u8 *ssid_list, - size_t ssid_list_len) + size_t ssid_list_len, + const u8 *short_ssid_list, + size_t short_ssid_list_len) { const u8 *pos, *end; int wildcard = 0; @@ -665,20 +667,30 @@ static enum ssid_match_result ssid_match(struct hostapd_data *hapd, os_memcmp(ssid, hapd->conf->ssid.ssid, ssid_len) == 0) return EXACT_SSID_MATCH; - if (ssid_list == NULL) - return wildcard ? WILDCARD_SSID_MATCH : NO_SSID_MATCH; + if (ssid_list) { + pos = ssid_list; + end = ssid_list + ssid_list_len; + while (end - pos >= 2) { + if (2 + pos[1] > end - pos) + break; + if (pos[1] == 0) + wildcard = 1; + if (pos[1] == hapd->conf->ssid.ssid_len && + os_memcmp(pos + 2, hapd->conf->ssid.ssid, + pos[1]) == 0) + return EXACT_SSID_MATCH; + pos += 2 + pos[1]; + } + } - pos = ssid_list; - end = ssid_list + ssid_list_len; - while (end - pos >= 2) { - if (2 + pos[1] > end - pos) - break; - if (pos[1] == 0) - wildcard = 1; - if (pos[1] == hapd->conf->ssid.ssid_len && - os_memcmp(pos + 2, hapd->conf->ssid.ssid, pos[1]) == 0) - return EXACT_SSID_MATCH; - pos += 2 + pos[1]; + if (short_ssid_list) { + pos = short_ssid_list; + end = short_ssid_list + short_ssid_list_len; + while (end - pos >= 4) { + if (hapd->conf->ssid.short_ssid == WPA_GET_LE32(pos)) + return EXACT_SSID_MATCH; + pos += 4; + } } return wildcard ? WILDCARD_SSID_MATCH : NO_SSID_MATCH; @@ -943,7 +955,23 @@ void handle_probe_req(struct hostapd_data *hapd, #endif /* CONFIG_TAXONOMY */ res = ssid_match(hapd, elems.ssid, elems.ssid_len, - elems.ssid_list, elems.ssid_list_len); + elems.ssid_list, elems.ssid_list_len, + elems.short_ssid_list, elems.short_ssid_list_len); + for (i = 0; res == NO_SSID_MATCH && i < hapd->conf->n_coloc_ifaces; + i++) { + struct hostapd_data *h = + hostapd_get_iface(hapd->iface->interfaces, + hapd->conf->coloc_ifaces[i]); + + if (!h || !h->started || h == hapd) + continue; + + res = ssid_match(h, elems.ssid, elems.ssid_len, + elems.ssid_list, elems.ssid_list_len, + elems.short_ssid_list, + elems.short_ssid_list_len); + } + if (res == NO_SSID_MATCH) { if (!(mgmt->da[0] & 0x01)) { wpa_printf(MSG_MSGDUMP, "Probe Request from " MACSTR diff --git a/src/common/ieee802_11_common.c b/src/common/ieee802_11_common.c index 8096e17409..a7fff371ae 100644 --- a/src/common/ieee802_11_common.c +++ b/src/common/ieee802_11_common.c @@ -283,6 +283,10 @@ static int ieee802_11_parse_extension(const u8 *pos, size_t elen, elems->oci = pos; elems->oci_len = elen; break; + case WLAN_EID_EXT_SHORT_SSID_LIST: + elems->short_ssid_list = pos; + elems->short_ssid_list_len = elen; + break; default: if (show_errors) { wpa_printf(MSG_MSGDUMP, diff --git a/src/common/ieee802_11_common.h b/src/common/ieee802_11_common.h index 9b045b41a3..5b44e8cddf 100644 --- a/src/common/ieee802_11_common.h +++ b/src/common/ieee802_11_common.h @@ -95,6 +95,7 @@ struct ieee802_11_elems { const u8 *multi_ap; const u8 *he_capabilities; const u8 *he_operation; + const u8 *short_ssid_list; u8 ssid_len; u8 supp_rates_len; @@ -145,6 +146,7 @@ struct ieee802_11_elems { u8 multi_ap_len; u8 he_capabilities_len; u8 he_operation_len; + u8 short_ssid_list_len; struct mb_ies_info mb_ies; }; diff --git a/src/common/ieee802_11_defs.h b/src/common/ieee802_11_defs.h index 30d81dade4..b9136d3d7a 100644 --- a/src/common/ieee802_11_defs.h +++ b/src/common/ieee802_11_defs.h @@ -470,6 +470,7 @@ #define WLAN_EID_EXT_HE_MU_EDCA_PARAMS 38 #define WLAN_EID_EXT_SPATIAL_REUSE 39 #define WLAN_EID_EXT_OCV_OCI 54 +#define WLAN_EID_EXT_SHORT_SSID_LIST 58 /* Extended Capabilities field */ #define WLAN_EXT_CAPAB_20_40_COEX 0 -- 2.19.1 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap