]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
Check for FT support when selecting FT suites
authorMatthew Wang <matthewmwang@chromium.org>
Tue, 4 Feb 2020 01:12:05 +0000 (17:12 -0800)
committerJouni Malinen <jouni@codeaurora.org>
Mon, 10 Feb 2020 04:43:38 +0000 (06:43 +0200)
A driver supports FT if it either supports SME or the
NL80211_CMD_UPDATE_FT_IES command. When selecting AKM suites,
wpa_supplicant currently doesn't take into account whether or not either
of those conditions are met. This can cause association failures, e.g.,
when an AP supports both WPA-EAP and FT-EAP but the driver doesn't
support FT (wpa_supplicant will decide to do FT-EAP since it is unaware
the driver doesn't support it). This change allows an FT suite to be
selected only when the driver also supports FT.

Signed-off-by: Matthew Wang <matthewmwang@chromium.org>
Reviewed-by: Brian Norris <briannorris@chromium.org>
src/drivers/driver.h
src/drivers/driver_nl80211_capa.c
wpa_supplicant/wpa_supplicant.c

index 9bdf880110e028e754e34934d5e1ac204180242d..d23e436be75cc69adfe46f22551823eb511f8362 100644 (file)
@@ -1823,6 +1823,8 @@ struct wpa_driver_capa {
 #define WPA_DRIVER_FLAGS_CONTROL_PORT          0x0400000000000000ULL
 /** Driver supports VLAN offload */
 #define WPA_DRIVER_FLAGS_VLAN_OFFLOAD          0x0800000000000000ULL
+/** Driver supports UPDATE_FT_IES command */
+#define WPA_DRIVER_FLAGS_UPDATE_FT_IES         0x1000000000000000ULL
        u64 flags;
 
 #define FULL_AP_CLIENT_STATE_SUPP(drv_flags) \
index 31e7cbfe522cd7bc6761a31598d257c76a6bd200..6968e8e2a2aa72857feeca22c5d7e682caaa667b 100644 (file)
@@ -78,6 +78,7 @@ struct wiphy_info_data {
        unsigned int wmm_ac_supported:1;
        unsigned int mac_addr_rand_scan_supported:1;
        unsigned int mac_addr_rand_sched_scan_supported:1;
+       unsigned int update_ft_ies_supported:1;
 };
 
 
@@ -243,6 +244,9 @@ static void wiphy_info_supp_cmds(struct wiphy_info_data *info,
                case NL80211_CMD_SET_QOS_MAP:
                        info->set_qos_map_supported = 1;
                        break;
+               case NL80211_CMD_UPDATE_FT_IES:
+                       info->update_ft_ies_supported = 1;
+                       break;
                }
        }
 }
@@ -912,6 +916,9 @@ static int wpa_driver_nl80211_get_info(struct wpa_driver_nl80211_data *drv,
                drv->capa.max_sched_scan_plan_iterations = 0;
        }
 
+       if (info->update_ft_ies_supported)
+               drv->capa.flags |= WPA_DRIVER_FLAGS_UPDATE_FT_IES;
+
        return 0;
 }
 
index 09f971c5bb2521b0f8333a38062c613d39bc5262..24a7a28e262da91d7b9ab524a8f4a256d22b6ead 100644 (file)
@@ -1458,6 +1458,11 @@ int wpa_supplicant_set_suites(struct wpa_supplicant *wpa_s,
        if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SAE))
                sel &= ~(WPA_KEY_MGMT_SAE | WPA_KEY_MGMT_FT_SAE);
 #endif /* CONFIG_SAE */
+#ifdef CONFIG_IEEE80211R
+       if (!(wpa_s->drv_flags & (WPA_DRIVER_FLAGS_SME |
+                                 WPA_DRIVER_FLAGS_UPDATE_FT_IES)))
+               sel &= ~WPA_KEY_MGMT_FT;
+#endif /* CONFIG_IEEE80211R */
        if (0) {
 #ifdef CONFIG_IEEE80211R
 #ifdef CONFIG_SHA384