Accepting request 64557 from home:dimstar:branches:GNOME:Factory

approved, see also bnc#681116

OBS-URL: https://build.opensuse.org/request/show/64557
OBS-URL: https://build.opensuse.org/package/show/hardware/wpa_supplicant?expand=0&rev=13
This commit is contained in:
Andreas Jaeger 2011-04-19 15:15:05 +00:00 committed by Git OBS Bridge
parent 4bf035f205
commit 700e23ec90
10 changed files with 152 additions and 652 deletions

View File

@ -1,52 +0,0 @@
commit b4a1256d3660a2b5239062a9b42de79b8a34286a
Author: Jouni Malinen <j@w1.fi>
Date: Sat May 1 17:35:28 2010 +0300
Fix fallback from failed PMKSA caching into full EAP authentication
Commit 83935317a78fb4157eb6e5134527b9311dbf7b8c added forced
disconnection in case of 4-way handshake failures. However, it should
not have changed the case where the supplicant is requesting fallback
to full EAP authentication if the PMKID in EAPOL-Key message 1/4 is
not know. This case needs to send an EAPOL-Start frame instead of
EAPOL-Key message 2/4.
This works around a problem with APs that try to force PMKSA caching
even when the client does not include PMKID in (re)association request
frame to request it. [Bug 355]
diff --git a/src/rsn_supp/wpa.c b/src/rsn_supp/wpa.c
index 885d173..9439f97 100644
--- src/rsn_supp/wpa.c
+++ src/rsn_supp/wpa.c
@@ -231,6 +231,7 @@ static int wpa_supplicant_get_pmk(struct wpa_sm *sm,
wpa_sm_ether_send(sm, sm->bssid, ETH_P_EAPOL,
buf, buflen);
os_free(buf);
+ return -2;
}
return -1;
@@ -361,6 +362,7 @@ static void wpa_supplicant_process_1_of_4(struct wpa_sm *sm,
struct wpa_eapol_ie_parse ie;
struct wpa_ptk *ptk;
u8 buf[8];
+ int res;
if (wpa_sm_get_network_ctx(sm) == NULL) {
wpa_printf(MSG_WARNING, "WPA: No SSID info found (msg 1 of "
@@ -388,7 +390,13 @@ static void wpa_supplicant_process_1_of_4(struct wpa_sm *sm,
}
#endif /* CONFIG_NO_WPA2 */
- if (wpa_supplicant_get_pmk(sm, src_addr, ie.pmkid))
+ res = wpa_supplicant_get_pmk(sm, src_addr, ie.pmkid);
+ if (res == -2) {
+ wpa_printf(MSG_DEBUG, "RSN: Do not reply to msg 1/4 - "
+ "requesting full EAP authentication");
+ return;
+ }
+ if (res)
goto failed;
if (sm->renew_snonce) {

View File

@ -0,0 +1,4 @@
[D-BUS Service]
Name=fi.w1.wpa_supplicant1
Exec=/usr/sbin/wpa_supplicant -u
User=root

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:dc7258286d2eb87c470abca13e19135b3e0a9bc84d7be8a8500e73a560cc9b65
size 1263708

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:495bb18e0fd682f143ec46715f6b2d6ce57ddc6f6dbd0d40603f0d2cef458b3a
size 1290000

View File

@ -0,0 +1,62 @@
From b80b5639935d37b95d00f86b57f2844a9c775f57 Mon Sep 17 00:00:00 2001
From: Dan Williams <dcbw@redhat.com>
Date: Fri, 17 Dec 2010 15:56:01 +0200
Subject: [PATCH 1/1] dbus: Emit property changed events when adding/removing BSSes
The supplicant was not emitting property changed events when the BSSs
property changed.
Signed-off-by: Dan Williams <dcbw@redhat.com>
(cherry picked from commit 1e6288df6b07a353a9246b77e0de2a840b5f2c72)
---
wpa_supplicant/dbus/dbus_new.c | 6 ++++++
wpa_supplicant/dbus/dbus_new.h | 1 +
2 files changed, 7 insertions(+), 0 deletions(-)
diff --git a/wpa_supplicant/dbus/dbus_new.c b/wpa_supplicant/dbus/dbus_new.c
index bdfbbac..c66640a 100644
--- a/wpa_supplicant/dbus/dbus_new.c
+++ b/wpa_supplicant/dbus/dbus_new.c
@@ -691,6 +691,10 @@ void wpas_dbus_signal_prop_changed(struct wpa_supplicant *wpa_s,
wpas_dbus_getter_current_network;
prop = "CurrentNetwork";
break;
+ case WPAS_DBUS_PROP_BSSS:
+ getter = (WPADBusPropertyAccessor) wpas_dbus_getter_bsss;
+ prop = "BSSs";
+ break;
default:
wpa_printf(MSG_ERROR, "dbus: %s: Unknown Property value %d",
__func__, property);
@@ -1199,6 +1203,7 @@ int wpas_dbus_unregister_bss(struct wpa_supplicant *wpa_s,
}
wpas_dbus_signal_bss_removed(wpa_s, bss_obj_path);
+ wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_BSSS);
return 0;
}
@@ -1263,6 +1268,7 @@ int wpas_dbus_register_bss(struct wpa_supplicant *wpa_s,
}
wpas_dbus_signal_bss_added(wpa_s, bss_obj_path);
+ wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_BSSS);
return 0;
diff --git a/wpa_supplicant/dbus/dbus_new.h b/wpa_supplicant/dbus/dbus_new.h
index 80ea98c..9cdefcb 100644
--- a/wpa_supplicant/dbus/dbus_new.h
+++ b/wpa_supplicant/dbus/dbus_new.h
@@ -30,6 +30,7 @@ enum wpas_dbus_prop {
WPAS_DBUS_PROP_STATE,
WPAS_DBUS_PROP_CURRENT_BSS,
WPAS_DBUS_PROP_CURRENT_NETWORK,
+ WPAS_DBUS_PROP_BSSS,
};
enum wpas_dbus_bss_prop {
--
1.7.4-rc1

View File

@ -1,23 +0,0 @@
Index: wpa_supplicant-0.6.9/wpa_supplicant/dbus-wpa_supplicant.conf
===================================================================
--- wpa_supplicant-0.6.9.orig/wpa_supplicant/dbus-wpa_supplicant.conf
+++ wpa_supplicant-0.6.9/wpa_supplicant/dbus-wpa_supplicant.conf
@@ -4,13 +4,10 @@
<busconfig>
<policy user="root">
<allow own="fi.epitest.hostap.WPASupplicant"/>
-
<allow send_destination="fi.epitest.hostap.WPASupplicant"/>
- <allow send_interface="fi.epitest.hostap.WPASupplicant"/>
- </policy>
- <policy context="default">
- <deny own="fi.epitest.hostap.WPASupplicant"/>
- <deny send_destination="fi.epitest.hostap.WPASupplicant"/>
- <deny send_interface="fi.epitest.hostap.WPASupplicant"/>
- </policy>
+ </policy>
+ <policy context="default">
+ <allow send_destination="fi.epitest.hostap.WPASupplicant"
+ send_interface="org.freedesktop.DBus.Introspectable"/>
+ </policy>
</busconfig>

View File

@ -1,247 +0,0 @@
diff -ur BUILD/wpa_supplicant-0.6.9/src/crypto/tls.h BUILD2/wpa_supplicant-0.6.9/src/crypto/tls.h
--- BUILD/wpa_supplicant-0.6.9/src/crypto/tls.h 2009-03-23 15:06:28.000000000 +0100
+++ BUILD2/wpa_supplicant-0.6.9/src/crypto/tls.h 2009-05-05 11:47:15.000000000 +0200
@@ -32,6 +32,7 @@
const char *opensc_engine_path;
const char *pkcs11_engine_path;
const char *pkcs11_module_path;
+ const char *pkcs11_module_init_args;
};
/**
diff -ur BUILD/wpa_supplicant-0.6.9/src/crypto/tls_openssl.c BUILD2/wpa_supplicant-0.6.9/src/crypto/tls_openssl.c
--- BUILD/wpa_supplicant-0.6.9/src/crypto/tls_openssl.c 2009-03-23 15:06:28.000000000 +0100
+++ BUILD2/wpa_supplicant-0.6.9/src/crypto/tls_openssl.c 2009-05-05 11:47:15.000000000 +0200
@@ -667,9 +667,11 @@
* tls_engine_load_dynamic_pkcs11 - load the pkcs11 engine provided by opensc
* @pkcs11_so_path: pksc11_so_path from the configuration
* @pcks11_module_path: pkcs11_module_path from the configuration
+ * @pkcs11_module_init_args: pkcs11_module_init_args from the configuration
*/
static int tls_engine_load_dynamic_pkcs11(const char *pkcs11_so_path,
- const char *pkcs11_module_path)
+ const char *pkcs11_module_path,
+ const char *pkcs11_module_init_args)
{
char *engine_id = "pkcs11";
const char *pre_cmd[] = {
@@ -682,6 +684,7 @@
};
const char *post_cmd[] = {
"MODULE_PATH", NULL /* pkcs11_module_path */,
+ "INIT_ARGS", NULL /* pkcs11_module_init_args */,
NULL, NULL
};
@@ -692,6 +695,9 @@
pre_cmd[3] = engine_id;
post_cmd[1] = pkcs11_module_path;
+ if (pkcs11_module_init_args)
+ post_cmd[3] = pkcs11_module_init_args;
+
wpa_printf(MSG_DEBUG, "ENGINE: Loading pkcs11 Engine from %s",
pkcs11_so_path);
@@ -761,7 +767,8 @@
if (tls_engine_load_dynamic_opensc(conf->opensc_engine_path) ||
tls_engine_load_dynamic_pkcs11(conf->pkcs11_engine_path,
- conf->pkcs11_module_path)) {
+ conf->pkcs11_module_path,
+ conf->pkcs11_module_init_args)) {
tls_deinit(ssl);
return NULL;
}
diff -ur BUILD/wpa_supplicant-0.6.9/src/eapol_supp/eapol_supp_sm.c BUILD2/wpa_supplicant-0.6.9/src/eapol_supp/eapol_supp_sm.c
--- BUILD/wpa_supplicant-0.6.9/src/eapol_supp/eapol_supp_sm.c 2009-03-23 15:06:28.000000000 +0100
+++ BUILD2/wpa_supplicant-0.6.9/src/eapol_supp/eapol_supp_sm.c 2009-05-05 11:47:15.000000000 +0200
@@ -1834,6 +1834,7 @@
conf.opensc_engine_path = ctx->opensc_engine_path;
conf.pkcs11_engine_path = ctx->pkcs11_engine_path;
conf.pkcs11_module_path = ctx->pkcs11_module_path;
+ conf.pkcs11_module_init_args = ctx->pkcs11_module_init_args;
#endif /* EAP_TLS_OPENSSL */
conf.wps = ctx->wps;
diff -ur BUILD/wpa_supplicant-0.6.9/src/eapol_supp/eapol_supp_sm.h BUILD2/wpa_supplicant-0.6.9/src/eapol_supp/eapol_supp_sm.h
--- BUILD/wpa_supplicant-0.6.9/src/eapol_supp/eapol_supp_sm.h 2009-03-23 15:06:28.000000000 +0100
+++ BUILD2/wpa_supplicant-0.6.9/src/eapol_supp/eapol_supp_sm.h 2009-05-05 11:47:15.000000000 +0200
@@ -198,6 +198,15 @@
* module is not loaded.
*/
const char *pkcs11_module_path;
+
+ /**
+ * pkcs11_module_init_args - The initialization arguments to the OpenSSL
+ * OpenSC/PKCS#11 module.
+ *
+ * This is an OpenSSL specific configuration option for configuring
+ * the initialization arguments of the PKCS#11 module.
+ */
+ const char *pkcs11_module_init_args;
#endif /* EAP_TLS_OPENSSL */
/**
diff -ur BUILD/wpa_supplicant-0.6.9/src/eap_peer/eap.c BUILD2/wpa_supplicant-0.6.9/src/eap_peer/eap.c
--- BUILD/wpa_supplicant-0.6.9/src/eap_peer/eap.c 2009-03-23 15:06:28.000000000 +0100
+++ BUILD2/wpa_supplicant-0.6.9/src/eap_peer/eap.c 2009-05-05 11:47:15.000000000 +0200
@@ -1188,6 +1188,7 @@
tlsconf.opensc_engine_path = conf->opensc_engine_path;
tlsconf.pkcs11_engine_path = conf->pkcs11_engine_path;
tlsconf.pkcs11_module_path = conf->pkcs11_module_path;
+ tlsconf.pkcs11_module_init_args = conf->pkcs11_module_init_args;
sm->ssl_ctx = tls_init(&tlsconf);
if (sm->ssl_ctx == NULL) {
wpa_printf(MSG_WARNING, "SSL: Failed to initialize TLS "
diff -ur BUILD/wpa_supplicant-0.6.9/src/eap_peer/eap.h BUILD2/wpa_supplicant-0.6.9/src/eap_peer/eap.h
--- BUILD/wpa_supplicant-0.6.9/src/eap_peer/eap.h 2009-03-23 15:06:28.000000000 +0100
+++ BUILD2/wpa_supplicant-0.6.9/src/eap_peer/eap.h 2009-05-05 11:48:04.000000000 +0200
@@ -246,6 +246,13 @@
*/
const char *pkcs11_module_path;
/**
+ * pkcs11_module_init_args - OpenSC PKCS#11 module initialization
+ * arguments for OpenSSL engine.
+ *
+ * Usually, NULL.
+ */
+ const char *pkcs11_module_init_args;
+ /**
* wps - WPS context data
*
* This is only used by EAP-WSC and can be left %NULL if not available.
diff -ur BUILD/wpa_supplicant-0.6.9/wpa_supplicant/config.c BUILD2/wpa_supplicant-0.6.9/wpa_supplicant/config.c
--- BUILD/wpa_supplicant-0.6.9/wpa_supplicant/config.c 2009-05-05 11:49:45.000000000 +0200
+++ BUILD2/wpa_supplicant-0.6.9/wpa_supplicant/config.c 2009-05-05 11:47:15.000000000 +0200
@@ -1580,6 +1580,7 @@
os_free(config->opensc_engine_path);
os_free(config->pkcs11_engine_path);
os_free(config->pkcs11_module_path);
+ os_free(config->pkcs11_module_init_args);
#endif /* EAP_TLS_OPENSSL */
os_free(config->driver_param);
os_free(config->device_name);
diff -ur BUILD/wpa_supplicant-0.6.9/wpa_supplicant/config_file.c BUILD2/wpa_supplicant-0.6.9/wpa_supplicant/config_file.c
--- BUILD/wpa_supplicant-0.6.9/wpa_supplicant/config_file.c 2009-05-05 11:49:45.000000000 +0200
+++ BUILD2/wpa_supplicant-0.6.9/wpa_supplicant/config_file.c 2009-05-05 11:49:24.000000000 +0200
@@ -444,6 +444,7 @@
{ STR(opensc_engine_path) },
{ STR(pkcs11_engine_path) },
{ STR(pkcs11_module_path) },
+ { STR(pkcs11_module_init_args) },
#endif /* EAP_TLS_OPENSSL */
{ STR(driver_param) },
{ INT(dot11RSNAConfigPMKLifetime) },
@@ -854,6 +855,9 @@
if (config->pkcs11_module_path)
fprintf(f, "pkcs11_module_path=%s\n",
config->pkcs11_module_path);
+ if (config->pkcs11_module_init_args)
+ fprintf(f, "pkcs11_module_init_args=%s\n",
+ config->pkcs11_module_init_args);
#endif /* EAP_TLS_OPENSSL */
if (config->driver_param)
fprintf(f, "driver_param=%s\n", config->driver_param);
diff -ur BUILD/wpa_supplicant-0.6.9/wpa_supplicant/config.h BUILD2/wpa_supplicant-0.6.9/wpa_supplicant/config.h
--- BUILD/wpa_supplicant-0.6.9/wpa_supplicant/config.h 2009-05-05 11:49:45.000000000 +0200
+++ BUILD2/wpa_supplicant-0.6.9/wpa_supplicant/config.h 2009-05-05 11:47:15.000000000 +0200
@@ -195,6 +195,15 @@
* module is not loaded.
*/
char *pkcs11_module_path;
+
+ /**
+ * pkcs11_module_init_args - The initialization arguments to the OpenSSL
+ * OpenSC/PKCS#11 module.
+ *
+ * This is an OpenSSL specific configuration option for configuring
+ * the initialization arguments of the PKCS#11 module.
+ */
+ char *pkcs11_module_init_args;
#endif /* EAP_TLS_OPENSSL */
/**
diff -ur BUILD/wpa_supplicant-0.6.9/wpa_supplicant/ctrl_iface_dbus_handlers.c BUILD2/wpa_supplicant-0.6.9/wpa_supplicant/ctrl_iface_dbus_handlers.c
--- BUILD/wpa_supplicant-0.6.9/wpa_supplicant/ctrl_iface_dbus_handlers.c 2009-05-05 11:49:45.000000000 +0200
+++ BUILD2/wpa_supplicant-0.6.9/wpa_supplicant/ctrl_iface_dbus_handlers.c 2009-05-05 11:47:15.000000000 +0200
@@ -866,7 +866,7 @@
static const char *dont_quote[] = {
"key_mgmt", "proto", "pairwise", "auth_alg", "group", "eap",
"opensc_engine_path", "pkcs11_engine_path", "pkcs11_module_path",
- "bssid", NULL
+ "pkcs11_module_init_args", "bssid", NULL
};
static dbus_bool_t should_quote_opt(const char *key)
@@ -1204,6 +1204,7 @@
char *opensc_engine_path = NULL;
char *pkcs11_engine_path = NULL;
char *pkcs11_module_path = NULL;
+ char *pkcs11_module_init_args = NULL;
struct wpa_dbus_dict_entry entry;
if (!dbus_message_iter_init(message, &iter))
@@ -1230,6 +1231,11 @@
pkcs11_module_path = os_strdup(entry.str_value);
if (pkcs11_module_path == NULL)
goto error;
+ } else if (!strcmp(entry.key, "pkcs11_module_init_args") &&
+ (entry.type == DBUS_TYPE_STRING)) {
+ pkcs11_module_init_args = os_strdup(entry.str_value);
+ if (pkcs11_module_init_args == NULL)
+ goto error;
} else {
wpa_dbus_dict_entry_clear(&entry);
goto error;
@@ -1244,6 +1250,8 @@
wpa_s->conf->pkcs11_engine_path = pkcs11_engine_path;
os_free(wpa_s->conf->pkcs11_module_path);
wpa_s->conf->pkcs11_module_path = pkcs11_module_path;
+ os_free(wpa_s->conf->pkcs11_module_init_args);
+ wpa_s->conf->pkcs11_module_init_args = pkcs11_module_init_args;
#endif /* EAP_TLS_OPENSSL */
eapol_sm_deinit(wpa_s->eapol);
@@ -1257,6 +1265,7 @@
os_free(opensc_engine_path);
os_free(pkcs11_engine_path);
os_free(pkcs11_module_path);
+ os_free(pkcs11_module_init_args);
return wpas_dbus_new_invalid_opts_error(message, NULL);
}
diff -ur BUILD/wpa_supplicant-0.6.9/wpa_supplicant/eapol_test.c BUILD2/wpa_supplicant-0.6.9/wpa_supplicant/eapol_test.c
--- BUILD/wpa_supplicant-0.6.9/wpa_supplicant/eapol_test.c 2009-03-23 15:06:28.000000000 +0100
+++ BUILD2/wpa_supplicant-0.6.9/wpa_supplicant/eapol_test.c 2009-05-05 11:47:15.000000000 +0200
@@ -408,6 +408,7 @@
ctx->opensc_engine_path = wpa_s->conf->opensc_engine_path;
ctx->pkcs11_engine_path = wpa_s->conf->pkcs11_engine_path;
ctx->pkcs11_module_path = wpa_s->conf->pkcs11_module_path;
+ ctx->pkcs11_module_init_args = wpa_s->conf->pkcs11_module_init_args;
#endif /* EAP_TLS_OPENSSL */
wpa_s->eapol = eapol_sm_init(ctx);
diff -ur BUILD/wpa_supplicant-0.6.9/wpa_supplicant/wpas_glue.c BUILD2/wpa_supplicant-0.6.9/wpa_supplicant/wpas_glue.c
--- BUILD/wpa_supplicant-0.6.9/wpa_supplicant/wpas_glue.c 2009-03-23 15:06:28.000000000 +0100
+++ BUILD2/wpa_supplicant-0.6.9/wpa_supplicant/wpas_glue.c 2009-05-05 11:47:15.000000000 +0200
@@ -557,6 +557,7 @@
ctx->opensc_engine_path = wpa_s->conf->opensc_engine_path;
ctx->pkcs11_engine_path = wpa_s->conf->pkcs11_engine_path;
ctx->pkcs11_module_path = wpa_s->conf->pkcs11_module_path;
+ ctx->pkcs11_module_init_args = wpa_s->conf->pkcs11_module_init_args;
#endif /* EAP_TLS_OPENSSL */
ctx->wps = wpa_s->wps;
ctx->eap_param_needed = wpa_supplicant_eap_param_needed;
diff -ur BUILD/wpa_supplicant-0.6.9/wpa_supplicant/wpa_supplicant.c BUILD2/wpa_supplicant-0.6.9/wpa_supplicant/wpa_supplicant.c
--- BUILD/wpa_supplicant-0.6.9/wpa_supplicant/wpa_supplicant.c 2009-05-05 11:49:45.000000000 +0200
+++ BUILD2/wpa_supplicant-0.6.9/wpa_supplicant/wpa_supplicant.c 2009-05-05 11:47:15.000000000 +0200
@@ -577,7 +577,7 @@
wpa_s->current_ssid = NULL;
/*
* TODO: should notify EAPOL SM about changes in opensc_engine_path,
- * pkcs11_engine_path, pkcs11_module_path.
+ * pkcs11_engine_path, pkcs11_module_path, pkcs11_module_init_args.
*/
if (wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt)) {
/*

View File

@ -1,307 +0,0 @@
diff -ur BUILD/wpa_supplicant-0.6.9/src/drivers/driver.h BUILD2/wpa_supplicant-0.6.9/src/drivers/driver.h
--- BUILD/wpa_supplicant-0.6.9/src/drivers/driver.h 2009-03-23 15:06:28.000000000 +0100
+++ BUILD2/wpa_supplicant-0.6.9/src/drivers/driver.h 2009-05-04 14:26:47.000000000 +0200
@@ -963,6 +963,8 @@
*/
int (*set_mode)(void *priv, int mode);
+ int (*get_default_roaming)(void *priv);
+
/**
* set_country - Set country
* @priv: Private driver interface data
@@ -1147,7 +1149,13 @@
* FT authentication sequence from the AP. The FT IEs are included in
* the extra information in union wpa_event_data::ft_ies.
*/
- EVENT_FT_RESPONSE
+ EVENT_FT_RESPONSE,
+
+ /**
+ * EVENT_ROAMING_THRESHOLD - Roaming threshold exceeded
+ */
+ EVENT_ROAMING_THRESHOLD
+
} wpa_event_type;
diff -ur BUILD/wpa_supplicant-0.6.9/src/drivers/driver_wext.c BUILD2/wpa_supplicant-0.6.9/src/drivers/driver_wext.c
--- BUILD/wpa_supplicant-0.6.9/src/drivers/driver_wext.c 2009-05-04 14:32:17.000000000 +0200
+++ BUILD2/wpa_supplicant-0.6.9/src/drivers/driver_wext.c 2009-05-04 14:28:20.000000000 +0200
@@ -524,10 +524,18 @@
drv->assoc_req_ies = NULL;
os_free(drv->assoc_resp_ies);
drv->assoc_resp_ies = NULL;
+
+ /* stop monitoring the signal quality */
+ eloop_cancel_timeout(wpa_driver_wext_monitor_quality, drv, drv->ctx);
+
wpa_supplicant_event(ctx, EVENT_DISASSOC,
NULL);
} else {
+ /* start monitoring the signal quality */
+ eloop_register_timeout(5, 0, wpa_driver_wext_monitor_quality, drv,
+ drv->ctx);
+
wpa_driver_wext_event_assoc_ies(drv);
wpa_supplicant_event(ctx, EVENT_ASSOC, NULL);
}
@@ -891,6 +899,30 @@
return wpa_driver_wext_set_ifflags_ifname(drv, drv->ifname, flags);
}
+void wpa_driver_wext_set_default_roaming(struct wpa_driver_wext_data *drv)
+{
+ /* ugly hack to enable roaming only for the iwlwifi driver */
+ char buf[256];
+ char line[256];
+ FILE* f;
+
+ /* the driver we want roaming enabled for */
+ char* driver = "DRIVER=iwlagn";
+
+ /* lookup this interface in sysfs */
+ snprintf(buf, sizeof(buf),"/sys/class/net/%s/device/uevent", drv->ifname);
+ if ( (f = fopen(buf, "r")) ) {
+ while (fgets(line, sizeof(line), f)) {
+ if (strstr (line, driver)) {
+ /* iwlwifi found -> enable roaming */
+ drv->default_roaming = 1;
+ break;
+ }
+ }
+ fclose(f);
+ f = NULL;
+ }
+}
/**
* wpa_driver_wext_init - Initialize WE driver interface
@@ -942,6 +974,9 @@
drv->mlme_sock = -1;
+ drv->default_roaming = 0;
+ wpa_driver_wext_set_default_roaming(drv);
+
wpa_driver_wext_finish_drv_init(drv);
return drv;
@@ -1017,6 +1052,7 @@
int flags;
eloop_cancel_timeout(wpa_driver_wext_scan_timeout, drv, drv->ctx);
+ eloop_cancel_timeout(wpa_driver_wext_monitor_quality, drv, drv->ctx);
/*
* Clear possibly configured driver parameters in order to make it
@@ -1058,6 +1094,69 @@
wpa_supplicant_event(timeout_ctx, EVENT_SCAN_RESULTS, NULL);
}
+/**
+ * wpa_driver_wext_monitor_quality - Monitor the signal quality
+ * @eloop_ctx: Unused
+ * @timeout_ctx: ctx argument given to wpa_driver_wext_init()
+ */
+void wpa_driver_wext_monitor_quality(void *eloop_ctx, void *timeout_ctx)
+{
+ struct iwreq iwr;
+ struct iw_statistics stats;
+ struct wpa_driver_wext_data *drv = (struct wpa_driver_wext_data *) eloop_ctx;
+ int timeout_sec;
+
+ os_memset(&iwr, 0, sizeof(iwr));
+ os_memset(&stats, 0, sizeof(stats));
+
+ os_strlcpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
+
+ iwr.u.data.pointer = (caddr_t) &stats;
+ iwr.u.data.length = sizeof(stats);
+ iwr.u.data.flags = 1;
+
+ if (ioctl(drv->ioctl_sock, SIOCGIWSTATS, &iwr) < 0) {
+ perror("ioctl[SIOCGIWSTATS]");
+ return;
+ }
+
+ if (stats.qual.qual < (int) (0.4f * (float)drv->max_qual))
+ {
+ if (++drv->low_signal_count >= 3)
+ {
+ wpa_printf(MSG_DEBUG, "Signal quality low (%i/%i)", stats.qual.qual, drv->max_qual);
+ drv->low_signal_count = 0;
+ wpa_supplicant_event(drv->ctx, EVENT_ROAMING_THRESHOLD, NULL);
+ /* next measurement in 5 seconds */
+ eloop_register_timeout(5, 0, wpa_driver_wext_monitor_quality, drv, drv->ctx);
+ }
+ else
+ {
+ /* next measurment in 100ms */
+ eloop_register_timeout(0, 100000, wpa_driver_wext_monitor_quality, drv, drv->ctx);
+ }
+ return;
+ }
+ drv->low_signal_count = 0;
+
+ if (stats.qual.qual < (int) (0.6f * (float)drv->max_qual))
+ timeout_sec = 2;
+ else if (stats.qual.qual < (int) (0.8f * (float)drv->max_qual))
+ timeout_sec = 5;
+ else
+ timeout_sec = 10;
+
+ eloop_register_timeout(timeout_sec, 0, wpa_driver_wext_monitor_quality, drv, drv->ctx);
+}
+
+/**
+ * wpa_driver_get_default_roaming - Enable/Disable roaming per default
+ */
+int wpa_driver_get_default_roaming(void *priv)
+{
+ struct wpa_driver_wext_data *drv = priv;
+ return drv->default_roaming;
+}
/**
* wpa_driver_wext_scan - Request the driver to initiate scan
@@ -1610,6 +1709,7 @@
if (range->enc_capa & IW_ENC_CAPA_4WAY_HANDSHAKE)
drv->capa.flags |= WPA_DRIVER_FLAGS_4WAY_HANDSHAKE;
+ drv->max_qual = range->max_qual.qual;
wpa_printf(MSG_DEBUG, " capabilities: key_mgmt 0x%x enc 0x%x "
"flags 0x%x",
drv->capa.key_mgmt, drv->capa.enc, drv->capa.flags);
@@ -2388,4 +2488,5 @@
.flush_pmkid = wpa_driver_wext_flush_pmkid,
.get_capa = wpa_driver_wext_get_capa,
.set_operstate = wpa_driver_wext_set_operstate,
+ .get_default_roaming = wpa_driver_get_default_roaming,
};
diff -ur BUILD/wpa_supplicant-0.6.9/src/drivers/driver_wext.h BUILD2/wpa_supplicant-0.6.9/src/drivers/driver_wext.h
--- BUILD/wpa_supplicant-0.6.9/src/drivers/driver_wext.h 2009-03-23 15:06:28.000000000 +0100
+++ BUILD2/wpa_supplicant-0.6.9/src/drivers/driver_wext.h 2009-05-04 14:26:04.000000000 +0200
@@ -43,6 +43,9 @@
char mlmedev[IFNAMSIZ + 1];
int scan_complete_events;
+ int low_signal_count;
+ int max_qual;
+ int default_roaming;
};
int wpa_driver_wext_get_ifflags(struct wpa_driver_wext_data *drv, int *flags);
@@ -61,6 +64,7 @@
struct wpa_scan_results * wpa_driver_wext_get_scan_results(void *priv);
void wpa_driver_wext_scan_timeout(void *eloop_ctx, void *timeout_ctx);
+void wpa_driver_wext_monitor_quality(void *eloop_ctx, void *timeout_ctx);
int wpa_driver_wext_alternative_ifindex(struct wpa_driver_wext_data *drv,
const char *ifname);
diff -ur BUILD/wpa_supplicant-0.6.9/wpa_supplicant/config.c BUILD2/wpa_supplicant-0.6.9/wpa_supplicant/config.c
--- BUILD/wpa_supplicant-0.6.9/wpa_supplicant/config.c 2009-03-23 15:06:28.000000000 +0100
+++ BUILD2/wpa_supplicant-0.6.9/wpa_supplicant/config.c 2009-05-04 14:26:04.000000000 +0200
@@ -1943,6 +1943,7 @@
config->eapol_version = DEFAULT_EAPOL_VERSION;
config->ap_scan = DEFAULT_AP_SCAN;
config->fast_reauth = DEFAULT_FAST_REAUTH;
+ config->roaming = DEFAULT_ROAMING;
if (ctrl_interface)
config->ctrl_interface = os_strdup(ctrl_interface);
diff -ur BUILD/wpa_supplicant-0.6.9/wpa_supplicant/config_file.c BUILD2/wpa_supplicant-0.6.9/wpa_supplicant/config_file.c
--- BUILD/wpa_supplicant-0.6.9/wpa_supplicant/config_file.c 2009-03-23 15:06:28.000000000 +0100
+++ BUILD2/wpa_supplicant-0.6.9/wpa_supplicant/config_file.c 2009-05-04 14:31:03.000000000 +0200
@@ -306,6 +306,12 @@
return 0;
}
+static int wpa_config_process_roaming(struct wpa_config *config, char *pos)
+{
+ config->roaming = atoi(pos);
+ wpa_printf(MSG_DEBUG, "roaming=%d", config->roaming);
+ return 0;
+}
static int wpa_config_parse_str(const struct global_parse_data *data,
struct wpa_config *config, int line,
@@ -457,6 +463,7 @@
{ STR(device_type) },
{ FUNC(os_version) },
{ INT_RANGE(wps_cred_processing, 0, 2) },
+ { FUNC(roaming) },
#endif /* CONFIG_WPS */
{ FUNC(country) }
};
diff -ur BUILD/wpa_supplicant-0.6.9/wpa_supplicant/config.h BUILD2/wpa_supplicant-0.6.9/wpa_supplicant/config.h
--- BUILD/wpa_supplicant-0.6.9/wpa_supplicant/config.h 2009-03-23 15:06:28.000000000 +0100
+++ BUILD2/wpa_supplicant-0.6.9/wpa_supplicant/config.h 2009-05-04 14:26:04.000000000 +0200
@@ -22,6 +22,7 @@
#define DEFAULT_AP_SCAN 1
#endif /* CONFIG_NO_SCAN_PROCESSING */
#define DEFAULT_FAST_REAUTH 1
+#define DEFAULT_ROAMING -1
#include "config_ssid.h"
@@ -244,6 +245,11 @@
int update_config;
/**
+ * roaming
+ */
+ int roaming;
+
+ /**
* blobs - Configuration blobs
*/
struct wpa_config_blob *blobs;
diff -ur BUILD/wpa_supplicant-0.6.9/wpa_supplicant/events.c BUILD2/wpa_supplicant-0.6.9/wpa_supplicant/events.c
--- BUILD/wpa_supplicant-0.6.9/wpa_supplicant/events.c 2009-03-23 15:06:28.000000000 +0100
+++ BUILD2/wpa_supplicant-0.6.9/wpa_supplicant/events.c 2009-05-04 14:26:04.000000000 +0200
@@ -706,6 +706,21 @@
}
#endif /* CONFIG_NO_SCAN_PROCESSING */
+static void wpa_supplicant_event_roaming_threshold(struct wpa_supplicant *wpa_s)
+{
+ struct os_time t1, t2;
+ os_get_time(&t1);
+ os_time_sub(&t1, &(wpa_s->last_roaming_attempt), &t2);
+ if (wpa_s->conf->roaming > 0
+ || (wpa_s->conf->roaming == -1
+ && wpa_s->driver->get_default_roaming
+ && wpa_s->driver->get_default_roaming(wpa_s->drv_priv)))
+ /* limit the scan triggering to one every 20 seconds */
+ if (t2.sec > 20) {
+ wpa_supplicant_req_scan(wpa_s, 0, 0);
+ os_get_time(&(wpa_s->last_roaming_attempt));
+ }
+}
static void wpa_supplicant_event_associnfo(struct wpa_supplicant *wpa_s,
union wpa_event_data *data)
@@ -1114,6 +1129,9 @@
wpa_supplicant_event_ft_response(wpa_s, data);
break;
#endif /* CONFIG_IEEE80211R */
+ case EVENT_ROAMING_THRESHOLD:
+ wpa_supplicant_event_roaming_threshold(wpa_s);
+ break;
default:
wpa_printf(MSG_INFO, "Unknown event %d", event);
break;
diff -ur BUILD/wpa_supplicant-0.6.9/wpa_supplicant/wpa_supplicant_i.h BUILD2/wpa_supplicant-0.6.9/wpa_supplicant/wpa_supplicant_i.h
--- BUILD/wpa_supplicant-0.6.9/wpa_supplicant/wpa_supplicant_i.h 2009-03-23 15:06:28.000000000 +0100
+++ BUILD2/wpa_supplicant-0.6.9/wpa_supplicant/wpa_supplicant_i.h 2009-05-04 14:32:01.000000000 +0200
@@ -350,6 +350,7 @@
struct wpa_client_mlme mlme;
int use_client_mlme;
int driver_4way_handshake;
+ struct os_time last_roaming_attempt;
int pending_mic_error_report;
int pending_mic_error_pairwise;

