wpa_supplicant.c
Go to the documentation of this file.
00001 /* 
00002  * WPA Supplicant
00003  * Copyright (c) 2003-2010, Jouni Malinen <j@w1.fi>
00004  *
00005  * This program is free software; you can redistribute it and/or modify
00006  * it under the terms of the GNU General Public License version 2 as
00007  * published by the Free Software Foundation.
00008  *
00009  * Alternatively, this software may be distributed under the terms of BSD
00010  * license.
00011  *
00012  * See README and COPYING for more details.
00013  *
00014  * This file implements functions for registering and unregistering
00015  * %wpa_supplicant interfaces. In addition, this file contains number of
00016  * functions for managing network connections.
00017  */
00018 
00019 #include "includes.h"
00020 
00021 #include "common.h"
00022 #include "eapol_supp/eapol_supp_sm.h"
00023 #include "eap_peer/eap.h"
00024 #include "eap_server/eap_methods.h"
00025 #include "rsn_supp/wpa.h"
00026 #include "eloop.h"
00027 #include "config.h"
00028 #include "l2_packet/l2_packet.h"
00029 #include "wpa_supplicant_i.h"
00030 #include "driver_i.h"
00031 #include "ctrl_iface.h"
00032 #include "pcsc_funcs.h"
00033 #include "common/version.h"
00034 #include "rsn_supp/preauth.h"
00035 #include "rsn_supp/pmksa_cache.h"
00036 #include "common/wpa_ctrl.h"
00037 #include "mlme.h"
00038 #include "common/ieee802_11_defs.h"
00039 #include "blacklist.h"
00040 #include "wpas_glue.h"
00041 #include "wps_supplicant.h"
00042 #include "ibss_rsn.h"
00043 #include "sme.h"
00044 #include "ap.h"
00045 #include "notify.h"
00046 #include "bgscan.h"
00047 #include "bss.h"
00048 #include "scan.h"
00049 
00050 #include "../../src/nodes/wpa_supplicant_node.h"
00051 
00052 const char *wpa_supplicant_version =
00053 "wpa_supplicant v" VERSION_STR "\n"
00054 "Copyright (c) 2003-2010, Jouni Malinen <j@w1.fi> and contributors";
00055 
00056 const char *wpa_supplicant_license =
00057 "This program is free software. You can distribute it and/or modify it\n"
00058 "under the terms of the GNU General Public License version 2.\n"
00059 "\n"
00060 "Alternatively, this software may be distributed under the terms of the\n"
00061 "BSD license. See README and COPYING for more details.\n"
00062 #ifdef EAP_TLS_OPENSSL
00063 "\nThis product includes software developed by the OpenSSL Project\n"
00064 "for use in the OpenSSL Toolkit (http://www.openssl.org/)\n"
00065 #endif /* EAP_TLS_OPENSSL */
00066 ;
00067 
00068 #ifndef CONFIG_NO_STDOUT_DEBUG
00069 /* Long text divided into parts in order to fit in C89 strings size limits. */
00070 const char *wpa_supplicant_full_license1 =
00071 "This program is free software; you can redistribute it and/or modify\n"
00072 "it under the terms of the GNU General Public License version 2 as\n"
00073 "published by the Free Software Foundation.\n"
00074 "\n"
00075 "This program is distributed in the hope that it will be useful,\n"
00076 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
00077 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
00078 "GNU General Public License for more details.\n"
00079 "\n";
00080 const char *wpa_supplicant_full_license2 =
00081 "You should have received a copy of the GNU General Public License\n"
00082 "along with this program; if not, write to the Free Software\n"
00083 "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n"
00084 "\n"
00085 "Alternatively, this software may be distributed under the terms of the\n"
00086 "BSD license.\n"
00087 "\n"
00088 "Redistribution and use in source and binary forms, with or without\n"
00089 "modification, are permitted provided that the following conditions are\n"
00090 "met:\n"
00091 "\n";
00092 const char *wpa_supplicant_full_license3 =
00093 "1. Redistributions of source code must retain the above copyright\n"
00094 "   notice, this list of conditions and the following disclaimer.\n"
00095 "\n"
00096 "2. Redistributions in binary form must reproduce the above copyright\n"
00097 "   notice, this list of conditions and the following disclaimer in the\n"
00098 "   documentation and/or other materials provided with the distribution.\n"
00099 "\n";
00100 const char *wpa_supplicant_full_license4 =
00101 "3. Neither the name(s) of the above-listed copyright holder(s) nor the\n"
00102 "   names of its contributors may be used to endorse or promote products\n"
00103 "   derived from this software without specific prior written permission.\n"
00104 "\n"
00105 "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
00106 "\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
00107 "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
00108 "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n";
00109 const char *wpa_supplicant_full_license5 =
00110 "OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
00111 "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
00112 "LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
00113 "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
00114 "THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
00115 "(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
00116 "OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
00117 "\n";
00118 #endif /* CONFIG_NO_STDOUT_DEBUG */
00119 
00120 extern int wpa_debug_level;
00121 extern int wpa_debug_show_keys;
00122 extern int wpa_debug_timestamp;
00123 extern struct wpa_driver_ops *wpa_drivers[];
00124 
00125 /* Configure default/group WEP keys for static WEP */
00126 int wpa_set_wep_keys(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
00127 {
00128         int i, set = 0;
00129 
00130         for (i = 0; i < NUM_WEP_KEYS; i++) {
00131                 if (ssid->wep_key_len[i] == 0)
00132                         continue;
00133 
00134                 set = 1;
00135                 wpa_drv_set_key(wpa_s, WPA_ALG_WEP,
00136                                 (u8 *) "\xff\xff\xff\xff\xff\xff",
00137                                 i, i == ssid->wep_tx_keyidx, (u8 *) "", 0,
00138                                 ssid->wep_key[i], ssid->wep_key_len[i]);
00139         }
00140 
00141         return set;
00142 }
00143 
00144 
00145 static int wpa_supplicant_set_wpa_none_key(struct wpa_supplicant *wpa_s,
00146                                            struct wpa_ssid *ssid)
00147 {
00148         u8 key[32];
00149         size_t keylen;
00150         enum wpa_alg alg;
00151         u8 seq[6] = { 0 };
00152 
00153         /* IBSS/WPA-None uses only one key (Group) for both receiving and
00154          * sending unicast and multicast packets. */
00155 
00156         if (ssid->mode != WPAS_MODE_IBSS) {
00157                 wpa_printf(MSG_INFO, "WPA: Invalid mode %d (not IBSS/ad-hoc) "
00158                            "for WPA-None", ssid->mode);
00159                 return -1;
00160         }
00161 
00162         if (!ssid->psk_set) {
00163                 wpa_printf(MSG_INFO, "WPA: No PSK configured for WPA-None");
00164                 return -1;
00165         }
00166 
00167         switch (wpa_s->group_cipher) {
00168         case WPA_CIPHER_CCMP:
00169                 os_memcpy(key, ssid->psk, 16);
00170                 keylen = 16;
00171                 alg = WPA_ALG_CCMP;
00172                 break;
00173         case WPA_CIPHER_TKIP:
00174                 /* WPA-None uses the same Michael MIC key for both TX and RX */
00175                 os_memcpy(key, ssid->psk, 16 + 8);
00176                 os_memcpy(key + 16 + 8, ssid->psk + 16, 8);
00177                 keylen = 32;
00178                 alg = WPA_ALG_TKIP;
00179                 break;
00180         default:
00181                 wpa_printf(MSG_INFO, "WPA: Invalid group cipher %d for "
00182                            "WPA-None", wpa_s->group_cipher);
00183                 return -1;
00184         }
00185 
00186         /* TODO: should actually remember the previously used seq#, both for TX
00187          * and RX from each STA.. */
00188 
00189         return wpa_drv_set_key(wpa_s, alg, (u8 *) "\xff\xff\xff\xff\xff\xff",
00190                                0, 1, seq, 6, key, keylen);
00191 }
00192 
00193 
00194 static void wpa_supplicant_timeout(void *eloop_ctx, void *timeout_ctx)
00195 {
00196         struct wpa_supplicant *wpa_s = eloop_ctx;
00197         const u8 *bssid = wpa_s->bssid;
00198         if (is_zero_ether_addr(bssid))
00199                 bssid = wpa_s->pending_bssid;
00200         wpa_msg(wpa_s, MSG_INFO, "Authentication with " MACSTR " timed out.",
00201                 MAC2STR(bssid));
00202         wpa_blacklist_add(wpa_s, bssid);
00203         wpa_sm_notify_disassoc(wpa_s->wpa);
00204         wpa_supplicant_disassociate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
00205         wpa_s->reassociate = 1;
00206         ros_assoc_failed(wpa_s, bssid, "Authentication process timed out");
00207         //wpa_supplicant_req_scan(wpa_s, 0, 0);
00208 }
00209 
00210 
00220 void wpa_supplicant_req_auth_timeout(struct wpa_supplicant *wpa_s,
00221                                      int sec, int usec)
00222 {
00223         if (wpa_s->conf && wpa_s->conf->ap_scan == 0 &&
00224             (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED))
00225                 return;
00226 
00227         wpa_msg(wpa_s, MSG_DEBUG, "Setting authentication timeout: %d sec "
00228                 "%d usec", sec, usec);
00229         eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
00230         eloop_register_timeout(sec, usec, wpa_supplicant_timeout, wpa_s, NULL);
00231 }
00232 
00233 
00242 void wpa_supplicant_cancel_auth_timeout(struct wpa_supplicant *wpa_s)
00243 {
00244         wpa_msg(wpa_s, MSG_DEBUG, "Cancelling authentication timeout");
00245         eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
00246         wpa_blacklist_del(wpa_s, wpa_s->bssid);
00247 }
00248 
00249 
00257 void wpa_supplicant_initiate_eapol(struct wpa_supplicant *wpa_s)
00258 {
00259 #ifdef IEEE8021X_EAPOL
00260         struct eapol_config eapol_conf;
00261         struct wpa_ssid *ssid = wpa_s->current_ssid;
00262 
00263 #ifdef CONFIG_IBSS_RSN
00264         if (ssid->mode == WPAS_MODE_IBSS &&
00265             wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
00266             wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
00267                 /*
00268                  * RSN IBSS authentication is per-STA and we can disable the
00269                  * per-BSSID EAPOL authentication.
00270                  */
00271                 eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
00272                 eapol_sm_notify_eap_success(wpa_s->eapol, TRUE);
00273                 eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
00274                 return;
00275         }
00276 #endif /* CONFIG_IBSS_RSN */
00277 
00278         eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
00279         eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
00280 
00281         if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
00282             wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE)
00283                 eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
00284         else
00285                 eapol_sm_notify_portControl(wpa_s->eapol, Auto);
00286 
00287         os_memset(&eapol_conf, 0, sizeof(eapol_conf));
00288         if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
00289                 eapol_conf.accept_802_1x_keys = 1;
00290                 eapol_conf.required_keys = 0;
00291                 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_UNICAST) {
00292                         eapol_conf.required_keys |= EAPOL_REQUIRE_KEY_UNICAST;
00293                 }
00294                 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_BROADCAST) {
00295                         eapol_conf.required_keys |=
00296                                 EAPOL_REQUIRE_KEY_BROADCAST;
00297                 }
00298 
00299                 if (wpa_s->conf && (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED))
00300                         eapol_conf.required_keys = 0;
00301         }
00302         if (wpa_s->conf)
00303                 eapol_conf.fast_reauth = wpa_s->conf->fast_reauth;
00304         eapol_conf.workaround = ssid->eap_workaround;
00305         eapol_conf.eap_disabled =
00306                 !wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) &&
00307                 wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA &&
00308                 wpa_s->key_mgmt != WPA_KEY_MGMT_WPS;
00309         eapol_sm_notify_config(wpa_s->eapol, &ssid->eap, &eapol_conf);
00310 #endif /* IEEE8021X_EAPOL */
00311 }
00312 
00313 
00323 void wpa_supplicant_set_non_wpa_policy(struct wpa_supplicant *wpa_s,
00324                                        struct wpa_ssid *ssid)
00325 {
00326         int i;
00327 
00328         if (ssid->key_mgmt & WPA_KEY_MGMT_WPS)
00329                 wpa_s->key_mgmt = WPA_KEY_MGMT_WPS;
00330         else if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA)
00331                 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_NO_WPA;
00332         else
00333                 wpa_s->key_mgmt = WPA_KEY_MGMT_NONE;
00334         wpa_sm_set_ap_wpa_ie(wpa_s->wpa, NULL, 0);
00335         wpa_sm_set_ap_rsn_ie(wpa_s->wpa, NULL, 0);
00336         wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
00337         wpa_s->pairwise_cipher = WPA_CIPHER_NONE;
00338         wpa_s->group_cipher = WPA_CIPHER_NONE;
00339         wpa_s->mgmt_group_cipher = 0;
00340 
00341         for (i = 0; i < NUM_WEP_KEYS; i++) {
00342                 if (ssid->wep_key_len[i] > 5) {
00343                         wpa_s->pairwise_cipher = WPA_CIPHER_WEP104;
00344                         wpa_s->group_cipher = WPA_CIPHER_WEP104;
00345                         break;
00346                 } else if (ssid->wep_key_len[i] > 0) {
00347                         wpa_s->pairwise_cipher = WPA_CIPHER_WEP40;
00348                         wpa_s->group_cipher = WPA_CIPHER_WEP40;
00349                         break;
00350                 }
00351         }
00352 
00353         wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED, 0);
00354         wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
00355         wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
00356                          wpa_s->pairwise_cipher);
00357         wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
00358 #ifdef CONFIG_IEEE80211W
00359         wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
00360                          wpa_s->mgmt_group_cipher);
00361 #endif /* CONFIG_IEEE80211W */
00362 
00363         pmksa_cache_clear_current(wpa_s->wpa);
00364 }
00365 
00366 
00367 static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s)
00368 {
00369         bgscan_deinit(wpa_s);
00370         scard_deinit(wpa_s->scard);
00371         wpa_s->scard = NULL;
00372         wpa_sm_set_scard_ctx(wpa_s->wpa, NULL);
00373         eapol_sm_register_scard_ctx(wpa_s->eapol, NULL);
00374         l2_packet_deinit(wpa_s->l2);
00375         wpa_s->l2 = NULL;
00376         if (wpa_s->l2_br) {
00377                 l2_packet_deinit(wpa_s->l2_br);
00378                 wpa_s->l2_br = NULL;
00379         }
00380 
00381         if (wpa_s->ctrl_iface) {
00382                 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
00383                 wpa_s->ctrl_iface = NULL;
00384         }
00385         if (wpa_s->conf != NULL) {
00386                 struct wpa_ssid *ssid;
00387                 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
00388                         wpas_notify_network_removed(wpa_s, ssid);
00389                 wpa_config_free(wpa_s->conf);
00390                 wpa_s->conf = NULL;
00391         }
00392 
00393         os_free(wpa_s->confname);
00394         wpa_s->confname = NULL;
00395 
00396         wpa_sm_set_eapol(wpa_s->wpa, NULL);
00397         eapol_sm_deinit(wpa_s->eapol);
00398         wpa_s->eapol = NULL;
00399 
00400         rsn_preauth_deinit(wpa_s->wpa);
00401 
00402         pmksa_candidate_free(wpa_s->wpa);
00403         wpa_sm_deinit(wpa_s->wpa);
00404         wpa_s->wpa = NULL;
00405         wpa_blacklist_clear(wpa_s);
00406 
00407         wpa_bss_deinit(wpa_s);
00408 
00409         wpa_supplicant_cancel_scan(wpa_s);
00410         wpa_supplicant_cancel_auth_timeout(wpa_s);
00411 
00412         ieee80211_sta_deinit(wpa_s);
00413 
00414         wpas_wps_deinit(wpa_s);
00415 
00416         wpabuf_free(wpa_s->pending_eapol_rx);
00417         wpa_s->pending_eapol_rx = NULL;
00418 
00419 #ifdef CONFIG_IBSS_RSN
00420         ibss_rsn_deinit(wpa_s->ibss_rsn);
00421         wpa_s->ibss_rsn = NULL;
00422 #endif /* CONFIG_IBSS_RSN */
00423 
00424 #ifdef CONFIG_SME
00425         os_free(wpa_s->sme.ft_ies);
00426         wpa_s->sme.ft_ies = NULL;
00427         wpa_s->sme.ft_ies_len = 0;
00428 #endif /* CONFIG_SME */
00429 
00430 #ifdef CONFIG_AP
00431         wpa_supplicant_ap_deinit(wpa_s);
00432 #endif /* CONFIG_AP */
00433 }
00434 
00435 
00444 void wpa_clear_keys(struct wpa_supplicant *wpa_s, const u8 *addr)
00445 {
00446         u8 *bcast = (u8 *) "\xff\xff\xff\xff\xff\xff";
00447 
00448         if (wpa_s->keys_cleared) {
00449                 /* Some drivers (e.g., ndiswrapper & NDIS drivers) seem to have
00450                  * timing issues with keys being cleared just before new keys
00451                  * are set or just after association or something similar. This
00452                  * shows up in group key handshake failing often because of the
00453                  * client not receiving the first encrypted packets correctly.
00454                  * Skipping some of the extra key clearing steps seems to help
00455                  * in completing group key handshake more reliably. */
00456                 wpa_printf(MSG_DEBUG, "No keys have been configured - "
00457                            "skip key clearing");
00458                 return;
00459         }
00460 
00461         /* MLME-DELETEKEYS.request */
00462         wpa_drv_set_key(wpa_s, WPA_ALG_NONE, bcast, 0, 0, NULL, 0, NULL, 0);
00463         wpa_drv_set_key(wpa_s, WPA_ALG_NONE, bcast, 1, 0, NULL, 0, NULL, 0);
00464         wpa_drv_set_key(wpa_s, WPA_ALG_NONE, bcast, 2, 0, NULL, 0, NULL, 0);
00465         wpa_drv_set_key(wpa_s, WPA_ALG_NONE, bcast, 3, 0, NULL, 0, NULL, 0);
00466 #ifdef CONFIG_IEEE80211W
00467         wpa_drv_set_key(wpa_s, WPA_ALG_NONE, bcast, 4, 0, NULL, 0, NULL, 0);
00468         wpa_drv_set_key(wpa_s, WPA_ALG_NONE, bcast, 5, 0, NULL, 0, NULL, 0);
00469 #endif /* CONFIG_IEEE80211W */
00470         if (addr) {
00471                 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, addr, 0, 0, NULL, 0, NULL,
00472                                 0);
00473                 /* MLME-SETPROTECTION.request(None) */
00474                 wpa_drv_mlme_setprotection(
00475                         wpa_s, addr,
00476                         MLME_SETPROTECTION_PROTECT_TYPE_NONE,
00477                         MLME_SETPROTECTION_KEY_TYPE_PAIRWISE);
00478         }
00479         wpa_s->keys_cleared = 1;
00480 }
00481 
00482 
00488 const char * wpa_supplicant_state_txt(enum wpa_states state)
00489 {
00490         switch (state) {
00491         case WPA_DISCONNECTED:
00492                 return "DISCONNECTED";
00493         case WPA_INACTIVE:
00494                 return "INACTIVE";
00495         case WPA_SCANNING:
00496                 return "SCANNING";
00497         case WPA_AUTHENTICATING:
00498                 return "AUTHENTICATING";
00499         case WPA_ASSOCIATING:
00500                 return "ASSOCIATING";
00501         case WPA_ASSOCIATED:
00502                 return "ASSOCIATED";
00503         case WPA_4WAY_HANDSHAKE:
00504                 return "4WAY_HANDSHAKE";
00505         case WPA_GROUP_HANDSHAKE:
00506                 return "GROUP_HANDSHAKE";
00507         case WPA_COMPLETED:
00508                 return "COMPLETED";
00509         default:
00510                 return "UNKNOWN";
00511         }
00512 }
00513 
00514 
00523 void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s,
00524                               enum wpa_states state)
00525 {
00526         enum wpa_states old_state = wpa_s->wpa_state;
00527 
00528         wpa_printf(MSG_DEBUG, "State: %s -> %s",
00529                    wpa_supplicant_state_txt(wpa_s->wpa_state),
00530                    wpa_supplicant_state_txt(state));
00531 
00532         if (state != WPA_SCANNING)
00533                 wpa_supplicant_notify_scanning(wpa_s, 0);
00534 
00535         if (state == WPA_COMPLETED)
00536           ros_assoc_success(wpa_s);
00537 
00538         if (state == WPA_COMPLETED && wpa_s->new_connection) {
00539 #if defined(CONFIG_CTRL_IFACE) || !defined(CONFIG_NO_STDOUT_DEBUG)
00540                 struct wpa_ssid *ssid = wpa_s->current_ssid;
00541                 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_CONNECTED "- Connection to "
00542                         MACSTR " completed %s [id=%d id_str=%s]",
00543                         MAC2STR(wpa_s->bssid), wpa_s->reassociated_connection ?
00544                         "(reauth)" : "(auth)",
00545                         ssid ? ssid->id : -1,
00546                         ssid && ssid->id_str ? ssid->id_str : "");
00547 #endif /* CONFIG_CTRL_IFACE || !CONFIG_NO_STDOUT_DEBUG */
00548                 wpa_s->new_connection = 0;
00549                 wpa_s->reassociated_connection = 1;
00550                 wpa_drv_set_operstate(wpa_s, 1);
00551                 wpa_s->after_wps = 0;
00552         } else if (state == WPA_DISCONNECTED || state == WPA_ASSOCIATING ||
00553                    state == WPA_ASSOCIATED) {
00554                 wpa_s->new_connection = 1;
00555                 wpa_drv_set_operstate(wpa_s, 0);
00556         }
00557         if (old_state != WPA_DISCONNECTED && state == WPA_DISCONNECTED)
00558         {
00559           ros_assoc_failed(wpa_s, wpa_s->pending_bssid, "Entered disconnected state.");
00560         }
00561 
00562         wpa_s->wpa_state = state;
00563 
00564         if (wpa_s->wpa_state != old_state)
00565                 wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
00566 }
00567 
00568 
00569 void wpa_supplicant_terminate_proc(struct wpa_global *global)
00570 {
00571         int pending = 0;
00572 #ifdef CONFIG_WPS
00573         struct wpa_supplicant *wpa_s = global->ifaces;
00574         while (wpa_s) {
00575                 if (wpas_wps_terminate_pending(wpa_s) == 1)
00576                         pending = 1;
00577                 wpa_s = wpa_s->next;
00578         }
00579 #endif /* CONFIG_WPS */
00580         if (pending)
00581                 return;
00582         eloop_terminate();
00583 }
00584 
00585 
00586 static void wpa_supplicant_terminate(int sig, void *signal_ctx)
00587 {
00588         struct wpa_global *global = signal_ctx;
00589         struct wpa_supplicant *wpa_s;
00590         for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
00591                 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TERMINATING "- signal %d "
00592                         "received", sig);
00593         }
00594         wpa_supplicant_terminate_proc(global);
00595 }
00596 
00597 
00598 static void wpa_supplicant_clear_status(struct wpa_supplicant *wpa_s)
00599 {
00600         enum wpa_states old_state = wpa_s->wpa_state;
00601 
00602         wpa_s->pairwise_cipher = 0;
00603         wpa_s->group_cipher = 0;
00604         wpa_s->mgmt_group_cipher = 0;
00605         wpa_s->key_mgmt = 0;
00606         wpa_s->wpa_state = WPA_DISCONNECTED;
00607 
00608         if (wpa_s->wpa_state != old_state)
00609                 wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
00610 }
00611 
00612 
00624 int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s)
00625 {
00626         struct wpa_config *conf;
00627         struct wpa_ssid *old_ssid;
00628         int reconf_ctrl;
00629         int old_ap_scan;
00630 
00631         if (wpa_s->confname == NULL)
00632                 return -1;
00633         conf = wpa_config_read(wpa_s->confname);
00634         if (conf == NULL) {
00635                 wpa_msg(wpa_s, MSG_ERROR, "Failed to parse the configuration "
00636                         "file '%s' - exiting", wpa_s->confname);
00637                 return -1;
00638         }
00639 
00640         reconf_ctrl = !!conf->ctrl_interface != !!wpa_s->conf->ctrl_interface
00641                 || (conf->ctrl_interface && wpa_s->conf->ctrl_interface &&
00642                     os_strcmp(conf->ctrl_interface,
00643                               wpa_s->conf->ctrl_interface) != 0);
00644 
00645         if (reconf_ctrl && wpa_s->ctrl_iface) {
00646                 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
00647                 wpa_s->ctrl_iface = NULL;
00648         }
00649 
00650         eapol_sm_invalidate_cached_session(wpa_s->eapol);
00651         old_ssid = wpa_s->current_ssid;
00652         wpa_s->current_ssid = NULL;
00653         if (old_ssid != wpa_s->current_ssid)
00654                 wpas_notify_network_changed(wpa_s);
00655 
00656         /*
00657          * TODO: should notify EAPOL SM about changes in opensc_engine_path,
00658          * pkcs11_engine_path, pkcs11_module_path.
00659          */
00660         if (wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt)) {
00661                 /*
00662                  * Clear forced success to clear EAP state for next
00663                  * authentication.
00664                  */
00665                 eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
00666         }
00667         eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
00668         wpa_sm_set_config(wpa_s->wpa, NULL);
00669         wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
00670         rsn_preauth_deinit(wpa_s->wpa);
00671 
00672         old_ap_scan = wpa_s->conf->ap_scan;
00673         wpa_config_free(wpa_s->conf);
00674         wpa_s->conf = conf;
00675         if (old_ap_scan != wpa_s->conf->ap_scan)
00676                 wpas_notify_ap_scan_changed(wpa_s);
00677 
00678         if (reconf_ctrl)
00679                 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
00680 
00681         wpa_supplicant_clear_status(wpa_s);
00682         wpa_s->reassociate = 1;
00683         //wpa_supplicant_req_scan(wpa_s, 0, 0);
00684         wpa_msg(wpa_s, MSG_DEBUG, "Reconfiguration completed");
00685         return 0;
00686 }
00687 
00688 
00689 static void wpa_supplicant_reconfig(int sig, void *signal_ctx)
00690 {
00691         struct wpa_global *global = signal_ctx;
00692         struct wpa_supplicant *wpa_s;
00693         wpa_printf(MSG_DEBUG, "Signal %d received - reconfiguring", sig);
00694         for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
00695                 if (wpa_supplicant_reload_configuration(wpa_s) < 0) {
00696                         wpa_supplicant_terminate_proc(global);
00697                 }
00698         }
00699 }
00700 
00701 
00702 enum wpa_cipher cipher_suite2driver(int cipher)
00703 {
00704         switch (cipher) {
00705         case WPA_CIPHER_NONE:
00706                 return CIPHER_NONE;
00707         case WPA_CIPHER_WEP40:
00708                 return CIPHER_WEP40;
00709         case WPA_CIPHER_WEP104:
00710                 return CIPHER_WEP104;
00711         case WPA_CIPHER_CCMP:
00712                 return CIPHER_CCMP;
00713         case WPA_CIPHER_TKIP:
00714         default:
00715                 return CIPHER_TKIP;
00716         }
00717 }
00718 
00719 
00720 enum wpa_key_mgmt key_mgmt2driver(int key_mgmt)
00721 {
00722         switch (key_mgmt) {
00723         case WPA_KEY_MGMT_NONE:
00724                 return KEY_MGMT_NONE;
00725         case WPA_KEY_MGMT_IEEE8021X_NO_WPA:
00726                 return KEY_MGMT_802_1X_NO_WPA;
00727         case WPA_KEY_MGMT_IEEE8021X:
00728                 return KEY_MGMT_802_1X;
00729         case WPA_KEY_MGMT_WPA_NONE:
00730                 return KEY_MGMT_WPA_NONE;
00731         case WPA_KEY_MGMT_FT_IEEE8021X:
00732                 return KEY_MGMT_FT_802_1X;
00733         case WPA_KEY_MGMT_FT_PSK:
00734                 return KEY_MGMT_FT_PSK;
00735         case WPA_KEY_MGMT_IEEE8021X_SHA256:
00736                 return KEY_MGMT_802_1X_SHA256;
00737         case WPA_KEY_MGMT_PSK_SHA256:
00738                 return KEY_MGMT_PSK_SHA256;
00739         case WPA_KEY_MGMT_WPS:
00740                 return KEY_MGMT_WPS;
00741         case WPA_KEY_MGMT_PSK:
00742         default:
00743                 return KEY_MGMT_PSK;
00744         }
00745 }
00746 
00747 
00748 static int wpa_supplicant_suites_from_ai(struct wpa_supplicant *wpa_s,
00749                                          struct wpa_ssid *ssid,
00750                                          struct wpa_ie_data *ie)
00751 {
00752         int ret = wpa_sm_parse_own_wpa_ie(wpa_s->wpa, ie);
00753         if (ret) {
00754                 if (ret == -2) {
00755                         wpa_msg(wpa_s, MSG_INFO, "WPA: Failed to parse WPA IE "
00756                                 "from association info");
00757                 }
00758                 return -1;
00759         }
00760 
00761         wpa_printf(MSG_DEBUG, "WPA: Using WPA IE from AssocReq to set cipher "
00762                    "suites");
00763         if (!(ie->group_cipher & ssid->group_cipher)) {
00764                 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled group "
00765                         "cipher 0x%x (mask 0x%x) - reject",
00766                         ie->group_cipher, ssid->group_cipher);
00767                 return -1;
00768         }
00769         if (!(ie->pairwise_cipher & ssid->pairwise_cipher)) {
00770                 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled pairwise "
00771                         "cipher 0x%x (mask 0x%x) - reject",
00772                         ie->pairwise_cipher, ssid->pairwise_cipher);
00773                 return -1;
00774         }
00775         if (!(ie->key_mgmt & ssid->key_mgmt)) {
00776                 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled key "
00777                         "management 0x%x (mask 0x%x) - reject",
00778                         ie->key_mgmt, ssid->key_mgmt);
00779                 return -1;
00780         }
00781 
00782 #ifdef CONFIG_IEEE80211W
00783         if (!(ie->capabilities & WPA_CAPABILITY_MFPC) &&
00784             ssid->ieee80211w == MGMT_FRAME_PROTECTION_REQUIRED) {
00785                 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver associated with an AP "
00786                         "that does not support management frame protection - "
00787                         "reject");
00788                 return -1;
00789         }
00790 #endif /* CONFIG_IEEE80211W */
00791 
00792         return 0;
00793 }
00794 
00795 
00810 int wpa_supplicant_set_suites(struct wpa_supplicant *wpa_s,
00811                               struct wpa_bss *bss, struct wpa_ssid *ssid,
00812                               u8 *wpa_ie, size_t *wpa_ie_len)
00813 {
00814         struct wpa_ie_data ie;
00815         int sel, proto;
00816         const u8 *bss_wpa, *bss_rsn;
00817 
00818         if (bss) {
00819                 bss_wpa = wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE);
00820                 bss_rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
00821         } else
00822                 bss_wpa = bss_rsn = NULL;
00823 
00824         if (bss_rsn && (ssid->proto & WPA_PROTO_RSN) &&
00825             wpa_parse_wpa_ie(bss_rsn, 2 + bss_rsn[1], &ie) == 0 &&
00826             (ie.group_cipher & ssid->group_cipher) &&
00827             (ie.pairwise_cipher & ssid->pairwise_cipher) &&
00828             (ie.key_mgmt & ssid->key_mgmt)) {
00829                 wpa_msg(wpa_s, MSG_DEBUG, "RSN: using IEEE 802.11i/D9.0");
00830                 proto = WPA_PROTO_RSN;
00831         } else if (bss_wpa && (ssid->proto & WPA_PROTO_WPA) &&
00832                    wpa_parse_wpa_ie(bss_wpa, 2 +bss_wpa[1], &ie) == 0 &&
00833                    (ie.group_cipher & ssid->group_cipher) &&
00834                    (ie.pairwise_cipher & ssid->pairwise_cipher) &&
00835                    (ie.key_mgmt & ssid->key_mgmt)) {
00836                 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using IEEE 802.11i/D3.0");
00837                 proto = WPA_PROTO_WPA;
00838         } else if (bss) {
00839                 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select WPA/RSN");
00840                 return -1;
00841         } else {
00842                 if (ssid->proto & WPA_PROTO_RSN)
00843                         proto = WPA_PROTO_RSN;
00844                 else
00845                         proto = WPA_PROTO_WPA;
00846                 if (wpa_supplicant_suites_from_ai(wpa_s, ssid, &ie) < 0) {
00847                         os_memset(&ie, 0, sizeof(ie));
00848                         ie.group_cipher = ssid->group_cipher;
00849                         ie.pairwise_cipher = ssid->pairwise_cipher;
00850                         ie.key_mgmt = ssid->key_mgmt;
00851 #ifdef CONFIG_IEEE80211W
00852                         ie.mgmt_group_cipher =
00853                                 ssid->ieee80211w != NO_MGMT_FRAME_PROTECTION ?
00854                                 WPA_CIPHER_AES_128_CMAC : 0;
00855 #endif /* CONFIG_IEEE80211W */
00856                         wpa_printf(MSG_DEBUG, "WPA: Set cipher suites based "
00857                                    "on configuration");
00858                 } else
00859                         proto = ie.proto;
00860         }
00861 
00862         wpa_printf(MSG_DEBUG, "WPA: Selected cipher suites: group %d "
00863                    "pairwise %d key_mgmt %d proto %d",
00864                    ie.group_cipher, ie.pairwise_cipher, ie.key_mgmt, proto);
00865 #ifdef CONFIG_IEEE80211W
00866         if (ssid->ieee80211w) {
00867                 wpa_printf(MSG_DEBUG, "WPA: Selected mgmt group cipher %d",
00868                            ie.mgmt_group_cipher);
00869         }
00870 #endif /* CONFIG_IEEE80211W */
00871 
00872         wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PROTO, proto);
00873         wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED,
00874                          !!(ssid->proto & WPA_PROTO_RSN));
00875 
00876         if (bss || !wpa_s->ap_ies_from_associnfo) {
00877                 if (wpa_sm_set_ap_wpa_ie(wpa_s->wpa, bss_wpa,
00878                                          bss_wpa ? 2 + bss_wpa[1] : 0) ||
00879                     wpa_sm_set_ap_rsn_ie(wpa_s->wpa, bss_rsn,
00880                                          bss_rsn ? 2 + bss_rsn[1] : 0))
00881                         return -1;
00882         }
00883 
00884         sel = ie.group_cipher & ssid->group_cipher;
00885         if (sel & WPA_CIPHER_CCMP) {
00886                 wpa_s->group_cipher = WPA_CIPHER_CCMP;
00887                 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using GTK CCMP");
00888         } else if (sel & WPA_CIPHER_TKIP) {
00889                 wpa_s->group_cipher = WPA_CIPHER_TKIP;
00890                 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using GTK TKIP");
00891         } else if (sel & WPA_CIPHER_WEP104) {
00892                 wpa_s->group_cipher = WPA_CIPHER_WEP104;
00893                 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using GTK WEP104");
00894         } else if (sel & WPA_CIPHER_WEP40) {
00895                 wpa_s->group_cipher = WPA_CIPHER_WEP40;
00896                 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using GTK WEP40");
00897         } else {
00898                 wpa_printf(MSG_WARNING, "WPA: Failed to select group cipher.");
00899                 return -1;
00900         }
00901 
00902         sel = ie.pairwise_cipher & ssid->pairwise_cipher;
00903         if (sel & WPA_CIPHER_CCMP) {
00904                 wpa_s->pairwise_cipher = WPA_CIPHER_CCMP;
00905                 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using PTK CCMP");
00906         } else if (sel & WPA_CIPHER_TKIP) {
00907                 wpa_s->pairwise_cipher = WPA_CIPHER_TKIP;
00908                 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using PTK TKIP");
00909         } else if (sel & WPA_CIPHER_NONE) {
00910                 wpa_s->pairwise_cipher = WPA_CIPHER_NONE;
00911                 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using PTK NONE");
00912         } else {
00913                 wpa_printf(MSG_WARNING, "WPA: Failed to select pairwise "
00914                            "cipher.");
00915                 return -1;
00916         }
00917 
00918         sel = ie.key_mgmt & ssid->key_mgmt;
00919         if (0) {
00920 #ifdef CONFIG_IEEE80211R
00921         } else if (sel & WPA_KEY_MGMT_FT_IEEE8021X) {
00922                 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_IEEE8021X;
00923                 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/802.1X");
00924         } else if (sel & WPA_KEY_MGMT_FT_PSK) {
00925                 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_PSK;
00926                 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/PSK");
00927 #endif /* CONFIG_IEEE80211R */
00928 #ifdef CONFIG_IEEE80211W
00929         } else if (sel & WPA_KEY_MGMT_IEEE8021X_SHA256) {
00930                 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SHA256;
00931                 wpa_msg(wpa_s, MSG_DEBUG,
00932                         "WPA: using KEY_MGMT 802.1X with SHA256");
00933         } else if (sel & WPA_KEY_MGMT_PSK_SHA256) {
00934                 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK_SHA256;
00935                 wpa_msg(wpa_s, MSG_DEBUG,
00936                         "WPA: using KEY_MGMT PSK with SHA256");
00937 #endif /* CONFIG_IEEE80211W */
00938         } else if (sel & WPA_KEY_MGMT_IEEE8021X) {
00939                 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X;
00940                 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT 802.1X");
00941         } else if (sel & WPA_KEY_MGMT_PSK) {
00942                 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK;
00943                 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-PSK");
00944         } else if (sel & WPA_KEY_MGMT_WPA_NONE) {
00945                 wpa_s->key_mgmt = WPA_KEY_MGMT_WPA_NONE;
00946                 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-NONE");
00947         } else {
00948                 wpa_printf(MSG_WARNING, "WPA: Failed to select authenticated "
00949                            "key management type.");
00950                 return -1;
00951         }
00952 
00953         wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
00954         wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
00955                          wpa_s->pairwise_cipher);
00956         wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
00957 
00958 #ifdef CONFIG_IEEE80211W
00959         sel = ie.mgmt_group_cipher;
00960         if (ssid->ieee80211w == NO_MGMT_FRAME_PROTECTION ||
00961             !(ie.capabilities & WPA_CAPABILITY_MFPC))
00962                 sel = 0;
00963         if (sel & WPA_CIPHER_AES_128_CMAC) {
00964                 wpa_s->mgmt_group_cipher = WPA_CIPHER_AES_128_CMAC;
00965                 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
00966                         "AES-128-CMAC");
00967         } else {
00968                 wpa_s->mgmt_group_cipher = 0;
00969                 wpa_msg(wpa_s, MSG_DEBUG, "WPA: not using MGMT group cipher");
00970         }
00971         wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
00972                          wpa_s->mgmt_group_cipher);
00973         wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MFP, ssid->ieee80211w);
00974 #endif /* CONFIG_IEEE80211W */
00975 
00976         if (wpa_sm_set_assoc_wpa_ie_default(wpa_s->wpa, wpa_ie, wpa_ie_len)) {
00977                 wpa_printf(MSG_WARNING, "WPA: Failed to generate WPA IE.");
00978                 return -1;
00979         }
00980 
00981         if (ssid->key_mgmt &
00982             (WPA_KEY_MGMT_PSK | WPA_KEY_MGMT_FT_PSK | WPA_KEY_MGMT_PSK_SHA256))
00983                 wpa_sm_set_pmk(wpa_s->wpa, ssid->psk, PMK_LEN);
00984         else
00985                 wpa_sm_set_pmk_from_pmksa(wpa_s->wpa);
00986 
00987         return 0;
00988 }
00989 
00990 
00999 void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
01000                               struct wpa_bss *bss, struct wpa_ssid *ssid)
01001 {
01002         u8 wpa_ie[80];
01003         size_t wpa_ie_len;
01004         int use_crypt, ret, i, bssid_changed;
01005         int algs = WPA_AUTH_ALG_OPEN;
01006         enum wpa_cipher cipher_pairwise, cipher_group;
01007         struct wpa_driver_associate_params params;
01008         int wep_keys_set = 0;
01009         struct wpa_driver_capa capa;
01010         int assoc_failed = 0;
01011         struct wpa_ssid *old_ssid;
01012 
01013         if (ssid->mode == WPAS_MODE_AP) {
01014 #ifdef CONFIG_AP
01015                 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_AP)) {
01016                         wpa_printf(MSG_INFO, "Driver does not support AP "
01017                                    "mode");
01018                         return;
01019                 }
01020                 wpa_supplicant_create_ap(wpa_s, ssid);
01021                 wpa_s->current_bss = bss;
01022 #else /* CONFIG_AP */
01023                 wpa_printf(MSG_ERROR, "AP mode support not included in the "
01024                            "build");
01025 #endif /* CONFIG_AP */
01026                 return;
01027         }
01028 
01029         if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) &&
01030             ssid->mode == IEEE80211_MODE_INFRA) {
01031                 sme_authenticate(wpa_s, bss, ssid);
01032                 return;
01033         }
01034 
01035         wpa_s->reassociate = 0;
01036         if (bss) {
01037 #ifdef CONFIG_IEEE80211R
01038                 const u8 *ie, *md = NULL;
01039 #endif /* CONFIG_IEEE80211R */
01040                 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with " MACSTR
01041                         " (SSID='%s' freq=%d MHz)", MAC2STR(bss->bssid),
01042                         wpa_ssid_txt(bss->ssid, bss->ssid_len), bss->freq);
01043                 bssid_changed = !is_zero_ether_addr(wpa_s->bssid);
01044                 os_memset(wpa_s->bssid, 0, ETH_ALEN);
01045                 os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN);
01046                 if (bssid_changed)
01047                         wpas_notify_bssid_changed(wpa_s);
01048 #ifdef CONFIG_IEEE80211R
01049                 ie = wpa_bss_get_ie(bss, WLAN_EID_MOBILITY_DOMAIN);
01050                 if (ie && ie[1] >= MOBILITY_DOMAIN_ID_LEN)
01051                         md = ie + 2;
01052                 wpa_sm_set_ft_params(wpa_s->wpa, ie, ie ? 2 + ie[1] : 0);
01053                 if (md) {
01054                         /* Prepare for the next transition */
01055                         wpa_ft_prepare_auth_request(wpa_s->wpa, ie);
01056                 }
01057 #endif /* CONFIG_IEEE80211R */
01058 #ifdef CONFIG_WPS
01059         } else if ((ssid->ssid == NULL || ssid->ssid_len == 0) &&
01060                    wpa_s->conf->ap_scan == 2 &&
01061                    (ssid->key_mgmt & WPA_KEY_MGMT_WPS)) {
01062                 /* Use ap_scan==1 style network selection to find the network
01063                  */
01064                 wpa_s->scan_req = 2;
01065                 wpa_s->reassociate = 1;
01066                 wpa_supplicant_req_scan(wpa_s, 0, 0);
01067                 return;
01068 #endif /* CONFIG_WPS */
01069         } else {
01070                 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with SSID '%s'",
01071                         wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
01072                 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
01073         }
01074         wpa_supplicant_cancel_scan(wpa_s);
01075 
01076         /* Starting new association, so clear the possibly used WPA IE from the
01077          * previous association. */
01078         wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
01079 
01080 #ifdef IEEE8021X_EAPOL
01081         if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
01082                 if (ssid->leap) {
01083                         if (ssid->non_leap == 0)
01084                                 algs = WPA_AUTH_ALG_LEAP;
01085                         else
01086                                 algs |= WPA_AUTH_ALG_LEAP;
01087                 }
01088         }
01089 #endif /* IEEE8021X_EAPOL */
01090         wpa_printf(MSG_DEBUG, "Automatic auth_alg selection: 0x%x", algs);
01091         if (ssid->auth_alg) {
01092                 algs = ssid->auth_alg;
01093                 wpa_printf(MSG_DEBUG, "Overriding auth_alg selection: 0x%x",
01094                            algs);
01095         }
01096 
01097         if (bss && (wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE) ||
01098                     wpa_bss_get_ie(bss, WLAN_EID_RSN)) &&
01099             (ssid->key_mgmt & (WPA_KEY_MGMT_IEEE8021X | WPA_KEY_MGMT_PSK |
01100                                WPA_KEY_MGMT_FT_IEEE8021X |
01101                                WPA_KEY_MGMT_FT_PSK |
01102                                WPA_KEY_MGMT_IEEE8021X_SHA256 |
01103                                WPA_KEY_MGMT_PSK_SHA256))) {
01104                 int try_opportunistic;
01105                 try_opportunistic = ssid->proactive_key_caching &&
01106                         (ssid->proto & WPA_PROTO_RSN);
01107                 if (pmksa_cache_set_current(wpa_s->wpa, NULL, bss->bssid,
01108                                             wpa_s->current_ssid,
01109                                             try_opportunistic) == 0)
01110                         eapol_sm_notify_pmkid_attempt(wpa_s->eapol, 1);
01111                 wpa_ie_len = sizeof(wpa_ie);
01112                 if (wpa_supplicant_set_suites(wpa_s, bss, ssid,
01113                                               wpa_ie, &wpa_ie_len)) {
01114                         wpa_printf(MSG_WARNING, "WPA: Failed to set WPA key "
01115                                    "management and encryption suites");
01116                         return;
01117                 }
01118         } else if (ssid->key_mgmt &
01119                    (WPA_KEY_MGMT_PSK | WPA_KEY_MGMT_IEEE8021X |
01120                     WPA_KEY_MGMT_WPA_NONE | WPA_KEY_MGMT_FT_PSK |
01121                     WPA_KEY_MGMT_FT_IEEE8021X | WPA_KEY_MGMT_PSK_SHA256 |
01122                     WPA_KEY_MGMT_IEEE8021X_SHA256)) {
01123                 wpa_ie_len = sizeof(wpa_ie);
01124                 if (wpa_supplicant_set_suites(wpa_s, NULL, ssid,
01125                                               wpa_ie, &wpa_ie_len)) {
01126                         wpa_printf(MSG_WARNING, "WPA: Failed to set WPA key "
01127                                    "management and encryption suites (no scan "
01128                                    "results)");
01129                         return;
01130                 }
01131 #ifdef CONFIG_WPS
01132         } else if (ssid->key_mgmt & WPA_KEY_MGMT_WPS) {
01133                 struct wpabuf *wps_ie;
01134                 wps_ie = wps_build_assoc_req_ie(wpas_wps_get_req_type(ssid));
01135                 if (wps_ie && wpabuf_len(wps_ie) <= sizeof(wpa_ie)) {
01136                         wpa_ie_len = wpabuf_len(wps_ie);
01137                         os_memcpy(wpa_ie, wpabuf_head(wps_ie), wpa_ie_len);
01138                 } else
01139                         wpa_ie_len = 0;
01140                 wpabuf_free(wps_ie);
01141                 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
01142 #endif /* CONFIG_WPS */
01143         } else {
01144                 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
01145                 wpa_ie_len = 0;
01146         }
01147 
01148         wpa_clear_keys(wpa_s, bss ? bss->bssid : NULL);
01149         use_crypt = 1;
01150         cipher_pairwise = cipher_suite2driver(wpa_s->pairwise_cipher);
01151         cipher_group = cipher_suite2driver(wpa_s->group_cipher);
01152         if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
01153             wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
01154                 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE)
01155                         use_crypt = 0;
01156                 if (wpa_set_wep_keys(wpa_s, ssid)) {
01157                         use_crypt = 1;
01158                         wep_keys_set = 1;
01159                 }
01160         }
01161         if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS)
01162                 use_crypt = 0;
01163 
01164 #ifdef IEEE8021X_EAPOL
01165         if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
01166                 if ((ssid->eapol_flags &
01167                      (EAPOL_FLAG_REQUIRE_KEY_UNICAST |
01168                       EAPOL_FLAG_REQUIRE_KEY_BROADCAST)) == 0 &&
01169                     !wep_keys_set) {
01170                         use_crypt = 0;
01171                 } else {
01172                         /* Assume that dynamic WEP-104 keys will be used and
01173                          * set cipher suites in order for drivers to expect
01174                          * encryption. */
01175                         cipher_pairwise = cipher_group = CIPHER_WEP104;
01176                 }
01177         }
01178 #endif /* IEEE8021X_EAPOL */
01179 
01180         if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
01181                 /* Set the key before (and later after) association */
01182                 wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
01183         }
01184 
01185         wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING);
01186         os_memset(&params, 0, sizeof(params));
01187         if (bss) {
01188                 params.bssid = bss->bssid;
01189                 params.ssid = bss->ssid;
01190                 params.ssid_len = bss->ssid_len;
01191                 params.freq = bss->freq;
01192         } else {
01193                 params.ssid = ssid->ssid;
01194                 params.ssid_len = ssid->ssid_len;
01195         }
01196         if (ssid->mode == WPAS_MODE_IBSS && ssid->frequency > 0 &&
01197             params.freq == 0)
01198                 params.freq = ssid->frequency; /* Initial channel for IBSS */
01199         params.wpa_ie = wpa_ie;
01200         params.wpa_ie_len = wpa_ie_len;
01201         params.pairwise_suite = cipher_pairwise;
01202         params.group_suite = cipher_group;
01203         params.key_mgmt_suite = key_mgmt2driver(wpa_s->key_mgmt);
01204         params.auth_alg = algs;
01205         params.mode = ssid->mode;
01206         for (i = 0; i < NUM_WEP_KEYS; i++) {
01207                 if (ssid->wep_key_len[i])
01208                         params.wep_key[i] = ssid->wep_key[i];
01209                 params.wep_key_len[i] = ssid->wep_key_len[i];
01210         }
01211         params.wep_tx_keyidx = ssid->wep_tx_keyidx;
01212 
01213         if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) &&
01214             (params.key_mgmt_suite == KEY_MGMT_PSK ||
01215              params.key_mgmt_suite == KEY_MGMT_FT_PSK)) {
01216                 params.passphrase = ssid->passphrase;
01217                 if (ssid->psk_set)
01218                         params.psk = ssid->psk;
01219         }
01220 
01221         params.drop_unencrypted = use_crypt;
01222 
01223 #ifdef CONFIG_IEEE80211W
01224         params.mgmt_frame_protection = ssid->ieee80211w;
01225         if (ssid->ieee80211w != NO_MGMT_FRAME_PROTECTION && bss) {
01226                 const u8 *rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
01227                 struct wpa_ie_data ie;
01228                 if (rsn && wpa_parse_wpa_ie(rsn, 2 + rsn[1], &ie) == 0 &&
01229                     ie.capabilities &
01230                     (WPA_CAPABILITY_MFPC | WPA_CAPABILITY_MFPR)) {
01231                         wpa_printf(MSG_DEBUG, "WPA: Selected AP supports MFP: "
01232                                    "require MFP");
01233                         params.mgmt_frame_protection =
01234                                 MGMT_FRAME_PROTECTION_REQUIRED;
01235                 }
01236         }
01237 #endif /* CONFIG_IEEE80211W */
01238 
01239         if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME)
01240                 ret = ieee80211_sta_associate(wpa_s, &params);
01241         else
01242                 ret = wpa_drv_associate(wpa_s, &params);
01243         if (ret < 0) {
01244                 wpa_msg(wpa_s, MSG_INFO, "Association request to the driver "
01245                         "failed");
01246                 /* try to continue anyway; new association will be tried again
01247                  * after timeout */
01248                 assoc_failed = 1;
01249         }
01250 
01251         if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
01252                 /* Set the key after the association just in case association
01253                  * cleared the previously configured key. */
01254                 wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
01255                 /* No need to timeout authentication since there is no key
01256                  * management. */
01257                 wpa_supplicant_cancel_auth_timeout(wpa_s);
01258                 wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
01259 #ifdef CONFIG_IBSS_RSN
01260         } else if (ssid->mode == WPAS_MODE_IBSS &&
01261                    wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
01262                    wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
01263                 ibss_rsn_set_psk(wpa_s->ibss_rsn, ssid->psk);
01264                 /*
01265                  * RSN IBSS authentication is per-STA and we can disable the
01266                  * per-BSSID authentication.
01267                  */
01268                 wpa_supplicant_cancel_auth_timeout(wpa_s);
01269 #endif /* CONFIG_IBSS_RSN */
01270         } else {
01271                 /* Timeout for IEEE 802.11 authentication and association */
01272                 int timeout = 60;
01273 
01274                 if (assoc_failed) {
01275                         /* give IBSS a bit more time */
01276                         timeout = ssid->mode == WPAS_MODE_IBSS ? 10 : 5;
01277                 } else if (wpa_s->conf->ap_scan == 1) {
01278                         /* give IBSS a bit more time */
01279                         timeout = ssid->mode == WPAS_MODE_IBSS ? 20 : 10;
01280                 }
01281                 wpa_supplicant_req_auth_timeout(wpa_s, timeout, 0);
01282         }
01283 
01284         if (wep_keys_set && wpa_drv_get_capa(wpa_s, &capa) == 0 &&
01285             capa.flags & WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC) {
01286                 /* Set static WEP keys again */
01287                 wpa_set_wep_keys(wpa_s, ssid);
01288         }
01289 
01290         if (wpa_s->current_ssid && wpa_s->current_ssid != ssid) {
01291                 /*
01292                  * Do not allow EAP session resumption between different
01293                  * network configurations.
01294                  */
01295                 eapol_sm_invalidate_cached_session(wpa_s->eapol);
01296         }
01297         old_ssid = wpa_s->current_ssid;
01298         wpa_s->current_ssid = ssid;
01299         wpa_s->current_bss = bss;
01300         wpa_supplicant_rsn_supp_set_config(wpa_s, wpa_s->current_ssid);
01301         wpa_supplicant_initiate_eapol(wpa_s);
01302         if (old_ssid != wpa_s->current_ssid)
01303                 wpas_notify_network_changed(wpa_s);
01304 }
01305 
01306 
01315 void wpa_supplicant_disassociate(struct wpa_supplicant *wpa_s,
01316                                  int reason_code)
01317 {
01318         struct wpa_ssid *old_ssid;
01319         u8 *addr = NULL;
01320 
01321         if (!is_zero_ether_addr(wpa_s->bssid)) {
01322                 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME)
01323                         ieee80211_sta_disassociate(wpa_s, reason_code);
01324                 else
01325                         wpa_drv_disassociate(wpa_s, wpa_s->bssid, reason_code);
01326                 addr = wpa_s->bssid;
01327         }
01328         wpa_clear_keys(wpa_s, addr);
01329         wpa_supplicant_mark_disassoc(wpa_s);
01330         old_ssid = wpa_s->current_ssid;
01331         wpa_s->current_ssid = NULL;
01332         wpa_s->current_bss = NULL;
01333         wpa_sm_set_config(wpa_s->wpa, NULL);
01334         eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
01335         if (old_ssid != wpa_s->current_ssid)
01336                 wpas_notify_network_changed(wpa_s);
01337 }
01338 
01339 
01348 void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
01349                                    int reason_code)
01350 {
01351         struct wpa_ssid *old_ssid;
01352         u8 *addr = NULL;
01353 
01354         if (!is_zero_ether_addr(wpa_s->bssid)) {
01355                 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME)
01356                         ieee80211_sta_deauthenticate(wpa_s, reason_code);
01357                 else
01358                         wpa_drv_deauthenticate(wpa_s, wpa_s->bssid,
01359                                                reason_code);
01360                 addr = wpa_s->bssid;
01361         }
01362         wpa_clear_keys(wpa_s, addr);
01363         wpa_supplicant_mark_disassoc(wpa_s);
01364         old_ssid = wpa_s->current_ssid;
01365         wpa_s->current_ssid = NULL;
01366         wpa_s->current_bss = NULL;
01367         wpa_sm_set_config(wpa_s->wpa, NULL);
01368         eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
01369         if (old_ssid != wpa_s->current_ssid)
01370                 wpas_notify_network_changed(wpa_s);
01371 }
01372 
01373 
01381 void wpa_supplicant_enable_network(struct wpa_supplicant *wpa_s,
01382                                    struct wpa_ssid *ssid)
01383 {
01384         struct wpa_ssid *other_ssid;
01385         int was_disabled;
01386 
01387         if (ssid == NULL) {
01388                 other_ssid = wpa_s->conf->ssid;
01389                 while (other_ssid) {
01390                         if (other_ssid == wpa_s->current_ssid &&
01391                             other_ssid->disabled)
01392                                 wpa_s->reassociate = 1;
01393 
01394                         was_disabled = other_ssid->disabled;
01395 
01396                         other_ssid->disabled = 0;
01397 
01398                         if (was_disabled != other_ssid->disabled)
01399                                 wpas_notify_network_enabled_changed(
01400                                         wpa_s, other_ssid);
01401 
01402                         other_ssid = other_ssid->next;
01403                 }
01404                 //if (wpa_s->reassociate)
01405                 //      wpa_supplicant_req_scan(wpa_s, 0, 0);
01406         } else if (wpa_s->current_ssid == NULL && ssid->disabled) {
01407                 /*
01408                  * Try to reassociate since there is no current configuration
01409                  * and a new network was made available.
01410                  */
01411                 wpa_s->reassociate = 1;
01412                 //wpa_supplicant_req_scan(wpa_s, 0, 0);
01413 
01414                 was_disabled = ssid->disabled;
01415 
01416                 ssid->disabled = 0;
01417 
01418                 if (was_disabled != ssid->disabled)
01419                         wpas_notify_network_enabled_changed(wpa_s, ssid);
01420         }
01421 }
01422 
01423 
01431 void wpa_supplicant_disable_network(struct wpa_supplicant *wpa_s,
01432                                     struct wpa_ssid *ssid)
01433 {
01434         struct wpa_ssid *other_ssid;
01435         int was_disabled;
01436 
01437         if (ssid == NULL) {
01438                 other_ssid = wpa_s->conf->ssid;
01439                 while (other_ssid) {
01440                         was_disabled = other_ssid->disabled;
01441 
01442                         other_ssid->disabled = 1;
01443 
01444                         if (was_disabled != other_ssid->disabled)
01445                                 wpas_notify_network_enabled_changed(
01446                                         wpa_s, other_ssid);
01447 
01448                         other_ssid = other_ssid->next;
01449                 }
01450                 if (wpa_s->current_ssid)
01451                         wpa_supplicant_disassociate(
01452                                 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
01453         } else {
01454                 if (ssid == wpa_s->current_ssid)
01455                         wpa_supplicant_disassociate(
01456                                 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
01457 
01458                 was_disabled = ssid->disabled;
01459 
01460                 ssid->disabled = 1;
01461 
01462                 if (was_disabled != ssid->disabled)
01463                         wpas_notify_network_enabled_changed(wpa_s, ssid);
01464         }
01465 }
01466 
01467 
01473 void wpa_supplicant_select_network(struct wpa_supplicant *wpa_s,
01474                                    struct wpa_ssid *ssid)
01475 {
01476 
01477         struct wpa_ssid *other_ssid;
01478 
01479         if (ssid && ssid != wpa_s->current_ssid && wpa_s->current_ssid)
01480                 wpa_supplicant_disassociate(
01481                         wpa_s, WLAN_REASON_DEAUTH_LEAVING);
01482 
01483         /*
01484          * Mark all other networks disabled or mark all networks enabled if no
01485          * network specified.
01486          */
01487         other_ssid = wpa_s->conf->ssid;
01488         while (other_ssid) {
01489                 int was_disabled = other_ssid->disabled;
01490 
01491                 other_ssid->disabled = ssid ? (ssid->id != other_ssid->id) : 0;
01492 
01493                 if (was_disabled != other_ssid->disabled)
01494                         wpas_notify_network_enabled_changed(wpa_s, other_ssid);
01495 
01496                 other_ssid = other_ssid->next;
01497         }
01498         wpa_s->disconnected = 0;
01499         wpa_s->reassociate = 1;
01500         //wpa_supplicant_req_scan(wpa_s, 0, 0);
01501 
01502         if (ssid)
01503                 wpas_notify_network_selected(wpa_s, ssid);
01504 }
01505 
01506 
01514 int wpa_supplicant_set_ap_scan(struct wpa_supplicant *wpa_s, int ap_scan)
01515 {
01516 
01517         int old_ap_scan;
01518 
01519         if (ap_scan < 0 || ap_scan > 2)
01520                 return -1;
01521 
01522         old_ap_scan = wpa_s->conf->ap_scan;
01523         wpa_s->conf->ap_scan = ap_scan;
01524 
01525         if (old_ap_scan != wpa_s->conf->ap_scan)
01526                 wpas_notify_ap_scan_changed(wpa_s);
01527 
01528         return 0;
01529 }
01530 
01531 
01540 int wpa_supplicant_set_debug_params(struct wpa_global *global, int debug_level,
01541                                     int debug_timestamp, int debug_show_keys)
01542 {
01543 
01544         int old_level, old_timestamp, old_show_keys;
01545 
01546         /* check for allowed debuglevels */
01547         if (debug_level != MSG_MSGDUMP &&
01548             debug_level != MSG_DEBUG &&
01549             debug_level != MSG_INFO &&
01550             debug_level != MSG_WARNING &&
01551             debug_level != MSG_ERROR)
01552                 return -1;
01553 
01554         old_level = wpa_debug_level;
01555         old_timestamp = wpa_debug_timestamp;
01556         old_show_keys = wpa_debug_show_keys;
01557 
01558         wpa_debug_level = debug_level;
01559         wpa_debug_timestamp = debug_timestamp ? 1 : 0;
01560         wpa_debug_show_keys = debug_show_keys ? 1 : 0;
01561 
01562         if (wpa_debug_level != old_level)
01563                 wpas_notify_debug_level_changed(global);
01564         if (wpa_debug_timestamp != old_timestamp)
01565                 wpas_notify_debug_timestamp_changed(global);
01566         if (wpa_debug_show_keys != old_show_keys)
01567                 wpas_notify_debug_show_keys_changed(global);
01568 
01569         return 0;
01570 }
01571 
01572 
01578 struct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s)
01579 {
01580         struct wpa_ssid *entry;
01581         u8 ssid[MAX_SSID_LEN];
01582         int res;
01583         size_t ssid_len;
01584         u8 bssid[ETH_ALEN];
01585         int wired;
01586 
01587         if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME) {
01588                 if (ieee80211_sta_get_ssid(wpa_s, ssid, &ssid_len)) {
01589                         wpa_printf(MSG_WARNING, "Could not read SSID from "
01590                                    "MLME.");
01591                         return NULL;
01592                 }
01593         } else {
01594                 res = wpa_drv_get_ssid(wpa_s, ssid);
01595                 if (res < 0) {
01596                         wpa_printf(MSG_WARNING, "Could not read SSID from "
01597                                    "driver.");
01598                         return NULL;
01599                 }
01600                 ssid_len = res;
01601         }
01602 
01603         if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME)
01604                 os_memcpy(bssid, wpa_s->bssid, ETH_ALEN);
01605         else if (wpa_drv_get_bssid(wpa_s, bssid) < 0) {
01606                 wpa_printf(MSG_WARNING, "Could not read BSSID from driver.");
01607                 return NULL;
01608         }
01609 
01610         wired = wpa_s->conf->ap_scan == 0 &&
01611                 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED);
01612 
01613         entry = wpa_s->conf->ssid;
01614         while (entry) {
01615                 if (!entry->disabled &&
01616                     ((ssid_len == entry->ssid_len &&
01617                       os_memcmp(ssid, entry->ssid, ssid_len) == 0) || wired) &&
01618                     (!entry->bssid_set ||
01619                      os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
01620                         return entry;
01621 #ifdef CONFIG_WPS
01622                 if (!entry->disabled &&
01623                     (entry->key_mgmt & WPA_KEY_MGMT_WPS) &&
01624                     (entry->ssid == NULL || entry->ssid_len == 0) &&
01625                     (!entry->bssid_set ||
01626                      os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
01627                         return entry;
01628 #endif /* CONFIG_WPS */
01629                 entry = entry->next;
01630         }
01631 
01632         return NULL;
01633 }
01634 
01635 
01636 static int wpa_supplicant_set_driver(struct wpa_supplicant *wpa_s,
01637                                      const char *name)
01638 {
01639         int i;
01640         size_t len;
01641         const char *pos;
01642 
01643         if (wpa_s == NULL)
01644                 return -1;
01645 
01646         if (wpa_drivers[0] == NULL) {
01647                 wpa_printf(MSG_ERROR, "No driver interfaces build into "
01648                            "wpa_supplicant.");
01649                 return -1;
01650         }
01651 
01652         if (name == NULL) {
01653                 /* default to first driver in the list */
01654                 wpa_s->driver = wpa_drivers[0];
01655                 wpa_s->global_drv_priv = wpa_s->global->drv_priv[0];
01656                 return 0;
01657         }
01658 
01659         pos = os_strchr(name, ',');
01660         if (pos)
01661                 len = pos - name;
01662         else
01663                 len = os_strlen(name);
01664         for (i = 0; wpa_drivers[i]; i++) {
01665                 if (os_strlen(wpa_drivers[i]->name) == len &&
01666                     os_strncmp(name, wpa_drivers[i]->name, len) ==
01667                     0) {
01668                         wpa_s->driver = wpa_drivers[i];
01669                         wpa_s->global_drv_priv = wpa_s->global->drv_priv[i];
01670                         return 0;
01671                 }
01672         }
01673 
01674         wpa_printf(MSG_ERROR, "Unsupported driver '%s'.", name);
01675         return -1;
01676 }
01677 
01678 
01693 void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr,
01694                              const u8 *buf, size_t len)
01695 {
01696         struct wpa_supplicant *wpa_s = ctx;
01697 
01698         wpa_printf(MSG_DEBUG, "RX EAPOL from " MACSTR, MAC2STR(src_addr));
01699         wpa_hexdump(MSG_MSGDUMP, "RX EAPOL", buf, len);
01700 
01701         if (wpa_s->wpa_state < WPA_ASSOCIATED) {
01702                 /*
01703                  * There is possible race condition between receiving the
01704                  * association event and the EAPOL frame since they are coming
01705                  * through different paths from the driver. In order to avoid
01706                  * issues in trying to process the EAPOL frame before receiving
01707                  * association information, lets queue it for processing until
01708                  * the association event is received.
01709                  */
01710                 wpa_printf(MSG_DEBUG, "Not associated - Delay processing of "
01711                            "received EAPOL frame");
01712                 wpabuf_free(wpa_s->pending_eapol_rx);
01713                 wpa_s->pending_eapol_rx = wpabuf_alloc_copy(buf, len);
01714                 if (wpa_s->pending_eapol_rx) {
01715                         os_get_time(&wpa_s->pending_eapol_rx_time);
01716                         os_memcpy(wpa_s->pending_eapol_rx_src, src_addr,
01717                                   ETH_ALEN);
01718                 }
01719                 return;
01720         }
01721 
01722 #ifdef CONFIG_AP
01723         if (wpa_s->ap_iface) {
01724                 wpa_supplicant_ap_rx_eapol(wpa_s, src_addr, buf, len);
01725                 return;
01726         }
01727 #endif /* CONFIG_AP */
01728 
01729         if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE) {
01730                 wpa_printf(MSG_DEBUG, "Ignored received EAPOL frame since "
01731                            "no key management is configured");
01732                 return;
01733         }
01734 
01735         if (wpa_s->eapol_received == 0 &&
01736             (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) ||
01737              !wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) ||
01738              wpa_s->wpa_state != WPA_COMPLETED) &&
01739             (wpa_s->current_ssid == NULL ||
01740              wpa_s->current_ssid->mode != IEEE80211_MODE_IBSS)) {
01741                 /* Timeout for completing IEEE 802.1X and WPA authentication */
01742                 wpa_supplicant_req_auth_timeout(
01743                         wpa_s,
01744                         (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) ||
01745                          wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA ||
01746                          wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) ?
01747                         70 : 10, 0);
01748         }
01749         wpa_s->eapol_received++;
01750 
01751         if (wpa_s->countermeasures) {
01752                 wpa_printf(MSG_INFO, "WPA: Countermeasures - dropped EAPOL "
01753                            "packet");
01754                 return;
01755         }
01756 
01757 #ifdef CONFIG_IBSS_RSN
01758         if (wpa_s->current_ssid &&
01759             wpa_s->current_ssid->mode == WPAS_MODE_IBSS) {
01760                 ibss_rsn_rx_eapol(wpa_s->ibss_rsn, src_addr, buf, len);
01761                 return;
01762         }
01763 #endif /* CONFIG_IBSS_RSN */
01764 
01765         /* Source address of the incoming EAPOL frame could be compared to the
01766          * current BSSID. However, it is possible that a centralized
01767          * Authenticator could be using another MAC address than the BSSID of
01768          * an AP, so just allow any address to be used for now. The replies are
01769          * still sent to the current BSSID (if available), though. */
01770 
01771         os_memcpy(wpa_s->last_eapol_src, src_addr, ETH_ALEN);
01772         if (!wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) &&
01773             eapol_sm_rx_eapol(wpa_s->eapol, src_addr, buf, len) > 0)
01774                 return;
01775         wpa_drv_poll(wpa_s);
01776         if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE))
01777                 wpa_sm_rx_eapol(wpa_s->wpa, src_addr, buf, len);
01778         else if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt)) {
01779                 /*
01780                  * Set portValid = TRUE here since we are going to skip 4-way
01781                  * handshake processing which would normally set portValid. We
01782                  * need this to allow the EAPOL state machines to be completed
01783                  * without going through EAPOL-Key handshake.
01784                  */
01785                 eapol_sm_notify_portValid(wpa_s->eapol, TRUE);
01786         }
01787 }
01788 
01789 
01799 int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s)
01800 {
01801         static int interface_count = 0;
01802 
01803         if (wpa_s->driver->send_eapol) {
01804                 const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
01805                 if (addr)
01806                         os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
01807         } else {
01808                 wpa_s->l2 = l2_packet_init(wpa_s->ifname,
01809                                            wpa_drv_get_mac_addr(wpa_s),
01810                                            ETH_P_EAPOL,
01811                                            wpa_supplicant_rx_eapol, wpa_s, 0);
01812                 if (wpa_s->l2 == NULL)
01813                         return -1;
01814         }
01815 
01816         if (wpa_s->l2 && l2_packet_get_own_addr(wpa_s->l2, wpa_s->own_addr)) {
01817                 wpa_printf(MSG_ERROR, "Failed to get own L2 address");
01818                 return -1;
01819         }
01820 
01821         wpa_printf(MSG_DEBUG, "Own MAC address: " MACSTR,
01822                    MAC2STR(wpa_s->own_addr));
01823 
01824         if (wpa_s->bridge_ifname[0]) {
01825                 wpa_printf(MSG_DEBUG, "Receiving packets from bridge interface"
01826                            " '%s'", wpa_s->bridge_ifname);
01827                 wpa_s->l2_br = l2_packet_init(wpa_s->bridge_ifname,
01828                                               wpa_s->own_addr,
01829                                               ETH_P_EAPOL,
01830                                               wpa_supplicant_rx_eapol, wpa_s,
01831                                               0);
01832                 if (wpa_s->l2_br == NULL) {
01833                         wpa_printf(MSG_ERROR, "Failed to open l2_packet "
01834                                    "connection for the bridge interface '%s'",
01835                                    wpa_s->bridge_ifname);
01836                         return -1;
01837                 }
01838         }
01839 
01840         wpa_clear_keys(wpa_s, NULL);
01841 
01842         /* Make sure that TKIP countermeasures are not left enabled (could
01843          * happen if wpa_supplicant is killed during countermeasures. */
01844         wpa_drv_set_countermeasures(wpa_s, 0);
01845 
01846         wpa_printf(MSG_DEBUG, "RSN: flushing PMKID list in the driver");
01847         wpa_drv_flush_pmkid(wpa_s);
01848 
01849         wpa_s->prev_scan_ssid = WILDCARD_SSID_SCAN;
01850         if (wpa_supplicant_enabled_networks(wpa_s->conf)) {
01851                 //wpa_supplicant_req_scan(wpa_s, interface_count, 100000);
01852                 interface_count++;
01853         } else
01854                 wpa_supplicant_set_state(wpa_s, WPA_INACTIVE);
01855 
01856         return 0;
01857 }
01858 
01859 
01860 static int wpa_supplicant_daemon(const char *pid_file)
01861 {
01862         wpa_printf(MSG_DEBUG, "Daemonize..");
01863         return os_daemonize(pid_file);
01864 }
01865 
01866 
01867 static struct wpa_supplicant * wpa_supplicant_alloc(void)
01868 {
01869         struct wpa_supplicant *wpa_s;
01870 
01871         wpa_s = os_zalloc(sizeof(*wpa_s));
01872         if (wpa_s == NULL)
01873                 return NULL;
01874         wpa_s->scan_req = 1;
01875         wpa_s->new_connection = 1;
01876 
01877         return wpa_s;
01878 }
01879 
01880 
01881 static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
01882                                      struct wpa_interface *iface)
01883 {
01884         const char *ifname, *driver;
01885         struct wpa_driver_capa capa;
01886 
01887         wpa_printf(MSG_DEBUG, "Initializing interface '%s' conf '%s' driver "
01888                    "'%s' ctrl_interface '%s' bridge '%s'", iface->ifname,
01889                    iface->confname ? iface->confname : "N/A",
01890                    iface->driver ? iface->driver : "default",
01891                    iface->ctrl_interface ? iface->ctrl_interface : "N/A",
01892                    iface->bridge_ifname ? iface->bridge_ifname : "N/A");
01893 
01894         if (iface->confname) {
01895 #ifdef CONFIG_BACKEND_FILE
01896                 wpa_s->confname = os_rel2abs_path(iface->confname);
01897                 if (wpa_s->confname == NULL) {
01898                         wpa_printf(MSG_ERROR, "Failed to get absolute path "
01899                                    "for configuration file '%s'.",
01900                                    iface->confname);
01901                         return -1;
01902                 }
01903                 wpa_printf(MSG_DEBUG, "Configuration file '%s' -> '%s'",
01904                            iface->confname, wpa_s->confname);
01905 #else /* CONFIG_BACKEND_FILE */
01906                 wpa_s->confname = os_strdup(iface->confname);
01907 #endif /* CONFIG_BACKEND_FILE */
01908                 wpa_s->conf = wpa_config_read(wpa_s->confname);
01909                 if (wpa_s->conf == NULL) {
01910                         wpa_printf(MSG_ERROR, "Failed to read or parse "
01911                                    "configuration '%s'.", wpa_s->confname);
01912                         return -1;
01913                 }
01914 
01915                 /*
01916                  * Override ctrl_interface and driver_param if set on command
01917                  * line.
01918                  */
01919                 if (iface->ctrl_interface) {
01920                         os_free(wpa_s->conf->ctrl_interface);
01921                         wpa_s->conf->ctrl_interface =
01922                                 os_strdup(iface->ctrl_interface);
01923                 }
01924 
01925                 if (iface->driver_param) {
01926                         os_free(wpa_s->conf->driver_param);
01927                         wpa_s->conf->driver_param =
01928                                 os_strdup(iface->driver_param);
01929                 }
01930         } else
01931                 wpa_s->conf = wpa_config_alloc_empty(iface->ctrl_interface,
01932                                                      iface->driver_param);
01933 
01934         if (wpa_s->conf == NULL) {
01935                 wpa_printf(MSG_ERROR, "\nNo configuration found.");
01936                 return -1;
01937         }
01938 
01939         if (iface->ifname == NULL) {
01940                 wpa_printf(MSG_ERROR, "\nInterface name is required.");
01941                 return -1;
01942         }
01943         if (os_strlen(iface->ifname) >= sizeof(wpa_s->ifname)) {
01944                 wpa_printf(MSG_ERROR, "\nToo long interface name '%s'.",
01945                            iface->ifname);
01946                 return -1;
01947         }
01948         os_strlcpy(wpa_s->ifname, iface->ifname, sizeof(wpa_s->ifname));
01949 
01950         if (iface->bridge_ifname) {
01951                 if (os_strlen(iface->bridge_ifname) >=
01952                     sizeof(wpa_s->bridge_ifname)) {
01953                         wpa_printf(MSG_ERROR, "\nToo long bridge interface "
01954                                    "name '%s'.", iface->bridge_ifname);
01955                         return -1;
01956                 }
01957                 os_strlcpy(wpa_s->bridge_ifname, iface->bridge_ifname,
01958                            sizeof(wpa_s->bridge_ifname));
01959         }
01960 
01961         /* RSNA Supplicant Key Management - INITIALIZE */
01962         eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
01963         eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
01964 
01965         /* Initialize driver interface and register driver event handler before
01966          * L2 receive handler so that association events are processed before
01967          * EAPOL-Key packets if both become available for the same select()
01968          * call. */
01969         driver = iface->driver;
01970 next_driver:
01971         if (wpa_supplicant_set_driver(wpa_s, driver) < 0)
01972                 return -1;
01973 
01974         wpa_s->drv_priv = wpa_drv_init(wpa_s, wpa_s->ifname);
01975         if (wpa_s->drv_priv == NULL) {
01976                 const char *pos;
01977                 pos = driver ? os_strchr(driver, ',') : NULL;
01978                 if (pos) {
01979                         wpa_printf(MSG_DEBUG, "Failed to initialize driver "
01980                                    "interface - try next driver wrapper");
01981                         driver = pos + 1;
01982                         goto next_driver;
01983                 }
01984                 wpa_printf(MSG_ERROR, "Failed to initialize driver interface");
01985                 return -1;
01986         }
01987         if (wpa_drv_set_param(wpa_s, wpa_s->conf->driver_param) < 0) {
01988                 wpa_printf(MSG_ERROR, "Driver interface rejected "
01989                            "driver_param '%s'", wpa_s->conf->driver_param);
01990                 return -1;
01991         }
01992 
01993         ifname = wpa_drv_get_ifname(wpa_s);
01994         if (ifname && os_strcmp(ifname, wpa_s->ifname) != 0) {
01995                 wpa_printf(MSG_DEBUG, "Driver interface replaced interface "
01996                            "name with '%s'", ifname);
01997                 os_strlcpy(wpa_s->ifname, ifname, sizeof(wpa_s->ifname));
01998         }
01999 
02000         if (wpa_supplicant_init_wpa(wpa_s) < 0)
02001                 return -1;
02002 
02003         wpa_sm_set_ifname(wpa_s->wpa, wpa_s->ifname,
02004                           wpa_s->bridge_ifname[0] ? wpa_s->bridge_ifname :
02005                           NULL);
02006         wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
02007 
02008         if (wpa_s->conf->dot11RSNAConfigPMKLifetime &&
02009             wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_LIFETIME,
02010                              wpa_s->conf->dot11RSNAConfigPMKLifetime)) {
02011                 wpa_printf(MSG_ERROR, "Invalid WPA parameter value for "
02012                            "dot11RSNAConfigPMKLifetime");
02013                 return -1;
02014         }
02015 
02016         if (wpa_s->conf->dot11RSNAConfigPMKReauthThreshold &&
02017             wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_REAUTH_THRESHOLD,
02018                              wpa_s->conf->dot11RSNAConfigPMKReauthThreshold)) {
02019                 wpa_printf(MSG_ERROR, "Invalid WPA parameter value for "
02020                         "dot11RSNAConfigPMKReauthThreshold");
02021                 return -1;
02022         }
02023 
02024         if (wpa_s->conf->dot11RSNAConfigSATimeout &&
02025             wpa_sm_set_param(wpa_s->wpa, RSNA_SA_TIMEOUT,
02026                              wpa_s->conf->dot11RSNAConfigSATimeout)) {
02027                 wpa_printf(MSG_ERROR, "Invalid WPA parameter value for "
02028                            "dot11RSNAConfigSATimeout");
02029                 return -1;
02030         }
02031 
02032         if (wpa_drv_get_capa(wpa_s, &capa) == 0) {
02033                 wpa_s->drv_flags = capa.flags;
02034                 if (capa.flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME) {
02035                         if (ieee80211_sta_init(wpa_s))
02036                                 return -1;
02037                 }
02038                 wpa_s->max_scan_ssids = capa.max_scan_ssids;
02039                 wpa_s->max_remain_on_chan = capa.max_remain_on_chan;
02040         }
02041         if (wpa_s->max_remain_on_chan == 0)
02042                 wpa_s->max_remain_on_chan = 1000;
02043 
02044         if (wpa_supplicant_driver_init(wpa_s) < 0)
02045                 return -1;
02046 
02047         if (wpa_s->conf->country[0] && wpa_s->conf->country[1] &&
02048             wpa_drv_set_country(wpa_s, wpa_s->conf->country)) {
02049                 wpa_printf(MSG_DEBUG, "Failed to set country");
02050                 return -1;
02051         }
02052 
02053         wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
02054 
02055         if (wpas_wps_init(wpa_s))
02056                 return -1;
02057 
02058         if (wpa_supplicant_init_eapol(wpa_s) < 0)
02059                 return -1;
02060         wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
02061 
02062         wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
02063         if (wpa_s->ctrl_iface == NULL) {
02064                 wpa_printf(MSG_ERROR,
02065                            "Failed to initialize control interface '%s'.\n"
02066                            "You may have another wpa_supplicant process "
02067                            "already running or the file was\n"
02068                            "left by an unclean termination of wpa_supplicant "
02069                            "in which case you will need\n"
02070                            "to manually remove this file before starting "
02071                            "wpa_supplicant again.\n",
02072                            wpa_s->conf->ctrl_interface);
02073                 return -1;
02074         }
02075 
02076 #ifdef CONFIG_IBSS_RSN
02077         wpa_s->ibss_rsn = ibss_rsn_init(wpa_s);
02078         if (!wpa_s->ibss_rsn) {
02079                 wpa_printf(MSG_DEBUG, "Failed to init IBSS RSN");
02080                 return -1;
02081         }
02082 #endif /* CONFIG_IBSS_RSN */
02083 
02084         if (wpa_bss_init(wpa_s) < 0)
02085                 return -1;
02086 
02087         return 0;
02088 }
02089 
02090 
02091 static void wpa_supplicant_deinit_iface(struct wpa_supplicant *wpa_s,
02092                                         int notify)
02093 {
02094         if (wpa_s->drv_priv) {
02095                 wpa_supplicant_deauthenticate(wpa_s,
02096                                               WLAN_REASON_DEAUTH_LEAVING);
02097 
02098                 wpa_drv_set_countermeasures(wpa_s, 0);
02099                 wpa_clear_keys(wpa_s, NULL);
02100         }
02101 
02102         wpa_supplicant_cleanup(wpa_s);
02103 
02104         if (notify)
02105                 wpas_notify_iface_removed(wpa_s);
02106 
02107         if (wpa_s->drv_priv)
02108                 wpa_drv_deinit(wpa_s);
02109 }
02110 
02111 
02124 struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
02125                                                  struct wpa_interface *iface)
02126 {
02127         struct wpa_supplicant *wpa_s;
02128         struct wpa_interface t_iface;
02129         struct wpa_ssid *ssid;
02130 
02131         if (global == NULL || iface == NULL)
02132                 return NULL;
02133 
02134         wpa_s = wpa_supplicant_alloc();
02135         if (wpa_s == NULL)
02136                 return NULL;
02137 
02138         wpa_s->global = global;
02139 
02140         t_iface = *iface;
02141         if (global->params.override_driver) {
02142                 wpa_printf(MSG_DEBUG, "Override interface parameter: driver "
02143                            "('%s' -> '%s')",
02144                            iface->driver, global->params.override_driver);
02145                 t_iface.driver = global->params.override_driver;
02146         }
02147         if (global->params.override_ctrl_interface) {
02148                 wpa_printf(MSG_DEBUG, "Override interface parameter: "
02149                            "ctrl_interface ('%s' -> '%s')",
02150                            iface->ctrl_interface,
02151                            global->params.override_ctrl_interface);
02152                 t_iface.ctrl_interface =
02153                         global->params.override_ctrl_interface;
02154         }
02155         if (wpa_supplicant_init_iface(wpa_s, &t_iface)) {
02156                 wpa_printf(MSG_DEBUG, "Failed to add interface %s",
02157                            iface->ifname);
02158                 wpa_supplicant_deinit_iface(wpa_s, 0);
02159                 os_free(wpa_s);
02160                 return NULL;
02161         }
02162 
02163         /* Notify the control interfaces about new iface */
02164         if (wpas_notify_iface_added(wpa_s)) {
02165                 wpa_supplicant_deinit_iface(wpa_s, 1);
02166                 os_free(wpa_s);
02167                 return NULL;
02168         }
02169 
02170         for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
02171                 wpas_notify_network_added(wpa_s, ssid);
02172 
02173         wpa_s->next = global->ifaces;
02174         global->ifaces = wpa_s;
02175 
02176         ros_add_iface(wpa_s);
02177 
02178         wpa_printf(MSG_DEBUG, "Added interface %s", wpa_s->ifname);
02179 
02180         return wpa_s;
02181 }
02182 
02183 
02195 int wpa_supplicant_remove_iface(struct wpa_global *global,
02196                                 struct wpa_supplicant *wpa_s)
02197 {
02198         struct wpa_supplicant *prev;
02199 
02200         ros_remove_iface(wpa_s);
02201         
02202         /* Remove interface from the global list of interfaces */
02203         prev = global->ifaces;
02204         if (prev == wpa_s) {
02205                 global->ifaces = wpa_s->next;
02206         } else {
02207                 while (prev && prev->next != wpa_s)
02208                         prev = prev->next;
02209                 if (prev == NULL)
02210                         return -1;
02211                 prev->next = wpa_s->next;
02212         }
02213 
02214         wpa_printf(MSG_DEBUG, "Removing interface %s", wpa_s->ifname);
02215 
02216         wpa_supplicant_deinit_iface(wpa_s, 1);
02217         os_free(wpa_s);
02218 
02219         return 0;
02220 }
02221 
02222 
02229 struct wpa_supplicant * wpa_supplicant_get_iface(struct wpa_global *global,
02230                                                  const char *ifname)
02231 {
02232         struct wpa_supplicant *wpa_s;
02233 
02234         for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
02235                 if (os_strcmp(wpa_s->ifname, ifname) == 0)
02236                         return wpa_s;
02237         }
02238         return NULL;
02239 }
02240 
02241 
02251 struct wpa_global * wpa_supplicant_init(struct wpa_params *params)
02252 {
02253         struct wpa_global *global;
02254         int ret, i;
02255 
02256         if (params == NULL)
02257                 return NULL;
02258 
02259         wpa_debug_open_file(params->wpa_debug_file_path);
02260         if (params->wpa_debug_syslog)
02261                 wpa_debug_open_syslog();
02262 
02263         ret = eap_register_methods();
02264         if (ret) {
02265                 wpa_printf(MSG_ERROR, "Failed to register EAP methods");
02266                 if (ret == -2)
02267                         wpa_printf(MSG_ERROR, "Two or more EAP methods used "
02268                                    "the same EAP type.");
02269                 return NULL;
02270         }
02271 
02272         global = os_zalloc(sizeof(*global));
02273         if (global == NULL)
02274                 return NULL;
02275         global->params.daemonize = params->daemonize;
02276         global->params.wait_for_monitor = params->wait_for_monitor;
02277         global->params.dbus_ctrl_interface = params->dbus_ctrl_interface;
02278         if (params->pid_file)
02279                 global->params.pid_file = os_strdup(params->pid_file);
02280         if (params->ctrl_interface)
02281                 global->params.ctrl_interface =
02282                         os_strdup(params->ctrl_interface);
02283         if (params->override_driver)
02284                 global->params.override_driver =
02285                         os_strdup(params->override_driver);
02286         if (params->override_ctrl_interface)
02287                 global->params.override_ctrl_interface =
02288                         os_strdup(params->override_ctrl_interface);
02289         wpa_debug_level = global->params.wpa_debug_level =
02290                 params->wpa_debug_level;
02291         wpa_debug_show_keys = global->params.wpa_debug_show_keys =
02292                 params->wpa_debug_show_keys;
02293         wpa_debug_timestamp = global->params.wpa_debug_timestamp =
02294                 params->wpa_debug_timestamp;
02295 
02296         if (eloop_init()) {
02297                 wpa_printf(MSG_ERROR, "Failed to initialize event loop");
02298                 wpa_supplicant_deinit(global);
02299                 return NULL;
02300         }
02301 
02302         global->ctrl_iface = wpa_supplicant_global_ctrl_iface_init(global);
02303         if (global->ctrl_iface == NULL) {
02304                 wpa_supplicant_deinit(global);
02305                 return NULL;
02306         }
02307 
02308         if (wpas_notify_supplicant_initialized(global)) {
02309                 wpa_supplicant_deinit(global);
02310                 return NULL;
02311         }
02312 
02313         for (i = 0; wpa_drivers[i]; i++)
02314                 global->drv_count++;
02315         if (global->drv_count == 0) {
02316                 wpa_printf(MSG_ERROR, "No drivers enabled");
02317                 wpa_supplicant_deinit(global);
02318                 return NULL;
02319         }
02320         global->drv_priv = os_zalloc(global->drv_count * sizeof(void *));
02321         if (global->drv_priv == NULL) {
02322                 wpa_supplicant_deinit(global);
02323                 return NULL;
02324         }
02325         for (i = 0; wpa_drivers[i]; i++) {
02326                 if (!wpa_drivers[i]->global_init)
02327                         continue;
02328                 global->drv_priv[i] = wpa_drivers[i]->global_init();
02329                 if (global->drv_priv[i] == NULL) {
02330                         wpa_printf(MSG_ERROR, "Failed to initialize driver "
02331                                    "'%s'", wpa_drivers[i]->name);
02332                         wpa_supplicant_deinit(global);
02333                         return NULL;
02334                 }
02335         }
02336 
02337         return global;
02338 }
02339 
02340 
02350 int wpa_supplicant_run(struct wpa_global *global)
02351 {
02352         struct wpa_supplicant *wpa_s;
02353 
02354         if (global->params.daemonize &&
02355             wpa_supplicant_daemon(global->params.pid_file))
02356                 return -1;
02357 
02358         if (global->params.wait_for_monitor) {
02359                 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
02360                         if (wpa_s->ctrl_iface)
02361                                 wpa_supplicant_ctrl_iface_wait(
02362                                         wpa_s->ctrl_iface);
02363         }
02364 
02365         eloop_register_signal_terminate(wpa_supplicant_terminate, global);
02366         eloop_register_signal_reconfig(wpa_supplicant_reconfig, global);
02367 
02368         eloop_run();
02369 
02370         return 0;
02371 }
02372 
02373 
02381 void wpa_supplicant_deinit(struct wpa_global *global)
02382 {
02383         int i;
02384 
02385         if (global == NULL)
02386                 return;
02387 
02388         while (global->ifaces)
02389                 wpa_supplicant_remove_iface(global, global->ifaces);
02390 
02391         if (global->ctrl_iface)
02392                 wpa_supplicant_global_ctrl_iface_deinit(global->ctrl_iface);
02393 
02394         wpas_notify_supplicant_deinitialized(global);
02395 
02396         eap_peer_unregister_methods();
02397 #ifdef CONFIG_AP
02398         eap_server_unregister_methods();
02399 #endif /* CONFIG_AP */
02400 
02401         for (i = 0; wpa_drivers[i] && global->drv_priv; i++) {
02402                 if (!global->drv_priv[i])
02403                         continue;
02404                 wpa_drivers[i]->global_deinit(global->drv_priv[i]);
02405         }
02406         os_free(global->drv_priv);
02407 
02408         eloop_destroy();
02409 
02410         if (global->params.pid_file) {
02411                 os_daemonize_terminate(global->params.pid_file);
02412                 os_free(global->params.pid_file);
02413         }
02414         os_free(global->params.ctrl_interface);
02415         os_free(global->params.override_driver);
02416         os_free(global->params.override_ctrl_interface);
02417 
02418         os_free(global);
02419         wpa_debug_close_syslog();
02420         wpa_debug_close_file();
02421 }


wpa_supplicant_node
Author(s): Package maintained by Blaise Gassend
autogenerated on Thu Jan 2 2014 11:25:15