]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
WPS: Extend startWhen to 2 if peer AP supports WPS 2.0
authorJustin Shen <chias@qca.qualcomm.com>
Mon, 13 Oct 2014 07:40:08 +0000 (15:40 +0800)
committerJouni Malinen <j@w1.fi>
Mon, 13 Oct 2014 09:24:17 +0000 (12:24 +0300)
Increase EAPOL startWhen to 2 for the case where the AP/GO has
advertised it supports WPS 2.0. This is done to make it less likely for
the EAPOL-Start frame to be sent out since that is only required for WPS
1.0. Not sending it can remove one unnecessary round trip from the EAP
exchange when the AP is going to start with EAP-Request/Identity
immediately based on the Association Request frame.

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
src/eapol_supp/eapol_supp_sm.c
src/eapol_supp/eapol_supp_sm.h
wpa_supplicant/wpa_supplicant.c

index ef8d6eebd9a7e982d143968ff6be73802660d70a..5cc0508814a297da38defdccf6e71e2a15d685f3 100644 (file)
@@ -255,7 +255,7 @@ SM_STATE(SUPP_PAE, CONNECTING)
                 * delay authentication. Use a short timeout to send the first
                 * EAPOL-Start if Authenticator does not start authentication.
                 */
-               if (sm->conf.wps) {
+               if (sm->conf.wps && !(sm->conf.wps & EAPOL_PEER_IS_WPS20_AP)) {
                        /* Reduce latency on starting WPS negotiation. */
                        wpa_printf(MSG_DEBUG,
                                   "EAPOL: Using shorter startWhen for WPS");
index 2a790524e333c43365fba3cdf4b787003f514708..cc3ca67b26413edd7522f5d45b3e9d1e7a653440 100644 (file)
@@ -59,6 +59,8 @@ struct eapol_config {
         */
        int external_sim;
 
+#define EAPOL_LOCAL_WPS_IN_USE BIT(0)
+#define EAPOL_PEER_IS_WPS20_AP BIT(1)
        /**
         * wps - Whether this connection is used for WPS
         */
index a061f8eb7faa90d8daee94ed930576ea9b8aaed8..e7aeeacfe5d77fb48e3b0e569106632c87c496cc 100644 (file)
@@ -297,7 +297,24 @@ void wpa_supplicant_initiate_eapol(struct wpa_supplicant *wpa_s)
                wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA &&
                wpa_s->key_mgmt != WPA_KEY_MGMT_WPS;
        eapol_conf.external_sim = wpa_s->conf->external_sim;
-       eapol_conf.wps = wpa_s->key_mgmt == WPA_KEY_MGMT_WPS;
+
+#ifdef CONFIG_WPS
+       if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) {
+               eapol_conf.wps |= EAPOL_LOCAL_WPS_IN_USE;
+               if (wpa_s->current_bss) {
+                       struct wpabuf *ie;
+                       ie = wpa_bss_get_vendor_ie_multi(wpa_s->current_bss,
+                                                        WPS_IE_VENDOR_TYPE);
+                       if (ie) {
+                               if (wps_is_20(ie))
+                                       eapol_conf.wps |=
+                                               EAPOL_PEER_IS_WPS20_AP;
+                               wpabuf_free(ie);
+                       }
+               }
+       }
+#endif /* CONFIG_WPS */
+
        eapol_sm_notify_config(wpa_s->eapol, &ssid->eap, &eapol_conf);
 
        ieee802_1x_alloc_kay_sm(wpa_s, ssid);