View File

@ -1,3 +1,78 @@
-------------------------------------------------------------------
Wed Mar 16 21:22:58 UTC 2011 - dimstar@opensuse.org
- Add wpa_supplicant-dbus-events.patch: Emit property changed
events when adding/removing BSSes. Required by NetworkManager
0.9 beta1 and later.
- Also install fi.w1.wpa_supplicant1.service, which was added as
source5, sourced from the wpa_supplicant source code, with
modified exec line pointing to /usr/sbin instead of /sbin.
-------------------------------------------------------------------
Tue Sep 7 23:08:14 CEST 2010 - vbotka@suse.de
- update to 0.7.3
* fixed fallback from failed PMKSA caching into full EAP authentication
[Bug 355]
* fixed issue with early D-Bus signals during initialization
* fixed X.509 name handling in internal TLS
* fixed WPS ER to use corrent Enrollee MAC Address in Credential
* fixed scanning routines ot improve AP selection for WPS
* added WPS workaround for open networks
* fixed WPS Diffie-Hellman derivation to use correct public key length
* fixed wpa_supplicant AP mode operations to ignore Supplicant and
scan result events
* improved SME operations with nl80211
* fixed WPS ER event_id handling in some cases
* fixed some issues with bgscan simple to avoid unnecessary scans
* fixed issue with l2_packet_ndis overlapped writes corrupting stack
[Bug 328]
* updated WinPcap to the latest stable version 4.1.2 in Windows
installer
update to 0.7.2
* nl80211: fixed number of issues with roaming
* avoid unnecessary roaming if multiple APs with similar signal
strength are present in scan results
* add TLS client events and server probing to ease design of
automatic detection of EAP parameters
* add option for server certificate matching (SHA256 hash of the
certificate) instead of trusted CA certificate configuration
* bsd: Cleaned up driver wrapper and added various low-level
configuration options
* wpa_gui-qt4: do not show too frequent WPS AP available events as
tray messages
* TNC: fixed issues with fragmentation
* EAP-TNC: add Flags field into fragment acknowledgement (needed to
interoperate with other implementations; may potentially breaks
compatibility with older wpa_supplicant/hostapd versions)
* wpa_cli: added option for using a separate process to receive event
messages to reduce latency in showing these
(CFLAGS += -DCONFIG_WPA_CLI_FORK=y in .config to enable this)
* maximum BSS table size can now be configured (bss_max_count)
* BSSes to be included in the BSS table can be filtered based on
configured SSIDs to save memory (filter_ssids)
* fix number of issues with IEEE 802.11r/FT; this version is not
backwards compatible with old versions
* nl80211: add support for IEEE 802.11r/FT protocol (both over-the-air
and over-the-DS)
* add freq_list network configuration parameter to allow the AP
selection to filter out entries based on the operating channel
* add signal strength change events for bgscan; this allows more
dynamic changes to background scanning interval based on changes in
the signal strength with the current AP; this improves roaming within
ESS quite a bit, e.g., with bgscan="simple:30:-45:300" in the network
configuration block to request background scans less frequently when
signal strength remains good and to automatically trigger background
scans whenever signal strength drops noticeably
(this is currently only available with nl80211)
* add BSSID and reason code (if available) to disconnect event messages
* wpa_gui-qt4: more complete support for translating the GUI with
linguist and add German translation
* fix DH padding with internal crypto code (mainly, for WPS)
* do not trigger initial scan automatically anymore if there are no
enabled networks
-------------------------------------------------------------------
Fri May 28 12:49:53 CEST 2010 - vbotka@suse.de

