3 * Copyright (c) 2003-2010, 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"
40 #include "blacklist.h"
41 #include "wpas_glue.h"
42 #include "wps_supplicant.h"
46 #include "p2p_supplicant.h"
52 const char *wpa_supplicant_version =
53 "wpa_supplicant v" VERSION_STR "\n"
54 "Copyright (c) 2003-2010, Jouni Malinen <j@w1.fi> and contributors";
56 const char *wpa_supplicant_license =
57 "This program is free software. You can distribute it and/or modify it\n"
58 "under the terms of the GNU General Public License version 2.\n"
60 "Alternatively, this software may be distributed under the terms of the\n"
61 "BSD license. See README and COPYING for more details.\n"
62 #ifdef EAP_TLS_OPENSSL
63 "\nThis product includes software developed by the OpenSSL Project\n"
64 "for use in the OpenSSL Toolkit (http://www.openssl.org/)\n"
65 #endif /* EAP_TLS_OPENSSL */
68 #ifndef CONFIG_NO_STDOUT_DEBUG
69 /* Long text divided into parts in order to fit in C89 strings size limits. */
70 const char *wpa_supplicant_full_license1 =
71 "This program is free software; you can redistribute it and/or modify\n"
72 "it under the terms of the GNU General Public License version 2 as\n"
73 "published by the Free Software Foundation.\n"
75 "This program is distributed in the hope that it will be useful,\n"
76 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
77 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
78 "GNU General Public License for more details.\n"
80 const char *wpa_supplicant_full_license2 =
81 "You should have received a copy of the GNU General Public License\n"
82 "along with this program; if not, write to the Free Software\n"
83 "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n"
85 "Alternatively, this software may be distributed under the terms of the\n"
88 "Redistribution and use in source and binary forms, with or without\n"
89 "modification, are permitted provided that the following conditions are\n"
92 const char *wpa_supplicant_full_license3 =
93 "1. Redistributions of source code must retain the above copyright\n"
94 " notice, this list of conditions and the following disclaimer.\n"
96 "2. Redistributions in binary form must reproduce the above copyright\n"
97 " notice, this list of conditions and the following disclaimer in the\n"
98 " documentation and/or other materials provided with the distribution.\n"
100 const char *wpa_supplicant_full_license4 =
101 "3. Neither the name(s) of the above-listed copyright holder(s) nor the\n"
102 " names of its contributors may be used to endorse or promote products\n"
103 " derived from this software without specific prior written permission.\n"
105 "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
106 "\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
107 "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
108 "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n";
109 const char *wpa_supplicant_full_license5 =
110 "OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
111 "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
112 "LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
113 "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
114 "THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
115 "(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
116 "OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
118 #endif /* CONFIG_NO_STDOUT_DEBUG */
120 extern int wpa_debug_level;
121 extern int wpa_debug_show_keys;
122 extern int wpa_debug_timestamp;
123 extern struct wpa_driver_ops *wpa_drivers[];
125 /* Configure default/group WEP keys for static WEP */
126 int wpa_set_wep_keys(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
130 for (i = 0; i < NUM_WEP_KEYS; i++) {
131 if (ssid->wep_key_len[i] == 0)
135 wpa_drv_set_key(wpa_s, WPA_ALG_WEP,
136 (u8 *) "\xff\xff\xff\xff\xff\xff",
137 i, i == ssid->wep_tx_keyidx, (u8 *) "", 0,
138 ssid->wep_key[i], ssid->wep_key_len[i]);
145 static int wpa_supplicant_set_wpa_none_key(struct wpa_supplicant *wpa_s,
146 struct wpa_ssid *ssid)
153 /* IBSS/WPA-None uses only one key (Group) for both receiving and
154 * sending unicast and multicast packets. */
156 if (ssid->mode != WPAS_MODE_IBSS) {
157 wpa_printf(MSG_INFO, "WPA: Invalid mode %d (not IBSS/ad-hoc) "
158 "for WPA-None", ssid->mode);
162 if (!ssid->psk_set) {
163 wpa_printf(MSG_INFO, "WPA: No PSK configured for WPA-None");
167 switch (wpa_s->group_cipher) {
168 case WPA_CIPHER_CCMP:
169 os_memcpy(key, ssid->psk, 16);
173 case WPA_CIPHER_TKIP:
174 /* WPA-None uses the same Michael MIC key for both TX and RX */
175 os_memcpy(key, ssid->psk, 16 + 8);
176 os_memcpy(key + 16 + 8, ssid->psk + 16, 8);
181 wpa_printf(MSG_INFO, "WPA: Invalid group cipher %d for "
182 "WPA-None", wpa_s->group_cipher);
186 /* TODO: should actually remember the previously used seq#, both for TX
187 * and RX from each STA.. */
189 return wpa_drv_set_key(wpa_s, alg, (u8 *) "\xff\xff\xff\xff\xff\xff",
190 0, 1, seq, 6, key, keylen);
194 static void wpa_supplicant_timeout(void *eloop_ctx, void *timeout_ctx)
196 struct wpa_supplicant *wpa_s = eloop_ctx;
197 const u8 *bssid = wpa_s->bssid;
198 if (is_zero_ether_addr(bssid))
199 bssid = wpa_s->pending_bssid;
200 wpa_msg(wpa_s, MSG_INFO, "Authentication with " MACSTR " timed out.",
202 wpa_blacklist_add(wpa_s, bssid);
203 wpa_sm_notify_disassoc(wpa_s->wpa);
204 wpa_supplicant_disassociate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
205 wpa_s->reassociate = 1;
206 wpa_supplicant_req_scan(wpa_s, 0, 0);
211 * wpa_supplicant_req_auth_timeout - Schedule a timeout for authentication
212 * @wpa_s: Pointer to wpa_supplicant data
213 * @sec: Number of seconds after which to time out authentication
214 * @usec: Number of microseconds after which to time out authentication
216 * This function is used to schedule a timeout for the current authentication
219 void wpa_supplicant_req_auth_timeout(struct wpa_supplicant *wpa_s,
222 if (wpa_s->conf && wpa_s->conf->ap_scan == 0 &&
223 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED))
226 wpa_msg(wpa_s, MSG_DEBUG, "Setting authentication timeout: %d sec "
227 "%d usec", sec, usec);
228 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
229 eloop_register_timeout(sec, usec, wpa_supplicant_timeout, wpa_s, NULL);
234 * wpa_supplicant_cancel_auth_timeout - Cancel authentication timeout
235 * @wpa_s: Pointer to wpa_supplicant data
237 * This function is used to cancel authentication timeout scheduled with
238 * wpa_supplicant_req_auth_timeout() and it is called when authentication has
241 void wpa_supplicant_cancel_auth_timeout(struct wpa_supplicant *wpa_s)
243 wpa_msg(wpa_s, MSG_DEBUG, "Cancelling authentication timeout");
244 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
245 wpa_blacklist_del(wpa_s, wpa_s->bssid);
250 * wpa_supplicant_initiate_eapol - Configure EAPOL state machine
251 * @wpa_s: Pointer to wpa_supplicant data
253 * This function is used to configure EAPOL state machine based on the selected
254 * authentication mode.
256 void wpa_supplicant_initiate_eapol(struct wpa_supplicant *wpa_s)
258 #ifdef IEEE8021X_EAPOL
259 struct eapol_config eapol_conf;
260 struct wpa_ssid *ssid = wpa_s->current_ssid;
262 #ifdef CONFIG_IBSS_RSN
263 if (ssid->mode == WPAS_MODE_IBSS &&
264 wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
265 wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
267 * RSN IBSS authentication is per-STA and we can disable the
268 * per-BSSID EAPOL authentication.
270 eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
271 eapol_sm_notify_eap_success(wpa_s->eapol, TRUE);
272 eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
275 #endif /* CONFIG_IBSS_RSN */
277 eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
278 eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
280 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
281 wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE)
282 eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
284 eapol_sm_notify_portControl(wpa_s->eapol, Auto);
286 os_memset(&eapol_conf, 0, sizeof(eapol_conf));
287 if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
288 eapol_conf.accept_802_1x_keys = 1;
289 eapol_conf.required_keys = 0;
290 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_UNICAST) {
291 eapol_conf.required_keys |= EAPOL_REQUIRE_KEY_UNICAST;
293 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_BROADCAST) {
294 eapol_conf.required_keys |=
295 EAPOL_REQUIRE_KEY_BROADCAST;
298 if (wpa_s->conf && (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED))
299 eapol_conf.required_keys = 0;
302 eapol_conf.fast_reauth = wpa_s->conf->fast_reauth;
303 eapol_conf.workaround = ssid->eap_workaround;
304 eapol_conf.eap_disabled =
305 !wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) &&
306 wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA &&
307 wpa_s->key_mgmt != WPA_KEY_MGMT_WPS;
308 eapol_sm_notify_config(wpa_s->eapol, &ssid->eap, &eapol_conf);
309 #endif /* IEEE8021X_EAPOL */
314 * wpa_supplicant_set_non_wpa_policy - Set WPA parameters to non-WPA mode
315 * @wpa_s: Pointer to wpa_supplicant data
316 * @ssid: Configuration data for the network
318 * This function is used to configure WPA state machine and related parameters
319 * to a mode where WPA is not enabled. This is called as part of the
320 * authentication configuration when the selected network does not use WPA.
322 void wpa_supplicant_set_non_wpa_policy(struct wpa_supplicant *wpa_s,
323 struct wpa_ssid *ssid)
327 if (ssid->key_mgmt & WPA_KEY_MGMT_WPS)
328 wpa_s->key_mgmt = WPA_KEY_MGMT_WPS;
329 else if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA)
330 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_NO_WPA;
332 wpa_s->key_mgmt = WPA_KEY_MGMT_NONE;
333 wpa_sm_set_ap_wpa_ie(wpa_s->wpa, NULL, 0);
334 wpa_sm_set_ap_rsn_ie(wpa_s->wpa, NULL, 0);
335 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
336 wpa_s->pairwise_cipher = WPA_CIPHER_NONE;
337 wpa_s->group_cipher = WPA_CIPHER_NONE;
338 wpa_s->mgmt_group_cipher = 0;
340 for (i = 0; i < NUM_WEP_KEYS; i++) {
341 if (ssid->wep_key_len[i] > 5) {
342 wpa_s->pairwise_cipher = WPA_CIPHER_WEP104;
343 wpa_s->group_cipher = WPA_CIPHER_WEP104;
345 } else if (ssid->wep_key_len[i] > 0) {
346 wpa_s->pairwise_cipher = WPA_CIPHER_WEP40;
347 wpa_s->group_cipher = WPA_CIPHER_WEP40;
352 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED, 0);
353 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
354 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
355 wpa_s->pairwise_cipher);
356 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
357 #ifdef CONFIG_IEEE80211W
358 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
359 wpa_s->mgmt_group_cipher);
360 #endif /* CONFIG_IEEE80211W */
362 pmksa_cache_clear_current(wpa_s->wpa);
366 static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s)
368 bgscan_deinit(wpa_s);
369 scard_deinit(wpa_s->scard);
371 wpa_sm_set_scard_ctx(wpa_s->wpa, NULL);
372 eapol_sm_register_scard_ctx(wpa_s->eapol, NULL);
373 l2_packet_deinit(wpa_s->l2);
376 l2_packet_deinit(wpa_s->l2_br);
380 if (wpa_s->ctrl_iface) {
381 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
382 wpa_s->ctrl_iface = NULL;
384 if (wpa_s->conf != NULL) {
385 struct wpa_ssid *ssid;
386 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
387 wpas_notify_network_removed(wpa_s, ssid);
388 wpa_config_free(wpa_s->conf);
392 os_free(wpa_s->confname);
393 wpa_s->confname = NULL;
395 wpa_sm_set_eapol(wpa_s->wpa, NULL);
396 eapol_sm_deinit(wpa_s->eapol);
399 rsn_preauth_deinit(wpa_s->wpa);
401 pmksa_candidate_free(wpa_s->wpa);
402 wpa_sm_deinit(wpa_s->wpa);
404 wpa_blacklist_clear(wpa_s);
406 wpa_bss_deinit(wpa_s);
408 wpa_supplicant_cancel_scan(wpa_s);
409 wpa_supplicant_cancel_auth_timeout(wpa_s);
411 ieee80211_sta_deinit(wpa_s);
413 wpas_wps_deinit(wpa_s);
415 wpabuf_free(wpa_s->pending_eapol_rx);
416 wpa_s->pending_eapol_rx = NULL;
418 #ifdef CONFIG_IBSS_RSN
419 ibss_rsn_deinit(wpa_s->ibss_rsn);
420 wpa_s->ibss_rsn = NULL;
421 #endif /* CONFIG_IBSS_RSN */
424 os_free(wpa_s->sme.ft_ies);
425 wpa_s->sme.ft_ies = NULL;
426 wpa_s->sme.ft_ies_len = 0;
427 #endif /* CONFIG_SME */
430 wpa_supplicant_ap_deinit(wpa_s);
431 #endif /* CONFIG_AP */
434 wpas_p2p_deinit(wpa_s);
435 #endif /* CONFIG_P2P */
437 os_free(wpa_s->next_scan_freqs);
438 wpa_s->next_scan_freqs = NULL;
443 * wpa_clear_keys - Clear keys configured for the driver
444 * @wpa_s: Pointer to wpa_supplicant data
445 * @addr: Previously used BSSID or %NULL if not available
447 * This function clears the encryption keys that has been previously configured
450 void wpa_clear_keys(struct wpa_supplicant *wpa_s, const u8 *addr)
452 u8 *bcast = (u8 *) "\xff\xff\xff\xff\xff\xff";
454 if (wpa_s->keys_cleared) {
455 /* Some drivers (e.g., ndiswrapper & NDIS drivers) seem to have
456 * timing issues with keys being cleared just before new keys
457 * are set or just after association or something similar. This
458 * shows up in group key handshake failing often because of the
459 * client not receiving the first encrypted packets correctly.
460 * Skipping some of the extra key clearing steps seems to help
461 * in completing group key handshake more reliably. */
462 wpa_printf(MSG_DEBUG, "No keys have been configured - "
463 "skip key clearing");
467 /* MLME-DELETEKEYS.request */
468 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, bcast, 0, 0, NULL, 0, NULL, 0);
469 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, bcast, 1, 0, NULL, 0, NULL, 0);
470 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, bcast, 2, 0, NULL, 0, NULL, 0);
471 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, bcast, 3, 0, NULL, 0, NULL, 0);
472 #ifdef CONFIG_IEEE80211W
473 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, bcast, 4, 0, NULL, 0, NULL, 0);
474 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, bcast, 5, 0, NULL, 0, NULL, 0);
475 #endif /* CONFIG_IEEE80211W */
477 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, addr, 0, 0, NULL, 0, NULL,
479 /* MLME-SETPROTECTION.request(None) */
480 wpa_drv_mlme_setprotection(
482 MLME_SETPROTECTION_PROTECT_TYPE_NONE,
483 MLME_SETPROTECTION_KEY_TYPE_PAIRWISE);
485 wpa_s->keys_cleared = 1;
490 * wpa_supplicant_state_txt - Get the connection state name as a text string
491 * @state: State (wpa_state; WPA_*)
492 * Returns: The state name as a printable text string
494 const char * wpa_supplicant_state_txt(enum wpa_states state)
497 case WPA_DISCONNECTED:
498 return "DISCONNECTED";
501 case WPA_INTERFACE_DISABLED:
502 return "INTERFACE_DISABLED";
505 case WPA_AUTHENTICATING:
506 return "AUTHENTICATING";
507 case WPA_ASSOCIATING:
508 return "ASSOCIATING";
511 case WPA_4WAY_HANDSHAKE:
512 return "4WAY_HANDSHAKE";
513 case WPA_GROUP_HANDSHAKE:
514 return "GROUP_HANDSHAKE";
524 * wpa_supplicant_set_state - Set current connection state
525 * @wpa_s: Pointer to wpa_supplicant data
526 * @state: The new connection state
528 * This function is called whenever the connection state changes, e.g.,
529 * association is completed for WPA/WPA2 4-Way Handshake is started.
531 void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s,
532 enum wpa_states state)
534 enum wpa_states old_state = wpa_s->wpa_state;
536 wpa_printf(MSG_DEBUG, "State: %s -> %s",
537 wpa_supplicant_state_txt(wpa_s->wpa_state),
538 wpa_supplicant_state_txt(state));
540 if (state != WPA_SCANNING)
541 wpa_supplicant_notify_scanning(wpa_s, 0);
543 if (state == WPA_COMPLETED && wpa_s->new_connection) {
544 #if defined(CONFIG_CTRL_IFACE) || !defined(CONFIG_NO_STDOUT_DEBUG)
545 struct wpa_ssid *ssid = wpa_s->current_ssid;
546 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_CONNECTED "- Connection to "
547 MACSTR " completed %s [id=%d id_str=%s]",
548 MAC2STR(wpa_s->bssid), wpa_s->reassociated_connection ?
549 "(reauth)" : "(auth)",
550 ssid ? ssid->id : -1,
551 ssid && ssid->id_str ? ssid->id_str : "");
552 #endif /* CONFIG_CTRL_IFACE || !CONFIG_NO_STDOUT_DEBUG */
553 wpa_s->new_connection = 0;
554 wpa_s->reassociated_connection = 1;
555 wpa_drv_set_operstate(wpa_s, 1);
556 #ifndef IEEE8021X_EAPOL
557 wpa_drv_set_supp_port(wpa_s, 1);
558 #endif /* IEEE8021X_EAPOL */
559 wpa_s->after_wps = 0;
561 wpas_p2p_completed(wpa_s);
562 #endif /* CONFIG_P2P */
563 } else if (state == WPA_DISCONNECTED || state == WPA_ASSOCIATING ||
564 state == WPA_ASSOCIATED) {
565 wpa_s->new_connection = 1;
566 wpa_drv_set_operstate(wpa_s, 0);
567 #ifndef IEEE8021X_EAPOL
568 wpa_drv_set_supp_port(wpa_s, 0);
569 #endif /* IEEE8021X_EAPOL */
571 wpa_s->wpa_state = state;
573 if (wpa_s->wpa_state != old_state)
574 wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
578 void wpa_supplicant_terminate_proc(struct wpa_global *global)
582 struct wpa_supplicant *wpa_s = global->ifaces;
584 if (wpas_wps_terminate_pending(wpa_s) == 1)
588 #endif /* CONFIG_WPS */
595 static void wpa_supplicant_terminate(int sig, void *signal_ctx)
597 struct wpa_global *global = signal_ctx;
598 struct wpa_supplicant *wpa_s;
599 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
600 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TERMINATING "- signal %d "
603 wpa_supplicant_terminate_proc(global);
607 void wpa_supplicant_clear_status(struct wpa_supplicant *wpa_s)
609 enum wpa_states old_state = wpa_s->wpa_state;
611 wpa_s->pairwise_cipher = 0;
612 wpa_s->group_cipher = 0;
613 wpa_s->mgmt_group_cipher = 0;
615 if (wpa_s->wpa_state != WPA_INTERFACE_DISABLED)
616 wpa_s->wpa_state = WPA_DISCONNECTED;
618 if (wpa_s->wpa_state != old_state)
619 wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
624 * wpa_supplicant_reload_configuration - Reload configuration data
625 * @wpa_s: Pointer to wpa_supplicant data
626 * Returns: 0 on success or -1 if configuration parsing failed
628 * This function can be used to request that the configuration data is reloaded
629 * (e.g., after configuration file change). This function is reloading
630 * configuration only for one interface, so this may need to be called multiple
631 * times if %wpa_supplicant is controlling multiple interfaces and all
632 * interfaces need reconfiguration.
634 int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s)
636 struct wpa_config *conf;
637 struct wpa_ssid *old_ssid;
641 if (wpa_s->confname == NULL)
643 conf = wpa_config_read(wpa_s->confname);
645 wpa_msg(wpa_s, MSG_ERROR, "Failed to parse the configuration "
646 "file '%s' - exiting", wpa_s->confname);
649 conf->changed_parameters = (unsigned int) -1;
651 reconf_ctrl = !!conf->ctrl_interface != !!wpa_s->conf->ctrl_interface
652 || (conf->ctrl_interface && wpa_s->conf->ctrl_interface &&
653 os_strcmp(conf->ctrl_interface,
654 wpa_s->conf->ctrl_interface) != 0);
656 if (reconf_ctrl && wpa_s->ctrl_iface) {
657 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
658 wpa_s->ctrl_iface = NULL;
661 eapol_sm_invalidate_cached_session(wpa_s->eapol);
662 old_ssid = wpa_s->current_ssid;
663 wpa_s->current_ssid = NULL;
664 if (old_ssid != wpa_s->current_ssid)
665 wpas_notify_network_changed(wpa_s);
668 * TODO: should notify EAPOL SM about changes in opensc_engine_path,
669 * pkcs11_engine_path, pkcs11_module_path.
671 if (wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt)) {
673 * Clear forced success to clear EAP state for next
676 eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
678 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
679 wpa_sm_set_config(wpa_s->wpa, NULL);
680 wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
681 rsn_preauth_deinit(wpa_s->wpa);
683 old_ap_scan = wpa_s->conf->ap_scan;
684 wpa_config_free(wpa_s->conf);
686 if (old_ap_scan != wpa_s->conf->ap_scan)
687 wpas_notify_ap_scan_changed(wpa_s);
690 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
692 wpa_supplicant_update_config(wpa_s);
694 wpa_supplicant_clear_status(wpa_s);
695 if (wpa_supplicant_enabled_networks(wpa_s->conf)) {
696 wpa_s->reassociate = 1;
697 wpa_supplicant_req_scan(wpa_s, 0, 0);
699 wpa_msg(wpa_s, MSG_DEBUG, "Reconfiguration completed");
704 static void wpa_supplicant_reconfig(int sig, void *signal_ctx)
706 struct wpa_global *global = signal_ctx;
707 struct wpa_supplicant *wpa_s;
708 wpa_printf(MSG_DEBUG, "Signal %d received - reconfiguring", sig);
709 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
710 if (wpa_supplicant_reload_configuration(wpa_s) < 0) {
711 wpa_supplicant_terminate_proc(global);
717 enum wpa_cipher cipher_suite2driver(int cipher)
720 case WPA_CIPHER_NONE:
722 case WPA_CIPHER_WEP40:
724 case WPA_CIPHER_WEP104:
725 return CIPHER_WEP104;
726 case WPA_CIPHER_CCMP:
728 case WPA_CIPHER_TKIP:
735 enum wpa_key_mgmt key_mgmt2driver(int key_mgmt)
738 case WPA_KEY_MGMT_NONE:
739 return KEY_MGMT_NONE;
740 case WPA_KEY_MGMT_IEEE8021X_NO_WPA:
741 return KEY_MGMT_802_1X_NO_WPA;
742 case WPA_KEY_MGMT_IEEE8021X:
743 return KEY_MGMT_802_1X;
744 case WPA_KEY_MGMT_WPA_NONE:
745 return KEY_MGMT_WPA_NONE;
746 case WPA_KEY_MGMT_FT_IEEE8021X:
747 return KEY_MGMT_FT_802_1X;
748 case WPA_KEY_MGMT_FT_PSK:
749 return KEY_MGMT_FT_PSK;
750 case WPA_KEY_MGMT_IEEE8021X_SHA256:
751 return KEY_MGMT_802_1X_SHA256;
752 case WPA_KEY_MGMT_PSK_SHA256:
753 return KEY_MGMT_PSK_SHA256;
754 case WPA_KEY_MGMT_WPS:
756 case WPA_KEY_MGMT_PSK:
763 static int wpa_supplicant_suites_from_ai(struct wpa_supplicant *wpa_s,
764 struct wpa_ssid *ssid,
765 struct wpa_ie_data *ie)
767 int ret = wpa_sm_parse_own_wpa_ie(wpa_s->wpa, ie);
770 wpa_msg(wpa_s, MSG_INFO, "WPA: Failed to parse WPA IE "
771 "from association info");
776 wpa_printf(MSG_DEBUG, "WPA: Using WPA IE from AssocReq to set cipher "
778 if (!(ie->group_cipher & ssid->group_cipher)) {
779 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled group "
780 "cipher 0x%x (mask 0x%x) - reject",
781 ie->group_cipher, ssid->group_cipher);
784 if (!(ie->pairwise_cipher & ssid->pairwise_cipher)) {
785 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled pairwise "
786 "cipher 0x%x (mask 0x%x) - reject",
787 ie->pairwise_cipher, ssid->pairwise_cipher);
790 if (!(ie->key_mgmt & ssid->key_mgmt)) {
791 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled key "
792 "management 0x%x (mask 0x%x) - reject",
793 ie->key_mgmt, ssid->key_mgmt);
797 #ifdef CONFIG_IEEE80211W
798 if (!(ie->capabilities & WPA_CAPABILITY_MFPC) &&
799 ssid->ieee80211w == MGMT_FRAME_PROTECTION_REQUIRED) {
800 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver associated with an AP "
801 "that does not support management frame protection - "
805 #endif /* CONFIG_IEEE80211W */
812 * wpa_supplicant_set_suites - Set authentication and encryption parameters
813 * @wpa_s: Pointer to wpa_supplicant data
814 * @bss: Scan results for the selected BSS, or %NULL if not available
815 * @ssid: Configuration data for the selected network
816 * @wpa_ie: Buffer for the WPA/RSN IE
817 * @wpa_ie_len: Maximum wpa_ie buffer size on input. This is changed to be the
818 * used buffer length in case the functions returns success.
819 * Returns: 0 on success or -1 on failure
821 * This function is used to configure authentication and encryption parameters
822 * based on the network configuration and scan result for the selected BSS (if
825 int wpa_supplicant_set_suites(struct wpa_supplicant *wpa_s,
826 struct wpa_bss *bss, struct wpa_ssid *ssid,
827 u8 *wpa_ie, size_t *wpa_ie_len)
829 struct wpa_ie_data ie;
831 const u8 *bss_wpa, *bss_rsn;
834 bss_wpa = wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE);
835 bss_rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
837 bss_wpa = bss_rsn = NULL;
839 if (bss_rsn && (ssid->proto & WPA_PROTO_RSN) &&
840 wpa_parse_wpa_ie(bss_rsn, 2 + bss_rsn[1], &ie) == 0 &&
841 (ie.group_cipher & ssid->group_cipher) &&
842 (ie.pairwise_cipher & ssid->pairwise_cipher) &&
843 (ie.key_mgmt & ssid->key_mgmt)) {
844 wpa_msg(wpa_s, MSG_DEBUG, "RSN: using IEEE 802.11i/D9.0");
845 proto = WPA_PROTO_RSN;
846 } else if (bss_wpa && (ssid->proto & WPA_PROTO_WPA) &&
847 wpa_parse_wpa_ie(bss_wpa, 2 +bss_wpa[1], &ie) == 0 &&
848 (ie.group_cipher & ssid->group_cipher) &&
849 (ie.pairwise_cipher & ssid->pairwise_cipher) &&
850 (ie.key_mgmt & ssid->key_mgmt)) {
851 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using IEEE 802.11i/D3.0");
852 proto = WPA_PROTO_WPA;
854 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select WPA/RSN");
857 if (ssid->proto & WPA_PROTO_RSN)
858 proto = WPA_PROTO_RSN;
860 proto = WPA_PROTO_WPA;
861 if (wpa_supplicant_suites_from_ai(wpa_s, ssid, &ie) < 0) {
862 os_memset(&ie, 0, sizeof(ie));
863 ie.group_cipher = ssid->group_cipher;
864 ie.pairwise_cipher = ssid->pairwise_cipher;
865 ie.key_mgmt = ssid->key_mgmt;
866 #ifdef CONFIG_IEEE80211W
867 ie.mgmt_group_cipher =
868 ssid->ieee80211w != NO_MGMT_FRAME_PROTECTION ?
869 WPA_CIPHER_AES_128_CMAC : 0;
870 #endif /* CONFIG_IEEE80211W */
871 wpa_printf(MSG_DEBUG, "WPA: Set cipher suites based "
877 wpa_printf(MSG_DEBUG, "WPA: Selected cipher suites: group %d "
878 "pairwise %d key_mgmt %d proto %d",
879 ie.group_cipher, ie.pairwise_cipher, ie.key_mgmt, proto);
880 #ifdef CONFIG_IEEE80211W
881 if (ssid->ieee80211w) {
882 wpa_printf(MSG_DEBUG, "WPA: Selected mgmt group cipher %d",
883 ie.mgmt_group_cipher);
885 #endif /* CONFIG_IEEE80211W */
887 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PROTO, proto);
888 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED,
889 !!(ssid->proto & WPA_PROTO_RSN));
891 if (bss || !wpa_s->ap_ies_from_associnfo) {
892 if (wpa_sm_set_ap_wpa_ie(wpa_s->wpa, bss_wpa,
893 bss_wpa ? 2 + bss_wpa[1] : 0) ||
894 wpa_sm_set_ap_rsn_ie(wpa_s->wpa, bss_rsn,
895 bss_rsn ? 2 + bss_rsn[1] : 0))
899 sel = ie.group_cipher & ssid->group_cipher;
900 if (sel & WPA_CIPHER_CCMP) {
901 wpa_s->group_cipher = WPA_CIPHER_CCMP;
902 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using GTK CCMP");
903 } else if (sel & WPA_CIPHER_TKIP) {
904 wpa_s->group_cipher = WPA_CIPHER_TKIP;
905 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using GTK TKIP");
906 } else if (sel & WPA_CIPHER_WEP104) {
907 wpa_s->group_cipher = WPA_CIPHER_WEP104;
908 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using GTK WEP104");
909 } else if (sel & WPA_CIPHER_WEP40) {
910 wpa_s->group_cipher = WPA_CIPHER_WEP40;
911 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using GTK WEP40");
913 wpa_printf(MSG_WARNING, "WPA: Failed to select group cipher.");
917 sel = ie.pairwise_cipher & ssid->pairwise_cipher;
918 if (sel & WPA_CIPHER_CCMP) {
919 wpa_s->pairwise_cipher = WPA_CIPHER_CCMP;
920 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using PTK CCMP");
921 } else if (sel & WPA_CIPHER_TKIP) {
922 wpa_s->pairwise_cipher = WPA_CIPHER_TKIP;
923 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using PTK TKIP");
924 } else if (sel & WPA_CIPHER_NONE) {
925 wpa_s->pairwise_cipher = WPA_CIPHER_NONE;
926 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using PTK NONE");
928 wpa_printf(MSG_WARNING, "WPA: Failed to select pairwise "
933 sel = ie.key_mgmt & ssid->key_mgmt;
935 #ifdef CONFIG_IEEE80211R
936 } else if (sel & WPA_KEY_MGMT_FT_IEEE8021X) {
937 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_IEEE8021X;
938 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/802.1X");
939 } else if (sel & WPA_KEY_MGMT_FT_PSK) {
940 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_PSK;
941 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/PSK");
942 #endif /* CONFIG_IEEE80211R */
943 #ifdef CONFIG_IEEE80211W
944 } else if (sel & WPA_KEY_MGMT_IEEE8021X_SHA256) {
945 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SHA256;
946 wpa_msg(wpa_s, MSG_DEBUG,
947 "WPA: using KEY_MGMT 802.1X with SHA256");
948 } else if (sel & WPA_KEY_MGMT_PSK_SHA256) {
949 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK_SHA256;
950 wpa_msg(wpa_s, MSG_DEBUG,
951 "WPA: using KEY_MGMT PSK with SHA256");
952 #endif /* CONFIG_IEEE80211W */
953 } else if (sel & WPA_KEY_MGMT_IEEE8021X) {
954 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X;
955 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT 802.1X");
956 } else if (sel & WPA_KEY_MGMT_PSK) {
957 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK;
958 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-PSK");
959 } else if (sel & WPA_KEY_MGMT_WPA_NONE) {
960 wpa_s->key_mgmt = WPA_KEY_MGMT_WPA_NONE;
961 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-NONE");
963 wpa_printf(MSG_WARNING, "WPA: Failed to select authenticated "
964 "key management type.");
968 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
969 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
970 wpa_s->pairwise_cipher);
971 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
973 #ifdef CONFIG_IEEE80211W
974 sel = ie.mgmt_group_cipher;
975 if (ssid->ieee80211w == NO_MGMT_FRAME_PROTECTION ||
976 !(ie.capabilities & WPA_CAPABILITY_MFPC))
978 if (sel & WPA_CIPHER_AES_128_CMAC) {
979 wpa_s->mgmt_group_cipher = WPA_CIPHER_AES_128_CMAC;
980 wpa_msg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
983 wpa_s->mgmt_group_cipher = 0;
984 wpa_msg(wpa_s, MSG_DEBUG, "WPA: not using MGMT group cipher");
986 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
987 wpa_s->mgmt_group_cipher);
988 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MFP, ssid->ieee80211w);
989 #endif /* CONFIG_IEEE80211W */
991 if (wpa_sm_set_assoc_wpa_ie_default(wpa_s->wpa, wpa_ie, wpa_ie_len)) {
992 wpa_printf(MSG_WARNING, "WPA: Failed to generate WPA IE.");
997 (WPA_KEY_MGMT_PSK | WPA_KEY_MGMT_FT_PSK | WPA_KEY_MGMT_PSK_SHA256))
998 wpa_sm_set_pmk(wpa_s->wpa, ssid->psk, PMK_LEN);
1000 wpa_sm_set_pmk_from_pmksa(wpa_s->wpa);
1007 * wpa_supplicant_associate - Request association
1008 * @wpa_s: Pointer to wpa_supplicant data
1009 * @bss: Scan results for the selected BSS, or %NULL if not available
1010 * @ssid: Configuration data for the selected network
1012 * This function is used to request %wpa_supplicant to associate with a BSS.
1014 void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
1015 struct wpa_bss *bss, struct wpa_ssid *ssid)
1019 int use_crypt, ret, i, bssid_changed;
1020 int algs = WPA_AUTH_ALG_OPEN;
1021 enum wpa_cipher cipher_pairwise, cipher_group;
1022 struct wpa_driver_associate_params params;
1023 int wep_keys_set = 0;
1024 struct wpa_driver_capa capa;
1025 int assoc_failed = 0;
1026 struct wpa_ssid *old_ssid;
1028 if (ssid->mode == WPAS_MODE_AP || ssid->mode == WPAS_MODE_P2P_GO ||
1029 ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) {
1031 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_AP)) {
1032 wpa_printf(MSG_INFO, "Driver does not support AP "
1036 wpa_supplicant_create_ap(wpa_s, ssid);
1037 wpa_s->current_bss = bss;
1038 #else /* CONFIG_AP */
1039 wpa_printf(MSG_ERROR, "AP mode support not included in the "
1041 #endif /* CONFIG_AP */
1045 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) &&
1046 ssid->mode == IEEE80211_MODE_INFRA) {
1047 sme_authenticate(wpa_s, bss, ssid);
1051 os_memset(¶ms, 0, sizeof(params));
1052 wpa_s->reassociate = 0;
1054 #ifdef CONFIG_IEEE80211R
1055 const u8 *ie, *md = NULL;
1056 #endif /* CONFIG_IEEE80211R */
1057 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with " MACSTR
1058 " (SSID='%s' freq=%d MHz)", MAC2STR(bss->bssid),
1059 wpa_ssid_txt(bss->ssid, bss->ssid_len), bss->freq);
1060 bssid_changed = !is_zero_ether_addr(wpa_s->bssid);
1061 os_memset(wpa_s->bssid, 0, ETH_ALEN);
1062 os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN);
1064 wpas_notify_bssid_changed(wpa_s);
1065 #ifdef CONFIG_IEEE80211R
1066 ie = wpa_bss_get_ie(bss, WLAN_EID_MOBILITY_DOMAIN);
1067 if (ie && ie[1] >= MOBILITY_DOMAIN_ID_LEN)
1069 wpa_sm_set_ft_params(wpa_s->wpa, ie, ie ? 2 + ie[1] : 0);
1071 /* Prepare for the next transition */
1072 wpa_ft_prepare_auth_request(wpa_s->wpa, ie);
1074 #endif /* CONFIG_IEEE80211R */
1076 } else if ((ssid->ssid == NULL || ssid->ssid_len == 0) &&
1077 wpa_s->conf->ap_scan == 2 &&
1078 (ssid->key_mgmt & WPA_KEY_MGMT_WPS)) {
1079 /* Use ap_scan==1 style network selection to find the network
1081 wpa_s->scan_req = 2;
1082 wpa_s->reassociate = 1;
1083 wpa_supplicant_req_scan(wpa_s, 0, 0);
1085 #endif /* CONFIG_WPS */
1087 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with SSID '%s'",
1088 wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
1089 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
1091 wpa_supplicant_cancel_scan(wpa_s);
1093 /* Starting new association, so clear the possibly used WPA IE from the
1094 * previous association. */
1095 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
1097 #ifdef IEEE8021X_EAPOL
1098 if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1100 if (ssid->non_leap == 0)
1101 algs = WPA_AUTH_ALG_LEAP;
1103 algs |= WPA_AUTH_ALG_LEAP;
1106 #endif /* IEEE8021X_EAPOL */
1107 wpa_printf(MSG_DEBUG, "Automatic auth_alg selection: 0x%x", algs);
1108 if (ssid->auth_alg) {
1109 algs = ssid->auth_alg;
1110 wpa_printf(MSG_DEBUG, "Overriding auth_alg selection: 0x%x",
1114 if (bss && (wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE) ||
1115 wpa_bss_get_ie(bss, WLAN_EID_RSN)) &&
1116 (ssid->key_mgmt & (WPA_KEY_MGMT_IEEE8021X | WPA_KEY_MGMT_PSK |
1117 WPA_KEY_MGMT_FT_IEEE8021X |
1118 WPA_KEY_MGMT_FT_PSK |
1119 WPA_KEY_MGMT_IEEE8021X_SHA256 |
1120 WPA_KEY_MGMT_PSK_SHA256))) {
1121 int try_opportunistic;
1122 try_opportunistic = ssid->proactive_key_caching &&
1123 (ssid->proto & WPA_PROTO_RSN);
1124 if (pmksa_cache_set_current(wpa_s->wpa, NULL, bss->bssid,
1125 wpa_s->current_ssid,
1126 try_opportunistic) == 0)
1127 eapol_sm_notify_pmkid_attempt(wpa_s->eapol, 1);
1128 wpa_ie_len = sizeof(wpa_ie);
1129 if (wpa_supplicant_set_suites(wpa_s, bss, ssid,
1130 wpa_ie, &wpa_ie_len)) {
1131 wpa_printf(MSG_WARNING, "WPA: Failed to set WPA key "
1132 "management and encryption suites");
1135 } else if (ssid->key_mgmt &
1136 (WPA_KEY_MGMT_PSK | WPA_KEY_MGMT_IEEE8021X |
1137 WPA_KEY_MGMT_WPA_NONE | WPA_KEY_MGMT_FT_PSK |
1138 WPA_KEY_MGMT_FT_IEEE8021X | WPA_KEY_MGMT_PSK_SHA256 |
1139 WPA_KEY_MGMT_IEEE8021X_SHA256)) {
1140 wpa_ie_len = sizeof(wpa_ie);
1141 if (wpa_supplicant_set_suites(wpa_s, NULL, ssid,
1142 wpa_ie, &wpa_ie_len)) {
1143 wpa_printf(MSG_WARNING, "WPA: Failed to set WPA key "
1144 "management and encryption suites (no scan "
1149 } else if (ssid->key_mgmt & WPA_KEY_MGMT_WPS) {
1150 struct wpabuf *wps_ie;
1151 wps_ie = wps_build_assoc_req_ie(wpas_wps_get_req_type(ssid));
1152 if (wps_ie && wpabuf_len(wps_ie) <= sizeof(wpa_ie)) {
1153 wpa_ie_len = wpabuf_len(wps_ie);
1154 os_memcpy(wpa_ie, wpabuf_head(wps_ie), wpa_ie_len);
1157 wpabuf_free(wps_ie);
1158 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
1159 if (!bss || (bss->caps & IEEE80211_CAP_PRIVACY))
1160 params.wps = WPS_MODE_PRIVACY;
1162 params.wps = WPS_MODE_OPEN;
1163 #endif /* CONFIG_WPS */
1165 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
1170 if (wpa_s->global->p2p) {
1175 p2p_group = wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_CAPABLE;
1176 pos = wpa_ie + wpa_ie_len;
1177 len = sizeof(wpa_ie) - wpa_ie_len;
1178 res = wpas_p2p_assoc_req_ie(wpa_s, bss, pos, len, p2p_group);
1183 wpa_s->cross_connect_disallowed = 0;
1186 p2p = wpa_bss_get_vendor_ie_multi(bss, P2P_IE_VENDOR_TYPE);
1188 wpa_s->cross_connect_disallowed =
1189 p2p_get_cross_connect_disallowed(p2p);
1191 wpa_printf(MSG_DEBUG, "P2P: WLAN AP %s cross "
1193 wpa_s->cross_connect_disallowed ?
1194 "disallows" : "allows");
1197 #endif /* CONFIG_P2P */
1199 wpa_clear_keys(wpa_s, bss ? bss->bssid : NULL);
1201 cipher_pairwise = cipher_suite2driver(wpa_s->pairwise_cipher);
1202 cipher_group = cipher_suite2driver(wpa_s->group_cipher);
1203 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
1204 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1205 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE)
1207 if (wpa_set_wep_keys(wpa_s, ssid)) {
1212 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS)
1215 #ifdef IEEE8021X_EAPOL
1216 if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1217 if ((ssid->eapol_flags &
1218 (EAPOL_FLAG_REQUIRE_KEY_UNICAST |
1219 EAPOL_FLAG_REQUIRE_KEY_BROADCAST)) == 0 &&
1223 /* Assume that dynamic WEP-104 keys will be used and
1224 * set cipher suites in order for drivers to expect
1226 cipher_pairwise = cipher_group = CIPHER_WEP104;
1229 #endif /* IEEE8021X_EAPOL */
1231 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
1232 /* Set the key before (and later after) association */
1233 wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
1236 wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING);
1238 params.bssid = bss->bssid;
1239 params.ssid = bss->ssid;
1240 params.ssid_len = bss->ssid_len;
1241 params.freq = bss->freq;
1243 params.ssid = ssid->ssid;
1244 params.ssid_len = ssid->ssid_len;
1246 if (ssid->mode == WPAS_MODE_IBSS && ssid->frequency > 0 &&
1248 params.freq = ssid->frequency; /* Initial channel for IBSS */
1249 params.wpa_ie = wpa_ie;
1250 params.wpa_ie_len = wpa_ie_len;
1251 params.pairwise_suite = cipher_pairwise;
1252 params.group_suite = cipher_group;
1253 params.key_mgmt_suite = key_mgmt2driver(wpa_s->key_mgmt);
1254 params.auth_alg = algs;
1255 params.mode = ssid->mode;
1256 for (i = 0; i < NUM_WEP_KEYS; i++) {
1257 if (ssid->wep_key_len[i])
1258 params.wep_key[i] = ssid->wep_key[i];
1259 params.wep_key_len[i] = ssid->wep_key_len[i];
1261 params.wep_tx_keyidx = ssid->wep_tx_keyidx;
1263 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) &&
1264 (params.key_mgmt_suite == KEY_MGMT_PSK ||
1265 params.key_mgmt_suite == KEY_MGMT_FT_PSK)) {
1266 params.passphrase = ssid->passphrase;
1268 params.psk = ssid->psk;
1271 params.drop_unencrypted = use_crypt;
1273 #ifdef CONFIG_IEEE80211W
1274 params.mgmt_frame_protection = ssid->ieee80211w;
1275 if (ssid->ieee80211w != NO_MGMT_FRAME_PROTECTION && bss) {
1276 const u8 *rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
1277 struct wpa_ie_data ie;
1278 if (rsn && wpa_parse_wpa_ie(rsn, 2 + rsn[1], &ie) == 0 &&
1280 (WPA_CAPABILITY_MFPC | WPA_CAPABILITY_MFPR)) {
1281 wpa_printf(MSG_DEBUG, "WPA: Selected AP supports MFP: "
1283 params.mgmt_frame_protection =
1284 MGMT_FRAME_PROTECTION_REQUIRED;
1287 #endif /* CONFIG_IEEE80211W */
1290 if (wpa_s->global->p2p &&
1291 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_CAPABLE))
1293 #endif /* CONFIG_P2P */
1295 if (wpa_s->parent->set_sta_uapsd)
1296 params.uapsd = wpa_s->parent->sta_uapsd;
1300 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME)
1301 ret = ieee80211_sta_associate(wpa_s, ¶ms);
1303 ret = wpa_drv_associate(wpa_s, ¶ms);
1305 wpa_msg(wpa_s, MSG_INFO, "Association request to the driver "
1307 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SANE_ERROR_CODES) {
1309 * The driver is known to mean what is saying, so we
1310 * can stop right here; the association will not
1313 wpas_connection_failed(wpa_s, wpa_s->pending_bssid);
1314 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
1317 /* try to continue anyway; new association will be tried again
1322 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
1323 /* Set the key after the association just in case association
1324 * cleared the previously configured key. */
1325 wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
1326 /* No need to timeout authentication since there is no key
1328 wpa_supplicant_cancel_auth_timeout(wpa_s);
1329 wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
1330 #ifdef CONFIG_IBSS_RSN
1331 } else if (ssid->mode == WPAS_MODE_IBSS &&
1332 wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
1333 wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
1334 ibss_rsn_set_psk(wpa_s->ibss_rsn, ssid->psk);
1336 * RSN IBSS authentication is per-STA and we can disable the
1337 * per-BSSID authentication.
1339 wpa_supplicant_cancel_auth_timeout(wpa_s);
1340 #endif /* CONFIG_IBSS_RSN */
1342 /* Timeout for IEEE 802.11 authentication and association */
1346 /* give IBSS a bit more time */
1347 timeout = ssid->mode == WPAS_MODE_IBSS ? 10 : 5;
1348 } else if (wpa_s->conf->ap_scan == 1) {
1349 /* give IBSS a bit more time */
1350 timeout = ssid->mode == WPAS_MODE_IBSS ? 20 : 10;
1352 wpa_supplicant_req_auth_timeout(wpa_s, timeout, 0);
1355 if (wep_keys_set && wpa_drv_get_capa(wpa_s, &capa) == 0 &&
1356 capa.flags & WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC) {
1357 /* Set static WEP keys again */
1358 wpa_set_wep_keys(wpa_s, ssid);
1361 if (wpa_s->current_ssid && wpa_s->current_ssid != ssid) {
1363 * Do not allow EAP session resumption between different
1364 * network configurations.
1366 eapol_sm_invalidate_cached_session(wpa_s->eapol);
1368 old_ssid = wpa_s->current_ssid;
1369 wpa_s->current_ssid = ssid;
1370 wpa_s->current_bss = bss;
1371 wpa_supplicant_rsn_supp_set_config(wpa_s, wpa_s->current_ssid);
1372 wpa_supplicant_initiate_eapol(wpa_s);
1373 if (old_ssid != wpa_s->current_ssid)
1374 wpas_notify_network_changed(wpa_s);
1378 static void wpa_supplicant_clear_connection(struct wpa_supplicant *wpa_s,
1381 struct wpa_ssid *old_ssid;
1383 wpa_clear_keys(wpa_s, addr);
1384 wpa_supplicant_mark_disassoc(wpa_s);
1385 old_ssid = wpa_s->current_ssid;
1386 wpa_s->current_ssid = NULL;
1387 wpa_s->current_bss = NULL;
1388 wpa_sm_set_config(wpa_s->wpa, NULL);
1389 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
1390 if (old_ssid != wpa_s->current_ssid)
1391 wpas_notify_network_changed(wpa_s);
1392 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
1397 * wpa_supplicant_disassociate - Disassociate the current connection
1398 * @wpa_s: Pointer to wpa_supplicant data
1399 * @reason_code: IEEE 802.11 reason code for the disassociate frame
1401 * This function is used to request %wpa_supplicant to disassociate with the
1404 void wpa_supplicant_disassociate(struct wpa_supplicant *wpa_s,
1409 if (!is_zero_ether_addr(wpa_s->bssid)) {
1410 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME)
1411 ieee80211_sta_disassociate(wpa_s, reason_code);
1413 wpa_drv_disassociate(wpa_s, wpa_s->bssid, reason_code);
1414 addr = wpa_s->bssid;
1417 wpa_supplicant_clear_connection(wpa_s, addr);
1422 * wpa_supplicant_deauthenticate - Deauthenticate the current connection
1423 * @wpa_s: Pointer to wpa_supplicant data
1424 * @reason_code: IEEE 802.11 reason code for the deauthenticate frame
1426 * This function is used to request %wpa_supplicant to deauthenticate from the
1429 void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
1434 if (!is_zero_ether_addr(wpa_s->bssid)) {
1435 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME)
1436 ieee80211_sta_deauthenticate(wpa_s, reason_code);
1438 wpa_drv_deauthenticate(wpa_s, wpa_s->bssid,
1440 addr = wpa_s->bssid;
1443 wpa_supplicant_clear_connection(wpa_s, addr);
1448 * wpa_supplicant_enable_network - Mark a configured network as enabled
1449 * @wpa_s: wpa_supplicant structure for a network interface
1450 * @ssid: wpa_ssid structure for a configured network or %NULL
1452 * Enables the specified network or all networks if no network specified.
1454 void wpa_supplicant_enable_network(struct wpa_supplicant *wpa_s,
1455 struct wpa_ssid *ssid)
1457 struct wpa_ssid *other_ssid;
1461 for (other_ssid = wpa_s->conf->ssid; other_ssid;
1462 other_ssid = other_ssid->next) {
1463 if (other_ssid->disabled == 2)
1464 continue; /* do not change persistent P2P group
1466 if (other_ssid == wpa_s->current_ssid &&
1467 other_ssid->disabled)
1468 wpa_s->reassociate = 1;
1470 was_disabled = other_ssid->disabled;
1472 other_ssid->disabled = 0;
1474 if (was_disabled != other_ssid->disabled)
1475 wpas_notify_network_enabled_changed(
1478 if (wpa_s->reassociate)
1479 wpa_supplicant_req_scan(wpa_s, 0, 0);
1480 } else if (ssid->disabled && ssid->disabled != 2) {
1481 if (wpa_s->current_ssid == NULL) {
1483 * Try to reassociate since there is no current
1484 * configuration and a new network was made available.
1486 wpa_s->reassociate = 1;
1487 wpa_supplicant_req_scan(wpa_s, 0, 0);
1490 was_disabled = ssid->disabled;
1494 if (was_disabled != ssid->disabled)
1495 wpas_notify_network_enabled_changed(wpa_s, ssid);
1501 * wpa_supplicant_disable_network - Mark a configured network as disabled
1502 * @wpa_s: wpa_supplicant structure for a network interface
1503 * @ssid: wpa_ssid structure for a configured network or %NULL
1505 * Disables the specified network or all networks if no network specified.
1507 void wpa_supplicant_disable_network(struct wpa_supplicant *wpa_s,
1508 struct wpa_ssid *ssid)
1510 struct wpa_ssid *other_ssid;
1514 for (other_ssid = wpa_s->conf->ssid; other_ssid;
1515 other_ssid = other_ssid->next) {
1516 was_disabled = other_ssid->disabled;
1517 if (was_disabled == 2)
1518 continue; /* do not change persistent P2P group
1521 other_ssid->disabled = 1;
1523 if (was_disabled != other_ssid->disabled)
1524 wpas_notify_network_enabled_changed(
1527 if (wpa_s->current_ssid)
1528 wpa_supplicant_disassociate(
1529 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
1530 } else if (ssid->disabled != 2) {
1531 if (ssid == wpa_s->current_ssid)
1532 wpa_supplicant_disassociate(
1533 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
1535 was_disabled = ssid->disabled;
1539 if (was_disabled != ssid->disabled)
1540 wpas_notify_network_enabled_changed(wpa_s, ssid);
1546 * wpa_supplicant_select_network - Attempt association with a network
1547 * @wpa_s: wpa_supplicant structure for a network interface
1548 * @ssid: wpa_ssid structure for a configured network or %NULL for any network
1550 void wpa_supplicant_select_network(struct wpa_supplicant *wpa_s,
1551 struct wpa_ssid *ssid)
1554 struct wpa_ssid *other_ssid;
1556 if (ssid && ssid != wpa_s->current_ssid && wpa_s->current_ssid)
1557 wpa_supplicant_disassociate(
1558 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
1561 * Mark all other networks disabled or mark all networks enabled if no
1562 * network specified.
1564 for (other_ssid = wpa_s->conf->ssid; other_ssid;
1565 other_ssid = other_ssid->next) {
1566 int was_disabled = other_ssid->disabled;
1567 if (was_disabled == 2)
1568 continue; /* do not change persistent P2P group data */
1570 other_ssid->disabled = ssid ? (ssid->id != other_ssid->id) : 0;
1572 if (was_disabled != other_ssid->disabled)
1573 wpas_notify_network_enabled_changed(wpa_s, other_ssid);
1575 wpa_s->disconnected = 0;
1576 wpa_s->reassociate = 1;
1577 wpa_supplicant_req_scan(wpa_s, 0, 0);
1580 wpas_notify_network_selected(wpa_s, ssid);
1585 * wpa_supplicant_set_ap_scan - Set AP scan mode for interface
1586 * @wpa_s: wpa_supplicant structure for a network interface
1587 * @ap_scan: AP scan mode
1588 * Returns: 0 if succeed or -1 if ap_scan has an invalid value
1591 int wpa_supplicant_set_ap_scan(struct wpa_supplicant *wpa_s, int ap_scan)
1596 if (ap_scan < 0 || ap_scan > 2)
1599 old_ap_scan = wpa_s->conf->ap_scan;
1600 wpa_s->conf->ap_scan = ap_scan;
1602 if (old_ap_scan != wpa_s->conf->ap_scan)
1603 wpas_notify_ap_scan_changed(wpa_s);
1610 * wpa_supplicant_set_debug_params - Set global debug params
1611 * @global: wpa_global structure
1612 * @debug_level: debug level
1613 * @debug_timestamp: determines if show timestamp in debug data
1614 * @debug_show_keys: determines if show keys in debug data
1615 * Returns: 0 if succeed or -1 if debug_level has wrong value
1617 int wpa_supplicant_set_debug_params(struct wpa_global *global, int debug_level,
1618 int debug_timestamp, int debug_show_keys)
1621 int old_level, old_timestamp, old_show_keys;
1623 /* check for allowed debuglevels */
1624 if (debug_level != MSG_MSGDUMP &&
1625 debug_level != MSG_DEBUG &&
1626 debug_level != MSG_INFO &&
1627 debug_level != MSG_WARNING &&
1628 debug_level != MSG_ERROR)
1631 old_level = wpa_debug_level;
1632 old_timestamp = wpa_debug_timestamp;
1633 old_show_keys = wpa_debug_show_keys;
1635 wpa_debug_level = debug_level;
1636 wpa_debug_timestamp = debug_timestamp ? 1 : 0;
1637 wpa_debug_show_keys = debug_show_keys ? 1 : 0;
1639 if (wpa_debug_level != old_level)
1640 wpas_notify_debug_level_changed(global);
1641 if (wpa_debug_timestamp != old_timestamp)
1642 wpas_notify_debug_timestamp_changed(global);
1643 if (wpa_debug_show_keys != old_show_keys)
1644 wpas_notify_debug_show_keys_changed(global);
1651 * wpa_supplicant_get_ssid - Get a pointer to the current network structure
1652 * @wpa_s: Pointer to wpa_supplicant data
1653 * Returns: A pointer to the current network structure or %NULL on failure
1655 struct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s)
1657 struct wpa_ssid *entry;
1658 u8 ssid[MAX_SSID_LEN];
1664 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME) {
1665 if (ieee80211_sta_get_ssid(wpa_s, ssid, &ssid_len)) {
1666 wpa_printf(MSG_WARNING, "Could not read SSID from "
1671 res = wpa_drv_get_ssid(wpa_s, ssid);
1673 wpa_printf(MSG_WARNING, "Could not read SSID from "
1680 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME)
1681 os_memcpy(bssid, wpa_s->bssid, ETH_ALEN);
1682 else if (wpa_drv_get_bssid(wpa_s, bssid) < 0) {
1683 wpa_printf(MSG_WARNING, "Could not read BSSID from driver.");
1687 wired = wpa_s->conf->ap_scan == 0 &&
1688 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED);
1690 entry = wpa_s->conf->ssid;
1692 if (!entry->disabled &&
1693 ((ssid_len == entry->ssid_len &&
1694 os_memcmp(ssid, entry->ssid, ssid_len) == 0) || wired) &&
1695 (!entry->bssid_set ||
1696 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
1699 if (!entry->disabled &&
1700 (entry->key_mgmt & WPA_KEY_MGMT_WPS) &&
1701 (entry->ssid == NULL || entry->ssid_len == 0) &&
1702 (!entry->bssid_set ||
1703 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
1705 #endif /* CONFIG_WPS */
1706 entry = entry->next;
1713 static int wpa_supplicant_set_driver(struct wpa_supplicant *wpa_s,
1718 const char *pos, *driver = name;
1723 if (wpa_drivers[0] == NULL) {
1724 wpa_printf(MSG_ERROR, "No driver interfaces build into "
1730 /* default to first driver in the list */
1731 wpa_s->driver = wpa_drivers[0];
1732 wpa_s->global_drv_priv = wpa_s->global->drv_priv[0];
1737 pos = os_strchr(driver, ',');
1741 len = os_strlen(driver);
1743 for (i = 0; wpa_drivers[i]; i++) {
1744 if (os_strlen(wpa_drivers[i]->name) == len &&
1745 os_strncmp(driver, wpa_drivers[i]->name, len) ==
1747 wpa_s->driver = wpa_drivers[i];
1748 wpa_s->global_drv_priv =
1749 wpa_s->global->drv_priv[i];
1757 wpa_printf(MSG_ERROR, "Unsupported driver '%s'.", name);
1763 * wpa_supplicant_rx_eapol - Deliver a received EAPOL frame to wpa_supplicant
1764 * @ctx: Context pointer (wpa_s); this is the ctx variable registered
1765 * with struct wpa_driver_ops::init()
1766 * @src_addr: Source address of the EAPOL frame
1767 * @buf: EAPOL data starting from the EAPOL header (i.e., no Ethernet header)
1768 * @len: Length of the EAPOL data
1770 * This function is called for each received EAPOL frame. Most driver
1771 * interfaces rely on more generic OS mechanism for receiving frames through
1772 * l2_packet, but if such a mechanism is not available, the driver wrapper may
1773 * take care of received EAPOL frames and deliver them to the core supplicant
1774 * code by calling this function.
1776 void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr,
1777 const u8 *buf, size_t len)
1779 struct wpa_supplicant *wpa_s = ctx;
1781 wpa_printf(MSG_DEBUG, "RX EAPOL from " MACSTR, MAC2STR(src_addr));
1782 wpa_hexdump(MSG_MSGDUMP, "RX EAPOL", buf, len);
1784 if (wpa_s->wpa_state < WPA_ASSOCIATED) {
1786 * There is possible race condition between receiving the
1787 * association event and the EAPOL frame since they are coming
1788 * through different paths from the driver. In order to avoid
1789 * issues in trying to process the EAPOL frame before receiving
1790 * association information, lets queue it for processing until
1791 * the association event is received.
1793 wpa_printf(MSG_DEBUG, "Not associated - Delay processing of "
1794 "received EAPOL frame");
1795 wpabuf_free(wpa_s->pending_eapol_rx);
1796 wpa_s->pending_eapol_rx = wpabuf_alloc_copy(buf, len);
1797 if (wpa_s->pending_eapol_rx) {
1798 os_get_time(&wpa_s->pending_eapol_rx_time);
1799 os_memcpy(wpa_s->pending_eapol_rx_src, src_addr,
1806 if (wpa_s->ap_iface) {
1807 wpa_supplicant_ap_rx_eapol(wpa_s, src_addr, buf, len);
1810 #endif /* CONFIG_AP */
1812 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE) {
1813 wpa_printf(MSG_DEBUG, "Ignored received EAPOL frame since "
1814 "no key management is configured");
1818 if (wpa_s->eapol_received == 0 &&
1819 (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) ||
1820 !wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) ||
1821 wpa_s->wpa_state != WPA_COMPLETED) &&
1822 (wpa_s->current_ssid == NULL ||
1823 wpa_s->current_ssid->mode != IEEE80211_MODE_IBSS)) {
1824 /* Timeout for completing IEEE 802.1X and WPA authentication */
1825 wpa_supplicant_req_auth_timeout(
1827 (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) ||
1828 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA ||
1829 wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) ?
1832 wpa_s->eapol_received++;
1834 if (wpa_s->countermeasures) {
1835 wpa_printf(MSG_INFO, "WPA: Countermeasures - dropped EAPOL "
1840 #ifdef CONFIG_IBSS_RSN
1841 if (wpa_s->current_ssid &&
1842 wpa_s->current_ssid->mode == WPAS_MODE_IBSS) {
1843 ibss_rsn_rx_eapol(wpa_s->ibss_rsn, src_addr, buf, len);
1846 #endif /* CONFIG_IBSS_RSN */
1848 /* Source address of the incoming EAPOL frame could be compared to the
1849 * current BSSID. However, it is possible that a centralized
1850 * Authenticator could be using another MAC address than the BSSID of
1851 * an AP, so just allow any address to be used for now. The replies are
1852 * still sent to the current BSSID (if available), though. */
1854 os_memcpy(wpa_s->last_eapol_src, src_addr, ETH_ALEN);
1855 if (!wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) &&
1856 eapol_sm_rx_eapol(wpa_s->eapol, src_addr, buf, len) > 0)
1858 wpa_drv_poll(wpa_s);
1859 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE))
1860 wpa_sm_rx_eapol(wpa_s->wpa, src_addr, buf, len);
1861 else if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt)) {
1863 * Set portValid = TRUE here since we are going to skip 4-way
1864 * handshake processing which would normally set portValid. We
1865 * need this to allow the EAPOL state machines to be completed
1866 * without going through EAPOL-Key handshake.
1868 eapol_sm_notify_portValid(wpa_s->eapol, TRUE);
1874 * wpa_supplicant_driver_init - Initialize driver interface parameters
1875 * @wpa_s: Pointer to wpa_supplicant data
1876 * Returns: 0 on success, -1 on failure
1878 * This function is called to initialize driver interface parameters.
1879 * wpa_drv_init() must have been called before this function to initialize the
1882 int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s)
1884 static int interface_count = 0;
1886 if (wpa_s->driver->send_eapol) {
1887 const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
1889 os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
1890 } else if (!(wpa_s->drv_flags &
1891 WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE)) {
1892 wpa_s->l2 = l2_packet_init(wpa_s->ifname,
1893 wpa_drv_get_mac_addr(wpa_s),
1895 wpa_supplicant_rx_eapol, wpa_s, 0);
1896 if (wpa_s->l2 == NULL)
1899 const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
1901 os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
1904 if (wpa_s->l2 && l2_packet_get_own_addr(wpa_s->l2, wpa_s->own_addr)) {
1905 wpa_printf(MSG_ERROR, "Failed to get own L2 address");
1909 wpa_printf(MSG_DEBUG, "Own MAC address: " MACSTR,
1910 MAC2STR(wpa_s->own_addr));
1912 if (wpa_s->bridge_ifname[0]) {
1913 wpa_printf(MSG_DEBUG, "Receiving packets from bridge interface"
1914 " '%s'", wpa_s->bridge_ifname);
1915 wpa_s->l2_br = l2_packet_init(wpa_s->bridge_ifname,
1918 wpa_supplicant_rx_eapol, wpa_s,
1920 if (wpa_s->l2_br == NULL) {
1921 wpa_printf(MSG_ERROR, "Failed to open l2_packet "
1922 "connection for the bridge interface '%s'",
1923 wpa_s->bridge_ifname);
1928 wpa_clear_keys(wpa_s, NULL);
1930 /* Make sure that TKIP countermeasures are not left enabled (could
1931 * happen if wpa_supplicant is killed during countermeasures. */
1932 wpa_drv_set_countermeasures(wpa_s, 0);
1934 wpa_printf(MSG_DEBUG, "RSN: flushing PMKID list in the driver");
1935 wpa_drv_flush_pmkid(wpa_s);
1937 wpa_s->prev_scan_ssid = WILDCARD_SSID_SCAN;
1938 if (wpa_supplicant_enabled_networks(wpa_s->conf)) {
1939 wpa_supplicant_req_scan(wpa_s, interface_count, 100000);
1942 wpa_supplicant_set_state(wpa_s, WPA_INACTIVE);
1948 static int wpa_supplicant_daemon(const char *pid_file)
1950 wpa_printf(MSG_DEBUG, "Daemonize..");
1951 return os_daemonize(pid_file);
1955 static struct wpa_supplicant * wpa_supplicant_alloc(void)
1957 struct wpa_supplicant *wpa_s;
1959 wpa_s = os_zalloc(sizeof(*wpa_s));
1962 wpa_s->scan_req = 1;
1963 wpa_s->new_connection = 1;
1964 wpa_s->parent = wpa_s;
1970 static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
1971 struct wpa_interface *iface)
1973 const char *ifname, *driver;
1974 struct wpa_driver_capa capa;
1976 wpa_printf(MSG_DEBUG, "Initializing interface '%s' conf '%s' driver "
1977 "'%s' ctrl_interface '%s' bridge '%s'", iface->ifname,
1978 iface->confname ? iface->confname : "N/A",
1979 iface->driver ? iface->driver : "default",
1980 iface->ctrl_interface ? iface->ctrl_interface : "N/A",
1981 iface->bridge_ifname ? iface->bridge_ifname : "N/A");
1983 if (iface->confname) {
1984 #ifdef CONFIG_BACKEND_FILE
1985 wpa_s->confname = os_rel2abs_path(iface->confname);
1986 if (wpa_s->confname == NULL) {
1987 wpa_printf(MSG_ERROR, "Failed to get absolute path "
1988 "for configuration file '%s'.",
1992 wpa_printf(MSG_DEBUG, "Configuration file '%s' -> '%s'",
1993 iface->confname, wpa_s->confname);
1994 #else /* CONFIG_BACKEND_FILE */
1995 wpa_s->confname = os_strdup(iface->confname);
1996 #endif /* CONFIG_BACKEND_FILE */
1997 wpa_s->conf = wpa_config_read(wpa_s->confname);
1998 if (wpa_s->conf == NULL) {
1999 wpa_printf(MSG_ERROR, "Failed to read or parse "
2000 "configuration '%s'.", wpa_s->confname);
2005 * Override ctrl_interface and driver_param if set on command
2008 if (iface->ctrl_interface) {
2009 os_free(wpa_s->conf->ctrl_interface);
2010 wpa_s->conf->ctrl_interface =
2011 os_strdup(iface->ctrl_interface);
2014 if (iface->driver_param) {
2015 os_free(wpa_s->conf->driver_param);
2016 wpa_s->conf->driver_param =
2017 os_strdup(iface->driver_param);
2020 wpa_s->conf = wpa_config_alloc_empty(iface->ctrl_interface,
2021 iface->driver_param);
2023 if (wpa_s->conf == NULL) {
2024 wpa_printf(MSG_ERROR, "\nNo configuration found.");
2028 if (iface->ifname == NULL) {
2029 wpa_printf(MSG_ERROR, "\nInterface name is required.");
2032 if (os_strlen(iface->ifname) >= sizeof(wpa_s->ifname)) {
2033 wpa_printf(MSG_ERROR, "\nToo long interface name '%s'.",
2037 os_strlcpy(wpa_s->ifname, iface->ifname, sizeof(wpa_s->ifname));
2039 if (iface->bridge_ifname) {
2040 if (os_strlen(iface->bridge_ifname) >=
2041 sizeof(wpa_s->bridge_ifname)) {
2042 wpa_printf(MSG_ERROR, "\nToo long bridge interface "
2043 "name '%s'.", iface->bridge_ifname);
2046 os_strlcpy(wpa_s->bridge_ifname, iface->bridge_ifname,
2047 sizeof(wpa_s->bridge_ifname));
2050 /* RSNA Supplicant Key Management - INITIALIZE */
2051 eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
2052 eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
2054 /* Initialize driver interface and register driver event handler before
2055 * L2 receive handler so that association events are processed before
2056 * EAPOL-Key packets if both become available for the same select()
2058 driver = iface->driver;
2060 if (wpa_supplicant_set_driver(wpa_s, driver) < 0)
2063 wpa_s->drv_priv = wpa_drv_init(wpa_s, wpa_s->ifname);
2064 if (wpa_s->drv_priv == NULL) {
2066 pos = driver ? os_strchr(driver, ',') : NULL;
2068 wpa_printf(MSG_DEBUG, "Failed to initialize driver "
2069 "interface - try next driver wrapper");
2073 wpa_printf(MSG_ERROR, "Failed to initialize driver interface");
2076 if (wpa_drv_set_param(wpa_s, wpa_s->conf->driver_param) < 0) {
2077 wpa_printf(MSG_ERROR, "Driver interface rejected "
2078 "driver_param '%s'", wpa_s->conf->driver_param);
2082 ifname = wpa_drv_get_ifname(wpa_s);
2083 if (ifname && os_strcmp(ifname, wpa_s->ifname) != 0) {
2084 wpa_printf(MSG_DEBUG, "Driver interface replaced interface "
2085 "name with '%s'", ifname);
2086 os_strlcpy(wpa_s->ifname, ifname, sizeof(wpa_s->ifname));
2089 if (wpa_supplicant_init_wpa(wpa_s) < 0)
2092 wpa_sm_set_ifname(wpa_s->wpa, wpa_s->ifname,
2093 wpa_s->bridge_ifname[0] ? wpa_s->bridge_ifname :
2095 wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
2097 if (wpa_s->conf->dot11RSNAConfigPMKLifetime &&
2098 wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_LIFETIME,
2099 wpa_s->conf->dot11RSNAConfigPMKLifetime)) {
2100 wpa_printf(MSG_ERROR, "Invalid WPA parameter value for "
2101 "dot11RSNAConfigPMKLifetime");
2105 if (wpa_s->conf->dot11RSNAConfigPMKReauthThreshold &&
2106 wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_REAUTH_THRESHOLD,
2107 wpa_s->conf->dot11RSNAConfigPMKReauthThreshold)) {
2108 wpa_printf(MSG_ERROR, "Invalid WPA parameter value for "
2109 "dot11RSNAConfigPMKReauthThreshold");
2113 if (wpa_s->conf->dot11RSNAConfigSATimeout &&
2114 wpa_sm_set_param(wpa_s->wpa, RSNA_SA_TIMEOUT,
2115 wpa_s->conf->dot11RSNAConfigSATimeout)) {
2116 wpa_printf(MSG_ERROR, "Invalid WPA parameter value for "
2117 "dot11RSNAConfigSATimeout");
2121 if (wpa_drv_get_capa(wpa_s, &capa) == 0) {
2122 wpa_s->drv_flags = capa.flags;
2123 if (capa.flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME) {
2124 if (ieee80211_sta_init(wpa_s))
2127 wpa_s->max_scan_ssids = capa.max_scan_ssids;
2128 wpa_s->max_remain_on_chan = capa.max_remain_on_chan;
2129 wpa_s->max_stations = capa.max_stations;
2131 if (wpa_s->max_remain_on_chan == 0)
2132 wpa_s->max_remain_on_chan = 1000;
2134 if (wpa_supplicant_driver_init(wpa_s) < 0)
2137 if (wpa_s->conf->country[0] && wpa_s->conf->country[1] &&
2138 wpa_drv_set_country(wpa_s, wpa_s->conf->country)) {
2139 wpa_printf(MSG_DEBUG, "Failed to set country");
2143 wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
2145 if (wpas_wps_init(wpa_s))
2148 if (wpa_supplicant_init_eapol(wpa_s) < 0)
2150 wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
2152 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
2153 if (wpa_s->ctrl_iface == NULL) {
2154 wpa_printf(MSG_ERROR,
2155 "Failed to initialize control interface '%s'.\n"
2156 "You may have another wpa_supplicant process "
2157 "already running or the file was\n"
2158 "left by an unclean termination of wpa_supplicant "
2159 "in which case you will need\n"
2160 "to manually remove this file before starting "
2161 "wpa_supplicant again.\n",
2162 wpa_s->conf->ctrl_interface);
2166 #ifdef CONFIG_IBSS_RSN
2167 wpa_s->ibss_rsn = ibss_rsn_init(wpa_s);
2168 if (!wpa_s->ibss_rsn) {
2169 wpa_printf(MSG_DEBUG, "Failed to init IBSS RSN");
2172 #endif /* CONFIG_IBSS_RSN */
2175 if (wpas_p2p_init(wpa_s->global, wpa_s) < 0) {
2176 wpa_printf(MSG_ERROR, "Failed to init P2P");
2179 #endif /* CONFIG_P2P */
2181 if (wpa_bss_init(wpa_s) < 0)
2188 static void wpa_supplicant_deinit_iface(struct wpa_supplicant *wpa_s,
2191 if (wpa_s->drv_priv) {
2192 wpa_supplicant_deauthenticate(wpa_s,
2193 WLAN_REASON_DEAUTH_LEAVING);
2195 wpa_drv_set_countermeasures(wpa_s, 0);
2196 wpa_clear_keys(wpa_s, NULL);
2199 wpa_supplicant_cleanup(wpa_s);
2202 wpas_notify_iface_removed(wpa_s);
2204 if (wpa_s->drv_priv)
2205 wpa_drv_deinit(wpa_s);
2210 * wpa_supplicant_add_iface - Add a new network interface
2211 * @global: Pointer to global data from wpa_supplicant_init()
2212 * @iface: Interface configuration options
2213 * Returns: Pointer to the created interface or %NULL on failure
2215 * This function is used to add new network interfaces for %wpa_supplicant.
2216 * This can be called before wpa_supplicant_run() to add interfaces before the
2217 * main event loop has been started. In addition, new interfaces can be added
2218 * dynamically while %wpa_supplicant is already running. This could happen,
2219 * e.g., when a hotplug network adapter is inserted.
2221 struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
2222 struct wpa_interface *iface)
2224 struct wpa_supplicant *wpa_s;
2225 struct wpa_interface t_iface;
2226 struct wpa_ssid *ssid;
2228 if (global == NULL || iface == NULL)
2231 wpa_s = wpa_supplicant_alloc();
2235 wpa_s->global = global;
2238 if (global->params.override_driver) {
2239 wpa_printf(MSG_DEBUG, "Override interface parameter: driver "
2241 iface->driver, global->params.override_driver);
2242 t_iface.driver = global->params.override_driver;
2244 if (global->params.override_ctrl_interface) {
2245 wpa_printf(MSG_DEBUG, "Override interface parameter: "
2246 "ctrl_interface ('%s' -> '%s')",
2247 iface->ctrl_interface,
2248 global->params.override_ctrl_interface);
2249 t_iface.ctrl_interface =
2250 global->params.override_ctrl_interface;
2252 if (wpa_supplicant_init_iface(wpa_s, &t_iface)) {
2253 wpa_printf(MSG_DEBUG, "Failed to add interface %s",
2255 wpa_supplicant_deinit_iface(wpa_s, 0);
2260 /* Notify the control interfaces about new iface */
2261 if (wpas_notify_iface_added(wpa_s)) {
2262 wpa_supplicant_deinit_iface(wpa_s, 1);
2267 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
2268 wpas_notify_network_added(wpa_s, ssid);
2270 wpa_s->next = global->ifaces;
2271 global->ifaces = wpa_s;
2273 wpa_printf(MSG_DEBUG, "Added interface %s", wpa_s->ifname);
2280 * wpa_supplicant_remove_iface - Remove a network interface
2281 * @global: Pointer to global data from wpa_supplicant_init()
2282 * @wpa_s: Pointer to the network interface to be removed
2283 * Returns: 0 if interface was removed, -1 if interface was not found
2285 * This function can be used to dynamically remove network interfaces from
2286 * %wpa_supplicant, e.g., when a hotplug network adapter is ejected. In
2287 * addition, this function is used to remove all remaining interfaces when
2288 * %wpa_supplicant is terminated.
2290 int wpa_supplicant_remove_iface(struct wpa_global *global,
2291 struct wpa_supplicant *wpa_s)
2293 struct wpa_supplicant *prev;
2295 /* Remove interface from the global list of interfaces */
2296 prev = global->ifaces;
2297 if (prev == wpa_s) {
2298 global->ifaces = wpa_s->next;
2300 while (prev && prev->next != wpa_s)
2304 prev->next = wpa_s->next;
2307 wpa_printf(MSG_DEBUG, "Removing interface %s", wpa_s->ifname);
2309 if (global->p2p_group_formation == wpa_s)
2310 global->p2p_group_formation = NULL;
2311 wpa_supplicant_deinit_iface(wpa_s, 1);
2319 * wpa_supplicant_get_iface - Get a new network interface
2320 * @global: Pointer to global data from wpa_supplicant_init()
2321 * @ifname: Interface name
2322 * Returns: Pointer to the interface or %NULL if not found
2324 struct wpa_supplicant * wpa_supplicant_get_iface(struct wpa_global *global,
2327 struct wpa_supplicant *wpa_s;
2329 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
2330 if (os_strcmp(wpa_s->ifname, ifname) == 0)
2338 * wpa_supplicant_init - Initialize %wpa_supplicant
2339 * @params: Parameters for %wpa_supplicant
2340 * Returns: Pointer to global %wpa_supplicant data, or %NULL on failure
2342 * This function is used to initialize %wpa_supplicant. After successful
2343 * initialization, the returned data pointer can be used to add and remove
2344 * network interfaces, and eventually, to deinitialize %wpa_supplicant.
2346 struct wpa_global * wpa_supplicant_init(struct wpa_params *params)
2348 struct wpa_global *global;
2354 wpa_debug_open_file(params->wpa_debug_file_path);
2355 if (params->wpa_debug_syslog)
2356 wpa_debug_open_syslog();
2358 ret = eap_register_methods();
2360 wpa_printf(MSG_ERROR, "Failed to register EAP methods");
2362 wpa_printf(MSG_ERROR, "Two or more EAP methods used "
2363 "the same EAP type.");
2367 global = os_zalloc(sizeof(*global));
2370 dl_list_init(&global->p2p_srv_bonjour);
2371 dl_list_init(&global->p2p_srv_upnp);
2372 global->params.daemonize = params->daemonize;
2373 global->params.wait_for_monitor = params->wait_for_monitor;
2374 global->params.dbus_ctrl_interface = params->dbus_ctrl_interface;
2375 if (params->pid_file)
2376 global->params.pid_file = os_strdup(params->pid_file);
2377 if (params->ctrl_interface)
2378 global->params.ctrl_interface =
2379 os_strdup(params->ctrl_interface);
2380 if (params->override_driver)
2381 global->params.override_driver =
2382 os_strdup(params->override_driver);
2383 if (params->override_ctrl_interface)
2384 global->params.override_ctrl_interface =
2385 os_strdup(params->override_ctrl_interface);
2386 wpa_debug_level = global->params.wpa_debug_level =
2387 params->wpa_debug_level;
2388 wpa_debug_show_keys = global->params.wpa_debug_show_keys =
2389 params->wpa_debug_show_keys;
2390 wpa_debug_timestamp = global->params.wpa_debug_timestamp =
2391 params->wpa_debug_timestamp;
2393 wpa_printf(MSG_DEBUG, "wpa_supplicant v" VERSION_STR);
2396 wpa_printf(MSG_ERROR, "Failed to initialize event loop");
2397 wpa_supplicant_deinit(global);
2401 global->ctrl_iface = wpa_supplicant_global_ctrl_iface_init(global);
2402 if (global->ctrl_iface == NULL) {
2403 wpa_supplicant_deinit(global);
2407 if (wpas_notify_supplicant_initialized(global)) {
2408 wpa_supplicant_deinit(global);
2412 for (i = 0; wpa_drivers[i]; i++)
2413 global->drv_count++;
2414 if (global->drv_count == 0) {
2415 wpa_printf(MSG_ERROR, "No drivers enabled");
2416 wpa_supplicant_deinit(global);
2419 global->drv_priv = os_zalloc(global->drv_count * sizeof(void *));
2420 if (global->drv_priv == NULL) {
2421 wpa_supplicant_deinit(global);
2424 for (i = 0; wpa_drivers[i]; i++) {
2425 if (!wpa_drivers[i]->global_init)
2427 global->drv_priv[i] = wpa_drivers[i]->global_init();
2428 if (global->drv_priv[i] == NULL) {
2429 wpa_printf(MSG_ERROR, "Failed to initialize driver "
2430 "'%s'", wpa_drivers[i]->name);
2431 wpa_supplicant_deinit(global);
2441 * wpa_supplicant_run - Run the %wpa_supplicant main event loop
2442 * @global: Pointer to global data from wpa_supplicant_init()
2443 * Returns: 0 after successful event loop run, -1 on failure
2445 * This function starts the main event loop and continues running as long as
2446 * there are any remaining events. In most cases, this function is running as
2447 * long as the %wpa_supplicant process in still in use.
2449 int wpa_supplicant_run(struct wpa_global *global)
2451 struct wpa_supplicant *wpa_s;
2453 if (global->params.daemonize &&
2454 wpa_supplicant_daemon(global->params.pid_file))
2457 if (global->params.wait_for_monitor) {
2458 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
2459 if (wpa_s->ctrl_iface)
2460 wpa_supplicant_ctrl_iface_wait(
2464 eloop_register_signal_terminate(wpa_supplicant_terminate, global);
2465 eloop_register_signal_reconfig(wpa_supplicant_reconfig, global);
2474 * wpa_supplicant_deinit - Deinitialize %wpa_supplicant
2475 * @global: Pointer to global data from wpa_supplicant_init()
2477 * This function is called to deinitialize %wpa_supplicant and to free all
2478 * allocated resources. Remaining network interfaces will also be removed.
2480 void wpa_supplicant_deinit(struct wpa_global *global)
2488 wpas_p2p_deinit_global(global);
2489 #endif /* CONFIG_P2P */
2491 while (global->ifaces)
2492 wpa_supplicant_remove_iface(global, global->ifaces);
2494 if (global->ctrl_iface)
2495 wpa_supplicant_global_ctrl_iface_deinit(global->ctrl_iface);
2497 wpas_notify_supplicant_deinitialized(global);
2499 eap_peer_unregister_methods();
2501 eap_server_unregister_methods();
2502 #endif /* CONFIG_AP */
2504 for (i = 0; wpa_drivers[i] && global->drv_priv; i++) {
2505 if (!global->drv_priv[i])
2507 wpa_drivers[i]->global_deinit(global->drv_priv[i]);
2509 os_free(global->drv_priv);
2513 if (global->params.pid_file) {
2514 os_daemonize_terminate(global->params.pid_file);
2515 os_free(global->params.pid_file);
2517 os_free(global->params.ctrl_interface);
2518 os_free(global->params.override_driver);
2519 os_free(global->params.override_ctrl_interface);
2522 wpa_debug_close_syslog();
2523 wpa_debug_close_file();
2527 void wpa_supplicant_update_config(struct wpa_supplicant *wpa_s)
2530 wpas_wps_update_config(wpa_s);
2531 #endif /* CONFIG_WPS */
2534 wpas_p2p_update_config(wpa_s);
2535 #endif /* CONFIG_P2P */
2537 wpa_s->conf->changed_parameters = 0;
2541 void ieee80211_sta_free_hw_features(struct hostapd_hw_modes *hw_features,
2542 size_t num_hw_features)
2546 if (hw_features == NULL)
2549 for (i = 0; i < num_hw_features; i++) {
2550 os_free(hw_features[i].channels);
2551 os_free(hw_features[i].rates);
2554 os_free(hw_features);
2558 static void add_freq(int *freqs, int *num_freqs, int freq)
2562 for (i = 0; i < *num_freqs; i++) {
2563 if (freqs[i] == freq)
2567 freqs[*num_freqs] = freq;
2572 static int * get_bss_freqs_in_ess(struct wpa_supplicant *wpa_s)
2574 struct wpa_bss *bss, *cbss;
2575 const int max_freqs = 10;
2579 freqs = os_zalloc(sizeof(int) * (max_freqs + 1));
2583 cbss = wpa_s->current_bss;
2585 dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
2588 if (bss->ssid_len == cbss->ssid_len &&
2589 os_memcmp(bss->ssid, cbss->ssid, bss->ssid_len) == 0 &&
2590 wpa_blacklist_get(wpa_s, bss->bssid) == NULL) {
2591 add_freq(freqs, &num_freqs, bss->freq);
2592 if (num_freqs == max_freqs)
2597 if (num_freqs == 0) {
2606 void wpas_connection_failed(struct wpa_supplicant *wpa_s, const u8 *bssid)
2613 * Add the failed BSSID into the blacklist and speed up next scan
2614 * attempt if there could be other APs that could accept association.
2615 * The current blacklist count indicates how many times we have tried
2616 * connecting to this AP and multiple attempts mean that other APs are
2617 * either not available or has already been tried, so that we can start
2618 * increasing the delay here to avoid constant scanning.
2620 count = wpa_blacklist_add(wpa_s, bssid);
2621 if (count == 1 && wpa_s->current_bss) {
2623 * This BSS was not in the blacklist before. If there is
2624 * another BSS available for the same ESS, we should try that
2625 * next. Otherwise, we may as well try this one once more
2626 * before allowing other, likely worse, ESSes to be considered.
2628 freqs = get_bss_freqs_in_ess(wpa_s);
2630 wpa_printf(MSG_DEBUG, "Another BSS in this ESS has "
2631 "been seen; try it next");
2632 wpa_blacklist_add(wpa_s, bssid);
2634 * On the next scan, go through only the known channels
2635 * used in this ESS based on previous scans to speed up
2636 * common load balancing use case.
2638 os_free(wpa_s->next_scan_freqs);
2639 wpa_s->next_scan_freqs = freqs;
2658 * TODO: if more than one possible AP is available in scan results,
2659 * could try the other ones before requesting a new scan.
2661 wpa_supplicant_req_scan(wpa_s, timeout / 1000,
2662 1000 * (timeout % 1000));