]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
wpa_supplicant: Add support for VHT BSS membership selector
authorMichal Kazior <michal.kazior@tieto.com>
Sat, 20 Jul 2013 14:28:42 +0000 (17:28 +0300)
committerJouni Malinen <j@w1.fi>
Sat, 20 Jul 2013 14:28:42 +0000 (17:28 +0300)
This allows wpa_supplicant to associate to an AP that has VHT BSS
membership selector set to indicate VHT support is required for the BSS.

Without the patch it was impossible to connect to, e.g., hostapd-based
AP that has require_vht=1. wpa_supplicant was complaining with:
  hardware does not support required rate 63.0 Mbps

Signed-hostap: Michal Kazior <michal.kazior@tieto.com>

src/drivers/driver.h
src/drivers/driver_nl80211.c
wpa_supplicant/events.c

index 3b7e40018aec9a176cfe171e52ead6ec79441125..4b7bf8035af65d1074981bc12153af4d48bca804 100644 (file)
@@ -61,6 +61,7 @@ struct hostapd_channel_data {
 };
 
 #define HOSTAPD_MODE_FLAG_HT_INFO_KNOWN BIT(0)
+#define HOSTAPD_MODE_FLAG_VHT_INFO_KNOWN BIT(1)
 
 /**
  * struct hostapd_hw_modes - Supported hardware mode information
index 5f7be291341e341b926ad1ad072ed61d7b10e083..4c0c24d0fb623f069cbf70bbaa26c6775c656c5d 100644 (file)
@@ -5658,7 +5658,20 @@ static int phy_info_band(struct phy_info_arg *phy_info, struct nlattr *nl_band)
                mode = &phy_info->modes[*(phy_info->num_modes)];
                os_memset(mode, 0, sizeof(*mode));
                mode->mode = NUM_HOSTAPD_MODES;
-               mode->flags = HOSTAPD_MODE_FLAG_HT_INFO_KNOWN;
+               mode->flags = HOSTAPD_MODE_FLAG_HT_INFO_KNOWN |
+                       HOSTAPD_MODE_FLAG_VHT_INFO_KNOWN;
+
+               /*
+                * Unsupported VHT MCS stream is defined as value 3, so the VHT
+                * MCS RX/TX map must be initialized with 0xffff to mark all 8
+                * possible streams as unsupported. This will be overridden if
+                * driver advertises VHT support.
+                */
+               mode->vht_mcs_set[0] = 0xff;
+               mode->vht_mcs_set[1] = 0xff;
+               mode->vht_mcs_set[4] = 0xff;
+               mode->vht_mcs_set[5] = 0xff;
+
                *(phy_info->num_modes) += 1;
                phy_info->last_mode = nl_band->nla_type;
                phy_info->last_chan_idx = 0;
index f757c72353693cff924c38f9c1c92d6609152a18..fcd0f7946bae2f2aee6ffa22eb90de72b14d24f2 100644 (file)
@@ -548,6 +548,24 @@ static int ht_supported(const struct hostapd_hw_modes *mode)
 }
 
 
+static int vht_supported(const struct hostapd_hw_modes *mode)
+{
+       if (!(mode->flags & HOSTAPD_MODE_FLAG_VHT_INFO_KNOWN)) {
+               /*
+                * The driver did not indicate whether it supports VHT. Assume
+                * it does to avoid connection issues.
+                */
+               return 1;
+       }
+
+       /*
+        * A VHT non-AP STA shall support MCS 0-7 for one spatial stream.
+        * TODO: Verify if this complies with the standard
+        */
+       return (mode->vht_mcs_set[0] & 0x3) != 3;
+}
+
+
 static int rate_match(struct wpa_supplicant *wpa_s, struct wpa_bss *bss)
 {
        const struct hostapd_hw_modes *mode = NULL, *modes;
@@ -613,6 +631,18 @@ static int rate_match(struct wpa_supplicant *wpa_s, struct wpa_bss *bss)
                                continue;
                        }
 
+                       /* There's also a VHT selector for 802.11ac */
+                       if (flagged && ((rate_ie[j] & 0x7f) ==
+                                       BSS_MEMBERSHIP_SELECTOR_VHT_PHY)) {
+                               if (!vht_supported(mode)) {
+                                       wpa_dbg(wpa_s, MSG_DEBUG,
+                                               "   hardware does not support "
+                                               "VHT PHY");
+                                       return 0;
+                               }
+                               continue;
+                       }
+
                        if (!flagged)
                                continue;