Fix build with CONFIG_WPS_OOB
[libeap.git] / wpa_supplicant / wps_supplicant.c
index 9ded028..0033665 100644 (file)
@@ -32,6 +32,8 @@
 #include "blacklist.h"
 #include "bss.h"
 #include "scan.h"
+#include "ap.h"
+#include "p2p/p2p.h"
 #include "p2p_supplicant.h"
 #include "wps_supplicant.h"
 
@@ -586,8 +588,8 @@ static void wpas_clear_wps(struct wpa_supplicant *wpa_s)
 static void wpas_wps_timeout(void *eloop_ctx, void *timeout_ctx)
 {
        struct wpa_supplicant *wpa_s = eloop_ctx;
-       wpa_printf(MSG_INFO, WPS_EVENT_TIMEOUT "Requested operation timed "
-                  "out");
+       wpa_msg(wpa_s, MSG_INFO, WPS_EVENT_TIMEOUT "Requested operation timed "
+               "out");
        wpas_clear_wps(wpa_s);
 }
 
@@ -691,6 +693,18 @@ int wpas_wps_start_pbc(struct wpa_supplicant *wpa_s, const u8 *bssid,
                return -1;
        ssid->temporary = 1;
        ssid->p2p_group = p2p_group;
+#ifdef CONFIG_P2P
+       if (p2p_group && wpa_s->go_params && wpa_s->go_params->ssid_len) {
+               ssid->ssid = os_zalloc(wpa_s->go_params->ssid_len + 1);
+               if (ssid->ssid) {
+                       ssid->ssid_len = wpa_s->go_params->ssid_len;
+                       os_memcpy(ssid->ssid, wpa_s->go_params->ssid,
+                                 ssid->ssid_len);
+                       wpa_hexdump_ascii(MSG_DEBUG, "WPS: Use specific AP "
+                                         "SSID", ssid->ssid, ssid->ssid_len);
+               }
+       }
+#endif /* CONFIG_P2P */
        wpa_config_set(ssid, "phase1", "\"pbc=1\"", 0);
        if (wpa_s->wps_fragment_size)
                ssid->eap.fragment_size = wpa_s->wps_fragment_size;
@@ -714,6 +728,18 @@ int wpas_wps_start_pin(struct wpa_supplicant *wpa_s, const u8 *bssid,
                return -1;
        ssid->temporary = 1;
        ssid->p2p_group = p2p_group;
+#ifdef CONFIG_P2P
+       if (p2p_group && wpa_s->go_params && wpa_s->go_params->ssid_len) {
+               ssid->ssid = os_zalloc(wpa_s->go_params->ssid_len + 1);
+               if (ssid->ssid) {
+                       ssid->ssid_len = wpa_s->go_params->ssid_len;
+                       os_memcpy(ssid->ssid, wpa_s->go_params->ssid,
+                                 ssid->ssid_len);
+                       wpa_hexdump_ascii(MSG_DEBUG, "WPS: Use specific AP "
+                                         "SSID", ssid->ssid, ssid->ssid_len);
+               }
+       }
+#endif /* CONFIG_P2P */
        if (pin)
                os_snprintf(val, sizeof(val), "\"pin=%s dev_pw_id=%u\"",
                            pin, dev_pw_id);
@@ -732,6 +758,32 @@ int wpas_wps_start_pin(struct wpa_supplicant *wpa_s, const u8 *bssid,
 }
 
 
+/* Cancel the wps pbc/pin requests */
+int wpas_wps_cancel(struct wpa_supplicant *wpa_s)
+{
+#ifdef CONFIG_AP
+       if (wpa_s->ap_iface) {
+               wpa_printf(MSG_DEBUG, "WPS: Cancelling in AP mode");
+               return wpa_supplicant_ap_wps_cancel(wpa_s);
+       }
+#endif /* CONFIG_AP */
+
+       if (wpa_s->wpa_state == WPA_SCANNING) {
+               wpa_printf(MSG_DEBUG, "WPS: Cancel operation - cancel scan");
+               wpa_supplicant_cancel_scan(wpa_s);
+               wpas_clear_wps(wpa_s);
+       } else if (wpa_s->wpa_state >= WPA_ASSOCIATED) {
+               wpa_printf(MSG_DEBUG, "WPS: Cancel operation - "
+                          "deauthenticate");
+               wpa_supplicant_deauthenticate(wpa_s,
+                                             WLAN_REASON_DEAUTH_LEAVING);
+               wpas_clear_wps(wpa_s);
+       }
+
+       return 0;
+}
+
+
 #ifdef CONFIG_WPS_OOB
 int wpas_wps_start_oob(struct wpa_supplicant *wpa_s, char *device_type,
                       char *path, char *method, char *name)
@@ -774,7 +826,8 @@ int wpas_wps_start_oob(struct wpa_supplicant *wpa_s, char *device_type,
        if ((wps->oob_conf.oob_method == OOB_METHOD_DEV_PWD_E ||
             wps->oob_conf.oob_method == OOB_METHOD_DEV_PWD_R) &&
            wpas_wps_start_pin(wpa_s, NULL,
-                              wpabuf_head(wps->oob_conf.dev_password), 0) < 0)
+                              wpabuf_head(wps->oob_conf.dev_password), 0,
+                              DEV_PW_DEFAULT) < 0)
                        return -1;
 
        return 0;
@@ -1065,7 +1118,7 @@ int wpas_wps_ssid_wildcard_ok(struct wpa_supplicant *wpa_s,
 #ifdef CONFIG_WPS_STRICT
        if (wps_ie) {
                if (wps_validate_beacon_probe_resp(wps_ie, bss->beacon_ie_len >
-                                                  0) < 0)
+                                                  0, bss->bssid) < 0)
                        ret = 0;
                if (bss->beacon_ie_len) {
                        struct wpabuf *bcn_wps;
@@ -1101,12 +1154,21 @@ int wpas_wps_scan_pbc_overlap(struct wpa_supplicant *wpa_s,
        if (!eap_is_wps_pbc_enrollee(&ssid->eap))
                return 0;
 
+       wpa_printf(MSG_DEBUG, "WPS: Check whether PBC session overlap is "
+                  "present in scan results; selected BSSID " MACSTR,
+                  MAC2STR(selected->bssid));
+
        /* Make sure that only one AP is in active PBC mode */
        wps_ie = wpa_bss_get_vendor_ie_multi(selected, WPS_IE_VENDOR_TYPE);
-       if (wps_ie)
+       if (wps_ie) {
                sel_uuid = wps_get_uuid_e(wps_ie);
-       else
+               wpa_hexdump(MSG_DEBUG, "WPS: UUID of the selected BSS",
+                           sel_uuid, UUID_LEN);
+       } else {
+               wpa_printf(MSG_DEBUG, "WPS: Selected BSS does not include "
+                          "WPS IE?!");
                sel_uuid = NULL;
+       }
 
        dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
                struct wpabuf *ie;
@@ -1119,10 +1181,18 @@ int wpas_wps_scan_pbc_overlap(struct wpa_supplicant *wpa_s,
                        wpabuf_free(ie);
                        continue;
                }
+               wpa_printf(MSG_DEBUG, "WPS: Another BSS in active PBC mode: "
+                          MACSTR, MAC2STR(bss->bssid));
                uuid = wps_get_uuid_e(ie);
+               wpa_hexdump(MSG_DEBUG, "WPS: UUID of the other BSS",
+                           uuid, UUID_LEN);
                if (sel_uuid == NULL || uuid == NULL ||
-                   os_memcmp(sel_uuid, uuid, 16) != 0) {
+                   os_memcmp(sel_uuid, uuid, UUID_LEN) != 0) {
                        ret = 1; /* PBC overlap */
+                       wpa_msg(wpa_s, MSG_INFO, "WPS: PBC overlap detected: "
+                               MACSTR " and " MACSTR,
+                               MAC2STR(selected->bssid),
+                               MAC2STR(bss->bssid));
                        wpabuf_free(ie);
                        break;
                }
@@ -1387,7 +1457,8 @@ void wpas_wps_update_config(struct wpa_supplicant *wpa_s)
                        os_memcpy(wps->uuid, wpa_s->conf->uuid, WPS_UUID_LEN);
        }
 
-       if (wpa_s->conf->changed_parameters & CFG_CHANGED_DEVICE_NAME) {
+       if (wpa_s->conf->changed_parameters &
+           (CFG_CHANGED_DEVICE_NAME | CFG_CHANGED_WPS_STRING)) {
                /* Update pointers to make sure they refer current values */
                wps->dev.device_name = wpa_s->conf->device_name;
                wps->dev.manufacturer = wpa_s->conf->manufacturer;