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"
44 const char *wpa_supplicant_version =
45 "wpa_supplicant v" VERSION_STR "\n"
46 "Copyright (c) 2003-2009, Jouni Malinen <j@w1.fi> and contributors";
48 const char *wpa_supplicant_license =
49 "This program is free software. You can distribute it and/or modify it\n"
50 "under the terms of the GNU General Public License version 2.\n"
52 "Alternatively, this software may be distributed under the terms of the\n"
53 "BSD license. See README and COPYING for more details.\n"
54 #ifdef EAP_TLS_OPENSSL
55 "\nThis product includes software developed by the OpenSSL Project\n"
56 "for use in the OpenSSL Toolkit (http://www.openssl.org/)\n"
57 #endif /* EAP_TLS_OPENSSL */
60 #ifndef CONFIG_NO_STDOUT_DEBUG
61 /* Long text divided into parts in order to fit in C89 strings size limits. */
62 const char *wpa_supplicant_full_license1 =
63 "This program is free software; you can redistribute it and/or modify\n"
64 "it under the terms of the GNU General Public License version 2 as\n"
65 "published by the Free Software Foundation.\n"
67 "This program is distributed in the hope that it will be useful,\n"
68 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
69 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
70 "GNU General Public License for more details.\n"
72 const char *wpa_supplicant_full_license2 =
73 "You should have received a copy of the GNU General Public License\n"
74 "along with this program; if not, write to the Free Software\n"
75 "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n"
77 "Alternatively, this software may be distributed under the terms of the\n"
80 "Redistribution and use in source and binary forms, with or without\n"
81 "modification, are permitted provided that the following conditions are\n"
84 const char *wpa_supplicant_full_license3 =
85 "1. Redistributions of source code must retain the above copyright\n"
86 " notice, this list of conditions and the following disclaimer.\n"
88 "2. Redistributions in binary form must reproduce the above copyright\n"
89 " notice, this list of conditions and the following disclaimer in the\n"
90 " documentation and/or other materials provided with the distribution.\n"
92 const char *wpa_supplicant_full_license4 =
93 "3. Neither the name(s) of the above-listed copyright holder(s) nor the\n"
94 " names of its contributors may be used to endorse or promote products\n"
95 " derived from this software without specific prior written permission.\n"
97 "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
98 "\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
99 "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
100 "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n";
101 const char *wpa_supplicant_full_license5 =
102 "OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
103 "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
104 "LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
105 "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
106 "THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
107 "(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
108 "OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
110 #endif /* CONFIG_NO_STDOUT_DEBUG */
112 extern int wpa_debug_level;
113 extern int wpa_debug_show_keys;
114 extern int wpa_debug_timestamp;
116 /* Configure default/group WEP keys for static WEP */
117 static int wpa_set_wep_keys(struct wpa_supplicant *wpa_s,
118 struct wpa_ssid *ssid)
122 for (i = 0; i < NUM_WEP_KEYS; i++) {
123 if (ssid->wep_key_len[i] == 0)
127 wpa_drv_set_key(wpa_s, WPA_ALG_WEP,
128 (u8 *) "\xff\xff\xff\xff\xff\xff",
129 i, i == ssid->wep_tx_keyidx, (u8 *) "", 0,
130 ssid->wep_key[i], ssid->wep_key_len[i]);
137 static int wpa_supplicant_set_wpa_none_key(struct wpa_supplicant *wpa_s,
138 struct wpa_ssid *ssid)
145 /* IBSS/WPA-None uses only one key (Group) for both receiving and
146 * sending unicast and multicast packets. */
148 if (ssid->mode != IEEE80211_MODE_IBSS) {
149 wpa_printf(MSG_INFO, "WPA: Invalid mode %d (not IBSS/ad-hoc) "
150 "for WPA-None", ssid->mode);
154 if (!ssid->psk_set) {
155 wpa_printf(MSG_INFO, "WPA: No PSK configured for WPA-None");
159 switch (wpa_s->group_cipher) {
160 case WPA_CIPHER_CCMP:
161 os_memcpy(key, ssid->psk, 16);
165 case WPA_CIPHER_TKIP:
166 /* WPA-None uses the same Michael MIC key for both TX and RX */
167 os_memcpy(key, ssid->psk, 16 + 8);
168 os_memcpy(key + 16 + 8, ssid->psk + 16, 8);
173 wpa_printf(MSG_INFO, "WPA: Invalid group cipher %d for "
174 "WPA-None", wpa_s->group_cipher);
178 /* TODO: should actually remember the previously used seq#, both for TX
179 * and RX from each STA.. */
181 return wpa_drv_set_key(wpa_s, alg, (u8 *) "\xff\xff\xff\xff\xff\xff",
182 0, 1, seq, 6, key, keylen);
186 static void wpa_supplicant_timeout(void *eloop_ctx, void *timeout_ctx)
188 struct wpa_supplicant *wpa_s = eloop_ctx;
189 const u8 *bssid = wpa_s->bssid;
190 if (is_zero_ether_addr(bssid))
191 bssid = wpa_s->pending_bssid;
192 wpa_msg(wpa_s, MSG_INFO, "Authentication with " MACSTR " timed out.",
194 wpa_blacklist_add(wpa_s, bssid);
195 wpa_sm_notify_disassoc(wpa_s->wpa);
196 wpa_supplicant_disassociate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
197 wpa_s->reassociate = 1;
198 wpa_supplicant_req_scan(wpa_s, 0, 0);
203 * wpa_supplicant_req_auth_timeout - Schedule a timeout for authentication
204 * @wpa_s: Pointer to wpa_supplicant data
205 * @sec: Number of seconds after which to time out authentication
206 * @usec: Number of microseconds after which to time out authentication
208 * This function is used to schedule a timeout for the current authentication
211 void wpa_supplicant_req_auth_timeout(struct wpa_supplicant *wpa_s,
214 if (wpa_s->conf && wpa_s->conf->ap_scan == 0 &&
215 wpa_s->driver && IS_WIRED(wpa_s->driver))
218 wpa_msg(wpa_s, MSG_DEBUG, "Setting authentication timeout: %d sec "
219 "%d usec", sec, usec);
220 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
221 eloop_register_timeout(sec, usec, wpa_supplicant_timeout, wpa_s, NULL);
226 * wpa_supplicant_cancel_auth_timeout - Cancel authentication timeout
227 * @wpa_s: Pointer to wpa_supplicant data
229 * This function is used to cancel authentication timeout scheduled with
230 * wpa_supplicant_req_auth_timeout() and it is called when authentication has
233 void wpa_supplicant_cancel_auth_timeout(struct wpa_supplicant *wpa_s)
235 wpa_msg(wpa_s, MSG_DEBUG, "Cancelling authentication timeout");
236 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
237 wpa_blacklist_del(wpa_s, wpa_s->bssid);
242 * wpa_supplicant_initiate_eapol - Configure EAPOL state machine
243 * @wpa_s: Pointer to wpa_supplicant data
245 * This function is used to configure EAPOL state machine based on the selected
246 * authentication mode.
248 void wpa_supplicant_initiate_eapol(struct wpa_supplicant *wpa_s)
250 #ifdef IEEE8021X_EAPOL
251 struct eapol_config eapol_conf;
252 struct wpa_ssid *ssid = wpa_s->current_ssid;
254 #ifdef CONFIG_IBSS_RSN
255 if (ssid->mode == IEEE80211_MODE_IBSS &&
256 wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
257 wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
259 * RSN IBSS authentication is per-STA and we can disable the
260 * per-BSSID EAPOL authentication.
262 eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
263 eapol_sm_notify_eap_success(wpa_s->eapol, TRUE);
264 eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
267 #endif /* CONFIG_IBSS_RSN */
269 eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
270 eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
272 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
273 wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE)
274 eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
276 eapol_sm_notify_portControl(wpa_s->eapol, Auto);
278 os_memset(&eapol_conf, 0, sizeof(eapol_conf));
279 if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
280 eapol_conf.accept_802_1x_keys = 1;
281 eapol_conf.required_keys = 0;
282 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_UNICAST) {
283 eapol_conf.required_keys |= EAPOL_REQUIRE_KEY_UNICAST;
285 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_BROADCAST) {
286 eapol_conf.required_keys |=
287 EAPOL_REQUIRE_KEY_BROADCAST;
290 if (wpa_s->conf && wpa_s->driver && IS_WIRED(wpa_s->driver)) {
291 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 */
413 * wpa_clear_keys - Clear keys configured for the driver
414 * @wpa_s: Pointer to wpa_supplicant data
415 * @addr: Previously used BSSID or %NULL if not available
417 * This function clears the encryption keys that has been previously configured
420 void wpa_clear_keys(struct wpa_supplicant *wpa_s, const u8 *addr)
422 u8 *bcast = (u8 *) "\xff\xff\xff\xff\xff\xff";
424 if (wpa_s->keys_cleared) {
425 /* Some drivers (e.g., ndiswrapper & NDIS drivers) seem to have
426 * timing issues with keys being cleared just before new keys
427 * are set or just after association or something similar. This
428 * shows up in group key handshake failing often because of the
429 * client not receiving the first encrypted packets correctly.
430 * Skipping some of the extra key clearing steps seems to help
431 * in completing group key handshake more reliably. */
432 wpa_printf(MSG_DEBUG, "No keys have been configured - "
433 "skip key clearing");
437 /* MLME-DELETEKEYS.request */
438 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, bcast, 0, 0, NULL, 0, NULL, 0);
439 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, bcast, 1, 0, NULL, 0, NULL, 0);
440 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, bcast, 2, 0, NULL, 0, NULL, 0);
441 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, bcast, 3, 0, NULL, 0, NULL, 0);
443 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, addr, 0, 0, NULL, 0, NULL,
445 /* MLME-SETPROTECTION.request(None) */
446 wpa_drv_mlme_setprotection(
448 MLME_SETPROTECTION_PROTECT_TYPE_NONE,
449 MLME_SETPROTECTION_KEY_TYPE_PAIRWISE);
451 wpa_s->keys_cleared = 1;
456 * wpa_supplicant_state_txt - Get the connection state name as a text string
457 * @state: State (wpa_state; WPA_*)
458 * Returns: The state name as a printable text string
460 const char * wpa_supplicant_state_txt(int state)
463 case WPA_DISCONNECTED:
464 return "DISCONNECTED";
469 case WPA_ASSOCIATING:
470 return "ASSOCIATING";
473 case WPA_4WAY_HANDSHAKE:
474 return "4WAY_HANDSHAKE";
475 case WPA_GROUP_HANDSHAKE:
476 return "GROUP_HANDSHAKE";
486 * wpa_supplicant_set_state - Set current connection state
487 * @wpa_s: Pointer to wpa_supplicant data
488 * @state: The new connection state
490 * This function is called whenever the connection state changes, e.g.,
491 * association is completed for WPA/WPA2 4-Way Handshake is started.
493 void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s, wpa_states state)
495 wpa_printf(MSG_DEBUG, "State: %s -> %s",
496 wpa_supplicant_state_txt(wpa_s->wpa_state),
497 wpa_supplicant_state_txt(state));
499 wpa_supplicant_dbus_notify_state_change(wpa_s, state,
502 if (state == WPA_COMPLETED && wpa_s->new_connection) {
503 #if defined(CONFIG_CTRL_IFACE) || !defined(CONFIG_NO_STDOUT_DEBUG)
504 struct wpa_ssid *ssid = wpa_s->current_ssid;
505 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_CONNECTED "- Connection to "
506 MACSTR " completed %s [id=%d id_str=%s]",
507 MAC2STR(wpa_s->bssid), wpa_s->reassociated_connection ?
508 "(reauth)" : "(auth)",
509 ssid ? ssid->id : -1,
510 ssid && ssid->id_str ? ssid->id_str : "");
511 #endif /* CONFIG_CTRL_IFACE || !CONFIG_NO_STDOUT_DEBUG */
512 wpa_s->new_connection = 0;
513 wpa_s->reassociated_connection = 1;
514 wpa_drv_set_operstate(wpa_s, 1);
515 } else if (state == WPA_DISCONNECTED || state == WPA_ASSOCIATING ||
516 state == WPA_ASSOCIATED) {
517 wpa_s->new_connection = 1;
518 wpa_drv_set_operstate(wpa_s, 0);
520 wpa_s->wpa_state = state;
524 static void wpa_supplicant_terminate(int sig, void *eloop_ctx,
527 struct wpa_global *global = eloop_ctx;
528 struct wpa_supplicant *wpa_s;
529 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
530 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TERMINATING "- signal %d "
537 static void wpa_supplicant_clear_status(struct wpa_supplicant *wpa_s)
539 wpa_s->pairwise_cipher = 0;
540 wpa_s->group_cipher = 0;
541 wpa_s->mgmt_group_cipher = 0;
543 wpa_s->wpa_state = WPA_DISCONNECTED;
548 * wpa_supplicant_reload_configuration - Reload configuration data
549 * @wpa_s: Pointer to wpa_supplicant data
550 * Returns: 0 on success or -1 if configuration parsing failed
552 * This function can be used to request that the configuration data is reloaded
553 * (e.g., after configuration file change). This function is reloading
554 * configuration only for one interface, so this may need to be called multiple
555 * times if %wpa_supplicant is controlling multiple interfaces and all
556 * interfaces need reconfiguration.
558 int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s)
560 struct wpa_config *conf;
562 if (wpa_s->confname == NULL)
564 conf = wpa_config_read(wpa_s->confname);
566 wpa_msg(wpa_s, MSG_ERROR, "Failed to parse the configuration "
567 "file '%s' - exiting", wpa_s->confname);
571 reconf_ctrl = !!conf->ctrl_interface != !!wpa_s->conf->ctrl_interface
572 || (conf->ctrl_interface && wpa_s->conf->ctrl_interface &&
573 os_strcmp(conf->ctrl_interface,
574 wpa_s->conf->ctrl_interface) != 0);
576 if (reconf_ctrl && wpa_s->ctrl_iface) {
577 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
578 wpa_s->ctrl_iface = NULL;
581 eapol_sm_invalidate_cached_session(wpa_s->eapol);
582 wpa_s->current_ssid = NULL;
584 * TODO: should notify EAPOL SM about changes in opensc_engine_path,
585 * pkcs11_engine_path, pkcs11_module_path.
587 if (wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt)) {
589 * Clear forced success to clear EAP state for next
592 eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
594 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
595 wpa_sm_set_config(wpa_s->wpa, NULL);
596 wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
597 rsn_preauth_deinit(wpa_s->wpa);
598 wpa_config_free(wpa_s->conf);
601 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
603 wpa_supplicant_clear_status(wpa_s);
604 wpa_s->reassociate = 1;
605 wpa_supplicant_req_scan(wpa_s, 0, 0);
606 wpa_msg(wpa_s, MSG_DEBUG, "Reconfiguration completed");
611 static void wpa_supplicant_reconfig(int sig, void *eloop_ctx,
614 struct wpa_global *global = eloop_ctx;
615 struct wpa_supplicant *wpa_s;
616 wpa_printf(MSG_DEBUG, "Signal %d received - reconfiguring", sig);
617 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
618 if (wpa_supplicant_reload_configuration(wpa_s) < 0) {
625 static wpa_cipher cipher_suite2driver(int cipher)
628 case WPA_CIPHER_NONE:
630 case WPA_CIPHER_WEP40:
632 case WPA_CIPHER_WEP104:
633 return CIPHER_WEP104;
634 case WPA_CIPHER_CCMP:
636 case WPA_CIPHER_TKIP:
643 static wpa_key_mgmt key_mgmt2driver(int key_mgmt)
646 case WPA_KEY_MGMT_NONE:
647 return KEY_MGMT_NONE;
648 case WPA_KEY_MGMT_IEEE8021X_NO_WPA:
649 return KEY_MGMT_802_1X_NO_WPA;
650 case WPA_KEY_MGMT_IEEE8021X:
651 return KEY_MGMT_802_1X;
652 case WPA_KEY_MGMT_WPA_NONE:
653 return KEY_MGMT_WPA_NONE;
654 case WPA_KEY_MGMT_FT_IEEE8021X:
655 return KEY_MGMT_FT_802_1X;
656 case WPA_KEY_MGMT_FT_PSK:
657 return KEY_MGMT_FT_PSK;
658 case WPA_KEY_MGMT_IEEE8021X_SHA256:
659 return KEY_MGMT_802_1X_SHA256;
660 case WPA_KEY_MGMT_PSK_SHA256:
661 return KEY_MGMT_PSK_SHA256;
662 case WPA_KEY_MGMT_WPS:
664 case WPA_KEY_MGMT_PSK:
671 static int wpa_supplicant_suites_from_ai(struct wpa_supplicant *wpa_s,
672 struct wpa_ssid *ssid,
673 struct wpa_ie_data *ie)
675 int ret = wpa_sm_parse_own_wpa_ie(wpa_s->wpa, ie);
678 wpa_msg(wpa_s, MSG_INFO, "WPA: Failed to parse WPA IE "
679 "from association info");
684 wpa_printf(MSG_DEBUG, "WPA: Using WPA IE from AssocReq to set cipher "
686 if (!(ie->group_cipher & ssid->group_cipher)) {
687 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled group "
688 "cipher 0x%x (mask 0x%x) - reject",
689 ie->group_cipher, ssid->group_cipher);
692 if (!(ie->pairwise_cipher & ssid->pairwise_cipher)) {
693 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled pairwise "
694 "cipher 0x%x (mask 0x%x) - reject",
695 ie->pairwise_cipher, ssid->pairwise_cipher);
698 if (!(ie->key_mgmt & ssid->key_mgmt)) {
699 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled key "
700 "management 0x%x (mask 0x%x) - reject",
701 ie->key_mgmt, ssid->key_mgmt);
705 #ifdef CONFIG_IEEE80211W
706 if (!(ie->capabilities & WPA_CAPABILITY_MFPC) &&
707 ssid->ieee80211w == IEEE80211W_REQUIRED) {
708 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver associated with an AP "
709 "that does not support management frame protection - "
713 #endif /* CONFIG_IEEE80211W */
720 * wpa_supplicant_set_suites - Set authentication and encryption parameters
721 * @wpa_s: Pointer to wpa_supplicant data
722 * @bss: Scan results for the selected BSS, or %NULL if not available
723 * @ssid: Configuration data for the selected network
724 * @wpa_ie: Buffer for the WPA/RSN IE
725 * @wpa_ie_len: Maximum wpa_ie buffer size on input. This is changed to be the
726 * used buffer length in case the functions returns success.
727 * Returns: 0 on success or -1 on failure
729 * This function is used to configure authentication and encryption parameters
730 * based on the network configuration and scan result for the selected BSS (if
733 int wpa_supplicant_set_suites(struct wpa_supplicant *wpa_s,
734 struct wpa_scan_res *bss,
735 struct wpa_ssid *ssid,
736 u8 *wpa_ie, size_t *wpa_ie_len)
738 struct wpa_ie_data ie;
740 const u8 *bss_wpa, *bss_rsn;
743 bss_wpa = wpa_scan_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE);
744 bss_rsn = wpa_scan_get_ie(bss, WLAN_EID_RSN);
746 bss_wpa = bss_rsn = NULL;
748 if (bss_rsn && (ssid->proto & WPA_PROTO_RSN) &&
749 wpa_parse_wpa_ie(bss_rsn, 2 + bss_rsn[1], &ie) == 0 &&
750 (ie.group_cipher & ssid->group_cipher) &&
751 (ie.pairwise_cipher & ssid->pairwise_cipher) &&
752 (ie.key_mgmt & ssid->key_mgmt)) {
753 wpa_msg(wpa_s, MSG_DEBUG, "RSN: using IEEE 802.11i/D9.0");
754 proto = WPA_PROTO_RSN;
755 } else if (bss_wpa && (ssid->proto & WPA_PROTO_WPA) &&
756 wpa_parse_wpa_ie(bss_wpa, 2 +bss_wpa[1], &ie) == 0 &&
757 (ie.group_cipher & ssid->group_cipher) &&
758 (ie.pairwise_cipher & ssid->pairwise_cipher) &&
759 (ie.key_mgmt & ssid->key_mgmt)) {
760 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using IEEE 802.11i/D3.0");
761 proto = WPA_PROTO_WPA;
763 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select WPA/RSN");
766 if (ssid->proto & WPA_PROTO_RSN)
767 proto = WPA_PROTO_RSN;
769 proto = WPA_PROTO_WPA;
770 if (wpa_supplicant_suites_from_ai(wpa_s, ssid, &ie) < 0) {
771 os_memset(&ie, 0, sizeof(ie));
772 ie.group_cipher = ssid->group_cipher;
773 ie.pairwise_cipher = ssid->pairwise_cipher;
774 ie.key_mgmt = ssid->key_mgmt;
775 #ifdef CONFIG_IEEE80211W
776 ie.mgmt_group_cipher =
777 ssid->ieee80211w != NO_IEEE80211W ?
778 WPA_CIPHER_AES_128_CMAC : 0;
779 #endif /* CONFIG_IEEE80211W */
780 wpa_printf(MSG_DEBUG, "WPA: Set cipher suites based "
786 wpa_printf(MSG_DEBUG, "WPA: Selected cipher suites: group %d "
787 "pairwise %d key_mgmt %d proto %d",
788 ie.group_cipher, ie.pairwise_cipher, ie.key_mgmt, proto);
789 #ifdef CONFIG_IEEE80211W
790 if (ssid->ieee80211w) {
791 wpa_printf(MSG_DEBUG, "WPA: Selected mgmt group cipher %d",
792 ie.mgmt_group_cipher);
794 #endif /* CONFIG_IEEE80211W */
796 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PROTO, proto);
797 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED,
798 !!(ssid->proto & WPA_PROTO_RSN));
800 if (bss || !wpa_s->ap_ies_from_associnfo) {
801 if (wpa_sm_set_ap_wpa_ie(wpa_s->wpa, bss_wpa,
802 bss_wpa ? 2 + bss_wpa[1] : 0) ||
803 wpa_sm_set_ap_rsn_ie(wpa_s->wpa, bss_rsn,
804 bss_rsn ? 2 + bss_rsn[1] : 0))
808 sel = ie.group_cipher & ssid->group_cipher;
809 if (sel & WPA_CIPHER_CCMP) {
810 wpa_s->group_cipher = WPA_CIPHER_CCMP;
811 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using GTK CCMP");
812 } else if (sel & WPA_CIPHER_TKIP) {
813 wpa_s->group_cipher = WPA_CIPHER_TKIP;
814 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using GTK TKIP");
815 } else if (sel & WPA_CIPHER_WEP104) {
816 wpa_s->group_cipher = WPA_CIPHER_WEP104;
817 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using GTK WEP104");
818 } else if (sel & WPA_CIPHER_WEP40) {
819 wpa_s->group_cipher = WPA_CIPHER_WEP40;
820 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using GTK WEP40");
822 wpa_printf(MSG_WARNING, "WPA: Failed to select group cipher.");
826 sel = ie.pairwise_cipher & ssid->pairwise_cipher;
827 if (sel & WPA_CIPHER_CCMP) {
828 wpa_s->pairwise_cipher = WPA_CIPHER_CCMP;
829 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using PTK CCMP");
830 } else if (sel & WPA_CIPHER_TKIP) {
831 wpa_s->pairwise_cipher = WPA_CIPHER_TKIP;
832 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using PTK TKIP");
833 } else if (sel & WPA_CIPHER_NONE) {
834 wpa_s->pairwise_cipher = WPA_CIPHER_NONE;
835 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using PTK NONE");
837 wpa_printf(MSG_WARNING, "WPA: Failed to select pairwise "
842 sel = ie.key_mgmt & ssid->key_mgmt;
844 #ifdef CONFIG_IEEE80211R
845 } else if (sel & WPA_KEY_MGMT_FT_IEEE8021X) {
846 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_IEEE8021X;
847 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/802.1X");
848 } else if (sel & WPA_KEY_MGMT_FT_PSK) {
849 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_PSK;
850 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/PSK");
851 #endif /* CONFIG_IEEE80211R */
852 #ifdef CONFIG_IEEE80211W
853 } else if (sel & WPA_KEY_MGMT_IEEE8021X_SHA256) {
854 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SHA256;
855 wpa_msg(wpa_s, MSG_DEBUG,
856 "WPA: using KEY_MGMT 802.1X with SHA256");
857 } else if (sel & WPA_KEY_MGMT_PSK_SHA256) {
858 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK_SHA256;
859 wpa_msg(wpa_s, MSG_DEBUG,
860 "WPA: using KEY_MGMT PSK with SHA256");
861 #endif /* CONFIG_IEEE80211W */
862 } else if (sel & WPA_KEY_MGMT_IEEE8021X) {
863 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X;
864 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT 802.1X");
865 } else if (sel & WPA_KEY_MGMT_PSK) {
866 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK;
867 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-PSK");
868 } else if (sel & WPA_KEY_MGMT_WPA_NONE) {
869 wpa_s->key_mgmt = WPA_KEY_MGMT_WPA_NONE;
870 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-NONE");
872 wpa_printf(MSG_WARNING, "WPA: Failed to select authenticated "
873 "key management type.");
877 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
878 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
879 wpa_s->pairwise_cipher);
880 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
882 #ifdef CONFIG_IEEE80211W
883 sel = ie.mgmt_group_cipher;
884 if (ssid->ieee80211w == NO_IEEE80211W ||
885 !(ie.capabilities & WPA_CAPABILITY_MFPC))
887 if (sel & WPA_CIPHER_AES_128_CMAC) {
888 wpa_s->mgmt_group_cipher = WPA_CIPHER_AES_128_CMAC;
889 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
892 wpa_s->mgmt_group_cipher = 0;
893 wpa_msg(wpa_s, MSG_DEBUG, "WPA: not using MGMT group cipher");
895 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
896 wpa_s->mgmt_group_cipher);
897 #endif /* CONFIG_IEEE80211W */
899 if (wpa_sm_set_assoc_wpa_ie_default(wpa_s->wpa, wpa_ie, wpa_ie_len)) {
900 wpa_printf(MSG_WARNING, "WPA: Failed to generate WPA IE.");
905 (WPA_KEY_MGMT_PSK | WPA_KEY_MGMT_FT_PSK | WPA_KEY_MGMT_PSK_SHA256))
906 wpa_sm_set_pmk(wpa_s->wpa, ssid->psk, PMK_LEN);
908 wpa_sm_set_pmk_from_pmksa(wpa_s->wpa);
915 * wpa_supplicant_associate - Request association
916 * @wpa_s: Pointer to wpa_supplicant data
917 * @bss: Scan results for the selected BSS, or %NULL if not available
918 * @ssid: Configuration data for the selected network
920 * This function is used to request %wpa_supplicant to associate with a BSS.
922 void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
923 struct wpa_scan_res *bss, struct wpa_ssid *ssid)
927 int use_crypt, ret, i;
928 int algs = AUTH_ALG_OPEN_SYSTEM;
929 wpa_cipher cipher_pairwise, cipher_group;
930 struct wpa_driver_associate_params params;
931 int wep_keys_set = 0;
932 struct wpa_driver_capa capa;
933 int assoc_failed = 0;
935 wpa_s->reassociate = 0;
937 #ifdef CONFIG_IEEE80211R
939 #endif /* CONFIG_IEEE80211R */
940 const u8 *ie = wpa_scan_get_ie(bss, WLAN_EID_SSID);
941 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with " MACSTR
942 " (SSID='%s' freq=%d MHz)", MAC2STR(bss->bssid),
943 ie ? wpa_ssid_txt(ie + 2, ie[1]) : "", bss->freq);
944 os_memset(wpa_s->bssid, 0, ETH_ALEN);
945 os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN);
946 #ifdef CONFIG_IEEE80211R
947 ie = wpa_scan_get_ie(bss, WLAN_EID_MOBILITY_DOMAIN);
948 if (ie && ie[1] >= MOBILITY_DOMAIN_ID_LEN)
950 wpa_sm_set_ft_params(wpa_s->wpa, md, NULL, 0, NULL);
952 /* Prepare for the next transition */
953 wpa_ft_prepare_auth_request(wpa_s->wpa);
955 #endif /* CONFIG_IEEE80211R */
957 } else if ((ssid->ssid == NULL || ssid->ssid_len == 0) &&
958 wpa_s->conf->ap_scan == 2 &&
959 (ssid->key_mgmt & WPA_KEY_MGMT_WPS)) {
960 /* Use ap_scan==1 style network selection to find the network
963 wpa_s->reassociate = 1;
964 wpa_supplicant_req_scan(wpa_s, 0, 0);
966 #endif /* CONFIG_WPS */
968 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with SSID '%s'",
969 wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
970 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
972 wpa_supplicant_cancel_scan(wpa_s);
974 /* Starting new association, so clear the possibly used WPA IE from the
975 * previous association. */
976 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
978 if (wpa_drv_set_mode(wpa_s, ssid->mode)) {
979 wpa_printf(MSG_WARNING, "Failed to set operating mode");
983 #ifdef IEEE8021X_EAPOL
984 if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
986 if (ssid->non_leap == 0)
987 algs = AUTH_ALG_LEAP;
989 algs |= AUTH_ALG_LEAP;
992 #endif /* IEEE8021X_EAPOL */
993 wpa_printf(MSG_DEBUG, "Automatic auth_alg selection: 0x%x", algs);
994 if (ssid->auth_alg) {
996 if (ssid->auth_alg & WPA_AUTH_ALG_OPEN)
997 algs |= AUTH_ALG_OPEN_SYSTEM;
998 if (ssid->auth_alg & WPA_AUTH_ALG_SHARED)
999 algs |= AUTH_ALG_SHARED_KEY;
1000 if (ssid->auth_alg & WPA_AUTH_ALG_LEAP)
1001 algs |= AUTH_ALG_LEAP;
1002 wpa_printf(MSG_DEBUG, "Overriding auth_alg selection: 0x%x",
1005 wpa_drv_set_auth_alg(wpa_s, algs);
1007 if (bss && (wpa_scan_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE) ||
1008 wpa_scan_get_ie(bss, WLAN_EID_RSN)) &&
1009 (ssid->key_mgmt & (WPA_KEY_MGMT_IEEE8021X | WPA_KEY_MGMT_PSK |
1010 WPA_KEY_MGMT_FT_IEEE8021X |
1011 WPA_KEY_MGMT_FT_PSK |
1012 WPA_KEY_MGMT_IEEE8021X_SHA256 |
1013 WPA_KEY_MGMT_PSK_SHA256))) {
1014 int try_opportunistic;
1015 try_opportunistic = ssid->proactive_key_caching &&
1016 (ssid->proto & WPA_PROTO_RSN);
1017 if (pmksa_cache_set_current(wpa_s->wpa, NULL, bss->bssid,
1018 wpa_s->current_ssid,
1019 try_opportunistic) == 0)
1020 eapol_sm_notify_pmkid_attempt(wpa_s->eapol, 1);
1021 wpa_ie_len = sizeof(wpa_ie);
1022 if (wpa_supplicant_set_suites(wpa_s, bss, ssid,
1023 wpa_ie, &wpa_ie_len)) {
1024 wpa_printf(MSG_WARNING, "WPA: Failed to set WPA key "
1025 "management and encryption suites");
1028 } else if (ssid->key_mgmt &
1029 (WPA_KEY_MGMT_PSK | WPA_KEY_MGMT_IEEE8021X |
1030 WPA_KEY_MGMT_WPA_NONE | WPA_KEY_MGMT_FT_PSK |
1031 WPA_KEY_MGMT_FT_IEEE8021X | WPA_KEY_MGMT_PSK_SHA256 |
1032 WPA_KEY_MGMT_IEEE8021X_SHA256)) {
1033 wpa_ie_len = sizeof(wpa_ie);
1034 if (wpa_supplicant_set_suites(wpa_s, NULL, ssid,
1035 wpa_ie, &wpa_ie_len)) {
1036 wpa_printf(MSG_WARNING, "WPA: Failed to set WPA key "
1037 "management and encryption suites (no scan "
1042 } else if (ssid->key_mgmt & WPA_KEY_MGMT_WPS) {
1043 struct wpabuf *wps_ie;
1044 wps_ie = wps_build_assoc_req_ie(wpas_wps_get_req_type(ssid));
1045 if (wps_ie && wpabuf_len(wps_ie) <= sizeof(wpa_ie)) {
1046 wpa_ie_len = wpabuf_len(wps_ie);
1047 os_memcpy(wpa_ie, wpabuf_head(wps_ie), wpa_ie_len);
1050 wpabuf_free(wps_ie);
1051 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
1052 #endif /* CONFIG_WPS */
1054 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
1058 wpa_clear_keys(wpa_s, bss ? bss->bssid : NULL);
1060 cipher_pairwise = cipher_suite2driver(wpa_s->pairwise_cipher);
1061 cipher_group = cipher_suite2driver(wpa_s->group_cipher);
1062 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
1063 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1064 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE)
1066 if (wpa_set_wep_keys(wpa_s, ssid)) {
1071 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS)
1074 #ifdef IEEE8021X_EAPOL
1075 if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1076 if ((ssid->eapol_flags &
1077 (EAPOL_FLAG_REQUIRE_KEY_UNICAST |
1078 EAPOL_FLAG_REQUIRE_KEY_BROADCAST)) == 0 &&
1082 /* Assume that dynamic WEP-104 keys will be used and
1083 * set cipher suites in order for drivers to expect
1085 cipher_pairwise = cipher_group = CIPHER_WEP104;
1088 #endif /* IEEE8021X_EAPOL */
1090 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
1091 /* Set the key before (and later after) association */
1092 wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
1095 wpa_drv_set_drop_unencrypted(wpa_s, use_crypt);
1096 wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING);
1097 os_memset(¶ms, 0, sizeof(params));
1099 const u8 *ie = wpa_scan_get_ie(bss, WLAN_EID_SSID);
1100 params.bssid = bss->bssid;
1101 params.ssid = ie ? ie + 2 : (u8 *) "";
1102 params.ssid_len = ie ? ie[1] : 0;
1103 params.freq = bss->freq;
1105 params.ssid = ssid->ssid;
1106 params.ssid_len = ssid->ssid_len;
1108 if (ssid->mode == 1 && ssid->frequency > 0 && params.freq == 0)
1109 params.freq = ssid->frequency; /* Initial channel for IBSS */
1110 params.wpa_ie = wpa_ie;
1111 params.wpa_ie_len = wpa_ie_len;
1112 params.pairwise_suite = cipher_pairwise;
1113 params.group_suite = cipher_group;
1114 params.key_mgmt_suite = key_mgmt2driver(wpa_s->key_mgmt);
1115 params.auth_alg = algs;
1116 params.mode = ssid->mode;
1117 for (i = 0; i < NUM_WEP_KEYS; i++) {
1118 if (ssid->wep_key_len[i])
1119 params.wep_key[i] = ssid->wep_key[i];
1120 params.wep_key_len[i] = ssid->wep_key_len[i];
1122 params.wep_tx_keyidx = ssid->wep_tx_keyidx;
1124 if (wpa_s->driver_4way_handshake &&
1125 (params.key_mgmt_suite == KEY_MGMT_PSK ||
1126 params.key_mgmt_suite == KEY_MGMT_FT_PSK)) {
1127 params.passphrase = ssid->passphrase;
1129 params.psk = ssid->psk;
1132 #ifdef CONFIG_IEEE80211W
1133 switch (ssid->ieee80211w) {
1135 params.mgmt_frame_protection = NO_MGMT_FRAME_PROTECTION;
1137 case IEEE80211W_OPTIONAL:
1138 params.mgmt_frame_protection = MGMT_FRAME_PROTECTION_OPTIONAL;
1140 case IEEE80211W_REQUIRED:
1141 params.mgmt_frame_protection = MGMT_FRAME_PROTECTION_REQUIRED;
1144 if (ssid->ieee80211w != NO_IEEE80211W && bss) {
1145 const u8 *rsn = wpa_scan_get_ie(bss, WLAN_EID_RSN);
1146 struct wpa_ie_data ie;
1147 if (rsn && wpa_parse_wpa_ie(rsn, 2 + rsn[1], &ie) == 0 &&
1149 (WPA_CAPABILITY_MFPC | WPA_CAPABILITY_MFPR)) {
1150 wpa_printf(MSG_DEBUG, "WPA: Selected AP supports MFP: "
1152 params.mgmt_frame_protection =
1153 MGMT_FRAME_PROTECTION_REQUIRED;
1156 #endif /* CONFIG_IEEE80211W */
1158 if (wpa_s->use_client_mlme)
1159 ret = ieee80211_sta_associate(wpa_s, ¶ms);
1161 ret = wpa_drv_associate(wpa_s, ¶ms);
1163 wpa_msg(wpa_s, MSG_INFO, "Association request to the driver "
1165 /* try to continue anyway; new association will be tried again
1170 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
1171 /* Set the key after the association just in case association
1172 * cleared the previously configured key. */
1173 wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
1174 /* No need to timeout authentication since there is no key
1176 wpa_supplicant_cancel_auth_timeout(wpa_s);
1177 wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
1178 #ifdef CONFIG_IBSS_RSN
1179 } else if (ssid->mode == IEEE80211_MODE_IBSS &&
1180 wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
1181 wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
1182 ibss_rsn_set_psk(wpa_s->ibss_rsn, ssid->psk);
1184 * RSN IBSS authentication is per-STA and we can disable the
1185 * per-BSSID authentication.
1187 wpa_supplicant_cancel_auth_timeout(wpa_s);
1188 wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
1189 #endif /* CONFIG_IBSS_RSN */
1191 /* Timeout for IEEE 802.11 authentication and association */
1195 /* give IBSS a bit more time */
1196 timeout = ssid->mode ? 10 : 5;
1197 } else if (wpa_s->conf->ap_scan == 1) {
1198 /* give IBSS a bit more time */
1199 timeout = ssid->mode ? 20 : 10;
1201 wpa_supplicant_req_auth_timeout(wpa_s, timeout, 0);
1204 if (wep_keys_set && wpa_drv_get_capa(wpa_s, &capa) == 0 &&
1205 capa.flags & WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC) {
1206 /* Set static WEP keys again */
1207 wpa_set_wep_keys(wpa_s, ssid);
1210 if (wpa_s->current_ssid && wpa_s->current_ssid != ssid) {
1212 * Do not allow EAP session resumption between different
1213 * network configurations.
1215 eapol_sm_invalidate_cached_session(wpa_s->eapol);
1217 wpa_s->current_ssid = ssid;
1218 wpa_supplicant_rsn_supp_set_config(wpa_s, wpa_s->current_ssid);
1219 wpa_supplicant_initiate_eapol(wpa_s);
1224 * wpa_supplicant_disassociate - Disassociate the current connection
1225 * @wpa_s: Pointer to wpa_supplicant data
1226 * @reason_code: IEEE 802.11 reason code for the disassociate frame
1228 * This function is used to request %wpa_supplicant to disassociate with the
1231 void wpa_supplicant_disassociate(struct wpa_supplicant *wpa_s,
1235 if (!is_zero_ether_addr(wpa_s->bssid)) {
1236 if (wpa_s->use_client_mlme)
1237 ieee80211_sta_disassociate(wpa_s, reason_code);
1239 wpa_drv_disassociate(wpa_s, wpa_s->bssid, reason_code);
1240 addr = wpa_s->bssid;
1242 wpa_clear_keys(wpa_s, addr);
1243 wpa_supplicant_mark_disassoc(wpa_s);
1244 wpa_s->current_ssid = NULL;
1245 wpa_sm_set_config(wpa_s->wpa, NULL);
1246 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
1251 * wpa_supplicant_deauthenticate - Deauthenticate the current connection
1252 * @wpa_s: Pointer to wpa_supplicant data
1253 * @reason_code: IEEE 802.11 reason code for the deauthenticate frame
1255 * This function is used to request %wpa_supplicant to deauthenticate from the
1258 void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
1262 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
1263 if (!is_zero_ether_addr(wpa_s->bssid)) {
1264 if (wpa_s->use_client_mlme)
1265 ieee80211_sta_deauthenticate(wpa_s, reason_code);
1267 wpa_drv_deauthenticate(wpa_s, wpa_s->bssid,
1269 addr = wpa_s->bssid;
1271 wpa_clear_keys(wpa_s, addr);
1272 wpa_s->current_ssid = NULL;
1273 wpa_sm_set_config(wpa_s->wpa, NULL);
1274 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
1275 eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
1276 eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
1280 static int wpa_supplicant_get_scan_results_old(struct wpa_supplicant *wpa_s)
1282 #define SCAN_AP_LIMIT 128
1283 struct wpa_scan_result *results;
1285 struct wpa_scan_results *res;
1287 results = os_malloc(SCAN_AP_LIMIT * sizeof(struct wpa_scan_result));
1288 if (results == NULL) {
1289 wpa_printf(MSG_WARNING, "Failed to allocate memory for scan "
1294 num = wpa_drv_get_scan_results(wpa_s, results, SCAN_AP_LIMIT);
1295 wpa_printf(MSG_DEBUG, "Scan results: %d", num);
1297 wpa_printf(MSG_DEBUG, "Failed to get scan results");
1301 if (num > SCAN_AP_LIMIT) {
1302 wpa_printf(MSG_INFO, "Not enough room for all APs (%d < %d)",
1303 num, SCAN_AP_LIMIT);
1304 num = SCAN_AP_LIMIT;
1307 wpa_scan_results_free(wpa_s->scan_res);
1308 wpa_s->scan_res = NULL;
1310 /* Convert old scan result data structure to the new one */
1311 res = os_zalloc(sizeof(*res));
1316 res->res = os_zalloc(num * sizeof(struct wpa_scan_res *));
1317 if (res->res == NULL) {
1323 for (i = 0; i < num; i++) {
1324 struct wpa_scan_result *bss = &results[i];
1325 struct wpa_scan_res *r;
1329 ie_len = 2 + bss->ssid_len + bss->rsn_ie_len + bss->wpa_ie_len;
1332 if (bss->mdie_present)
1335 r = os_zalloc(sizeof(*r) + ie_len);
1339 os_memcpy(r->bssid, bss->bssid, ETH_ALEN);
1340 r->freq = bss->freq;
1341 r->caps = bss->caps;
1342 r->qual = bss->qual;
1343 r->noise = bss->noise;
1344 r->level = bss->level;
1348 pos = (u8 *) (r + 1);
1351 *pos++ = WLAN_EID_SSID;
1352 *pos++ = bss->ssid_len;
1353 os_memcpy(pos, bss->ssid, bss->ssid_len);
1354 pos += bss->ssid_len;
1357 /* Fake Supported Rate IE to include max rate */
1358 *pos++ = WLAN_EID_SUPP_RATES;
1360 *pos++ = bss->maxrate;
1363 if (bss->rsn_ie_len) {
1364 os_memcpy(pos, bss->rsn_ie, bss->rsn_ie_len);
1365 pos += bss->rsn_ie_len;
1368 if (bss->mdie_present) {
1369 os_memcpy(pos, bss->mdie, 5);
1373 if (bss->wpa_ie_len) {
1374 os_memcpy(pos, bss->wpa_ie, bss->wpa_ie_len);
1375 pos += bss->wpa_ie_len;
1378 res->res[res->num++] = r;
1382 wpa_s->scan_res = res;
1389 * wpa_supplicant_get_scan_results - Get scan results
1390 * @wpa_s: Pointer to wpa_supplicant data
1391 * Returns: 0 on success, -1 on failure
1393 * This function is request the current scan results from the driver and stores
1394 * a local copy of the results in wpa_s->scan_res.
1396 int wpa_supplicant_get_scan_results(struct wpa_supplicant *wpa_s)
1400 if (wpa_s->use_client_mlme) {
1401 wpa_scan_results_free(wpa_s->scan_res);
1402 wpa_s->scan_res = ieee80211_sta_get_scan_results(wpa_s);
1403 if (wpa_s->scan_res == NULL) {
1404 wpa_printf(MSG_DEBUG, "Failed to get scan results");
1408 } else if (wpa_s->driver->get_scan_results2 == NULL)
1409 ret = wpa_supplicant_get_scan_results_old(wpa_s);
1411 wpa_scan_results_free(wpa_s->scan_res);
1412 wpa_s->scan_res = wpa_drv_get_scan_results2(wpa_s);
1413 if (wpa_s->scan_res == NULL) {
1414 wpa_printf(MSG_DEBUG, "Failed to get scan results");
1420 if (wpa_s->scan_res)
1421 wpa_scan_sort_results(wpa_s->scan_res);
1428 * wpa_supplicant_get_ssid - Get a pointer to the current network structure
1429 * @wpa_s: Pointer to wpa_supplicant data
1430 * Returns: A pointer to the current network structure or %NULL on failure
1432 struct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s)
1434 struct wpa_ssid *entry;
1435 u8 ssid[MAX_SSID_LEN];
1441 if (wpa_s->use_client_mlme) {
1442 if (ieee80211_sta_get_ssid(wpa_s, ssid, &ssid_len)) {
1443 wpa_printf(MSG_WARNING, "Could not read SSID from "
1448 res = wpa_drv_get_ssid(wpa_s, ssid);
1450 wpa_printf(MSG_WARNING, "Could not read SSID from "
1457 if (wpa_s->use_client_mlme)
1458 os_memcpy(bssid, wpa_s->bssid, ETH_ALEN);
1459 else if (wpa_drv_get_bssid(wpa_s, bssid) < 0) {
1460 wpa_printf(MSG_WARNING, "Could not read BSSID from driver.");
1464 wired = wpa_s->conf->ap_scan == 0 && wpa_s->driver &&
1465 IS_WIRED(wpa_s->driver);
1467 entry = wpa_s->conf->ssid;
1469 if (!entry->disabled &&
1470 ((ssid_len == entry->ssid_len &&
1471 os_memcmp(ssid, entry->ssid, ssid_len) == 0) || wired) &&
1472 (!entry->bssid_set ||
1473 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
1476 if (!entry->disabled &&
1477 (entry->key_mgmt & WPA_KEY_MGMT_WPS) &&
1478 (entry->ssid == NULL || entry->ssid_len == 0) &&
1479 (!entry->bssid_set ||
1480 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
1482 #endif /* CONFIG_WPS */
1483 entry = entry->next;
1490 static int wpa_supplicant_set_driver(struct wpa_supplicant *wpa_s,
1498 if (wpa_supplicant_drivers[0] == NULL) {
1499 wpa_printf(MSG_ERROR, "No driver interfaces build into "
1505 /* default to first driver in the list */
1506 wpa_s->driver = wpa_supplicant_drivers[0];
1510 for (i = 0; wpa_supplicant_drivers[i]; i++) {
1511 if (os_strcmp(name, wpa_supplicant_drivers[i]->name) == 0) {
1512 wpa_s->driver = wpa_supplicant_drivers[i];
1517 wpa_printf(MSG_ERROR, "Unsupported driver '%s'.\n", name);
1522 void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr,
1523 const u8 *buf, size_t len)
1525 struct wpa_supplicant *wpa_s = ctx;
1527 wpa_printf(MSG_DEBUG, "RX EAPOL from " MACSTR, MAC2STR(src_addr));
1528 wpa_hexdump(MSG_MSGDUMP, "RX EAPOL", buf, len);
1530 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE) {
1531 wpa_printf(MSG_DEBUG, "Ignored received EAPOL frame since "
1532 "no key management is configured");
1536 if (wpa_s->eapol_received == 0 &&
1537 (!wpa_s->driver_4way_handshake ||
1538 !wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) ||
1539 wpa_s->wpa_state != WPA_COMPLETED)) {
1540 /* Timeout for completing IEEE 802.1X and WPA authentication */
1541 wpa_supplicant_req_auth_timeout(
1543 (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) ||
1544 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA ||
1545 wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) ?
1548 wpa_s->eapol_received++;
1550 if (wpa_s->countermeasures) {
1551 wpa_printf(MSG_INFO, "WPA: Countermeasures - dropped EAPOL "
1556 #ifdef CONFIG_IBSS_RSN
1557 if (wpa_s->current_ssid &&
1558 wpa_s->current_ssid->mode == IEEE80211_MODE_IBSS) {
1559 ibss_rsn_rx_eapol(wpa_s->ibss_rsn, src_addr, buf, len);
1562 #endif /* CONFIG_IBSS_RSN */
1564 /* Source address of the incoming EAPOL frame could be compared to the
1565 * current BSSID. However, it is possible that a centralized
1566 * Authenticator could be using another MAC address than the BSSID of
1567 * an AP, so just allow any address to be used for now. The replies are
1568 * still sent to the current BSSID (if available), though. */
1570 os_memcpy(wpa_s->last_eapol_src, src_addr, ETH_ALEN);
1571 if (!wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) &&
1572 eapol_sm_rx_eapol(wpa_s->eapol, src_addr, buf, len) > 0)
1574 wpa_drv_poll(wpa_s);
1575 if (!wpa_s->driver_4way_handshake)
1576 wpa_sm_rx_eapol(wpa_s->wpa, src_addr, buf, len);
1577 else if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt)) {
1579 * Set portValid = TRUE here since we are going to skip 4-way
1580 * handshake processing which would normally set portValid. We
1581 * need this to allow the EAPOL state machines to be completed
1582 * without going through EAPOL-Key handshake.
1584 eapol_sm_notify_portValid(wpa_s->eapol, TRUE);
1589 void wpa_supplicant_sta_free_hw_features(struct wpa_hw_modes *hw_features,
1590 size_t num_hw_features)
1592 ieee80211_sta_free_hw_features(hw_features, num_hw_features);
1596 void wpa_supplicant_sta_rx(void *ctx, const u8 *buf, size_t len,
1597 struct ieee80211_rx_status *rx_status)
1599 struct wpa_supplicant *wpa_s = ctx;
1600 ieee80211_sta_rx(wpa_s, buf, len, rx_status);
1605 * wpa_supplicant_driver_init - Initialize driver interface parameters
1606 * @wpa_s: Pointer to wpa_supplicant data
1607 * Returns: 0 on success, -1 on failure
1609 * This function is called to initialize driver interface parameters.
1610 * wpa_drv_init() must have been called before this function to initialize the
1613 int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s)
1615 static int interface_count = 0;
1617 if (wpa_s->driver->send_eapol) {
1618 const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
1620 os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
1622 wpa_s->l2 = l2_packet_init(wpa_s->ifname,
1623 wpa_drv_get_mac_addr(wpa_s),
1625 wpa_supplicant_rx_eapol, wpa_s, 0);
1626 if (wpa_s->l2 == NULL)
1630 if (wpa_s->l2 && l2_packet_get_own_addr(wpa_s->l2, wpa_s->own_addr)) {
1631 wpa_printf(MSG_ERROR, "Failed to get own L2 address");
1635 wpa_printf(MSG_DEBUG, "Own MAC address: " MACSTR,
1636 MAC2STR(wpa_s->own_addr));
1638 if (wpa_s->bridge_ifname[0]) {
1639 wpa_printf(MSG_DEBUG, "Receiving packets from bridge interface"
1640 " '%s'", wpa_s->bridge_ifname);
1641 wpa_s->l2_br = l2_packet_init(wpa_s->bridge_ifname,
1644 wpa_supplicant_rx_eapol, wpa_s,
1646 if (wpa_s->l2_br == NULL) {
1647 wpa_printf(MSG_ERROR, "Failed to open l2_packet "
1648 "connection for the bridge interface '%s'",
1649 wpa_s->bridge_ifname);
1654 /* Backwards compatibility call to set_wpa() handler. This is called
1655 * only just after init and just before deinit, so these handler can be
1656 * used to implement same functionality. */
1657 if (wpa_drv_set_wpa(wpa_s, 1) < 0) {
1658 struct wpa_driver_capa capa;
1659 if (wpa_drv_get_capa(wpa_s, &capa) < 0 ||
1660 !(capa.flags & (WPA_DRIVER_CAPA_KEY_MGMT_WPA |
1661 WPA_DRIVER_CAPA_KEY_MGMT_WPA2))) {
1662 wpa_printf(MSG_DEBUG, "Driver does not support WPA.");
1663 /* Continue to allow non-WPA modes to be used. */
1665 wpa_printf(MSG_ERROR, "Failed to enable WPA in the "
1671 wpa_clear_keys(wpa_s, NULL);
1673 /* Make sure that TKIP countermeasures are not left enabled (could
1674 * happen if wpa_supplicant is killed during countermeasures. */
1675 wpa_drv_set_countermeasures(wpa_s, 0);
1677 wpa_drv_set_drop_unencrypted(wpa_s, 1);
1679 wpa_printf(MSG_DEBUG, "RSN: flushing PMKID list in the driver");
1680 wpa_drv_flush_pmkid(wpa_s);
1682 wpa_s->prev_scan_ssid = BROADCAST_SSID_SCAN;
1683 wpa_supplicant_req_scan(wpa_s, interface_count, 100000);
1690 static int wpa_supplicant_daemon(const char *pid_file)
1692 wpa_printf(MSG_DEBUG, "Daemonize..");
1693 return os_daemonize(pid_file);
1697 static struct wpa_supplicant * wpa_supplicant_alloc(void)
1699 struct wpa_supplicant *wpa_s;
1701 wpa_s = os_zalloc(sizeof(*wpa_s));
1704 wpa_s->scan_req = 1;
1710 static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
1711 struct wpa_interface *iface)
1713 wpa_printf(MSG_DEBUG, "Initializing interface '%s' conf '%s' driver "
1714 "'%s' ctrl_interface '%s' bridge '%s'", iface->ifname,
1715 iface->confname ? iface->confname : "N/A",
1716 iface->driver ? iface->driver : "default",
1717 iface->ctrl_interface ? iface->ctrl_interface : "N/A",
1718 iface->bridge_ifname ? iface->bridge_ifname : "N/A");
1720 if (wpa_supplicant_set_driver(wpa_s, iface->driver) < 0) {
1724 if (iface->confname) {
1725 #ifdef CONFIG_BACKEND_FILE
1726 wpa_s->confname = os_rel2abs_path(iface->confname);
1727 if (wpa_s->confname == NULL) {
1728 wpa_printf(MSG_ERROR, "Failed to get absolute path "
1729 "for configuration file '%s'.",
1733 wpa_printf(MSG_DEBUG, "Configuration file '%s' -> '%s'",
1734 iface->confname, wpa_s->confname);
1735 #else /* CONFIG_BACKEND_FILE */
1736 wpa_s->confname = os_strdup(iface->confname);
1737 #endif /* CONFIG_BACKEND_FILE */
1738 wpa_s->conf = wpa_config_read(wpa_s->confname);
1739 if (wpa_s->conf == NULL) {
1740 wpa_printf(MSG_ERROR, "Failed to read or parse "
1741 "configuration '%s'.", wpa_s->confname);
1746 * Override ctrl_interface and driver_param if set on command
1749 if (iface->ctrl_interface) {
1750 os_free(wpa_s->conf->ctrl_interface);
1751 wpa_s->conf->ctrl_interface =
1752 os_strdup(iface->ctrl_interface);
1755 if (iface->driver_param) {
1756 os_free(wpa_s->conf->driver_param);
1757 wpa_s->conf->driver_param =
1758 os_strdup(iface->driver_param);
1761 wpa_s->conf = wpa_config_alloc_empty(iface->ctrl_interface,
1762 iface->driver_param);
1764 if (wpa_s->conf == NULL) {
1765 wpa_printf(MSG_ERROR, "\nNo configuration found.");
1769 if (iface->ifname == NULL) {
1770 wpa_printf(MSG_ERROR, "\nInterface name is required.");
1773 if (os_strlen(iface->ifname) >= sizeof(wpa_s->ifname)) {
1774 wpa_printf(MSG_ERROR, "\nToo long interface name '%s'.",
1778 os_strlcpy(wpa_s->ifname, iface->ifname, sizeof(wpa_s->ifname));
1780 if (iface->bridge_ifname) {
1781 if (os_strlen(iface->bridge_ifname) >=
1782 sizeof(wpa_s->bridge_ifname)) {
1783 wpa_printf(MSG_ERROR, "\nToo long bridge interface "
1784 "name '%s'.", iface->bridge_ifname);
1787 os_strlcpy(wpa_s->bridge_ifname, iface->bridge_ifname,
1788 sizeof(wpa_s->bridge_ifname));
1795 static int wpa_supplicant_init_iface2(struct wpa_supplicant *wpa_s)
1798 struct wpa_driver_capa capa;
1800 wpa_printf(MSG_DEBUG, "Initializing interface (2) '%s'",
1803 /* RSNA Supplicant Key Management - INITIALIZE */
1804 eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
1805 eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
1807 /* Initialize driver interface and register driver event handler before
1808 * L2 receive handler so that association events are processed before
1809 * EAPOL-Key packets if both become available for the same select()
1811 wpa_s->drv_priv = wpa_drv_init(wpa_s, wpa_s->ifname);
1812 if (wpa_s->drv_priv == NULL) {
1813 wpa_printf(MSG_ERROR, "Failed to initialize driver interface");
1816 if (wpa_drv_set_param(wpa_s, wpa_s->conf->driver_param) < 0) {
1817 wpa_printf(MSG_ERROR, "Driver interface rejected "
1818 "driver_param '%s'", wpa_s->conf->driver_param);
1822 ifname = wpa_drv_get_ifname(wpa_s);
1823 if (ifname && os_strcmp(ifname, wpa_s->ifname) != 0) {
1824 wpa_printf(MSG_DEBUG, "Driver interface replaced interface "
1825 "name with '%s'", ifname);
1826 os_strlcpy(wpa_s->ifname, ifname, sizeof(wpa_s->ifname));
1829 if (wpa_supplicant_init_wpa(wpa_s) < 0)
1832 wpa_sm_set_ifname(wpa_s->wpa, wpa_s->ifname,
1833 wpa_s->bridge_ifname[0] ? wpa_s->bridge_ifname :
1835 wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
1837 if (wpa_s->conf->dot11RSNAConfigPMKLifetime &&
1838 wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_LIFETIME,
1839 wpa_s->conf->dot11RSNAConfigPMKLifetime)) {
1840 wpa_printf(MSG_ERROR, "Invalid WPA parameter value for "
1841 "dot11RSNAConfigPMKLifetime");
1845 if (wpa_s->conf->dot11RSNAConfigPMKReauthThreshold &&
1846 wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_REAUTH_THRESHOLD,
1847 wpa_s->conf->dot11RSNAConfigPMKReauthThreshold)) {
1848 wpa_printf(MSG_ERROR, "Invalid WPA parameter value for "
1849 "dot11RSNAConfigPMKReauthThreshold");
1853 if (wpa_s->conf->dot11RSNAConfigSATimeout &&
1854 wpa_sm_set_param(wpa_s->wpa, RSNA_SA_TIMEOUT,
1855 wpa_s->conf->dot11RSNAConfigSATimeout)) {
1856 wpa_printf(MSG_ERROR, "Invalid WPA parameter value for "
1857 "dot11RSNAConfigSATimeout");
1861 if (wpa_supplicant_driver_init(wpa_s) < 0)
1864 if (wpa_s->conf->country[0] && wpa_s->conf->country[1] &&
1865 wpa_drv_set_country(wpa_s, wpa_s->conf->country)) {
1866 wpa_printf(MSG_DEBUG, "Failed to set country");
1870 wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
1872 if (wpas_wps_init(wpa_s))
1875 if (wpa_supplicant_init_eapol(wpa_s) < 0)
1877 wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
1879 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
1880 if (wpa_s->ctrl_iface == NULL) {
1881 wpa_printf(MSG_ERROR,
1882 "Failed to initialize control interface '%s'.\n"
1883 "You may have another wpa_supplicant process "
1884 "already running or the file was\n"
1885 "left by an unclean termination of wpa_supplicant "
1886 "in which case you will need\n"
1887 "to manually remove this file before starting "
1888 "wpa_supplicant again.\n",
1889 wpa_s->conf->ctrl_interface);
1893 if (wpa_drv_get_capa(wpa_s, &capa) == 0) {
1894 if (capa.flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME) {
1895 wpa_s->use_client_mlme = 1;
1896 if (ieee80211_sta_init(wpa_s))
1899 if (capa.flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE)
1900 wpa_s->driver_4way_handshake = 1;
1901 wpa_s->max_scan_ssids = capa.max_scan_ssids;
1904 #ifdef CONFIG_IBSS_RSN
1905 wpa_s->ibss_rsn = ibss_rsn_init(wpa_s);
1906 if (!wpa_s->ibss_rsn) {
1907 wpa_printf(MSG_DEBUG, "Failed to init IBSS RSN");
1910 #endif /* CONFIG_IBSS_RSN */
1916 static void wpa_supplicant_deinit_iface(struct wpa_supplicant *wpa_s)
1918 if (wpa_s->drv_priv) {
1919 wpa_supplicant_deauthenticate(wpa_s,
1920 WLAN_REASON_DEAUTH_LEAVING);
1922 /* Backwards compatibility call to set_wpa() handler. This is
1923 * called only just after init and just before deinit, so these
1924 * handler can be used to implement same functionality. */
1925 if (wpa_drv_set_wpa(wpa_s, 0) < 0) {
1926 wpa_printf(MSG_ERROR, "Failed to disable WPA in the "
1930 wpa_drv_set_drop_unencrypted(wpa_s, 0);
1931 wpa_drv_set_countermeasures(wpa_s, 0);
1932 wpa_clear_keys(wpa_s, NULL);
1935 wpas_dbus_unregister_iface(wpa_s);
1937 wpa_supplicant_cleanup(wpa_s);
1939 if (wpa_s->drv_priv)
1940 wpa_drv_deinit(wpa_s);
1945 * wpa_supplicant_add_iface - Add a new network interface
1946 * @global: Pointer to global data from wpa_supplicant_init()
1947 * @iface: Interface configuration options
1948 * Returns: Pointer to the created interface or %NULL on failure
1950 * This function is used to add new network interfaces for %wpa_supplicant.
1951 * This can be called before wpa_supplicant_run() to add interfaces before the
1952 * main event loop has been started. In addition, new interfaces can be added
1953 * dynamically while %wpa_supplicant is already running. This could happen,
1954 * e.g., when a hotplug network adapter is inserted.
1956 struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
1957 struct wpa_interface *iface)
1959 struct wpa_supplicant *wpa_s;
1961 if (global == NULL || iface == NULL)
1964 wpa_s = wpa_supplicant_alloc();
1968 if (wpa_supplicant_init_iface(wpa_s, iface) ||
1969 wpa_supplicant_init_iface2(wpa_s)) {
1970 wpa_printf(MSG_DEBUG, "Failed to add interface %s",
1972 wpa_supplicant_deinit_iface(wpa_s);
1977 wpa_s->global = global;
1979 /* Register the interface with the dbus control interface */
1980 if (wpas_dbus_register_iface(wpa_s)) {
1981 wpa_supplicant_deinit_iface(wpa_s);
1986 wpa_s->next = global->ifaces;
1987 global->ifaces = wpa_s;
1989 wpa_printf(MSG_DEBUG, "Added interface %s", wpa_s->ifname);
1996 * wpa_supplicant_remove_iface - Remove a network interface
1997 * @global: Pointer to global data from wpa_supplicant_init()
1998 * @wpa_s: Pointer to the network interface to be removed
1999 * Returns: 0 if interface was removed, -1 if interface was not found
2001 * This function can be used to dynamically remove network interfaces from
2002 * %wpa_supplicant, e.g., when a hotplug network adapter is ejected. In
2003 * addition, this function is used to remove all remaining interfaces when
2004 * %wpa_supplicant is terminated.
2006 int wpa_supplicant_remove_iface(struct wpa_global *global,
2007 struct wpa_supplicant *wpa_s)
2009 struct wpa_supplicant *prev;
2011 /* Remove interface from the global list of interfaces */
2012 prev = global->ifaces;
2013 if (prev == wpa_s) {
2014 global->ifaces = wpa_s->next;
2016 while (prev && prev->next != wpa_s)
2020 prev->next = wpa_s->next;
2023 wpa_printf(MSG_DEBUG, "Removing interface %s", wpa_s->ifname);
2025 wpa_supplicant_deinit_iface(wpa_s);
2033 * wpa_supplicant_get_iface - Get a new network interface
2034 * @global: Pointer to global data from wpa_supplicant_init()
2035 * @ifname: Interface name
2036 * Returns: Pointer to the interface or %NULL if not found
2038 struct wpa_supplicant * wpa_supplicant_get_iface(struct wpa_global *global,
2041 struct wpa_supplicant *wpa_s;
2043 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
2044 if (os_strcmp(wpa_s->ifname, ifname) == 0)
2052 * wpa_supplicant_init - Initialize %wpa_supplicant
2053 * @params: Parameters for %wpa_supplicant
2054 * Returns: Pointer to global %wpa_supplicant data, or %NULL on failure
2056 * This function is used to initialize %wpa_supplicant. After successful
2057 * initialization, the returned data pointer can be used to add and remove
2058 * network interfaces, and eventually, to deinitialize %wpa_supplicant.
2060 struct wpa_global * wpa_supplicant_init(struct wpa_params *params)
2062 struct wpa_global *global;
2068 wpa_debug_open_file(params->wpa_debug_file_path);
2070 ret = eap_peer_register_methods();
2072 wpa_printf(MSG_ERROR, "Failed to register EAP methods");
2074 wpa_printf(MSG_ERROR, "Two or more EAP methods used "
2075 "the same EAP type.");
2079 global = os_zalloc(sizeof(*global));
2082 global->params.daemonize = params->daemonize;
2083 global->params.wait_for_monitor = params->wait_for_monitor;
2084 global->params.dbus_ctrl_interface = params->dbus_ctrl_interface;
2085 if (params->pid_file)
2086 global->params.pid_file = os_strdup(params->pid_file);
2087 if (params->ctrl_interface)
2088 global->params.ctrl_interface =
2089 os_strdup(params->ctrl_interface);
2090 wpa_debug_level = global->params.wpa_debug_level =
2091 params->wpa_debug_level;
2092 wpa_debug_show_keys = global->params.wpa_debug_show_keys =
2093 params->wpa_debug_show_keys;
2094 wpa_debug_timestamp = global->params.wpa_debug_timestamp =
2095 params->wpa_debug_timestamp;
2097 if (eloop_init(global)) {
2098 wpa_printf(MSG_ERROR, "Failed to initialize event loop");
2099 wpa_supplicant_deinit(global);
2103 global->ctrl_iface = wpa_supplicant_global_ctrl_iface_init(global);
2104 if (global->ctrl_iface == NULL) {
2105 wpa_supplicant_deinit(global);
2109 if (global->params.dbus_ctrl_interface) {
2110 global->dbus_ctrl_iface =
2111 wpa_supplicant_dbus_ctrl_iface_init(global);
2112 if (global->dbus_ctrl_iface == NULL) {
2113 wpa_supplicant_deinit(global);
2118 for (i = 0; wpa_supplicant_drivers[i]; i++)
2119 global->drv_count++;
2120 if (global->drv_count == 0) {
2121 wpa_printf(MSG_ERROR, "No drivers enabled");
2122 wpa_supplicant_deinit(global);
2125 global->drv_priv = os_zalloc(global->drv_count * sizeof(void *));
2126 if (global->drv_priv == NULL) {
2127 wpa_supplicant_deinit(global);
2130 for (i = 0; wpa_supplicant_drivers[i]; i++) {
2131 if (!wpa_supplicant_drivers[i]->global_init)
2133 global->drv_priv[i] = wpa_supplicant_drivers[i]->global_init();
2134 if (global->drv_priv[i] == NULL) {
2135 wpa_printf(MSG_ERROR, "Failed to initialize driver "
2136 "'%s'", wpa_supplicant_drivers[i]->name);
2137 wpa_supplicant_deinit(global);
2147 * wpa_supplicant_run - Run the %wpa_supplicant main event loop
2148 * @global: Pointer to global data from wpa_supplicant_init()
2149 * Returns: 0 after successful event loop run, -1 on failure
2151 * This function starts the main event loop and continues running as long as
2152 * there are any remaining events. In most cases, this function is running as
2153 * long as the %wpa_supplicant process in still in use.
2155 int wpa_supplicant_run(struct wpa_global *global)
2157 struct wpa_supplicant *wpa_s;
2159 if (global->params.daemonize &&
2160 wpa_supplicant_daemon(global->params.pid_file))
2163 if (global->params.wait_for_monitor) {
2164 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
2165 if (wpa_s->ctrl_iface)
2166 wpa_supplicant_ctrl_iface_wait(
2170 eloop_register_signal_terminate(wpa_supplicant_terminate, NULL);
2171 eloop_register_signal_reconfig(wpa_supplicant_reconfig, NULL);
2180 * wpa_supplicant_deinit - Deinitialize %wpa_supplicant
2181 * @global: Pointer to global data from wpa_supplicant_init()
2183 * This function is called to deinitialize %wpa_supplicant and to free all
2184 * allocated resources. Remaining network interfaces will also be removed.
2186 void wpa_supplicant_deinit(struct wpa_global *global)
2193 while (global->ifaces)
2194 wpa_supplicant_remove_iface(global, global->ifaces);
2196 if (global->ctrl_iface)
2197 wpa_supplicant_global_ctrl_iface_deinit(global->ctrl_iface);
2198 if (global->dbus_ctrl_iface)
2199 wpa_supplicant_dbus_ctrl_iface_deinit(global->dbus_ctrl_iface);
2201 eap_peer_unregister_methods();
2203 for (i = 0; wpa_supplicant_drivers[i] && global->drv_priv; i++) {
2204 if (!global->drv_priv[i])
2206 wpa_supplicant_drivers[i]->global_deinit(global->drv_priv[i]);
2208 os_free(global->drv_priv);
2212 if (global->params.pid_file) {
2213 os_daemonize_terminate(global->params.pid_file);
2214 os_free(global->params.pid_file);
2216 os_free(global->params.ctrl_interface);
2219 wpa_debug_close_file();