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"
24 #include "eap_server/eap_methods.h"
25 #include "rsn_supp/wpa.h"
28 #include "l2_packet/l2_packet.h"
29 #include "wpa_supplicant_i.h"
31 #include "ctrl_iface.h"
32 #include "pcsc_funcs.h"
33 #include "common/version.h"
34 #include "rsn_supp/preauth.h"
35 #include "rsn_supp/pmksa_cache.h"
36 #include "common/wpa_ctrl.h"
38 #include "common/ieee802_11_defs.h"
39 #include "blacklist.h"
40 #include "wpas_glue.h"
41 #include "wps_supplicant.h"
48 const char *wpa_supplicant_version =
49 "wpa_supplicant v" VERSION_STR "\n"
50 "Copyright (c) 2003-2009, Jouni Malinen <j@w1.fi> and contributors";
52 const char *wpa_supplicant_license =
53 "This program is free software. You can distribute it and/or modify it\n"
54 "under the terms of the GNU General Public License version 2.\n"
56 "Alternatively, this software may be distributed under the terms of the\n"
57 "BSD license. See README and COPYING for more details.\n"
58 #ifdef EAP_TLS_OPENSSL
59 "\nThis product includes software developed by the OpenSSL Project\n"
60 "for use in the OpenSSL Toolkit (http://www.openssl.org/)\n"
61 #endif /* EAP_TLS_OPENSSL */
64 #ifndef CONFIG_NO_STDOUT_DEBUG
65 /* Long text divided into parts in order to fit in C89 strings size limits. */
66 const char *wpa_supplicant_full_license1 =
67 "This program is free software; you can redistribute it and/or modify\n"
68 "it under the terms of the GNU General Public License version 2 as\n"
69 "published by the Free Software Foundation.\n"
71 "This program is distributed in the hope that it will be useful,\n"
72 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
73 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
74 "GNU General Public License for more details.\n"
76 const char *wpa_supplicant_full_license2 =
77 "You should have received a copy of the GNU General Public License\n"
78 "along with this program; if not, write to the Free Software\n"
79 "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n"
81 "Alternatively, this software may be distributed under the terms of the\n"
84 "Redistribution and use in source and binary forms, with or without\n"
85 "modification, are permitted provided that the following conditions are\n"
88 const char *wpa_supplicant_full_license3 =
89 "1. Redistributions of source code must retain the above copyright\n"
90 " notice, this list of conditions and the following disclaimer.\n"
92 "2. Redistributions in binary form must reproduce the above copyright\n"
93 " notice, this list of conditions and the following disclaimer in the\n"
94 " documentation and/or other materials provided with the distribution.\n"
96 const char *wpa_supplicant_full_license4 =
97 "3. Neither the name(s) of the above-listed copyright holder(s) nor the\n"
98 " names of its contributors may be used to endorse or promote products\n"
99 " derived from this software without specific prior written permission.\n"
101 "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
102 "\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
103 "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
104 "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n";
105 const char *wpa_supplicant_full_license5 =
106 "OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
107 "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
108 "LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
109 "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
110 "THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
111 "(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
112 "OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
114 #endif /* CONFIG_NO_STDOUT_DEBUG */
116 extern int wpa_debug_level;
117 extern int wpa_debug_show_keys;
118 extern int wpa_debug_timestamp;
119 extern struct wpa_driver_ops *wpa_drivers[];
121 /* Configure default/group WEP keys for static WEP */
122 int wpa_set_wep_keys(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
126 for (i = 0; i < NUM_WEP_KEYS; i++) {
127 if (ssid->wep_key_len[i] == 0)
131 wpa_drv_set_key(wpa_s, WPA_ALG_WEP,
132 (u8 *) "\xff\xff\xff\xff\xff\xff",
133 i, i == ssid->wep_tx_keyidx, (u8 *) "", 0,
134 ssid->wep_key[i], ssid->wep_key_len[i]);
141 static int wpa_supplicant_set_wpa_none_key(struct wpa_supplicant *wpa_s,
142 struct wpa_ssid *ssid)
149 /* IBSS/WPA-None uses only one key (Group) for both receiving and
150 * sending unicast and multicast packets. */
152 if (ssid->mode != IEEE80211_MODE_IBSS) {
153 wpa_printf(MSG_INFO, "WPA: Invalid mode %d (not IBSS/ad-hoc) "
154 "for WPA-None", ssid->mode);
158 if (!ssid->psk_set) {
159 wpa_printf(MSG_INFO, "WPA: No PSK configured for WPA-None");
163 switch (wpa_s->group_cipher) {
164 case WPA_CIPHER_CCMP:
165 os_memcpy(key, ssid->psk, 16);
169 case WPA_CIPHER_TKIP:
170 /* WPA-None uses the same Michael MIC key for both TX and RX */
171 os_memcpy(key, ssid->psk, 16 + 8);
172 os_memcpy(key + 16 + 8, ssid->psk + 16, 8);
177 wpa_printf(MSG_INFO, "WPA: Invalid group cipher %d for "
178 "WPA-None", wpa_s->group_cipher);
182 /* TODO: should actually remember the previously used seq#, both for TX
183 * and RX from each STA.. */
185 return wpa_drv_set_key(wpa_s, alg, (u8 *) "\xff\xff\xff\xff\xff\xff",
186 0, 1, seq, 6, key, keylen);
190 static void wpa_supplicant_timeout(void *eloop_ctx, void *timeout_ctx)
192 struct wpa_supplicant *wpa_s = eloop_ctx;
193 const u8 *bssid = wpa_s->bssid;
194 if (is_zero_ether_addr(bssid))
195 bssid = wpa_s->pending_bssid;
196 wpa_msg(wpa_s, MSG_INFO, "Authentication with " MACSTR " timed out.",
198 wpa_blacklist_add(wpa_s, bssid);
199 wpa_sm_notify_disassoc(wpa_s->wpa);
200 wpa_supplicant_disassociate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
201 wpa_s->reassociate = 1;
202 wpa_supplicant_req_scan(wpa_s, 0, 0);
207 * wpa_supplicant_req_auth_timeout - Schedule a timeout for authentication
208 * @wpa_s: Pointer to wpa_supplicant data
209 * @sec: Number of seconds after which to time out authentication
210 * @usec: Number of microseconds after which to time out authentication
212 * This function is used to schedule a timeout for the current authentication
215 void wpa_supplicant_req_auth_timeout(struct wpa_supplicant *wpa_s,
218 if (wpa_s->conf && wpa_s->conf->ap_scan == 0 &&
219 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED))
222 wpa_msg(wpa_s, MSG_DEBUG, "Setting authentication timeout: %d sec "
223 "%d usec", sec, usec);
224 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
225 eloop_register_timeout(sec, usec, wpa_supplicant_timeout, wpa_s, NULL);
230 * wpa_supplicant_cancel_auth_timeout - Cancel authentication timeout
231 * @wpa_s: Pointer to wpa_supplicant data
233 * This function is used to cancel authentication timeout scheduled with
234 * wpa_supplicant_req_auth_timeout() and it is called when authentication has
237 void wpa_supplicant_cancel_auth_timeout(struct wpa_supplicant *wpa_s)
239 wpa_msg(wpa_s, MSG_DEBUG, "Cancelling authentication timeout");
240 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
241 wpa_blacklist_del(wpa_s, wpa_s->bssid);
246 * wpa_supplicant_initiate_eapol - Configure EAPOL state machine
247 * @wpa_s: Pointer to wpa_supplicant data
249 * This function is used to configure EAPOL state machine based on the selected
250 * authentication mode.
252 void wpa_supplicant_initiate_eapol(struct wpa_supplicant *wpa_s)
254 #ifdef IEEE8021X_EAPOL
255 struct eapol_config eapol_conf;
256 struct wpa_ssid *ssid = wpa_s->current_ssid;
258 #ifdef CONFIG_IBSS_RSN
259 if (ssid->mode == IEEE80211_MODE_IBSS &&
260 wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
261 wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
263 * RSN IBSS authentication is per-STA and we can disable the
264 * per-BSSID EAPOL authentication.
266 eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
267 eapol_sm_notify_eap_success(wpa_s->eapol, TRUE);
268 eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
271 #endif /* CONFIG_IBSS_RSN */
273 eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
274 eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
276 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
277 wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE)
278 eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
280 eapol_sm_notify_portControl(wpa_s->eapol, Auto);
282 os_memset(&eapol_conf, 0, sizeof(eapol_conf));
283 if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
284 eapol_conf.accept_802_1x_keys = 1;
285 eapol_conf.required_keys = 0;
286 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_UNICAST) {
287 eapol_conf.required_keys |= EAPOL_REQUIRE_KEY_UNICAST;
289 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_BROADCAST) {
290 eapol_conf.required_keys |=
291 EAPOL_REQUIRE_KEY_BROADCAST;
294 if (wpa_s->conf && (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED))
295 eapol_conf.required_keys = 0;
298 eapol_conf.fast_reauth = wpa_s->conf->fast_reauth;
299 eapol_conf.workaround = ssid->eap_workaround;
300 eapol_conf.eap_disabled =
301 !wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) &&
302 wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA &&
303 wpa_s->key_mgmt != WPA_KEY_MGMT_WPS;
304 eapol_sm_notify_config(wpa_s->eapol, &ssid->eap, &eapol_conf);
305 #endif /* IEEE8021X_EAPOL */
310 * wpa_supplicant_set_non_wpa_policy - Set WPA parameters to non-WPA mode
311 * @wpa_s: Pointer to wpa_supplicant data
312 * @ssid: Configuration data for the network
314 * This function is used to configure WPA state machine and related parameters
315 * to a mode where WPA is not enabled. This is called as part of the
316 * authentication configuration when the selected network does not use WPA.
318 void wpa_supplicant_set_non_wpa_policy(struct wpa_supplicant *wpa_s,
319 struct wpa_ssid *ssid)
323 if (ssid->key_mgmt & WPA_KEY_MGMT_WPS)
324 wpa_s->key_mgmt = WPA_KEY_MGMT_WPS;
325 else if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA)
326 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_NO_WPA;
328 wpa_s->key_mgmt = WPA_KEY_MGMT_NONE;
329 wpa_sm_set_ap_wpa_ie(wpa_s->wpa, NULL, 0);
330 wpa_sm_set_ap_rsn_ie(wpa_s->wpa, NULL, 0);
331 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
332 wpa_s->pairwise_cipher = WPA_CIPHER_NONE;
333 wpa_s->group_cipher = WPA_CIPHER_NONE;
334 wpa_s->mgmt_group_cipher = 0;
336 for (i = 0; i < NUM_WEP_KEYS; i++) {
337 if (ssid->wep_key_len[i] > 5) {
338 wpa_s->pairwise_cipher = WPA_CIPHER_WEP104;
339 wpa_s->group_cipher = WPA_CIPHER_WEP104;
341 } else if (ssid->wep_key_len[i] > 0) {
342 wpa_s->pairwise_cipher = WPA_CIPHER_WEP40;
343 wpa_s->group_cipher = WPA_CIPHER_WEP40;
348 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED, 0);
349 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
350 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
351 wpa_s->pairwise_cipher);
352 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
353 #ifdef CONFIG_IEEE80211W
354 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
355 wpa_s->mgmt_group_cipher);
356 #endif /* CONFIG_IEEE80211W */
358 pmksa_cache_clear_current(wpa_s->wpa);
362 static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s)
364 bgscan_deinit(wpa_s);
365 scard_deinit(wpa_s->scard);
367 wpa_sm_set_scard_ctx(wpa_s->wpa, NULL);
368 eapol_sm_register_scard_ctx(wpa_s->eapol, NULL);
369 l2_packet_deinit(wpa_s->l2);
372 l2_packet_deinit(wpa_s->l2_br);
376 if (wpa_s->ctrl_iface) {
377 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
378 wpa_s->ctrl_iface = NULL;
380 if (wpa_s->conf != NULL) {
381 wpa_config_free(wpa_s->conf);
385 os_free(wpa_s->confname);
386 wpa_s->confname = NULL;
388 wpa_sm_set_eapol(wpa_s->wpa, NULL);
389 eapol_sm_deinit(wpa_s->eapol);
392 rsn_preauth_deinit(wpa_s->wpa);
394 pmksa_candidate_free(wpa_s->wpa);
395 wpa_sm_deinit(wpa_s->wpa);
397 wpa_blacklist_clear(wpa_s);
399 wpa_scan_results_free(wpa_s->scan_res);
400 wpa_s->scan_res = NULL;
402 wpa_supplicant_cancel_scan(wpa_s);
403 wpa_supplicant_cancel_auth_timeout(wpa_s);
405 ieee80211_sta_deinit(wpa_s);
407 wpas_wps_deinit(wpa_s);
409 wpabuf_free(wpa_s->pending_eapol_rx);
410 wpa_s->pending_eapol_rx = NULL;
412 #ifdef CONFIG_IBSS_RSN
413 ibss_rsn_deinit(wpa_s->ibss_rsn);
414 wpa_s->ibss_rsn = NULL;
415 #endif /* CONFIG_IBSS_RSN */
418 os_free(wpa_s->sme.ft_ies);
419 wpa_s->sme.ft_ies = NULL;
420 wpa_s->sme.ft_ies_len = 0;
421 #endif /* CONFIG_SME */
424 wpa_supplicant_ap_deinit(wpa_s);
425 #endif /* CONFIG_AP */
430 * wpa_clear_keys - Clear keys configured for the driver
431 * @wpa_s: Pointer to wpa_supplicant data
432 * @addr: Previously used BSSID or %NULL if not available
434 * This function clears the encryption keys that has been previously configured
437 void wpa_clear_keys(struct wpa_supplicant *wpa_s, const u8 *addr)
439 u8 *bcast = (u8 *) "\xff\xff\xff\xff\xff\xff";
441 if (wpa_s->keys_cleared) {
442 /* Some drivers (e.g., ndiswrapper & NDIS drivers) seem to have
443 * timing issues with keys being cleared just before new keys
444 * are set or just after association or something similar. This
445 * shows up in group key handshake failing often because of the
446 * client not receiving the first encrypted packets correctly.
447 * Skipping some of the extra key clearing steps seems to help
448 * in completing group key handshake more reliably. */
449 wpa_printf(MSG_DEBUG, "No keys have been configured - "
450 "skip key clearing");
454 /* MLME-DELETEKEYS.request */
455 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, bcast, 0, 0, NULL, 0, NULL, 0);
456 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, bcast, 1, 0, NULL, 0, NULL, 0);
457 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, bcast, 2, 0, NULL, 0, NULL, 0);
458 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, bcast, 3, 0, NULL, 0, NULL, 0);
459 #ifdef CONFIG_IEEE80211W
460 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, bcast, 4, 0, NULL, 0, NULL, 0);
461 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, bcast, 5, 0, NULL, 0, NULL, 0);
462 #endif /* CONFIG_IEEE80211W */
464 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, addr, 0, 0, NULL, 0, NULL,
466 /* MLME-SETPROTECTION.request(None) */
467 wpa_drv_mlme_setprotection(
469 MLME_SETPROTECTION_PROTECT_TYPE_NONE,
470 MLME_SETPROTECTION_KEY_TYPE_PAIRWISE);
472 wpa_s->keys_cleared = 1;
477 * wpa_supplicant_state_txt - Get the connection state name as a text string
478 * @state: State (wpa_state; WPA_*)
479 * Returns: The state name as a printable text string
481 const char * wpa_supplicant_state_txt(int state)
484 case WPA_DISCONNECTED:
485 return "DISCONNECTED";
490 case WPA_AUTHENTICATING:
491 return "AUTHENTICATING";
492 case WPA_ASSOCIATING:
493 return "ASSOCIATING";
496 case WPA_4WAY_HANDSHAKE:
497 return "4WAY_HANDSHAKE";
498 case WPA_GROUP_HANDSHAKE:
499 return "GROUP_HANDSHAKE";
509 * wpa_supplicant_set_state - Set current connection state
510 * @wpa_s: Pointer to wpa_supplicant data
511 * @state: The new connection state
513 * This function is called whenever the connection state changes, e.g.,
514 * association is completed for WPA/WPA2 4-Way Handshake is started.
516 void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s, wpa_states state)
518 wpa_printf(MSG_DEBUG, "State: %s -> %s",
519 wpa_supplicant_state_txt(wpa_s->wpa_state),
520 wpa_supplicant_state_txt(state));
522 if (state != WPA_SCANNING)
523 wpa_supplicant_notify_scanning(wpa_s, 0);
525 wpas_notify_state_changed(wpa_s, state, wpa_s->wpa_state);
527 if (state == WPA_COMPLETED && wpa_s->new_connection) {
528 #if defined(CONFIG_CTRL_IFACE) || !defined(CONFIG_NO_STDOUT_DEBUG)
529 struct wpa_ssid *ssid = wpa_s->current_ssid;
530 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_CONNECTED "- Connection to "
531 MACSTR " completed %s [id=%d id_str=%s]",
532 MAC2STR(wpa_s->bssid), wpa_s->reassociated_connection ?
533 "(reauth)" : "(auth)",
534 ssid ? ssid->id : -1,
535 ssid && ssid->id_str ? ssid->id_str : "");
536 #endif /* CONFIG_CTRL_IFACE || !CONFIG_NO_STDOUT_DEBUG */
537 wpa_s->new_connection = 0;
538 wpa_s->reassociated_connection = 1;
539 wpa_drv_set_operstate(wpa_s, 1);
540 } else if (state == WPA_DISCONNECTED || state == WPA_ASSOCIATING ||
541 state == WPA_ASSOCIATED) {
542 wpa_s->new_connection = 1;
543 wpa_drv_set_operstate(wpa_s, 0);
545 wpa_s->wpa_state = state;
549 void wpa_supplicant_terminate_proc(struct wpa_global *global)
553 struct wpa_supplicant *wpa_s = global->ifaces;
555 if (wpas_wps_terminate_pending(wpa_s) == 1)
559 #endif /* CONFIG_WPS */
566 static void wpa_supplicant_terminate(int sig, void *signal_ctx)
568 struct wpa_global *global = signal_ctx;
569 struct wpa_supplicant *wpa_s;
570 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
571 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TERMINATING "- signal %d "
574 wpa_supplicant_terminate_proc(global);
578 static void wpa_supplicant_clear_status(struct wpa_supplicant *wpa_s)
580 wpa_states old_state = wpa_s->wpa_state;
581 wpa_s->pairwise_cipher = 0;
582 wpa_s->group_cipher = 0;
583 wpa_s->mgmt_group_cipher = 0;
585 wpa_s->wpa_state = WPA_DISCONNECTED;
586 wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
591 * wpa_supplicant_reload_configuration - Reload configuration data
592 * @wpa_s: Pointer to wpa_supplicant data
593 * Returns: 0 on success or -1 if configuration parsing failed
595 * This function can be used to request that the configuration data is reloaded
596 * (e.g., after configuration file change). This function is reloading
597 * configuration only for one interface, so this may need to be called multiple
598 * times if %wpa_supplicant is controlling multiple interfaces and all
599 * interfaces need reconfiguration.
601 int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s)
603 struct wpa_config *conf;
604 struct wpa_ssid *old_ssid;
608 if (wpa_s->confname == NULL)
610 conf = wpa_config_read(wpa_s->confname);
612 wpa_msg(wpa_s, MSG_ERROR, "Failed to parse the configuration "
613 "file '%s' - exiting", wpa_s->confname);
617 reconf_ctrl = !!conf->ctrl_interface != !!wpa_s->conf->ctrl_interface
618 || (conf->ctrl_interface && wpa_s->conf->ctrl_interface &&
619 os_strcmp(conf->ctrl_interface,
620 wpa_s->conf->ctrl_interface) != 0);
622 if (reconf_ctrl && wpa_s->ctrl_iface) {
623 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
624 wpa_s->ctrl_iface = NULL;
627 eapol_sm_invalidate_cached_session(wpa_s->eapol);
628 old_ssid = wpa_s->current_ssid;
629 wpa_s->current_ssid = NULL;
630 if (old_ssid != wpa_s->current_ssid)
631 wpas_notify_network_changed(wpa_s);
634 * TODO: should notify EAPOL SM about changes in opensc_engine_path,
635 * pkcs11_engine_path, pkcs11_module_path.
637 if (wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt)) {
639 * Clear forced success to clear EAP state for next
642 eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
644 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
645 wpa_sm_set_config(wpa_s->wpa, NULL);
646 wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
647 rsn_preauth_deinit(wpa_s->wpa);
649 old_ap_scan = wpa_s->conf->ap_scan;
650 wpa_config_free(wpa_s->conf);
652 if (old_ap_scan != wpa_s->conf->ap_scan)
653 wpas_notify_ap_scan_changed(wpa_s);
656 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
658 wpa_supplicant_clear_status(wpa_s);
659 wpa_s->reassociate = 1;
660 wpa_supplicant_req_scan(wpa_s, 0, 0);
661 wpa_msg(wpa_s, MSG_DEBUG, "Reconfiguration completed");
666 static void wpa_supplicant_reconfig(int sig, void *signal_ctx)
668 struct wpa_global *global = signal_ctx;
669 struct wpa_supplicant *wpa_s;
670 wpa_printf(MSG_DEBUG, "Signal %d received - reconfiguring", sig);
671 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
672 if (wpa_supplicant_reload_configuration(wpa_s) < 0) {
673 wpa_supplicant_terminate_proc(global);
679 static wpa_cipher cipher_suite2driver(int cipher)
682 case WPA_CIPHER_NONE:
684 case WPA_CIPHER_WEP40:
686 case WPA_CIPHER_WEP104:
687 return CIPHER_WEP104;
688 case WPA_CIPHER_CCMP:
690 case WPA_CIPHER_TKIP:
697 static wpa_key_mgmt key_mgmt2driver(int key_mgmt)
700 case WPA_KEY_MGMT_NONE:
701 return KEY_MGMT_NONE;
702 case WPA_KEY_MGMT_IEEE8021X_NO_WPA:
703 return KEY_MGMT_802_1X_NO_WPA;
704 case WPA_KEY_MGMT_IEEE8021X:
705 return KEY_MGMT_802_1X;
706 case WPA_KEY_MGMT_WPA_NONE:
707 return KEY_MGMT_WPA_NONE;
708 case WPA_KEY_MGMT_FT_IEEE8021X:
709 return KEY_MGMT_FT_802_1X;
710 case WPA_KEY_MGMT_FT_PSK:
711 return KEY_MGMT_FT_PSK;
712 case WPA_KEY_MGMT_IEEE8021X_SHA256:
713 return KEY_MGMT_802_1X_SHA256;
714 case WPA_KEY_MGMT_PSK_SHA256:
715 return KEY_MGMT_PSK_SHA256;
716 case WPA_KEY_MGMT_WPS:
718 case WPA_KEY_MGMT_PSK:
725 static int wpa_supplicant_suites_from_ai(struct wpa_supplicant *wpa_s,
726 struct wpa_ssid *ssid,
727 struct wpa_ie_data *ie)
729 int ret = wpa_sm_parse_own_wpa_ie(wpa_s->wpa, ie);
732 wpa_msg(wpa_s, MSG_INFO, "WPA: Failed to parse WPA IE "
733 "from association info");
738 wpa_printf(MSG_DEBUG, "WPA: Using WPA IE from AssocReq to set cipher "
740 if (!(ie->group_cipher & ssid->group_cipher)) {
741 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled group "
742 "cipher 0x%x (mask 0x%x) - reject",
743 ie->group_cipher, ssid->group_cipher);
746 if (!(ie->pairwise_cipher & ssid->pairwise_cipher)) {
747 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled pairwise "
748 "cipher 0x%x (mask 0x%x) - reject",
749 ie->pairwise_cipher, ssid->pairwise_cipher);
752 if (!(ie->key_mgmt & ssid->key_mgmt)) {
753 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled key "
754 "management 0x%x (mask 0x%x) - reject",
755 ie->key_mgmt, ssid->key_mgmt);
759 #ifdef CONFIG_IEEE80211W
760 if (!(ie->capabilities & WPA_CAPABILITY_MFPC) &&
761 ssid->ieee80211w == IEEE80211W_REQUIRED) {
762 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver associated with an AP "
763 "that does not support management frame protection - "
767 #endif /* CONFIG_IEEE80211W */
774 * wpa_supplicant_set_suites - Set authentication and encryption parameters
775 * @wpa_s: Pointer to wpa_supplicant data
776 * @bss: Scan results for the selected BSS, or %NULL if not available
777 * @ssid: Configuration data for the selected network
778 * @wpa_ie: Buffer for the WPA/RSN IE
779 * @wpa_ie_len: Maximum wpa_ie buffer size on input. This is changed to be the
780 * used buffer length in case the functions returns success.
781 * Returns: 0 on success or -1 on failure
783 * This function is used to configure authentication and encryption parameters
784 * based on the network configuration and scan result for the selected BSS (if
787 int wpa_supplicant_set_suites(struct wpa_supplicant *wpa_s,
788 struct wpa_scan_res *bss,
789 struct wpa_ssid *ssid,
790 u8 *wpa_ie, size_t *wpa_ie_len)
792 struct wpa_ie_data ie;
794 const u8 *bss_wpa, *bss_rsn;
797 bss_wpa = wpa_scan_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE);
798 bss_rsn = wpa_scan_get_ie(bss, WLAN_EID_RSN);
800 bss_wpa = bss_rsn = NULL;
802 if (bss_rsn && (ssid->proto & WPA_PROTO_RSN) &&
803 wpa_parse_wpa_ie(bss_rsn, 2 + bss_rsn[1], &ie) == 0 &&
804 (ie.group_cipher & ssid->group_cipher) &&
805 (ie.pairwise_cipher & ssid->pairwise_cipher) &&
806 (ie.key_mgmt & ssid->key_mgmt)) {
807 wpa_msg(wpa_s, MSG_DEBUG, "RSN: using IEEE 802.11i/D9.0");
808 proto = WPA_PROTO_RSN;
809 } else if (bss_wpa && (ssid->proto & WPA_PROTO_WPA) &&
810 wpa_parse_wpa_ie(bss_wpa, 2 +bss_wpa[1], &ie) == 0 &&
811 (ie.group_cipher & ssid->group_cipher) &&
812 (ie.pairwise_cipher & ssid->pairwise_cipher) &&
813 (ie.key_mgmt & ssid->key_mgmt)) {
814 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using IEEE 802.11i/D3.0");
815 proto = WPA_PROTO_WPA;
817 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select WPA/RSN");
820 if (ssid->proto & WPA_PROTO_RSN)
821 proto = WPA_PROTO_RSN;
823 proto = WPA_PROTO_WPA;
824 if (wpa_supplicant_suites_from_ai(wpa_s, ssid, &ie) < 0) {
825 os_memset(&ie, 0, sizeof(ie));
826 ie.group_cipher = ssid->group_cipher;
827 ie.pairwise_cipher = ssid->pairwise_cipher;
828 ie.key_mgmt = ssid->key_mgmt;
829 #ifdef CONFIG_IEEE80211W
830 ie.mgmt_group_cipher =
831 ssid->ieee80211w != NO_IEEE80211W ?
832 WPA_CIPHER_AES_128_CMAC : 0;
833 #endif /* CONFIG_IEEE80211W */
834 wpa_printf(MSG_DEBUG, "WPA: Set cipher suites based "
840 wpa_printf(MSG_DEBUG, "WPA: Selected cipher suites: group %d "
841 "pairwise %d key_mgmt %d proto %d",
842 ie.group_cipher, ie.pairwise_cipher, ie.key_mgmt, proto);
843 #ifdef CONFIG_IEEE80211W
844 if (ssid->ieee80211w) {
845 wpa_printf(MSG_DEBUG, "WPA: Selected mgmt group cipher %d",
846 ie.mgmt_group_cipher);
848 #endif /* CONFIG_IEEE80211W */
850 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PROTO, proto);
851 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED,
852 !!(ssid->proto & WPA_PROTO_RSN));
854 if (bss || !wpa_s->ap_ies_from_associnfo) {
855 if (wpa_sm_set_ap_wpa_ie(wpa_s->wpa, bss_wpa,
856 bss_wpa ? 2 + bss_wpa[1] : 0) ||
857 wpa_sm_set_ap_rsn_ie(wpa_s->wpa, bss_rsn,
858 bss_rsn ? 2 + bss_rsn[1] : 0))
862 sel = ie.group_cipher & ssid->group_cipher;
863 if (sel & WPA_CIPHER_CCMP) {
864 wpa_s->group_cipher = WPA_CIPHER_CCMP;
865 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using GTK CCMP");
866 } else if (sel & WPA_CIPHER_TKIP) {
867 wpa_s->group_cipher = WPA_CIPHER_TKIP;
868 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using GTK TKIP");
869 } else if (sel & WPA_CIPHER_WEP104) {
870 wpa_s->group_cipher = WPA_CIPHER_WEP104;
871 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using GTK WEP104");
872 } else if (sel & WPA_CIPHER_WEP40) {
873 wpa_s->group_cipher = WPA_CIPHER_WEP40;
874 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using GTK WEP40");
876 wpa_printf(MSG_WARNING, "WPA: Failed to select group cipher.");
880 sel = ie.pairwise_cipher & ssid->pairwise_cipher;
881 if (sel & WPA_CIPHER_CCMP) {
882 wpa_s->pairwise_cipher = WPA_CIPHER_CCMP;
883 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using PTK CCMP");
884 } else if (sel & WPA_CIPHER_TKIP) {
885 wpa_s->pairwise_cipher = WPA_CIPHER_TKIP;
886 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using PTK TKIP");
887 } else if (sel & WPA_CIPHER_NONE) {
888 wpa_s->pairwise_cipher = WPA_CIPHER_NONE;
889 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using PTK NONE");
891 wpa_printf(MSG_WARNING, "WPA: Failed to select pairwise "
896 sel = ie.key_mgmt & ssid->key_mgmt;
898 #ifdef CONFIG_IEEE80211R
899 } else if (sel & WPA_KEY_MGMT_FT_IEEE8021X) {
900 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_IEEE8021X;
901 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/802.1X");
902 } else if (sel & WPA_KEY_MGMT_FT_PSK) {
903 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_PSK;
904 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/PSK");
905 #endif /* CONFIG_IEEE80211R */
906 #ifdef CONFIG_IEEE80211W
907 } else if (sel & WPA_KEY_MGMT_IEEE8021X_SHA256) {
908 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SHA256;
909 wpa_msg(wpa_s, MSG_DEBUG,
910 "WPA: using KEY_MGMT 802.1X with SHA256");
911 } else if (sel & WPA_KEY_MGMT_PSK_SHA256) {
912 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK_SHA256;
913 wpa_msg(wpa_s, MSG_DEBUG,
914 "WPA: using KEY_MGMT PSK with SHA256");
915 #endif /* CONFIG_IEEE80211W */
916 } else if (sel & WPA_KEY_MGMT_IEEE8021X) {
917 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X;
918 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT 802.1X");
919 } else if (sel & WPA_KEY_MGMT_PSK) {
920 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK;
921 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-PSK");
922 } else if (sel & WPA_KEY_MGMT_WPA_NONE) {
923 wpa_s->key_mgmt = WPA_KEY_MGMT_WPA_NONE;
924 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-NONE");
926 wpa_printf(MSG_WARNING, "WPA: Failed to select authenticated "
927 "key management type.");
931 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
932 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
933 wpa_s->pairwise_cipher);
934 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
936 #ifdef CONFIG_IEEE80211W
937 sel = ie.mgmt_group_cipher;
938 if (ssid->ieee80211w == NO_IEEE80211W ||
939 !(ie.capabilities & WPA_CAPABILITY_MFPC))
941 if (sel & WPA_CIPHER_AES_128_CMAC) {
942 wpa_s->mgmt_group_cipher = WPA_CIPHER_AES_128_CMAC;
943 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
946 wpa_s->mgmt_group_cipher = 0;
947 wpa_msg(wpa_s, MSG_DEBUG, "WPA: not using MGMT group cipher");
949 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
950 wpa_s->mgmt_group_cipher);
951 #endif /* CONFIG_IEEE80211W */
953 if (wpa_sm_set_assoc_wpa_ie_default(wpa_s->wpa, wpa_ie, wpa_ie_len)) {
954 wpa_printf(MSG_WARNING, "WPA: Failed to generate WPA IE.");
959 (WPA_KEY_MGMT_PSK | WPA_KEY_MGMT_FT_PSK | WPA_KEY_MGMT_PSK_SHA256))
960 wpa_sm_set_pmk(wpa_s->wpa, ssid->psk, PMK_LEN);
962 wpa_sm_set_pmk_from_pmksa(wpa_s->wpa);
969 * wpa_supplicant_associate - Request association
970 * @wpa_s: Pointer to wpa_supplicant data
971 * @bss: Scan results for the selected BSS, or %NULL if not available
972 * @ssid: Configuration data for the selected network
974 * This function is used to request %wpa_supplicant to associate with a BSS.
976 void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
977 struct wpa_scan_res *bss, struct wpa_ssid *ssid)
981 int use_crypt, ret, i, bssid_changed;
982 int algs = AUTH_ALG_OPEN_SYSTEM;
983 wpa_cipher cipher_pairwise, cipher_group;
984 struct wpa_driver_associate_params params;
985 int wep_keys_set = 0;
986 struct wpa_driver_capa capa;
987 int assoc_failed = 0;
988 struct wpa_ssid *old_ssid;
990 if (ssid->mode == IEEE80211_MODE_AP) {
992 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_AP)) {
993 wpa_printf(MSG_INFO, "Driver does not support AP "
997 wpa_supplicant_create_ap(wpa_s, ssid);
998 #else /* CONFIG_AP */
999 wpa_printf(MSG_ERROR, "AP mode support not included in the "
1001 #endif /* CONFIG_AP */
1005 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) &&
1006 ssid->mode == IEEE80211_MODE_INFRA) {
1007 sme_authenticate(wpa_s, bss, ssid);
1011 wpa_s->reassociate = 0;
1013 #ifdef CONFIG_IEEE80211R
1014 const u8 *md = NULL;
1015 #endif /* CONFIG_IEEE80211R */
1016 const u8 *ie = wpa_scan_get_ie(bss, WLAN_EID_SSID);
1017 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with " MACSTR
1018 " (SSID='%s' freq=%d MHz)", MAC2STR(bss->bssid),
1019 ie ? wpa_ssid_txt(ie + 2, ie[1]) : "", bss->freq);
1020 bssid_changed = !is_zero_ether_addr(wpa_s->bssid);
1021 os_memset(wpa_s->bssid, 0, ETH_ALEN);
1022 os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN);
1024 wpas_notify_bssid_changed(wpa_s);
1025 #ifdef CONFIG_IEEE80211R
1026 ie = wpa_scan_get_ie(bss, WLAN_EID_MOBILITY_DOMAIN);
1027 if (ie && ie[1] >= MOBILITY_DOMAIN_ID_LEN)
1029 wpa_sm_set_ft_params(wpa_s->wpa, md, NULL, 0, NULL);
1031 /* Prepare for the next transition */
1032 wpa_ft_prepare_auth_request(wpa_s->wpa);
1034 #endif /* CONFIG_IEEE80211R */
1036 } else if ((ssid->ssid == NULL || ssid->ssid_len == 0) &&
1037 wpa_s->conf->ap_scan == 2 &&
1038 (ssid->key_mgmt & WPA_KEY_MGMT_WPS)) {
1039 /* Use ap_scan==1 style network selection to find the network
1041 wpa_s->scan_req = 2;
1042 wpa_s->reassociate = 1;
1043 wpa_supplicant_req_scan(wpa_s, 0, 0);
1045 #endif /* CONFIG_WPS */
1047 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with SSID '%s'",
1048 wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
1049 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
1051 wpa_supplicant_cancel_scan(wpa_s);
1053 /* Starting new association, so clear the possibly used WPA IE from the
1054 * previous association. */
1055 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
1057 #ifdef IEEE8021X_EAPOL
1058 if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1060 if (ssid->non_leap == 0)
1061 algs = AUTH_ALG_LEAP;
1063 algs |= AUTH_ALG_LEAP;
1066 #endif /* IEEE8021X_EAPOL */
1067 wpa_printf(MSG_DEBUG, "Automatic auth_alg selection: 0x%x", algs);
1068 if (ssid->auth_alg) {
1070 if (ssid->auth_alg & WPA_AUTH_ALG_OPEN)
1071 algs |= AUTH_ALG_OPEN_SYSTEM;
1072 if (ssid->auth_alg & WPA_AUTH_ALG_SHARED)
1073 algs |= AUTH_ALG_SHARED_KEY;
1074 if (ssid->auth_alg & WPA_AUTH_ALG_LEAP)
1075 algs |= AUTH_ALG_LEAP;
1076 wpa_printf(MSG_DEBUG, "Overriding auth_alg selection: 0x%x",
1080 if (bss && (wpa_scan_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE) ||
1081 wpa_scan_get_ie(bss, WLAN_EID_RSN)) &&
1082 (ssid->key_mgmt & (WPA_KEY_MGMT_IEEE8021X | WPA_KEY_MGMT_PSK |
1083 WPA_KEY_MGMT_FT_IEEE8021X |
1084 WPA_KEY_MGMT_FT_PSK |
1085 WPA_KEY_MGMT_IEEE8021X_SHA256 |
1086 WPA_KEY_MGMT_PSK_SHA256))) {
1087 int try_opportunistic;
1088 try_opportunistic = ssid->proactive_key_caching &&
1089 (ssid->proto & WPA_PROTO_RSN);
1090 if (pmksa_cache_set_current(wpa_s->wpa, NULL, bss->bssid,
1091 wpa_s->current_ssid,
1092 try_opportunistic) == 0)
1093 eapol_sm_notify_pmkid_attempt(wpa_s->eapol, 1);
1094 wpa_ie_len = sizeof(wpa_ie);
1095 if (wpa_supplicant_set_suites(wpa_s, bss, ssid,
1096 wpa_ie, &wpa_ie_len)) {
1097 wpa_printf(MSG_WARNING, "WPA: Failed to set WPA key "
1098 "management and encryption suites");
1101 } else if (ssid->key_mgmt &
1102 (WPA_KEY_MGMT_PSK | WPA_KEY_MGMT_IEEE8021X |
1103 WPA_KEY_MGMT_WPA_NONE | WPA_KEY_MGMT_FT_PSK |
1104 WPA_KEY_MGMT_FT_IEEE8021X | WPA_KEY_MGMT_PSK_SHA256 |
1105 WPA_KEY_MGMT_IEEE8021X_SHA256)) {
1106 wpa_ie_len = sizeof(wpa_ie);
1107 if (wpa_supplicant_set_suites(wpa_s, NULL, ssid,
1108 wpa_ie, &wpa_ie_len)) {
1109 wpa_printf(MSG_WARNING, "WPA: Failed to set WPA key "
1110 "management and encryption suites (no scan "
1115 } else if (ssid->key_mgmt & WPA_KEY_MGMT_WPS) {
1116 struct wpabuf *wps_ie;
1117 wps_ie = wps_build_assoc_req_ie(wpas_wps_get_req_type(ssid));
1118 if (wps_ie && wpabuf_len(wps_ie) <= sizeof(wpa_ie)) {
1119 wpa_ie_len = wpabuf_len(wps_ie);
1120 os_memcpy(wpa_ie, wpabuf_head(wps_ie), wpa_ie_len);
1123 wpabuf_free(wps_ie);
1124 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
1125 #endif /* CONFIG_WPS */
1127 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
1131 wpa_clear_keys(wpa_s, bss ? bss->bssid : NULL);
1133 cipher_pairwise = cipher_suite2driver(wpa_s->pairwise_cipher);
1134 cipher_group = cipher_suite2driver(wpa_s->group_cipher);
1135 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
1136 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1137 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE)
1139 if (wpa_set_wep_keys(wpa_s, ssid)) {
1144 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS)
1147 #ifdef IEEE8021X_EAPOL
1148 if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1149 if ((ssid->eapol_flags &
1150 (EAPOL_FLAG_REQUIRE_KEY_UNICAST |
1151 EAPOL_FLAG_REQUIRE_KEY_BROADCAST)) == 0 &&
1155 /* Assume that dynamic WEP-104 keys will be used and
1156 * set cipher suites in order for drivers to expect
1158 cipher_pairwise = cipher_group = CIPHER_WEP104;
1161 #endif /* IEEE8021X_EAPOL */
1163 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
1164 /* Set the key before (and later after) association */
1165 wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
1168 wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING);
1169 os_memset(¶ms, 0, sizeof(params));
1171 const u8 *ie = wpa_scan_get_ie(bss, WLAN_EID_SSID);
1172 params.bssid = bss->bssid;
1173 params.ssid = ie ? ie + 2 : (u8 *) "";
1174 params.ssid_len = ie ? ie[1] : 0;
1175 params.freq = bss->freq;
1177 params.ssid = ssid->ssid;
1178 params.ssid_len = ssid->ssid_len;
1180 if (ssid->mode == 1 && ssid->frequency > 0 && params.freq == 0)
1181 params.freq = ssid->frequency; /* Initial channel for IBSS */
1182 params.wpa_ie = wpa_ie;
1183 params.wpa_ie_len = wpa_ie_len;
1184 params.pairwise_suite = cipher_pairwise;
1185 params.group_suite = cipher_group;
1186 params.key_mgmt_suite = key_mgmt2driver(wpa_s->key_mgmt);
1187 params.auth_alg = algs;
1188 params.mode = ssid->mode;
1189 for (i = 0; i < NUM_WEP_KEYS; i++) {
1190 if (ssid->wep_key_len[i])
1191 params.wep_key[i] = ssid->wep_key[i];
1192 params.wep_key_len[i] = ssid->wep_key_len[i];
1194 params.wep_tx_keyidx = ssid->wep_tx_keyidx;
1196 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) &&
1197 (params.key_mgmt_suite == KEY_MGMT_PSK ||
1198 params.key_mgmt_suite == KEY_MGMT_FT_PSK)) {
1199 params.passphrase = ssid->passphrase;
1201 params.psk = ssid->psk;
1204 params.drop_unencrypted = use_crypt;
1206 #ifdef CONFIG_IEEE80211W
1207 switch (ssid->ieee80211w) {
1209 params.mgmt_frame_protection = NO_MGMT_FRAME_PROTECTION;
1211 case IEEE80211W_OPTIONAL:
1212 params.mgmt_frame_protection = MGMT_FRAME_PROTECTION_OPTIONAL;
1214 case IEEE80211W_REQUIRED:
1215 params.mgmt_frame_protection = MGMT_FRAME_PROTECTION_REQUIRED;
1218 if (ssid->ieee80211w != NO_IEEE80211W && bss) {
1219 const u8 *rsn = wpa_scan_get_ie(bss, WLAN_EID_RSN);
1220 struct wpa_ie_data ie;
1221 if (rsn && wpa_parse_wpa_ie(rsn, 2 + rsn[1], &ie) == 0 &&
1223 (WPA_CAPABILITY_MFPC | WPA_CAPABILITY_MFPR)) {
1224 wpa_printf(MSG_DEBUG, "WPA: Selected AP supports MFP: "
1226 params.mgmt_frame_protection =
1227 MGMT_FRAME_PROTECTION_REQUIRED;
1230 #endif /* CONFIG_IEEE80211W */
1232 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME)
1233 ret = ieee80211_sta_associate(wpa_s, ¶ms);
1235 ret = wpa_drv_associate(wpa_s, ¶ms);
1237 wpa_msg(wpa_s, MSG_INFO, "Association request to the driver "
1239 /* try to continue anyway; new association will be tried again
1244 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
1245 /* Set the key after the association just in case association
1246 * cleared the previously configured key. */
1247 wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
1248 /* No need to timeout authentication since there is no key
1250 wpa_supplicant_cancel_auth_timeout(wpa_s);
1251 wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
1252 #ifdef CONFIG_IBSS_RSN
1253 } else if (ssid->mode == IEEE80211_MODE_IBSS &&
1254 wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
1255 wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
1256 ibss_rsn_set_psk(wpa_s->ibss_rsn, ssid->psk);
1258 * RSN IBSS authentication is per-STA and we can disable the
1259 * per-BSSID authentication.
1261 wpa_supplicant_cancel_auth_timeout(wpa_s);
1262 #endif /* CONFIG_IBSS_RSN */
1264 /* Timeout for IEEE 802.11 authentication and association */
1268 /* give IBSS a bit more time */
1269 timeout = ssid->mode ? 10 : 5;
1270 } else if (wpa_s->conf->ap_scan == 1) {
1271 /* give IBSS a bit more time */
1272 timeout = ssid->mode ? 20 : 10;
1274 wpa_supplicant_req_auth_timeout(wpa_s, timeout, 0);
1277 if (wep_keys_set && wpa_drv_get_capa(wpa_s, &capa) == 0 &&
1278 capa.flags & WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC) {
1279 /* Set static WEP keys again */
1280 wpa_set_wep_keys(wpa_s, ssid);
1283 if (wpa_s->current_ssid && wpa_s->current_ssid != ssid) {
1285 * Do not allow EAP session resumption between different
1286 * network configurations.
1288 eapol_sm_invalidate_cached_session(wpa_s->eapol);
1290 old_ssid = wpa_s->current_ssid;
1291 wpa_s->current_ssid = ssid;
1292 wpa_supplicant_rsn_supp_set_config(wpa_s, wpa_s->current_ssid);
1293 wpa_supplicant_initiate_eapol(wpa_s);
1294 if (old_ssid != wpa_s->current_ssid)
1295 wpas_notify_network_changed(wpa_s);
1300 * wpa_supplicant_disassociate - Disassociate the current connection
1301 * @wpa_s: Pointer to wpa_supplicant data
1302 * @reason_code: IEEE 802.11 reason code for the disassociate frame
1304 * This function is used to request %wpa_supplicant to disassociate with the
1307 void wpa_supplicant_disassociate(struct wpa_supplicant *wpa_s,
1310 struct wpa_ssid *old_ssid;
1313 if (!is_zero_ether_addr(wpa_s->bssid)) {
1314 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME)
1315 ieee80211_sta_disassociate(wpa_s, reason_code);
1317 wpa_drv_disassociate(wpa_s, wpa_s->bssid, reason_code);
1318 addr = wpa_s->bssid;
1320 wpa_clear_keys(wpa_s, addr);
1321 wpa_supplicant_mark_disassoc(wpa_s);
1322 old_ssid = wpa_s->current_ssid;
1323 wpa_s->current_ssid = NULL;
1324 wpa_sm_set_config(wpa_s->wpa, NULL);
1325 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
1326 if (old_ssid != wpa_s->current_ssid)
1327 wpas_notify_network_changed(wpa_s);
1332 * wpa_supplicant_deauthenticate - Deauthenticate the current connection
1333 * @wpa_s: Pointer to wpa_supplicant data
1334 * @reason_code: IEEE 802.11 reason code for the deauthenticate frame
1336 * This function is used to request %wpa_supplicant to deauthenticate from the
1339 void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
1342 struct wpa_ssid *old_ssid;
1345 if (!is_zero_ether_addr(wpa_s->bssid)) {
1346 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME)
1347 ieee80211_sta_deauthenticate(wpa_s, reason_code);
1349 wpa_drv_deauthenticate(wpa_s, wpa_s->bssid,
1351 addr = wpa_s->bssid;
1353 wpa_clear_keys(wpa_s, addr);
1354 wpa_supplicant_mark_disassoc(wpa_s);
1355 old_ssid = wpa_s->current_ssid;
1356 wpa_s->current_ssid = NULL;
1357 wpa_sm_set_config(wpa_s->wpa, NULL);
1358 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
1359 if (old_ssid != wpa_s->current_ssid)
1360 wpas_notify_network_changed(wpa_s);
1365 * wpa_supplicant_enable_network - Mark a configured network as enabled
1366 * @wpa_s: wpa_supplicant structure for a network interface
1367 * @ssid: wpa_ssid structure for a configured network or %NULL
1369 * Enables the specified network or all networks if no network specified.
1371 void wpa_supplicant_enable_network(struct wpa_supplicant *wpa_s,
1372 struct wpa_ssid *ssid)
1374 struct wpa_ssid *other_ssid;
1378 other_ssid = wpa_s->conf->ssid;
1379 while (other_ssid) {
1380 if (other_ssid == wpa_s->current_ssid &&
1381 other_ssid->disabled)
1382 wpa_s->reassociate = 1;
1384 was_disabled = other_ssid->disabled;
1386 other_ssid->disabled = 0;
1388 if (was_disabled != other_ssid->disabled)
1389 wpas_notify_network_enabled_changed(
1392 other_ssid = other_ssid->next;
1394 if (wpa_s->reassociate)
1395 wpa_supplicant_req_scan(wpa_s, 0, 0);
1396 } else if (wpa_s->current_ssid == NULL && ssid->disabled) {
1398 * Try to reassociate since there is no current configuration
1399 * and a new network was made available.
1401 wpa_s->reassociate = 1;
1402 wpa_supplicant_req_scan(wpa_s, 0, 0);
1404 was_disabled = ssid->disabled;
1408 if (was_disabled != ssid->disabled)
1409 wpas_notify_network_enabled_changed(wpa_s, ssid);
1415 * wpa_supplicant_disable_network - Mark a configured network as disabled
1416 * @wpa_s: wpa_supplicant structure for a network interface
1417 * @ssid: wpa_ssid structure for a configured network or %NULL
1419 * Disables the specified network or all networks if no network specified.
1421 void wpa_supplicant_disable_network(struct wpa_supplicant *wpa_s,
1422 struct wpa_ssid *ssid)
1424 struct wpa_ssid *other_ssid;
1428 other_ssid = wpa_s->conf->ssid;
1429 while (other_ssid) {
1430 was_disabled = other_ssid->disabled;
1432 other_ssid->disabled = 1;
1434 if (was_disabled != other_ssid->disabled)
1435 wpas_notify_network_enabled_changed(
1438 other_ssid = other_ssid->next;
1440 if (wpa_s->current_ssid)
1441 wpa_supplicant_disassociate(
1442 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
1444 if (ssid == wpa_s->current_ssid)
1445 wpa_supplicant_disassociate(
1446 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
1448 was_disabled = ssid->disabled;
1452 if (was_disabled != ssid->disabled)
1453 wpas_notify_network_enabled_changed(wpa_s, ssid);
1459 * wpa_supplicant_select_network - Attempt association with a network
1460 * @wpa_s: wpa_supplicant structure for a network interface
1461 * @ssid: wpa_ssid structure for a configured network or %NULL for any network
1463 void wpa_supplicant_select_network(struct wpa_supplicant *wpa_s,
1464 struct wpa_ssid *ssid)
1467 struct wpa_ssid *other_ssid;
1469 if (ssid && ssid != wpa_s->current_ssid && wpa_s->current_ssid)
1470 wpa_supplicant_disassociate(
1471 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
1474 * Mark all other networks disabled or mark all networks enabled if no
1475 * network specified.
1477 other_ssid = wpa_s->conf->ssid;
1478 while (other_ssid) {
1479 int was_disabled = other_ssid->disabled;
1481 other_ssid->disabled = ssid ? (ssid->id != other_ssid->id) : 0;
1483 if (was_disabled != other_ssid->disabled)
1484 wpas_notify_network_enabled_changed(wpa_s, other_ssid);
1486 other_ssid = other_ssid->next;
1488 wpa_s->disconnected = 0;
1489 wpa_s->reassociate = 1;
1490 wpa_supplicant_req_scan(wpa_s, 0, 0);
1493 wpas_notify_network_selected(wpa_s, ssid);
1498 * wpa_supplicant_set_ap_scan - Set AP scan mode for interface
1499 * @wpa_s: wpa_supplicant structure for a network interface
1500 * @ap_scan: AP scan mode
1501 * Returns: 0 if succeed or -1 if ap_scan has an invalid value
1504 int wpa_supplicant_set_ap_scan(struct wpa_supplicant *wpa_s, int ap_scan)
1509 if (ap_scan < 0 || ap_scan > 2)
1512 old_ap_scan = wpa_s->conf->ap_scan;
1513 wpa_s->conf->ap_scan = ap_scan;
1515 if (old_ap_scan != wpa_s->conf->ap_scan)
1516 wpas_notify_ap_scan_changed(wpa_s);
1523 * wpa_supplicant_set_debug_params - Set global debug params
1524 * @global: wpa_global structure
1525 * @debug_level: debug level
1526 * @debug_timestamp: determines if show timestamp in debug data
1527 * @debug_show_keys: determines if show keys in debug data
1528 * Returns: 0 if succeed or -1 if debug_level has wrong value
1530 int wpa_supplicant_set_debug_params(struct wpa_global *global, int debug_level,
1531 int debug_timestamp, int debug_show_keys)
1534 int old_level, old_timestamp, old_show_keys;
1536 /* check for allowed debuglevels */
1537 if (debug_level != MSG_MSGDUMP &&
1538 debug_level != MSG_DEBUG &&
1539 debug_level != MSG_INFO &&
1540 debug_level != MSG_WARNING &&
1541 debug_level != MSG_ERROR)
1544 old_level = wpa_debug_level;
1545 old_timestamp = wpa_debug_timestamp;
1546 old_show_keys = wpa_debug_show_keys;
1548 wpa_debug_level = debug_level;
1549 wpa_debug_timestamp = debug_timestamp ? 1 : 0;
1550 wpa_debug_show_keys = debug_show_keys ? 1 : 0;
1552 if (wpa_debug_level != old_level ||
1553 wpa_debug_timestamp != old_timestamp ||
1554 wpa_debug_show_keys != old_show_keys)
1555 wpas_notify_debug_params_changed(global);
1561 static void notify_bss_changes(struct wpa_supplicant *wpa_s,
1562 u8 (*prev_bssids)[ETH_ALEN], int prev_num,
1563 struct wpa_scan_results *new)
1567 new_num = new != NULL ? new->num : 0;
1568 if (prev_bssids == NULL)
1571 for (i = 0; i < prev_num; i++) {
1572 for (j = 0; j < new_num; j++) {
1573 if (!os_memcmp(prev_bssids[i], new->res[j]->bssid,
1578 wpas_notify_bss_removed(wpa_s, prev_bssids[i]);
1580 for (i = 0; i < new_num; i++) {
1581 for (j = 0; j < prev_num; j++) {
1582 if (!os_memcmp(new->res[i]->bssid, prev_bssids[j],
1587 wpas_notify_bss_added(wpa_s, new->res[i]->bssid);
1593 * wpa_supplicant_get_scan_results - Get scan results
1594 * @wpa_s: Pointer to wpa_supplicant data
1595 * Returns: 0 on success, -1 on failure
1597 * This function is request the current scan results from the driver and stores
1598 * a local copy of the results in wpa_s->scan_res.
1600 int wpa_supplicant_get_scan_results(struct wpa_supplicant *wpa_s)
1602 int ret, i, prev_scan_res_num;
1603 u8 (*prev_scan_bssids)[ETH_ALEN];
1605 prev_scan_res_num = wpa_s->scan_res ? wpa_s->scan_res->num : 0;
1606 prev_scan_bssids = os_malloc(prev_scan_res_num * ETH_ALEN);
1608 if (prev_scan_bssids) {
1609 for (i = 0; i < prev_scan_res_num; i++) {
1610 os_memcpy(prev_scan_bssids[i],
1611 wpa_s->scan_res->res[i]->bssid, ETH_ALEN);
1614 wpa_printf(MSG_WARNING, "Not enough memory for old scan "
1616 prev_scan_res_num = 0;
1619 wpa_scan_results_free(wpa_s->scan_res);
1620 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME)
1621 wpa_s->scan_res = ieee80211_sta_get_scan_results(wpa_s);
1623 wpa_s->scan_res = wpa_drv_get_scan_results2(wpa_s);
1624 if (wpa_s->scan_res == NULL) {
1625 wpa_printf(MSG_DEBUG, "Failed to get scan results");
1629 wpa_scan_sort_results(wpa_s->scan_res);
1632 notify_bss_changes(wpa_s, prev_scan_bssids, prev_scan_res_num,
1634 os_free(prev_scan_bssids);
1641 * wpa_supplicant_get_ssid - Get a pointer to the current network structure
1642 * @wpa_s: Pointer to wpa_supplicant data
1643 * Returns: A pointer to the current network structure or %NULL on failure
1645 struct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s)
1647 struct wpa_ssid *entry;
1648 u8 ssid[MAX_SSID_LEN];
1654 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME) {
1655 if (ieee80211_sta_get_ssid(wpa_s, ssid, &ssid_len)) {
1656 wpa_printf(MSG_WARNING, "Could not read SSID from "
1661 res = wpa_drv_get_ssid(wpa_s, ssid);
1663 wpa_printf(MSG_WARNING, "Could not read SSID from "
1670 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME)
1671 os_memcpy(bssid, wpa_s->bssid, ETH_ALEN);
1672 else if (wpa_drv_get_bssid(wpa_s, bssid) < 0) {
1673 wpa_printf(MSG_WARNING, "Could not read BSSID from driver.");
1677 wired = wpa_s->conf->ap_scan == 0 &&
1678 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED);
1680 entry = wpa_s->conf->ssid;
1682 if (!entry->disabled &&
1683 ((ssid_len == entry->ssid_len &&
1684 os_memcmp(ssid, entry->ssid, ssid_len) == 0) || wired) &&
1685 (!entry->bssid_set ||
1686 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
1689 if (!entry->disabled &&
1690 (entry->key_mgmt & WPA_KEY_MGMT_WPS) &&
1691 (entry->ssid == NULL || entry->ssid_len == 0) &&
1692 (!entry->bssid_set ||
1693 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
1695 #endif /* CONFIG_WPS */
1696 entry = entry->next;
1703 static int wpa_supplicant_set_driver(struct wpa_supplicant *wpa_s,
1713 if (wpa_drivers[0] == NULL) {
1714 wpa_printf(MSG_ERROR, "No driver interfaces build into "
1720 /* default to first driver in the list */
1721 wpa_s->driver = wpa_drivers[0];
1722 wpa_s->global_drv_priv = wpa_s->global->drv_priv[0];
1726 pos = os_strchr(name, ',');
1730 len = os_strlen(name);
1731 for (i = 0; wpa_drivers[i]; i++) {
1732 if (os_strlen(wpa_drivers[i]->name) == len &&
1733 os_strncmp(name, wpa_drivers[i]->name, len) ==
1735 wpa_s->driver = wpa_drivers[i];
1736 wpa_s->global_drv_priv = wpa_s->global->drv_priv[i];
1741 wpa_printf(MSG_ERROR, "Unsupported driver '%s'.", name);
1746 void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr,
1747 const u8 *buf, size_t len)
1749 struct wpa_supplicant *wpa_s = ctx;
1751 wpa_printf(MSG_DEBUG, "RX EAPOL from " MACSTR, MAC2STR(src_addr));
1752 wpa_hexdump(MSG_MSGDUMP, "RX EAPOL", buf, len);
1754 if (wpa_s->wpa_state < WPA_ASSOCIATED) {
1756 * There is possible race condition between receiving the
1757 * association event and the EAPOL frame since they are coming
1758 * through different paths from the driver. In order to avoid
1759 * issues in trying to process the EAPOL frame before receiving
1760 * association information, lets queue it for processing until
1761 * the association event is received.
1763 wpa_printf(MSG_DEBUG, "Not associated - Delay processing of "
1764 "received EAPOL frame");
1765 wpabuf_free(wpa_s->pending_eapol_rx);
1766 wpa_s->pending_eapol_rx = wpabuf_alloc_copy(buf, len);
1767 if (wpa_s->pending_eapol_rx) {
1768 os_get_time(&wpa_s->pending_eapol_rx_time);
1769 os_memcpy(wpa_s->pending_eapol_rx_src, src_addr,
1776 if (wpa_s->ap_iface) {
1777 wpa_supplicant_ap_rx_eapol(wpa_s, src_addr, buf, len);
1780 #endif /* CONFIG_AP */
1782 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE) {
1783 wpa_printf(MSG_DEBUG, "Ignored received EAPOL frame since "
1784 "no key management is configured");
1788 if (wpa_s->eapol_received == 0 &&
1789 (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) ||
1790 !wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) ||
1791 wpa_s->wpa_state != WPA_COMPLETED) &&
1792 (wpa_s->current_ssid == NULL ||
1793 wpa_s->current_ssid->mode != IEEE80211_MODE_IBSS)) {
1794 /* Timeout for completing IEEE 802.1X and WPA authentication */
1795 wpa_supplicant_req_auth_timeout(
1797 (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) ||
1798 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA ||
1799 wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) ?
1802 wpa_s->eapol_received++;
1804 if (wpa_s->countermeasures) {
1805 wpa_printf(MSG_INFO, "WPA: Countermeasures - dropped EAPOL "
1810 #ifdef CONFIG_IBSS_RSN
1811 if (wpa_s->current_ssid &&
1812 wpa_s->current_ssid->mode == IEEE80211_MODE_IBSS) {
1813 ibss_rsn_rx_eapol(wpa_s->ibss_rsn, src_addr, buf, len);
1816 #endif /* CONFIG_IBSS_RSN */
1818 /* Source address of the incoming EAPOL frame could be compared to the
1819 * current BSSID. However, it is possible that a centralized
1820 * Authenticator could be using another MAC address than the BSSID of
1821 * an AP, so just allow any address to be used for now. The replies are
1822 * still sent to the current BSSID (if available), though. */
1824 os_memcpy(wpa_s->last_eapol_src, src_addr, ETH_ALEN);
1825 if (!wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) &&
1826 eapol_sm_rx_eapol(wpa_s->eapol, src_addr, buf, len) > 0)
1828 wpa_drv_poll(wpa_s);
1829 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE))
1830 wpa_sm_rx_eapol(wpa_s->wpa, src_addr, buf, len);
1831 else if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt)) {
1833 * Set portValid = TRUE here since we are going to skip 4-way
1834 * handshake processing which would normally set portValid. We
1835 * need this to allow the EAPOL state machines to be completed
1836 * without going through EAPOL-Key handshake.
1838 eapol_sm_notify_portValid(wpa_s->eapol, TRUE);
1843 void wpa_supplicant_sta_rx(void *ctx, const u8 *buf, size_t len,
1844 struct ieee80211_rx_status *rx_status)
1846 struct wpa_supplicant *wpa_s = ctx;
1847 ieee80211_sta_rx(wpa_s, buf, len, rx_status);
1852 * wpa_supplicant_driver_init - Initialize driver interface parameters
1853 * @wpa_s: Pointer to wpa_supplicant data
1854 * Returns: 0 on success, -1 on failure
1856 * This function is called to initialize driver interface parameters.
1857 * wpa_drv_init() must have been called before this function to initialize the
1860 int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s)
1862 static int interface_count = 0;
1864 if (wpa_s->driver->send_eapol) {
1865 const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
1867 os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
1869 wpa_s->l2 = l2_packet_init(wpa_s->ifname,
1870 wpa_drv_get_mac_addr(wpa_s),
1872 wpa_supplicant_rx_eapol, wpa_s, 0);
1873 if (wpa_s->l2 == NULL)
1877 if (wpa_s->l2 && l2_packet_get_own_addr(wpa_s->l2, wpa_s->own_addr)) {
1878 wpa_printf(MSG_ERROR, "Failed to get own L2 address");
1882 wpa_printf(MSG_DEBUG, "Own MAC address: " MACSTR,
1883 MAC2STR(wpa_s->own_addr));
1885 if (wpa_s->bridge_ifname[0]) {
1886 wpa_printf(MSG_DEBUG, "Receiving packets from bridge interface"
1887 " '%s'", wpa_s->bridge_ifname);
1888 wpa_s->l2_br = l2_packet_init(wpa_s->bridge_ifname,
1891 wpa_supplicant_rx_eapol, wpa_s,
1893 if (wpa_s->l2_br == NULL) {
1894 wpa_printf(MSG_ERROR, "Failed to open l2_packet "
1895 "connection for the bridge interface '%s'",
1896 wpa_s->bridge_ifname);
1901 wpa_clear_keys(wpa_s, NULL);
1903 /* Make sure that TKIP countermeasures are not left enabled (could
1904 * happen if wpa_supplicant is killed during countermeasures. */
1905 wpa_drv_set_countermeasures(wpa_s, 0);
1907 wpa_printf(MSG_DEBUG, "RSN: flushing PMKID list in the driver");
1908 wpa_drv_flush_pmkid(wpa_s);
1910 wpa_s->prev_scan_ssid = WILDCARD_SSID_SCAN;
1911 wpa_supplicant_req_scan(wpa_s, interface_count, 100000);
1918 static int wpa_supplicant_daemon(const char *pid_file)
1920 wpa_printf(MSG_DEBUG, "Daemonize..");
1921 return os_daemonize(pid_file);
1925 static struct wpa_supplicant * wpa_supplicant_alloc(void)
1927 struct wpa_supplicant *wpa_s;
1929 wpa_s = os_zalloc(sizeof(*wpa_s));
1932 wpa_s->scan_req = 1;
1933 wpa_s->new_connection = 1;
1939 static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
1940 struct wpa_interface *iface)
1942 const char *ifname, *driver;
1943 struct wpa_driver_capa capa;
1945 wpa_printf(MSG_DEBUG, "Initializing interface '%s' conf '%s' driver "
1946 "'%s' ctrl_interface '%s' bridge '%s'", iface->ifname,
1947 iface->confname ? iface->confname : "N/A",
1948 iface->driver ? iface->driver : "default",
1949 iface->ctrl_interface ? iface->ctrl_interface : "N/A",
1950 iface->bridge_ifname ? iface->bridge_ifname : "N/A");
1952 if (iface->confname) {
1953 #ifdef CONFIG_BACKEND_FILE
1954 wpa_s->confname = os_rel2abs_path(iface->confname);
1955 if (wpa_s->confname == NULL) {
1956 wpa_printf(MSG_ERROR, "Failed to get absolute path "
1957 "for configuration file '%s'.",
1961 wpa_printf(MSG_DEBUG, "Configuration file '%s' -> '%s'",
1962 iface->confname, wpa_s->confname);
1963 #else /* CONFIG_BACKEND_FILE */
1964 wpa_s->confname = os_strdup(iface->confname);
1965 #endif /* CONFIG_BACKEND_FILE */
1966 wpa_s->conf = wpa_config_read(wpa_s->confname);
1967 if (wpa_s->conf == NULL) {
1968 wpa_printf(MSG_ERROR, "Failed to read or parse "
1969 "configuration '%s'.", wpa_s->confname);
1974 * Override ctrl_interface and driver_param if set on command
1977 if (iface->ctrl_interface) {
1978 os_free(wpa_s->conf->ctrl_interface);
1979 wpa_s->conf->ctrl_interface =
1980 os_strdup(iface->ctrl_interface);
1983 if (iface->driver_param) {
1984 os_free(wpa_s->conf->driver_param);
1985 wpa_s->conf->driver_param =
1986 os_strdup(iface->driver_param);
1989 wpa_s->conf = wpa_config_alloc_empty(iface->ctrl_interface,
1990 iface->driver_param);
1992 if (wpa_s->conf == NULL) {
1993 wpa_printf(MSG_ERROR, "\nNo configuration found.");
1997 if (iface->ifname == NULL) {
1998 wpa_printf(MSG_ERROR, "\nInterface name is required.");
2001 if (os_strlen(iface->ifname) >= sizeof(wpa_s->ifname)) {
2002 wpa_printf(MSG_ERROR, "\nToo long interface name '%s'.",
2006 os_strlcpy(wpa_s->ifname, iface->ifname, sizeof(wpa_s->ifname));
2008 if (iface->bridge_ifname) {
2009 if (os_strlen(iface->bridge_ifname) >=
2010 sizeof(wpa_s->bridge_ifname)) {
2011 wpa_printf(MSG_ERROR, "\nToo long bridge interface "
2012 "name '%s'.", iface->bridge_ifname);
2015 os_strlcpy(wpa_s->bridge_ifname, iface->bridge_ifname,
2016 sizeof(wpa_s->bridge_ifname));
2019 /* RSNA Supplicant Key Management - INITIALIZE */
2020 eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
2021 eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
2023 /* Initialize driver interface and register driver event handler before
2024 * L2 receive handler so that association events are processed before
2025 * EAPOL-Key packets if both become available for the same select()
2027 driver = iface->driver;
2029 if (wpa_supplicant_set_driver(wpa_s, driver) < 0)
2032 wpa_s->drv_priv = wpa_drv_init(wpa_s, wpa_s->ifname);
2033 if (wpa_s->drv_priv == NULL) {
2035 pos = driver ? os_strchr(driver, ',') : NULL;
2037 wpa_printf(MSG_DEBUG, "Failed to initialize driver "
2038 "interface - try next driver wrapper");
2042 wpa_printf(MSG_ERROR, "Failed to initialize driver interface");
2045 if (wpa_drv_set_param(wpa_s, wpa_s->conf->driver_param) < 0) {
2046 wpa_printf(MSG_ERROR, "Driver interface rejected "
2047 "driver_param '%s'", wpa_s->conf->driver_param);
2051 ifname = wpa_drv_get_ifname(wpa_s);
2052 if (ifname && os_strcmp(ifname, wpa_s->ifname) != 0) {
2053 wpa_printf(MSG_DEBUG, "Driver interface replaced interface "
2054 "name with '%s'", ifname);
2055 os_strlcpy(wpa_s->ifname, ifname, sizeof(wpa_s->ifname));
2058 if (wpa_supplicant_init_wpa(wpa_s) < 0)
2061 wpa_sm_set_ifname(wpa_s->wpa, wpa_s->ifname,
2062 wpa_s->bridge_ifname[0] ? wpa_s->bridge_ifname :
2064 wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
2066 if (wpa_s->conf->dot11RSNAConfigPMKLifetime &&
2067 wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_LIFETIME,
2068 wpa_s->conf->dot11RSNAConfigPMKLifetime)) {
2069 wpa_printf(MSG_ERROR, "Invalid WPA parameter value for "
2070 "dot11RSNAConfigPMKLifetime");
2074 if (wpa_s->conf->dot11RSNAConfigPMKReauthThreshold &&
2075 wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_REAUTH_THRESHOLD,
2076 wpa_s->conf->dot11RSNAConfigPMKReauthThreshold)) {
2077 wpa_printf(MSG_ERROR, "Invalid WPA parameter value for "
2078 "dot11RSNAConfigPMKReauthThreshold");
2082 if (wpa_s->conf->dot11RSNAConfigSATimeout &&
2083 wpa_sm_set_param(wpa_s->wpa, RSNA_SA_TIMEOUT,
2084 wpa_s->conf->dot11RSNAConfigSATimeout)) {
2085 wpa_printf(MSG_ERROR, "Invalid WPA parameter value for "
2086 "dot11RSNAConfigSATimeout");
2090 if (wpa_supplicant_driver_init(wpa_s) < 0)
2093 if (wpa_s->conf->country[0] && wpa_s->conf->country[1] &&
2094 wpa_drv_set_country(wpa_s, wpa_s->conf->country)) {
2095 wpa_printf(MSG_DEBUG, "Failed to set country");
2099 wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
2101 if (wpas_wps_init(wpa_s))
2104 if (wpa_supplicant_init_eapol(wpa_s) < 0)
2106 wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
2108 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
2109 if (wpa_s->ctrl_iface == NULL) {
2110 wpa_printf(MSG_ERROR,
2111 "Failed to initialize control interface '%s'.\n"
2112 "You may have another wpa_supplicant process "
2113 "already running or the file was\n"
2114 "left by an unclean termination of wpa_supplicant "
2115 "in which case you will need\n"
2116 "to manually remove this file before starting "
2117 "wpa_supplicant again.\n",
2118 wpa_s->conf->ctrl_interface);
2122 if (wpa_drv_get_capa(wpa_s, &capa) == 0) {
2123 wpa_s->drv_flags = capa.flags;
2124 if (capa.flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME) {
2125 if (ieee80211_sta_init(wpa_s))
2128 wpa_s->max_scan_ssids = capa.max_scan_ssids;
2131 #ifdef CONFIG_IBSS_RSN
2132 wpa_s->ibss_rsn = ibss_rsn_init(wpa_s);
2133 if (!wpa_s->ibss_rsn) {
2134 wpa_printf(MSG_DEBUG, "Failed to init IBSS RSN");
2137 #endif /* CONFIG_IBSS_RSN */
2143 static void wpa_supplicant_deinit_iface(struct wpa_supplicant *wpa_s)
2145 if (wpa_s->drv_priv) {
2146 wpa_supplicant_deauthenticate(wpa_s,
2147 WLAN_REASON_DEAUTH_LEAVING);
2149 wpa_drv_set_countermeasures(wpa_s, 0);
2150 wpa_clear_keys(wpa_s, NULL);
2153 wpas_notify_iface_removed(wpa_s);
2155 wpa_supplicant_cleanup(wpa_s);
2157 if (wpa_s->drv_priv)
2158 wpa_drv_deinit(wpa_s);
2163 * wpa_supplicant_add_iface - Add a new network interface
2164 * @global: Pointer to global data from wpa_supplicant_init()
2165 * @iface: Interface configuration options
2166 * Returns: Pointer to the created interface or %NULL on failure
2168 * This function is used to add new network interfaces for %wpa_supplicant.
2169 * This can be called before wpa_supplicant_run() to add interfaces before the
2170 * main event loop has been started. In addition, new interfaces can be added
2171 * dynamically while %wpa_supplicant is already running. This could happen,
2172 * e.g., when a hotplug network adapter is inserted.
2174 struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
2175 struct wpa_interface *iface)
2177 struct wpa_supplicant *wpa_s;
2178 struct wpa_interface t_iface;
2180 if (global == NULL || iface == NULL)
2183 wpa_s = wpa_supplicant_alloc();
2187 wpa_s->global = global;
2190 if (global->params.override_driver) {
2191 wpa_printf(MSG_DEBUG, "Override interface parameter: driver "
2193 iface->driver, global->params.override_driver);
2194 t_iface.driver = global->params.override_driver;
2196 if (global->params.override_ctrl_interface) {
2197 wpa_printf(MSG_DEBUG, "Override interface parameter: "
2198 "ctrl_interface ('%s' -> '%s')",
2199 iface->ctrl_interface,
2200 global->params.override_ctrl_interface);
2201 t_iface.ctrl_interface =
2202 global->params.override_ctrl_interface;
2204 if (wpa_supplicant_init_iface(wpa_s, &t_iface)) {
2205 wpa_printf(MSG_DEBUG, "Failed to add interface %s",
2207 wpa_supplicant_deinit_iface(wpa_s);
2212 /* Notify the control interfaces about new iface */
2213 if (wpas_notify_iface_added(wpa_s)) {
2214 wpa_supplicant_deinit_iface(wpa_s);
2219 wpa_s->next = global->ifaces;
2220 global->ifaces = wpa_s;
2222 wpa_printf(MSG_DEBUG, "Added interface %s", wpa_s->ifname);
2229 * wpa_supplicant_remove_iface - Remove a network interface
2230 * @global: Pointer to global data from wpa_supplicant_init()
2231 * @wpa_s: Pointer to the network interface to be removed
2232 * Returns: 0 if interface was removed, -1 if interface was not found
2234 * This function can be used to dynamically remove network interfaces from
2235 * %wpa_supplicant, e.g., when a hotplug network adapter is ejected. In
2236 * addition, this function is used to remove all remaining interfaces when
2237 * %wpa_supplicant is terminated.
2239 int wpa_supplicant_remove_iface(struct wpa_global *global,
2240 struct wpa_supplicant *wpa_s)
2242 struct wpa_supplicant *prev;
2244 /* Remove interface from the global list of interfaces */
2245 prev = global->ifaces;
2246 if (prev == wpa_s) {
2247 global->ifaces = wpa_s->next;
2249 while (prev && prev->next != wpa_s)
2253 prev->next = wpa_s->next;
2256 wpa_printf(MSG_DEBUG, "Removing interface %s", wpa_s->ifname);
2258 wpa_supplicant_deinit_iface(wpa_s);
2266 * wpa_supplicant_get_iface - Get a new network interface
2267 * @global: Pointer to global data from wpa_supplicant_init()
2268 * @ifname: Interface name
2269 * Returns: Pointer to the interface or %NULL if not found
2271 struct wpa_supplicant * wpa_supplicant_get_iface(struct wpa_global *global,
2274 struct wpa_supplicant *wpa_s;
2276 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
2277 if (os_strcmp(wpa_s->ifname, ifname) == 0)
2285 * wpa_supplicant_init - Initialize %wpa_supplicant
2286 * @params: Parameters for %wpa_supplicant
2287 * Returns: Pointer to global %wpa_supplicant data, or %NULL on failure
2289 * This function is used to initialize %wpa_supplicant. After successful
2290 * initialization, the returned data pointer can be used to add and remove
2291 * network interfaces, and eventually, to deinitialize %wpa_supplicant.
2293 struct wpa_global * wpa_supplicant_init(struct wpa_params *params)
2295 struct wpa_global *global;
2301 wpa_debug_open_file(params->wpa_debug_file_path);
2302 if (params->wpa_debug_syslog)
2303 wpa_debug_open_syslog();
2305 ret = eap_register_methods();
2307 wpa_printf(MSG_ERROR, "Failed to register EAP methods");
2309 wpa_printf(MSG_ERROR, "Two or more EAP methods used "
2310 "the same EAP type.");
2314 global = os_zalloc(sizeof(*global));
2317 global->params.daemonize = params->daemonize;
2318 global->params.wait_for_monitor = params->wait_for_monitor;
2319 global->params.dbus_ctrl_interface = params->dbus_ctrl_interface;
2320 if (params->pid_file)
2321 global->params.pid_file = os_strdup(params->pid_file);
2322 if (params->ctrl_interface)
2323 global->params.ctrl_interface =
2324 os_strdup(params->ctrl_interface);
2325 if (params->override_driver)
2326 global->params.override_driver =
2327 os_strdup(params->override_driver);
2328 if (params->override_ctrl_interface)
2329 global->params.override_ctrl_interface =
2330 os_strdup(params->override_ctrl_interface);
2331 wpa_debug_level = global->params.wpa_debug_level =
2332 params->wpa_debug_level;
2333 wpa_debug_show_keys = global->params.wpa_debug_show_keys =
2334 params->wpa_debug_show_keys;
2335 wpa_debug_timestamp = global->params.wpa_debug_timestamp =
2336 params->wpa_debug_timestamp;
2339 wpa_printf(MSG_ERROR, "Failed to initialize event loop");
2340 wpa_supplicant_deinit(global);
2344 global->ctrl_iface = wpa_supplicant_global_ctrl_iface_init(global);
2345 if (global->ctrl_iface == NULL) {
2346 wpa_supplicant_deinit(global);
2350 if (wpas_notify_supplicant_initialized(global)) {
2351 wpa_supplicant_deinit(global);
2355 for (i = 0; wpa_drivers[i]; i++)
2356 global->drv_count++;
2357 if (global->drv_count == 0) {
2358 wpa_printf(MSG_ERROR, "No drivers enabled");
2359 wpa_supplicant_deinit(global);
2362 global->drv_priv = os_zalloc(global->drv_count * sizeof(void *));
2363 if (global->drv_priv == NULL) {
2364 wpa_supplicant_deinit(global);
2367 for (i = 0; wpa_drivers[i]; i++) {
2368 if (!wpa_drivers[i]->global_init)
2370 global->drv_priv[i] = wpa_drivers[i]->global_init();
2371 if (global->drv_priv[i] == NULL) {
2372 wpa_printf(MSG_ERROR, "Failed to initialize driver "
2373 "'%s'", wpa_drivers[i]->name);
2374 wpa_supplicant_deinit(global);
2384 * wpa_supplicant_run - Run the %wpa_supplicant main event loop
2385 * @global: Pointer to global data from wpa_supplicant_init()
2386 * Returns: 0 after successful event loop run, -1 on failure
2388 * This function starts the main event loop and continues running as long as
2389 * there are any remaining events. In most cases, this function is running as
2390 * long as the %wpa_supplicant process in still in use.
2392 int wpa_supplicant_run(struct wpa_global *global)
2394 struct wpa_supplicant *wpa_s;
2396 if (global->params.daemonize &&
2397 wpa_supplicant_daemon(global->params.pid_file))
2400 if (global->params.wait_for_monitor) {
2401 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
2402 if (wpa_s->ctrl_iface)
2403 wpa_supplicant_ctrl_iface_wait(
2407 eloop_register_signal_terminate(wpa_supplicant_terminate, global);
2408 eloop_register_signal_reconfig(wpa_supplicant_reconfig, global);
2417 * wpa_supplicant_deinit - Deinitialize %wpa_supplicant
2418 * @global: Pointer to global data from wpa_supplicant_init()
2420 * This function is called to deinitialize %wpa_supplicant and to free all
2421 * allocated resources. Remaining network interfaces will also be removed.
2423 void wpa_supplicant_deinit(struct wpa_global *global)
2430 while (global->ifaces)
2431 wpa_supplicant_remove_iface(global, global->ifaces);
2433 if (global->ctrl_iface)
2434 wpa_supplicant_global_ctrl_iface_deinit(global->ctrl_iface);
2436 wpas_notify_supplicant_deinitialized(global);
2438 eap_peer_unregister_methods();
2440 eap_server_unregister_methods();
2441 #endif /* CONFIG_AP */
2443 for (i = 0; wpa_drivers[i] && global->drv_priv; i++) {
2444 if (!global->drv_priv[i])
2446 wpa_drivers[i]->global_deinit(global->drv_priv[i]);
2448 os_free(global->drv_priv);
2452 if (global->params.pid_file) {
2453 os_daemonize_terminate(global->params.pid_file);
2454 os_free(global->params.pid_file);
2456 os_free(global->params.ctrl_interface);
2457 os_free(global->params.override_driver);
2458 os_free(global->params.override_ctrl_interface);
2461 wpa_debug_close_syslog();
2462 wpa_debug_close_file();