]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
AP: Support Short SSID List element in Probe Request frames
authorAndrei Otcheretianski <andrei.otcheretianski@intel.com>
Wed, 19 Jun 2019 12:49:16 +0000 (15:49 +0300)
committerJouni Malinen <j@w1.fi>
Sat, 28 Dec 2019 21:13:58 +0000 (23:13 +0200)
According to IEEE P802.11ax/D6.0, 11.1.4.3.4 (Criteria for sending a
response), AP should answer Probe Request frames if either SSID or Short
SSID matches. Implement this part of the Short SSID use for the BSS (the
collocated 6 GHz BSS case is not covered in this commit).

Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com>
src/ap/beacon.c
src/common/ieee802_11_common.c
src/common/ieee802_11_common.h
src/common/ieee802_11_defs.h

index 331c09bc20ab9a71ade0f30ab12986f2c1b6b8d5..793c10a4d622255e7813f3481aba54783694ccc2 100644 (file)
@@ -581,7 +581,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;
@@ -592,20 +594,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;
@@ -838,7 +850,7 @@ void handle_probe_req(struct hostapd_data *hapd,
 #endif /* CONFIG_P2P */
 
        if (hapd->conf->ignore_broadcast_ssid && elems.ssid_len == 0 &&
-           elems.ssid_list_len == 0) {
+           elems.ssid_list_len == 0 && elems.short_ssid_list_len == 0) {
                wpa_printf(MSG_MSGDUMP, "Probe Request from " MACSTR " for "
                           "broadcast SSID ignored", MAC2STR(mgmt->sa));
                return;
@@ -870,7 +882,8 @@ 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);
        if (res == NO_SSID_MATCH) {
                if (!(mgmt->da[0] & 0x01)) {
                        wpa_printf(MSG_MSGDUMP, "Probe Request from " MACSTR
index 046a25d6c15f5e1a9b340ee5263271d910f50858..36005d75fec23f1fd36ea440254abbbe697b5005 100644 (file)
@@ -282,6 +282,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,
index fbda10c7acb6d0a8fa98ef7afd2e266dc0511ac8..d1331696954eed03a2b60dd85bac8ffb318a237d 100644 (file)
@@ -96,6 +96,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;
@@ -147,6 +148,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;
 };
index e3c2ed310402c5d2c5976e09083124256816cf84..d999a3665febf10e33211459f72c136214898821 100644 (file)
 #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
 #define WLAN_EID_EXT_EDMG_CAPABILITIES 61
 #define WLAN_EID_EXT_EDMG_OPERATION 62
 #define WLAN_EID_EXT_REJECTED_GROUPS 92