#include "config.h"
#include "base64.h"
#include "uuid.h"
-#include "eap_peer/eap_methods.h"
/**
#endif /* CONFIG_NO_CONFIG_BLOBS */
-struct global_parse_data {
- char *name;
- int (*parser)(const struct global_parse_data *data,
- struct wpa_config *config, int line, const char *value);
- void *param1;
-};
-
-
-static int wpa_config_parse_int(const struct global_parse_data *data,
- struct wpa_config *config, int line,
- const char *pos)
-{
- int *dst;
- dst = (int *) (((u8 *) config) + (long) data->param1);
- *dst = atoi(pos);
- wpa_printf(MSG_DEBUG, "%s=%d", data->name, *dst);
- return 0;
-}
-
-
-static int wpa_config_process_country(const struct global_parse_data *data,
- struct wpa_config *config, int line,
- const char *pos)
-{
- if (!pos[0] || !pos[1]) {
- wpa_printf(MSG_DEBUG, "Invalid country set");
- return -1;
- }
- config->country[0] = pos[0];
- config->country[1] = pos[1];
- wpa_printf(MSG_DEBUG, "country='%c%c'",
- config->country[0], config->country[1]);
- return 0;
-}
-
-
-#ifdef CONFIG_CTRL_IFACE
-static int wpa_config_process_ctrl_interface(
- const struct global_parse_data *data, struct wpa_config *config,
- int line, const char *pos)
-{
- os_free(config->ctrl_interface);
- config->ctrl_interface = os_strdup(pos);
- wpa_printf(MSG_DEBUG, "ctrl_interface='%s'", config->ctrl_interface);
- return 0;
-}
-
-
-static int wpa_config_process_ctrl_interface_group(
- const struct global_parse_data *data, struct wpa_config *config,
- int line, const char *pos)
-{
- os_free(config->ctrl_interface_group);
- config->ctrl_interface_group = os_strdup(pos);
- wpa_printf(MSG_DEBUG, "ctrl_interface_group='%s' (DEPRECATED)",
- config->ctrl_interface_group);
- return 0;
-}
-#endif /* CONFIG_CTRL_IFACE */
-
-
-static int wpa_config_process_eapol_version(
- const struct global_parse_data *data, struct wpa_config *config,
- int line, const char *pos)
-{
- config->eapol_version = atoi(pos);
- if (config->eapol_version < 1 || config->eapol_version > 2) {
- wpa_printf(MSG_ERROR, "Line %d: Invalid EAPOL version (%d): "
- "'%s'.", line, config->eapol_version, pos);
- return -1;
- }
- wpa_printf(MSG_DEBUG, "eapol_version=%d", config->eapol_version);
- return 0;
-}
-
-
-#ifdef EAP_TLS_OPENSSL
-
-static int wpa_config_process_opensc_engine_path(
- const struct global_parse_data *data, struct wpa_config *config,
- int line, const char *pos)
-{
- os_free(config->opensc_engine_path);
- config->opensc_engine_path = os_strdup(pos);
- wpa_printf(MSG_DEBUG, "opensc_engine_path='%s'",
- config->opensc_engine_path);
- return 0;
-}
-
-
-static int wpa_config_process_pkcs11_engine_path(
- const struct global_parse_data *data, struct wpa_config *config,
- int line, const char *pos)
-{
- os_free(config->pkcs11_engine_path);
- config->pkcs11_engine_path = os_strdup(pos);
- wpa_printf(MSG_DEBUG, "pkcs11_engine_path='%s'",
- config->pkcs11_engine_path);
- return 0;
-}
-
-
-static int wpa_config_process_pkcs11_module_path(
- const struct global_parse_data *data, struct wpa_config *config,
- int line, const char *pos)
-{
- os_free(config->pkcs11_module_path);
- config->pkcs11_module_path = os_strdup(pos);
- wpa_printf(MSG_DEBUG, "pkcs11_module_path='%s'",
- config->pkcs11_module_path);
- return 0;
-}
-
-#endif /* EAP_TLS_OPENSSL */
-
-
-static int wpa_config_process_driver_param(
- const struct global_parse_data *data, struct wpa_config *config,
- int line, const char *pos)
-{
- os_free(config->driver_param);
- config->driver_param = os_strdup(pos);
- wpa_printf(MSG_DEBUG, "driver_param='%s'", config->driver_param);
- return 0;
-}
-
-
-static int wpa_config_process_load_dynamic_eap(
- const struct global_parse_data *data, struct wpa_config *config,
- int line, const char *so)
-{
- int ret;
- wpa_printf(MSG_DEBUG, "load_dynamic_eap=%s", so);
- ret = eap_peer_method_load(so);
- if (ret == -2) {
- wpa_printf(MSG_DEBUG, "This EAP type was already loaded - not "
- "reloading.");
- } else if (ret) {
- wpa_printf(MSG_ERROR, "Line %d: Failed to load dynamic EAP "
- "method '%s'.", line, so);
- return -1;
- }
-
- return 0;
-}
-
-
-#ifdef CONFIG_WPS
-
-static int wpa_config_process_uuid(const struct global_parse_data *data,
- struct wpa_config *config, int line,
- const char *pos)
-{
- char buf[40];
- if (uuid_str2bin(pos, config->uuid)) {
- wpa_printf(MSG_ERROR, "Line %d: invalid UUID", line);
- return -1;
- }
- uuid_bin2str(config->uuid, buf, sizeof(buf));
- wpa_printf(MSG_DEBUG, "uuid=%s", buf);
- return 0;
-}
-
-
-static int wpa_config_process_device_name(const struct global_parse_data *data,
- struct wpa_config *config, int line,
- const char *pos)
-{
- if (os_strlen(pos) > 32)
- return -1;
- os_free(config->device_name);
- config->device_name = os_strdup(pos);
- wpa_printf(MSG_DEBUG, "device_name='%s'", config->device_name);
- return 0;
-}
-
-
-static int wpa_config_process_manufacturer(
- const struct global_parse_data *data, struct wpa_config *config,
- int line, const char *pos)
-{
- if (os_strlen(pos) > 64)
- return -1;
- os_free(config->manufacturer);
- config->manufacturer = os_strdup(pos);
- wpa_printf(MSG_DEBUG, "manufacturer='%s'", config->manufacturer);
- return 0;
-}
-
-
-static int wpa_config_process_model_name(const struct global_parse_data *data,
- struct wpa_config *config, int line,
- const char *pos)
-{
- if (os_strlen(pos) > 32)
- return -1;
- os_free(config->model_name);
- config->model_name = os_strdup(pos);
- wpa_printf(MSG_DEBUG, "model_name='%s'", config->model_name);
- return 0;
-}
-
-
-static int wpa_config_process_model_number(
- const struct global_parse_data *data, struct wpa_config *config,
- int line, const char *pos)
-{
- if (os_strlen(pos) > 32)
- return -1;
- os_free(config->model_number);
- config->model_number = os_strdup(pos);
- wpa_printf(MSG_DEBUG, "model_number='%s'", config->model_number);
- return 0;
-}
-
-
-static int wpa_config_process_serial_number(
- const struct global_parse_data *data, struct wpa_config *config,
- int line, const char *pos)
-{
- if (os_strlen(pos) > 32)
- return -1;
- os_free(config->serial_number);
- config->serial_number = os_strdup(pos);
- wpa_printf(MSG_DEBUG, "serial_number='%s'", config->serial_number);
- return 0;
-}
-
-
-static int wpa_config_process_device_type(const struct global_parse_data *data,
- struct wpa_config *config, int line,
- const char *pos)
-{
- os_free(config->device_type);
- config->device_type = os_strdup(pos);
- wpa_printf(MSG_DEBUG, "device_type='%s'", config->device_type);
- return 0;
-}
-
-
-static int wpa_config_process_os_version(const struct global_parse_data *data,
- struct wpa_config *config, int line,
- const char *pos)
-{
- if (hexstr2bin(pos, config->os_version, 4)) {
- wpa_printf(MSG_ERROR, "Line %d: invalid os_version", line);
- return -1;
- }
- wpa_printf(MSG_DEBUG, "os_version=%08x",
- WPA_GET_BE32(config->os_version));
- return 0;
-}
-
-#endif /* CONFIG_WPS */
-
-
-#ifdef OFFSET
-#undef OFFSET
-#endif /* OFFSET */
-/* OFFSET: Get offset of a variable within the wpa_config structure */
-#define OFFSET(v) ((void *) &((struct wpa_config *) 0)->v)
-
-#define FUNC(f) #f, wpa_config_process_ ## f, OFFSET(f)
-#define FUNC_NO_VAR(f) #f, wpa_config_process_ ## f, 0
-#define INT(f) #f, wpa_config_parse_int, OFFSET(f)
-
-static const struct global_parse_data global_fields[] = {
-#ifdef CONFIG_CTRL_IFACE
- { FUNC(ctrl_interface) },
- { FUNC(ctrl_interface_group) },
-#endif /* CONFIG_CTRL_IFACE */
- { FUNC(eapol_version) },
- { INT(ap_scan) },
- { INT(fast_reauth) },
-#ifdef EAP_TLS_OPENSSL
- { FUNC(opensc_engine_path) },
- { FUNC(pkcs11_engine_path) },
- { FUNC(pkcs11_module_path) },
-#endif /* EAP_TLS_OPENSSL */
- { FUNC(driver_param) },
- { INT(dot11RSNAConfigPMKLifetime) },
- { INT(dot11RSNAConfigPMKReauthThreshold) },
- { INT(dot11RSNAConfigSATimeout) },
-#ifndef CONFIG_NO_CONFIG_WRITE
- { INT(update_config) },
-#endif /* CONFIG_NO_CONFIG_WRITE */
- { FUNC_NO_VAR(load_dynamic_eap) },
-#ifdef CONFIG_WPS
- { FUNC(uuid) },
- { FUNC(device_name) },
- { FUNC(manufacturer) },
- { FUNC(model_name) },
- { FUNC(model_number) },
- { FUNC(serial_number) },
- { FUNC(device_type) },
- { FUNC(os_version) },
-#endif /* CONFIG_WPS */
- { FUNC(country) }
-};
-
-#undef FUNC
-#undef INT
-#define NUM_GLOBAL_FIELDS (sizeof(global_fields) / sizeof(global_fields[0]))
-
-
-static int wpa_config_process_global(struct wpa_config *config, char *pos,
- int line)
-{
- size_t i;
- int ret = 0;
-
- for (i = 0; i < NUM_GLOBAL_FIELDS; i++) {
- const struct global_parse_data *field = &global_fields[i];
- size_t flen = os_strlen(field->name);
- if (os_strncmp(pos, field->name, flen) != 0 ||
- pos[flen] != '=')
- continue;
-
- if (field->parser(field, config, line, pos + flen + 1)) {
- wpa_printf(MSG_ERROR, "Line %d: failed to "
- "parse '%s'.", line, pos);
- ret = -1;
- }
- break;
- }
- if (i == NUM_GLOBAL_FIELDS) {
- wpa_printf(MSG_ERROR, "Line %d: unknown global field '%s'.",
- line, pos);
- ret = -1;
- }
-
- return ret;
-}
-
-
struct wpa_config * wpa_config_read(const char *name)
{
FILE *f;
fprintf(f, "ap_scan=%d\n", config->ap_scan);
if (config->fast_reauth != DEFAULT_FAST_REAUTH)
fprintf(f, "fast_reauth=%d\n", config->fast_reauth);
-#ifdef EAP_TLS_OPENSSL
if (config->opensc_engine_path)
fprintf(f, "opensc_engine_path=%s\n",
config->opensc_engine_path);
if (config->pkcs11_module_path)
fprintf(f, "pkcs11_module_path=%s\n",
config->pkcs11_module_path);
-#endif /* EAP_TLS_OPENSSL */
if (config->driver_param)
fprintf(f, "driver_param=%s\n", config->driver_param);
if (config->dot11RSNAConfigPMKLifetime)
if (config->update_config)
fprintf(f, "update_config=%d\n", config->update_config);
#ifdef CONFIG_WPS
- if (is_nil_uuid(config->uuid)) {
+ if (!is_nil_uuid(config->uuid)) {
char buf[40];
uuid_bin2str(config->uuid, buf, sizeof(buf));
fprintf(f, "uuid=%s\n", buf);
fprintf(f, "serial_number=%s\n", config->serial_number);
if (config->device_type)
fprintf(f, "device_type=%s\n", config->device_type);
- if (config->os_version)
+ if (WPA_GET_BE32(config->os_version))
fprintf(f, "os_version=%08x\n",
WPA_GET_BE32(config->os_version));
+ if (config->config_methods)
+ fprintf(f, "config_methods=%s\n", config->config_methods);
+ if (config->wps_cred_processing)
+ fprintf(f, "wps_cred_processing=%d\n",
+ config->wps_cred_processing);
#endif /* CONFIG_WPS */
+#ifdef CONFIG_P2P
+ if (config->p2p_listen_reg_class)
+ fprintf(f, "p2p_listen_reg_class=%u\n",
+ config->p2p_listen_reg_class);
+ if (config->p2p_listen_channel)
+ fprintf(f, "p2p_listen_channel=%u\n",
+ config->p2p_listen_channel);
+ if (config->p2p_oper_reg_class)
+ fprintf(f, "p2p_oper_reg_class=%u\n",
+ config->p2p_oper_reg_class);
+ if (config->p2p_oper_channel)
+ fprintf(f, "p2p_oper_channel=%u\n", config->p2p_oper_channel);
+ if (config->p2p_go_intent != DEFAULT_P2P_GO_INTENT)
+ fprintf(f, "p2p_go_intent=%u\n", config->p2p_go_intent);
+ if (config->p2p_ssid_postfix)
+ fprintf(f, "p2p_ssid_postfix=%s\n", config->p2p_ssid_postfix);
+ if (config->persistent_reconnect)
+ fprintf(f, "persistent_reconnect=%u\n",
+ config->persistent_reconnect);
+ if (config->p2p_intra_bss != DEFAULT_P2P_INTRA_BSS)
+ fprintf(f, "p2p_intra_bss=%u\n", config->p2p_intra_bss);
+
+#endif /* CONFIG_P2P */
if (config->country[0] && config->country[1]) {
fprintf(f, "country=%c%c\n",
config->country[0], config->country[1]);
}
+ if (config->bss_max_count != DEFAULT_BSS_MAX_COUNT)
+ fprintf(f, "bss_max_count=%u\n", config->bss_max_count);
+ if (config->filter_ssids)
+ fprintf(f, "filter_ssids=%d\n", config->filter_ssids);
}
#endif /* CONFIG_NO_CONFIG_WRITE */
wpa_config_write_global(f, config);
for (ssid = config->ssid; ssid; ssid = ssid->next) {
- if (ssid->key_mgmt == WPA_KEY_MGMT_WPS)
- continue; /* do not save temporary WPS networks */
+ if (ssid->key_mgmt == WPA_KEY_MGMT_WPS || ssid->temporary)
+ continue; /* do not save temporary networks */
fprintf(f, "\nnetwork={\n");
wpa_config_write_network(f, ssid);
fprintf(f, "}\n");