Split hostapd/driver.h into two files
[wpasupplicant] / hostapd / wps_hostapd.c
index be1c886..74c2d88 100644 (file)
@@ -15,7 +15,7 @@
 #include "includes.h"
 
 #include "hostapd.h"
-#include "driver.h"
+#include "driver_i.h"
 #include "eloop.h"
 #include "uuid.h"
 #include "wpa_ctrl.h"
@@ -383,16 +383,21 @@ int hostapd_init_wps(struct hostapd_data *hapd,
        os_memset(&cfg, 0, sizeof(cfg));
        wps->wps_state = hapd->conf->wps_state;
        wps->ap_setup_locked = hapd->conf->ap_setup_locked;
-       os_memcpy(wps->uuid, hapd->conf->uuid, UUID_LEN);
+       if (is_nil_uuid(hapd->conf->uuid)) {
+               uuid_gen_mac_addr(hapd->own_addr, wps->uuid);
+               wpa_hexdump(MSG_DEBUG, "WPS: UUID based on MAC address",
+                           wps->uuid, UUID_LEN);
+       } else
+               os_memcpy(wps->uuid, hapd->conf->uuid, UUID_LEN);
        wps->ssid_len = hapd->conf->ssid.ssid_len;
        os_memcpy(wps->ssid, hapd->conf->ssid.ssid, wps->ssid_len);
        wps->ap = 1;
        os_memcpy(wps->dev.mac_addr, hapd->own_addr, ETH_ALEN);
-       wps->dev.device_name = hapd->conf->device_name;
-       wps->dev.manufacturer = hapd->conf->manufacturer;
-       wps->dev.model_name = hapd->conf->model_name;
-       wps->dev.model_number = hapd->conf->model_number;
-       wps->dev.serial_number = hapd->conf->serial_number;
+       wps->dev.device_name = os_strdup(hapd->conf->device_name);
+       wps->dev.manufacturer = os_strdup(hapd->conf->manufacturer);
+       wps->dev.model_name = os_strdup(hapd->conf->model_name);
+       wps->dev.model_number = os_strdup(hapd->conf->model_number);
+       wps->dev.serial_number = os_strdup(hapd->conf->serial_number);
        if (hapd->conf->config_methods) {
                char *m = hapd->conf->config_methods;
                if (os_strstr(m, "label"))
@@ -432,6 +437,8 @@ int hostapd_init_wps(struct hostapd_data *hapd,
                wps->dev.sub_categ = atoi(pos);
        }
        wps->dev.os_version = WPA_GET_BE32(hapd->conf->os_version);
+       wps->dev.rf_bands = hapd->iconf->hw_mode == HOSTAPD_MODE_IEEE80211A ?
+               WPS_RF_50GHZ : WPS_RF_24GHZ; /* FIX: dualband AP */
 
        if (conf->wpa & WPA_PROTO_RSN) {
                if (conf->wpa_key_mgmt & WPA_KEY_MGMT_PSK)
@@ -530,6 +537,7 @@ void hostapd_deinit_wps(struct hostapd_data *hapd)
                return;
        wps_registrar_deinit(hapd->wps->registrar);
        os_free(hapd->wps->network_key);
+       wps_device_data_free(&hapd->wps->dev);
        os_free(hapd->wps);
        hapd->wps = NULL;
        hostapd_wps_clear_ies(hapd);
@@ -540,9 +548,15 @@ int hostapd_wps_add_pin(struct hostapd_data *hapd, const char *uuid,
                        const char *pin)
 {
        u8 u[UUID_LEN];
-       if (hapd->wps == NULL || uuid_str2bin(uuid, u))
+       int any = 0;
+
+       if (hapd->wps == NULL)
+               return -1;
+       if (os_strcmp(uuid, "any") == 0)
+               any = 1;
+       else if (uuid_str2bin(uuid, u))
                return -1;
-       return wps_registrar_add_pin(hapd->wps->registrar, u,
+       return wps_registrar_add_pin(hapd->wps->registrar, any ? NULL : u,
                                     (const u8 *) pin, os_strlen(pin));
 }