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) {
1183 * RSN IBSS authentication is per-STA and we can disable the
1184 * per-BSSID authentication.
1186 wpa_supplicant_cancel_auth_timeout(wpa_s);
1187 wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
1188 #endif /* CONFIG_IBSS_RSN */
1190 /* Timeout for IEEE 802.11 authentication and association */
1194 /* give IBSS a bit more time */
1195 timeout = ssid->mode ? 10 : 5;
1196 } else if (wpa_s->conf->ap_scan == 1) {
1197 /* give IBSS a bit more time */
1198 timeout = ssid->mode ? 20 : 10;
1200 wpa_supplicant_req_auth_timeout(wpa_s, timeout, 0);
1203 if (wep_keys_set && wpa_drv_get_capa(wpa_s, &capa) == 0 &&
1204 capa.flags & WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC) {
1205 /* Set static WEP keys again */
1206 wpa_set_wep_keys(wpa_s, ssid);
1209 if (wpa_s->current_ssid && wpa_s->current_ssid != ssid) {
1211 * Do not allow EAP session resumption between different
1212 * network configurations.
1214 eapol_sm_invalidate_cached_session(wpa_s->eapol);
1216 wpa_s->current_ssid = ssid;
1217 wpa_supplicant_rsn_supp_set_config(wpa_s, wpa_s->current_ssid);
1218 wpa_supplicant_initiate_eapol(wpa_s);
1223 * wpa_supplicant_disassociate - Disassociate the current connection
1224 * @wpa_s: Pointer to wpa_supplicant data
1225 * @reason_code: IEEE 802.11 reason code for the disassociate frame
1227 * This function is used to request %wpa_supplicant to disassociate with the
1230 void wpa_supplicant_disassociate(struct wpa_supplicant *wpa_s,
1234 if (!is_zero_ether_addr(wpa_s->bssid)) {
1235 if (wpa_s->use_client_mlme)
1236 ieee80211_sta_disassociate(wpa_s, reason_code);
1238 wpa_drv_disassociate(wpa_s, wpa_s->bssid, reason_code);
1239 addr = wpa_s->bssid;
1241 wpa_clear_keys(wpa_s, addr);
1242 wpa_supplicant_mark_disassoc(wpa_s);
1243 wpa_s->current_ssid = NULL;
1244 wpa_sm_set_config(wpa_s->wpa, NULL);
1245 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
1250 * wpa_supplicant_deauthenticate - Deauthenticate the current connection
1251 * @wpa_s: Pointer to wpa_supplicant data
1252 * @reason_code: IEEE 802.11 reason code for the deauthenticate frame
1254 * This function is used to request %wpa_supplicant to disassociate with the
1257 void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
1261 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
1262 if (!is_zero_ether_addr(wpa_s->bssid)) {
1263 if (wpa_s->use_client_mlme)
1264 ieee80211_sta_deauthenticate(wpa_s, reason_code);
1266 wpa_drv_deauthenticate(wpa_s, wpa_s->bssid,
1268 addr = wpa_s->bssid;
1270 wpa_clear_keys(wpa_s, addr);
1271 wpa_s->current_ssid = NULL;
1272 wpa_sm_set_config(wpa_s->wpa, NULL);
1273 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
1274 eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
1275 eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
1279 static int wpa_supplicant_get_scan_results_old(struct wpa_supplicant *wpa_s)
1281 #define SCAN_AP_LIMIT 128
1282 struct wpa_scan_result *results;
1284 struct wpa_scan_results *res;
1286 results = os_malloc(SCAN_AP_LIMIT * sizeof(struct wpa_scan_result));
1287 if (results == NULL) {
1288 wpa_printf(MSG_WARNING, "Failed to allocate memory for scan "
1293 num = wpa_drv_get_scan_results(wpa_s, results, SCAN_AP_LIMIT);
1294 wpa_printf(MSG_DEBUG, "Scan results: %d", num);
1296 wpa_printf(MSG_DEBUG, "Failed to get scan results");
1300 if (num > SCAN_AP_LIMIT) {
1301 wpa_printf(MSG_INFO, "Not enough room for all APs (%d < %d)",
1302 num, SCAN_AP_LIMIT);
1303 num = SCAN_AP_LIMIT;
1306 wpa_scan_results_free(wpa_s->scan_res);
1307 wpa_s->scan_res = NULL;
1309 /* Convert old scan result data structure to the new one */
1310 res = os_zalloc(sizeof(*res));
1315 res->res = os_zalloc(num * sizeof(struct wpa_scan_res *));
1316 if (res->res == NULL) {
1322 for (i = 0; i < num; i++) {
1323 struct wpa_scan_result *bss = &results[i];
1324 struct wpa_scan_res *r;
1328 ie_len = 2 + bss->ssid_len + bss->rsn_ie_len + bss->wpa_ie_len;
1331 if (bss->mdie_present)
1334 r = os_zalloc(sizeof(*r) + ie_len);
1338 os_memcpy(r->bssid, bss->bssid, ETH_ALEN);
1339 r->freq = bss->freq;
1340 r->caps = bss->caps;
1341 r->qual = bss->qual;
1342 r->noise = bss->noise;
1343 r->level = bss->level;
1347 pos = (u8 *) (r + 1);
1350 *pos++ = WLAN_EID_SSID;
1351 *pos++ = bss->ssid_len;
1352 os_memcpy(pos, bss->ssid, bss->ssid_len);
1353 pos += bss->ssid_len;
1356 /* Fake Supported Rate IE to include max rate */
1357 *pos++ = WLAN_EID_SUPP_RATES;
1359 *pos++ = bss->maxrate;
1362 if (bss->rsn_ie_len) {
1363 os_memcpy(pos, bss->rsn_ie, bss->rsn_ie_len);
1364 pos += bss->rsn_ie_len;
1367 if (bss->mdie_present) {
1368 os_memcpy(pos, bss->mdie, 5);
1372 if (bss->wpa_ie_len) {
1373 os_memcpy(pos, bss->wpa_ie, bss->wpa_ie_len);
1374 pos += bss->wpa_ie_len;
1377 res->res[res->num++] = r;
1381 wpa_s->scan_res = res;
1388 * wpa_supplicant_get_scan_results - Get scan results
1389 * @wpa_s: Pointer to wpa_supplicant data
1390 * Returns: 0 on success, -1 on failure
1392 * This function is request the current scan results from the driver and stores
1393 * a local copy of the results in wpa_s->scan_res.
1395 int wpa_supplicant_get_scan_results(struct wpa_supplicant *wpa_s)
1399 if (wpa_s->use_client_mlme) {
1400 wpa_scan_results_free(wpa_s->scan_res);
1401 wpa_s->scan_res = ieee80211_sta_get_scan_results(wpa_s);
1402 if (wpa_s->scan_res == NULL) {
1403 wpa_printf(MSG_DEBUG, "Failed to get scan results");
1407 } else if (wpa_s->driver->get_scan_results2 == NULL)
1408 ret = wpa_supplicant_get_scan_results_old(wpa_s);
1410 wpa_scan_results_free(wpa_s->scan_res);
1411 wpa_s->scan_res = wpa_drv_get_scan_results2(wpa_s);
1412 if (wpa_s->scan_res == NULL) {
1413 wpa_printf(MSG_DEBUG, "Failed to get scan results");
1419 if (wpa_s->scan_res)
1420 wpa_scan_sort_results(wpa_s->scan_res);
1427 * wpa_supplicant_get_ssid - Get a pointer to the current network structure
1428 * @wpa_s: Pointer to wpa_supplicant data
1429 * Returns: A pointer to the current network structure or %NULL on failure
1431 struct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s)
1433 struct wpa_ssid *entry;
1434 u8 ssid[MAX_SSID_LEN];
1440 if (wpa_s->use_client_mlme) {
1441 if (ieee80211_sta_get_ssid(wpa_s, ssid, &ssid_len)) {
1442 wpa_printf(MSG_WARNING, "Could not read SSID from "
1447 res = wpa_drv_get_ssid(wpa_s, ssid);
1449 wpa_printf(MSG_WARNING, "Could not read SSID from "
1456 if (wpa_s->use_client_mlme)
1457 os_memcpy(bssid, wpa_s->bssid, ETH_ALEN);
1458 else if (wpa_drv_get_bssid(wpa_s, bssid) < 0) {
1459 wpa_printf(MSG_WARNING, "Could not read BSSID from driver.");
1463 wired = wpa_s->conf->ap_scan == 0 && wpa_s->driver &&
1464 IS_WIRED(wpa_s->driver);
1466 entry = wpa_s->conf->ssid;
1468 if (!entry->disabled &&
1469 ((ssid_len == entry->ssid_len &&
1470 os_memcmp(ssid, entry->ssid, ssid_len) == 0) || wired) &&
1471 (!entry->bssid_set ||
1472 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
1475 if (!entry->disabled &&
1476 (entry->key_mgmt & WPA_KEY_MGMT_WPS) &&
1477 (entry->ssid == NULL || entry->ssid_len == 0) &&
1478 (!entry->bssid_set ||
1479 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
1481 #endif /* CONFIG_WPS */
1482 entry = entry->next;
1489 static int wpa_supplicant_set_driver(struct wpa_supplicant *wpa_s,
1497 if (wpa_supplicant_drivers[0] == NULL) {
1498 wpa_printf(MSG_ERROR, "No driver interfaces build into "
1504 /* default to first driver in the list */
1505 wpa_s->driver = wpa_supplicant_drivers[0];
1509 for (i = 0; wpa_supplicant_drivers[i]; i++) {
1510 if (os_strcmp(name, wpa_supplicant_drivers[i]->name) == 0) {
1511 wpa_s->driver = wpa_supplicant_drivers[i];
1516 wpa_printf(MSG_ERROR, "Unsupported driver '%s'.\n", name);
1521 void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr,
1522 const u8 *buf, size_t len)
1524 struct wpa_supplicant *wpa_s = ctx;
1526 wpa_printf(MSG_DEBUG, "RX EAPOL from " MACSTR, MAC2STR(src_addr));
1527 wpa_hexdump(MSG_MSGDUMP, "RX EAPOL", buf, len);
1529 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE) {
1530 wpa_printf(MSG_DEBUG, "Ignored received EAPOL frame since "
1531 "no key management is configured");
1535 if (wpa_s->eapol_received == 0 &&
1536 (!wpa_s->driver_4way_handshake ||
1537 !wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) ||
1538 wpa_s->wpa_state != WPA_COMPLETED)) {
1539 /* Timeout for completing IEEE 802.1X and WPA authentication */
1540 wpa_supplicant_req_auth_timeout(
1542 (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) ||
1543 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA ||
1544 wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) ?
1547 wpa_s->eapol_received++;
1549 if (wpa_s->countermeasures) {
1550 wpa_printf(MSG_INFO, "WPA: Countermeasures - dropped EAPOL "
1555 /* Source address of the incoming EAPOL frame could be compared to the
1556 * current BSSID. However, it is possible that a centralized
1557 * Authenticator could be using another MAC address than the BSSID of
1558 * an AP, so just allow any address to be used for now. The replies are
1559 * still sent to the current BSSID (if available), though. */
1561 os_memcpy(wpa_s->last_eapol_src, src_addr, ETH_ALEN);
1562 if (!wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) &&
1563 eapol_sm_rx_eapol(wpa_s->eapol, src_addr, buf, len) > 0)
1565 wpa_drv_poll(wpa_s);
1566 if (!wpa_s->driver_4way_handshake)
1567 wpa_sm_rx_eapol(wpa_s->wpa, src_addr, buf, len);
1568 else if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt)) {
1570 * Set portValid = TRUE here since we are going to skip 4-way
1571 * handshake processing which would normally set portValid. We
1572 * need this to allow the EAPOL state machines to be completed
1573 * without going through EAPOL-Key handshake.
1575 eapol_sm_notify_portValid(wpa_s->eapol, TRUE);
1580 void wpa_supplicant_sta_free_hw_features(struct wpa_hw_modes *hw_features,
1581 size_t num_hw_features)
1583 ieee80211_sta_free_hw_features(hw_features, num_hw_features);
1587 void wpa_supplicant_sta_rx(void *ctx, const u8 *buf, size_t len,
1588 struct ieee80211_rx_status *rx_status)
1590 struct wpa_supplicant *wpa_s = ctx;
1591 ieee80211_sta_rx(wpa_s, buf, len, rx_status);
1596 * wpa_supplicant_driver_init - Initialize driver interface parameters
1597 * @wpa_s: Pointer to wpa_supplicant data
1598 * Returns: 0 on success, -1 on failure
1600 * This function is called to initialize driver interface parameters.
1601 * wpa_drv_init() must have been called before this function to initialize the
1604 int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s)
1606 static int interface_count = 0;
1608 if (wpa_s->driver->send_eapol) {
1609 const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
1611 os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
1613 wpa_s->l2 = l2_packet_init(wpa_s->ifname,
1614 wpa_drv_get_mac_addr(wpa_s),
1616 wpa_supplicant_rx_eapol, wpa_s, 0);
1617 if (wpa_s->l2 == NULL)
1621 if (wpa_s->l2 && l2_packet_get_own_addr(wpa_s->l2, wpa_s->own_addr)) {
1622 wpa_printf(MSG_ERROR, "Failed to get own L2 address");
1626 wpa_printf(MSG_DEBUG, "Own MAC address: " MACSTR,
1627 MAC2STR(wpa_s->own_addr));
1629 if (wpa_s->bridge_ifname[0]) {
1630 wpa_printf(MSG_DEBUG, "Receiving packets from bridge interface"
1631 " '%s'", wpa_s->bridge_ifname);
1632 wpa_s->l2_br = l2_packet_init(wpa_s->bridge_ifname,
1635 wpa_supplicant_rx_eapol, wpa_s,
1637 if (wpa_s->l2_br == NULL) {
1638 wpa_printf(MSG_ERROR, "Failed to open l2_packet "
1639 "connection for the bridge interface '%s'",
1640 wpa_s->bridge_ifname);
1645 /* Backwards compatibility call to set_wpa() handler. This is called
1646 * only just after init and just before deinit, so these handler can be
1647 * used to implement same functionality. */
1648 if (wpa_drv_set_wpa(wpa_s, 1) < 0) {
1649 struct wpa_driver_capa capa;
1650 if (wpa_drv_get_capa(wpa_s, &capa) < 0 ||
1651 !(capa.flags & (WPA_DRIVER_CAPA_KEY_MGMT_WPA |
1652 WPA_DRIVER_CAPA_KEY_MGMT_WPA2))) {
1653 wpa_printf(MSG_DEBUG, "Driver does not support WPA.");
1654 /* Continue to allow non-WPA modes to be used. */
1656 wpa_printf(MSG_ERROR, "Failed to enable WPA in the "
1662 wpa_clear_keys(wpa_s, NULL);
1664 /* Make sure that TKIP countermeasures are not left enabled (could
1665 * happen if wpa_supplicant is killed during countermeasures. */
1666 wpa_drv_set_countermeasures(wpa_s, 0);
1668 wpa_drv_set_drop_unencrypted(wpa_s, 1);
1670 wpa_printf(MSG_DEBUG, "RSN: flushing PMKID list in the driver");
1671 wpa_drv_flush_pmkid(wpa_s);
1673 wpa_s->prev_scan_ssid = BROADCAST_SSID_SCAN;
1674 wpa_supplicant_req_scan(wpa_s, interface_count, 100000);
1681 static int wpa_supplicant_daemon(const char *pid_file)
1683 wpa_printf(MSG_DEBUG, "Daemonize..");
1684 return os_daemonize(pid_file);
1688 static struct wpa_supplicant * wpa_supplicant_alloc(void)
1690 struct wpa_supplicant *wpa_s;
1692 wpa_s = os_zalloc(sizeof(*wpa_s));
1695 wpa_s->scan_req = 1;
1701 static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
1702 struct wpa_interface *iface)
1704 wpa_printf(MSG_DEBUG, "Initializing interface '%s' conf '%s' driver "
1705 "'%s' ctrl_interface '%s' bridge '%s'", iface->ifname,
1706 iface->confname ? iface->confname : "N/A",
1707 iface->driver ? iface->driver : "default",
1708 iface->ctrl_interface ? iface->ctrl_interface : "N/A",
1709 iface->bridge_ifname ? iface->bridge_ifname : "N/A");
1711 if (wpa_supplicant_set_driver(wpa_s, iface->driver) < 0) {
1715 if (iface->confname) {
1716 #ifdef CONFIG_BACKEND_FILE
1717 wpa_s->confname = os_rel2abs_path(iface->confname);
1718 if (wpa_s->confname == NULL) {
1719 wpa_printf(MSG_ERROR, "Failed to get absolute path "
1720 "for configuration file '%s'.",
1724 wpa_printf(MSG_DEBUG, "Configuration file '%s' -> '%s'",
1725 iface->confname, wpa_s->confname);
1726 #else /* CONFIG_BACKEND_FILE */
1727 wpa_s->confname = os_strdup(iface->confname);
1728 #endif /* CONFIG_BACKEND_FILE */
1729 wpa_s->conf = wpa_config_read(wpa_s->confname);
1730 if (wpa_s->conf == NULL) {
1731 wpa_printf(MSG_ERROR, "Failed to read or parse "
1732 "configuration '%s'.", wpa_s->confname);
1737 * Override ctrl_interface and driver_param if set on command
1740 if (iface->ctrl_interface) {
1741 os_free(wpa_s->conf->ctrl_interface);
1742 wpa_s->conf->ctrl_interface =
1743 os_strdup(iface->ctrl_interface);
1746 if (iface->driver_param) {
1747 os_free(wpa_s->conf->driver_param);
1748 wpa_s->conf->driver_param =
1749 os_strdup(iface->driver_param);
1752 wpa_s->conf = wpa_config_alloc_empty(iface->ctrl_interface,
1753 iface->driver_param);
1755 if (wpa_s->conf == NULL) {
1756 wpa_printf(MSG_ERROR, "\nNo configuration found.");
1760 if (iface->ifname == NULL) {
1761 wpa_printf(MSG_ERROR, "\nInterface name is required.");
1764 if (os_strlen(iface->ifname) >= sizeof(wpa_s->ifname)) {
1765 wpa_printf(MSG_ERROR, "\nToo long interface name '%s'.",
1769 os_strlcpy(wpa_s->ifname, iface->ifname, sizeof(wpa_s->ifname));
1771 if (iface->bridge_ifname) {
1772 if (os_strlen(iface->bridge_ifname) >=
1773 sizeof(wpa_s->bridge_ifname)) {
1774 wpa_printf(MSG_ERROR, "\nToo long bridge interface "
1775 "name '%s'.", iface->bridge_ifname);
1778 os_strlcpy(wpa_s->bridge_ifname, iface->bridge_ifname,
1779 sizeof(wpa_s->bridge_ifname));
1786 static int wpa_supplicant_init_iface2(struct wpa_supplicant *wpa_s)
1789 struct wpa_driver_capa capa;
1791 wpa_printf(MSG_DEBUG, "Initializing interface (2) '%s'",
1794 /* RSNA Supplicant Key Management - INITIALIZE */
1795 eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
1796 eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
1798 /* Initialize driver interface and register driver event handler before
1799 * L2 receive handler so that association events are processed before
1800 * EAPOL-Key packets if both become available for the same select()
1802 wpa_s->drv_priv = wpa_drv_init(wpa_s, wpa_s->ifname);
1803 if (wpa_s->drv_priv == NULL) {
1804 wpa_printf(MSG_ERROR, "Failed to initialize driver interface");
1807 if (wpa_drv_set_param(wpa_s, wpa_s->conf->driver_param) < 0) {
1808 wpa_printf(MSG_ERROR, "Driver interface rejected "
1809 "driver_param '%s'", wpa_s->conf->driver_param);
1813 ifname = wpa_drv_get_ifname(wpa_s);
1814 if (ifname && os_strcmp(ifname, wpa_s->ifname) != 0) {
1815 wpa_printf(MSG_DEBUG, "Driver interface replaced interface "
1816 "name with '%s'", ifname);
1817 os_strlcpy(wpa_s->ifname, ifname, sizeof(wpa_s->ifname));
1820 if (wpa_supplicant_init_wpa(wpa_s) < 0)
1823 wpa_sm_set_ifname(wpa_s->wpa, wpa_s->ifname,
1824 wpa_s->bridge_ifname[0] ? wpa_s->bridge_ifname :
1826 wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
1828 if (wpa_s->conf->dot11RSNAConfigPMKLifetime &&
1829 wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_LIFETIME,
1830 wpa_s->conf->dot11RSNAConfigPMKLifetime)) {
1831 wpa_printf(MSG_ERROR, "Invalid WPA parameter value for "
1832 "dot11RSNAConfigPMKLifetime");
1836 if (wpa_s->conf->dot11RSNAConfigPMKReauthThreshold &&
1837 wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_REAUTH_THRESHOLD,
1838 wpa_s->conf->dot11RSNAConfigPMKReauthThreshold)) {
1839 wpa_printf(MSG_ERROR, "Invalid WPA parameter value for "
1840 "dot11RSNAConfigPMKReauthThreshold");
1844 if (wpa_s->conf->dot11RSNAConfigSATimeout &&
1845 wpa_sm_set_param(wpa_s->wpa, RSNA_SA_TIMEOUT,
1846 wpa_s->conf->dot11RSNAConfigSATimeout)) {
1847 wpa_printf(MSG_ERROR, "Invalid WPA parameter value for "
1848 "dot11RSNAConfigSATimeout");
1852 if (wpa_supplicant_driver_init(wpa_s) < 0)
1855 if (wpa_s->conf->country[0] && wpa_s->conf->country[1] &&
1856 wpa_drv_set_country(wpa_s, wpa_s->conf->country)) {
1857 wpa_printf(MSG_DEBUG, "Failed to set country");
1861 wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
1863 if (wpas_wps_init(wpa_s))
1866 if (wpa_supplicant_init_eapol(wpa_s) < 0)
1868 wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
1870 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
1871 if (wpa_s->ctrl_iface == NULL) {
1872 wpa_printf(MSG_ERROR,
1873 "Failed to initialize control interface '%s'.\n"
1874 "You may have another wpa_supplicant process "
1875 "already running or the file was\n"
1876 "left by an unclean termination of wpa_supplicant "
1877 "in which case you will need\n"
1878 "to manually remove this file before starting "
1879 "wpa_supplicant again.\n",
1880 wpa_s->conf->ctrl_interface);
1884 if (wpa_drv_get_capa(wpa_s, &capa) == 0) {
1885 if (capa.flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME) {
1886 wpa_s->use_client_mlme = 1;
1887 if (ieee80211_sta_init(wpa_s))
1890 if (capa.flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE)
1891 wpa_s->driver_4way_handshake = 1;
1894 #ifdef CONFIG_IBSS_RSN
1895 wpa_s->ibss_rsn = ibss_rsn_init(wpa_s);
1896 if (!wpa_s->ibss_rsn) {
1897 wpa_printf(MSG_DEBUG, "Failed to init IBSS RSN");
1900 #endif /* CONFIG_IBSS_RSN */
1906 static void wpa_supplicant_deinit_iface(struct wpa_supplicant *wpa_s)
1908 if (wpa_s->drv_priv) {
1909 wpa_supplicant_deauthenticate(wpa_s,
1910 WLAN_REASON_DEAUTH_LEAVING);
1912 /* Backwards compatibility call to set_wpa() handler. This is
1913 * called only just after init and just before deinit, so these
1914 * handler can be used to implement same functionality. */
1915 if (wpa_drv_set_wpa(wpa_s, 0) < 0) {
1916 wpa_printf(MSG_ERROR, "Failed to disable WPA in the "
1920 wpa_drv_set_drop_unencrypted(wpa_s, 0);
1921 wpa_drv_set_countermeasures(wpa_s, 0);
1922 wpa_clear_keys(wpa_s, NULL);
1925 wpas_dbus_unregister_iface(wpa_s);
1927 wpa_supplicant_cleanup(wpa_s);
1929 if (wpa_s->drv_priv)
1930 wpa_drv_deinit(wpa_s);
1935 * wpa_supplicant_add_iface - Add a new network interface
1936 * @global: Pointer to global data from wpa_supplicant_init()
1937 * @iface: Interface configuration options
1938 * Returns: Pointer to the created interface or %NULL on failure
1940 * This function is used to add new network interfaces for %wpa_supplicant.
1941 * This can be called before wpa_supplicant_run() to add interfaces before the
1942 * main event loop has been started. In addition, new interfaces can be added
1943 * dynamically while %wpa_supplicant is already running. This could happen,
1944 * e.g., when a hotplug network adapter is inserted.
1946 struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
1947 struct wpa_interface *iface)
1949 struct wpa_supplicant *wpa_s;
1951 if (global == NULL || iface == NULL)
1954 wpa_s = wpa_supplicant_alloc();
1958 if (wpa_supplicant_init_iface(wpa_s, iface) ||
1959 wpa_supplicant_init_iface2(wpa_s)) {
1960 wpa_printf(MSG_DEBUG, "Failed to add interface %s",
1962 wpa_supplicant_deinit_iface(wpa_s);
1967 wpa_s->global = global;
1969 /* Register the interface with the dbus control interface */
1970 if (wpas_dbus_register_iface(wpa_s)) {
1971 wpa_supplicant_deinit_iface(wpa_s);
1976 wpa_s->next = global->ifaces;
1977 global->ifaces = wpa_s;
1979 wpa_printf(MSG_DEBUG, "Added interface %s", wpa_s->ifname);
1986 * wpa_supplicant_remove_iface - Remove a network interface
1987 * @global: Pointer to global data from wpa_supplicant_init()
1988 * @wpa_s: Pointer to the network interface to be removed
1989 * Returns: 0 if interface was removed, -1 if interface was not found
1991 * This function can be used to dynamically remove network interfaces from
1992 * %wpa_supplicant, e.g., when a hotplug network adapter is ejected. In
1993 * addition, this function is used to remove all remaining interfaces when
1994 * %wpa_supplicant is terminated.
1996 int wpa_supplicant_remove_iface(struct wpa_global *global,
1997 struct wpa_supplicant *wpa_s)
1999 struct wpa_supplicant *prev;
2001 /* Remove interface from the global list of interfaces */
2002 prev = global->ifaces;
2003 if (prev == wpa_s) {
2004 global->ifaces = wpa_s->next;
2006 while (prev && prev->next != wpa_s)
2010 prev->next = wpa_s->next;
2013 wpa_printf(MSG_DEBUG, "Removing interface %s", wpa_s->ifname);
2015 wpa_supplicant_deinit_iface(wpa_s);
2023 * wpa_supplicant_get_iface - Get a new network interface
2024 * @global: Pointer to global data from wpa_supplicant_init()
2025 * @ifname: Interface name
2026 * Returns: Pointer to the interface or %NULL if not found
2028 struct wpa_supplicant * wpa_supplicant_get_iface(struct wpa_global *global,
2031 struct wpa_supplicant *wpa_s;
2033 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
2034 if (os_strcmp(wpa_s->ifname, ifname) == 0)
2042 * wpa_supplicant_init - Initialize %wpa_supplicant
2043 * @params: Parameters for %wpa_supplicant
2044 * Returns: Pointer to global %wpa_supplicant data, or %NULL on failure
2046 * This function is used to initialize %wpa_supplicant. After successful
2047 * initialization, the returned data pointer can be used to add and remove
2048 * network interfaces, and eventually, to deinitialize %wpa_supplicant.
2050 struct wpa_global * wpa_supplicant_init(struct wpa_params *params)
2052 struct wpa_global *global;
2058 wpa_debug_open_file(params->wpa_debug_file_path);
2060 ret = eap_peer_register_methods();
2062 wpa_printf(MSG_ERROR, "Failed to register EAP methods");
2064 wpa_printf(MSG_ERROR, "Two or more EAP methods used "
2065 "the same EAP type.");
2069 global = os_zalloc(sizeof(*global));
2072 global->params.daemonize = params->daemonize;
2073 global->params.wait_for_monitor = params->wait_for_monitor;
2074 global->params.dbus_ctrl_interface = params->dbus_ctrl_interface;
2075 if (params->pid_file)
2076 global->params.pid_file = os_strdup(params->pid_file);
2077 if (params->ctrl_interface)
2078 global->params.ctrl_interface =
2079 os_strdup(params->ctrl_interface);
2080 wpa_debug_level = global->params.wpa_debug_level =
2081 params->wpa_debug_level;
2082 wpa_debug_show_keys = global->params.wpa_debug_show_keys =
2083 params->wpa_debug_show_keys;
2084 wpa_debug_timestamp = global->params.wpa_debug_timestamp =
2085 params->wpa_debug_timestamp;
2087 if (eloop_init(global)) {
2088 wpa_printf(MSG_ERROR, "Failed to initialize event loop");
2089 wpa_supplicant_deinit(global);
2093 global->ctrl_iface = wpa_supplicant_global_ctrl_iface_init(global);
2094 if (global->ctrl_iface == NULL) {
2095 wpa_supplicant_deinit(global);
2099 if (global->params.dbus_ctrl_interface) {
2100 global->dbus_ctrl_iface =
2101 wpa_supplicant_dbus_ctrl_iface_init(global);
2102 if (global->dbus_ctrl_iface == NULL) {
2103 wpa_supplicant_deinit(global);
2108 for (i = 0; wpa_supplicant_drivers[i]; i++)
2109 global->drv_count++;
2110 if (global->drv_count == 0) {
2111 wpa_printf(MSG_ERROR, "No drivers enabled");
2112 wpa_supplicant_deinit(global);
2115 global->drv_priv = os_zalloc(global->drv_count * sizeof(void *));
2116 if (global->drv_priv == NULL) {
2117 wpa_supplicant_deinit(global);
2120 for (i = 0; wpa_supplicant_drivers[i]; i++) {
2121 if (!wpa_supplicant_drivers[i]->global_init)
2123 global->drv_priv[i] = wpa_supplicant_drivers[i]->global_init();
2124 if (global->drv_priv[i] == NULL) {
2125 wpa_printf(MSG_ERROR, "Failed to initialize driver "
2126 "'%s'", wpa_supplicant_drivers[i]->name);
2127 wpa_supplicant_deinit(global);
2137 * wpa_supplicant_run - Run the %wpa_supplicant main event loop
2138 * @global: Pointer to global data from wpa_supplicant_init()
2139 * Returns: 0 after successful event loop run, -1 on failure
2141 * This function starts the main event loop and continues running as long as
2142 * there are any remaining events. In most cases, this function is running as
2143 * long as the %wpa_supplicant process in still in use.
2145 int wpa_supplicant_run(struct wpa_global *global)
2147 struct wpa_supplicant *wpa_s;
2149 if (global->params.daemonize &&
2150 wpa_supplicant_daemon(global->params.pid_file))
2153 if (global->params.wait_for_monitor) {
2154 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
2155 if (wpa_s->ctrl_iface)
2156 wpa_supplicant_ctrl_iface_wait(
2160 eloop_register_signal_terminate(wpa_supplicant_terminate, NULL);
2161 eloop_register_signal_reconfig(wpa_supplicant_reconfig, NULL);
2170 * wpa_supplicant_deinit - Deinitialize %wpa_supplicant
2171 * @global: Pointer to global data from wpa_supplicant_init()
2173 * This function is called to deinitialize %wpa_supplicant and to free all
2174 * allocated resources. Remaining network interfaces will also be removed.
2176 void wpa_supplicant_deinit(struct wpa_global *global)
2183 while (global->ifaces)
2184 wpa_supplicant_remove_iface(global, global->ifaces);
2186 if (global->ctrl_iface)
2187 wpa_supplicant_global_ctrl_iface_deinit(global->ctrl_iface);
2188 if (global->dbus_ctrl_iface)
2189 wpa_supplicant_dbus_ctrl_iface_deinit(global->dbus_ctrl_iface);
2191 eap_peer_unregister_methods();
2193 for (i = 0; wpa_supplicant_drivers[i]; i++) {
2194 if (!global->drv_priv[i])
2196 wpa_supplicant_drivers[i]->global_deinit(global->drv_priv[i]);
2198 os_free(global->drv_priv);
2202 if (global->params.pid_file) {
2203 os_daemonize_terminate(global->params.pid_file);
2204 os_free(global->params.pid_file);
2206 os_free(global->params.ctrl_interface);
2209 wpa_debug_close_file();