3 * Copyright (c) 2003-2009, Jouni Malinen <j@w1.fi>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
9 * Alternatively, this software may be distributed under the terms of BSD
12 * See README and COPYING for more details.
14 * This file implements functions for registering and unregistering
15 * %wpa_supplicant interfaces. In addition, this file contains number of
16 * functions for managing network connections.
22 #include "eapol_supp/eapol_supp_sm.h"
23 #include "eap_peer/eap.h"
26 #include "drivers/driver.h"
28 #include "l2_packet/l2_packet.h"
29 #include "wpa_supplicant_i.h"
30 #include "ctrl_iface.h"
31 #include "ctrl_iface_dbus.h"
32 #include "pcsc_funcs.h"
35 #include "pmksa_cache.h"
38 #include "ieee802_11_defs.h"
39 #include "blacklist.h"
40 #include "wpas_glue.h"
41 #include "wps_supplicant.h"
45 const char *wpa_supplicant_version =
46 "wpa_supplicant v" VERSION_STR "\n"
47 "Copyright (c) 2003-2009, Jouni Malinen <j@w1.fi> and contributors";
49 const char *wpa_supplicant_license =
50 "This program is free software. You can distribute it and/or modify it\n"
51 "under the terms of the GNU General Public License version 2.\n"
53 "Alternatively, this software may be distributed under the terms of the\n"
54 "BSD license. See README and COPYING for more details.\n"
55 #ifdef EAP_TLS_OPENSSL
56 "\nThis product includes software developed by the OpenSSL Project\n"
57 "for use in the OpenSSL Toolkit (http://www.openssl.org/)\n"
58 #endif /* EAP_TLS_OPENSSL */
61 #ifndef CONFIG_NO_STDOUT_DEBUG
62 /* Long text divided into parts in order to fit in C89 strings size limits. */
63 const char *wpa_supplicant_full_license1 =
64 "This program is free software; you can redistribute it and/or modify\n"
65 "it under the terms of the GNU General Public License version 2 as\n"
66 "published by the Free Software Foundation.\n"
68 "This program is distributed in the hope that it will be useful,\n"
69 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
70 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
71 "GNU General Public License for more details.\n"
73 const char *wpa_supplicant_full_license2 =
74 "You should have received a copy of the GNU General Public License\n"
75 "along with this program; if not, write to the Free Software\n"
76 "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n"
78 "Alternatively, this software may be distributed under the terms of the\n"
81 "Redistribution and use in source and binary forms, with or without\n"
82 "modification, are permitted provided that the following conditions are\n"
85 const char *wpa_supplicant_full_license3 =
86 "1. Redistributions of source code must retain the above copyright\n"
87 " notice, this list of conditions and the following disclaimer.\n"
89 "2. Redistributions in binary form must reproduce the above copyright\n"
90 " notice, this list of conditions and the following disclaimer in the\n"
91 " documentation and/or other materials provided with the distribution.\n"
93 const char *wpa_supplicant_full_license4 =
94 "3. Neither the name(s) of the above-listed copyright holder(s) nor the\n"
95 " names of its contributors may be used to endorse or promote products\n"
96 " derived from this software without specific prior written permission.\n"
98 "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
99 "\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
100 "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
101 "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n";
102 const char *wpa_supplicant_full_license5 =
103 "OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
104 "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
105 "LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
106 "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
107 "THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
108 "(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
109 "OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
111 #endif /* CONFIG_NO_STDOUT_DEBUG */
113 extern int wpa_debug_level;
114 extern int wpa_debug_show_keys;
115 extern int wpa_debug_timestamp;
117 /* Configure default/group WEP keys for static WEP */
118 static int wpa_set_wep_keys(struct wpa_supplicant *wpa_s,
119 struct wpa_ssid *ssid)
123 for (i = 0; i < NUM_WEP_KEYS; i++) {
124 if (ssid->wep_key_len[i] == 0)
128 wpa_drv_set_key(wpa_s, WPA_ALG_WEP,
129 (u8 *) "\xff\xff\xff\xff\xff\xff",
130 i, i == ssid->wep_tx_keyidx, (u8 *) "", 0,
131 ssid->wep_key[i], ssid->wep_key_len[i]);
138 static int wpa_supplicant_set_wpa_none_key(struct wpa_supplicant *wpa_s,
139 struct wpa_ssid *ssid)
146 /* IBSS/WPA-None uses only one key (Group) for both receiving and
147 * sending unicast and multicast packets. */
149 if (ssid->mode != IEEE80211_MODE_IBSS) {
150 wpa_printf(MSG_INFO, "WPA: Invalid mode %d (not IBSS/ad-hoc) "
151 "for WPA-None", ssid->mode);
155 if (!ssid->psk_set) {
156 wpa_printf(MSG_INFO, "WPA: No PSK configured for WPA-None");
160 switch (wpa_s->group_cipher) {
161 case WPA_CIPHER_CCMP:
162 os_memcpy(key, ssid->psk, 16);
166 case WPA_CIPHER_TKIP:
167 /* WPA-None uses the same Michael MIC key for both TX and RX */
168 os_memcpy(key, ssid->psk, 16 + 8);
169 os_memcpy(key + 16 + 8, ssid->psk + 16, 8);
174 wpa_printf(MSG_INFO, "WPA: Invalid group cipher %d for "
175 "WPA-None", wpa_s->group_cipher);
179 /* TODO: should actually remember the previously used seq#, both for TX
180 * and RX from each STA.. */
182 return wpa_drv_set_key(wpa_s, alg, (u8 *) "\xff\xff\xff\xff\xff\xff",
183 0, 1, seq, 6, key, keylen);
187 static void wpa_supplicant_timeout(void *eloop_ctx, void *timeout_ctx)
189 struct wpa_supplicant *wpa_s = eloop_ctx;
190 const u8 *bssid = wpa_s->bssid;
191 if (is_zero_ether_addr(bssid))
192 bssid = wpa_s->pending_bssid;
193 wpa_msg(wpa_s, MSG_INFO, "Authentication with " MACSTR " timed out.",
195 wpa_blacklist_add(wpa_s, bssid);
196 wpa_sm_notify_disassoc(wpa_s->wpa);
197 wpa_supplicant_disassociate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
198 wpa_s->reassociate = 1;
199 wpa_supplicant_req_scan(wpa_s, 0, 0);
204 * wpa_supplicant_req_auth_timeout - Schedule a timeout for authentication
205 * @wpa_s: Pointer to wpa_supplicant data
206 * @sec: Number of seconds after which to time out authentication
207 * @usec: Number of microseconds after which to time out authentication
209 * This function is used to schedule a timeout for the current authentication
212 void wpa_supplicant_req_auth_timeout(struct wpa_supplicant *wpa_s,
215 if (wpa_s->conf && wpa_s->conf->ap_scan == 0 &&
216 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED))
219 wpa_msg(wpa_s, MSG_DEBUG, "Setting authentication timeout: %d sec "
220 "%d usec", sec, usec);
221 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
222 eloop_register_timeout(sec, usec, wpa_supplicant_timeout, wpa_s, NULL);
227 * wpa_supplicant_cancel_auth_timeout - Cancel authentication timeout
228 * @wpa_s: Pointer to wpa_supplicant data
230 * This function is used to cancel authentication timeout scheduled with
231 * wpa_supplicant_req_auth_timeout() and it is called when authentication has
234 void wpa_supplicant_cancel_auth_timeout(struct wpa_supplicant *wpa_s)
236 wpa_msg(wpa_s, MSG_DEBUG, "Cancelling authentication timeout");
237 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
238 wpa_blacklist_del(wpa_s, wpa_s->bssid);
243 * wpa_supplicant_initiate_eapol - Configure EAPOL state machine
244 * @wpa_s: Pointer to wpa_supplicant data
246 * This function is used to configure EAPOL state machine based on the selected
247 * authentication mode.
249 void wpa_supplicant_initiate_eapol(struct wpa_supplicant *wpa_s)
251 #ifdef IEEE8021X_EAPOL
252 struct eapol_config eapol_conf;
253 struct wpa_ssid *ssid = wpa_s->current_ssid;
255 #ifdef CONFIG_IBSS_RSN
256 if (ssid->mode == IEEE80211_MODE_IBSS &&
257 wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
258 wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
260 * RSN IBSS authentication is per-STA and we can disable the
261 * per-BSSID EAPOL authentication.
263 eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
264 eapol_sm_notify_eap_success(wpa_s->eapol, TRUE);
265 eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
268 #endif /* CONFIG_IBSS_RSN */
270 eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
271 eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
273 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
274 wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE)
275 eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
277 eapol_sm_notify_portControl(wpa_s->eapol, Auto);
279 os_memset(&eapol_conf, 0, sizeof(eapol_conf));
280 if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
281 eapol_conf.accept_802_1x_keys = 1;
282 eapol_conf.required_keys = 0;
283 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_UNICAST) {
284 eapol_conf.required_keys |= EAPOL_REQUIRE_KEY_UNICAST;
286 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_BROADCAST) {
287 eapol_conf.required_keys |=
288 EAPOL_REQUIRE_KEY_BROADCAST;
291 if (wpa_s->conf && (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED))
292 eapol_conf.required_keys = 0;
295 eapol_conf.fast_reauth = wpa_s->conf->fast_reauth;
296 eapol_conf.workaround = ssid->eap_workaround;
297 eapol_conf.eap_disabled =
298 !wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) &&
299 wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA &&
300 wpa_s->key_mgmt != WPA_KEY_MGMT_WPS;
301 eapol_sm_notify_config(wpa_s->eapol, &ssid->eap, &eapol_conf);
302 #endif /* IEEE8021X_EAPOL */
307 * wpa_supplicant_set_non_wpa_policy - Set WPA parameters to non-WPA mode
308 * @wpa_s: Pointer to wpa_supplicant data
309 * @ssid: Configuration data for the network
311 * This function is used to configure WPA state machine and related parameters
312 * to a mode where WPA is not enabled. This is called as part of the
313 * authentication configuration when the selected network does not use WPA.
315 void wpa_supplicant_set_non_wpa_policy(struct wpa_supplicant *wpa_s,
316 struct wpa_ssid *ssid)
320 if (ssid->key_mgmt & WPA_KEY_MGMT_WPS)
321 wpa_s->key_mgmt = WPA_KEY_MGMT_WPS;
322 else if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA)
323 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_NO_WPA;
325 wpa_s->key_mgmt = WPA_KEY_MGMT_NONE;
326 wpa_sm_set_ap_wpa_ie(wpa_s->wpa, NULL, 0);
327 wpa_sm_set_ap_rsn_ie(wpa_s->wpa, NULL, 0);
328 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
329 wpa_s->pairwise_cipher = WPA_CIPHER_NONE;
330 wpa_s->group_cipher = WPA_CIPHER_NONE;
331 wpa_s->mgmt_group_cipher = 0;
333 for (i = 0; i < NUM_WEP_KEYS; i++) {
334 if (ssid->wep_key_len[i] > 5) {
335 wpa_s->pairwise_cipher = WPA_CIPHER_WEP104;
336 wpa_s->group_cipher = WPA_CIPHER_WEP104;
338 } else if (ssid->wep_key_len[i] > 0) {
339 wpa_s->pairwise_cipher = WPA_CIPHER_WEP40;
340 wpa_s->group_cipher = WPA_CIPHER_WEP40;
345 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED, 0);
346 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
347 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
348 wpa_s->pairwise_cipher);
349 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
350 #ifdef CONFIG_IEEE80211W
351 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
352 wpa_s->mgmt_group_cipher);
353 #endif /* CONFIG_IEEE80211W */
355 pmksa_cache_clear_current(wpa_s->wpa);
359 static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s)
361 scard_deinit(wpa_s->scard);
363 wpa_sm_set_scard_ctx(wpa_s->wpa, NULL);
364 eapol_sm_register_scard_ctx(wpa_s->eapol, NULL);
365 l2_packet_deinit(wpa_s->l2);
368 l2_packet_deinit(wpa_s->l2_br);
372 if (wpa_s->ctrl_iface) {
373 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
374 wpa_s->ctrl_iface = NULL;
376 if (wpa_s->conf != NULL) {
377 wpa_config_free(wpa_s->conf);
381 os_free(wpa_s->confname);
382 wpa_s->confname = NULL;
384 wpa_sm_set_eapol(wpa_s->wpa, NULL);
385 eapol_sm_deinit(wpa_s->eapol);
388 rsn_preauth_deinit(wpa_s->wpa);
390 pmksa_candidate_free(wpa_s->wpa);
391 wpa_sm_deinit(wpa_s->wpa);
393 wpa_blacklist_clear(wpa_s);
395 wpa_scan_results_free(wpa_s->scan_res);
396 wpa_s->scan_res = NULL;
398 wpa_supplicant_cancel_scan(wpa_s);
399 wpa_supplicant_cancel_auth_timeout(wpa_s);
401 ieee80211_sta_deinit(wpa_s);
403 wpas_wps_deinit(wpa_s);
405 #ifdef CONFIG_IBSS_RSN
406 ibss_rsn_deinit(wpa_s->ibss_rsn);
407 wpa_s->ibss_rsn = NULL;
408 #endif /* CONFIG_IBSS_RSN */
411 os_free(wpa_s->sme.ft_ies);
412 wpa_s->sme.ft_ies = NULL;
413 wpa_s->sme.ft_ies_len = 0;
414 #endif /* CONFIG_SME */
419 * wpa_clear_keys - Clear keys configured for the driver
420 * @wpa_s: Pointer to wpa_supplicant data
421 * @addr: Previously used BSSID or %NULL if not available
423 * This function clears the encryption keys that has been previously configured
426 void wpa_clear_keys(struct wpa_supplicant *wpa_s, const u8 *addr)
428 u8 *bcast = (u8 *) "\xff\xff\xff\xff\xff\xff";
430 if (wpa_s->keys_cleared) {
431 /* Some drivers (e.g., ndiswrapper & NDIS drivers) seem to have
432 * timing issues with keys being cleared just before new keys
433 * are set or just after association or something similar. This
434 * shows up in group key handshake failing often because of the
435 * client not receiving the first encrypted packets correctly.
436 * Skipping some of the extra key clearing steps seems to help
437 * in completing group key handshake more reliably. */
438 wpa_printf(MSG_DEBUG, "No keys have been configured - "
439 "skip key clearing");
443 /* MLME-DELETEKEYS.request */
444 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, bcast, 0, 0, NULL, 0, NULL, 0);
445 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, bcast, 1, 0, NULL, 0, NULL, 0);
446 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, bcast, 2, 0, NULL, 0, NULL, 0);
447 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, bcast, 3, 0, NULL, 0, NULL, 0);
449 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, addr, 0, 0, NULL, 0, NULL,
451 /* MLME-SETPROTECTION.request(None) */
452 wpa_drv_mlme_setprotection(
454 MLME_SETPROTECTION_PROTECT_TYPE_NONE,
455 MLME_SETPROTECTION_KEY_TYPE_PAIRWISE);
457 wpa_s->keys_cleared = 1;
462 * wpa_supplicant_state_txt - Get the connection state name as a text string
463 * @state: State (wpa_state; WPA_*)
464 * Returns: The state name as a printable text string
466 const char * wpa_supplicant_state_txt(int state)
469 case WPA_DISCONNECTED:
470 return "DISCONNECTED";
475 case WPA_AUTHENTICATING:
476 return "AUTHENTICATING";
477 case WPA_ASSOCIATING:
478 return "ASSOCIATING";
481 case WPA_4WAY_HANDSHAKE:
482 return "4WAY_HANDSHAKE";
483 case WPA_GROUP_HANDSHAKE:
484 return "GROUP_HANDSHAKE";
494 * wpa_supplicant_set_state - Set current connection state
495 * @wpa_s: Pointer to wpa_supplicant data
496 * @state: The new connection state
498 * This function is called whenever the connection state changes, e.g.,
499 * association is completed for WPA/WPA2 4-Way Handshake is started.
501 void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s, wpa_states state)
503 wpa_printf(MSG_DEBUG, "State: %s -> %s",
504 wpa_supplicant_state_txt(wpa_s->wpa_state),
505 wpa_supplicant_state_txt(state));
507 wpa_supplicant_dbus_notify_state_change(wpa_s, state,
510 if (state == WPA_COMPLETED && wpa_s->new_connection) {
511 #if defined(CONFIG_CTRL_IFACE) || !defined(CONFIG_NO_STDOUT_DEBUG)
512 struct wpa_ssid *ssid = wpa_s->current_ssid;
513 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_CONNECTED "- Connection to "
514 MACSTR " completed %s [id=%d id_str=%s]",
515 MAC2STR(wpa_s->bssid), wpa_s->reassociated_connection ?
516 "(reauth)" : "(auth)",
517 ssid ? ssid->id : -1,
518 ssid && ssid->id_str ? ssid->id_str : "");
519 #endif /* CONFIG_CTRL_IFACE || !CONFIG_NO_STDOUT_DEBUG */
520 wpa_s->new_connection = 0;
521 wpa_s->reassociated_connection = 1;
522 wpa_drv_set_operstate(wpa_s, 1);
523 } else if (state == WPA_DISCONNECTED || state == WPA_ASSOCIATING ||
524 state == WPA_ASSOCIATED) {
525 wpa_s->new_connection = 1;
526 wpa_drv_set_operstate(wpa_s, 0);
528 wpa_s->wpa_state = state;
532 static void wpa_supplicant_terminate(int sig, void *eloop_ctx,
535 struct wpa_global *global = eloop_ctx;
536 struct wpa_supplicant *wpa_s;
537 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
538 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TERMINATING "- signal %d "
545 static void wpa_supplicant_clear_status(struct wpa_supplicant *wpa_s)
547 wpa_s->pairwise_cipher = 0;
548 wpa_s->group_cipher = 0;
549 wpa_s->mgmt_group_cipher = 0;
551 wpa_s->wpa_state = WPA_DISCONNECTED;
556 * wpa_supplicant_reload_configuration - Reload configuration data
557 * @wpa_s: Pointer to wpa_supplicant data
558 * Returns: 0 on success or -1 if configuration parsing failed
560 * This function can be used to request that the configuration data is reloaded
561 * (e.g., after configuration file change). This function is reloading
562 * configuration only for one interface, so this may need to be called multiple
563 * times if %wpa_supplicant is controlling multiple interfaces and all
564 * interfaces need reconfiguration.
566 int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s)
568 struct wpa_config *conf;
570 if (wpa_s->confname == NULL)
572 conf = wpa_config_read(wpa_s->confname);
574 wpa_msg(wpa_s, MSG_ERROR, "Failed to parse the configuration "
575 "file '%s' - exiting", wpa_s->confname);
579 reconf_ctrl = !!conf->ctrl_interface != !!wpa_s->conf->ctrl_interface
580 || (conf->ctrl_interface && wpa_s->conf->ctrl_interface &&
581 os_strcmp(conf->ctrl_interface,
582 wpa_s->conf->ctrl_interface) != 0);
584 if (reconf_ctrl && wpa_s->ctrl_iface) {
585 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
586 wpa_s->ctrl_iface = NULL;
589 eapol_sm_invalidate_cached_session(wpa_s->eapol);
590 wpa_s->current_ssid = NULL;
592 * TODO: should notify EAPOL SM about changes in opensc_engine_path,
593 * pkcs11_engine_path, pkcs11_module_path.
595 if (wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt)) {
597 * Clear forced success to clear EAP state for next
600 eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
602 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
603 wpa_sm_set_config(wpa_s->wpa, NULL);
604 wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
605 rsn_preauth_deinit(wpa_s->wpa);
606 wpa_config_free(wpa_s->conf);
609 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
611 wpa_supplicant_clear_status(wpa_s);
612 wpa_s->reassociate = 1;
613 wpa_supplicant_req_scan(wpa_s, 0, 0);
614 wpa_msg(wpa_s, MSG_DEBUG, "Reconfiguration completed");
619 static void wpa_supplicant_reconfig(int sig, void *eloop_ctx,
622 struct wpa_global *global = eloop_ctx;
623 struct wpa_supplicant *wpa_s;
624 wpa_printf(MSG_DEBUG, "Signal %d received - reconfiguring", sig);
625 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
626 if (wpa_supplicant_reload_configuration(wpa_s) < 0) {
633 static wpa_cipher cipher_suite2driver(int cipher)
636 case WPA_CIPHER_NONE:
638 case WPA_CIPHER_WEP40:
640 case WPA_CIPHER_WEP104:
641 return CIPHER_WEP104;
642 case WPA_CIPHER_CCMP:
644 case WPA_CIPHER_TKIP:
651 static wpa_key_mgmt key_mgmt2driver(int key_mgmt)
654 case WPA_KEY_MGMT_NONE:
655 return KEY_MGMT_NONE;
656 case WPA_KEY_MGMT_IEEE8021X_NO_WPA:
657 return KEY_MGMT_802_1X_NO_WPA;
658 case WPA_KEY_MGMT_IEEE8021X:
659 return KEY_MGMT_802_1X;
660 case WPA_KEY_MGMT_WPA_NONE:
661 return KEY_MGMT_WPA_NONE;
662 case WPA_KEY_MGMT_FT_IEEE8021X:
663 return KEY_MGMT_FT_802_1X;
664 case WPA_KEY_MGMT_FT_PSK:
665 return KEY_MGMT_FT_PSK;
666 case WPA_KEY_MGMT_IEEE8021X_SHA256:
667 return KEY_MGMT_802_1X_SHA256;
668 case WPA_KEY_MGMT_PSK_SHA256:
669 return KEY_MGMT_PSK_SHA256;
670 case WPA_KEY_MGMT_WPS:
672 case WPA_KEY_MGMT_PSK:
679 static int wpa_supplicant_suites_from_ai(struct wpa_supplicant *wpa_s,
680 struct wpa_ssid *ssid,
681 struct wpa_ie_data *ie)
683 int ret = wpa_sm_parse_own_wpa_ie(wpa_s->wpa, ie);
686 wpa_msg(wpa_s, MSG_INFO, "WPA: Failed to parse WPA IE "
687 "from association info");
692 wpa_printf(MSG_DEBUG, "WPA: Using WPA IE from AssocReq to set cipher "
694 if (!(ie->group_cipher & ssid->group_cipher)) {
695 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled group "
696 "cipher 0x%x (mask 0x%x) - reject",
697 ie->group_cipher, ssid->group_cipher);
700 if (!(ie->pairwise_cipher & ssid->pairwise_cipher)) {
701 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled pairwise "
702 "cipher 0x%x (mask 0x%x) - reject",
703 ie->pairwise_cipher, ssid->pairwise_cipher);
706 if (!(ie->key_mgmt & ssid->key_mgmt)) {
707 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled key "
708 "management 0x%x (mask 0x%x) - reject",
709 ie->key_mgmt, ssid->key_mgmt);
713 #ifdef CONFIG_IEEE80211W
714 if (!(ie->capabilities & WPA_CAPABILITY_MFPC) &&
715 ssid->ieee80211w == IEEE80211W_REQUIRED) {
716 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver associated with an AP "
717 "that does not support management frame protection - "
721 #endif /* CONFIG_IEEE80211W */
728 * wpa_supplicant_set_suites - Set authentication and encryption parameters
729 * @wpa_s: Pointer to wpa_supplicant data
730 * @bss: Scan results for the selected BSS, or %NULL if not available
731 * @ssid: Configuration data for the selected network
732 * @wpa_ie: Buffer for the WPA/RSN IE
733 * @wpa_ie_len: Maximum wpa_ie buffer size on input. This is changed to be the
734 * used buffer length in case the functions returns success.
735 * Returns: 0 on success or -1 on failure
737 * This function is used to configure authentication and encryption parameters
738 * based on the network configuration and scan result for the selected BSS (if
741 int wpa_supplicant_set_suites(struct wpa_supplicant *wpa_s,
742 struct wpa_scan_res *bss,
743 struct wpa_ssid *ssid,
744 u8 *wpa_ie, size_t *wpa_ie_len)
746 struct wpa_ie_data ie;
748 const u8 *bss_wpa, *bss_rsn;
751 bss_wpa = wpa_scan_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE);
752 bss_rsn = wpa_scan_get_ie(bss, WLAN_EID_RSN);
754 bss_wpa = bss_rsn = NULL;
756 if (bss_rsn && (ssid->proto & WPA_PROTO_RSN) &&
757 wpa_parse_wpa_ie(bss_rsn, 2 + bss_rsn[1], &ie) == 0 &&
758 (ie.group_cipher & ssid->group_cipher) &&
759 (ie.pairwise_cipher & ssid->pairwise_cipher) &&
760 (ie.key_mgmt & ssid->key_mgmt)) {
761 wpa_msg(wpa_s, MSG_DEBUG, "RSN: using IEEE 802.11i/D9.0");
762 proto = WPA_PROTO_RSN;
763 } else if (bss_wpa && (ssid->proto & WPA_PROTO_WPA) &&
764 wpa_parse_wpa_ie(bss_wpa, 2 +bss_wpa[1], &ie) == 0 &&
765 (ie.group_cipher & ssid->group_cipher) &&
766 (ie.pairwise_cipher & ssid->pairwise_cipher) &&
767 (ie.key_mgmt & ssid->key_mgmt)) {
768 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using IEEE 802.11i/D3.0");
769 proto = WPA_PROTO_WPA;
771 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select WPA/RSN");
774 if (ssid->proto & WPA_PROTO_RSN)
775 proto = WPA_PROTO_RSN;
777 proto = WPA_PROTO_WPA;
778 if (wpa_supplicant_suites_from_ai(wpa_s, ssid, &ie) < 0) {
779 os_memset(&ie, 0, sizeof(ie));
780 ie.group_cipher = ssid->group_cipher;
781 ie.pairwise_cipher = ssid->pairwise_cipher;
782 ie.key_mgmt = ssid->key_mgmt;
783 #ifdef CONFIG_IEEE80211W
784 ie.mgmt_group_cipher =
785 ssid->ieee80211w != NO_IEEE80211W ?
786 WPA_CIPHER_AES_128_CMAC : 0;
787 #endif /* CONFIG_IEEE80211W */
788 wpa_printf(MSG_DEBUG, "WPA: Set cipher suites based "
794 wpa_printf(MSG_DEBUG, "WPA: Selected cipher suites: group %d "
795 "pairwise %d key_mgmt %d proto %d",
796 ie.group_cipher, ie.pairwise_cipher, ie.key_mgmt, proto);
797 #ifdef CONFIG_IEEE80211W
798 if (ssid->ieee80211w) {
799 wpa_printf(MSG_DEBUG, "WPA: Selected mgmt group cipher %d",
800 ie.mgmt_group_cipher);
802 #endif /* CONFIG_IEEE80211W */
804 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PROTO, proto);
805 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED,
806 !!(ssid->proto & WPA_PROTO_RSN));
808 if (bss || !wpa_s->ap_ies_from_associnfo) {
809 if (wpa_sm_set_ap_wpa_ie(wpa_s->wpa, bss_wpa,
810 bss_wpa ? 2 + bss_wpa[1] : 0) ||
811 wpa_sm_set_ap_rsn_ie(wpa_s->wpa, bss_rsn,
812 bss_rsn ? 2 + bss_rsn[1] : 0))
816 sel = ie.group_cipher & ssid->group_cipher;
817 if (sel & WPA_CIPHER_CCMP) {
818 wpa_s->group_cipher = WPA_CIPHER_CCMP;
819 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using GTK CCMP");
820 } else if (sel & WPA_CIPHER_TKIP) {
821 wpa_s->group_cipher = WPA_CIPHER_TKIP;
822 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using GTK TKIP");
823 } else if (sel & WPA_CIPHER_WEP104) {
824 wpa_s->group_cipher = WPA_CIPHER_WEP104;
825 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using GTK WEP104");
826 } else if (sel & WPA_CIPHER_WEP40) {
827 wpa_s->group_cipher = WPA_CIPHER_WEP40;
828 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using GTK WEP40");
830 wpa_printf(MSG_WARNING, "WPA: Failed to select group cipher.");
834 sel = ie.pairwise_cipher & ssid->pairwise_cipher;
835 if (sel & WPA_CIPHER_CCMP) {
836 wpa_s->pairwise_cipher = WPA_CIPHER_CCMP;
837 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using PTK CCMP");
838 } else if (sel & WPA_CIPHER_TKIP) {
839 wpa_s->pairwise_cipher = WPA_CIPHER_TKIP;
840 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using PTK TKIP");
841 } else if (sel & WPA_CIPHER_NONE) {
842 wpa_s->pairwise_cipher = WPA_CIPHER_NONE;
843 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using PTK NONE");
845 wpa_printf(MSG_WARNING, "WPA: Failed to select pairwise "
850 sel = ie.key_mgmt & ssid->key_mgmt;
852 #ifdef CONFIG_IEEE80211R
853 } else if (sel & WPA_KEY_MGMT_FT_IEEE8021X) {
854 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_IEEE8021X;
855 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/802.1X");
856 } else if (sel & WPA_KEY_MGMT_FT_PSK) {
857 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_PSK;
858 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/PSK");
859 #endif /* CONFIG_IEEE80211R */
860 #ifdef CONFIG_IEEE80211W
861 } else if (sel & WPA_KEY_MGMT_IEEE8021X_SHA256) {
862 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SHA256;
863 wpa_msg(wpa_s, MSG_DEBUG,
864 "WPA: using KEY_MGMT 802.1X with SHA256");
865 } else if (sel & WPA_KEY_MGMT_PSK_SHA256) {
866 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK_SHA256;
867 wpa_msg(wpa_s, MSG_DEBUG,
868 "WPA: using KEY_MGMT PSK with SHA256");
869 #endif /* CONFIG_IEEE80211W */
870 } else if (sel & WPA_KEY_MGMT_IEEE8021X) {
871 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X;
872 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT 802.1X");
873 } else if (sel & WPA_KEY_MGMT_PSK) {
874 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK;
875 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-PSK");
876 } else if (sel & WPA_KEY_MGMT_WPA_NONE) {
877 wpa_s->key_mgmt = WPA_KEY_MGMT_WPA_NONE;
878 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-NONE");
880 wpa_printf(MSG_WARNING, "WPA: Failed to select authenticated "
881 "key management type.");
885 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
886 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
887 wpa_s->pairwise_cipher);
888 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
890 #ifdef CONFIG_IEEE80211W
891 sel = ie.mgmt_group_cipher;
892 if (ssid->ieee80211w == NO_IEEE80211W ||
893 !(ie.capabilities & WPA_CAPABILITY_MFPC))
895 if (sel & WPA_CIPHER_AES_128_CMAC) {
896 wpa_s->mgmt_group_cipher = WPA_CIPHER_AES_128_CMAC;
897 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
900 wpa_s->mgmt_group_cipher = 0;
901 wpa_msg(wpa_s, MSG_DEBUG, "WPA: not using MGMT group cipher");
903 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
904 wpa_s->mgmt_group_cipher);
905 #endif /* CONFIG_IEEE80211W */
907 if (wpa_sm_set_assoc_wpa_ie_default(wpa_s->wpa, wpa_ie, wpa_ie_len)) {
908 wpa_printf(MSG_WARNING, "WPA: Failed to generate WPA IE.");
913 (WPA_KEY_MGMT_PSK | WPA_KEY_MGMT_FT_PSK | WPA_KEY_MGMT_PSK_SHA256))
914 wpa_sm_set_pmk(wpa_s->wpa, ssid->psk, PMK_LEN);
916 wpa_sm_set_pmk_from_pmksa(wpa_s->wpa);
923 * wpa_supplicant_associate - Request association
924 * @wpa_s: Pointer to wpa_supplicant data
925 * @bss: Scan results for the selected BSS, or %NULL if not available
926 * @ssid: Configuration data for the selected network
928 * This function is used to request %wpa_supplicant to associate with a BSS.
930 void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
931 struct wpa_scan_res *bss, struct wpa_ssid *ssid)
935 int use_crypt, ret, i;
936 int algs = AUTH_ALG_OPEN_SYSTEM;
937 wpa_cipher cipher_pairwise, cipher_group;
938 struct wpa_driver_associate_params params;
939 int wep_keys_set = 0;
940 struct wpa_driver_capa capa;
941 int assoc_failed = 0;
943 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) {
944 sme_authenticate(wpa_s, bss, ssid);
948 wpa_s->reassociate = 0;
950 #ifdef CONFIG_IEEE80211R
952 #endif /* CONFIG_IEEE80211R */
953 const u8 *ie = wpa_scan_get_ie(bss, WLAN_EID_SSID);
954 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with " MACSTR
955 " (SSID='%s' freq=%d MHz)", MAC2STR(bss->bssid),
956 ie ? wpa_ssid_txt(ie + 2, ie[1]) : "", bss->freq);
957 os_memset(wpa_s->bssid, 0, ETH_ALEN);
958 os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN);
959 #ifdef CONFIG_IEEE80211R
960 ie = wpa_scan_get_ie(bss, WLAN_EID_MOBILITY_DOMAIN);
961 if (ie && ie[1] >= MOBILITY_DOMAIN_ID_LEN)
963 wpa_sm_set_ft_params(wpa_s->wpa, md, NULL, 0, NULL);
965 /* Prepare for the next transition */
966 wpa_ft_prepare_auth_request(wpa_s->wpa);
968 #endif /* CONFIG_IEEE80211R */
970 } else if ((ssid->ssid == NULL || ssid->ssid_len == 0) &&
971 wpa_s->conf->ap_scan == 2 &&
972 (ssid->key_mgmt & WPA_KEY_MGMT_WPS)) {
973 /* Use ap_scan==1 style network selection to find the network
976 wpa_s->reassociate = 1;
977 wpa_supplicant_req_scan(wpa_s, 0, 0);
979 #endif /* CONFIG_WPS */
981 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with SSID '%s'",
982 wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
983 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
985 wpa_supplicant_cancel_scan(wpa_s);
987 /* Starting new association, so clear the possibly used WPA IE from the
988 * previous association. */
989 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
991 if (wpa_drv_set_mode(wpa_s, ssid->mode)) {
992 wpa_printf(MSG_WARNING, "Failed to set operating mode");
996 #ifdef IEEE8021X_EAPOL
997 if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
999 if (ssid->non_leap == 0)
1000 algs = AUTH_ALG_LEAP;
1002 algs |= AUTH_ALG_LEAP;
1005 #endif /* IEEE8021X_EAPOL */
1006 wpa_printf(MSG_DEBUG, "Automatic auth_alg selection: 0x%x", algs);
1007 if (ssid->auth_alg) {
1009 if (ssid->auth_alg & WPA_AUTH_ALG_OPEN)
1010 algs |= AUTH_ALG_OPEN_SYSTEM;
1011 if (ssid->auth_alg & WPA_AUTH_ALG_SHARED)
1012 algs |= AUTH_ALG_SHARED_KEY;
1013 if (ssid->auth_alg & WPA_AUTH_ALG_LEAP)
1014 algs |= AUTH_ALG_LEAP;
1015 wpa_printf(MSG_DEBUG, "Overriding auth_alg selection: 0x%x",
1018 wpa_drv_set_auth_alg(wpa_s, algs);
1020 if (bss && (wpa_scan_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE) ||
1021 wpa_scan_get_ie(bss, WLAN_EID_RSN)) &&
1022 (ssid->key_mgmt & (WPA_KEY_MGMT_IEEE8021X | WPA_KEY_MGMT_PSK |
1023 WPA_KEY_MGMT_FT_IEEE8021X |
1024 WPA_KEY_MGMT_FT_PSK |
1025 WPA_KEY_MGMT_IEEE8021X_SHA256 |
1026 WPA_KEY_MGMT_PSK_SHA256))) {
1027 int try_opportunistic;
1028 try_opportunistic = ssid->proactive_key_caching &&
1029 (ssid->proto & WPA_PROTO_RSN);
1030 if (pmksa_cache_set_current(wpa_s->wpa, NULL, bss->bssid,
1031 wpa_s->current_ssid,
1032 try_opportunistic) == 0)
1033 eapol_sm_notify_pmkid_attempt(wpa_s->eapol, 1);
1034 wpa_ie_len = sizeof(wpa_ie);
1035 if (wpa_supplicant_set_suites(wpa_s, bss, ssid,
1036 wpa_ie, &wpa_ie_len)) {
1037 wpa_printf(MSG_WARNING, "WPA: Failed to set WPA key "
1038 "management and encryption suites");
1041 } else if (ssid->key_mgmt &
1042 (WPA_KEY_MGMT_PSK | WPA_KEY_MGMT_IEEE8021X |
1043 WPA_KEY_MGMT_WPA_NONE | WPA_KEY_MGMT_FT_PSK |
1044 WPA_KEY_MGMT_FT_IEEE8021X | WPA_KEY_MGMT_PSK_SHA256 |
1045 WPA_KEY_MGMT_IEEE8021X_SHA256)) {
1046 wpa_ie_len = sizeof(wpa_ie);
1047 if (wpa_supplicant_set_suites(wpa_s, NULL, ssid,
1048 wpa_ie, &wpa_ie_len)) {
1049 wpa_printf(MSG_WARNING, "WPA: Failed to set WPA key "
1050 "management and encryption suites (no scan "
1055 } else if (ssid->key_mgmt & WPA_KEY_MGMT_WPS) {
1056 struct wpabuf *wps_ie;
1057 wps_ie = wps_build_assoc_req_ie(wpas_wps_get_req_type(ssid));
1058 if (wps_ie && wpabuf_len(wps_ie) <= sizeof(wpa_ie)) {
1059 wpa_ie_len = wpabuf_len(wps_ie);
1060 os_memcpy(wpa_ie, wpabuf_head(wps_ie), wpa_ie_len);
1063 wpabuf_free(wps_ie);
1064 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
1065 #endif /* CONFIG_WPS */
1067 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
1071 wpa_clear_keys(wpa_s, bss ? bss->bssid : NULL);
1073 cipher_pairwise = cipher_suite2driver(wpa_s->pairwise_cipher);
1074 cipher_group = cipher_suite2driver(wpa_s->group_cipher);
1075 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
1076 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1077 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE)
1079 if (wpa_set_wep_keys(wpa_s, ssid)) {
1084 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS)
1087 #ifdef IEEE8021X_EAPOL
1088 if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1089 if ((ssid->eapol_flags &
1090 (EAPOL_FLAG_REQUIRE_KEY_UNICAST |
1091 EAPOL_FLAG_REQUIRE_KEY_BROADCAST)) == 0 &&
1095 /* Assume that dynamic WEP-104 keys will be used and
1096 * set cipher suites in order for drivers to expect
1098 cipher_pairwise = cipher_group = CIPHER_WEP104;
1101 #endif /* IEEE8021X_EAPOL */
1103 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
1104 /* Set the key before (and later after) association */
1105 wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
1108 wpa_drv_set_drop_unencrypted(wpa_s, use_crypt);
1109 wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING);
1110 os_memset(¶ms, 0, sizeof(params));
1112 const u8 *ie = wpa_scan_get_ie(bss, WLAN_EID_SSID);
1113 params.bssid = bss->bssid;
1114 params.ssid = ie ? ie + 2 : (u8 *) "";
1115 params.ssid_len = ie ? ie[1] : 0;
1116 params.freq = bss->freq;
1118 params.ssid = ssid->ssid;
1119 params.ssid_len = ssid->ssid_len;
1121 if (ssid->mode == 1 && ssid->frequency > 0 && params.freq == 0)
1122 params.freq = ssid->frequency; /* Initial channel for IBSS */
1123 params.wpa_ie = wpa_ie;
1124 params.wpa_ie_len = wpa_ie_len;
1125 params.pairwise_suite = cipher_pairwise;
1126 params.group_suite = cipher_group;
1127 params.key_mgmt_suite = key_mgmt2driver(wpa_s->key_mgmt);
1128 params.auth_alg = algs;
1129 params.mode = ssid->mode;
1130 for (i = 0; i < NUM_WEP_KEYS; i++) {
1131 if (ssid->wep_key_len[i])
1132 params.wep_key[i] = ssid->wep_key[i];
1133 params.wep_key_len[i] = ssid->wep_key_len[i];
1135 params.wep_tx_keyidx = ssid->wep_tx_keyidx;
1137 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) &&
1138 (params.key_mgmt_suite == KEY_MGMT_PSK ||
1139 params.key_mgmt_suite == KEY_MGMT_FT_PSK)) {
1140 params.passphrase = ssid->passphrase;
1142 params.psk = ssid->psk;
1145 #ifdef CONFIG_IEEE80211W
1146 switch (ssid->ieee80211w) {
1148 params.mgmt_frame_protection = NO_MGMT_FRAME_PROTECTION;
1150 case IEEE80211W_OPTIONAL:
1151 params.mgmt_frame_protection = MGMT_FRAME_PROTECTION_OPTIONAL;
1153 case IEEE80211W_REQUIRED:
1154 params.mgmt_frame_protection = MGMT_FRAME_PROTECTION_REQUIRED;
1157 if (ssid->ieee80211w != NO_IEEE80211W && bss) {
1158 const u8 *rsn = wpa_scan_get_ie(bss, WLAN_EID_RSN);
1159 struct wpa_ie_data ie;
1160 if (rsn && wpa_parse_wpa_ie(rsn, 2 + rsn[1], &ie) == 0 &&
1162 (WPA_CAPABILITY_MFPC | WPA_CAPABILITY_MFPR)) {
1163 wpa_printf(MSG_DEBUG, "WPA: Selected AP supports MFP: "
1165 params.mgmt_frame_protection =
1166 MGMT_FRAME_PROTECTION_REQUIRED;
1169 #endif /* CONFIG_IEEE80211W */
1171 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME)
1172 ret = ieee80211_sta_associate(wpa_s, ¶ms);
1174 ret = wpa_drv_associate(wpa_s, ¶ms);
1176 wpa_msg(wpa_s, MSG_INFO, "Association request to the driver "
1178 /* try to continue anyway; new association will be tried again
1183 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
1184 /* Set the key after the association just in case association
1185 * cleared the previously configured key. */
1186 wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
1187 /* No need to timeout authentication since there is no key
1189 wpa_supplicant_cancel_auth_timeout(wpa_s);
1190 wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
1191 #ifdef CONFIG_IBSS_RSN
1192 } else if (ssid->mode == IEEE80211_MODE_IBSS &&
1193 wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
1194 wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
1195 ibss_rsn_set_psk(wpa_s->ibss_rsn, ssid->psk);
1197 * RSN IBSS authentication is per-STA and we can disable the
1198 * per-BSSID authentication.
1200 wpa_supplicant_cancel_auth_timeout(wpa_s);
1201 wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
1202 #endif /* CONFIG_IBSS_RSN */
1204 /* Timeout for IEEE 802.11 authentication and association */
1208 /* give IBSS a bit more time */
1209 timeout = ssid->mode ? 10 : 5;
1210 } else if (wpa_s->conf->ap_scan == 1) {
1211 /* give IBSS a bit more time */
1212 timeout = ssid->mode ? 20 : 10;
1214 wpa_supplicant_req_auth_timeout(wpa_s, timeout, 0);
1217 if (wep_keys_set && wpa_drv_get_capa(wpa_s, &capa) == 0 &&
1218 capa.flags & WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC) {
1219 /* Set static WEP keys again */
1220 wpa_set_wep_keys(wpa_s, ssid);
1223 if (wpa_s->current_ssid && wpa_s->current_ssid != ssid) {
1225 * Do not allow EAP session resumption between different
1226 * network configurations.
1228 eapol_sm_invalidate_cached_session(wpa_s->eapol);
1230 wpa_s->current_ssid = ssid;
1231 wpa_supplicant_rsn_supp_set_config(wpa_s, wpa_s->current_ssid);
1232 wpa_supplicant_initiate_eapol(wpa_s);
1237 * wpa_supplicant_disassociate - Disassociate the current connection
1238 * @wpa_s: Pointer to wpa_supplicant data
1239 * @reason_code: IEEE 802.11 reason code for the disassociate frame
1241 * This function is used to request %wpa_supplicant to disassociate with the
1244 void wpa_supplicant_disassociate(struct wpa_supplicant *wpa_s,
1248 if (!is_zero_ether_addr(wpa_s->bssid)) {
1249 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME)
1250 ieee80211_sta_disassociate(wpa_s, reason_code);
1252 wpa_drv_disassociate(wpa_s, wpa_s->bssid, reason_code);
1253 addr = wpa_s->bssid;
1255 wpa_clear_keys(wpa_s, addr);
1256 wpa_supplicant_mark_disassoc(wpa_s);
1257 wpa_s->current_ssid = NULL;
1258 wpa_sm_set_config(wpa_s->wpa, NULL);
1259 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
1264 * wpa_supplicant_deauthenticate - Deauthenticate the current connection
1265 * @wpa_s: Pointer to wpa_supplicant data
1266 * @reason_code: IEEE 802.11 reason code for the deauthenticate frame
1268 * This function is used to request %wpa_supplicant to deauthenticate from the
1271 void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
1275 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
1276 if (!is_zero_ether_addr(wpa_s->bssid)) {
1277 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME)
1278 ieee80211_sta_deauthenticate(wpa_s, reason_code);
1280 wpa_drv_deauthenticate(wpa_s, wpa_s->bssid,
1282 addr = wpa_s->bssid;
1284 wpa_clear_keys(wpa_s, addr);
1285 wpa_s->current_ssid = NULL;
1286 wpa_sm_set_config(wpa_s->wpa, NULL);
1287 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
1288 eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
1289 eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
1293 static int wpa_supplicant_get_scan_results_old(struct wpa_supplicant *wpa_s)
1295 #define SCAN_AP_LIMIT 128
1296 struct wpa_scan_result *results;
1298 struct wpa_scan_results *res;
1300 results = os_malloc(SCAN_AP_LIMIT * sizeof(struct wpa_scan_result));
1301 if (results == NULL) {
1302 wpa_printf(MSG_WARNING, "Failed to allocate memory for scan "
1307 num = wpa_drv_get_scan_results(wpa_s, results, SCAN_AP_LIMIT);
1308 wpa_printf(MSG_DEBUG, "Scan results: %d", num);
1310 wpa_printf(MSG_DEBUG, "Failed to get scan results");
1314 if (num > SCAN_AP_LIMIT) {
1315 wpa_printf(MSG_INFO, "Not enough room for all APs (%d < %d)",
1316 num, SCAN_AP_LIMIT);
1317 num = SCAN_AP_LIMIT;
1320 wpa_scan_results_free(wpa_s->scan_res);
1321 wpa_s->scan_res = NULL;
1323 /* Convert old scan result data structure to the new one */
1324 res = os_zalloc(sizeof(*res));
1329 res->res = os_zalloc(num * sizeof(struct wpa_scan_res *));
1330 if (res->res == NULL) {
1336 for (i = 0; i < num; i++) {
1337 struct wpa_scan_result *bss = &results[i];
1338 struct wpa_scan_res *r;
1342 ie_len = 2 + bss->ssid_len + bss->rsn_ie_len + bss->wpa_ie_len;
1345 if (bss->mdie_present)
1348 r = os_zalloc(sizeof(*r) + ie_len);
1352 os_memcpy(r->bssid, bss->bssid, ETH_ALEN);
1353 r->freq = bss->freq;
1354 r->caps = bss->caps;
1355 r->qual = bss->qual;
1356 r->noise = bss->noise;
1357 r->level = bss->level;
1361 pos = (u8 *) (r + 1);
1364 *pos++ = WLAN_EID_SSID;
1365 *pos++ = bss->ssid_len;
1366 os_memcpy(pos, bss->ssid, bss->ssid_len);
1367 pos += bss->ssid_len;
1370 /* Fake Supported Rate IE to include max rate */
1371 *pos++ = WLAN_EID_SUPP_RATES;
1373 *pos++ = bss->maxrate;
1376 if (bss->rsn_ie_len) {
1377 os_memcpy(pos, bss->rsn_ie, bss->rsn_ie_len);
1378 pos += bss->rsn_ie_len;
1381 if (bss->mdie_present) {
1382 os_memcpy(pos, bss->mdie, 5);
1386 if (bss->wpa_ie_len) {
1387 os_memcpy(pos, bss->wpa_ie, bss->wpa_ie_len);
1388 pos += bss->wpa_ie_len;
1391 res->res[res->num++] = r;
1395 wpa_s->scan_res = res;
1402 * wpa_supplicant_get_scan_results - Get scan results
1403 * @wpa_s: Pointer to wpa_supplicant data
1404 * Returns: 0 on success, -1 on failure
1406 * This function is request the current scan results from the driver and stores
1407 * a local copy of the results in wpa_s->scan_res.
1409 int wpa_supplicant_get_scan_results(struct wpa_supplicant *wpa_s)
1413 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME) {
1414 wpa_scan_results_free(wpa_s->scan_res);
1415 wpa_s->scan_res = ieee80211_sta_get_scan_results(wpa_s);
1416 if (wpa_s->scan_res == NULL) {
1417 wpa_printf(MSG_DEBUG, "Failed to get scan results");
1421 } else if (wpa_s->driver->get_scan_results2 == NULL)
1422 ret = wpa_supplicant_get_scan_results_old(wpa_s);
1424 wpa_scan_results_free(wpa_s->scan_res);
1425 wpa_s->scan_res = wpa_drv_get_scan_results2(wpa_s);
1426 if (wpa_s->scan_res == NULL) {
1427 wpa_printf(MSG_DEBUG, "Failed to get scan results");
1433 if (wpa_s->scan_res)
1434 wpa_scan_sort_results(wpa_s->scan_res);
1441 * wpa_supplicant_get_ssid - Get a pointer to the current network structure
1442 * @wpa_s: Pointer to wpa_supplicant data
1443 * Returns: A pointer to the current network structure or %NULL on failure
1445 struct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s)
1447 struct wpa_ssid *entry;
1448 u8 ssid[MAX_SSID_LEN];
1454 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME) {
1455 if (ieee80211_sta_get_ssid(wpa_s, ssid, &ssid_len)) {
1456 wpa_printf(MSG_WARNING, "Could not read SSID from "
1461 res = wpa_drv_get_ssid(wpa_s, ssid);
1463 wpa_printf(MSG_WARNING, "Could not read SSID from "
1470 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME)
1471 os_memcpy(bssid, wpa_s->bssid, ETH_ALEN);
1472 else if (wpa_drv_get_bssid(wpa_s, bssid) < 0) {
1473 wpa_printf(MSG_WARNING, "Could not read BSSID from driver.");
1477 wired = wpa_s->conf->ap_scan == 0 &&
1478 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED);
1480 entry = wpa_s->conf->ssid;
1482 if (!entry->disabled &&
1483 ((ssid_len == entry->ssid_len &&
1484 os_memcmp(ssid, entry->ssid, ssid_len) == 0) || wired) &&
1485 (!entry->bssid_set ||
1486 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
1489 if (!entry->disabled &&
1490 (entry->key_mgmt & WPA_KEY_MGMT_WPS) &&
1491 (entry->ssid == NULL || entry->ssid_len == 0) &&
1492 (!entry->bssid_set ||
1493 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
1495 #endif /* CONFIG_WPS */
1496 entry = entry->next;
1503 static int wpa_supplicant_set_driver(struct wpa_supplicant *wpa_s,
1513 if (wpa_supplicant_drivers[0] == NULL) {
1514 wpa_printf(MSG_ERROR, "No driver interfaces build into "
1520 /* default to first driver in the list */
1521 wpa_s->driver = wpa_supplicant_drivers[0];
1525 pos = os_strchr(name, ',');
1529 len = os_strlen(name);
1530 for (i = 0; wpa_supplicant_drivers[i]; i++) {
1531 if (os_strlen(wpa_supplicant_drivers[i]->name) == len &&
1532 os_strncmp(name, wpa_supplicant_drivers[i]->name, len) ==
1534 wpa_s->driver = wpa_supplicant_drivers[i];
1539 wpa_printf(MSG_ERROR, "Unsupported driver '%s'.", name);
1544 void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr,
1545 const u8 *buf, size_t len)
1547 struct wpa_supplicant *wpa_s = ctx;
1549 wpa_printf(MSG_DEBUG, "RX EAPOL from " MACSTR, MAC2STR(src_addr));
1550 wpa_hexdump(MSG_MSGDUMP, "RX EAPOL", buf, len);
1552 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE) {
1553 wpa_printf(MSG_DEBUG, "Ignored received EAPOL frame since "
1554 "no key management is configured");
1558 if (wpa_s->eapol_received == 0 &&
1559 (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) ||
1560 !wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) ||
1561 wpa_s->wpa_state != WPA_COMPLETED)) {
1562 /* Timeout for completing IEEE 802.1X and WPA authentication */
1563 wpa_supplicant_req_auth_timeout(
1565 (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) ||
1566 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA ||
1567 wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) ?
1570 wpa_s->eapol_received++;
1572 if (wpa_s->countermeasures) {
1573 wpa_printf(MSG_INFO, "WPA: Countermeasures - dropped EAPOL "
1578 #ifdef CONFIG_IBSS_RSN
1579 if (wpa_s->current_ssid &&
1580 wpa_s->current_ssid->mode == IEEE80211_MODE_IBSS) {
1581 ibss_rsn_rx_eapol(wpa_s->ibss_rsn, src_addr, buf, len);
1584 #endif /* CONFIG_IBSS_RSN */
1586 /* Source address of the incoming EAPOL frame could be compared to the
1587 * current BSSID. However, it is possible that a centralized
1588 * Authenticator could be using another MAC address than the BSSID of
1589 * an AP, so just allow any address to be used for now. The replies are
1590 * still sent to the current BSSID (if available), though. */
1592 os_memcpy(wpa_s->last_eapol_src, src_addr, ETH_ALEN);
1593 if (!wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) &&
1594 eapol_sm_rx_eapol(wpa_s->eapol, src_addr, buf, len) > 0)
1596 wpa_drv_poll(wpa_s);
1597 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE))
1598 wpa_sm_rx_eapol(wpa_s->wpa, src_addr, buf, len);
1599 else if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt)) {
1601 * Set portValid = TRUE here since we are going to skip 4-way
1602 * handshake processing which would normally set portValid. We
1603 * need this to allow the EAPOL state machines to be completed
1604 * without going through EAPOL-Key handshake.
1606 eapol_sm_notify_portValid(wpa_s->eapol, TRUE);
1611 void wpa_supplicant_sta_free_hw_features(struct wpa_hw_modes *hw_features,
1612 size_t num_hw_features)
1614 ieee80211_sta_free_hw_features(hw_features, num_hw_features);
1618 void wpa_supplicant_sta_rx(void *ctx, const u8 *buf, size_t len,
1619 struct ieee80211_rx_status *rx_status)
1621 struct wpa_supplicant *wpa_s = ctx;
1622 ieee80211_sta_rx(wpa_s, buf, len, rx_status);
1627 * wpa_supplicant_driver_init - Initialize driver interface parameters
1628 * @wpa_s: Pointer to wpa_supplicant data
1629 * Returns: 0 on success, -1 on failure
1631 * This function is called to initialize driver interface parameters.
1632 * wpa_drv_init() must have been called before this function to initialize the
1635 int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s)
1637 static int interface_count = 0;
1639 if (wpa_s->driver->send_eapol) {
1640 const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
1642 os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
1644 wpa_s->l2 = l2_packet_init(wpa_s->ifname,
1645 wpa_drv_get_mac_addr(wpa_s),
1647 wpa_supplicant_rx_eapol, wpa_s, 0);
1648 if (wpa_s->l2 == NULL)
1652 if (wpa_s->l2 && l2_packet_get_own_addr(wpa_s->l2, wpa_s->own_addr)) {
1653 wpa_printf(MSG_ERROR, "Failed to get own L2 address");
1657 wpa_printf(MSG_DEBUG, "Own MAC address: " MACSTR,
1658 MAC2STR(wpa_s->own_addr));
1660 if (wpa_s->bridge_ifname[0]) {
1661 wpa_printf(MSG_DEBUG, "Receiving packets from bridge interface"
1662 " '%s'", wpa_s->bridge_ifname);
1663 wpa_s->l2_br = l2_packet_init(wpa_s->bridge_ifname,
1666 wpa_supplicant_rx_eapol, wpa_s,
1668 if (wpa_s->l2_br == NULL) {
1669 wpa_printf(MSG_ERROR, "Failed to open l2_packet "
1670 "connection for the bridge interface '%s'",
1671 wpa_s->bridge_ifname);
1676 /* Backwards compatibility call to set_wpa() handler. This is called
1677 * only just after init and just before deinit, so these handler can be
1678 * used to implement same functionality. */
1679 if (wpa_drv_set_wpa(wpa_s, 1) < 0) {
1680 struct wpa_driver_capa capa;
1681 if (wpa_drv_get_capa(wpa_s, &capa) < 0 ||
1682 !(capa.flags & (WPA_DRIVER_CAPA_KEY_MGMT_WPA |
1683 WPA_DRIVER_CAPA_KEY_MGMT_WPA2))) {
1684 wpa_printf(MSG_DEBUG, "Driver does not support WPA.");
1685 /* Continue to allow non-WPA modes to be used. */
1687 wpa_printf(MSG_ERROR, "Failed to enable WPA in the "
1693 wpa_clear_keys(wpa_s, NULL);
1695 /* Make sure that TKIP countermeasures are not left enabled (could
1696 * happen if wpa_supplicant is killed during countermeasures. */
1697 wpa_drv_set_countermeasures(wpa_s, 0);
1699 wpa_drv_set_drop_unencrypted(wpa_s, 1);
1701 wpa_printf(MSG_DEBUG, "RSN: flushing PMKID list in the driver");
1702 wpa_drv_flush_pmkid(wpa_s);
1704 wpa_s->prev_scan_ssid = WILDCARD_SSID_SCAN;
1705 wpa_supplicant_req_scan(wpa_s, interface_count, 100000);
1712 static int wpa_supplicant_daemon(const char *pid_file)
1714 wpa_printf(MSG_DEBUG, "Daemonize..");
1715 return os_daemonize(pid_file);
1719 static struct wpa_supplicant * wpa_supplicant_alloc(void)
1721 struct wpa_supplicant *wpa_s;
1723 wpa_s = os_zalloc(sizeof(*wpa_s));
1726 wpa_s->scan_req = 1;
1732 static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
1733 struct wpa_interface *iface)
1735 const char *ifname, *driver;
1736 struct wpa_driver_capa capa;
1738 wpa_printf(MSG_DEBUG, "Initializing interface '%s' conf '%s' driver "
1739 "'%s' ctrl_interface '%s' bridge '%s'", iface->ifname,
1740 iface->confname ? iface->confname : "N/A",
1741 iface->driver ? iface->driver : "default",
1742 iface->ctrl_interface ? iface->ctrl_interface : "N/A",
1743 iface->bridge_ifname ? iface->bridge_ifname : "N/A");
1745 if (iface->confname) {
1746 #ifdef CONFIG_BACKEND_FILE
1747 wpa_s->confname = os_rel2abs_path(iface->confname);
1748 if (wpa_s->confname == NULL) {
1749 wpa_printf(MSG_ERROR, "Failed to get absolute path "
1750 "for configuration file '%s'.",
1754 wpa_printf(MSG_DEBUG, "Configuration file '%s' -> '%s'",
1755 iface->confname, wpa_s->confname);
1756 #else /* CONFIG_BACKEND_FILE */
1757 wpa_s->confname = os_strdup(iface->confname);
1758 #endif /* CONFIG_BACKEND_FILE */
1759 wpa_s->conf = wpa_config_read(wpa_s->confname);
1760 if (wpa_s->conf == NULL) {
1761 wpa_printf(MSG_ERROR, "Failed to read or parse "
1762 "configuration '%s'.", wpa_s->confname);
1767 * Override ctrl_interface and driver_param if set on command
1770 if (iface->ctrl_interface) {
1771 os_free(wpa_s->conf->ctrl_interface);
1772 wpa_s->conf->ctrl_interface =
1773 os_strdup(iface->ctrl_interface);
1776 if (iface->driver_param) {
1777 os_free(wpa_s->conf->driver_param);
1778 wpa_s->conf->driver_param =
1779 os_strdup(iface->driver_param);
1782 wpa_s->conf = wpa_config_alloc_empty(iface->ctrl_interface,
1783 iface->driver_param);
1785 if (wpa_s->conf == NULL) {
1786 wpa_printf(MSG_ERROR, "\nNo configuration found.");
1790 if (iface->ifname == NULL) {
1791 wpa_printf(MSG_ERROR, "\nInterface name is required.");
1794 if (os_strlen(iface->ifname) >= sizeof(wpa_s->ifname)) {
1795 wpa_printf(MSG_ERROR, "\nToo long interface name '%s'.",
1799 os_strlcpy(wpa_s->ifname, iface->ifname, sizeof(wpa_s->ifname));
1801 if (iface->bridge_ifname) {
1802 if (os_strlen(iface->bridge_ifname) >=
1803 sizeof(wpa_s->bridge_ifname)) {
1804 wpa_printf(MSG_ERROR, "\nToo long bridge interface "
1805 "name '%s'.", iface->bridge_ifname);
1808 os_strlcpy(wpa_s->bridge_ifname, iface->bridge_ifname,
1809 sizeof(wpa_s->bridge_ifname));
1812 /* RSNA Supplicant Key Management - INITIALIZE */
1813 eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
1814 eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
1816 /* Initialize driver interface and register driver event handler before
1817 * L2 receive handler so that association events are processed before
1818 * EAPOL-Key packets if both become available for the same select()
1820 driver = iface->driver;
1822 if (wpa_supplicant_set_driver(wpa_s, driver) < 0)
1825 wpa_s->drv_priv = wpa_drv_init(wpa_s, wpa_s->ifname);
1826 if (wpa_s->drv_priv == NULL) {
1828 pos = os_strchr(driver, ',');
1830 wpa_printf(MSG_DEBUG, "Failed to initialize driver "
1831 "interface - try next driver wrapper");
1835 wpa_printf(MSG_ERROR, "Failed to initialize driver interface");
1838 if (wpa_drv_set_param(wpa_s, wpa_s->conf->driver_param) < 0) {
1839 wpa_printf(MSG_ERROR, "Driver interface rejected "
1840 "driver_param '%s'", wpa_s->conf->driver_param);
1844 ifname = wpa_drv_get_ifname(wpa_s);
1845 if (ifname && os_strcmp(ifname, wpa_s->ifname) != 0) {
1846 wpa_printf(MSG_DEBUG, "Driver interface replaced interface "
1847 "name with '%s'", ifname);
1848 os_strlcpy(wpa_s->ifname, ifname, sizeof(wpa_s->ifname));
1851 if (wpa_supplicant_init_wpa(wpa_s) < 0)
1854 wpa_sm_set_ifname(wpa_s->wpa, wpa_s->ifname,
1855 wpa_s->bridge_ifname[0] ? wpa_s->bridge_ifname :
1857 wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
1859 if (wpa_s->conf->dot11RSNAConfigPMKLifetime &&
1860 wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_LIFETIME,
1861 wpa_s->conf->dot11RSNAConfigPMKLifetime)) {
1862 wpa_printf(MSG_ERROR, "Invalid WPA parameter value for "
1863 "dot11RSNAConfigPMKLifetime");
1867 if (wpa_s->conf->dot11RSNAConfigPMKReauthThreshold &&
1868 wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_REAUTH_THRESHOLD,
1869 wpa_s->conf->dot11RSNAConfigPMKReauthThreshold)) {
1870 wpa_printf(MSG_ERROR, "Invalid WPA parameter value for "
1871 "dot11RSNAConfigPMKReauthThreshold");
1875 if (wpa_s->conf->dot11RSNAConfigSATimeout &&
1876 wpa_sm_set_param(wpa_s->wpa, RSNA_SA_TIMEOUT,
1877 wpa_s->conf->dot11RSNAConfigSATimeout)) {
1878 wpa_printf(MSG_ERROR, "Invalid WPA parameter value for "
1879 "dot11RSNAConfigSATimeout");
1883 if (wpa_supplicant_driver_init(wpa_s) < 0)
1886 if (wpa_s->conf->country[0] && wpa_s->conf->country[1] &&
1887 wpa_drv_set_country(wpa_s, wpa_s->conf->country)) {
1888 wpa_printf(MSG_DEBUG, "Failed to set country");
1892 wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
1894 if (wpas_wps_init(wpa_s))
1897 if (wpa_supplicant_init_eapol(wpa_s) < 0)
1899 wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
1901 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
1902 if (wpa_s->ctrl_iface == NULL) {
1903 wpa_printf(MSG_ERROR,
1904 "Failed to initialize control interface '%s'.\n"
1905 "You may have another wpa_supplicant process "
1906 "already running or the file was\n"
1907 "left by an unclean termination of wpa_supplicant "
1908 "in which case you will need\n"
1909 "to manually remove this file before starting "
1910 "wpa_supplicant again.\n",
1911 wpa_s->conf->ctrl_interface);
1915 if (wpa_drv_get_capa(wpa_s, &capa) == 0) {
1916 wpa_s->drv_flags = capa.flags;
1917 if (capa.flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME) {
1918 if (ieee80211_sta_init(wpa_s))
1921 wpa_s->max_scan_ssids = capa.max_scan_ssids;
1924 #ifdef CONFIG_IBSS_RSN
1925 wpa_s->ibss_rsn = ibss_rsn_init(wpa_s);
1926 if (!wpa_s->ibss_rsn) {
1927 wpa_printf(MSG_DEBUG, "Failed to init IBSS RSN");
1930 #endif /* CONFIG_IBSS_RSN */
1936 static void wpa_supplicant_deinit_iface(struct wpa_supplicant *wpa_s)
1938 if (wpa_s->drv_priv) {
1939 wpa_supplicant_deauthenticate(wpa_s,
1940 WLAN_REASON_DEAUTH_LEAVING);
1942 /* Backwards compatibility call to set_wpa() handler. This is
1943 * called only just after init and just before deinit, so these
1944 * handler can be used to implement same functionality. */
1945 if (wpa_drv_set_wpa(wpa_s, 0) < 0) {
1946 wpa_printf(MSG_ERROR, "Failed to disable WPA in the "
1950 wpa_drv_set_drop_unencrypted(wpa_s, 0);
1951 wpa_drv_set_countermeasures(wpa_s, 0);
1952 wpa_clear_keys(wpa_s, NULL);
1955 wpas_dbus_unregister_iface(wpa_s);
1957 wpa_supplicant_cleanup(wpa_s);
1959 if (wpa_s->drv_priv)
1960 wpa_drv_deinit(wpa_s);
1965 * wpa_supplicant_add_iface - Add a new network interface
1966 * @global: Pointer to global data from wpa_supplicant_init()
1967 * @iface: Interface configuration options
1968 * Returns: Pointer to the created interface or %NULL on failure
1970 * This function is used to add new network interfaces for %wpa_supplicant.
1971 * This can be called before wpa_supplicant_run() to add interfaces before the
1972 * main event loop has been started. In addition, new interfaces can be added
1973 * dynamically while %wpa_supplicant is already running. This could happen,
1974 * e.g., when a hotplug network adapter is inserted.
1976 struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
1977 struct wpa_interface *iface)
1979 struct wpa_supplicant *wpa_s;
1981 if (global == NULL || iface == NULL)
1984 wpa_s = wpa_supplicant_alloc();
1988 if (wpa_supplicant_init_iface(wpa_s, iface)) {
1989 wpa_printf(MSG_DEBUG, "Failed to add interface %s",
1991 wpa_supplicant_deinit_iface(wpa_s);
1996 wpa_s->global = global;
1998 /* Register the interface with the dbus control interface */
1999 if (wpas_dbus_register_iface(wpa_s)) {
2000 wpa_supplicant_deinit_iface(wpa_s);
2005 wpa_s->next = global->ifaces;
2006 global->ifaces = wpa_s;
2008 wpa_printf(MSG_DEBUG, "Added interface %s", wpa_s->ifname);
2015 * wpa_supplicant_remove_iface - Remove a network interface
2016 * @global: Pointer to global data from wpa_supplicant_init()
2017 * @wpa_s: Pointer to the network interface to be removed
2018 * Returns: 0 if interface was removed, -1 if interface was not found
2020 * This function can be used to dynamically remove network interfaces from
2021 * %wpa_supplicant, e.g., when a hotplug network adapter is ejected. In
2022 * addition, this function is used to remove all remaining interfaces when
2023 * %wpa_supplicant is terminated.
2025 int wpa_supplicant_remove_iface(struct wpa_global *global,
2026 struct wpa_supplicant *wpa_s)
2028 struct wpa_supplicant *prev;
2030 /* Remove interface from the global list of interfaces */
2031 prev = global->ifaces;
2032 if (prev == wpa_s) {
2033 global->ifaces = wpa_s->next;
2035 while (prev && prev->next != wpa_s)
2039 prev->next = wpa_s->next;
2042 wpa_printf(MSG_DEBUG, "Removing interface %s", wpa_s->ifname);
2044 wpa_supplicant_deinit_iface(wpa_s);
2052 * wpa_supplicant_get_iface - Get a new network interface
2053 * @global: Pointer to global data from wpa_supplicant_init()
2054 * @ifname: Interface name
2055 * Returns: Pointer to the interface or %NULL if not found
2057 struct wpa_supplicant * wpa_supplicant_get_iface(struct wpa_global *global,
2060 struct wpa_supplicant *wpa_s;
2062 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
2063 if (os_strcmp(wpa_s->ifname, ifname) == 0)
2071 * wpa_supplicant_init - Initialize %wpa_supplicant
2072 * @params: Parameters for %wpa_supplicant
2073 * Returns: Pointer to global %wpa_supplicant data, or %NULL on failure
2075 * This function is used to initialize %wpa_supplicant. After successful
2076 * initialization, the returned data pointer can be used to add and remove
2077 * network interfaces, and eventually, to deinitialize %wpa_supplicant.
2079 struct wpa_global * wpa_supplicant_init(struct wpa_params *params)
2081 struct wpa_global *global;
2087 wpa_debug_open_file(params->wpa_debug_file_path);
2088 if (params->wpa_debug_syslog)
2089 wpa_debug_open_syslog();
2091 ret = eap_peer_register_methods();
2093 wpa_printf(MSG_ERROR, "Failed to register EAP methods");
2095 wpa_printf(MSG_ERROR, "Two or more EAP methods used "
2096 "the same EAP type.");
2100 global = os_zalloc(sizeof(*global));
2103 global->params.daemonize = params->daemonize;
2104 global->params.wait_for_monitor = params->wait_for_monitor;
2105 global->params.dbus_ctrl_interface = params->dbus_ctrl_interface;
2106 if (params->pid_file)
2107 global->params.pid_file = os_strdup(params->pid_file);
2108 if (params->ctrl_interface)
2109 global->params.ctrl_interface =
2110 os_strdup(params->ctrl_interface);
2111 wpa_debug_level = global->params.wpa_debug_level =
2112 params->wpa_debug_level;
2113 wpa_debug_show_keys = global->params.wpa_debug_show_keys =
2114 params->wpa_debug_show_keys;
2115 wpa_debug_timestamp = global->params.wpa_debug_timestamp =
2116 params->wpa_debug_timestamp;
2118 if (eloop_init(global)) {
2119 wpa_printf(MSG_ERROR, "Failed to initialize event loop");
2120 wpa_supplicant_deinit(global);
2124 global->ctrl_iface = wpa_supplicant_global_ctrl_iface_init(global);
2125 if (global->ctrl_iface == NULL) {
2126 wpa_supplicant_deinit(global);
2130 if (global->params.dbus_ctrl_interface) {
2131 global->dbus_ctrl_iface =
2132 wpa_supplicant_dbus_ctrl_iface_init(global);
2133 if (global->dbus_ctrl_iface == NULL) {
2134 wpa_supplicant_deinit(global);
2139 for (i = 0; wpa_supplicant_drivers[i]; i++)
2140 global->drv_count++;
2141 if (global->drv_count == 0) {
2142 wpa_printf(MSG_ERROR, "No drivers enabled");
2143 wpa_supplicant_deinit(global);
2146 global->drv_priv = os_zalloc(global->drv_count * sizeof(void *));
2147 if (global->drv_priv == NULL) {
2148 wpa_supplicant_deinit(global);
2151 for (i = 0; wpa_supplicant_drivers[i]; i++) {
2152 if (!wpa_supplicant_drivers[i]->global_init)
2154 global->drv_priv[i] = wpa_supplicant_drivers[i]->global_init();
2155 if (global->drv_priv[i] == NULL) {
2156 wpa_printf(MSG_ERROR, "Failed to initialize driver "
2157 "'%s'", wpa_supplicant_drivers[i]->name);
2158 wpa_supplicant_deinit(global);
2168 * wpa_supplicant_run - Run the %wpa_supplicant main event loop
2169 * @global: Pointer to global data from wpa_supplicant_init()
2170 * Returns: 0 after successful event loop run, -1 on failure
2172 * This function starts the main event loop and continues running as long as
2173 * there are any remaining events. In most cases, this function is running as
2174 * long as the %wpa_supplicant process in still in use.
2176 int wpa_supplicant_run(struct wpa_global *global)
2178 struct wpa_supplicant *wpa_s;
2180 if (global->params.daemonize &&
2181 wpa_supplicant_daemon(global->params.pid_file))
2184 if (global->params.wait_for_monitor) {
2185 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
2186 if (wpa_s->ctrl_iface)
2187 wpa_supplicant_ctrl_iface_wait(
2191 eloop_register_signal_terminate(wpa_supplicant_terminate, NULL);
2192 eloop_register_signal_reconfig(wpa_supplicant_reconfig, NULL);
2201 * wpa_supplicant_deinit - Deinitialize %wpa_supplicant
2202 * @global: Pointer to global data from wpa_supplicant_init()
2204 * This function is called to deinitialize %wpa_supplicant and to free all
2205 * allocated resources. Remaining network interfaces will also be removed.
2207 void wpa_supplicant_deinit(struct wpa_global *global)
2214 while (global->ifaces)
2215 wpa_supplicant_remove_iface(global, global->ifaces);
2217 if (global->ctrl_iface)
2218 wpa_supplicant_global_ctrl_iface_deinit(global->ctrl_iface);
2219 if (global->dbus_ctrl_iface)
2220 wpa_supplicant_dbus_ctrl_iface_deinit(global->dbus_ctrl_iface);
2222 eap_peer_unregister_methods();
2224 for (i = 0; wpa_supplicant_drivers[i] && global->drv_priv; i++) {
2225 if (!global->drv_priv[i])
2227 wpa_supplicant_drivers[i]->global_deinit(global->drv_priv[i]);
2229 os_free(global->drv_priv);
2233 if (global->params.pid_file) {
2234 os_daemonize_terminate(global->params.pid_file);
2235 os_free(global->params.pid_file);
2237 os_free(global->params.ctrl_interface);
2240 wpa_debug_close_syslog();
2241 wpa_debug_close_file();