View File

@ -1,5 +1,5 @@
#
# spec file for package wpa_supplicant (Version 0.7.1)
# spec file for package wpa_supplicant (Version 0.7.3)
#
# Copyright (c) 2010 SUSE LINUX Products GmbH, Nuernberg, Germany.
#
@ -21,8 +21,8 @@
Name: wpa_supplicant
BuildRequires: dbus-1-devel libnl-devel libqt4 libqt4-devel openssl-devel pkg-config readline-devel
Url: http://hostap.epitest.fi/wpa_supplicant/
Version: 0.7.1
Release: 2
Version: 0.7.3
Release: 1
License: BSD3c(or similar) ; GPLv2+
Group: Productivity/Networking/Other
Summary: WPA supplicant implementation
@ -31,6 +31,7 @@ Source1: config
Source2: %{name}.conf
Source3: fi.epitest.hostap.WPASupplicant.service
Source4: logrotate.wpa_supplicant
Source5: fi.w1.wpa_supplicant1.service
Patch0: wpa_supplicant-driver-wext-debug.patch
# wpa_supplicant-flush-debug-output.patch won't go upstream as it might
# change timings
@ -39,13 +40,8 @@ Patch1: wpa_supplicant-flush-debug-output.patch
# is not portable
Patch2: wpa_supplicant-sigusr1-changes-debuglevel.patch
Patch4: wpa_supplicant-errormsg.patch
Patch6: wpa_supplicant-fix_dbus_config.patch
#Patch7: wpa_supplicant-fix_dbus_config2.patch
# wpa_supplicant-roaming.patch won't go upstream as it is an ugly hack, once
# roaming is implemented in a clean way this patch should be removed
Patch8: wpa_supplicant-roaming.patch
Patch9: wpa_supplicant-pkcs11-init-args.patch
Patch10: Fix_Fallback_From_Failed_PMKSA_Into_Full_EAP.patch
# PATCH-FIX-UPSTREAM wpa_supplicant-dbus-events.patch dimstar@opensuse.org -- dbus: Emit property changed events when adding/removing BSSes, taken from git.
Patch5: wpa_supplicant-dbus-events.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-build
Requires: logrotate
@ -56,7 +52,6 @@ negotiation with a WPA Authenticator and it controls the roaming and
IEEE 802.11 authentication/association of the wlan driver.
Authors:
--------
Jouni Malinen <jkmaline@cc.hut.fi>
@ -72,7 +67,6 @@ This package contains a graphical front-end to wpa_supplicant, an
implementation of the WPA Supplicant component.
Authors:
--------
Jouni Malinen <jkmaline@cc.hut.fi>
@ -85,14 +79,7 @@ cp %{SOURCE1} wpa_supplicant/.config
%patch1 -p0
%patch2 -p0
%patch4 -p0
# Patch does not apply anymore
#%patch6 -p1
#patch7 -p1
# Patch does not apply anymore
#%patch8 -p2
# Patch does not apply anymore
#%patch9 -p2
%patch10 -p0
%patch5 -p1
%build
cd wpa_supplicant
@ -112,6 +99,7 @@ install -d %{buildroot}/%{_sysconfdir}/%{name}
install -m 0600 %{SOURCE2} %{buildroot}/%{_sysconfdir}/%{name}
install -d %{buildroot}/%{_datadir}/dbus-1/system-services
install -m 0644 %{SOURCE3} %{buildroot}/%{_datadir}/dbus-1/system-services
install -m 0644 %{SOURCE5} %{buildroot}/%{_datadir}/dbus-1/system-services
install -d %{buildroot}/%{_sysconfdir}/logrotate.d/
install -m 644 %{SOURCE4} %{buildroot}/%{_sysconfdir}/logrotate.d/wpa_supplicant
install -d %{buildroot}/%{_localstatedir}/run/%{name}