3 * Copyright (c) 2003-2014, Jouni Malinen <j@w1.fi>
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
8 * This file implements functions for registering and unregistering
9 * %wpa_supplicant interfaces. In addition, this file contains number of
10 * functions for managing network connections.
16 #include "crypto/random.h"
17 #include "crypto/sha1.h"
18 #include "eapol_supp/eapol_supp_sm.h"
19 #include "eap_peer/eap.h"
20 #include "eap_peer/eap_proxy.h"
21 #include "eap_server/eap_methods.h"
22 #include "rsn_supp/wpa.h"
25 #include "utils/ext_password.h"
26 #include "l2_packet/l2_packet.h"
27 #include "wpa_supplicant_i.h"
29 #include "ctrl_iface.h"
30 #include "pcsc_funcs.h"
31 #include "common/version.h"
32 #include "rsn_supp/preauth.h"
33 #include "rsn_supp/pmksa_cache.h"
34 #include "common/wpa_ctrl.h"
35 #include "common/ieee802_11_defs.h"
37 #include "blacklist.h"
38 #include "wpas_glue.h"
39 #include "wps_supplicant.h"
42 #include "gas_query.h"
44 #include "p2p_supplicant.h"
45 #include "wifi_display.h"
51 #include "offchannel.h"
52 #include "hs20_supplicant.h"
56 const char *wpa_supplicant_version =
57 "wpa_supplicant v" VERSION_STR "\n"
58 "Copyright (c) 2003-2014, Jouni Malinen <j@w1.fi> and contributors";
60 const char *wpa_supplicant_license =
61 "This software may be distributed under the terms of the BSD license.\n"
62 "See README for more details.\n"
63 #ifdef EAP_TLS_OPENSSL
64 "\nThis product includes software developed by the OpenSSL Project\n"
65 "for use in the OpenSSL Toolkit (http://www.openssl.org/)\n"
66 #endif /* EAP_TLS_OPENSSL */
69 #ifndef CONFIG_NO_STDOUT_DEBUG
70 /* Long text divided into parts in order to fit in C89 strings size limits. */
71 const char *wpa_supplicant_full_license1 =
73 const char *wpa_supplicant_full_license2 =
74 "This software may be distributed under the terms of the BSD license.\n"
76 "Redistribution and use in source and binary forms, with or without\n"
77 "modification, are permitted provided that the following conditions are\n"
80 const char *wpa_supplicant_full_license3 =
81 "1. Redistributions of source code must retain the above copyright\n"
82 " notice, this list of conditions and the following disclaimer.\n"
84 "2. Redistributions in binary form must reproduce the above copyright\n"
85 " notice, this list of conditions and the following disclaimer in the\n"
86 " documentation and/or other materials provided with the distribution.\n"
88 const char *wpa_supplicant_full_license4 =
89 "3. Neither the name(s) of the above-listed copyright holder(s) nor the\n"
90 " names of its contributors may be used to endorse or promote products\n"
91 " derived from this software without specific prior written permission.\n"
93 "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
94 "\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
95 "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
96 "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n";
97 const char *wpa_supplicant_full_license5 =
98 "OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
99 "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
100 "LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
101 "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
102 "THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
103 "(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
104 "OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
106 #endif /* CONFIG_NO_STDOUT_DEBUG */
108 /* Configure default/group WEP keys for static WEP */
109 int wpa_set_wep_keys(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
113 for (i = 0; i < NUM_WEP_KEYS; i++) {
114 if (ssid->wep_key_len[i] == 0)
118 wpa_drv_set_key(wpa_s, WPA_ALG_WEP, NULL,
119 i, i == ssid->wep_tx_keyidx, NULL, 0,
120 ssid->wep_key[i], ssid->wep_key_len[i]);
127 int wpa_supplicant_set_wpa_none_key(struct wpa_supplicant *wpa_s,
128 struct wpa_ssid *ssid)
135 /* IBSS/WPA-None uses only one key (Group) for both receiving and
136 * sending unicast and multicast packets. */
138 if (ssid->mode != WPAS_MODE_IBSS) {
139 wpa_msg(wpa_s, MSG_INFO, "WPA: Invalid mode %d (not "
140 "IBSS/ad-hoc) for WPA-None", ssid->mode);
144 if (!ssid->psk_set) {
145 wpa_msg(wpa_s, MSG_INFO, "WPA: No PSK configured for "
150 switch (wpa_s->group_cipher) {
151 case WPA_CIPHER_CCMP:
152 os_memcpy(key, ssid->psk, 16);
156 case WPA_CIPHER_GCMP:
157 os_memcpy(key, ssid->psk, 16);
161 case WPA_CIPHER_TKIP:
162 /* WPA-None uses the same Michael MIC key for both TX and RX */
163 os_memcpy(key, ssid->psk, 16 + 8);
164 os_memcpy(key + 16 + 8, ssid->psk + 16, 8);
169 wpa_msg(wpa_s, MSG_INFO, "WPA: Invalid group cipher %d for "
170 "WPA-None", wpa_s->group_cipher);
174 /* TODO: should actually remember the previously used seq#, both for TX
175 * and RX from each STA.. */
177 return wpa_drv_set_key(wpa_s, alg, NULL, 0, 1, seq, 6, key, keylen);
181 static void wpa_supplicant_timeout(void *eloop_ctx, void *timeout_ctx)
183 struct wpa_supplicant *wpa_s = eloop_ctx;
184 const u8 *bssid = wpa_s->bssid;
185 if (is_zero_ether_addr(bssid))
186 bssid = wpa_s->pending_bssid;
187 wpa_msg(wpa_s, MSG_INFO, "Authentication with " MACSTR " timed out.",
189 wpa_blacklist_add(wpa_s, bssid);
190 wpa_sm_notify_disassoc(wpa_s->wpa);
191 wpa_supplicant_deauthenticate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
192 wpa_s->reassociate = 1;
195 * If we timed out, the AP or the local radio may be busy.
196 * So, wait a second until scanning again.
198 wpa_supplicant_req_scan(wpa_s, 1, 0);
203 * wpa_supplicant_req_auth_timeout - Schedule a timeout for authentication
204 * @wpa_s: Pointer to wpa_supplicant data
205 * @sec: Number of seconds after which to time out authentication
206 * @usec: Number of microseconds after which to time out authentication
208 * This function is used to schedule a timeout for the current authentication
211 void wpa_supplicant_req_auth_timeout(struct wpa_supplicant *wpa_s,
214 if (wpa_s->conf->ap_scan == 0 &&
215 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED))
218 wpa_dbg(wpa_s, MSG_DEBUG, "Setting authentication timeout: %d sec "
219 "%d usec", sec, usec);
220 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
221 eloop_register_timeout(sec, usec, wpa_supplicant_timeout, wpa_s, NULL);
226 * wpa_supplicant_cancel_auth_timeout - Cancel authentication timeout
227 * @wpa_s: Pointer to wpa_supplicant data
229 * This function is used to cancel authentication timeout scheduled with
230 * wpa_supplicant_req_auth_timeout() and it is called when authentication has
233 void wpa_supplicant_cancel_auth_timeout(struct wpa_supplicant *wpa_s)
235 wpa_dbg(wpa_s, MSG_DEBUG, "Cancelling authentication timeout");
236 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
237 wpa_blacklist_del(wpa_s, wpa_s->bssid);
242 * wpa_supplicant_initiate_eapol - Configure EAPOL state machine
243 * @wpa_s: Pointer to wpa_supplicant data
245 * This function is used to configure EAPOL state machine based on the selected
246 * authentication mode.
248 void wpa_supplicant_initiate_eapol(struct wpa_supplicant *wpa_s)
250 #ifdef IEEE8021X_EAPOL
251 struct eapol_config eapol_conf;
252 struct wpa_ssid *ssid = wpa_s->current_ssid;
254 #ifdef CONFIG_IBSS_RSN
255 if (ssid->mode == WPAS_MODE_IBSS &&
256 wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
257 wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
259 * RSN IBSS authentication is per-STA and we can disable the
260 * per-BSSID EAPOL authentication.
262 eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
263 eapol_sm_notify_eap_success(wpa_s->eapol, TRUE);
264 eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
267 #endif /* CONFIG_IBSS_RSN */
269 eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
270 eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
272 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
273 wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE)
274 eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
276 eapol_sm_notify_portControl(wpa_s->eapol, Auto);
278 os_memset(&eapol_conf, 0, sizeof(eapol_conf));
279 if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
280 eapol_conf.accept_802_1x_keys = 1;
281 eapol_conf.required_keys = 0;
282 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_UNICAST) {
283 eapol_conf.required_keys |= EAPOL_REQUIRE_KEY_UNICAST;
285 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_BROADCAST) {
286 eapol_conf.required_keys |=
287 EAPOL_REQUIRE_KEY_BROADCAST;
290 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED)
291 eapol_conf.required_keys = 0;
293 eapol_conf.fast_reauth = wpa_s->conf->fast_reauth;
294 eapol_conf.workaround = ssid->eap_workaround;
295 eapol_conf.eap_disabled =
296 !wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) &&
297 wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA &&
298 wpa_s->key_mgmt != WPA_KEY_MGMT_WPS;
299 eapol_conf.external_sim = wpa_s->conf->external_sim;
302 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) {
303 eapol_conf.wps |= EAPOL_LOCAL_WPS_IN_USE;
304 if (wpa_s->current_bss) {
306 ie = wpa_bss_get_vendor_ie_multi(wpa_s->current_bss,
311 EAPOL_PEER_IS_WPS20_AP;
316 #endif /* CONFIG_WPS */
318 eapol_sm_notify_config(wpa_s->eapol, &ssid->eap, &eapol_conf);
320 ieee802_1x_alloc_kay_sm(wpa_s, ssid);
321 #endif /* IEEE8021X_EAPOL */
326 * wpa_supplicant_set_non_wpa_policy - Set WPA parameters to non-WPA mode
327 * @wpa_s: Pointer to wpa_supplicant data
328 * @ssid: Configuration data for the network
330 * This function is used to configure WPA state machine and related parameters
331 * to a mode where WPA is not enabled. This is called as part of the
332 * authentication configuration when the selected network does not use WPA.
334 void wpa_supplicant_set_non_wpa_policy(struct wpa_supplicant *wpa_s,
335 struct wpa_ssid *ssid)
339 if (ssid->key_mgmt & WPA_KEY_MGMT_WPS)
340 wpa_s->key_mgmt = WPA_KEY_MGMT_WPS;
341 else if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA)
342 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_NO_WPA;
344 wpa_s->key_mgmt = WPA_KEY_MGMT_NONE;
345 wpa_sm_set_ap_wpa_ie(wpa_s->wpa, NULL, 0);
346 wpa_sm_set_ap_rsn_ie(wpa_s->wpa, NULL, 0);
347 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
348 wpa_s->pairwise_cipher = WPA_CIPHER_NONE;
349 wpa_s->group_cipher = WPA_CIPHER_NONE;
350 wpa_s->mgmt_group_cipher = 0;
352 for (i = 0; i < NUM_WEP_KEYS; i++) {
353 if (ssid->wep_key_len[i] > 5) {
354 wpa_s->pairwise_cipher = WPA_CIPHER_WEP104;
355 wpa_s->group_cipher = WPA_CIPHER_WEP104;
357 } else if (ssid->wep_key_len[i] > 0) {
358 wpa_s->pairwise_cipher = WPA_CIPHER_WEP40;
359 wpa_s->group_cipher = WPA_CIPHER_WEP40;
364 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED, 0);
365 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
366 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
367 wpa_s->pairwise_cipher);
368 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
369 #ifdef CONFIG_IEEE80211W
370 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
371 wpa_s->mgmt_group_cipher);
372 #endif /* CONFIG_IEEE80211W */
374 pmksa_cache_clear_current(wpa_s->wpa);
378 void free_hw_features(struct wpa_supplicant *wpa_s)
381 if (wpa_s->hw.modes == NULL)
384 for (i = 0; i < wpa_s->hw.num_modes; i++) {
385 os_free(wpa_s->hw.modes[i].channels);
386 os_free(wpa_s->hw.modes[i].rates);
389 os_free(wpa_s->hw.modes);
390 wpa_s->hw.modes = NULL;
394 static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s)
398 bgscan_deinit(wpa_s);
399 autoscan_deinit(wpa_s);
400 scard_deinit(wpa_s->scard);
402 wpa_sm_set_scard_ctx(wpa_s->wpa, NULL);
403 eapol_sm_register_scard_ctx(wpa_s->eapol, NULL);
404 l2_packet_deinit(wpa_s->l2);
407 l2_packet_deinit(wpa_s->l2_br);
410 #ifdef CONFIG_TESTING_OPTIONS
411 l2_packet_deinit(wpa_s->l2_test);
412 wpa_s->l2_test = NULL;
413 #endif /* CONFIG_TESTING_OPTIONS */
415 if (wpa_s->conf != NULL) {
416 struct wpa_ssid *ssid;
417 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
418 wpas_notify_network_removed(wpa_s, ssid);
421 os_free(wpa_s->confname);
422 wpa_s->confname = NULL;
424 os_free(wpa_s->confanother);
425 wpa_s->confanother = NULL;
427 wpa_sm_set_eapol(wpa_s->wpa, NULL);
428 eapol_sm_deinit(wpa_s->eapol);
431 rsn_preauth_deinit(wpa_s->wpa);
434 wpa_tdls_deinit(wpa_s->wpa);
435 #endif /* CONFIG_TDLS */
437 pmksa_candidate_free(wpa_s->wpa);
438 wpa_sm_deinit(wpa_s->wpa);
440 wpa_blacklist_clear(wpa_s);
442 wpa_bss_deinit(wpa_s);
444 wpa_supplicant_cancel_delayed_sched_scan(wpa_s);
445 wpa_supplicant_cancel_scan(wpa_s);
446 wpa_supplicant_cancel_auth_timeout(wpa_s);
447 eloop_cancel_timeout(wpa_supplicant_stop_countermeasures, wpa_s, NULL);
448 #ifdef CONFIG_DELAYED_MIC_ERROR_REPORT
449 eloop_cancel_timeout(wpa_supplicant_delayed_mic_error_report,
451 #endif /* CONFIG_DELAYED_MIC_ERROR_REPORT */
453 wpas_wps_deinit(wpa_s);
455 wpabuf_free(wpa_s->pending_eapol_rx);
456 wpa_s->pending_eapol_rx = NULL;
458 #ifdef CONFIG_IBSS_RSN
459 ibss_rsn_deinit(wpa_s->ibss_rsn);
460 wpa_s->ibss_rsn = NULL;
461 #endif /* CONFIG_IBSS_RSN */
466 wpa_supplicant_ap_deinit(wpa_s);
467 #endif /* CONFIG_AP */
469 wpas_p2p_deinit(wpa_s);
471 #ifdef CONFIG_OFFCHANNEL
472 offchannel_deinit(wpa_s);
473 #endif /* CONFIG_OFFCHANNEL */
475 wpa_supplicant_cancel_sched_scan(wpa_s);
477 os_free(wpa_s->next_scan_freqs);
478 wpa_s->next_scan_freqs = NULL;
480 os_free(wpa_s->manual_scan_freqs);
481 wpa_s->manual_scan_freqs = NULL;
483 os_free(wpa_s->manual_sched_scan_freqs);
484 wpa_s->manual_sched_scan_freqs = NULL;
486 gas_query_deinit(wpa_s->gas);
489 free_hw_features(wpa_s);
491 ieee802_1x_dealloc_kay_sm(wpa_s);
493 os_free(wpa_s->bssid_filter);
494 wpa_s->bssid_filter = NULL;
496 os_free(wpa_s->disallow_aps_bssid);
497 wpa_s->disallow_aps_bssid = NULL;
498 os_free(wpa_s->disallow_aps_ssid);
499 wpa_s->disallow_aps_ssid = NULL;
501 wnm_bss_keep_alive_deinit(wpa_s);
503 wnm_deallocate_memory(wpa_s);
504 #endif /* CONFIG_WNM */
506 ext_password_deinit(wpa_s->ext_pw);
507 wpa_s->ext_pw = NULL;
509 wpabuf_free(wpa_s->last_gas_resp);
510 wpa_s->last_gas_resp = NULL;
511 wpabuf_free(wpa_s->prev_gas_resp);
512 wpa_s->prev_gas_resp = NULL;
514 os_free(wpa_s->last_scan_res);
515 wpa_s->last_scan_res = NULL;
519 #endif /* CONFIG_HS20 */
521 for (i = 0; i < NUM_VENDOR_ELEM_FRAMES; i++) {
522 wpabuf_free(wpa_s->vendor_elem[i]);
523 wpa_s->vendor_elem[i] = NULL;
529 * wpa_clear_keys - Clear keys configured for the driver
530 * @wpa_s: Pointer to wpa_supplicant data
531 * @addr: Previously used BSSID or %NULL if not available
533 * This function clears the encryption keys that has been previously configured
536 void wpa_clear_keys(struct wpa_supplicant *wpa_s, const u8 *addr)
540 #ifdef CONFIG_IEEE80211W
542 #else /* CONFIG_IEEE80211W */
544 #endif /* CONFIG_IEEE80211W */
546 /* MLME-DELETEKEYS.request */
547 for (i = 0; i < max; i++) {
548 if (wpa_s->keys_cleared & BIT(i))
550 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, i, 0, NULL, 0,
553 if (!(wpa_s->keys_cleared & BIT(0)) && addr &&
554 !is_zero_ether_addr(addr)) {
555 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, addr, 0, 0, NULL, 0, NULL,
557 /* MLME-SETPROTECTION.request(None) */
558 wpa_drv_mlme_setprotection(
560 MLME_SETPROTECTION_PROTECT_TYPE_NONE,
561 MLME_SETPROTECTION_KEY_TYPE_PAIRWISE);
563 wpa_s->keys_cleared = (u32) -1;
568 * wpa_supplicant_state_txt - Get the connection state name as a text string
569 * @state: State (wpa_state; WPA_*)
570 * Returns: The state name as a printable text string
572 const char * wpa_supplicant_state_txt(enum wpa_states state)
575 case WPA_DISCONNECTED:
576 return "DISCONNECTED";
579 case WPA_INTERFACE_DISABLED:
580 return "INTERFACE_DISABLED";
583 case WPA_AUTHENTICATING:
584 return "AUTHENTICATING";
585 case WPA_ASSOCIATING:
586 return "ASSOCIATING";
589 case WPA_4WAY_HANDSHAKE:
590 return "4WAY_HANDSHAKE";
591 case WPA_GROUP_HANDSHAKE:
592 return "GROUP_HANDSHAKE";
603 static void wpa_supplicant_start_bgscan(struct wpa_supplicant *wpa_s)
607 if (wpa_s->current_ssid && wpa_s->current_ssid->bgscan)
608 name = wpa_s->current_ssid->bgscan;
610 name = wpa_s->conf->bgscan;
611 if (name == NULL || name[0] == '\0')
613 if (wpas_driver_bss_selection(wpa_s))
615 if (wpa_s->current_ssid == wpa_s->bgscan_ssid)
618 if (wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE)
620 #endif /* CONFIG_P2P */
622 bgscan_deinit(wpa_s);
623 if (wpa_s->current_ssid) {
624 if (bgscan_init(wpa_s, wpa_s->current_ssid, name)) {
625 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize "
628 * Live without bgscan; it is only used as a roaming
629 * optimization, so the initial connection is not
633 struct wpa_scan_results *scan_res;
634 wpa_s->bgscan_ssid = wpa_s->current_ssid;
635 scan_res = wpa_supplicant_get_scan_results(wpa_s, NULL,
638 bgscan_notify_scan(wpa_s, scan_res);
639 wpa_scan_results_free(scan_res);
643 wpa_s->bgscan_ssid = NULL;
647 static void wpa_supplicant_stop_bgscan(struct wpa_supplicant *wpa_s)
649 if (wpa_s->bgscan_ssid != NULL) {
650 bgscan_deinit(wpa_s);
651 wpa_s->bgscan_ssid = NULL;
655 #endif /* CONFIG_BGSCAN */
658 static void wpa_supplicant_start_autoscan(struct wpa_supplicant *wpa_s)
660 if (autoscan_init(wpa_s, 0))
661 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize autoscan");
665 static void wpa_supplicant_stop_autoscan(struct wpa_supplicant *wpa_s)
667 autoscan_deinit(wpa_s);
671 void wpa_supplicant_reinit_autoscan(struct wpa_supplicant *wpa_s)
673 if (wpa_s->wpa_state == WPA_DISCONNECTED ||
674 wpa_s->wpa_state == WPA_SCANNING) {
675 autoscan_deinit(wpa_s);
676 wpa_supplicant_start_autoscan(wpa_s);
682 * wpa_supplicant_set_state - Set current connection state
683 * @wpa_s: Pointer to wpa_supplicant data
684 * @state: The new connection state
686 * This function is called whenever the connection state changes, e.g.,
687 * association is completed for WPA/WPA2 4-Way Handshake is started.
689 void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s,
690 enum wpa_states state)
692 enum wpa_states old_state = wpa_s->wpa_state;
694 wpa_dbg(wpa_s, MSG_DEBUG, "State: %s -> %s",
695 wpa_supplicant_state_txt(wpa_s->wpa_state),
696 wpa_supplicant_state_txt(state));
698 if (state == WPA_INTERFACE_DISABLED) {
699 /* Assure normal scan when interface is restored */
700 wpa_s->normal_scans = 0;
703 if (state == WPA_COMPLETED) {
704 wpas_connect_work_done(wpa_s);
705 /* Reinitialize normal_scan counter */
706 wpa_s->normal_scans = 0;
709 if (state != WPA_SCANNING)
710 wpa_supplicant_notify_scanning(wpa_s, 0);
712 if (state == WPA_COMPLETED && wpa_s->new_connection) {
713 struct wpa_ssid *ssid = wpa_s->current_ssid;
714 #if defined(CONFIG_CTRL_IFACE) || !defined(CONFIG_NO_STDOUT_DEBUG)
715 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_CONNECTED "- Connection to "
716 MACSTR " completed [id=%d id_str=%s]",
717 MAC2STR(wpa_s->bssid),
718 ssid ? ssid->id : -1,
719 ssid && ssid->id_str ? ssid->id_str : "");
720 #endif /* CONFIG_CTRL_IFACE || !CONFIG_NO_STDOUT_DEBUG */
721 wpas_clear_temp_disabled(wpa_s, ssid, 1);
722 wpa_s->extra_blacklist_count = 0;
723 wpa_s->new_connection = 0;
724 wpa_drv_set_operstate(wpa_s, 1);
725 #ifndef IEEE8021X_EAPOL
726 wpa_drv_set_supp_port(wpa_s, 1);
727 #endif /* IEEE8021X_EAPOL */
728 wpa_s->after_wps = 0;
729 wpa_s->known_wps_freq = 0;
730 wpas_p2p_completed(wpa_s);
732 sme_sched_obss_scan(wpa_s, 1);
733 } else if (state == WPA_DISCONNECTED || state == WPA_ASSOCIATING ||
734 state == WPA_ASSOCIATED) {
735 wpa_s->new_connection = 1;
736 wpa_drv_set_operstate(wpa_s, 0);
737 #ifndef IEEE8021X_EAPOL
738 wpa_drv_set_supp_port(wpa_s, 0);
739 #endif /* IEEE8021X_EAPOL */
740 sme_sched_obss_scan(wpa_s, 0);
742 wpa_s->wpa_state = state;
745 if (state == WPA_COMPLETED)
746 wpa_supplicant_start_bgscan(wpa_s);
747 else if (state < WPA_ASSOCIATED)
748 wpa_supplicant_stop_bgscan(wpa_s);
749 #endif /* CONFIG_BGSCAN */
751 if (state == WPA_AUTHENTICATING)
752 wpa_supplicant_stop_autoscan(wpa_s);
754 if (state == WPA_DISCONNECTED || state == WPA_INACTIVE)
755 wpa_supplicant_start_autoscan(wpa_s);
757 if (wpa_s->wpa_state != old_state) {
758 wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
761 * Notify the P2P Device interface about a state change in one
764 wpas_p2p_indicate_state_change(wpa_s);
766 if (wpa_s->wpa_state == WPA_COMPLETED ||
767 old_state == WPA_COMPLETED)
768 wpas_notify_auth_changed(wpa_s);
773 void wpa_supplicant_terminate_proc(struct wpa_global *global)
777 struct wpa_supplicant *wpa_s = global->ifaces;
779 struct wpa_supplicant *next = wpa_s->next;
780 if (wpas_wps_terminate_pending(wpa_s) == 1)
783 if (wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE ||
784 (wpa_s->current_ssid && wpa_s->current_ssid->p2p_group))
785 wpas_p2p_disconnect(wpa_s);
786 #endif /* CONFIG_P2P */
789 #endif /* CONFIG_WPS */
796 static void wpa_supplicant_terminate(int sig, void *signal_ctx)
798 struct wpa_global *global = signal_ctx;
799 wpa_supplicant_terminate_proc(global);
803 void wpa_supplicant_clear_status(struct wpa_supplicant *wpa_s)
805 enum wpa_states old_state = wpa_s->wpa_state;
807 wpa_s->pairwise_cipher = 0;
808 wpa_s->group_cipher = 0;
809 wpa_s->mgmt_group_cipher = 0;
811 if (wpa_s->wpa_state != WPA_INTERFACE_DISABLED)
812 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
814 if (wpa_s->wpa_state != old_state)
815 wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
820 * wpa_supplicant_reload_configuration - Reload configuration data
821 * @wpa_s: Pointer to wpa_supplicant data
822 * Returns: 0 on success or -1 if configuration parsing failed
824 * This function can be used to request that the configuration data is reloaded
825 * (e.g., after configuration file change). This function is reloading
826 * configuration only for one interface, so this may need to be called multiple
827 * times if %wpa_supplicant is controlling multiple interfaces and all
828 * interfaces need reconfiguration.
830 int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s)
832 struct wpa_config *conf;
836 if (wpa_s->confname == NULL)
838 conf = wpa_config_read(wpa_s->confname, NULL);
840 wpa_msg(wpa_s, MSG_ERROR, "Failed to parse the configuration "
841 "file '%s' - exiting", wpa_s->confname);
844 wpa_config_read(wpa_s->confanother, conf);
846 conf->changed_parameters = (unsigned int) -1;
848 reconf_ctrl = !!conf->ctrl_interface != !!wpa_s->conf->ctrl_interface
849 || (conf->ctrl_interface && wpa_s->conf->ctrl_interface &&
850 os_strcmp(conf->ctrl_interface,
851 wpa_s->conf->ctrl_interface) != 0);
853 if (reconf_ctrl && wpa_s->ctrl_iface) {
854 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
855 wpa_s->ctrl_iface = NULL;
858 eapol_sm_invalidate_cached_session(wpa_s->eapol);
859 if (wpa_s->current_ssid) {
860 wpa_supplicant_deauthenticate(wpa_s,
861 WLAN_REASON_DEAUTH_LEAVING);
865 * TODO: should notify EAPOL SM about changes in opensc_engine_path,
866 * pkcs11_engine_path, pkcs11_module_path, openssl_ciphers.
868 if (wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt)) {
870 * Clear forced success to clear EAP state for next
873 eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
875 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
876 wpa_sm_set_config(wpa_s->wpa, NULL);
877 wpa_sm_pmksa_cache_flush(wpa_s->wpa, NULL);
878 wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
879 rsn_preauth_deinit(wpa_s->wpa);
881 old_ap_scan = wpa_s->conf->ap_scan;
882 wpa_config_free(wpa_s->conf);
884 if (old_ap_scan != wpa_s->conf->ap_scan)
885 wpas_notify_ap_scan_changed(wpa_s);
888 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
890 wpa_supplicant_update_config(wpa_s);
892 wpa_supplicant_clear_status(wpa_s);
893 if (wpa_supplicant_enabled_networks(wpa_s)) {
894 wpa_s->reassociate = 1;
895 wpa_supplicant_req_scan(wpa_s, 0, 0);
897 wpa_dbg(wpa_s, MSG_DEBUG, "Reconfiguration completed");
902 static void wpa_supplicant_reconfig(int sig, void *signal_ctx)
904 struct wpa_global *global = signal_ctx;
905 struct wpa_supplicant *wpa_s;
906 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
907 wpa_dbg(wpa_s, MSG_DEBUG, "Signal %d received - reconfiguring",
909 if (wpa_supplicant_reload_configuration(wpa_s) < 0) {
910 wpa_supplicant_terminate_proc(global);
916 static int wpa_supplicant_suites_from_ai(struct wpa_supplicant *wpa_s,
917 struct wpa_ssid *ssid,
918 struct wpa_ie_data *ie)
920 int ret = wpa_sm_parse_own_wpa_ie(wpa_s->wpa, ie);
923 wpa_msg(wpa_s, MSG_INFO, "WPA: Failed to parse WPA IE "
924 "from association info");
929 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Using WPA IE from AssocReq to set "
931 if (!(ie->group_cipher & ssid->group_cipher)) {
932 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled group "
933 "cipher 0x%x (mask 0x%x) - reject",
934 ie->group_cipher, ssid->group_cipher);
937 if (!(ie->pairwise_cipher & ssid->pairwise_cipher)) {
938 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled pairwise "
939 "cipher 0x%x (mask 0x%x) - reject",
940 ie->pairwise_cipher, ssid->pairwise_cipher);
943 if (!(ie->key_mgmt & ssid->key_mgmt)) {
944 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled key "
945 "management 0x%x (mask 0x%x) - reject",
946 ie->key_mgmt, ssid->key_mgmt);
950 #ifdef CONFIG_IEEE80211W
951 if (!(ie->capabilities & WPA_CAPABILITY_MFPC) &&
952 (ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT ?
953 wpa_s->conf->pmf : ssid->ieee80211w) ==
954 MGMT_FRAME_PROTECTION_REQUIRED) {
955 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver associated with an AP "
956 "that does not support management frame protection - "
960 #endif /* CONFIG_IEEE80211W */
967 * wpa_supplicant_set_suites - Set authentication and encryption parameters
968 * @wpa_s: Pointer to wpa_supplicant data
969 * @bss: Scan results for the selected BSS, or %NULL if not available
970 * @ssid: Configuration data for the selected network
971 * @wpa_ie: Buffer for the WPA/RSN IE
972 * @wpa_ie_len: Maximum wpa_ie buffer size on input. This is changed to be the
973 * used buffer length in case the functions returns success.
974 * Returns: 0 on success or -1 on failure
976 * This function is used to configure authentication and encryption parameters
977 * based on the network configuration and scan result for the selected BSS (if
980 int wpa_supplicant_set_suites(struct wpa_supplicant *wpa_s,
981 struct wpa_bss *bss, struct wpa_ssid *ssid,
982 u8 *wpa_ie, size_t *wpa_ie_len)
984 struct wpa_ie_data ie;
986 const u8 *bss_wpa, *bss_rsn, *bss_osen;
989 bss_wpa = wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE);
990 bss_rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
991 bss_osen = wpa_bss_get_vendor_ie(bss, OSEN_IE_VENDOR_TYPE);
993 bss_wpa = bss_rsn = bss_osen = NULL;
995 if (bss_rsn && (ssid->proto & WPA_PROTO_RSN) &&
996 wpa_parse_wpa_ie(bss_rsn, 2 + bss_rsn[1], &ie) == 0 &&
997 (ie.group_cipher & ssid->group_cipher) &&
998 (ie.pairwise_cipher & ssid->pairwise_cipher) &&
999 (ie.key_mgmt & ssid->key_mgmt)) {
1000 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using IEEE 802.11i/D9.0");
1001 proto = WPA_PROTO_RSN;
1002 } else if (bss_wpa && (ssid->proto & WPA_PROTO_WPA) &&
1003 wpa_parse_wpa_ie(bss_wpa, 2 +bss_wpa[1], &ie) == 0 &&
1004 (ie.group_cipher & ssid->group_cipher) &&
1005 (ie.pairwise_cipher & ssid->pairwise_cipher) &&
1006 (ie.key_mgmt & ssid->key_mgmt)) {
1007 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using IEEE 802.11i/D3.0");
1008 proto = WPA_PROTO_WPA;
1010 } else if (bss_osen && (ssid->proto & WPA_PROTO_OSEN)) {
1011 wpa_dbg(wpa_s, MSG_DEBUG, "HS 2.0: using OSEN");
1012 /* TODO: parse OSEN element */
1013 os_memset(&ie, 0, sizeof(ie));
1014 ie.group_cipher = WPA_CIPHER_CCMP;
1015 ie.pairwise_cipher = WPA_CIPHER_CCMP;
1016 ie.key_mgmt = WPA_KEY_MGMT_OSEN;
1017 proto = WPA_PROTO_OSEN;
1018 #endif /* CONFIG_HS20 */
1020 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select WPA/RSN");
1023 if (ssid->proto & WPA_PROTO_OSEN)
1024 proto = WPA_PROTO_OSEN;
1025 else if (ssid->proto & WPA_PROTO_RSN)
1026 proto = WPA_PROTO_RSN;
1028 proto = WPA_PROTO_WPA;
1029 if (wpa_supplicant_suites_from_ai(wpa_s, ssid, &ie) < 0) {
1030 os_memset(&ie, 0, sizeof(ie));
1031 ie.group_cipher = ssid->group_cipher;
1032 ie.pairwise_cipher = ssid->pairwise_cipher;
1033 ie.key_mgmt = ssid->key_mgmt;
1034 #ifdef CONFIG_IEEE80211W
1035 ie.mgmt_group_cipher =
1036 ssid->ieee80211w != NO_MGMT_FRAME_PROTECTION ?
1037 WPA_CIPHER_AES_128_CMAC : 0;
1038 #endif /* CONFIG_IEEE80211W */
1039 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Set cipher suites "
1040 "based on configuration");
1045 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected cipher suites: group %d "
1046 "pairwise %d key_mgmt %d proto %d",
1047 ie.group_cipher, ie.pairwise_cipher, ie.key_mgmt, proto);
1048 #ifdef CONFIG_IEEE80211W
1049 if (ssid->ieee80211w) {
1050 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected mgmt group cipher %d",
1051 ie.mgmt_group_cipher);
1053 #endif /* CONFIG_IEEE80211W */
1055 wpa_s->wpa_proto = proto;
1056 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PROTO, proto);
1057 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED,
1058 !!(ssid->proto & (WPA_PROTO_RSN | WPA_PROTO_OSEN)));
1060 if (bss || !wpa_s->ap_ies_from_associnfo) {
1061 if (wpa_sm_set_ap_wpa_ie(wpa_s->wpa, bss_wpa,
1062 bss_wpa ? 2 + bss_wpa[1] : 0) ||
1063 wpa_sm_set_ap_rsn_ie(wpa_s->wpa, bss_rsn,
1064 bss_rsn ? 2 + bss_rsn[1] : 0))
1068 sel = ie.group_cipher & ssid->group_cipher;
1069 wpa_s->group_cipher = wpa_pick_group_cipher(sel);
1070 if (wpa_s->group_cipher < 0) {
1071 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select group "
1075 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using GTK %s",
1076 wpa_cipher_txt(wpa_s->group_cipher));
1078 sel = ie.pairwise_cipher & ssid->pairwise_cipher;
1079 wpa_s->pairwise_cipher = wpa_pick_pairwise_cipher(sel, 1);
1080 if (wpa_s->pairwise_cipher < 0) {
1081 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select pairwise "
1085 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using PTK %s",
1086 wpa_cipher_txt(wpa_s->pairwise_cipher));
1088 sel = ie.key_mgmt & ssid->key_mgmt;
1090 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SAE))
1091 sel &= ~(WPA_KEY_MGMT_SAE | WPA_KEY_MGMT_FT_SAE);
1092 #endif /* CONFIG_SAE */
1094 #ifdef CONFIG_IEEE80211R
1095 } else if (sel & WPA_KEY_MGMT_FT_IEEE8021X) {
1096 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_IEEE8021X;
1097 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/802.1X");
1098 } else if (sel & WPA_KEY_MGMT_FT_PSK) {
1099 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_PSK;
1100 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/PSK");
1101 #endif /* CONFIG_IEEE80211R */
1103 } else if (sel & WPA_KEY_MGMT_SAE) {
1104 wpa_s->key_mgmt = WPA_KEY_MGMT_SAE;
1105 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT SAE");
1106 } else if (sel & WPA_KEY_MGMT_FT_SAE) {
1107 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_SAE;
1108 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT FT/SAE");
1109 #endif /* CONFIG_SAE */
1110 #ifdef CONFIG_IEEE80211W
1111 } else if (sel & WPA_KEY_MGMT_IEEE8021X_SHA256) {
1112 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SHA256;
1113 wpa_dbg(wpa_s, MSG_DEBUG,
1114 "WPA: using KEY_MGMT 802.1X with SHA256");
1115 } else if (sel & WPA_KEY_MGMT_PSK_SHA256) {
1116 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK_SHA256;
1117 wpa_dbg(wpa_s, MSG_DEBUG,
1118 "WPA: using KEY_MGMT PSK with SHA256");
1119 #endif /* CONFIG_IEEE80211W */
1120 } else if (sel & WPA_KEY_MGMT_IEEE8021X) {
1121 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X;
1122 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT 802.1X");
1123 } else if (sel & WPA_KEY_MGMT_PSK) {
1124 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK;
1125 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-PSK");
1126 } else if (sel & WPA_KEY_MGMT_WPA_NONE) {
1127 wpa_s->key_mgmt = WPA_KEY_MGMT_WPA_NONE;
1128 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-NONE");
1130 } else if (sel & WPA_KEY_MGMT_OSEN) {
1131 wpa_s->key_mgmt = WPA_KEY_MGMT_OSEN;
1132 wpa_dbg(wpa_s, MSG_DEBUG, "HS 2.0: using KEY_MGMT OSEN");
1133 #endif /* CONFIG_HS20 */
1135 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select "
1136 "authenticated key management type");
1140 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
1141 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
1142 wpa_s->pairwise_cipher);
1143 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
1145 #ifdef CONFIG_IEEE80211W
1146 sel = ie.mgmt_group_cipher;
1147 if ((ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT ?
1148 wpa_s->conf->pmf : ssid->ieee80211w) == NO_MGMT_FRAME_PROTECTION ||
1149 !(ie.capabilities & WPA_CAPABILITY_MFPC))
1151 if (sel & WPA_CIPHER_AES_128_CMAC) {
1152 wpa_s->mgmt_group_cipher = WPA_CIPHER_AES_128_CMAC;
1153 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1155 } else if (sel & WPA_CIPHER_BIP_GMAC_128) {
1156 wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_GMAC_128;
1157 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1159 } else if (sel & WPA_CIPHER_BIP_GMAC_256) {
1160 wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_GMAC_256;
1161 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1163 } else if (sel & WPA_CIPHER_BIP_CMAC_256) {
1164 wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_CMAC_256;
1165 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1168 wpa_s->mgmt_group_cipher = 0;
1169 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: not using MGMT group cipher");
1171 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
1172 wpa_s->mgmt_group_cipher);
1173 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MFP,
1174 (ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT ?
1175 wpa_s->conf->pmf : ssid->ieee80211w));
1176 #endif /* CONFIG_IEEE80211W */
1178 if (wpa_sm_set_assoc_wpa_ie_default(wpa_s->wpa, wpa_ie, wpa_ie_len)) {
1179 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to generate WPA IE");
1183 if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt)) {
1184 wpa_sm_set_pmk(wpa_s->wpa, ssid->psk, PMK_LEN, NULL);
1185 #ifndef CONFIG_NO_PBKDF2
1186 if (bss && ssid->bssid_set && ssid->ssid_len == 0 &&
1189 pbkdf2_sha1(ssid->passphrase, bss->ssid, bss->ssid_len,
1190 4096, psk, PMK_LEN);
1191 wpa_hexdump_key(MSG_MSGDUMP, "PSK (from passphrase)",
1193 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN, NULL);
1195 #endif /* CONFIG_NO_PBKDF2 */
1196 #ifdef CONFIG_EXT_PASSWORD
1197 if (ssid->ext_psk) {
1198 struct wpabuf *pw = ext_password_get(wpa_s->ext_pw,
1200 char pw_str[64 + 1];
1204 wpa_msg(wpa_s, MSG_INFO, "EXT PW: No PSK "
1205 "found from external storage");
1209 if (wpabuf_len(pw) < 8 || wpabuf_len(pw) > 64) {
1210 wpa_msg(wpa_s, MSG_INFO, "EXT PW: Unexpected "
1211 "PSK length %d in external storage",
1212 (int) wpabuf_len(pw));
1213 ext_password_free(pw);
1217 os_memcpy(pw_str, wpabuf_head(pw), wpabuf_len(pw));
1218 pw_str[wpabuf_len(pw)] = '\0';
1220 #ifndef CONFIG_NO_PBKDF2
1221 if (wpabuf_len(pw) >= 8 && wpabuf_len(pw) < 64 && bss)
1223 pbkdf2_sha1(pw_str, bss->ssid, bss->ssid_len,
1224 4096, psk, PMK_LEN);
1225 os_memset(pw_str, 0, sizeof(pw_str));
1226 wpa_hexdump_key(MSG_MSGDUMP, "PSK (from "
1227 "external passphrase)",
1229 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN, NULL);
1231 #endif /* CONFIG_NO_PBKDF2 */
1232 if (wpabuf_len(pw) == 2 * PMK_LEN) {
1233 if (hexstr2bin(pw_str, psk, PMK_LEN) < 0) {
1234 wpa_msg(wpa_s, MSG_INFO, "EXT PW: "
1235 "Invalid PSK hex string");
1236 os_memset(pw_str, 0, sizeof(pw_str));
1237 ext_password_free(pw);
1240 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN, NULL);
1242 wpa_msg(wpa_s, MSG_INFO, "EXT PW: No suitable "
1244 os_memset(pw_str, 0, sizeof(pw_str));
1245 ext_password_free(pw);
1249 os_memset(pw_str, 0, sizeof(pw_str));
1250 ext_password_free(pw);
1252 #endif /* CONFIG_EXT_PASSWORD */
1254 wpa_sm_set_pmk_from_pmksa(wpa_s->wpa);
1260 static void wpas_ext_capab_byte(struct wpa_supplicant *wpa_s, u8 *pos, int idx)
1265 case 0: /* Bits 0-7 */
1267 case 1: /* Bits 8-15 */
1269 case 2: /* Bits 16-23 */
1271 *pos |= 0x02; /* Bit 17 - WNM-Sleep Mode */
1272 *pos |= 0x08; /* Bit 19 - BSS Transition */
1273 #endif /* CONFIG_WNM */
1275 case 3: /* Bits 24-31 */
1277 *pos |= 0x02; /* Bit 25 - SSID List */
1278 #endif /* CONFIG_WNM */
1279 #ifdef CONFIG_INTERWORKING
1280 if (wpa_s->conf->interworking)
1281 *pos |= 0x80; /* Bit 31 - Interworking */
1282 #endif /* CONFIG_INTERWORKING */
1284 case 4: /* Bits 32-39 */
1285 #ifdef CONFIG_INTERWORKING
1286 if (wpa_s->drv_flags / WPA_DRIVER_FLAGS_QOS_MAPPING)
1287 *pos |= 0x01; /* Bit 32 - QoS Map */
1288 #endif /* CONFIG_INTERWORKING */
1290 case 5: /* Bits 40-47 */
1292 if (wpa_s->conf->hs20)
1293 *pos |= 0x40; /* Bit 46 - WNM-Notification */
1294 #endif /* CONFIG_HS20 */
1296 case 6: /* Bits 48-55 */
1302 int wpas_build_ext_capab(struct wpa_supplicant *wpa_s, u8 *buf, size_t buflen)
1307 if (len < wpa_s->extended_capa_len)
1308 len = wpa_s->extended_capa_len;
1309 if (buflen < (size_t) len + 2) {
1310 wpa_printf(MSG_INFO,
1311 "Not enough room for building extended capabilities element");
1315 *pos++ = WLAN_EID_EXT_CAPAB;
1317 for (i = 0; i < len; i++, pos++) {
1318 wpas_ext_capab_byte(wpa_s, pos, i);
1320 if (i < wpa_s->extended_capa_len) {
1321 *pos &= ~wpa_s->extended_capa_mask[i];
1322 *pos |= wpa_s->extended_capa[i];
1326 while (len > 0 && buf[1 + len] == 0) {
1337 static int wpas_valid_bss(struct wpa_supplicant *wpa_s,
1338 struct wpa_bss *test_bss)
1340 struct wpa_bss *bss;
1342 dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
1343 if (bss == test_bss)
1351 static int wpas_valid_ssid(struct wpa_supplicant *wpa_s,
1352 struct wpa_ssid *test_ssid)
1354 struct wpa_ssid *ssid;
1356 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) {
1357 if (ssid == test_ssid)
1365 int wpas_valid_bss_ssid(struct wpa_supplicant *wpa_s, struct wpa_bss *test_bss,
1366 struct wpa_ssid *test_ssid)
1368 if (test_bss && !wpas_valid_bss(wpa_s, test_bss))
1371 return test_ssid == NULL || wpas_valid_ssid(wpa_s, test_ssid);
1375 void wpas_connect_work_free(struct wpa_connect_work *cwork)
1383 void wpas_connect_work_done(struct wpa_supplicant *wpa_s)
1385 struct wpa_connect_work *cwork;
1386 struct wpa_radio_work *work = wpa_s->connect_work;
1391 wpa_s->connect_work = NULL;
1394 wpas_connect_work_free(cwork);
1395 radio_work_done(work);
1399 int wpas_update_random_addr(struct wpa_supplicant *wpa_s, int style)
1401 struct os_reltime now;
1404 os_get_reltime(&now);
1405 if (wpa_s->last_mac_addr_style == style &&
1406 wpa_s->last_mac_addr_change.sec != 0 &&
1407 !os_reltime_expired(&now, &wpa_s->last_mac_addr_change,
1408 wpa_s->conf->rand_addr_lifetime)) {
1409 wpa_msg(wpa_s, MSG_DEBUG,
1410 "Previously selected random MAC address has not yet expired");
1416 if (random_mac_addr(addr) < 0)
1420 os_memcpy(addr, wpa_s->perm_addr, ETH_ALEN);
1421 if (random_mac_addr_keep_oui(addr) < 0)
1428 if (wpa_drv_set_mac_addr(wpa_s, addr) < 0) {
1429 wpa_msg(wpa_s, MSG_INFO,
1430 "Failed to set random MAC address");
1434 os_get_reltime(&wpa_s->last_mac_addr_change);
1435 wpa_s->mac_addr_changed = 1;
1436 wpa_s->last_mac_addr_style = style;
1438 if (wpa_supplicant_update_mac_addr(wpa_s) < 0) {
1439 wpa_msg(wpa_s, MSG_INFO,
1440 "Could not update MAC address information");
1444 wpa_msg(wpa_s, MSG_DEBUG, "Using random MAC address " MACSTR,
1451 int wpas_update_random_addr_disassoc(struct wpa_supplicant *wpa_s)
1453 if (wpa_s->wpa_state >= WPA_AUTHENTICATING ||
1454 !wpa_s->conf->preassoc_mac_addr)
1457 return wpas_update_random_addr(wpa_s, wpa_s->conf->preassoc_mac_addr);
1461 static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit);
1464 * wpa_supplicant_associate - Request association
1465 * @wpa_s: Pointer to wpa_supplicant data
1466 * @bss: Scan results for the selected BSS, or %NULL if not available
1467 * @ssid: Configuration data for the selected network
1469 * This function is used to request %wpa_supplicant to associate with a BSS.
1471 void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
1472 struct wpa_bss *bss, struct wpa_ssid *ssid)
1474 struct wpa_connect_work *cwork;
1477 if (ssid->mac_addr == -1)
1478 rand_style = wpa_s->conf->mac_addr;
1480 rand_style = ssid->mac_addr;
1482 if (wpa_s->last_ssid == ssid) {
1483 wpa_dbg(wpa_s, MSG_DEBUG, "Re-association to the same ESS");
1484 } else if (rand_style > 0) {
1485 if (wpas_update_random_addr(wpa_s, rand_style) < 0)
1487 wpa_sm_pmksa_cache_flush(wpa_s->wpa, ssid);
1488 } else if (wpa_s->mac_addr_changed) {
1489 if (wpa_drv_set_mac_addr(wpa_s, NULL) < 0) {
1490 wpa_msg(wpa_s, MSG_INFO,
1491 "Could not restore permanent MAC address");
1494 wpa_s->mac_addr_changed = 0;
1495 if (wpa_supplicant_update_mac_addr(wpa_s) < 0) {
1496 wpa_msg(wpa_s, MSG_INFO,
1497 "Could not update MAC address information");
1500 wpa_msg(wpa_s, MSG_DEBUG, "Using permanent MAC address");
1502 wpa_s->last_ssid = ssid;
1504 #ifdef CONFIG_IBSS_RSN
1505 ibss_rsn_deinit(wpa_s->ibss_rsn);
1506 wpa_s->ibss_rsn = NULL;
1507 #endif /* CONFIG_IBSS_RSN */
1509 if (ssid->mode == WPAS_MODE_AP || ssid->mode == WPAS_MODE_P2P_GO ||
1510 ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) {
1512 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_AP)) {
1513 wpa_msg(wpa_s, MSG_INFO, "Driver does not support AP "
1517 if (wpa_supplicant_create_ap(wpa_s, ssid) < 0) {
1518 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
1519 if (ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION)
1520 wpas_p2p_ap_setup_failed(wpa_s);
1523 wpa_s->current_bss = bss;
1524 #else /* CONFIG_AP */
1525 wpa_msg(wpa_s, MSG_ERROR, "AP mode support not included in "
1527 #endif /* CONFIG_AP */
1533 wpa_tdls_ap_ies(wpa_s->wpa, (const u8 *) (bss + 1),
1535 #endif /* CONFIG_TDLS */
1537 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) &&
1538 ssid->mode == IEEE80211_MODE_INFRA) {
1539 sme_authenticate(wpa_s, bss, ssid);
1543 if (wpa_s->connect_work) {
1544 wpa_dbg(wpa_s, MSG_DEBUG, "Reject wpa_supplicant_associate() call since connect_work exist");
1548 if (radio_work_pending(wpa_s, "connect")) {
1549 wpa_dbg(wpa_s, MSG_DEBUG, "Reject wpa_supplicant_associate() call since pending work exist");
1553 cwork = os_zalloc(sizeof(*cwork));
1560 if (radio_add_work(wpa_s, bss ? bss->freq : 0, "connect", 1,
1561 wpas_start_assoc_cb, cwork) < 0) {
1567 static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
1569 struct wpa_connect_work *cwork = work->ctx;
1570 struct wpa_bss *bss = cwork->bss;
1571 struct wpa_ssid *ssid = cwork->ssid;
1572 struct wpa_supplicant *wpa_s = work->wpa_s;
1575 int use_crypt, ret, i, bssid_changed;
1576 int algs = WPA_AUTH_ALG_OPEN;
1577 unsigned int cipher_pairwise, cipher_group;
1578 struct wpa_driver_associate_params params;
1579 int wep_keys_set = 0;
1580 int assoc_failed = 0;
1581 struct wpa_ssid *old_ssid;
1582 #ifdef CONFIG_HT_OVERRIDES
1583 struct ieee80211_ht_capabilities htcaps;
1584 struct ieee80211_ht_capabilities htcaps_mask;
1585 #endif /* CONFIG_HT_OVERRIDES */
1586 #ifdef CONFIG_VHT_OVERRIDES
1587 struct ieee80211_vht_capabilities vhtcaps;
1588 struct ieee80211_vht_capabilities vhtcaps_mask;
1589 #endif /* CONFIG_VHT_OVERRIDES */
1592 if (work->started) {
1593 wpa_s->connect_work = NULL;
1595 /* cancel possible auth. timeout */
1596 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s,
1599 wpas_connect_work_free(cwork);
1603 wpa_s->connect_work = work;
1605 if (!wpas_valid_bss_ssid(wpa_s, bss, ssid)) {
1606 wpa_dbg(wpa_s, MSG_DEBUG, "BSS/SSID entry for association not valid anymore - drop connection attempt");
1607 wpas_connect_work_done(wpa_s);
1611 os_memset(¶ms, 0, sizeof(params));
1612 wpa_s->reassociate = 0;
1613 wpa_s->eap_expected_failure = 0;
1615 (!wpas_driver_bss_selection(wpa_s) || wpas_wps_searching(wpa_s))) {
1616 #ifdef CONFIG_IEEE80211R
1617 const u8 *ie, *md = NULL;
1618 #endif /* CONFIG_IEEE80211R */
1619 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with " MACSTR
1620 " (SSID='%s' freq=%d MHz)", MAC2STR(bss->bssid),
1621 wpa_ssid_txt(bss->ssid, bss->ssid_len), bss->freq);
1622 bssid_changed = !is_zero_ether_addr(wpa_s->bssid);
1623 os_memset(wpa_s->bssid, 0, ETH_ALEN);
1624 os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN);
1626 wpas_notify_bssid_changed(wpa_s);
1627 #ifdef CONFIG_IEEE80211R
1628 ie = wpa_bss_get_ie(bss, WLAN_EID_MOBILITY_DOMAIN);
1629 if (ie && ie[1] >= MOBILITY_DOMAIN_ID_LEN)
1631 wpa_sm_set_ft_params(wpa_s->wpa, ie, ie ? 2 + ie[1] : 0);
1633 /* Prepare for the next transition */
1634 wpa_ft_prepare_auth_request(wpa_s->wpa, ie);
1636 #endif /* CONFIG_IEEE80211R */
1638 } else if ((ssid->ssid == NULL || ssid->ssid_len == 0) &&
1639 wpa_s->conf->ap_scan == 2 &&
1640 (ssid->key_mgmt & WPA_KEY_MGMT_WPS)) {
1641 /* Use ap_scan==1 style network selection to find the network
1643 wpas_connect_work_done(wpa_s);
1644 wpa_s->scan_req = MANUAL_SCAN_REQ;
1645 wpa_s->reassociate = 1;
1646 wpa_supplicant_req_scan(wpa_s, 0, 0);
1648 #endif /* CONFIG_WPS */
1650 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with SSID '%s'",
1651 wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
1652 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
1654 wpa_supplicant_cancel_sched_scan(wpa_s);
1655 wpa_supplicant_cancel_scan(wpa_s);
1657 /* Starting new association, so clear the possibly used WPA IE from the
1658 * previous association. */
1659 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
1661 #ifdef IEEE8021X_EAPOL
1662 if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1664 if (ssid->non_leap == 0)
1665 algs = WPA_AUTH_ALG_LEAP;
1667 algs |= WPA_AUTH_ALG_LEAP;
1670 #endif /* IEEE8021X_EAPOL */
1671 wpa_dbg(wpa_s, MSG_DEBUG, "Automatic auth_alg selection: 0x%x", algs);
1672 if (ssid->auth_alg) {
1673 algs = ssid->auth_alg;
1674 wpa_dbg(wpa_s, MSG_DEBUG, "Overriding auth_alg selection: "
1678 if (bss && (wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE) ||
1679 wpa_bss_get_ie(bss, WLAN_EID_RSN)) &&
1680 wpa_key_mgmt_wpa(ssid->key_mgmt)) {
1681 int try_opportunistic;
1682 try_opportunistic = (ssid->proactive_key_caching < 0 ?
1684 ssid->proactive_key_caching) &&
1685 (ssid->proto & WPA_PROTO_RSN);
1686 if (pmksa_cache_set_current(wpa_s->wpa, NULL, bss->bssid,
1687 ssid, try_opportunistic) == 0)
1688 eapol_sm_notify_pmkid_attempt(wpa_s->eapol, 1);
1689 wpa_ie_len = sizeof(wpa_ie);
1690 if (wpa_supplicant_set_suites(wpa_s, bss, ssid,
1691 wpa_ie, &wpa_ie_len)) {
1692 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA "
1693 "key management and encryption suites");
1694 wpas_connect_work_done(wpa_s);
1697 } else if ((ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) && bss &&
1698 wpa_key_mgmt_wpa_ieee8021x(ssid->key_mgmt)) {
1700 * Both WPA and non-WPA IEEE 802.1X enabled in configuration -
1701 * use non-WPA since the scan results did not indicate that the
1702 * AP is using WPA or WPA2.
1704 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
1706 wpa_s->wpa_proto = 0;
1707 } else if (wpa_key_mgmt_wpa_any(ssid->key_mgmt)) {
1708 wpa_ie_len = sizeof(wpa_ie);
1709 if (wpa_supplicant_set_suites(wpa_s, NULL, ssid,
1710 wpa_ie, &wpa_ie_len)) {
1711 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA "
1712 "key management and encryption suites (no "
1714 wpas_connect_work_done(wpa_s);
1718 } else if (ssid->key_mgmt & WPA_KEY_MGMT_WPS) {
1719 struct wpabuf *wps_ie;
1720 wps_ie = wps_build_assoc_req_ie(wpas_wps_get_req_type(ssid));
1721 if (wps_ie && wpabuf_len(wps_ie) <= sizeof(wpa_ie)) {
1722 wpa_ie_len = wpabuf_len(wps_ie);
1723 os_memcpy(wpa_ie, wpabuf_head(wps_ie), wpa_ie_len);
1726 wpabuf_free(wps_ie);
1727 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
1728 if (!bss || (bss->caps & IEEE80211_CAP_PRIVACY))
1729 params.wps = WPS_MODE_PRIVACY;
1731 params.wps = WPS_MODE_OPEN;
1732 wpa_s->wpa_proto = 0;
1733 #endif /* CONFIG_WPS */
1735 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
1737 wpa_s->wpa_proto = 0;
1741 if (wpa_s->global->p2p) {
1745 pos = wpa_ie + wpa_ie_len;
1746 len = sizeof(wpa_ie) - wpa_ie_len;
1747 res = wpas_p2p_assoc_req_ie(wpa_s, bss, pos, len,
1753 wpa_s->cross_connect_disallowed = 0;
1756 p2p = wpa_bss_get_vendor_ie_multi(bss, P2P_IE_VENDOR_TYPE);
1758 wpa_s->cross_connect_disallowed =
1759 p2p_get_cross_connect_disallowed(p2p);
1761 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: WLAN AP %s cross "
1763 wpa_s->cross_connect_disallowed ?
1764 "disallows" : "allows");
1768 os_memset(wpa_s->p2p_ip_addr_info, 0, sizeof(wpa_s->p2p_ip_addr_info));
1769 #endif /* CONFIG_P2P */
1772 if (is_hs20_network(wpa_s, ssid, bss)) {
1773 struct wpabuf *hs20;
1774 hs20 = wpabuf_alloc(20);
1776 int pps_mo_id = hs20_get_pps_mo_id(wpa_s, ssid);
1779 wpas_hs20_add_indication(hs20, pps_mo_id);
1780 len = sizeof(wpa_ie) - wpa_ie_len;
1781 if (wpabuf_len(hs20) <= len) {
1782 os_memcpy(wpa_ie + wpa_ie_len,
1783 wpabuf_head(hs20), wpabuf_len(hs20));
1784 wpa_ie_len += wpabuf_len(hs20);
1789 #endif /* CONFIG_HS20 */
1792 * Workaround: Add Extended Capabilities element only if the AP
1793 * included this element in Beacon/Probe Response frames. Some older
1794 * APs seem to have interoperability issues if this element is
1795 * included, so while the standard may require us to include the
1796 * element in all cases, it is justifiable to skip it to avoid
1797 * interoperability issues.
1799 if (!bss || wpa_bss_get_ie(bss, WLAN_EID_EXT_CAPAB)) {
1802 ext_capab_len = wpas_build_ext_capab(wpa_s, ext_capab,
1804 if (ext_capab_len > 0) {
1806 if (wpa_ie_len > 0 && pos[0] == WLAN_EID_RSN)
1808 os_memmove(pos + ext_capab_len, pos,
1809 wpa_ie_len - (pos - wpa_ie));
1810 wpa_ie_len += ext_capab_len;
1811 os_memcpy(pos, ext_capab, ext_capab_len);
1815 wpa_clear_keys(wpa_s, bss ? bss->bssid : NULL);
1817 cipher_pairwise = wpa_s->pairwise_cipher;
1818 cipher_group = wpa_s->group_cipher;
1819 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
1820 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1821 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE)
1823 if (wpa_set_wep_keys(wpa_s, ssid)) {
1828 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS)
1831 #ifdef IEEE8021X_EAPOL
1832 if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1833 if ((ssid->eapol_flags &
1834 (EAPOL_FLAG_REQUIRE_KEY_UNICAST |
1835 EAPOL_FLAG_REQUIRE_KEY_BROADCAST)) == 0 &&
1839 /* Assume that dynamic WEP-104 keys will be used and
1840 * set cipher suites in order for drivers to expect
1842 cipher_pairwise = cipher_group = WPA_CIPHER_WEP104;
1845 #endif /* IEEE8021X_EAPOL */
1847 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
1848 /* Set the key before (and later after) association */
1849 wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
1852 wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING);
1854 params.ssid = bss->ssid;
1855 params.ssid_len = bss->ssid_len;
1856 if (!wpas_driver_bss_selection(wpa_s) || ssid->bssid_set) {
1857 wpa_printf(MSG_DEBUG, "Limit connection to BSSID "
1858 MACSTR " freq=%u MHz based on scan results "
1860 MAC2STR(bss->bssid), bss->freq,
1862 params.bssid = bss->bssid;
1863 params.freq.freq = bss->freq;
1865 params.bssid_hint = bss->bssid;
1866 params.freq_hint = bss->freq;
1868 params.ssid = ssid->ssid;
1869 params.ssid_len = ssid->ssid_len;
1872 if (ssid->mode == WPAS_MODE_IBSS && ssid->bssid_set &&
1873 wpa_s->conf->ap_scan == 2) {
1874 params.bssid = ssid->bssid;
1875 params.fixed_bssid = 1;
1878 if (ssid->mode == WPAS_MODE_IBSS && ssid->frequency > 0 &&
1879 params.freq.freq == 0) {
1880 enum hostapd_hw_mode hw_mode;
1883 params.freq.freq = ssid->frequency;
1885 hw_mode = ieee80211_freq_to_chan(ssid->frequency, &channel);
1886 for (i = 0; wpa_s->hw.modes && i < wpa_s->hw.num_modes; i++) {
1887 if (wpa_s->hw.modes[i].mode == hw_mode) {
1888 struct hostapd_hw_modes *mode;
1890 mode = &wpa_s->hw.modes[i];
1891 params.freq.ht_enabled = ht_supported(mode);
1897 if (ssid->mode == WPAS_MODE_IBSS) {
1898 if (ssid->beacon_int)
1899 params.beacon_int = ssid->beacon_int;
1901 params.beacon_int = wpa_s->conf->beacon_int;
1904 params.wpa_ie = wpa_ie;
1905 params.wpa_ie_len = wpa_ie_len;
1906 params.pairwise_suite = cipher_pairwise;
1907 params.group_suite = cipher_group;
1908 params.key_mgmt_suite = wpa_s->key_mgmt;
1909 params.wpa_proto = wpa_s->wpa_proto;
1910 params.auth_alg = algs;
1911 params.mode = ssid->mode;
1912 params.bg_scan_period = ssid->bg_scan_period;
1913 for (i = 0; i < NUM_WEP_KEYS; i++) {
1914 if (ssid->wep_key_len[i])
1915 params.wep_key[i] = ssid->wep_key[i];
1916 params.wep_key_len[i] = ssid->wep_key_len[i];
1918 params.wep_tx_keyidx = ssid->wep_tx_keyidx;
1920 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) &&
1921 (params.key_mgmt_suite == WPA_KEY_MGMT_PSK ||
1922 params.key_mgmt_suite == WPA_KEY_MGMT_FT_PSK)) {
1923 params.passphrase = ssid->passphrase;
1925 params.psk = ssid->psk;
1928 if (wpa_s->conf->key_mgmt_offload) {
1929 if (params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X ||
1930 params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SHA256)
1931 params.req_key_mgmt_offload =
1932 ssid->proactive_key_caching < 0 ?
1933 wpa_s->conf->okc : ssid->proactive_key_caching;
1935 params.req_key_mgmt_offload = 1;
1937 if ((params.key_mgmt_suite == WPA_KEY_MGMT_PSK ||
1938 params.key_mgmt_suite == WPA_KEY_MGMT_PSK_SHA256 ||
1939 params.key_mgmt_suite == WPA_KEY_MGMT_FT_PSK) &&
1941 params.psk = ssid->psk;
1944 params.drop_unencrypted = use_crypt;
1946 #ifdef CONFIG_IEEE80211W
1947 params.mgmt_frame_protection =
1948 ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT ?
1949 wpa_s->conf->pmf : ssid->ieee80211w;
1950 if (params.mgmt_frame_protection != NO_MGMT_FRAME_PROTECTION && bss) {
1951 const u8 *rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
1952 struct wpa_ie_data ie;
1953 if (rsn && wpa_parse_wpa_ie(rsn, 2 + rsn[1], &ie) == 0 &&
1955 (WPA_CAPABILITY_MFPC | WPA_CAPABILITY_MFPR)) {
1956 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected AP supports "
1957 "MFP: require MFP");
1958 params.mgmt_frame_protection =
1959 MGMT_FRAME_PROTECTION_REQUIRED;
1962 #endif /* CONFIG_IEEE80211W */
1964 params.p2p = ssid->p2p_group;
1966 if (wpa_s->parent->set_sta_uapsd)
1967 params.uapsd = wpa_s->parent->sta_uapsd;
1971 #ifdef CONFIG_HT_OVERRIDES
1972 os_memset(&htcaps, 0, sizeof(htcaps));
1973 os_memset(&htcaps_mask, 0, sizeof(htcaps_mask));
1974 params.htcaps = (u8 *) &htcaps;
1975 params.htcaps_mask = (u8 *) &htcaps_mask;
1976 wpa_supplicant_apply_ht_overrides(wpa_s, ssid, ¶ms);
1977 #endif /* CONFIG_HT_OVERRIDES */
1978 #ifdef CONFIG_VHT_OVERRIDES
1979 os_memset(&vhtcaps, 0, sizeof(vhtcaps));
1980 os_memset(&vhtcaps_mask, 0, sizeof(vhtcaps_mask));
1981 params.vhtcaps = &vhtcaps;
1982 params.vhtcaps_mask = &vhtcaps_mask;
1983 wpa_supplicant_apply_vht_overrides(wpa_s, wpa_s->current_ssid, ¶ms);
1984 #endif /* CONFIG_VHT_OVERRIDES */
1988 * If multi-channel concurrency is not supported, check for any
1989 * frequency conflict. In case of any frequency conflict, remove the
1990 * least prioritized connection.
1992 if (wpa_s->num_multichan_concurrent < 2) {
1994 num = get_shared_radio_freqs(wpa_s, &freq, 1);
1995 if (num > 0 && freq > 0 && freq != params.freq.freq) {
1996 wpa_printf(MSG_DEBUG,
1997 "Assoc conflicting freq found (%d != %d)",
1998 freq, params.freq.freq);
1999 if (wpas_p2p_handle_frequency_conflicts(
2000 wpa_s, params.freq.freq, ssid) < 0) {
2001 wpas_connect_work_done(wpa_s);
2006 #endif /* CONFIG_P2P */
2008 ret = wpa_drv_associate(wpa_s, ¶ms);
2010 wpa_msg(wpa_s, MSG_INFO, "Association request to the driver "
2012 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SANE_ERROR_CODES) {
2014 * The driver is known to mean what is saying, so we
2015 * can stop right here; the association will not
2018 wpas_connection_failed(wpa_s, wpa_s->pending_bssid);
2019 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
2020 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
2023 /* try to continue anyway; new association will be tried again
2028 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
2029 /* Set the key after the association just in case association
2030 * cleared the previously configured key. */
2031 wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
2032 /* No need to timeout authentication since there is no key
2034 wpa_supplicant_cancel_auth_timeout(wpa_s);
2035 wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
2036 #ifdef CONFIG_IBSS_RSN
2037 } else if (ssid->mode == WPAS_MODE_IBSS &&
2038 wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
2039 wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
2041 * RSN IBSS authentication is per-STA and we can disable the
2042 * per-BSSID authentication.
2044 wpa_supplicant_cancel_auth_timeout(wpa_s);
2045 #endif /* CONFIG_IBSS_RSN */
2047 /* Timeout for IEEE 802.11 authentication and association */
2051 /* give IBSS a bit more time */
2052 timeout = ssid->mode == WPAS_MODE_IBSS ? 10 : 5;
2053 } else if (wpa_s->conf->ap_scan == 1) {
2054 /* give IBSS a bit more time */
2055 timeout = ssid->mode == WPAS_MODE_IBSS ? 20 : 10;
2057 wpa_supplicant_req_auth_timeout(wpa_s, timeout, 0);
2061 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC)) {
2062 /* Set static WEP keys again */
2063 wpa_set_wep_keys(wpa_s, ssid);
2066 if (wpa_s->current_ssid && wpa_s->current_ssid != ssid) {
2068 * Do not allow EAP session resumption between different
2069 * network configurations.
2071 eapol_sm_invalidate_cached_session(wpa_s->eapol);
2073 old_ssid = wpa_s->current_ssid;
2074 wpa_s->current_ssid = ssid;
2075 wpa_s->current_bss = bss;
2076 wpa_supplicant_rsn_supp_set_config(wpa_s, wpa_s->current_ssid);
2077 wpa_supplicant_initiate_eapol(wpa_s);
2078 if (old_ssid != wpa_s->current_ssid)
2079 wpas_notify_network_changed(wpa_s);
2083 static void wpa_supplicant_clear_connection(struct wpa_supplicant *wpa_s,
2086 struct wpa_ssid *old_ssid;
2088 wpas_connect_work_done(wpa_s);
2089 wpa_clear_keys(wpa_s, addr);
2090 old_ssid = wpa_s->current_ssid;
2091 wpa_supplicant_mark_disassoc(wpa_s);
2092 wpa_sm_set_config(wpa_s->wpa, NULL);
2093 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
2094 if (old_ssid != wpa_s->current_ssid)
2095 wpas_notify_network_changed(wpa_s);
2096 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
2101 * wpa_supplicant_deauthenticate - Deauthenticate the current connection
2102 * @wpa_s: Pointer to wpa_supplicant data
2103 * @reason_code: IEEE 802.11 reason code for the deauthenticate frame
2105 * This function is used to request %wpa_supplicant to deauthenticate from the
2108 void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
2112 union wpa_event_data event;
2115 wpa_dbg(wpa_s, MSG_DEBUG, "Request to deauthenticate - bssid=" MACSTR
2116 " pending_bssid=" MACSTR " reason=%d state=%s",
2117 MAC2STR(wpa_s->bssid), MAC2STR(wpa_s->pending_bssid),
2118 reason_code, wpa_supplicant_state_txt(wpa_s->wpa_state));
2120 if (!is_zero_ether_addr(wpa_s->bssid))
2121 addr = wpa_s->bssid;
2122 else if (!is_zero_ether_addr(wpa_s->pending_bssid) &&
2123 (wpa_s->wpa_state == WPA_AUTHENTICATING ||
2124 wpa_s->wpa_state == WPA_ASSOCIATING))
2125 addr = wpa_s->pending_bssid;
2126 else if (wpa_s->wpa_state == WPA_ASSOCIATING) {
2128 * When using driver-based BSS selection, we may not know the
2129 * BSSID with which we are currently trying to associate. We
2130 * need to notify the driver of this disconnection even in such
2131 * a case, so use the all zeros address here.
2133 addr = wpa_s->bssid;
2138 wpa_tdls_teardown_peers(wpa_s->wpa);
2139 #endif /* CONFIG_TDLS */
2142 wpa_drv_deauthenticate(wpa_s, addr, reason_code);
2143 os_memset(&event, 0, sizeof(event));
2144 event.deauth_info.reason_code = (u16) reason_code;
2145 event.deauth_info.locally_generated = 1;
2146 wpa_supplicant_event(wpa_s, EVENT_DEAUTH, &event);
2151 wpa_supplicant_clear_connection(wpa_s, addr);
2154 static void wpa_supplicant_enable_one_network(struct wpa_supplicant *wpa_s,
2155 struct wpa_ssid *ssid)
2157 if (!ssid || !ssid->disabled || ssid->disabled == 2)
2161 wpas_clear_temp_disabled(wpa_s, ssid, 1);
2162 wpas_notify_network_enabled_changed(wpa_s, ssid);
2165 * Try to reassociate since there is no current configuration and a new
2166 * network was made available.
2168 if (!wpa_s->current_ssid && !wpa_s->disconnected)
2169 wpa_s->reassociate = 1;
2174 * wpa_supplicant_enable_network - Mark a configured network as enabled
2175 * @wpa_s: wpa_supplicant structure for a network interface
2176 * @ssid: wpa_ssid structure for a configured network or %NULL
2178 * Enables the specified network or all networks if no network specified.
2180 void wpa_supplicant_enable_network(struct wpa_supplicant *wpa_s,
2181 struct wpa_ssid *ssid)
2184 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
2185 wpa_supplicant_enable_one_network(wpa_s, ssid);
2187 wpa_supplicant_enable_one_network(wpa_s, ssid);
2189 if (wpa_s->reassociate && !wpa_s->disconnected) {
2190 if (wpa_s->sched_scanning) {
2191 wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan to add "
2192 "new network to scan filters");
2193 wpa_supplicant_cancel_sched_scan(wpa_s);
2196 if (wpa_supplicant_fast_associate(wpa_s) != 1)
2197 wpa_supplicant_req_scan(wpa_s, 0, 0);
2203 * wpa_supplicant_disable_network - Mark a configured network as disabled
2204 * @wpa_s: wpa_supplicant structure for a network interface
2205 * @ssid: wpa_ssid structure for a configured network or %NULL
2207 * Disables the specified network or all networks if no network specified.
2209 void wpa_supplicant_disable_network(struct wpa_supplicant *wpa_s,
2210 struct wpa_ssid *ssid)
2212 struct wpa_ssid *other_ssid;
2216 if (wpa_s->sched_scanning)
2217 wpa_supplicant_cancel_sched_scan(wpa_s);
2219 for (other_ssid = wpa_s->conf->ssid; other_ssid;
2220 other_ssid = other_ssid->next) {
2221 was_disabled = other_ssid->disabled;
2222 if (was_disabled == 2)
2223 continue; /* do not change persistent P2P group
2226 other_ssid->disabled = 1;
2228 if (was_disabled != other_ssid->disabled)
2229 wpas_notify_network_enabled_changed(
2232 if (wpa_s->current_ssid)
2233 wpa_supplicant_deauthenticate(
2234 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
2235 } else if (ssid->disabled != 2) {
2236 if (ssid == wpa_s->current_ssid)
2237 wpa_supplicant_deauthenticate(
2238 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
2240 was_disabled = ssid->disabled;
2244 if (was_disabled != ssid->disabled) {
2245 wpas_notify_network_enabled_changed(wpa_s, ssid);
2246 if (wpa_s->sched_scanning) {
2247 wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan "
2248 "to remove network from filters");
2249 wpa_supplicant_cancel_sched_scan(wpa_s);
2250 wpa_supplicant_req_scan(wpa_s, 0, 0);
2258 * wpa_supplicant_select_network - Attempt association with a network
2259 * @wpa_s: wpa_supplicant structure for a network interface
2260 * @ssid: wpa_ssid structure for a configured network or %NULL for any network
2262 void wpa_supplicant_select_network(struct wpa_supplicant *wpa_s,
2263 struct wpa_ssid *ssid)
2266 struct wpa_ssid *other_ssid;
2267 int disconnected = 0;
2269 if (ssid && ssid != wpa_s->current_ssid && wpa_s->current_ssid) {
2270 wpa_supplicant_deauthenticate(
2271 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
2276 wpas_clear_temp_disabled(wpa_s, ssid, 1);
2279 * Mark all other networks disabled or mark all networks enabled if no
2280 * network specified.
2282 for (other_ssid = wpa_s->conf->ssid; other_ssid;
2283 other_ssid = other_ssid->next) {
2284 int was_disabled = other_ssid->disabled;
2285 if (was_disabled == 2)
2286 continue; /* do not change persistent P2P group data */
2288 other_ssid->disabled = ssid ? (ssid->id != other_ssid->id) : 0;
2289 if (was_disabled && !other_ssid->disabled)
2290 wpas_clear_temp_disabled(wpa_s, other_ssid, 0);
2292 if (was_disabled != other_ssid->disabled)
2293 wpas_notify_network_enabled_changed(wpa_s, other_ssid);
2296 if (ssid && ssid == wpa_s->current_ssid && wpa_s->current_ssid) {
2297 /* We are already associated with the selected network */
2298 wpa_printf(MSG_DEBUG, "Already associated with the "
2299 "selected network - do nothing");
2304 wpa_s->current_ssid = ssid;
2305 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
2307 wpa_s->connect_without_scan = NULL;
2308 wpa_s->disconnected = 0;
2309 wpa_s->reassociate = 1;
2311 if (wpa_supplicant_fast_associate(wpa_s) != 1)
2312 wpa_supplicant_req_scan(wpa_s, 0, disconnected ? 100000 : 0);
2315 wpas_notify_network_selected(wpa_s, ssid);
2320 * wpas_set_pkcs11_engine_and_module_path - Set PKCS #11 engine and module path
2321 * @wpa_s: wpa_supplicant structure for a network interface
2322 * @pkcs11_engine_path: PKCS #11 engine path or NULL
2323 * @pkcs11_module_path: PKCS #11 module path or NULL
2324 * Returns: 0 on success; -1 on failure
2326 * Sets the PKCS #11 engine and module path. Both have to be NULL or a valid
2327 * path. If resetting the EAPOL state machine with the new PKCS #11 engine and
2328 * module path fails the paths will be reset to the default value (NULL).
2330 int wpas_set_pkcs11_engine_and_module_path(struct wpa_supplicant *wpa_s,
2331 const char *pkcs11_engine_path,
2332 const char *pkcs11_module_path)
2334 char *pkcs11_engine_path_copy = NULL;
2335 char *pkcs11_module_path_copy = NULL;
2337 if (pkcs11_engine_path != NULL) {
2338 pkcs11_engine_path_copy = os_strdup(pkcs11_engine_path);
2339 if (pkcs11_engine_path_copy == NULL)
2342 if (pkcs11_module_path != NULL) {
2343 pkcs11_module_path_copy = os_strdup(pkcs11_module_path);
2344 if (pkcs11_module_path_copy == NULL) {
2345 os_free(pkcs11_engine_path_copy);
2350 os_free(wpa_s->conf->pkcs11_engine_path);
2351 os_free(wpa_s->conf->pkcs11_module_path);
2352 wpa_s->conf->pkcs11_engine_path = pkcs11_engine_path_copy;
2353 wpa_s->conf->pkcs11_module_path = pkcs11_module_path_copy;
2355 wpa_sm_set_eapol(wpa_s->wpa, NULL);
2356 eapol_sm_deinit(wpa_s->eapol);
2357 wpa_s->eapol = NULL;
2358 if (wpa_supplicant_init_eapol(wpa_s)) {
2359 /* Error -> Reset paths to the default value (NULL) once. */
2360 if (pkcs11_engine_path != NULL && pkcs11_module_path != NULL)
2361 wpas_set_pkcs11_engine_and_module_path(wpa_s, NULL,
2366 wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
2373 * wpa_supplicant_set_ap_scan - Set AP scan mode for interface
2374 * @wpa_s: wpa_supplicant structure for a network interface
2375 * @ap_scan: AP scan mode
2376 * Returns: 0 if succeed or -1 if ap_scan has an invalid value
2379 int wpa_supplicant_set_ap_scan(struct wpa_supplicant *wpa_s, int ap_scan)
2384 if (ap_scan < 0 || ap_scan > 2)
2388 if (ap_scan == 2 && ap_scan != wpa_s->conf->ap_scan &&
2389 wpa_s->wpa_state >= WPA_ASSOCIATING &&
2390 wpa_s->wpa_state < WPA_COMPLETED) {
2391 wpa_printf(MSG_ERROR, "ap_scan = %d (%d) rejected while "
2392 "associating", wpa_s->conf->ap_scan, ap_scan);
2395 #endif /* ANDROID */
2397 old_ap_scan = wpa_s->conf->ap_scan;
2398 wpa_s->conf->ap_scan = ap_scan;
2400 if (old_ap_scan != wpa_s->conf->ap_scan)
2401 wpas_notify_ap_scan_changed(wpa_s);
2408 * wpa_supplicant_set_bss_expiration_age - Set BSS entry expiration age
2409 * @wpa_s: wpa_supplicant structure for a network interface
2410 * @expire_age: Expiration age in seconds
2411 * Returns: 0 if succeed or -1 if expire_age has an invalid value
2414 int wpa_supplicant_set_bss_expiration_age(struct wpa_supplicant *wpa_s,
2415 unsigned int bss_expire_age)
2417 if (bss_expire_age < 10) {
2418 wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration age %u",
2422 wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration age: %d sec",
2424 wpa_s->conf->bss_expiration_age = bss_expire_age;
2431 * wpa_supplicant_set_bss_expiration_count - Set BSS entry expiration scan count
2432 * @wpa_s: wpa_supplicant structure for a network interface
2433 * @expire_count: number of scans after which an unseen BSS is reclaimed
2434 * Returns: 0 if succeed or -1 if expire_count has an invalid value
2437 int wpa_supplicant_set_bss_expiration_count(struct wpa_supplicant *wpa_s,
2438 unsigned int bss_expire_count)
2440 if (bss_expire_count < 1) {
2441 wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration count %u",
2445 wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration scan count: %u",
2447 wpa_s->conf->bss_expiration_scan_count = bss_expire_count;
2454 * wpa_supplicant_set_scan_interval - Set scan interval
2455 * @wpa_s: wpa_supplicant structure for a network interface
2456 * @scan_interval: scan interval in seconds
2457 * Returns: 0 if succeed or -1 if scan_interval has an invalid value
2460 int wpa_supplicant_set_scan_interval(struct wpa_supplicant *wpa_s,
2463 if (scan_interval < 0) {
2464 wpa_msg(wpa_s, MSG_ERROR, "Invalid scan interval %d",
2468 wpa_msg(wpa_s, MSG_DEBUG, "Setting scan interval: %d sec",
2470 wpa_supplicant_update_scan_int(wpa_s, scan_interval);
2477 * wpa_supplicant_set_debug_params - Set global debug params
2478 * @global: wpa_global structure
2479 * @debug_level: debug level
2480 * @debug_timestamp: determines if show timestamp in debug data
2481 * @debug_show_keys: determines if show keys in debug data
2482 * Returns: 0 if succeed or -1 if debug_level has wrong value
2484 int wpa_supplicant_set_debug_params(struct wpa_global *global, int debug_level,
2485 int debug_timestamp, int debug_show_keys)
2488 int old_level, old_timestamp, old_show_keys;
2490 /* check for allowed debuglevels */
2491 if (debug_level != MSG_EXCESSIVE &&
2492 debug_level != MSG_MSGDUMP &&
2493 debug_level != MSG_DEBUG &&
2494 debug_level != MSG_INFO &&
2495 debug_level != MSG_WARNING &&
2496 debug_level != MSG_ERROR)
2499 old_level = wpa_debug_level;
2500 old_timestamp = wpa_debug_timestamp;
2501 old_show_keys = wpa_debug_show_keys;
2503 wpa_debug_level = debug_level;
2504 wpa_debug_timestamp = debug_timestamp ? 1 : 0;
2505 wpa_debug_show_keys = debug_show_keys ? 1 : 0;
2507 if (wpa_debug_level != old_level)
2508 wpas_notify_debug_level_changed(global);
2509 if (wpa_debug_timestamp != old_timestamp)
2510 wpas_notify_debug_timestamp_changed(global);
2511 if (wpa_debug_show_keys != old_show_keys)
2512 wpas_notify_debug_show_keys_changed(global);
2519 * wpa_supplicant_get_ssid - Get a pointer to the current network structure
2520 * @wpa_s: Pointer to wpa_supplicant data
2521 * Returns: A pointer to the current network structure or %NULL on failure
2523 struct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s)
2525 struct wpa_ssid *entry;
2526 u8 ssid[MAX_SSID_LEN];
2532 res = wpa_drv_get_ssid(wpa_s, ssid);
2534 wpa_msg(wpa_s, MSG_WARNING, "Could not read SSID from "
2540 if (wpa_drv_get_bssid(wpa_s, bssid) < 0) {
2541 wpa_msg(wpa_s, MSG_WARNING, "Could not read BSSID from "
2546 wired = wpa_s->conf->ap_scan == 0 &&
2547 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED);
2549 entry = wpa_s->conf->ssid;
2551 if (!wpas_network_disabled(wpa_s, entry) &&
2552 ((ssid_len == entry->ssid_len &&
2553 os_memcmp(ssid, entry->ssid, ssid_len) == 0) || wired) &&
2554 (!entry->bssid_set ||
2555 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
2558 if (!wpas_network_disabled(wpa_s, entry) &&
2559 (entry->key_mgmt & WPA_KEY_MGMT_WPS) &&
2560 (entry->ssid == NULL || entry->ssid_len == 0) &&
2561 (!entry->bssid_set ||
2562 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
2564 #endif /* CONFIG_WPS */
2566 if (!wpas_network_disabled(wpa_s, entry) && entry->bssid_set &&
2567 entry->ssid_len == 0 &&
2568 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0)
2571 entry = entry->next;
2578 static int select_driver(struct wpa_supplicant *wpa_s, int i)
2580 struct wpa_global *global = wpa_s->global;
2582 if (wpa_drivers[i]->global_init && global->drv_priv[i] == NULL) {
2583 global->drv_priv[i] = wpa_drivers[i]->global_init();
2584 if (global->drv_priv[i] == NULL) {
2585 wpa_printf(MSG_ERROR, "Failed to initialize driver "
2586 "'%s'", wpa_drivers[i]->name);
2591 wpa_s->driver = wpa_drivers[i];
2592 wpa_s->global_drv_priv = global->drv_priv[i];
2598 static int wpa_supplicant_set_driver(struct wpa_supplicant *wpa_s,
2603 const char *pos, *driver = name;
2608 if (wpa_drivers[0] == NULL) {
2609 wpa_msg(wpa_s, MSG_ERROR, "No driver interfaces build into "
2615 /* default to first driver in the list */
2616 return select_driver(wpa_s, 0);
2620 pos = os_strchr(driver, ',');
2624 len = os_strlen(driver);
2626 for (i = 0; wpa_drivers[i]; i++) {
2627 if (os_strlen(wpa_drivers[i]->name) == len &&
2628 os_strncmp(driver, wpa_drivers[i]->name, len) ==
2630 /* First driver that succeeds wins */
2631 if (select_driver(wpa_s, i) == 0)
2639 wpa_msg(wpa_s, MSG_ERROR, "Unsupported driver '%s'", name);
2645 * wpa_supplicant_rx_eapol - Deliver a received EAPOL frame to wpa_supplicant
2646 * @ctx: Context pointer (wpa_s); this is the ctx variable registered
2647 * with struct wpa_driver_ops::init()
2648 * @src_addr: Source address of the EAPOL frame
2649 * @buf: EAPOL data starting from the EAPOL header (i.e., no Ethernet header)
2650 * @len: Length of the EAPOL data
2652 * This function is called for each received EAPOL frame. Most driver
2653 * interfaces rely on more generic OS mechanism for receiving frames through
2654 * l2_packet, but if such a mechanism is not available, the driver wrapper may
2655 * take care of received EAPOL frames and deliver them to the core supplicant
2656 * code by calling this function.
2658 void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr,
2659 const u8 *buf, size_t len)
2661 struct wpa_supplicant *wpa_s = ctx;
2663 wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR, MAC2STR(src_addr));
2664 wpa_hexdump(MSG_MSGDUMP, "RX EAPOL", buf, len);
2666 #ifdef CONFIG_PEERKEY
2667 if (wpa_s->wpa_state > WPA_ASSOCIATED && wpa_s->current_ssid &&
2668 wpa_s->current_ssid->peerkey &&
2669 !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) &&
2670 wpa_sm_rx_eapol_peerkey(wpa_s->wpa, src_addr, buf, len) == 1) {
2671 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: Processed PeerKey EAPOL-Key");
2674 #endif /* CONFIG_PEERKEY */
2676 if (wpa_s->wpa_state < WPA_ASSOCIATED ||
2677 (wpa_s->last_eapol_matches_bssid &&
2680 #endif /* CONFIG_AP */
2681 os_memcmp(src_addr, wpa_s->bssid, ETH_ALEN) != 0)) {
2683 * There is possible race condition between receiving the
2684 * association event and the EAPOL frame since they are coming
2685 * through different paths from the driver. In order to avoid
2686 * issues in trying to process the EAPOL frame before receiving
2687 * association information, lets queue it for processing until
2688 * the association event is received. This may also be needed in
2689 * driver-based roaming case, so also use src_addr != BSSID as a
2690 * trigger if we have previously confirmed that the
2691 * Authenticator uses BSSID as the src_addr (which is not the
2692 * case with wired IEEE 802.1X).
2694 wpa_dbg(wpa_s, MSG_DEBUG, "Not associated - Delay processing "
2695 "of received EAPOL frame (state=%s bssid=" MACSTR ")",
2696 wpa_supplicant_state_txt(wpa_s->wpa_state),
2697 MAC2STR(wpa_s->bssid));
2698 wpabuf_free(wpa_s->pending_eapol_rx);
2699 wpa_s->pending_eapol_rx = wpabuf_alloc_copy(buf, len);
2700 if (wpa_s->pending_eapol_rx) {
2701 os_get_reltime(&wpa_s->pending_eapol_rx_time);
2702 os_memcpy(wpa_s->pending_eapol_rx_src, src_addr,
2708 wpa_s->last_eapol_matches_bssid =
2709 os_memcmp(src_addr, wpa_s->bssid, ETH_ALEN) == 0;
2712 if (wpa_s->ap_iface) {
2713 wpa_supplicant_ap_rx_eapol(wpa_s, src_addr, buf, len);
2716 #endif /* CONFIG_AP */
2718 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE) {
2719 wpa_dbg(wpa_s, MSG_DEBUG, "Ignored received EAPOL frame since "
2720 "no key management is configured");
2724 if (wpa_s->eapol_received == 0 &&
2725 (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) ||
2726 !wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) ||
2727 wpa_s->wpa_state != WPA_COMPLETED) &&
2728 (wpa_s->current_ssid == NULL ||
2729 wpa_s->current_ssid->mode != IEEE80211_MODE_IBSS)) {
2730 /* Timeout for completing IEEE 802.1X and WPA authentication */
2731 wpa_supplicant_req_auth_timeout(
2733 (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) ||
2734 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA ||
2735 wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) ?
2738 wpa_s->eapol_received++;
2740 if (wpa_s->countermeasures) {
2741 wpa_msg(wpa_s, MSG_INFO, "WPA: Countermeasures - dropped "
2746 #ifdef CONFIG_IBSS_RSN
2747 if (wpa_s->current_ssid &&
2748 wpa_s->current_ssid->mode == WPAS_MODE_IBSS) {
2749 ibss_rsn_rx_eapol(wpa_s->ibss_rsn, src_addr, buf, len);
2752 #endif /* CONFIG_IBSS_RSN */
2754 /* Source address of the incoming EAPOL frame could be compared to the
2755 * current BSSID. However, it is possible that a centralized
2756 * Authenticator could be using another MAC address than the BSSID of
2757 * an AP, so just allow any address to be used for now. The replies are
2758 * still sent to the current BSSID (if available), though. */
2760 os_memcpy(wpa_s->last_eapol_src, src_addr, ETH_ALEN);
2761 if (!wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) &&
2762 eapol_sm_rx_eapol(wpa_s->eapol, src_addr, buf, len) > 0)
2764 wpa_drv_poll(wpa_s);
2765 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE))
2766 wpa_sm_rx_eapol(wpa_s->wpa, src_addr, buf, len);
2767 else if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt)) {
2769 * Set portValid = TRUE here since we are going to skip 4-way
2770 * handshake processing which would normally set portValid. We
2771 * need this to allow the EAPOL state machines to be completed
2772 * without going through EAPOL-Key handshake.
2774 eapol_sm_notify_portValid(wpa_s->eapol, TRUE);
2779 int wpa_supplicant_update_mac_addr(struct wpa_supplicant *wpa_s)
2781 if (wpa_s->driver->send_eapol) {
2782 const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
2784 os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
2785 } else if ((!wpa_s->p2p_mgmt ||
2786 !(wpa_s->drv_flags &
2787 WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)) &&
2788 !(wpa_s->drv_flags &
2789 WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE)) {
2790 l2_packet_deinit(wpa_s->l2);
2791 wpa_s->l2 = l2_packet_init(wpa_s->ifname,
2792 wpa_drv_get_mac_addr(wpa_s),
2794 wpa_supplicant_rx_eapol, wpa_s, 0);
2795 if (wpa_s->l2 == NULL)
2798 const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
2800 os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
2803 if (wpa_s->l2 && l2_packet_get_own_addr(wpa_s->l2, wpa_s->own_addr)) {
2804 wpa_msg(wpa_s, MSG_ERROR, "Failed to get own L2 address");
2808 wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
2814 static void wpa_supplicant_rx_eapol_bridge(void *ctx, const u8 *src_addr,
2815 const u8 *buf, size_t len)
2817 struct wpa_supplicant *wpa_s = ctx;
2818 const struct l2_ethhdr *eth;
2820 if (len < sizeof(*eth))
2822 eth = (const struct l2_ethhdr *) buf;
2824 if (os_memcmp(eth->h_dest, wpa_s->own_addr, ETH_ALEN) != 0 &&
2825 !(eth->h_dest[0] & 0x01)) {
2826 wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR " to " MACSTR
2827 " (bridge - not for this interface - ignore)",
2828 MAC2STR(src_addr), MAC2STR(eth->h_dest));
2832 wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR " to " MACSTR
2833 " (bridge)", MAC2STR(src_addr), MAC2STR(eth->h_dest));
2834 wpa_supplicant_rx_eapol(wpa_s, src_addr, buf + sizeof(*eth),
2835 len - sizeof(*eth));
2840 * wpa_supplicant_driver_init - Initialize driver interface parameters
2841 * @wpa_s: Pointer to wpa_supplicant data
2842 * Returns: 0 on success, -1 on failure
2844 * This function is called to initialize driver interface parameters.
2845 * wpa_drv_init() must have been called before this function to initialize the
2848 int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s)
2850 static int interface_count = 0;
2852 if (wpa_supplicant_update_mac_addr(wpa_s) < 0)
2855 wpa_dbg(wpa_s, MSG_DEBUG, "Own MAC address: " MACSTR,
2856 MAC2STR(wpa_s->own_addr));
2857 os_memcpy(wpa_s->perm_addr, wpa_s->own_addr, ETH_ALEN);
2858 wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
2860 if (wpa_s->bridge_ifname[0]) {
2861 wpa_dbg(wpa_s, MSG_DEBUG, "Receiving packets from bridge "
2862 "interface '%s'", wpa_s->bridge_ifname);
2863 wpa_s->l2_br = l2_packet_init(wpa_s->bridge_ifname,
2866 wpa_supplicant_rx_eapol_bridge,
2868 if (wpa_s->l2_br == NULL) {
2869 wpa_msg(wpa_s, MSG_ERROR, "Failed to open l2_packet "
2870 "connection for the bridge interface '%s'",
2871 wpa_s->bridge_ifname);
2876 wpa_clear_keys(wpa_s, NULL);
2878 /* Make sure that TKIP countermeasures are not left enabled (could
2879 * happen if wpa_supplicant is killed during countermeasures. */
2880 wpa_drv_set_countermeasures(wpa_s, 0);
2882 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: flushing PMKID list in the driver");
2883 wpa_drv_flush_pmkid(wpa_s);
2885 wpa_s->prev_scan_ssid = WILDCARD_SSID_SCAN;
2886 wpa_s->prev_scan_wildcard = 0;
2888 if (wpa_supplicant_enabled_networks(wpa_s)) {
2889 if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
2890 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
2891 interface_count = 0;
2893 if (!wpa_s->p2p_mgmt &&
2894 wpa_supplicant_delayed_sched_scan(wpa_s,
2895 interface_count % 3,
2897 wpa_supplicant_req_scan(wpa_s, interface_count % 3,
2901 wpa_supplicant_set_state(wpa_s, WPA_INACTIVE);
2907 static int wpa_supplicant_daemon(const char *pid_file)
2909 wpa_printf(MSG_DEBUG, "Daemonize..");
2910 return os_daemonize(pid_file);
2914 static struct wpa_supplicant * wpa_supplicant_alloc(void)
2916 struct wpa_supplicant *wpa_s;
2918 wpa_s = os_zalloc(sizeof(*wpa_s));
2921 wpa_s->scan_req = INITIAL_SCAN_REQ;
2922 wpa_s->scan_interval = 5;
2923 wpa_s->new_connection = 1;
2924 wpa_s->parent = wpa_s;
2925 wpa_s->sched_scanning = 0;
2931 #ifdef CONFIG_HT_OVERRIDES
2933 static int wpa_set_htcap_mcs(struct wpa_supplicant *wpa_s,
2934 struct ieee80211_ht_capabilities *htcaps,
2935 struct ieee80211_ht_capabilities *htcaps_mask,
2938 /* parse ht_mcs into hex array */
2940 const char *tmp = ht_mcs;
2943 /* If ht_mcs is null, do not set anything */
2947 /* This is what we are setting in the kernel */
2948 os_memset(&htcaps->supported_mcs_set, 0, IEEE80211_HT_MCS_MASK_LEN);
2950 wpa_msg(wpa_s, MSG_DEBUG, "set_htcap, ht_mcs -:%s:-", ht_mcs);
2952 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
2954 long v = strtol(tmp, &end, 16);
2956 wpa_msg(wpa_s, MSG_DEBUG,
2957 "htcap value[%i]: %ld end: %p tmp: %p",
2962 htcaps->supported_mcs_set[i] = v;
2965 wpa_msg(wpa_s, MSG_ERROR,
2966 "Failed to parse ht-mcs: %s, error: %s\n",
2967 ht_mcs, strerror(errno));
2973 * If we were able to parse any values, then set mask for the MCS set.
2976 os_memset(&htcaps_mask->supported_mcs_set, 0xff,
2977 IEEE80211_HT_MCS_MASK_LEN - 1);
2978 /* skip the 3 reserved bits */
2979 htcaps_mask->supported_mcs_set[IEEE80211_HT_MCS_MASK_LEN - 1] =
2987 static int wpa_disable_max_amsdu(struct wpa_supplicant *wpa_s,
2988 struct ieee80211_ht_capabilities *htcaps,
2989 struct ieee80211_ht_capabilities *htcaps_mask,
2994 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_max_amsdu: %d", disabled);
2999 msk = host_to_le16(HT_CAP_INFO_MAX_AMSDU_SIZE);
3000 htcaps_mask->ht_capabilities_info |= msk;
3002 htcaps->ht_capabilities_info &= msk;
3004 htcaps->ht_capabilities_info |= msk;
3010 static int wpa_set_ampdu_factor(struct wpa_supplicant *wpa_s,
3011 struct ieee80211_ht_capabilities *htcaps,
3012 struct ieee80211_ht_capabilities *htcaps_mask,
3015 wpa_msg(wpa_s, MSG_DEBUG, "set_ampdu_factor: %d", factor);
3020 if (factor < 0 || factor > 3) {
3021 wpa_msg(wpa_s, MSG_ERROR, "ampdu_factor: %d out of range. "
3022 "Must be 0-3 or -1", factor);
3026 htcaps_mask->a_mpdu_params |= 0x3; /* 2 bits for factor */
3027 htcaps->a_mpdu_params &= ~0x3;
3028 htcaps->a_mpdu_params |= factor & 0x3;
3034 static int wpa_set_ampdu_density(struct wpa_supplicant *wpa_s,
3035 struct ieee80211_ht_capabilities *htcaps,
3036 struct ieee80211_ht_capabilities *htcaps_mask,
3039 wpa_msg(wpa_s, MSG_DEBUG, "set_ampdu_density: %d", density);
3044 if (density < 0 || density > 7) {
3045 wpa_msg(wpa_s, MSG_ERROR,
3046 "ampdu_density: %d out of range. Must be 0-7 or -1.",
3051 htcaps_mask->a_mpdu_params |= 0x1C;
3052 htcaps->a_mpdu_params &= ~(0x1C);
3053 htcaps->a_mpdu_params |= (density << 2) & 0x1C;
3059 static int wpa_set_disable_ht40(struct wpa_supplicant *wpa_s,
3060 struct ieee80211_ht_capabilities *htcaps,
3061 struct ieee80211_ht_capabilities *htcaps_mask,
3064 /* Masking these out disables HT40 */
3065 le16 msk = host_to_le16(HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET |
3066 HT_CAP_INFO_SHORT_GI40MHZ);
3068 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_ht40: %d", disabled);
3071 htcaps->ht_capabilities_info &= ~msk;
3073 htcaps->ht_capabilities_info |= msk;
3075 htcaps_mask->ht_capabilities_info |= msk;
3081 static int wpa_set_disable_sgi(struct wpa_supplicant *wpa_s,
3082 struct ieee80211_ht_capabilities *htcaps,
3083 struct ieee80211_ht_capabilities *htcaps_mask,
3086 /* Masking these out disables SGI */
3087 le16 msk = host_to_le16(HT_CAP_INFO_SHORT_GI20MHZ |
3088 HT_CAP_INFO_SHORT_GI40MHZ);
3090 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_sgi: %d", disabled);
3093 htcaps->ht_capabilities_info &= ~msk;
3095 htcaps->ht_capabilities_info |= msk;
3097 htcaps_mask->ht_capabilities_info |= msk;
3103 static int wpa_set_disable_ldpc(struct wpa_supplicant *wpa_s,
3104 struct ieee80211_ht_capabilities *htcaps,
3105 struct ieee80211_ht_capabilities *htcaps_mask,
3108 /* Masking these out disables LDPC */
3109 le16 msk = host_to_le16(HT_CAP_INFO_LDPC_CODING_CAP);
3111 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_ldpc: %d", disabled);
3114 htcaps->ht_capabilities_info &= ~msk;
3116 htcaps->ht_capabilities_info |= msk;
3118 htcaps_mask->ht_capabilities_info |= msk;
3124 void wpa_supplicant_apply_ht_overrides(
3125 struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
3126 struct wpa_driver_associate_params *params)
3128 struct ieee80211_ht_capabilities *htcaps;
3129 struct ieee80211_ht_capabilities *htcaps_mask;
3134 params->disable_ht = ssid->disable_ht;
3135 if (!params->htcaps || !params->htcaps_mask)
3138 htcaps = (struct ieee80211_ht_capabilities *) params->htcaps;
3139 htcaps_mask = (struct ieee80211_ht_capabilities *) params->htcaps_mask;
3140 wpa_set_htcap_mcs(wpa_s, htcaps, htcaps_mask, ssid->ht_mcs);
3141 wpa_disable_max_amsdu(wpa_s, htcaps, htcaps_mask,
3142 ssid->disable_max_amsdu);
3143 wpa_set_ampdu_factor(wpa_s, htcaps, htcaps_mask, ssid->ampdu_factor);
3144 wpa_set_ampdu_density(wpa_s, htcaps, htcaps_mask, ssid->ampdu_density);
3145 wpa_set_disable_ht40(wpa_s, htcaps, htcaps_mask, ssid->disable_ht40);
3146 wpa_set_disable_sgi(wpa_s, htcaps, htcaps_mask, ssid->disable_sgi);
3147 wpa_set_disable_ldpc(wpa_s, htcaps, htcaps_mask, ssid->disable_ldpc);
3149 if (ssid->ht40_intolerant) {
3150 le16 bit = host_to_le16(HT_CAP_INFO_40MHZ_INTOLERANT);
3151 htcaps->ht_capabilities_info |= bit;
3152 htcaps_mask->ht_capabilities_info |= bit;
3156 #endif /* CONFIG_HT_OVERRIDES */
3159 #ifdef CONFIG_VHT_OVERRIDES
3160 void wpa_supplicant_apply_vht_overrides(
3161 struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
3162 struct wpa_driver_associate_params *params)
3164 struct ieee80211_vht_capabilities *vhtcaps;
3165 struct ieee80211_vht_capabilities *vhtcaps_mask;
3166 #ifdef CONFIG_HT_OVERRIDES
3168 const u32 max_ampdu_mask = VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX;
3169 #endif /* CONFIG_HT_OVERRIDES */
3174 params->disable_vht = ssid->disable_vht;
3176 vhtcaps = (void *) params->vhtcaps;
3177 vhtcaps_mask = (void *) params->vhtcaps_mask;
3179 if (!vhtcaps || !vhtcaps_mask)
3182 vhtcaps->vht_capabilities_info = ssid->vht_capa;
3183 vhtcaps_mask->vht_capabilities_info = ssid->vht_capa_mask;
3185 #ifdef CONFIG_HT_OVERRIDES
3186 /* if max ampdu is <= 3, we have to make the HT cap the same */
3187 if (ssid->vht_capa_mask & max_ampdu_mask) {
3188 max_ampdu = (ssid->vht_capa & max_ampdu_mask) >>
3189 find_first_bit(max_ampdu_mask);
3191 max_ampdu = max_ampdu < 3 ? max_ampdu : 3;
3192 wpa_set_ampdu_factor(wpa_s,
3193 (void *) params->htcaps,
3194 (void *) params->htcaps_mask,
3197 #endif /* CONFIG_HT_OVERRIDES */
3199 #define OVERRIDE_MCS(i) \
3200 if (ssid->vht_tx_mcs_nss_ ##i >= 0) { \
3201 vhtcaps_mask->vht_supported_mcs_set.tx_map |= \
3203 vhtcaps->vht_supported_mcs_set.tx_map |= \
3204 ssid->vht_tx_mcs_nss_ ##i << 2 * (i - 1); \
3206 if (ssid->vht_rx_mcs_nss_ ##i >= 0) { \
3207 vhtcaps_mask->vht_supported_mcs_set.rx_map |= \
3209 vhtcaps->vht_supported_mcs_set.rx_map |= \
3210 ssid->vht_rx_mcs_nss_ ##i << 2 * (i - 1); \
3222 #endif /* CONFIG_VHT_OVERRIDES */
3225 static int pcsc_reader_init(struct wpa_supplicant *wpa_s)
3230 if (!wpa_s->conf->pcsc_reader)
3233 wpa_s->scard = scard_init(wpa_s->conf->pcsc_reader);
3237 if (wpa_s->conf->pcsc_pin &&
3238 scard_set_pin(wpa_s->scard, wpa_s->conf->pcsc_pin) < 0) {
3239 scard_deinit(wpa_s->scard);
3240 wpa_s->scard = NULL;
3241 wpa_msg(wpa_s, MSG_ERROR, "PC/SC PIN validation failed");
3245 len = sizeof(wpa_s->imsi) - 1;
3246 if (scard_get_imsi(wpa_s->scard, wpa_s->imsi, &len)) {
3247 scard_deinit(wpa_s->scard);
3248 wpa_s->scard = NULL;
3249 wpa_msg(wpa_s, MSG_ERROR, "Could not read IMSI");
3252 wpa_s->imsi[len] = '\0';
3254 wpa_s->mnc_len = scard_get_mnc_len(wpa_s->scard);
3256 wpa_printf(MSG_DEBUG, "SCARD: IMSI %s (MNC length %d)",
3257 wpa_s->imsi, wpa_s->mnc_len);
3259 wpa_sm_set_scard_ctx(wpa_s->wpa, wpa_s->scard);
3260 eapol_sm_register_scard_ctx(wpa_s->eapol, wpa_s->scard);
3261 #endif /* PCSC_FUNCS */
3267 int wpas_init_ext_pw(struct wpa_supplicant *wpa_s)
3271 ext_password_deinit(wpa_s->ext_pw);
3272 wpa_s->ext_pw = NULL;
3273 eapol_sm_set_ext_pw_ctx(wpa_s->eapol, NULL);
3275 if (!wpa_s->conf->ext_password_backend)
3278 val = os_strdup(wpa_s->conf->ext_password_backend);
3281 pos = os_strchr(val, ':');
3285 wpa_printf(MSG_DEBUG, "EXT PW: Initialize backend '%s'", val);
3287 wpa_s->ext_pw = ext_password_init(val, pos);
3289 if (wpa_s->ext_pw == NULL) {
3290 wpa_printf(MSG_DEBUG, "EXT PW: Failed to initialize backend");
3293 eapol_sm_set_ext_pw_ctx(wpa_s->eapol, wpa_s->ext_pw);
3299 static int wpas_check_wowlan_trigger(const char *start, const char *trigger,
3300 int capa_trigger, u8 *param_trigger)
3302 if (os_strcmp(start, trigger) != 0)
3312 static int wpas_set_wowlan_triggers(struct wpa_supplicant *wpa_s,
3313 const struct wpa_driver_capa *capa)
3315 struct wowlan_triggers triggers;
3316 char *start, *end, *buf;
3319 if (!wpa_s->conf->wowlan_triggers)
3322 buf = os_strdup(wpa_s->conf->wowlan_triggers);
3326 os_memset(&triggers, 0, sizeof(triggers));
3328 #define CHECK_TRIGGER(trigger) \
3329 wpas_check_wowlan_trigger(start, #trigger, \
3330 capa->wowlan_triggers.trigger, \
3334 while (*start != '\0') {
3335 while (isblank(*start))
3340 while (!isblank(*end) && *end != '\0')
3342 last = *end == '\0';
3345 if (!CHECK_TRIGGER(any) &&
3346 !CHECK_TRIGGER(disconnect) &&
3347 !CHECK_TRIGGER(magic_pkt) &&
3348 !CHECK_TRIGGER(gtk_rekey_failure) &&
3349 !CHECK_TRIGGER(eap_identity_req) &&
3350 !CHECK_TRIGGER(four_way_handshake) &&
3351 !CHECK_TRIGGER(rfkill_release)) {
3352 wpa_printf(MSG_DEBUG,
3353 "Unknown/unsupported wowlan trigger '%s'",
3363 #undef CHECK_TRIGGER
3365 ret = wpa_drv_wowlan(wpa_s, &triggers);
3372 static struct wpa_radio * radio_add_interface(struct wpa_supplicant *wpa_s,
3375 struct wpa_supplicant *iface = wpa_s->global->ifaces;
3376 struct wpa_radio *radio;
3378 while (rn && iface) {
3379 radio = iface->radio;
3380 if (radio && os_strcmp(rn, radio->name) == 0) {
3381 wpa_printf(MSG_DEBUG, "Add interface %s to existing radio %s",
3383 dl_list_add(&radio->ifaces, &wpa_s->radio_list);
3387 iface = iface->next;
3390 wpa_printf(MSG_DEBUG, "Add interface %s to a new radio %s",
3391 wpa_s->ifname, rn ? rn : "N/A");
3392 radio = os_zalloc(sizeof(*radio));
3397 os_strlcpy(radio->name, rn, sizeof(radio->name));
3398 dl_list_init(&radio->ifaces);
3399 dl_list_init(&radio->work);
3400 dl_list_add(&radio->ifaces, &wpa_s->radio_list);
3406 static void radio_work_free(struct wpa_radio_work *work)
3408 if (work->wpa_s->scan_work == work) {
3409 /* This should not really happen. */
3410 wpa_dbg(work->wpa_s, MSG_INFO, "Freeing radio work '%s'@%p (started=%d) that is marked as scan_work",
3411 work->type, work, work->started);
3412 work->wpa_s->scan_work = NULL;
3416 if (work->wpa_s->p2p_scan_work == work) {
3417 /* This should not really happen. */
3418 wpa_dbg(work->wpa_s, MSG_INFO, "Freeing radio work '%s'@%p (started=%d) that is marked as p2p_scan_work",
3419 work->type, work, work->started);
3420 work->wpa_s->p2p_scan_work = NULL;
3422 #endif /* CONFIG_P2P */
3424 dl_list_del(&work->list);
3429 static void radio_start_next_work(void *eloop_ctx, void *timeout_ctx)
3431 struct wpa_radio *radio = eloop_ctx;
3432 struct wpa_radio_work *work;
3433 struct os_reltime now, diff;
3434 struct wpa_supplicant *wpa_s;
3436 work = dl_list_first(&radio->work, struct wpa_radio_work, list);
3441 return; /* already started and still in progress */
3443 wpa_s = dl_list_first(&radio->ifaces, struct wpa_supplicant,
3445 if (wpa_s && wpa_s->external_scan_running) {
3446 wpa_printf(MSG_DEBUG, "Delay radio work start until externally triggered scan completes");
3450 os_get_reltime(&now);
3451 os_reltime_sub(&now, &work->time, &diff);
3452 wpa_dbg(work->wpa_s, MSG_DEBUG, "Starting radio work '%s'@%p after %ld.%06ld second wait",
3453 work->type, work, diff.sec, diff.usec);
3461 * This function removes both started and pending radio works running on
3462 * the provided interface's radio.
3463 * Prior to the removal of the radio work, its callback (cb) is called with
3464 * deinit set to be 1. Each work's callback is responsible for clearing its
3465 * internal data and restoring to a correct state.
3466 * @wpa_s: wpa_supplicant data
3467 * @type: type of works to be removed
3468 * @remove_all: 1 to remove all the works on this radio, 0 to remove only
3469 * this interface's works.
3471 void radio_remove_works(struct wpa_supplicant *wpa_s,
3472 const char *type, int remove_all)
3474 struct wpa_radio_work *work, *tmp;
3475 struct wpa_radio *radio = wpa_s->radio;
3477 dl_list_for_each_safe(work, tmp, &radio->work, struct wpa_radio_work,
3479 if (type && os_strcmp(type, work->type) != 0)
3482 /* skip other ifaces' works */
3483 if (!remove_all && work->wpa_s != wpa_s)
3486 wpa_dbg(wpa_s, MSG_DEBUG, "Remove radio work '%s'@%p%s",
3487 work->type, work, work->started ? " (started)" : "");
3489 radio_work_free(work);
3492 /* in case we removed the started work */
3493 radio_work_check_next(wpa_s);
3497 static void radio_remove_interface(struct wpa_supplicant *wpa_s)
3499 struct wpa_radio *radio = wpa_s->radio;
3504 wpa_printf(MSG_DEBUG, "Remove interface %s from radio %s",
3505 wpa_s->ifname, radio->name);
3506 dl_list_del(&wpa_s->radio_list);
3507 radio_remove_works(wpa_s, NULL, 0);
3508 wpa_s->radio = NULL;
3509 if (!dl_list_empty(&radio->ifaces))
3510 return; /* Interfaces remain for this radio */
3512 wpa_printf(MSG_DEBUG, "Remove radio %s", radio->name);
3513 eloop_cancel_timeout(radio_start_next_work, radio, NULL);
3518 void radio_work_check_next(struct wpa_supplicant *wpa_s)
3520 struct wpa_radio *radio = wpa_s->radio;
3522 if (dl_list_empty(&radio->work))
3524 eloop_cancel_timeout(radio_start_next_work, radio, NULL);
3525 eloop_register_timeout(0, 0, radio_start_next_work, radio, NULL);
3530 * radio_add_work - Add a radio work item
3531 * @wpa_s: Pointer to wpa_supplicant data
3532 * @freq: Frequency of the offchannel operation in MHz or 0
3533 * @type: Unique identifier for each type of work
3534 * @next: Force as the next work to be executed
3535 * @cb: Callback function for indicating when radio is available
3536 * @ctx: Context pointer for the work (work->ctx in cb())
3537 * Returns: 0 on success, -1 on failure
3539 * This function is used to request time for an operation that requires
3540 * exclusive radio control. Once the radio is available, the registered callback
3541 * function will be called. radio_work_done() must be called once the exclusive
3542 * radio operation has been completed, so that the radio is freed for other
3543 * operations. The special case of deinit=1 is used to free the context data
3544 * during interface removal. That does not allow the callback function to start
3545 * the radio operation, i.e., it must free any resources allocated for the radio
3548 * The @freq parameter can be used to indicate a single channel on which the
3549 * offchannel operation will occur. This may allow multiple radio work
3550 * operations to be performed in parallel if they apply for the same channel.
3551 * Setting this to 0 indicates that the work item may use multiple channels or
3552 * requires exclusive control of the radio.
3554 int radio_add_work(struct wpa_supplicant *wpa_s, unsigned int freq,
3555 const char *type, int next,
3556 void (*cb)(struct wpa_radio_work *work, int deinit),
3559 struct wpa_radio_work *work;
3562 work = os_zalloc(sizeof(*work));
3565 wpa_dbg(wpa_s, MSG_DEBUG, "Add radio work '%s'@%p", type, work);
3566 os_get_reltime(&work->time);
3569 work->wpa_s = wpa_s;
3573 was_empty = dl_list_empty(&wpa_s->radio->work);
3575 dl_list_add(&wpa_s->radio->work, &work->list);
3577 dl_list_add_tail(&wpa_s->radio->work, &work->list);
3579 wpa_dbg(wpa_s, MSG_DEBUG, "First radio work item in the queue - schedule start immediately");
3580 radio_work_check_next(wpa_s);
3588 * radio_work_done - Indicate that a radio work item has been completed
3589 * @work: Completed work
3591 * This function is called once the callback function registered with
3592 * radio_add_work() has completed its work.
3594 void radio_work_done(struct wpa_radio_work *work)
3596 struct wpa_supplicant *wpa_s = work->wpa_s;
3597 struct os_reltime now, diff;
3598 unsigned int started = work->started;
3600 os_get_reltime(&now);
3601 os_reltime_sub(&now, &work->time, &diff);
3602 wpa_dbg(wpa_s, MSG_DEBUG, "Radio work '%s'@%p %s in %ld.%06ld seconds",
3603 work->type, work, started ? "done" : "canceled",
3604 diff.sec, diff.usec);
3605 radio_work_free(work);
3607 radio_work_check_next(wpa_s);
3611 int radio_work_pending(struct wpa_supplicant *wpa_s, const char *type)
3613 struct wpa_radio_work *work;
3614 struct wpa_radio *radio = wpa_s->radio;
3616 dl_list_for_each(work, &radio->work, struct wpa_radio_work, list) {
3617 if (work->wpa_s == wpa_s && os_strcmp(work->type, type) == 0)
3625 static int wpas_init_driver(struct wpa_supplicant *wpa_s,
3626 struct wpa_interface *iface)
3628 const char *ifname, *driver, *rn;
3630 driver = iface->driver;
3632 if (wpa_supplicant_set_driver(wpa_s, driver) < 0)
3635 wpa_s->drv_priv = wpa_drv_init(wpa_s, wpa_s->ifname);
3636 if (wpa_s->drv_priv == NULL) {
3638 pos = driver ? os_strchr(driver, ',') : NULL;
3640 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize "
3641 "driver interface - try next driver wrapper");
3645 wpa_msg(wpa_s, MSG_ERROR, "Failed to initialize driver "
3649 if (wpa_drv_set_param(wpa_s, wpa_s->conf->driver_param) < 0) {
3650 wpa_msg(wpa_s, MSG_ERROR, "Driver interface rejected "
3651 "driver_param '%s'", wpa_s->conf->driver_param);
3655 ifname = wpa_drv_get_ifname(wpa_s);
3656 if (ifname && os_strcmp(ifname, wpa_s->ifname) != 0) {
3657 wpa_dbg(wpa_s, MSG_DEBUG, "Driver interface replaced "
3658 "interface name with '%s'", ifname);
3659 os_strlcpy(wpa_s->ifname, ifname, sizeof(wpa_s->ifname));
3662 rn = wpa_driver_get_radio_name(wpa_s);
3663 if (rn && rn[0] == '\0')
3666 wpa_s->radio = radio_add_interface(wpa_s, rn);
3667 if (wpa_s->radio == NULL)
3674 static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
3675 struct wpa_interface *iface)
3677 struct wpa_driver_capa capa;
3680 wpa_printf(MSG_DEBUG, "Initializing interface '%s' conf '%s' driver "
3681 "'%s' ctrl_interface '%s' bridge '%s'", iface->ifname,
3682 iface->confname ? iface->confname : "N/A",
3683 iface->driver ? iface->driver : "default",
3684 iface->ctrl_interface ? iface->ctrl_interface : "N/A",
3685 iface->bridge_ifname ? iface->bridge_ifname : "N/A");
3687 if (iface->confname) {
3688 #ifdef CONFIG_BACKEND_FILE
3689 wpa_s->confname = os_rel2abs_path(iface->confname);
3690 if (wpa_s->confname == NULL) {
3691 wpa_printf(MSG_ERROR, "Failed to get absolute path "
3692 "for configuration file '%s'.",
3696 wpa_printf(MSG_DEBUG, "Configuration file '%s' -> '%s'",
3697 iface->confname, wpa_s->confname);
3698 #else /* CONFIG_BACKEND_FILE */
3699 wpa_s->confname = os_strdup(iface->confname);
3700 #endif /* CONFIG_BACKEND_FILE */
3701 wpa_s->conf = wpa_config_read(wpa_s->confname, NULL);
3702 if (wpa_s->conf == NULL) {
3703 wpa_printf(MSG_ERROR, "Failed to read or parse "
3704 "configuration '%s'.", wpa_s->confname);
3707 wpa_s->confanother = os_rel2abs_path(iface->confanother);
3708 wpa_config_read(wpa_s->confanother, wpa_s->conf);
3711 * Override ctrl_interface and driver_param if set on command
3714 if (iface->ctrl_interface) {
3715 os_free(wpa_s->conf->ctrl_interface);
3716 wpa_s->conf->ctrl_interface =
3717 os_strdup(iface->ctrl_interface);
3720 if (iface->driver_param) {
3721 os_free(wpa_s->conf->driver_param);
3722 wpa_s->conf->driver_param =
3723 os_strdup(iface->driver_param);
3726 if (iface->p2p_mgmt && !iface->ctrl_interface) {
3727 os_free(wpa_s->conf->ctrl_interface);
3728 wpa_s->conf->ctrl_interface = NULL;
3731 wpa_s->conf = wpa_config_alloc_empty(iface->ctrl_interface,
3732 iface->driver_param);
3734 if (wpa_s->conf == NULL) {
3735 wpa_printf(MSG_ERROR, "\nNo configuration found.");
3739 if (iface->ifname == NULL) {
3740 wpa_printf(MSG_ERROR, "\nInterface name is required.");
3743 if (os_strlen(iface->ifname) >= sizeof(wpa_s->ifname)) {
3744 wpa_printf(MSG_ERROR, "\nToo long interface name '%s'.",
3748 os_strlcpy(wpa_s->ifname, iface->ifname, sizeof(wpa_s->ifname));
3750 if (iface->bridge_ifname) {
3751 if (os_strlen(iface->bridge_ifname) >=
3752 sizeof(wpa_s->bridge_ifname)) {
3753 wpa_printf(MSG_ERROR, "\nToo long bridge interface "
3754 "name '%s'.", iface->bridge_ifname);
3757 os_strlcpy(wpa_s->bridge_ifname, iface->bridge_ifname,
3758 sizeof(wpa_s->bridge_ifname));
3761 /* RSNA Supplicant Key Management - INITIALIZE */
3762 eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
3763 eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
3765 /* Initialize driver interface and register driver event handler before
3766 * L2 receive handler so that association events are processed before
3767 * EAPOL-Key packets if both become available for the same select()
3769 if (wpas_init_driver(wpa_s, iface) < 0)
3772 if (wpa_supplicant_init_wpa(wpa_s) < 0)
3775 wpa_sm_set_ifname(wpa_s->wpa, wpa_s->ifname,
3776 wpa_s->bridge_ifname[0] ? wpa_s->bridge_ifname :
3778 wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
3780 if (wpa_s->conf->dot11RSNAConfigPMKLifetime &&
3781 wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_LIFETIME,
3782 wpa_s->conf->dot11RSNAConfigPMKLifetime)) {
3783 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
3784 "dot11RSNAConfigPMKLifetime");
3788 if (wpa_s->conf->dot11RSNAConfigPMKReauthThreshold &&
3789 wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_REAUTH_THRESHOLD,
3790 wpa_s->conf->dot11RSNAConfigPMKReauthThreshold)) {
3791 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
3792 "dot11RSNAConfigPMKReauthThreshold");
3796 if (wpa_s->conf->dot11RSNAConfigSATimeout &&
3797 wpa_sm_set_param(wpa_s->wpa, RSNA_SA_TIMEOUT,
3798 wpa_s->conf->dot11RSNAConfigSATimeout)) {
3799 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
3800 "dot11RSNAConfigSATimeout");
3804 wpa_s->hw.modes = wpa_drv_get_hw_feature_data(wpa_s,
3805 &wpa_s->hw.num_modes,
3808 capa_res = wpa_drv_get_capa(wpa_s, &capa);
3809 if (capa_res == 0) {
3810 wpa_s->drv_capa_known = 1;
3811 wpa_s->drv_flags = capa.flags;
3812 wpa_s->drv_enc = capa.enc;
3813 wpa_s->drv_smps_modes = capa.smps_modes;
3814 wpa_s->probe_resp_offloads = capa.probe_resp_offloads;
3815 wpa_s->max_scan_ssids = capa.max_scan_ssids;
3816 wpa_s->max_sched_scan_ssids = capa.max_sched_scan_ssids;
3817 wpa_s->sched_scan_supported = capa.sched_scan_supported;
3818 wpa_s->max_match_sets = capa.max_match_sets;
3819 wpa_s->max_remain_on_chan = capa.max_remain_on_chan;
3820 wpa_s->max_stations = capa.max_stations;
3821 wpa_s->extended_capa = capa.extended_capa;
3822 wpa_s->extended_capa_mask = capa.extended_capa_mask;
3823 wpa_s->extended_capa_len = capa.extended_capa_len;
3824 wpa_s->num_multichan_concurrent =
3825 capa.num_multichan_concurrent;
3827 if (wpa_s->max_remain_on_chan == 0)
3828 wpa_s->max_remain_on_chan = 1000;
3831 * Only take p2p_mgmt parameters when P2P Device is supported.
3832 * Doing it here as it determines whether l2_packet_init() will be done
3833 * during wpa_supplicant_driver_init().
3835 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)
3836 wpa_s->p2p_mgmt = iface->p2p_mgmt;
3838 iface->p2p_mgmt = 1;
3840 if (wpa_s->num_multichan_concurrent == 0)
3841 wpa_s->num_multichan_concurrent = 1;
3843 if (wpa_supplicant_driver_init(wpa_s) < 0)
3847 if ((!iface->p2p_mgmt ||
3848 !(wpa_s->drv_flags &
3849 WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)) &&
3850 wpa_tdls_init(wpa_s->wpa))
3852 #endif /* CONFIG_TDLS */
3854 if (wpa_s->conf->country[0] && wpa_s->conf->country[1] &&
3855 wpa_drv_set_country(wpa_s, wpa_s->conf->country)) {
3856 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to set country");
3860 if (wpas_wps_init(wpa_s))
3863 if (wpa_supplicant_init_eapol(wpa_s) < 0)
3865 wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
3867 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
3868 if (wpa_s->ctrl_iface == NULL) {
3869 wpa_printf(MSG_ERROR,
3870 "Failed to initialize control interface '%s'.\n"
3871 "You may have another wpa_supplicant process "
3872 "already running or the file was\n"
3873 "left by an unclean termination of wpa_supplicant "
3874 "in which case you will need\n"
3875 "to manually remove this file before starting "
3876 "wpa_supplicant again.\n",
3877 wpa_s->conf->ctrl_interface);
3881 wpa_s->gas = gas_query_init(wpa_s);
3882 if (wpa_s->gas == NULL) {
3883 wpa_printf(MSG_ERROR, "Failed to initialize GAS query");
3887 if (iface->p2p_mgmt && wpas_p2p_init(wpa_s->global, wpa_s) < 0) {
3888 wpa_msg(wpa_s, MSG_ERROR, "Failed to init P2P");
3892 if (wpa_bss_init(wpa_s) < 0)
3896 * Set Wake-on-WLAN triggers, if configured.
3897 * Note: We don't restore/remove the triggers on shutdown (it doesn't
3898 * have effect anyway when the interface is down).
3900 if (capa_res == 0 && wpas_set_wowlan_triggers(wpa_s, &capa) < 0)
3903 #ifdef CONFIG_EAP_PROXY
3906 wpa_s->mnc_len = eapol_sm_get_eap_proxy_imsi(wpa_s->eapol, wpa_s->imsi,
3908 if (wpa_s->mnc_len > 0) {
3909 wpa_s->imsi[len] = '\0';
3910 wpa_printf(MSG_DEBUG, "eap_proxy: IMSI %s (MNC length %d)",
3911 wpa_s->imsi, wpa_s->mnc_len);
3913 wpa_printf(MSG_DEBUG, "eap_proxy: IMSI not available");
3916 #endif /* CONFIG_EAP_PROXY */
3918 if (pcsc_reader_init(wpa_s) < 0)
3921 if (wpas_init_ext_pw(wpa_s) < 0)
3928 static void wpa_supplicant_deinit_iface(struct wpa_supplicant *wpa_s,
3929 int notify, int terminate)
3931 struct wpa_global *global = wpa_s->global;
3932 struct wpa_supplicant *iface, *prev;
3934 if (wpa_s == wpa_s->parent)
3935 wpas_p2p_group_remove(wpa_s, "*");
3937 iface = global->ifaces;
3939 if (iface == wpa_s || iface->parent != wpa_s) {
3940 iface = iface->next;
3943 wpa_printf(MSG_DEBUG,
3944 "Remove remaining child interface %s from parent %s",
3945 iface->ifname, wpa_s->ifname);
3947 iface = iface->next;
3948 wpa_supplicant_remove_iface(global, prev, terminate);
3951 wpa_s->disconnected = 1;
3952 if (wpa_s->drv_priv) {
3953 wpa_supplicant_deauthenticate(wpa_s,
3954 WLAN_REASON_DEAUTH_LEAVING);
3956 wpa_drv_set_countermeasures(wpa_s, 0);
3957 wpa_clear_keys(wpa_s, NULL);
3960 wpa_supplicant_cleanup(wpa_s);
3961 wpas_p2p_deinit_iface(wpa_s);
3963 wpas_ctrl_radio_work_flush(wpa_s);
3964 radio_remove_interface(wpa_s);
3966 if (wpa_s->drv_priv)
3967 wpa_drv_deinit(wpa_s);
3970 wpas_notify_iface_removed(wpa_s);
3973 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TERMINATING);
3975 if (wpa_s->ctrl_iface) {
3976 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
3977 wpa_s->ctrl_iface = NULL;
3980 if (wpa_s->conf != NULL) {
3981 wpa_config_free(wpa_s->conf);
3990 * wpa_supplicant_add_iface - Add a new network interface
3991 * @global: Pointer to global data from wpa_supplicant_init()
3992 * @iface: Interface configuration options
3993 * Returns: Pointer to the created interface or %NULL on failure
3995 * This function is used to add new network interfaces for %wpa_supplicant.
3996 * This can be called before wpa_supplicant_run() to add interfaces before the
3997 * main event loop has been started. In addition, new interfaces can be added
3998 * dynamically while %wpa_supplicant is already running. This could happen,
3999 * e.g., when a hotplug network adapter is inserted.
4001 struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
4002 struct wpa_interface *iface)
4004 struct wpa_supplicant *wpa_s;
4005 struct wpa_interface t_iface;
4006 struct wpa_ssid *ssid;
4008 if (global == NULL || iface == NULL)
4011 wpa_s = wpa_supplicant_alloc();
4015 wpa_s->global = global;
4018 if (global->params.override_driver) {
4019 wpa_printf(MSG_DEBUG, "Override interface parameter: driver "
4021 iface->driver, global->params.override_driver);
4022 t_iface.driver = global->params.override_driver;
4024 if (global->params.override_ctrl_interface) {
4025 wpa_printf(MSG_DEBUG, "Override interface parameter: "
4026 "ctrl_interface ('%s' -> '%s')",
4027 iface->ctrl_interface,
4028 global->params.override_ctrl_interface);
4029 t_iface.ctrl_interface =
4030 global->params.override_ctrl_interface;
4032 if (wpa_supplicant_init_iface(wpa_s, &t_iface)) {
4033 wpa_printf(MSG_DEBUG, "Failed to add interface %s",
4035 wpa_supplicant_deinit_iface(wpa_s, 0, 0);
4039 if (iface->p2p_mgmt == 0) {
4040 /* Notify the control interfaces about new iface */
4041 if (wpas_notify_iface_added(wpa_s)) {
4042 wpa_supplicant_deinit_iface(wpa_s, 1, 0);
4046 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
4047 wpas_notify_network_added(wpa_s, ssid);
4050 wpa_s->next = global->ifaces;
4051 global->ifaces = wpa_s;
4053 wpa_dbg(wpa_s, MSG_DEBUG, "Added interface %s", wpa_s->ifname);
4054 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
4057 if (wpa_s->global->p2p == NULL &&
4058 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE) &&
4059 wpas_p2p_add_p2pdev_interface(wpa_s, iface->conf_p2p_dev) < 0) {
4060 wpa_printf(MSG_INFO,
4061 "P2P: Failed to enable P2P Device interface");
4062 /* Try to continue without. P2P will be disabled. */
4064 #endif /* CONFIG_P2P */
4071 * wpa_supplicant_remove_iface - Remove a network interface
4072 * @global: Pointer to global data from wpa_supplicant_init()
4073 * @wpa_s: Pointer to the network interface to be removed
4074 * Returns: 0 if interface was removed, -1 if interface was not found
4076 * This function can be used to dynamically remove network interfaces from
4077 * %wpa_supplicant, e.g., when a hotplug network adapter is ejected. In
4078 * addition, this function is used to remove all remaining interfaces when
4079 * %wpa_supplicant is terminated.
4081 int wpa_supplicant_remove_iface(struct wpa_global *global,
4082 struct wpa_supplicant *wpa_s,
4085 struct wpa_supplicant *prev;
4087 /* Remove interface from the global list of interfaces */
4088 prev = global->ifaces;
4089 if (prev == wpa_s) {
4090 global->ifaces = wpa_s->next;
4092 while (prev && prev->next != wpa_s)
4096 prev->next = wpa_s->next;
4099 wpa_dbg(wpa_s, MSG_DEBUG, "Removing interface %s", wpa_s->ifname);
4101 if (global->p2p_group_formation == wpa_s)
4102 global->p2p_group_formation = NULL;
4103 if (global->p2p_invite_group == wpa_s)
4104 global->p2p_invite_group = NULL;
4105 wpa_supplicant_deinit_iface(wpa_s, 1, terminate);
4112 * wpa_supplicant_get_eap_mode - Get the current EAP mode
4113 * @wpa_s: Pointer to the network interface
4114 * Returns: Pointer to the eap mode or the string "UNKNOWN" if not found
4116 const char * wpa_supplicant_get_eap_mode(struct wpa_supplicant *wpa_s)
4118 const char *eapol_method;
4120 if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) == 0 &&
4121 wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
4125 eapol_method = eapol_sm_get_method_name(wpa_s->eapol);
4126 if (eapol_method == NULL)
4127 return "UNKNOWN-EAP";
4129 return eapol_method;
4134 * wpa_supplicant_get_iface - Get a new network interface
4135 * @global: Pointer to global data from wpa_supplicant_init()
4136 * @ifname: Interface name
4137 * Returns: Pointer to the interface or %NULL if not found
4139 struct wpa_supplicant * wpa_supplicant_get_iface(struct wpa_global *global,
4142 struct wpa_supplicant *wpa_s;
4144 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
4145 if (os_strcmp(wpa_s->ifname, ifname) == 0)
4152 #ifndef CONFIG_NO_WPA_MSG
4153 static const char * wpa_supplicant_msg_ifname_cb(void *ctx)
4155 struct wpa_supplicant *wpa_s = ctx;
4158 return wpa_s->ifname;
4160 #endif /* CONFIG_NO_WPA_MSG */
4164 * wpa_supplicant_init - Initialize %wpa_supplicant
4165 * @params: Parameters for %wpa_supplicant
4166 * Returns: Pointer to global %wpa_supplicant data, or %NULL on failure
4168 * This function is used to initialize %wpa_supplicant. After successful
4169 * initialization, the returned data pointer can be used to add and remove
4170 * network interfaces, and eventually, to deinitialize %wpa_supplicant.
4172 struct wpa_global * wpa_supplicant_init(struct wpa_params *params)
4174 struct wpa_global *global;
4180 #ifdef CONFIG_DRIVER_NDIS
4182 void driver_ndis_init_ops(void);
4183 driver_ndis_init_ops();
4185 #endif /* CONFIG_DRIVER_NDIS */
4187 #ifndef CONFIG_NO_WPA_MSG
4188 wpa_msg_register_ifname_cb(wpa_supplicant_msg_ifname_cb);
4189 #endif /* CONFIG_NO_WPA_MSG */
4191 wpa_debug_open_file(params->wpa_debug_file_path);
4192 if (params->wpa_debug_syslog)
4193 wpa_debug_open_syslog();
4194 if (params->wpa_debug_tracing) {
4195 ret = wpa_debug_open_linux_tracing();
4197 wpa_printf(MSG_ERROR,
4198 "Failed to enable trace logging");
4203 ret = eap_register_methods();
4205 wpa_printf(MSG_ERROR, "Failed to register EAP methods");
4207 wpa_printf(MSG_ERROR, "Two or more EAP methods used "
4208 "the same EAP type.");
4212 global = os_zalloc(sizeof(*global));
4215 dl_list_init(&global->p2p_srv_bonjour);
4216 dl_list_init(&global->p2p_srv_upnp);
4217 global->params.daemonize = params->daemonize;
4218 global->params.wait_for_monitor = params->wait_for_monitor;
4219 global->params.dbus_ctrl_interface = params->dbus_ctrl_interface;
4220 if (params->pid_file)
4221 global->params.pid_file = os_strdup(params->pid_file);
4222 if (params->ctrl_interface)
4223 global->params.ctrl_interface =
4224 os_strdup(params->ctrl_interface);
4225 if (params->ctrl_interface_group)
4226 global->params.ctrl_interface_group =
4227 os_strdup(params->ctrl_interface_group);
4228 if (params->override_driver)
4229 global->params.override_driver =
4230 os_strdup(params->override_driver);
4231 if (params->override_ctrl_interface)
4232 global->params.override_ctrl_interface =
4233 os_strdup(params->override_ctrl_interface);
4234 wpa_debug_level = global->params.wpa_debug_level =
4235 params->wpa_debug_level;
4236 wpa_debug_show_keys = global->params.wpa_debug_show_keys =
4237 params->wpa_debug_show_keys;
4238 wpa_debug_timestamp = global->params.wpa_debug_timestamp =
4239 params->wpa_debug_timestamp;
4241 wpa_printf(MSG_DEBUG, "wpa_supplicant v" VERSION_STR);
4244 wpa_printf(MSG_ERROR, "Failed to initialize event loop");
4245 wpa_supplicant_deinit(global);
4249 random_init(params->entropy_file);
4251 global->ctrl_iface = wpa_supplicant_global_ctrl_iface_init(global);
4252 if (global->ctrl_iface == NULL) {
4253 wpa_supplicant_deinit(global);
4257 if (wpas_notify_supplicant_initialized(global)) {
4258 wpa_supplicant_deinit(global);
4262 for (i = 0; wpa_drivers[i]; i++)
4263 global->drv_count++;
4264 if (global->drv_count == 0) {
4265 wpa_printf(MSG_ERROR, "No drivers enabled");
4266 wpa_supplicant_deinit(global);
4269 global->drv_priv = os_zalloc(global->drv_count * sizeof(void *));
4270 if (global->drv_priv == NULL) {
4271 wpa_supplicant_deinit(global);
4275 #ifdef CONFIG_WIFI_DISPLAY
4276 if (wifi_display_init(global) < 0) {
4277 wpa_printf(MSG_ERROR, "Failed to initialize Wi-Fi Display");
4278 wpa_supplicant_deinit(global);
4281 #endif /* CONFIG_WIFI_DISPLAY */
4288 * wpa_supplicant_run - Run the %wpa_supplicant main event loop
4289 * @global: Pointer to global data from wpa_supplicant_init()
4290 * Returns: 0 after successful event loop run, -1 on failure
4292 * This function starts the main event loop and continues running as long as
4293 * there are any remaining events. In most cases, this function is running as
4294 * long as the %wpa_supplicant process in still in use.
4296 int wpa_supplicant_run(struct wpa_global *global)
4298 struct wpa_supplicant *wpa_s;
4300 if (global->params.daemonize &&
4301 wpa_supplicant_daemon(global->params.pid_file))
4304 if (global->params.wait_for_monitor) {
4305 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
4306 if (wpa_s->ctrl_iface)
4307 wpa_supplicant_ctrl_iface_wait(
4311 eloop_register_signal_terminate(wpa_supplicant_terminate, global);
4312 eloop_register_signal_reconfig(wpa_supplicant_reconfig, global);
4321 * wpa_supplicant_deinit - Deinitialize %wpa_supplicant
4322 * @global: Pointer to global data from wpa_supplicant_init()
4324 * This function is called to deinitialize %wpa_supplicant and to free all
4325 * allocated resources. Remaining network interfaces will also be removed.
4327 void wpa_supplicant_deinit(struct wpa_global *global)
4334 #ifdef CONFIG_WIFI_DISPLAY
4335 wifi_display_deinit(global);
4336 #endif /* CONFIG_WIFI_DISPLAY */
4338 while (global->ifaces)
4339 wpa_supplicant_remove_iface(global, global->ifaces, 1);
4341 if (global->ctrl_iface)
4342 wpa_supplicant_global_ctrl_iface_deinit(global->ctrl_iface);
4344 wpas_notify_supplicant_deinitialized(global);
4346 eap_peer_unregister_methods();
4348 eap_server_unregister_methods();
4349 #endif /* CONFIG_AP */
4351 for (i = 0; wpa_drivers[i] && global->drv_priv; i++) {
4352 if (!global->drv_priv[i])
4354 wpa_drivers[i]->global_deinit(global->drv_priv[i]);
4356 os_free(global->drv_priv);
4362 if (global->params.pid_file) {
4363 os_daemonize_terminate(global->params.pid_file);
4364 os_free(global->params.pid_file);
4366 os_free(global->params.ctrl_interface);
4367 os_free(global->params.ctrl_interface_group);
4368 os_free(global->params.override_driver);
4369 os_free(global->params.override_ctrl_interface);
4371 os_free(global->p2p_disallow_freq.range);
4372 os_free(global->p2p_go_avoid_freq.range);
4373 os_free(global->add_psk);
4376 wpa_debug_close_syslog();
4377 wpa_debug_close_file();
4378 wpa_debug_close_linux_tracing();
4382 void wpa_supplicant_update_config(struct wpa_supplicant *wpa_s)
4384 if ((wpa_s->conf->changed_parameters & CFG_CHANGED_COUNTRY) &&
4385 wpa_s->conf->country[0] && wpa_s->conf->country[1]) {
4387 country[0] = wpa_s->conf->country[0];
4388 country[1] = wpa_s->conf->country[1];
4390 if (wpa_drv_set_country(wpa_s, country) < 0) {
4391 wpa_printf(MSG_ERROR, "Failed to set country code "
4396 if (wpa_s->conf->changed_parameters & CFG_CHANGED_EXT_PW_BACKEND)
4397 wpas_init_ext_pw(wpa_s);
4400 wpas_wps_update_config(wpa_s);
4401 #endif /* CONFIG_WPS */
4402 wpas_p2p_update_config(wpa_s);
4403 wpa_s->conf->changed_parameters = 0;
4407 static void add_freq(int *freqs, int *num_freqs, int freq)
4411 for (i = 0; i < *num_freqs; i++) {
4412 if (freqs[i] == freq)
4416 freqs[*num_freqs] = freq;
4421 static int * get_bss_freqs_in_ess(struct wpa_supplicant *wpa_s)
4423 struct wpa_bss *bss, *cbss;
4424 const int max_freqs = 10;
4428 freqs = os_zalloc(sizeof(int) * (max_freqs + 1));
4432 cbss = wpa_s->current_bss;
4434 dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
4437 if (bss->ssid_len == cbss->ssid_len &&
4438 os_memcmp(bss->ssid, cbss->ssid, bss->ssid_len) == 0 &&
4439 wpa_blacklist_get(wpa_s, bss->bssid) == NULL) {
4440 add_freq(freqs, &num_freqs, bss->freq);
4441 if (num_freqs == max_freqs)
4446 if (num_freqs == 0) {
4455 void wpas_connection_failed(struct wpa_supplicant *wpa_s, const u8 *bssid)
4461 wpas_connect_work_done(wpa_s);
4464 * Remove possible authentication timeout since the connection failed.
4466 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
4468 if (wpa_s->disconnected) {
4470 * There is no point in blacklisting the AP if this event is
4471 * generated based on local request to disconnect.
4473 wpa_dbg(wpa_s, MSG_DEBUG, "Ignore connection failure "
4474 "indication since interface has been put into "
4475 "disconnected state");
4480 * Add the failed BSSID into the blacklist and speed up next scan
4481 * attempt if there could be other APs that could accept association.
4482 * The current blacklist count indicates how many times we have tried
4483 * connecting to this AP and multiple attempts mean that other APs are
4484 * either not available or has already been tried, so that we can start
4485 * increasing the delay here to avoid constant scanning.
4487 count = wpa_blacklist_add(wpa_s, bssid);
4488 if (count == 1 && wpa_s->current_bss) {
4490 * This BSS was not in the blacklist before. If there is
4491 * another BSS available for the same ESS, we should try that
4492 * next. Otherwise, we may as well try this one once more
4493 * before allowing other, likely worse, ESSes to be considered.
4495 freqs = get_bss_freqs_in_ess(wpa_s);
4497 wpa_dbg(wpa_s, MSG_DEBUG, "Another BSS in this ESS "
4498 "has been seen; try it next");
4499 wpa_blacklist_add(wpa_s, bssid);
4501 * On the next scan, go through only the known channels
4502 * used in this ESS based on previous scans to speed up
4503 * common load balancing use case.
4505 os_free(wpa_s->next_scan_freqs);
4506 wpa_s->next_scan_freqs = freqs;
4511 * Add previous failure count in case the temporary blacklist was
4512 * cleared due to no other BSSes being available.
4514 count += wpa_s->extra_blacklist_count;
4516 if (count > 3 && wpa_s->current_ssid) {
4517 wpa_printf(MSG_DEBUG, "Continuous association failures - "
4518 "consider temporary network disabling");
4519 wpas_auth_failed(wpa_s, "CONN_FAILED");
4540 wpa_dbg(wpa_s, MSG_DEBUG, "Blacklist count %d --> request scan in %d "
4541 "ms", count, timeout);
4544 * TODO: if more than one possible AP is available in scan results,
4545 * could try the other ones before requesting a new scan.
4547 wpa_supplicant_req_scan(wpa_s, timeout / 1000,
4548 1000 * (timeout % 1000));
4552 int wpas_driver_bss_selection(struct wpa_supplicant *wpa_s)
4554 return wpa_s->conf->ap_scan == 2 ||
4555 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_BSS_SELECTION);
4559 #if defined(CONFIG_CTRL_IFACE) || defined(CONFIG_CTRL_IFACE_DBUS_NEW)
4560 int wpa_supplicant_ctrl_iface_ctrl_rsp_handle(struct wpa_supplicant *wpa_s,
4561 struct wpa_ssid *ssid,
4565 #ifdef IEEE8021X_EAPOL
4566 struct eap_peer_config *eap = &ssid->eap;
4568 wpa_printf(MSG_DEBUG, "CTRL_IFACE: response handle field=%s", field);
4569 wpa_hexdump_ascii_key(MSG_DEBUG, "CTRL_IFACE: response value",
4570 (const u8 *) value, os_strlen(value));
4572 switch (wpa_supplicant_ctrl_req_from_string(field)) {
4573 case WPA_CTRL_REQ_EAP_IDENTITY:
4574 os_free(eap->identity);
4575 eap->identity = (u8 *) os_strdup(value);
4576 eap->identity_len = os_strlen(value);
4577 eap->pending_req_identity = 0;
4578 if (ssid == wpa_s->current_ssid)
4579 wpa_s->reassociate = 1;
4581 case WPA_CTRL_REQ_EAP_PASSWORD:
4582 bin_clear_free(eap->password, eap->password_len);
4583 eap->password = (u8 *) os_strdup(value);
4584 eap->password_len = os_strlen(value);
4585 eap->pending_req_password = 0;
4586 if (ssid == wpa_s->current_ssid)
4587 wpa_s->reassociate = 1;
4589 case WPA_CTRL_REQ_EAP_NEW_PASSWORD:
4590 bin_clear_free(eap->new_password, eap->new_password_len);
4591 eap->new_password = (u8 *) os_strdup(value);
4592 eap->new_password_len = os_strlen(value);
4593 eap->pending_req_new_password = 0;
4594 if (ssid == wpa_s->current_ssid)
4595 wpa_s->reassociate = 1;
4597 case WPA_CTRL_REQ_EAP_PIN:
4598 str_clear_free(eap->pin);
4599 eap->pin = os_strdup(value);
4600 eap->pending_req_pin = 0;
4601 if (ssid == wpa_s->current_ssid)
4602 wpa_s->reassociate = 1;
4604 case WPA_CTRL_REQ_EAP_OTP:
4605 bin_clear_free(eap->otp, eap->otp_len);
4606 eap->otp = (u8 *) os_strdup(value);
4607 eap->otp_len = os_strlen(value);
4608 os_free(eap->pending_req_otp);
4609 eap->pending_req_otp = NULL;
4610 eap->pending_req_otp_len = 0;
4612 case WPA_CTRL_REQ_EAP_PASSPHRASE:
4613 str_clear_free(eap->private_key_passwd);
4614 eap->private_key_passwd = os_strdup(value);
4615 eap->pending_req_passphrase = 0;
4616 if (ssid == wpa_s->current_ssid)
4617 wpa_s->reassociate = 1;
4619 case WPA_CTRL_REQ_SIM:
4620 str_clear_free(eap->external_sim_resp);
4621 eap->external_sim_resp = os_strdup(value);
4624 wpa_printf(MSG_DEBUG, "CTRL_IFACE: Unknown field '%s'", field);
4629 #else /* IEEE8021X_EAPOL */
4630 wpa_printf(MSG_DEBUG, "CTRL_IFACE: IEEE 802.1X not included");
4632 #endif /* IEEE8021X_EAPOL */
4634 #endif /* CONFIG_CTRL_IFACE || CONFIG_CTRL_IFACE_DBUS_NEW */
4637 int wpas_network_disabled(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
4640 unsigned int drv_enc;
4648 if (wpa_s && wpa_s->drv_capa_known)
4649 drv_enc = wpa_s->drv_enc;
4651 drv_enc = (unsigned int) -1;
4653 for (i = 0; i < NUM_WEP_KEYS; i++) {
4654 size_t len = ssid->wep_key_len[i];
4657 if (len == 5 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP40))
4659 if (len == 13 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP104))
4661 if (len == 16 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP128))
4663 return 1; /* invalid WEP key */
4666 if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt) && !ssid->psk_set &&
4667 (!ssid->passphrase || ssid->ssid_len != 0) && !ssid->ext_psk)
4674 int wpas_is_p2p_prioritized(struct wpa_supplicant *wpa_s)
4676 if (wpa_s->global->conc_pref == WPA_CONC_PREF_P2P)
4678 if (wpa_s->global->conc_pref == WPA_CONC_PREF_STA)
4684 void wpas_auth_failed(struct wpa_supplicant *wpa_s, char *reason)
4686 struct wpa_ssid *ssid = wpa_s->current_ssid;
4688 struct os_reltime now;
4691 wpa_printf(MSG_DEBUG, "Authentication failure but no known "
4696 if (ssid->key_mgmt == WPA_KEY_MGMT_WPS)
4699 ssid->auth_failures++;
4702 if (ssid->p2p_group &&
4703 (wpa_s->p2p_in_provisioning || wpa_s->show_group_started)) {
4705 * Skip the wait time since there is a short timeout on the
4706 * connection to a P2P group.
4710 #endif /* CONFIG_P2P */
4712 if (ssid->auth_failures > 50)
4714 else if (ssid->auth_failures > 10)
4716 else if (ssid->auth_failures > 5)
4718 else if (ssid->auth_failures > 3)
4720 else if (ssid->auth_failures > 2)
4722 else if (ssid->auth_failures > 1)
4727 if (ssid->auth_failures > 1 &&
4728 wpa_key_mgmt_wpa_ieee8021x(ssid->key_mgmt))
4729 dur += os_random() % (ssid->auth_failures * 10);
4731 os_get_reltime(&now);
4732 if (now.sec + dur <= ssid->disabled_until.sec)
4735 ssid->disabled_until.sec = now.sec + dur;
4737 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TEMP_DISABLED
4738 "id=%d ssid=\"%s\" auth_failures=%u duration=%d reason=%s",
4739 ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
4740 ssid->auth_failures, dur, reason);
4744 void wpas_clear_temp_disabled(struct wpa_supplicant *wpa_s,
4745 struct wpa_ssid *ssid, int clear_failures)
4750 if (ssid->disabled_until.sec) {
4751 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_REENABLED
4752 "id=%d ssid=\"%s\"",
4753 ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
4755 ssid->disabled_until.sec = 0;
4756 ssid->disabled_until.usec = 0;
4758 ssid->auth_failures = 0;
4762 int disallowed_bssid(struct wpa_supplicant *wpa_s, const u8 *bssid)
4766 if (wpa_s->disallow_aps_bssid == NULL)
4769 for (i = 0; i < wpa_s->disallow_aps_bssid_count; i++) {
4770 if (os_memcmp(wpa_s->disallow_aps_bssid + i * ETH_ALEN,
4771 bssid, ETH_ALEN) == 0)
4779 int disallowed_ssid(struct wpa_supplicant *wpa_s, const u8 *ssid,
4784 if (wpa_s->disallow_aps_ssid == NULL || ssid == NULL)
4787 for (i = 0; i < wpa_s->disallow_aps_ssid_count; i++) {
4788 struct wpa_ssid_value *s = &wpa_s->disallow_aps_ssid[i];
4789 if (ssid_len == s->ssid_len &&
4790 os_memcmp(ssid, s->ssid, ssid_len) == 0)
4799 * wpas_request_connection - Request a new connection
4800 * @wpa_s: Pointer to the network interface
4802 * This function is used to request a new connection to be found. It will mark
4803 * the interface to allow reassociation and request a new scan to find a
4804 * suitable network to connect to.
4806 void wpas_request_connection(struct wpa_supplicant *wpa_s)
4808 wpa_s->normal_scans = 0;
4809 wpa_supplicant_reinit_autoscan(wpa_s);
4810 wpa_s->extra_blacklist_count = 0;
4811 wpa_s->disconnected = 0;
4812 wpa_s->reassociate = 1;
4814 if (wpa_supplicant_fast_associate(wpa_s) != 1)
4815 wpa_supplicant_req_scan(wpa_s, 0, 0);
4819 void dump_freq_data(struct wpa_supplicant *wpa_s, const char *title,
4820 struct wpa_used_freq_data *freqs_data,
4825 wpa_dbg(wpa_s, MSG_DEBUG, "Shared frequencies (len=%u): %s",
4827 for (i = 0; i < len; i++) {
4828 struct wpa_used_freq_data *cur = &freqs_data[i];
4829 wpa_dbg(wpa_s, MSG_DEBUG, "freq[%u]: %d, flags=0x%X",
4830 i, cur->freq, cur->flags);
4836 * Find the operating frequencies of any of the virtual interfaces that
4837 * are using the same radio as the current interface, and in addition, get
4838 * information about the interface types that are using the frequency.
4840 int get_shared_radio_freqs_data(struct wpa_supplicant *wpa_s,
4841 struct wpa_used_freq_data *freqs_data,
4844 struct wpa_supplicant *ifs;
4847 unsigned int idx = 0, i;
4849 wpa_dbg(wpa_s, MSG_DEBUG,
4850 "Determining shared radio frequencies (max len %u)", len);
4851 os_memset(freqs_data, 0, sizeof(struct wpa_used_freq_data) * len);
4853 dl_list_for_each(ifs, &wpa_s->radio->ifaces, struct wpa_supplicant,
4858 if (ifs->current_ssid == NULL || ifs->assoc_freq == 0)
4861 if (ifs->current_ssid->mode == WPAS_MODE_AP ||
4862 ifs->current_ssid->mode == WPAS_MODE_P2P_GO)
4863 freq = ifs->current_ssid->frequency;
4864 else if (wpa_drv_get_bssid(ifs, bssid) == 0)
4865 freq = ifs->assoc_freq;
4869 /* Hold only distinct freqs */
4870 for (i = 0; i < idx; i++)
4871 if (freqs_data[i].freq == freq)
4875 freqs_data[idx++].freq = freq;
4877 if (ifs->current_ssid->mode == WPAS_MODE_INFRA) {
4878 freqs_data[i].flags = ifs->current_ssid->p2p_group ?
4879 WPA_FREQ_USED_BY_P2P_CLIENT :
4880 WPA_FREQ_USED_BY_INFRA_STATION;
4884 dump_freq_data(wpa_s, "completed iteration", freqs_data, idx);
4890 * Find the operating frequencies of any of the virtual interfaces that
4891 * are using the same radio as the current interface.
4893 int get_shared_radio_freqs(struct wpa_supplicant *wpa_s,
4894 int *freq_array, unsigned int len)
4896 struct wpa_used_freq_data *freqs_data;
4899 os_memset(freq_array, 0, sizeof(int) * len);
4901 freqs_data = os_calloc(len, sizeof(struct wpa_used_freq_data));
4905 num = get_shared_radio_freqs_data(wpa_s, freqs_data, len);
4906 for (i = 0; i < num; i++)
4907 freq_array[i] = freqs_data[i].freq;
4909 os_free(freqs_data);