From 4bf035f20531e8147853ab4897a5d785882044d3daf33fbc8ce69aa46a1342e9 Mon Sep 17 00:00:00 2001 From: OBS User autobuild Date: Tue, 21 Sep 2010 16:13:17 +0000 Subject: [PATCH] Accepting request 48679 from hardware checked in (request 48679) OBS-URL: https://build.opensuse.org/request/show/48679 OBS-URL: https://build.opensuse.org/package/show/hardware/wpa_supplicant?expand=0&rev=12 --- ...back_From_Failed_PMKSA_Into_Full_EAP.patch | 52 +++ wpa_supplicant-0.7.1.tar.bz2 | 3 + wpa_supplicant-0.7.3.tar.bz2 | 3 - wpa_supplicant-fix_dbus_config.patch | 23 ++ wpa_supplicant-pkcs11-init-args.patch | 247 ++++++++++++++ wpa_supplicant-roaming.patch | 307 ++++++++++++++++++ wpa_supplicant.changes | 65 ---- wpa_supplicant.spec | 21 +- 8 files changed, 651 insertions(+), 70 deletions(-) create mode 100644 Fix_Fallback_From_Failed_PMKSA_Into_Full_EAP.patch create mode 100644 wpa_supplicant-0.7.1.tar.bz2 delete mode 100644 wpa_supplicant-0.7.3.tar.bz2 create mode 100644 wpa_supplicant-fix_dbus_config.patch create mode 100644 wpa_supplicant-pkcs11-init-args.patch create mode 100644 wpa_supplicant-roaming.patch diff --git a/Fix_Fallback_From_Failed_PMKSA_Into_Full_EAP.patch b/Fix_Fallback_From_Failed_PMKSA_Into_Full_EAP.patch new file mode 100644 index 0000000..b1a7024 --- /dev/null +++ b/Fix_Fallback_From_Failed_PMKSA_Into_Full_EAP.patch @@ -0,0 +1,52 @@ +commit b4a1256d3660a2b5239062a9b42de79b8a34286a +Author: Jouni Malinen +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) { diff --git a/wpa_supplicant-0.7.1.tar.bz2 b/wpa_supplicant-0.7.1.tar.bz2 new file mode 100644 index 0000000..77e3438 --- /dev/null +++ b/wpa_supplicant-0.7.1.tar.bz2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc7258286d2eb87c470abca13e19135b3e0a9bc84d7be8a8500e73a560cc9b65 +size 1263708 diff --git a/wpa_supplicant-0.7.3.tar.bz2 b/wpa_supplicant-0.7.3.tar.bz2 deleted file mode 100644 index ff0768a..0000000 --- a/wpa_supplicant-0.7.3.tar.bz2 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:495bb18e0fd682f143ec46715f6b2d6ce57ddc6f6dbd0d40603f0d2cef458b3a -size 1290000 diff --git a/wpa_supplicant-fix_dbus_config.patch b/wpa_supplicant-fix_dbus_config.patch new file mode 100644 index 0000000..7db1cde --- /dev/null +++ b/wpa_supplicant-fix_dbus_config.patch @@ -0,0 +1,23 @@ +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 @@ + + + +- + +- +- +- +- +- +- +- ++ ++ ++ ++ + diff --git a/wpa_supplicant-pkcs11-init-args.patch b/wpa_supplicant-pkcs11-init-args.patch new file mode 100644 index 0000000..d10ba23 --- /dev/null +++ b/wpa_supplicant-pkcs11-init-args.patch @@ -0,0 +1,247 @@ +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)) { + /* diff --git a/wpa_supplicant-roaming.patch b/wpa_supplicant-roaming.patch new file mode 100644 index 0000000..7c8a4bc --- /dev/null +++ b/wpa_supplicant-roaming.patch @@ -0,0 +1,307 @@ +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; diff --git a/wpa_supplicant.changes b/wpa_supplicant.changes index 8fc3914..8b353ff 100644 --- a/wpa_supplicant.changes +++ b/wpa_supplicant.changes @@ -1,68 +1,3 @@ -------------------------------------------------------------------- -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 diff --git a/wpa_supplicant.spec b/wpa_supplicant.spec index 94be712..0060988 100644 --- a/wpa_supplicant.spec +++ b/wpa_supplicant.spec @@ -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.3 -Release: 1 +Version: 0.7.1 +Release: 2 License: BSD3c(or similar) ; GPLv2+ Group: Productivity/Networking/Other Summary: WPA supplicant implementation @@ -39,6 +39,13 @@ 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 BuildRoot: %{_tmppath}/%{name}-%{version}-build Requires: logrotate @@ -49,6 +56,7 @@ negotiation with a WPA Authenticator and it controls the roaming and IEEE 802.11 authentication/association of the wlan driver. + Authors: -------- Jouni Malinen @@ -64,6 +72,7 @@ This package contains a graphical front-end to wpa_supplicant, an implementation of the WPA Supplicant component. + Authors: -------- Jouni Malinen @@ -76,6 +85,14 @@ 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 %build cd wpa_supplicant