3 * Copyright (c) 2003-2015, 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"
36 #include "common/hw_features_common.h"
39 #include "blacklist.h"
40 #include "wpas_glue.h"
41 #include "wps_supplicant.h"
44 #include "gas_query.h"
46 #include "p2p_supplicant.h"
47 #include "wifi_display.h"
53 #include "offchannel.h"
54 #include "hs20_supplicant.h"
59 const char *const wpa_supplicant_version =
60 "wpa_supplicant v" VERSION_STR "\n"
61 "Copyright (c) 2003-2015, Jouni Malinen <j@w1.fi> and contributors";
63 const char *const wpa_supplicant_license =
64 "This software may be distributed under the terms of the BSD license.\n"
65 "See README for more details.\n"
66 #ifdef EAP_TLS_OPENSSL
67 "\nThis product includes software developed by the OpenSSL Project\n"
68 "for use in the OpenSSL Toolkit (http://www.openssl.org/)\n"
69 #endif /* EAP_TLS_OPENSSL */
72 #ifndef CONFIG_NO_STDOUT_DEBUG
73 /* Long text divided into parts in order to fit in C89 strings size limits. */
74 const char *const wpa_supplicant_full_license1 =
76 const char *const wpa_supplicant_full_license2 =
77 "This software may be distributed under the terms of the BSD license.\n"
79 "Redistribution and use in source and binary forms, with or without\n"
80 "modification, are permitted provided that the following conditions are\n"
83 const char *const wpa_supplicant_full_license3 =
84 "1. Redistributions of source code must retain the above copyright\n"
85 " notice, this list of conditions and the following disclaimer.\n"
87 "2. Redistributions in binary form must reproduce the above copyright\n"
88 " notice, this list of conditions and the following disclaimer in the\n"
89 " documentation and/or other materials provided with the distribution.\n"
91 const char *const wpa_supplicant_full_license4 =
92 "3. Neither the name(s) of the above-listed copyright holder(s) nor the\n"
93 " names of its contributors may be used to endorse or promote products\n"
94 " derived from this software without specific prior written permission.\n"
96 "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
97 "\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
98 "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
99 "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n";
100 const char *const wpa_supplicant_full_license5 =
101 "OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
102 "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
103 "LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
104 "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
105 "THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
106 "(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
107 "OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
109 #endif /* CONFIG_NO_STDOUT_DEBUG */
111 /* Configure default/group WEP keys for static WEP */
112 int wpa_set_wep_keys(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
116 for (i = 0; i < NUM_WEP_KEYS; i++) {
117 if (ssid->wep_key_len[i] == 0)
121 wpa_drv_set_key(wpa_s, WPA_ALG_WEP, NULL,
122 i, i == ssid->wep_tx_keyidx, NULL, 0,
123 ssid->wep_key[i], ssid->wep_key_len[i]);
130 int wpa_supplicant_set_wpa_none_key(struct wpa_supplicant *wpa_s,
131 struct wpa_ssid *ssid)
139 /* IBSS/WPA-None uses only one key (Group) for both receiving and
140 * sending unicast and multicast packets. */
142 if (ssid->mode != WPAS_MODE_IBSS) {
143 wpa_msg(wpa_s, MSG_INFO, "WPA: Invalid mode %d (not "
144 "IBSS/ad-hoc) for WPA-None", ssid->mode);
148 if (!ssid->psk_set) {
149 wpa_msg(wpa_s, MSG_INFO, "WPA: No PSK configured for "
154 switch (wpa_s->group_cipher) {
155 case WPA_CIPHER_CCMP:
156 os_memcpy(key, ssid->psk, 16);
160 case WPA_CIPHER_GCMP:
161 os_memcpy(key, ssid->psk, 16);
165 case WPA_CIPHER_TKIP:
166 /* WPA-None uses the same Michael MIC key for both TX and RX */
167 os_memcpy(key, ssid->psk, 16 + 8);
168 os_memcpy(key + 16 + 8, ssid->psk + 16, 8);
173 wpa_msg(wpa_s, MSG_INFO, "WPA: Invalid group cipher %d for "
174 "WPA-None", wpa_s->group_cipher);
178 /* TODO: should actually remember the previously used seq#, both for TX
179 * and RX from each STA.. */
181 ret = wpa_drv_set_key(wpa_s, alg, NULL, 0, 1, seq, 6, key, keylen);
182 os_memset(key, 0, sizeof(key));
187 static void wpa_supplicant_timeout(void *eloop_ctx, void *timeout_ctx)
189 struct wpa_supplicant *wpa_s = eloop_ctx;
190 const u8 *bssid = wpa_s->bssid;
191 if (is_zero_ether_addr(bssid))
192 bssid = wpa_s->pending_bssid;
193 wpa_msg(wpa_s, MSG_INFO, "Authentication with " MACSTR " timed out.",
195 wpa_blacklist_add(wpa_s, bssid);
196 wpa_sm_notify_disassoc(wpa_s->wpa);
197 wpa_supplicant_deauthenticate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
198 wpa_s->reassociate = 1;
201 * If we timed out, the AP or the local radio may be busy.
202 * So, wait a second until scanning again.
204 wpa_supplicant_req_scan(wpa_s, 1, 0);
209 * wpa_supplicant_req_auth_timeout - Schedule a timeout for authentication
210 * @wpa_s: Pointer to wpa_supplicant data
211 * @sec: Number of seconds after which to time out authentication
212 * @usec: Number of microseconds after which to time out authentication
214 * This function is used to schedule a timeout for the current authentication
217 void wpa_supplicant_req_auth_timeout(struct wpa_supplicant *wpa_s,
220 if (wpa_s->conf->ap_scan == 0 &&
221 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED))
224 wpa_dbg(wpa_s, MSG_DEBUG, "Setting authentication timeout: %d sec "
225 "%d usec", sec, usec);
226 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
227 eloop_register_timeout(sec, usec, wpa_supplicant_timeout, wpa_s, NULL);
232 * wpa_supplicant_cancel_auth_timeout - Cancel authentication timeout
233 * @wpa_s: Pointer to wpa_supplicant data
235 * This function is used to cancel authentication timeout scheduled with
236 * wpa_supplicant_req_auth_timeout() and it is called when authentication has
239 void wpa_supplicant_cancel_auth_timeout(struct wpa_supplicant *wpa_s)
241 wpa_dbg(wpa_s, MSG_DEBUG, "Cancelling authentication timeout");
242 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
243 wpa_blacklist_del(wpa_s, wpa_s->bssid);
248 * wpa_supplicant_initiate_eapol - Configure EAPOL state machine
249 * @wpa_s: Pointer to wpa_supplicant data
251 * This function is used to configure EAPOL state machine based on the selected
252 * authentication mode.
254 void wpa_supplicant_initiate_eapol(struct wpa_supplicant *wpa_s)
256 #ifdef IEEE8021X_EAPOL
257 struct eapol_config eapol_conf;
258 struct wpa_ssid *ssid = wpa_s->current_ssid;
260 #ifdef CONFIG_IBSS_RSN
261 if (ssid->mode == WPAS_MODE_IBSS &&
262 wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
263 wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
265 * RSN IBSS authentication is per-STA and we can disable the
266 * per-BSSID EAPOL authentication.
268 eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
269 eapol_sm_notify_eap_success(wpa_s->eapol, TRUE);
270 eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
273 #endif /* CONFIG_IBSS_RSN */
275 eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
276 eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
278 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
279 wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE)
280 eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
282 eapol_sm_notify_portControl(wpa_s->eapol, Auto);
284 os_memset(&eapol_conf, 0, sizeof(eapol_conf));
285 if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
286 eapol_conf.accept_802_1x_keys = 1;
287 eapol_conf.required_keys = 0;
288 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_UNICAST) {
289 eapol_conf.required_keys |= EAPOL_REQUIRE_KEY_UNICAST;
291 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_BROADCAST) {
292 eapol_conf.required_keys |=
293 EAPOL_REQUIRE_KEY_BROADCAST;
296 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED)
297 eapol_conf.required_keys = 0;
299 eapol_conf.fast_reauth = wpa_s->conf->fast_reauth;
300 eapol_conf.workaround = ssid->eap_workaround;
301 eapol_conf.eap_disabled =
302 !wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) &&
303 wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA &&
304 wpa_s->key_mgmt != WPA_KEY_MGMT_WPS;
305 eapol_conf.external_sim = wpa_s->conf->external_sim;
308 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) {
309 eapol_conf.wps |= EAPOL_LOCAL_WPS_IN_USE;
310 if (wpa_s->current_bss) {
312 ie = wpa_bss_get_vendor_ie_multi(wpa_s->current_bss,
317 EAPOL_PEER_IS_WPS20_AP;
322 #endif /* CONFIG_WPS */
324 eapol_sm_notify_config(wpa_s->eapol, &ssid->eap, &eapol_conf);
326 ieee802_1x_alloc_kay_sm(wpa_s, ssid);
327 #endif /* IEEE8021X_EAPOL */
332 * wpa_supplicant_set_non_wpa_policy - Set WPA parameters to non-WPA mode
333 * @wpa_s: Pointer to wpa_supplicant data
334 * @ssid: Configuration data for the network
336 * This function is used to configure WPA state machine and related parameters
337 * to a mode where WPA is not enabled. This is called as part of the
338 * authentication configuration when the selected network does not use WPA.
340 void wpa_supplicant_set_non_wpa_policy(struct wpa_supplicant *wpa_s,
341 struct wpa_ssid *ssid)
345 if (ssid->key_mgmt & WPA_KEY_MGMT_WPS)
346 wpa_s->key_mgmt = WPA_KEY_MGMT_WPS;
347 else if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA)
348 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_NO_WPA;
350 wpa_s->key_mgmt = WPA_KEY_MGMT_NONE;
351 wpa_sm_set_ap_wpa_ie(wpa_s->wpa, NULL, 0);
352 wpa_sm_set_ap_rsn_ie(wpa_s->wpa, NULL, 0);
353 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
354 wpa_s->pairwise_cipher = WPA_CIPHER_NONE;
355 wpa_s->group_cipher = WPA_CIPHER_NONE;
356 wpa_s->mgmt_group_cipher = 0;
358 for (i = 0; i < NUM_WEP_KEYS; i++) {
359 if (ssid->wep_key_len[i] > 5) {
360 wpa_s->pairwise_cipher = WPA_CIPHER_WEP104;
361 wpa_s->group_cipher = WPA_CIPHER_WEP104;
363 } else if (ssid->wep_key_len[i] > 0) {
364 wpa_s->pairwise_cipher = WPA_CIPHER_WEP40;
365 wpa_s->group_cipher = WPA_CIPHER_WEP40;
370 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED, 0);
371 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
372 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
373 wpa_s->pairwise_cipher);
374 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
375 #ifdef CONFIG_IEEE80211W
376 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
377 wpa_s->mgmt_group_cipher);
378 #endif /* CONFIG_IEEE80211W */
380 pmksa_cache_clear_current(wpa_s->wpa);
384 void free_hw_features(struct wpa_supplicant *wpa_s)
387 if (wpa_s->hw.modes == NULL)
390 for (i = 0; i < wpa_s->hw.num_modes; i++) {
391 os_free(wpa_s->hw.modes[i].channels);
392 os_free(wpa_s->hw.modes[i].rates);
395 os_free(wpa_s->hw.modes);
396 wpa_s->hw.modes = NULL;
400 static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s)
404 bgscan_deinit(wpa_s);
405 autoscan_deinit(wpa_s);
406 scard_deinit(wpa_s->scard);
408 wpa_sm_set_scard_ctx(wpa_s->wpa, NULL);
409 eapol_sm_register_scard_ctx(wpa_s->eapol, NULL);
410 l2_packet_deinit(wpa_s->l2);
413 l2_packet_deinit(wpa_s->l2_br);
416 #ifdef CONFIG_TESTING_OPTIONS
417 l2_packet_deinit(wpa_s->l2_test);
418 wpa_s->l2_test = NULL;
419 #endif /* CONFIG_TESTING_OPTIONS */
421 if (wpa_s->conf != NULL) {
422 struct wpa_ssid *ssid;
423 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
424 wpas_notify_network_removed(wpa_s, ssid);
427 os_free(wpa_s->confname);
428 wpa_s->confname = NULL;
430 os_free(wpa_s->confanother);
431 wpa_s->confanother = NULL;
433 wpa_sm_set_eapol(wpa_s->wpa, NULL);
434 eapol_sm_deinit(wpa_s->eapol);
437 rsn_preauth_deinit(wpa_s->wpa);
440 wpa_tdls_deinit(wpa_s->wpa);
441 #endif /* CONFIG_TDLS */
443 wmm_ac_clear_saved_tspecs(wpa_s);
444 pmksa_candidate_free(wpa_s->wpa);
445 wpa_sm_deinit(wpa_s->wpa);
447 wpa_blacklist_clear(wpa_s);
449 wpa_bss_deinit(wpa_s);
451 wpa_supplicant_cancel_delayed_sched_scan(wpa_s);
452 wpa_supplicant_cancel_scan(wpa_s);
453 wpa_supplicant_cancel_auth_timeout(wpa_s);
454 eloop_cancel_timeout(wpa_supplicant_stop_countermeasures, wpa_s, NULL);
455 #ifdef CONFIG_DELAYED_MIC_ERROR_REPORT
456 eloop_cancel_timeout(wpa_supplicant_delayed_mic_error_report,
458 #endif /* CONFIG_DELAYED_MIC_ERROR_REPORT */
460 eloop_cancel_timeout(wpas_network_reenabled, wpa_s, NULL);
462 wpas_wps_deinit(wpa_s);
464 wpabuf_free(wpa_s->pending_eapol_rx);
465 wpa_s->pending_eapol_rx = NULL;
467 #ifdef CONFIG_IBSS_RSN
468 ibss_rsn_deinit(wpa_s->ibss_rsn);
469 wpa_s->ibss_rsn = NULL;
470 #endif /* CONFIG_IBSS_RSN */
475 wpa_supplicant_ap_deinit(wpa_s);
476 #endif /* CONFIG_AP */
478 wpas_p2p_deinit(wpa_s);
480 #ifdef CONFIG_OFFCHANNEL
481 offchannel_deinit(wpa_s);
482 #endif /* CONFIG_OFFCHANNEL */
484 wpa_supplicant_cancel_sched_scan(wpa_s);
486 os_free(wpa_s->next_scan_freqs);
487 wpa_s->next_scan_freqs = NULL;
489 os_free(wpa_s->manual_scan_freqs);
490 wpa_s->manual_scan_freqs = NULL;
492 os_free(wpa_s->manual_sched_scan_freqs);
493 wpa_s->manual_sched_scan_freqs = NULL;
495 wpas_mac_addr_rand_scan_clear(wpa_s, MAC_ADDR_RAND_ALL);
498 * Need to remove any pending gas-query radio work before the
499 * gas_query_deinit() call because gas_query::work has not yet been set
500 * for works that have not been started. gas_query_free() will be unable
501 * to cancel such pending radio works and once the pending gas-query
502 * radio work eventually gets removed, the deinit notification call to
503 * gas_query_start_cb() would result in dereferencing freed memory.
506 radio_remove_works(wpa_s, "gas-query", 0);
507 gas_query_deinit(wpa_s->gas);
510 free_hw_features(wpa_s);
512 ieee802_1x_dealloc_kay_sm(wpa_s);
514 os_free(wpa_s->bssid_filter);
515 wpa_s->bssid_filter = NULL;
517 os_free(wpa_s->disallow_aps_bssid);
518 wpa_s->disallow_aps_bssid = NULL;
519 os_free(wpa_s->disallow_aps_ssid);
520 wpa_s->disallow_aps_ssid = NULL;
522 wnm_bss_keep_alive_deinit(wpa_s);
524 wnm_deallocate_memory(wpa_s);
525 #endif /* CONFIG_WNM */
527 ext_password_deinit(wpa_s->ext_pw);
528 wpa_s->ext_pw = NULL;
530 wpabuf_free(wpa_s->last_gas_resp);
531 wpa_s->last_gas_resp = NULL;
532 wpabuf_free(wpa_s->prev_gas_resp);
533 wpa_s->prev_gas_resp = NULL;
535 os_free(wpa_s->last_scan_res);
536 wpa_s->last_scan_res = NULL;
540 #endif /* CONFIG_HS20 */
542 for (i = 0; i < NUM_VENDOR_ELEM_FRAMES; i++) {
543 wpabuf_free(wpa_s->vendor_elem[i]);
544 wpa_s->vendor_elem[i] = NULL;
547 wmm_ac_notify_disassoc(wpa_s);
552 * wpa_clear_keys - Clear keys configured for the driver
553 * @wpa_s: Pointer to wpa_supplicant data
554 * @addr: Previously used BSSID or %NULL if not available
556 * This function clears the encryption keys that has been previously configured
559 void wpa_clear_keys(struct wpa_supplicant *wpa_s, const u8 *addr)
563 #ifdef CONFIG_IEEE80211W
565 #else /* CONFIG_IEEE80211W */
567 #endif /* CONFIG_IEEE80211W */
569 /* MLME-DELETEKEYS.request */
570 for (i = 0; i < max; i++) {
571 if (wpa_s->keys_cleared & BIT(i))
573 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, i, 0, NULL, 0,
576 if (!(wpa_s->keys_cleared & BIT(0)) && addr &&
577 !is_zero_ether_addr(addr)) {
578 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, addr, 0, 0, NULL, 0, NULL,
580 /* MLME-SETPROTECTION.request(None) */
581 wpa_drv_mlme_setprotection(
583 MLME_SETPROTECTION_PROTECT_TYPE_NONE,
584 MLME_SETPROTECTION_KEY_TYPE_PAIRWISE);
586 wpa_s->keys_cleared = (u32) -1;
591 * wpa_supplicant_state_txt - Get the connection state name as a text string
592 * @state: State (wpa_state; WPA_*)
593 * Returns: The state name as a printable text string
595 const char * wpa_supplicant_state_txt(enum wpa_states state)
598 case WPA_DISCONNECTED:
599 return "DISCONNECTED";
602 case WPA_INTERFACE_DISABLED:
603 return "INTERFACE_DISABLED";
606 case WPA_AUTHENTICATING:
607 return "AUTHENTICATING";
608 case WPA_ASSOCIATING:
609 return "ASSOCIATING";
612 case WPA_4WAY_HANDSHAKE:
613 return "4WAY_HANDSHAKE";
614 case WPA_GROUP_HANDSHAKE:
615 return "GROUP_HANDSHAKE";
626 static void wpa_supplicant_start_bgscan(struct wpa_supplicant *wpa_s)
630 if (wpa_s->current_ssid && wpa_s->current_ssid->bgscan)
631 name = wpa_s->current_ssid->bgscan;
633 name = wpa_s->conf->bgscan;
634 if (name == NULL || name[0] == '\0')
636 if (wpas_driver_bss_selection(wpa_s))
638 if (wpa_s->current_ssid == wpa_s->bgscan_ssid)
641 if (wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE)
643 #endif /* CONFIG_P2P */
645 bgscan_deinit(wpa_s);
646 if (wpa_s->current_ssid) {
647 if (bgscan_init(wpa_s, wpa_s->current_ssid, name)) {
648 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize "
651 * Live without bgscan; it is only used as a roaming
652 * optimization, so the initial connection is not
656 struct wpa_scan_results *scan_res;
657 wpa_s->bgscan_ssid = wpa_s->current_ssid;
658 scan_res = wpa_supplicant_get_scan_results(wpa_s, NULL,
661 bgscan_notify_scan(wpa_s, scan_res);
662 wpa_scan_results_free(scan_res);
666 wpa_s->bgscan_ssid = NULL;
670 static void wpa_supplicant_stop_bgscan(struct wpa_supplicant *wpa_s)
672 if (wpa_s->bgscan_ssid != NULL) {
673 bgscan_deinit(wpa_s);
674 wpa_s->bgscan_ssid = NULL;
678 #endif /* CONFIG_BGSCAN */
681 static void wpa_supplicant_start_autoscan(struct wpa_supplicant *wpa_s)
683 if (autoscan_init(wpa_s, 0))
684 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize autoscan");
688 static void wpa_supplicant_stop_autoscan(struct wpa_supplicant *wpa_s)
690 autoscan_deinit(wpa_s);
694 void wpa_supplicant_reinit_autoscan(struct wpa_supplicant *wpa_s)
696 if (wpa_s->wpa_state == WPA_DISCONNECTED ||
697 wpa_s->wpa_state == WPA_SCANNING) {
698 autoscan_deinit(wpa_s);
699 wpa_supplicant_start_autoscan(wpa_s);
705 * wpa_supplicant_set_state - Set current connection state
706 * @wpa_s: Pointer to wpa_supplicant data
707 * @state: The new connection state
709 * This function is called whenever the connection state changes, e.g.,
710 * association is completed for WPA/WPA2 4-Way Handshake is started.
712 void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s,
713 enum wpa_states state)
715 enum wpa_states old_state = wpa_s->wpa_state;
717 wpa_dbg(wpa_s, MSG_DEBUG, "State: %s -> %s",
718 wpa_supplicant_state_txt(wpa_s->wpa_state),
719 wpa_supplicant_state_txt(state));
721 if (state == WPA_INTERFACE_DISABLED) {
722 /* Assure normal scan when interface is restored */
723 wpa_s->normal_scans = 0;
726 if (state == WPA_COMPLETED) {
727 wpas_connect_work_done(wpa_s);
728 /* Reinitialize normal_scan counter */
729 wpa_s->normal_scans = 0;
734 * P2PS client has to reply to Probe Request frames received on the
735 * group operating channel. Enable Probe Request frame reporting for
736 * P2P connected client in case p2p_cli_probe configuration property is
739 if (wpa_s->conf->p2p_cli_probe && wpa_s->current_ssid &&
740 wpa_s->current_ssid->mode == WPAS_MODE_INFRA &&
741 wpa_s->current_ssid->p2p_group) {
742 if (state == WPA_COMPLETED && !wpa_s->p2p_cli_probe) {
743 wpa_dbg(wpa_s, MSG_DEBUG,
744 "P2P: Enable CLI Probe Request RX reporting");
745 wpa_s->p2p_cli_probe =
746 wpa_drv_probe_req_report(wpa_s, 1) >= 0;
747 } else if (state != WPA_COMPLETED && wpa_s->p2p_cli_probe) {
748 wpa_dbg(wpa_s, MSG_DEBUG,
749 "P2P: Disable CLI Probe Request RX reporting");
750 wpa_s->p2p_cli_probe = 0;
751 wpa_drv_probe_req_report(wpa_s, 0);
754 #endif /* CONFIG_P2P */
756 if (state != WPA_SCANNING)
757 wpa_supplicant_notify_scanning(wpa_s, 0);
759 if (state == WPA_COMPLETED && wpa_s->new_connection) {
760 struct wpa_ssid *ssid = wpa_s->current_ssid;
761 #if defined(CONFIG_CTRL_IFACE) || !defined(CONFIG_NO_STDOUT_DEBUG)
762 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_CONNECTED "- Connection to "
763 MACSTR " completed [id=%d id_str=%s]",
764 MAC2STR(wpa_s->bssid),
765 ssid ? ssid->id : -1,
766 ssid && ssid->id_str ? ssid->id_str : "");
767 #endif /* CONFIG_CTRL_IFACE || !CONFIG_NO_STDOUT_DEBUG */
768 wpas_clear_temp_disabled(wpa_s, ssid, 1);
769 wpa_blacklist_clear(wpa_s);
770 wpa_s->extra_blacklist_count = 0;
771 wpa_s->new_connection = 0;
772 wpa_drv_set_operstate(wpa_s, 1);
773 #ifndef IEEE8021X_EAPOL
774 wpa_drv_set_supp_port(wpa_s, 1);
775 #endif /* IEEE8021X_EAPOL */
776 wpa_s->after_wps = 0;
777 wpa_s->known_wps_freq = 0;
778 wpas_p2p_completed(wpa_s);
780 sme_sched_obss_scan(wpa_s, 1);
781 } else if (state == WPA_DISCONNECTED || state == WPA_ASSOCIATING ||
782 state == WPA_ASSOCIATED) {
783 wpa_s->new_connection = 1;
784 wpa_drv_set_operstate(wpa_s, 0);
785 #ifndef IEEE8021X_EAPOL
786 wpa_drv_set_supp_port(wpa_s, 0);
787 #endif /* IEEE8021X_EAPOL */
788 sme_sched_obss_scan(wpa_s, 0);
790 wpa_s->wpa_state = state;
793 if (state == WPA_COMPLETED)
794 wpa_supplicant_start_bgscan(wpa_s);
795 else if (state < WPA_ASSOCIATED)
796 wpa_supplicant_stop_bgscan(wpa_s);
797 #endif /* CONFIG_BGSCAN */
799 if (state == WPA_AUTHENTICATING)
800 wpa_supplicant_stop_autoscan(wpa_s);
802 if (state == WPA_DISCONNECTED || state == WPA_INACTIVE)
803 wpa_supplicant_start_autoscan(wpa_s);
805 if (old_state >= WPA_ASSOCIATED && wpa_s->wpa_state < WPA_ASSOCIATED)
806 wmm_ac_notify_disassoc(wpa_s);
808 if (wpa_s->wpa_state != old_state) {
809 wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
812 * Notify the P2P Device interface about a state change in one
815 wpas_p2p_indicate_state_change(wpa_s);
817 if (wpa_s->wpa_state == WPA_COMPLETED ||
818 old_state == WPA_COMPLETED)
819 wpas_notify_auth_changed(wpa_s);
824 void wpa_supplicant_terminate_proc(struct wpa_global *global)
828 struct wpa_supplicant *wpa_s = global->ifaces;
830 struct wpa_supplicant *next = wpa_s->next;
831 if (wpas_wps_terminate_pending(wpa_s) == 1)
834 if (wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE ||
835 (wpa_s->current_ssid && wpa_s->current_ssid->p2p_group))
836 wpas_p2p_disconnect(wpa_s);
837 #endif /* CONFIG_P2P */
840 #endif /* CONFIG_WPS */
847 static void wpa_supplicant_terminate(int sig, void *signal_ctx)
849 struct wpa_global *global = signal_ctx;
850 wpa_supplicant_terminate_proc(global);
854 void wpa_supplicant_clear_status(struct wpa_supplicant *wpa_s)
856 enum wpa_states old_state = wpa_s->wpa_state;
858 wpa_s->pairwise_cipher = 0;
859 wpa_s->group_cipher = 0;
860 wpa_s->mgmt_group_cipher = 0;
862 if (wpa_s->wpa_state != WPA_INTERFACE_DISABLED)
863 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
865 if (wpa_s->wpa_state != old_state)
866 wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
871 * wpa_supplicant_reload_configuration - Reload configuration data
872 * @wpa_s: Pointer to wpa_supplicant data
873 * Returns: 0 on success or -1 if configuration parsing failed
875 * This function can be used to request that the configuration data is reloaded
876 * (e.g., after configuration file change). This function is reloading
877 * configuration only for one interface, so this may need to be called multiple
878 * times if %wpa_supplicant is controlling multiple interfaces and all
879 * interfaces need reconfiguration.
881 int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s)
883 struct wpa_config *conf;
887 if (wpa_s->confname == NULL)
889 conf = wpa_config_read(wpa_s->confname, NULL);
891 wpa_msg(wpa_s, MSG_ERROR, "Failed to parse the configuration "
892 "file '%s' - exiting", wpa_s->confname);
895 wpa_config_read(wpa_s->confanother, conf);
897 conf->changed_parameters = (unsigned int) -1;
899 reconf_ctrl = !!conf->ctrl_interface != !!wpa_s->conf->ctrl_interface
900 || (conf->ctrl_interface && wpa_s->conf->ctrl_interface &&
901 os_strcmp(conf->ctrl_interface,
902 wpa_s->conf->ctrl_interface) != 0);
904 if (reconf_ctrl && wpa_s->ctrl_iface) {
905 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
906 wpa_s->ctrl_iface = NULL;
909 eapol_sm_invalidate_cached_session(wpa_s->eapol);
910 if (wpa_s->current_ssid) {
911 if (wpa_s->wpa_state >= WPA_AUTHENTICATING)
912 wpa_s->own_disconnect_req = 1;
913 wpa_supplicant_deauthenticate(wpa_s,
914 WLAN_REASON_DEAUTH_LEAVING);
918 * TODO: should notify EAPOL SM about changes in opensc_engine_path,
919 * pkcs11_engine_path, pkcs11_module_path, openssl_ciphers.
921 if (wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt)) {
923 * Clear forced success to clear EAP state for next
926 eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
928 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
929 wpa_sm_set_config(wpa_s->wpa, NULL);
930 wpa_sm_pmksa_cache_flush(wpa_s->wpa, NULL);
931 wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
932 rsn_preauth_deinit(wpa_s->wpa);
934 old_ap_scan = wpa_s->conf->ap_scan;
935 wpa_config_free(wpa_s->conf);
937 if (old_ap_scan != wpa_s->conf->ap_scan)
938 wpas_notify_ap_scan_changed(wpa_s);
941 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
943 wpa_supplicant_update_config(wpa_s);
945 wpa_supplicant_clear_status(wpa_s);
946 if (wpa_supplicant_enabled_networks(wpa_s)) {
947 wpa_s->reassociate = 1;
948 wpa_supplicant_req_scan(wpa_s, 0, 0);
950 wpa_dbg(wpa_s, MSG_DEBUG, "Reconfiguration completed");
955 static void wpa_supplicant_reconfig(int sig, void *signal_ctx)
957 struct wpa_global *global = signal_ctx;
958 struct wpa_supplicant *wpa_s;
959 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
960 wpa_dbg(wpa_s, MSG_DEBUG, "Signal %d received - reconfiguring",
962 if (wpa_supplicant_reload_configuration(wpa_s) < 0) {
963 wpa_supplicant_terminate_proc(global);
967 if (wpa_debug_reopen_file() < 0) {
968 /* Ignore errors since we cannot really do much to fix this */
969 wpa_printf(MSG_DEBUG, "Could not reopen debug log file");
974 static int wpa_supplicant_suites_from_ai(struct wpa_supplicant *wpa_s,
975 struct wpa_ssid *ssid,
976 struct wpa_ie_data *ie)
978 int ret = wpa_sm_parse_own_wpa_ie(wpa_s->wpa, ie);
981 wpa_msg(wpa_s, MSG_INFO, "WPA: Failed to parse WPA IE "
982 "from association info");
987 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Using WPA IE from AssocReq to set "
989 if (!(ie->group_cipher & ssid->group_cipher)) {
990 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled group "
991 "cipher 0x%x (mask 0x%x) - reject",
992 ie->group_cipher, ssid->group_cipher);
995 if (!(ie->pairwise_cipher & ssid->pairwise_cipher)) {
996 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled pairwise "
997 "cipher 0x%x (mask 0x%x) - reject",
998 ie->pairwise_cipher, ssid->pairwise_cipher);
1001 if (!(ie->key_mgmt & ssid->key_mgmt)) {
1002 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled key "
1003 "management 0x%x (mask 0x%x) - reject",
1004 ie->key_mgmt, ssid->key_mgmt);
1008 #ifdef CONFIG_IEEE80211W
1009 if (!(ie->capabilities & WPA_CAPABILITY_MFPC) &&
1010 wpas_get_ssid_pmf(wpa_s, ssid) == MGMT_FRAME_PROTECTION_REQUIRED) {
1011 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver associated with an AP "
1012 "that does not support management frame protection - "
1016 #endif /* CONFIG_IEEE80211W */
1023 * wpa_supplicant_set_suites - Set authentication and encryption parameters
1024 * @wpa_s: Pointer to wpa_supplicant data
1025 * @bss: Scan results for the selected BSS, or %NULL if not available
1026 * @ssid: Configuration data for the selected network
1027 * @wpa_ie: Buffer for the WPA/RSN IE
1028 * @wpa_ie_len: Maximum wpa_ie buffer size on input. This is changed to be the
1029 * used buffer length in case the functions returns success.
1030 * Returns: 0 on success or -1 on failure
1032 * This function is used to configure authentication and encryption parameters
1033 * based on the network configuration and scan result for the selected BSS (if
1036 int wpa_supplicant_set_suites(struct wpa_supplicant *wpa_s,
1037 struct wpa_bss *bss, struct wpa_ssid *ssid,
1038 u8 *wpa_ie, size_t *wpa_ie_len)
1040 struct wpa_ie_data ie;
1042 const u8 *bss_wpa, *bss_rsn, *bss_osen;
1045 bss_wpa = wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE);
1046 bss_rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
1047 bss_osen = wpa_bss_get_vendor_ie(bss, OSEN_IE_VENDOR_TYPE);
1049 bss_wpa = bss_rsn = bss_osen = NULL;
1051 if (bss_rsn && (ssid->proto & WPA_PROTO_RSN) &&
1052 wpa_parse_wpa_ie(bss_rsn, 2 + bss_rsn[1], &ie) == 0 &&
1053 (ie.group_cipher & ssid->group_cipher) &&
1054 (ie.pairwise_cipher & ssid->pairwise_cipher) &&
1055 (ie.key_mgmt & ssid->key_mgmt)) {
1056 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using IEEE 802.11i/D9.0");
1057 proto = WPA_PROTO_RSN;
1058 } else if (bss_wpa && (ssid->proto & WPA_PROTO_WPA) &&
1059 wpa_parse_wpa_ie(bss_wpa, 2 + bss_wpa[1], &ie) == 0 &&
1060 (ie.group_cipher & ssid->group_cipher) &&
1061 (ie.pairwise_cipher & ssid->pairwise_cipher) &&
1062 (ie.key_mgmt & ssid->key_mgmt)) {
1063 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using IEEE 802.11i/D3.0");
1064 proto = WPA_PROTO_WPA;
1066 } else if (bss_osen && (ssid->proto & WPA_PROTO_OSEN)) {
1067 wpa_dbg(wpa_s, MSG_DEBUG, "HS 2.0: using OSEN");
1068 /* TODO: parse OSEN element */
1069 os_memset(&ie, 0, sizeof(ie));
1070 ie.group_cipher = WPA_CIPHER_CCMP;
1071 ie.pairwise_cipher = WPA_CIPHER_CCMP;
1072 ie.key_mgmt = WPA_KEY_MGMT_OSEN;
1073 proto = WPA_PROTO_OSEN;
1074 #endif /* CONFIG_HS20 */
1076 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select WPA/RSN");
1077 wpa_dbg(wpa_s, MSG_DEBUG,
1078 "WPA: ssid proto=0x%x pairwise_cipher=0x%x group_cipher=0x%x key_mgmt=0x%x",
1079 ssid->proto, ssid->pairwise_cipher, ssid->group_cipher,
1081 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: BSS " MACSTR " ssid='%s'%s%s%s",
1082 MAC2STR(bss->bssid),
1083 wpa_ssid_txt(bss->ssid, bss->ssid_len),
1084 bss_wpa ? " WPA" : "",
1085 bss_rsn ? " RSN" : "",
1086 bss_osen ? " OSEN" : "");
1088 wpa_hexdump(MSG_DEBUG, "RSN", bss_rsn, 2 + bss_rsn[1]);
1089 if (wpa_parse_wpa_ie(bss_rsn, 2 + bss_rsn[1], &ie)) {
1090 wpa_dbg(wpa_s, MSG_DEBUG,
1091 "Could not parse RSN element");
1093 wpa_dbg(wpa_s, MSG_DEBUG,
1094 "RSN: pairwise_cipher=0x%x group_cipher=0x%x key_mgmt=0x%x",
1095 ie.pairwise_cipher, ie.group_cipher,
1100 wpa_hexdump(MSG_DEBUG, "WPA", bss_wpa, 2 + bss_wpa[1]);
1101 if (wpa_parse_wpa_ie(bss_wpa, 2 + bss_wpa[1], &ie)) {
1102 wpa_dbg(wpa_s, MSG_DEBUG,
1103 "Could not parse WPA element");
1105 wpa_dbg(wpa_s, MSG_DEBUG,
1106 "WPA: pairwise_cipher=0x%x group_cipher=0x%x key_mgmt=0x%x",
1107 ie.pairwise_cipher, ie.group_cipher,
1113 if (ssid->proto & WPA_PROTO_OSEN)
1114 proto = WPA_PROTO_OSEN;
1115 else if (ssid->proto & WPA_PROTO_RSN)
1116 proto = WPA_PROTO_RSN;
1118 proto = WPA_PROTO_WPA;
1119 if (wpa_supplicant_suites_from_ai(wpa_s, ssid, &ie) < 0) {
1120 os_memset(&ie, 0, sizeof(ie));
1121 ie.group_cipher = ssid->group_cipher;
1122 ie.pairwise_cipher = ssid->pairwise_cipher;
1123 ie.key_mgmt = ssid->key_mgmt;
1124 #ifdef CONFIG_IEEE80211W
1125 ie.mgmt_group_cipher =
1126 ssid->ieee80211w != NO_MGMT_FRAME_PROTECTION ?
1127 WPA_CIPHER_AES_128_CMAC : 0;
1128 #endif /* CONFIG_IEEE80211W */
1129 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Set cipher suites "
1130 "based on configuration");
1135 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected cipher suites: group %d "
1136 "pairwise %d key_mgmt %d proto %d",
1137 ie.group_cipher, ie.pairwise_cipher, ie.key_mgmt, proto);
1138 #ifdef CONFIG_IEEE80211W
1139 if (ssid->ieee80211w) {
1140 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected mgmt group cipher %d",
1141 ie.mgmt_group_cipher);
1143 #endif /* CONFIG_IEEE80211W */
1145 wpa_s->wpa_proto = proto;
1146 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PROTO, proto);
1147 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED,
1148 !!(ssid->proto & (WPA_PROTO_RSN | WPA_PROTO_OSEN)));
1150 if (bss || !wpa_s->ap_ies_from_associnfo) {
1151 if (wpa_sm_set_ap_wpa_ie(wpa_s->wpa, bss_wpa,
1152 bss_wpa ? 2 + bss_wpa[1] : 0) ||
1153 wpa_sm_set_ap_rsn_ie(wpa_s->wpa, bss_rsn,
1154 bss_rsn ? 2 + bss_rsn[1] : 0))
1158 #ifdef CONFIG_NO_WPA
1159 wpa_s->group_cipher = WPA_CIPHER_NONE;
1160 wpa_s->pairwise_cipher = WPA_CIPHER_NONE;
1161 #else /* CONFIG_NO_WPA */
1162 sel = ie.group_cipher & ssid->group_cipher;
1163 wpa_s->group_cipher = wpa_pick_group_cipher(sel);
1164 if (wpa_s->group_cipher < 0) {
1165 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select group "
1169 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using GTK %s",
1170 wpa_cipher_txt(wpa_s->group_cipher));
1172 sel = ie.pairwise_cipher & ssid->pairwise_cipher;
1173 wpa_s->pairwise_cipher = wpa_pick_pairwise_cipher(sel, 1);
1174 if (wpa_s->pairwise_cipher < 0) {
1175 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select pairwise "
1179 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using PTK %s",
1180 wpa_cipher_txt(wpa_s->pairwise_cipher));
1181 #endif /* CONFIG_NO_WPA */
1183 sel = ie.key_mgmt & ssid->key_mgmt;
1185 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SAE))
1186 sel &= ~(WPA_KEY_MGMT_SAE | WPA_KEY_MGMT_FT_SAE);
1187 #endif /* CONFIG_SAE */
1189 #ifdef CONFIG_SUITEB192
1190 } else if (sel & WPA_KEY_MGMT_IEEE8021X_SUITE_B_192) {
1191 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SUITE_B_192;
1192 wpa_dbg(wpa_s, MSG_DEBUG,
1193 "WPA: using KEY_MGMT 802.1X with Suite B (192-bit)");
1194 #endif /* CONFIG_SUITEB192 */
1195 #ifdef CONFIG_SUITEB
1196 } else if (sel & WPA_KEY_MGMT_IEEE8021X_SUITE_B) {
1197 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SUITE_B;
1198 wpa_dbg(wpa_s, MSG_DEBUG,
1199 "WPA: using KEY_MGMT 802.1X with Suite B");
1200 #endif /* CONFIG_SUITEB */
1201 #ifdef CONFIG_IEEE80211R
1202 } else if (sel & WPA_KEY_MGMT_FT_IEEE8021X) {
1203 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_IEEE8021X;
1204 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/802.1X");
1205 } else if (sel & WPA_KEY_MGMT_FT_PSK) {
1206 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_PSK;
1207 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/PSK");
1208 #endif /* CONFIG_IEEE80211R */
1210 } else if (sel & WPA_KEY_MGMT_SAE) {
1211 wpa_s->key_mgmt = WPA_KEY_MGMT_SAE;
1212 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT SAE");
1213 } else if (sel & WPA_KEY_MGMT_FT_SAE) {
1214 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_SAE;
1215 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT FT/SAE");
1216 #endif /* CONFIG_SAE */
1217 #ifdef CONFIG_IEEE80211W
1218 } else if (sel & WPA_KEY_MGMT_IEEE8021X_SHA256) {
1219 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SHA256;
1220 wpa_dbg(wpa_s, MSG_DEBUG,
1221 "WPA: using KEY_MGMT 802.1X with SHA256");
1222 } else if (sel & WPA_KEY_MGMT_PSK_SHA256) {
1223 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK_SHA256;
1224 wpa_dbg(wpa_s, MSG_DEBUG,
1225 "WPA: using KEY_MGMT PSK with SHA256");
1226 #endif /* CONFIG_IEEE80211W */
1227 } else if (sel & WPA_KEY_MGMT_IEEE8021X) {
1228 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X;
1229 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT 802.1X");
1230 } else if (sel & WPA_KEY_MGMT_PSK) {
1231 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK;
1232 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-PSK");
1233 } else if (sel & WPA_KEY_MGMT_WPA_NONE) {
1234 wpa_s->key_mgmt = WPA_KEY_MGMT_WPA_NONE;
1235 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-NONE");
1237 } else if (sel & WPA_KEY_MGMT_OSEN) {
1238 wpa_s->key_mgmt = WPA_KEY_MGMT_OSEN;
1239 wpa_dbg(wpa_s, MSG_DEBUG, "HS 2.0: using KEY_MGMT OSEN");
1240 #endif /* CONFIG_HS20 */
1242 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select "
1243 "authenticated key management type");
1247 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
1248 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
1249 wpa_s->pairwise_cipher);
1250 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
1252 #ifdef CONFIG_IEEE80211W
1253 sel = ie.mgmt_group_cipher;
1254 if (wpas_get_ssid_pmf(wpa_s, ssid) == NO_MGMT_FRAME_PROTECTION ||
1255 !(ie.capabilities & WPA_CAPABILITY_MFPC))
1257 if (sel & WPA_CIPHER_AES_128_CMAC) {
1258 wpa_s->mgmt_group_cipher = WPA_CIPHER_AES_128_CMAC;
1259 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1261 } else if (sel & WPA_CIPHER_BIP_GMAC_128) {
1262 wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_GMAC_128;
1263 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1265 } else if (sel & WPA_CIPHER_BIP_GMAC_256) {
1266 wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_GMAC_256;
1267 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1269 } else if (sel & WPA_CIPHER_BIP_CMAC_256) {
1270 wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_CMAC_256;
1271 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1274 wpa_s->mgmt_group_cipher = 0;
1275 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: not using MGMT group cipher");
1277 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
1278 wpa_s->mgmt_group_cipher);
1279 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MFP,
1280 wpas_get_ssid_pmf(wpa_s, ssid));
1281 #endif /* CONFIG_IEEE80211W */
1283 if (wpa_sm_set_assoc_wpa_ie_default(wpa_s->wpa, wpa_ie, wpa_ie_len)) {
1284 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to generate WPA IE");
1288 if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt)) {
1291 if (ssid->psk_set) {
1292 wpa_sm_set_pmk(wpa_s->wpa, ssid->psk, PMK_LEN, NULL);
1295 #ifndef CONFIG_NO_PBKDF2
1296 if (bss && ssid->bssid_set && ssid->ssid_len == 0 &&
1299 pbkdf2_sha1(ssid->passphrase, bss->ssid, bss->ssid_len,
1300 4096, psk, PMK_LEN);
1301 wpa_hexdump_key(MSG_MSGDUMP, "PSK (from passphrase)",
1303 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN, NULL);
1305 os_memset(psk, 0, sizeof(psk));
1307 #endif /* CONFIG_NO_PBKDF2 */
1308 #ifdef CONFIG_EXT_PASSWORD
1309 if (ssid->ext_psk) {
1310 struct wpabuf *pw = ext_password_get(wpa_s->ext_pw,
1312 char pw_str[64 + 1];
1316 wpa_msg(wpa_s, MSG_INFO, "EXT PW: No PSK "
1317 "found from external storage");
1321 if (wpabuf_len(pw) < 8 || wpabuf_len(pw) > 64) {
1322 wpa_msg(wpa_s, MSG_INFO, "EXT PW: Unexpected "
1323 "PSK length %d in external storage",
1324 (int) wpabuf_len(pw));
1325 ext_password_free(pw);
1329 os_memcpy(pw_str, wpabuf_head(pw), wpabuf_len(pw));
1330 pw_str[wpabuf_len(pw)] = '\0';
1332 #ifndef CONFIG_NO_PBKDF2
1333 if (wpabuf_len(pw) >= 8 && wpabuf_len(pw) < 64 && bss)
1335 pbkdf2_sha1(pw_str, bss->ssid, bss->ssid_len,
1336 4096, psk, PMK_LEN);
1337 os_memset(pw_str, 0, sizeof(pw_str));
1338 wpa_hexdump_key(MSG_MSGDUMP, "PSK (from "
1339 "external passphrase)",
1341 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN, NULL);
1343 os_memset(psk, 0, sizeof(psk));
1345 #endif /* CONFIG_NO_PBKDF2 */
1346 if (wpabuf_len(pw) == 2 * PMK_LEN) {
1347 if (hexstr2bin(pw_str, psk, PMK_LEN) < 0) {
1348 wpa_msg(wpa_s, MSG_INFO, "EXT PW: "
1349 "Invalid PSK hex string");
1350 os_memset(pw_str, 0, sizeof(pw_str));
1351 ext_password_free(pw);
1354 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN, NULL);
1356 os_memset(psk, 0, sizeof(psk));
1358 wpa_msg(wpa_s, MSG_INFO, "EXT PW: No suitable "
1360 os_memset(pw_str, 0, sizeof(pw_str));
1361 ext_password_free(pw);
1365 os_memset(pw_str, 0, sizeof(pw_str));
1366 ext_password_free(pw);
1368 #endif /* CONFIG_EXT_PASSWORD */
1371 wpa_msg(wpa_s, MSG_INFO,
1372 "No PSK available for association");
1376 wpa_sm_set_pmk_from_pmksa(wpa_s->wpa);
1382 static void wpas_ext_capab_byte(struct wpa_supplicant *wpa_s, u8 *pos, int idx)
1387 case 0: /* Bits 0-7 */
1389 case 1: /* Bits 8-15 */
1391 case 2: /* Bits 16-23 */
1393 *pos |= 0x02; /* Bit 17 - WNM-Sleep Mode */
1394 *pos |= 0x08; /* Bit 19 - BSS Transition */
1395 #endif /* CONFIG_WNM */
1397 case 3: /* Bits 24-31 */
1399 *pos |= 0x02; /* Bit 25 - SSID List */
1400 #endif /* CONFIG_WNM */
1401 #ifdef CONFIG_INTERWORKING
1402 if (wpa_s->conf->interworking)
1403 *pos |= 0x80; /* Bit 31 - Interworking */
1404 #endif /* CONFIG_INTERWORKING */
1406 case 4: /* Bits 32-39 */
1407 #ifdef CONFIG_INTERWORKING
1408 if (wpa_s->drv_flags / WPA_DRIVER_FLAGS_QOS_MAPPING)
1409 *pos |= 0x01; /* Bit 32 - QoS Map */
1410 #endif /* CONFIG_INTERWORKING */
1412 case 5: /* Bits 40-47 */
1414 if (wpa_s->conf->hs20)
1415 *pos |= 0x40; /* Bit 46 - WNM-Notification */
1416 #endif /* CONFIG_HS20 */
1418 case 6: /* Bits 48-55 */
1424 int wpas_build_ext_capab(struct wpa_supplicant *wpa_s, u8 *buf, size_t buflen)
1429 if (len < wpa_s->extended_capa_len)
1430 len = wpa_s->extended_capa_len;
1431 if (buflen < (size_t) len + 2) {
1432 wpa_printf(MSG_INFO,
1433 "Not enough room for building extended capabilities element");
1437 *pos++ = WLAN_EID_EXT_CAPAB;
1439 for (i = 0; i < len; i++, pos++) {
1440 wpas_ext_capab_byte(wpa_s, pos, i);
1442 if (i < wpa_s->extended_capa_len) {
1443 *pos &= ~wpa_s->extended_capa_mask[i];
1444 *pos |= wpa_s->extended_capa[i];
1448 while (len > 0 && buf[1 + len] == 0) {
1459 static int wpas_valid_bss(struct wpa_supplicant *wpa_s,
1460 struct wpa_bss *test_bss)
1462 struct wpa_bss *bss;
1464 dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
1465 if (bss == test_bss)
1473 static int wpas_valid_ssid(struct wpa_supplicant *wpa_s,
1474 struct wpa_ssid *test_ssid)
1476 struct wpa_ssid *ssid;
1478 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) {
1479 if (ssid == test_ssid)
1487 int wpas_valid_bss_ssid(struct wpa_supplicant *wpa_s, struct wpa_bss *test_bss,
1488 struct wpa_ssid *test_ssid)
1490 if (test_bss && !wpas_valid_bss(wpa_s, test_bss))
1493 return test_ssid == NULL || wpas_valid_ssid(wpa_s, test_ssid);
1497 void wpas_connect_work_free(struct wpa_connect_work *cwork)
1505 void wpas_connect_work_done(struct wpa_supplicant *wpa_s)
1507 struct wpa_connect_work *cwork;
1508 struct wpa_radio_work *work = wpa_s->connect_work;
1513 wpa_s->connect_work = NULL;
1516 wpas_connect_work_free(cwork);
1517 radio_work_done(work);
1521 int wpas_update_random_addr(struct wpa_supplicant *wpa_s, int style)
1523 struct os_reltime now;
1526 os_get_reltime(&now);
1527 if (wpa_s->last_mac_addr_style == style &&
1528 wpa_s->last_mac_addr_change.sec != 0 &&
1529 !os_reltime_expired(&now, &wpa_s->last_mac_addr_change,
1530 wpa_s->conf->rand_addr_lifetime)) {
1531 wpa_msg(wpa_s, MSG_DEBUG,
1532 "Previously selected random MAC address has not yet expired");
1538 if (random_mac_addr(addr) < 0)
1542 os_memcpy(addr, wpa_s->perm_addr, ETH_ALEN);
1543 if (random_mac_addr_keep_oui(addr) < 0)
1550 if (wpa_drv_set_mac_addr(wpa_s, addr) < 0) {
1551 wpa_msg(wpa_s, MSG_INFO,
1552 "Failed to set random MAC address");
1556 os_get_reltime(&wpa_s->last_mac_addr_change);
1557 wpa_s->mac_addr_changed = 1;
1558 wpa_s->last_mac_addr_style = style;
1560 if (wpa_supplicant_update_mac_addr(wpa_s) < 0) {
1561 wpa_msg(wpa_s, MSG_INFO,
1562 "Could not update MAC address information");
1566 wpa_msg(wpa_s, MSG_DEBUG, "Using random MAC address " MACSTR,
1573 int wpas_update_random_addr_disassoc(struct wpa_supplicant *wpa_s)
1575 if (wpa_s->wpa_state >= WPA_AUTHENTICATING ||
1576 !wpa_s->conf->preassoc_mac_addr)
1579 return wpas_update_random_addr(wpa_s, wpa_s->conf->preassoc_mac_addr);
1583 static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit);
1586 * wpa_supplicant_associate - Request association
1587 * @wpa_s: Pointer to wpa_supplicant data
1588 * @bss: Scan results for the selected BSS, or %NULL if not available
1589 * @ssid: Configuration data for the selected network
1591 * This function is used to request %wpa_supplicant to associate with a BSS.
1593 void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
1594 struct wpa_bss *bss, struct wpa_ssid *ssid)
1596 struct wpa_connect_work *cwork;
1599 wpa_s->own_disconnect_req = 0;
1601 if (ssid->mac_addr == -1)
1602 rand_style = wpa_s->conf->mac_addr;
1604 rand_style = ssid->mac_addr;
1606 wmm_ac_clear_saved_tspecs(wpa_s);
1607 wpa_s->reassoc_same_bss = 0;
1609 if (wpa_s->last_ssid == ssid) {
1610 wpa_dbg(wpa_s, MSG_DEBUG, "Re-association to the same ESS");
1611 if (wpa_s->current_bss && wpa_s->current_bss == bss) {
1612 wmm_ac_save_tspecs(wpa_s);
1613 wpa_s->reassoc_same_bss = 1;
1615 } else if (rand_style > 0) {
1616 if (wpas_update_random_addr(wpa_s, rand_style) < 0)
1618 wpa_sm_pmksa_cache_flush(wpa_s->wpa, ssid);
1619 } else if (wpa_s->mac_addr_changed) {
1620 if (wpa_drv_set_mac_addr(wpa_s, NULL) < 0) {
1621 wpa_msg(wpa_s, MSG_INFO,
1622 "Could not restore permanent MAC address");
1625 wpa_s->mac_addr_changed = 0;
1626 if (wpa_supplicant_update_mac_addr(wpa_s) < 0) {
1627 wpa_msg(wpa_s, MSG_INFO,
1628 "Could not update MAC address information");
1631 wpa_msg(wpa_s, MSG_DEBUG, "Using permanent MAC address");
1633 wpa_s->last_ssid = ssid;
1635 #ifdef CONFIG_IBSS_RSN
1636 ibss_rsn_deinit(wpa_s->ibss_rsn);
1637 wpa_s->ibss_rsn = NULL;
1638 #endif /* CONFIG_IBSS_RSN */
1640 if (ssid->mode == WPAS_MODE_AP || ssid->mode == WPAS_MODE_P2P_GO ||
1641 ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) {
1643 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_AP)) {
1644 wpa_msg(wpa_s, MSG_INFO, "Driver does not support AP "
1648 if (wpa_supplicant_create_ap(wpa_s, ssid) < 0) {
1649 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
1650 if (ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION)
1651 wpas_p2p_ap_setup_failed(wpa_s);
1654 wpa_s->current_bss = bss;
1655 #else /* CONFIG_AP */
1656 wpa_msg(wpa_s, MSG_ERROR, "AP mode support not included in "
1658 #endif /* CONFIG_AP */
1662 if (ssid->mode == WPAS_MODE_MESH) {
1664 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_MESH)) {
1665 wpa_msg(wpa_s, MSG_INFO,
1666 "Driver does not support mesh mode");
1670 ssid->frequency = bss->freq;
1671 if (wpa_supplicant_join_mesh(wpa_s, ssid) < 0) {
1672 wpa_msg(wpa_s, MSG_ERROR, "Could not join mesh");
1675 wpa_s->current_bss = bss;
1676 wpa_msg_ctrl(wpa_s, MSG_INFO, MESH_GROUP_STARTED
1677 "ssid=\"%s\" id=%d",
1678 wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
1680 #else /* CONFIG_MESH */
1681 wpa_msg(wpa_s, MSG_ERROR,
1682 "mesh mode support not included in the build");
1683 #endif /* CONFIG_MESH */
1689 wpa_tdls_ap_ies(wpa_s->wpa, (const u8 *) (bss + 1),
1691 #endif /* CONFIG_TDLS */
1693 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) &&
1694 ssid->mode == IEEE80211_MODE_INFRA) {
1695 sme_authenticate(wpa_s, bss, ssid);
1699 if (wpa_s->connect_work) {
1700 wpa_dbg(wpa_s, MSG_DEBUG, "Reject wpa_supplicant_associate() call since connect_work exist");
1704 if (radio_work_pending(wpa_s, "connect")) {
1705 wpa_dbg(wpa_s, MSG_DEBUG, "Reject wpa_supplicant_associate() call since pending work exist");
1709 cwork = os_zalloc(sizeof(*cwork));
1716 if (radio_add_work(wpa_s, bss ? bss->freq : 0, "connect", 1,
1717 wpas_start_assoc_cb, cwork) < 0) {
1723 static int bss_is_ibss(struct wpa_bss *bss)
1725 return (bss->caps & (IEEE80211_CAP_ESS | IEEE80211_CAP_IBSS)) ==
1730 static int drv_supports_vht(struct wpa_supplicant *wpa_s,
1731 const struct wpa_ssid *ssid)
1733 enum hostapd_hw_mode hw_mode;
1734 struct hostapd_hw_modes *mode = NULL;
1738 #ifdef CONFIG_HT_OVERRIDES
1739 if (ssid->disable_ht)
1741 #endif /* CONFIG_HT_OVERRIDES */
1743 hw_mode = ieee80211_freq_to_chan(ssid->frequency, &channel);
1744 if (hw_mode == NUM_HOSTAPD_MODES)
1746 for (i = 0; wpa_s->hw.modes && i < wpa_s->hw.num_modes; i++) {
1747 if (wpa_s->hw.modes[i].mode == hw_mode) {
1748 mode = &wpa_s->hw.modes[i];
1756 return mode->vht_capab != 0;
1760 void ibss_mesh_setup_freq(struct wpa_supplicant *wpa_s,
1761 const struct wpa_ssid *ssid,
1762 struct hostapd_freq_params *freq)
1764 enum hostapd_hw_mode hw_mode;
1765 struct hostapd_hw_modes *mode = NULL;
1766 int ht40plus[] = { 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157,
1768 int vht80[] = { 36, 52, 100, 116, 132, 149 };
1769 struct hostapd_channel_data *pri_chan = NULL, *sec_chan = NULL;
1771 int i, chan_idx, ht40 = -1, res, obss_scan = 1;
1773 struct hostapd_freq_params vht_freq;
1775 freq->freq = ssid->frequency;
1777 for (j = 0; j < wpa_s->last_scan_res_used; j++) {
1778 struct wpa_bss *bss = wpa_s->last_scan_res[j];
1780 if (ssid->mode != WPAS_MODE_IBSS)
1783 /* Don't adjust control freq in case of fixed_freq */
1784 if (ssid->fixed_freq)
1787 if (!bss_is_ibss(bss))
1790 if (ssid->ssid_len == bss->ssid_len &&
1791 os_memcmp(ssid->ssid, bss->ssid, bss->ssid_len) == 0) {
1792 wpa_printf(MSG_DEBUG,
1793 "IBSS already found in scan results, adjust control freq: %d",
1795 freq->freq = bss->freq;
1801 /* For IBSS check HT_IBSS flag */
1802 if (ssid->mode == WPAS_MODE_IBSS &&
1803 !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_HT_IBSS))
1806 if (wpa_s->group_cipher == WPA_CIPHER_WEP40 ||
1807 wpa_s->group_cipher == WPA_CIPHER_WEP104 ||
1808 wpa_s->pairwise_cipher == WPA_CIPHER_TKIP) {
1809 wpa_printf(MSG_DEBUG,
1810 "IBSS: WEP/TKIP detected, do not try to enable HT");
1814 hw_mode = ieee80211_freq_to_chan(freq->freq, &channel);
1815 for (i = 0; wpa_s->hw.modes && i < wpa_s->hw.num_modes; i++) {
1816 if (wpa_s->hw.modes[i].mode == hw_mode) {
1817 mode = &wpa_s->hw.modes[i];
1825 freq->ht_enabled = ht_supported(mode);
1826 if (!freq->ht_enabled)
1829 /* Setup higher BW only for 5 GHz */
1830 if (mode->mode != HOSTAPD_MODE_IEEE80211A)
1833 for (chan_idx = 0; chan_idx < mode->num_channels; chan_idx++) {
1834 pri_chan = &mode->channels[chan_idx];
1835 if (pri_chan->chan == channel)
1842 /* Check primary channel flags */
1843 if (pri_chan->flag & (HOSTAPD_CHAN_DISABLED | HOSTAPD_CHAN_NO_IR))
1846 /* Check/setup HT40+/HT40- */
1847 for (j = 0; j < ARRAY_SIZE(ht40plus); j++) {
1848 if (ht40plus[j] == channel) {
1854 /* Find secondary channel */
1855 for (i = 0; i < mode->num_channels; i++) {
1856 sec_chan = &mode->channels[i];
1857 if (sec_chan->chan == channel + ht40 * 4)
1864 /* Check secondary channel flags */
1865 if (sec_chan->flag & (HOSTAPD_CHAN_DISABLED | HOSTAPD_CHAN_NO_IR))
1868 freq->channel = pri_chan->chan;
1872 if (!(pri_chan->flag & HOSTAPD_CHAN_HT40MINUS))
1874 freq->sec_channel_offset = -1;
1877 if (!(pri_chan->flag & HOSTAPD_CHAN_HT40PLUS))
1879 freq->sec_channel_offset = 1;
1885 if (freq->sec_channel_offset && obss_scan) {
1886 struct wpa_scan_results *scan_res;
1888 scan_res = wpa_supplicant_get_scan_results(wpa_s, NULL, 0);
1889 if (scan_res == NULL) {
1891 freq->sec_channel_offset = 0;
1895 res = check_40mhz_5g(mode, scan_res, pri_chan->chan,
1900 freq->sec_channel_offset = 0;
1903 /* Configuration allowed */
1906 /* Switch pri/sec channels */
1907 freq->freq = hw_get_freq(mode, sec_chan->chan);
1908 freq->sec_channel_offset = -freq->sec_channel_offset;
1909 freq->channel = sec_chan->chan;
1912 freq->sec_channel_offset = 0;
1916 wpa_scan_results_free(scan_res);
1919 wpa_printf(MSG_DEBUG,
1920 "IBSS/mesh: setup freq channel %d, sec_channel_offset %d",
1921 freq->channel, freq->sec_channel_offset);
1923 if (!drv_supports_vht(wpa_s, ssid))
1926 /* For IBSS check VHT_IBSS flag */
1927 if (ssid->mode == WPAS_MODE_IBSS &&
1928 !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_VHT_IBSS))
1933 vht_freq.vht_enabled = vht_supported(mode);
1934 if (!vht_freq.vht_enabled)
1937 /* setup center_freq1, bandwidth */
1938 for (j = 0; j < ARRAY_SIZE(vht80); j++) {
1939 if (freq->channel >= vht80[j] &&
1940 freq->channel < vht80[j] + 16)
1944 if (j == ARRAY_SIZE(vht80))
1947 for (i = vht80[j]; i < vht80[j] + 16; i += 4) {
1948 struct hostapd_channel_data *chan;
1950 chan = hw_get_channel_chan(mode, i, NULL);
1954 /* Back to HT configuration if channel not usable */
1955 if (chan->flag & (HOSTAPD_CHAN_DISABLED | HOSTAPD_CHAN_NO_IR))
1959 if (hostapd_set_freq_params(&vht_freq, mode->mode, freq->freq,
1960 freq->channel, freq->ht_enabled,
1961 vht_freq.vht_enabled,
1962 freq->sec_channel_offset,
1963 VHT_CHANWIDTH_80MHZ,
1964 vht80[j] + 6, 0, 0) != 0)
1969 wpa_printf(MSG_DEBUG, "IBSS: VHT setup freq cf1 %d, cf2 %d, bw %d",
1970 freq->center_freq1, freq->center_freq2, freq->bandwidth);
1974 static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
1976 struct wpa_connect_work *cwork = work->ctx;
1977 struct wpa_bss *bss = cwork->bss;
1978 struct wpa_ssid *ssid = cwork->ssid;
1979 struct wpa_supplicant *wpa_s = work->wpa_s;
1982 int use_crypt, ret, i, bssid_changed;
1983 int algs = WPA_AUTH_ALG_OPEN;
1984 unsigned int cipher_pairwise, cipher_group;
1985 struct wpa_driver_associate_params params;
1986 int wep_keys_set = 0;
1987 int assoc_failed = 0;
1988 struct wpa_ssid *old_ssid;
1989 #ifdef CONFIG_HT_OVERRIDES
1990 struct ieee80211_ht_capabilities htcaps;
1991 struct ieee80211_ht_capabilities htcaps_mask;
1992 #endif /* CONFIG_HT_OVERRIDES */
1993 #ifdef CONFIG_VHT_OVERRIDES
1994 struct ieee80211_vht_capabilities vhtcaps;
1995 struct ieee80211_vht_capabilities vhtcaps_mask;
1996 #endif /* CONFIG_VHT_OVERRIDES */
1999 if (work->started) {
2000 wpa_s->connect_work = NULL;
2002 /* cancel possible auth. timeout */
2003 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s,
2006 wpas_connect_work_free(cwork);
2010 wpa_s->connect_work = work;
2012 if (cwork->bss_removed || !wpas_valid_bss_ssid(wpa_s, bss, ssid) ||
2013 wpas_network_disabled(wpa_s, ssid)) {
2014 wpa_dbg(wpa_s, MSG_DEBUG, "BSS/SSID entry for association not valid anymore - drop connection attempt");
2015 wpas_connect_work_done(wpa_s);
2019 os_memset(¶ms, 0, sizeof(params));
2020 wpa_s->reassociate = 0;
2021 wpa_s->eap_expected_failure = 0;
2023 (!wpas_driver_bss_selection(wpa_s) || wpas_wps_searching(wpa_s))) {
2024 #ifdef CONFIG_IEEE80211R
2025 const u8 *ie, *md = NULL;
2026 #endif /* CONFIG_IEEE80211R */
2027 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with " MACSTR
2028 " (SSID='%s' freq=%d MHz)", MAC2STR(bss->bssid),
2029 wpa_ssid_txt(bss->ssid, bss->ssid_len), bss->freq);
2030 bssid_changed = !is_zero_ether_addr(wpa_s->bssid);
2031 os_memset(wpa_s->bssid, 0, ETH_ALEN);
2032 os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN);
2034 wpas_notify_bssid_changed(wpa_s);
2035 #ifdef CONFIG_IEEE80211R
2036 ie = wpa_bss_get_ie(bss, WLAN_EID_MOBILITY_DOMAIN);
2037 if (ie && ie[1] >= MOBILITY_DOMAIN_ID_LEN)
2039 wpa_sm_set_ft_params(wpa_s->wpa, ie, ie ? 2 + ie[1] : 0);
2041 /* Prepare for the next transition */
2042 wpa_ft_prepare_auth_request(wpa_s->wpa, ie);
2044 #endif /* CONFIG_IEEE80211R */
2046 } else if ((ssid->ssid == NULL || ssid->ssid_len == 0) &&
2047 wpa_s->conf->ap_scan == 2 &&
2048 (ssid->key_mgmt & WPA_KEY_MGMT_WPS)) {
2049 /* Use ap_scan==1 style network selection to find the network
2051 wpas_connect_work_done(wpa_s);
2052 wpa_s->scan_req = MANUAL_SCAN_REQ;
2053 wpa_s->reassociate = 1;
2054 wpa_supplicant_req_scan(wpa_s, 0, 0);
2056 #endif /* CONFIG_WPS */
2058 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with SSID '%s'",
2059 wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
2060 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
2063 wpa_supplicant_cancel_sched_scan(wpa_s);
2065 wpa_supplicant_cancel_scan(wpa_s);
2067 /* Starting new association, so clear the possibly used WPA IE from the
2068 * previous association. */
2069 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
2071 #ifdef IEEE8021X_EAPOL
2072 if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
2074 if (ssid->non_leap == 0)
2075 algs = WPA_AUTH_ALG_LEAP;
2077 algs |= WPA_AUTH_ALG_LEAP;
2080 #endif /* IEEE8021X_EAPOL */
2081 wpa_dbg(wpa_s, MSG_DEBUG, "Automatic auth_alg selection: 0x%x", algs);
2082 if (ssid->auth_alg) {
2083 algs = ssid->auth_alg;
2084 wpa_dbg(wpa_s, MSG_DEBUG, "Overriding auth_alg selection: "
2088 if (bss && (wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE) ||
2089 wpa_bss_get_ie(bss, WLAN_EID_RSN)) &&
2090 wpa_key_mgmt_wpa(ssid->key_mgmt)) {
2091 int try_opportunistic;
2092 try_opportunistic = (ssid->proactive_key_caching < 0 ?
2094 ssid->proactive_key_caching) &&
2095 (ssid->proto & WPA_PROTO_RSN);
2096 if (pmksa_cache_set_current(wpa_s->wpa, NULL, bss->bssid,
2097 ssid, try_opportunistic) == 0)
2098 eapol_sm_notify_pmkid_attempt(wpa_s->eapol);
2099 wpa_ie_len = sizeof(wpa_ie);
2100 if (wpa_supplicant_set_suites(wpa_s, bss, ssid,
2101 wpa_ie, &wpa_ie_len)) {
2102 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA "
2103 "key management and encryption suites");
2104 wpas_connect_work_done(wpa_s);
2107 } else if ((ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) && bss &&
2108 wpa_key_mgmt_wpa_ieee8021x(ssid->key_mgmt)) {
2110 * Both WPA and non-WPA IEEE 802.1X enabled in configuration -
2111 * use non-WPA since the scan results did not indicate that the
2112 * AP is using WPA or WPA2.
2114 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
2116 wpa_s->wpa_proto = 0;
2117 } else if (wpa_key_mgmt_wpa_any(ssid->key_mgmt)) {
2118 wpa_ie_len = sizeof(wpa_ie);
2119 if (wpa_supplicant_set_suites(wpa_s, NULL, ssid,
2120 wpa_ie, &wpa_ie_len)) {
2121 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA "
2122 "key management and encryption suites (no "
2124 wpas_connect_work_done(wpa_s);
2128 } else if (ssid->key_mgmt & WPA_KEY_MGMT_WPS) {
2129 struct wpabuf *wps_ie;
2130 wps_ie = wps_build_assoc_req_ie(wpas_wps_get_req_type(ssid));
2131 if (wps_ie && wpabuf_len(wps_ie) <= sizeof(wpa_ie)) {
2132 wpa_ie_len = wpabuf_len(wps_ie);
2133 os_memcpy(wpa_ie, wpabuf_head(wps_ie), wpa_ie_len);
2136 wpabuf_free(wps_ie);
2137 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
2138 if (!bss || (bss->caps & IEEE80211_CAP_PRIVACY))
2139 params.wps = WPS_MODE_PRIVACY;
2141 params.wps = WPS_MODE_OPEN;
2142 wpa_s->wpa_proto = 0;
2143 #endif /* CONFIG_WPS */
2145 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
2147 wpa_s->wpa_proto = 0;
2151 if (wpa_s->global->p2p) {
2155 pos = wpa_ie + wpa_ie_len;
2156 len = sizeof(wpa_ie) - wpa_ie_len;
2157 res = wpas_p2p_assoc_req_ie(wpa_s, bss, pos, len,
2163 wpa_s->cross_connect_disallowed = 0;
2166 p2p = wpa_bss_get_vendor_ie_multi(bss, P2P_IE_VENDOR_TYPE);
2168 wpa_s->cross_connect_disallowed =
2169 p2p_get_cross_connect_disallowed(p2p);
2171 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: WLAN AP %s cross "
2173 wpa_s->cross_connect_disallowed ?
2174 "disallows" : "allows");
2178 os_memset(wpa_s->p2p_ip_addr_info, 0, sizeof(wpa_s->p2p_ip_addr_info));
2179 #endif /* CONFIG_P2P */
2182 if (is_hs20_network(wpa_s, ssid, bss)) {
2183 struct wpabuf *hs20;
2184 hs20 = wpabuf_alloc(20);
2186 int pps_mo_id = hs20_get_pps_mo_id(wpa_s, ssid);
2189 wpas_hs20_add_indication(hs20, pps_mo_id);
2190 len = sizeof(wpa_ie) - wpa_ie_len;
2191 if (wpabuf_len(hs20) <= len) {
2192 os_memcpy(wpa_ie + wpa_ie_len,
2193 wpabuf_head(hs20), wpabuf_len(hs20));
2194 wpa_ie_len += wpabuf_len(hs20);
2199 #endif /* CONFIG_HS20 */
2202 * Workaround: Add Extended Capabilities element only if the AP
2203 * included this element in Beacon/Probe Response frames. Some older
2204 * APs seem to have interoperability issues if this element is
2205 * included, so while the standard may require us to include the
2206 * element in all cases, it is justifiable to skip it to avoid
2207 * interoperability issues.
2209 if (!bss || wpa_bss_get_ie(bss, WLAN_EID_EXT_CAPAB)) {
2212 ext_capab_len = wpas_build_ext_capab(wpa_s, ext_capab,
2214 if (ext_capab_len > 0) {
2216 if (wpa_ie_len > 0 && pos[0] == WLAN_EID_RSN)
2218 os_memmove(pos + ext_capab_len, pos,
2219 wpa_ie_len - (pos - wpa_ie));
2220 wpa_ie_len += ext_capab_len;
2221 os_memcpy(pos, ext_capab, ext_capab_len);
2225 if (wpa_s->vendor_elem[VENDOR_ELEM_ASSOC_REQ]) {
2226 struct wpabuf *buf = wpa_s->vendor_elem[VENDOR_ELEM_ASSOC_REQ];
2229 len = sizeof(wpa_ie) - wpa_ie_len;
2230 if (wpabuf_len(buf) <= len) {
2231 os_memcpy(wpa_ie + wpa_ie_len,
2232 wpabuf_head(buf), wpabuf_len(buf));
2233 wpa_ie_len += wpabuf_len(buf);
2238 if (wpa_s->fst_ies) {
2239 int fst_ies_len = wpabuf_len(wpa_s->fst_ies);
2241 if (wpa_ie_len + fst_ies_len <= sizeof(wpa_ie)) {
2242 os_memcpy(wpa_ie + wpa_ie_len,
2243 wpabuf_head(wpa_s->fst_ies), fst_ies_len);
2244 wpa_ie_len += fst_ies_len;
2247 #endif /* CONFIG_FST */
2249 wpa_clear_keys(wpa_s, bss ? bss->bssid : NULL);
2251 cipher_pairwise = wpa_s->pairwise_cipher;
2252 cipher_group = wpa_s->group_cipher;
2253 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
2254 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
2255 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE)
2257 if (wpa_set_wep_keys(wpa_s, ssid)) {
2262 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS)
2265 #ifdef IEEE8021X_EAPOL
2266 if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
2267 if ((ssid->eapol_flags &
2268 (EAPOL_FLAG_REQUIRE_KEY_UNICAST |
2269 EAPOL_FLAG_REQUIRE_KEY_BROADCAST)) == 0 &&
2273 /* Assume that dynamic WEP-104 keys will be used and
2274 * set cipher suites in order for drivers to expect
2276 cipher_pairwise = cipher_group = WPA_CIPHER_WEP104;
2279 #endif /* IEEE8021X_EAPOL */
2281 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
2282 /* Set the key before (and later after) association */
2283 wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
2286 wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING);
2288 params.ssid = bss->ssid;
2289 params.ssid_len = bss->ssid_len;
2290 if (!wpas_driver_bss_selection(wpa_s) || ssid->bssid_set) {
2291 wpa_printf(MSG_DEBUG, "Limit connection to BSSID "
2292 MACSTR " freq=%u MHz based on scan results "
2294 MAC2STR(bss->bssid), bss->freq,
2296 params.bssid = bss->bssid;
2297 params.freq.freq = bss->freq;
2299 params.bssid_hint = bss->bssid;
2300 params.freq_hint = bss->freq;
2302 params.ssid = ssid->ssid;
2303 params.ssid_len = ssid->ssid_len;
2306 if (ssid->mode == WPAS_MODE_IBSS && ssid->bssid_set &&
2307 wpa_s->conf->ap_scan == 2) {
2308 params.bssid = ssid->bssid;
2309 params.fixed_bssid = 1;
2312 /* Initial frequency for IBSS/mesh */
2313 if ((ssid->mode == WPAS_MODE_IBSS || ssid->mode == WPAS_MODE_MESH) &&
2314 ssid->frequency > 0 && params.freq.freq == 0)
2315 ibss_mesh_setup_freq(wpa_s, ssid, ¶ms.freq);
2317 if (ssid->mode == WPAS_MODE_IBSS) {
2318 params.fixed_freq = ssid->fixed_freq;
2319 if (ssid->beacon_int)
2320 params.beacon_int = ssid->beacon_int;
2322 params.beacon_int = wpa_s->conf->beacon_int;
2325 params.wpa_ie = wpa_ie;
2326 params.wpa_ie_len = wpa_ie_len;
2327 params.pairwise_suite = cipher_pairwise;
2328 params.group_suite = cipher_group;
2329 params.key_mgmt_suite = wpa_s->key_mgmt;
2330 params.wpa_proto = wpa_s->wpa_proto;
2331 params.auth_alg = algs;
2332 params.mode = ssid->mode;
2333 params.bg_scan_period = ssid->bg_scan_period;
2334 for (i = 0; i < NUM_WEP_KEYS; i++) {
2335 if (ssid->wep_key_len[i])
2336 params.wep_key[i] = ssid->wep_key[i];
2337 params.wep_key_len[i] = ssid->wep_key_len[i];
2339 params.wep_tx_keyidx = ssid->wep_tx_keyidx;
2341 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) &&
2342 (params.key_mgmt_suite == WPA_KEY_MGMT_PSK ||
2343 params.key_mgmt_suite == WPA_KEY_MGMT_FT_PSK)) {
2344 params.passphrase = ssid->passphrase;
2346 params.psk = ssid->psk;
2349 if (wpa_s->conf->key_mgmt_offload) {
2350 if (params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X ||
2351 params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SHA256 ||
2352 params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SUITE_B ||
2353 params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SUITE_B_192)
2354 params.req_key_mgmt_offload =
2355 ssid->proactive_key_caching < 0 ?
2356 wpa_s->conf->okc : ssid->proactive_key_caching;
2358 params.req_key_mgmt_offload = 1;
2360 if ((params.key_mgmt_suite == WPA_KEY_MGMT_PSK ||
2361 params.key_mgmt_suite == WPA_KEY_MGMT_PSK_SHA256 ||
2362 params.key_mgmt_suite == WPA_KEY_MGMT_FT_PSK) &&
2364 params.psk = ssid->psk;
2367 params.drop_unencrypted = use_crypt;
2369 #ifdef CONFIG_IEEE80211W
2370 params.mgmt_frame_protection = wpas_get_ssid_pmf(wpa_s, ssid);
2371 if (params.mgmt_frame_protection != NO_MGMT_FRAME_PROTECTION && bss) {
2372 const u8 *rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
2373 struct wpa_ie_data ie;
2374 if (rsn && wpa_parse_wpa_ie(rsn, 2 + rsn[1], &ie) == 0 &&
2376 (WPA_CAPABILITY_MFPC | WPA_CAPABILITY_MFPR)) {
2377 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected AP supports "
2378 "MFP: require MFP");
2379 params.mgmt_frame_protection =
2380 MGMT_FRAME_PROTECTION_REQUIRED;
2383 #endif /* CONFIG_IEEE80211W */
2385 params.p2p = ssid->p2p_group;
2387 if (wpa_s->parent->set_sta_uapsd)
2388 params.uapsd = wpa_s->parent->sta_uapsd;
2392 #ifdef CONFIG_HT_OVERRIDES
2393 os_memset(&htcaps, 0, sizeof(htcaps));
2394 os_memset(&htcaps_mask, 0, sizeof(htcaps_mask));
2395 params.htcaps = (u8 *) &htcaps;
2396 params.htcaps_mask = (u8 *) &htcaps_mask;
2397 wpa_supplicant_apply_ht_overrides(wpa_s, ssid, ¶ms);
2398 #endif /* CONFIG_HT_OVERRIDES */
2399 #ifdef CONFIG_VHT_OVERRIDES
2400 os_memset(&vhtcaps, 0, sizeof(vhtcaps));
2401 os_memset(&vhtcaps_mask, 0, sizeof(vhtcaps_mask));
2402 params.vhtcaps = &vhtcaps;
2403 params.vhtcaps_mask = &vhtcaps_mask;
2404 wpa_supplicant_apply_vht_overrides(wpa_s, ssid, ¶ms);
2405 #endif /* CONFIG_VHT_OVERRIDES */
2409 * If multi-channel concurrency is not supported, check for any
2410 * frequency conflict. In case of any frequency conflict, remove the
2411 * least prioritized connection.
2413 if (wpa_s->num_multichan_concurrent < 2) {
2415 num = get_shared_radio_freqs(wpa_s, &freq, 1);
2416 if (num > 0 && freq > 0 && freq != params.freq.freq) {
2417 wpa_printf(MSG_DEBUG,
2418 "Assoc conflicting freq found (%d != %d)",
2419 freq, params.freq.freq);
2420 if (wpas_p2p_handle_frequency_conflicts(
2421 wpa_s, params.freq.freq, ssid) < 0) {
2422 wpas_connect_work_done(wpa_s);
2427 #endif /* CONFIG_P2P */
2429 ret = wpa_drv_associate(wpa_s, ¶ms);
2431 wpa_msg(wpa_s, MSG_INFO, "Association request to the driver "
2433 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SANE_ERROR_CODES) {
2435 * The driver is known to mean what is saying, so we
2436 * can stop right here; the association will not
2439 wpas_connection_failed(wpa_s, wpa_s->pending_bssid);
2440 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
2441 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
2444 /* try to continue anyway; new association will be tried again
2449 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
2450 /* Set the key after the association just in case association
2451 * cleared the previously configured key. */
2452 wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
2453 /* No need to timeout authentication since there is no key
2455 wpa_supplicant_cancel_auth_timeout(wpa_s);
2456 wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
2457 #ifdef CONFIG_IBSS_RSN
2458 } else if (ssid->mode == WPAS_MODE_IBSS &&
2459 wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
2460 wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
2462 * RSN IBSS authentication is per-STA and we can disable the
2463 * per-BSSID authentication.
2465 wpa_supplicant_cancel_auth_timeout(wpa_s);
2466 #endif /* CONFIG_IBSS_RSN */
2468 /* Timeout for IEEE 802.11 authentication and association */
2472 /* give IBSS a bit more time */
2473 timeout = ssid->mode == WPAS_MODE_IBSS ? 10 : 5;
2474 } else if (wpa_s->conf->ap_scan == 1) {
2475 /* give IBSS a bit more time */
2476 timeout = ssid->mode == WPAS_MODE_IBSS ? 20 : 10;
2478 wpa_supplicant_req_auth_timeout(wpa_s, timeout, 0);
2482 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC)) {
2483 /* Set static WEP keys again */
2484 wpa_set_wep_keys(wpa_s, ssid);
2487 if (wpa_s->current_ssid && wpa_s->current_ssid != ssid) {
2489 * Do not allow EAP session resumption between different
2490 * network configurations.
2492 eapol_sm_invalidate_cached_session(wpa_s->eapol);
2494 old_ssid = wpa_s->current_ssid;
2495 wpa_s->current_ssid = ssid;
2496 if (!wpas_driver_bss_selection(wpa_s) || ssid->bssid_set)
2497 wpa_s->current_bss = bss;
2498 wpa_supplicant_rsn_supp_set_config(wpa_s, wpa_s->current_ssid);
2499 wpa_supplicant_initiate_eapol(wpa_s);
2500 if (old_ssid != wpa_s->current_ssid)
2501 wpas_notify_network_changed(wpa_s);
2505 static void wpa_supplicant_clear_connection(struct wpa_supplicant *wpa_s,
2508 struct wpa_ssid *old_ssid;
2510 wpas_connect_work_done(wpa_s);
2511 wpa_clear_keys(wpa_s, addr);
2512 old_ssid = wpa_s->current_ssid;
2513 wpa_supplicant_mark_disassoc(wpa_s);
2514 wpa_sm_set_config(wpa_s->wpa, NULL);
2515 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
2516 if (old_ssid != wpa_s->current_ssid)
2517 wpas_notify_network_changed(wpa_s);
2518 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
2523 * wpa_supplicant_deauthenticate - Deauthenticate the current connection
2524 * @wpa_s: Pointer to wpa_supplicant data
2525 * @reason_code: IEEE 802.11 reason code for the deauthenticate frame
2527 * This function is used to request %wpa_supplicant to deauthenticate from the
2530 void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
2534 union wpa_event_data event;
2537 wpa_dbg(wpa_s, MSG_DEBUG, "Request to deauthenticate - bssid=" MACSTR
2538 " pending_bssid=" MACSTR " reason=%d state=%s",
2539 MAC2STR(wpa_s->bssid), MAC2STR(wpa_s->pending_bssid),
2540 reason_code, wpa_supplicant_state_txt(wpa_s->wpa_state));
2542 if (!is_zero_ether_addr(wpa_s->bssid))
2543 addr = wpa_s->bssid;
2544 else if (!is_zero_ether_addr(wpa_s->pending_bssid) &&
2545 (wpa_s->wpa_state == WPA_AUTHENTICATING ||
2546 wpa_s->wpa_state == WPA_ASSOCIATING))
2547 addr = wpa_s->pending_bssid;
2548 else if (wpa_s->wpa_state == WPA_ASSOCIATING) {
2550 * When using driver-based BSS selection, we may not know the
2551 * BSSID with which we are currently trying to associate. We
2552 * need to notify the driver of this disconnection even in such
2553 * a case, so use the all zeros address here.
2555 addr = wpa_s->bssid;
2560 wpa_tdls_teardown_peers(wpa_s->wpa);
2561 #endif /* CONFIG_TDLS */
2565 wpa_msg_ctrl(wpa_s, MSG_INFO, MESH_GROUP_REMOVED "%s",
2567 wpa_supplicant_leave_mesh(wpa_s);
2569 #endif /* CONFIG_MESH */
2572 wpa_drv_deauthenticate(wpa_s, addr, reason_code);
2573 os_memset(&event, 0, sizeof(event));
2574 event.deauth_info.reason_code = (u16) reason_code;
2575 event.deauth_info.locally_generated = 1;
2576 wpa_supplicant_event(wpa_s, EVENT_DEAUTH, &event);
2581 wpa_supplicant_clear_connection(wpa_s, addr);
2584 static void wpa_supplicant_enable_one_network(struct wpa_supplicant *wpa_s,
2585 struct wpa_ssid *ssid)
2587 if (!ssid || !ssid->disabled || ssid->disabled == 2)
2591 wpas_clear_temp_disabled(wpa_s, ssid, 1);
2592 wpas_notify_network_enabled_changed(wpa_s, ssid);
2595 * Try to reassociate since there is no current configuration and a new
2596 * network was made available.
2598 if (!wpa_s->current_ssid && !wpa_s->disconnected)
2599 wpa_s->reassociate = 1;
2604 * wpa_supplicant_enable_network - Mark a configured network as enabled
2605 * @wpa_s: wpa_supplicant structure for a network interface
2606 * @ssid: wpa_ssid structure for a configured network or %NULL
2608 * Enables the specified network or all networks if no network specified.
2610 void wpa_supplicant_enable_network(struct wpa_supplicant *wpa_s,
2611 struct wpa_ssid *ssid)
2614 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
2615 wpa_supplicant_enable_one_network(wpa_s, ssid);
2617 wpa_supplicant_enable_one_network(wpa_s, ssid);
2619 if (wpa_s->reassociate && !wpa_s->disconnected &&
2620 (!wpa_s->current_ssid ||
2621 wpa_s->wpa_state == WPA_DISCONNECTED ||
2622 wpa_s->wpa_state == WPA_SCANNING)) {
2623 if (wpa_s->sched_scanning) {
2624 wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan to add "
2625 "new network to scan filters");
2626 wpa_supplicant_cancel_sched_scan(wpa_s);
2629 if (wpa_supplicant_fast_associate(wpa_s) != 1) {
2630 wpa_s->scan_req = NORMAL_SCAN_REQ;
2631 wpa_supplicant_req_scan(wpa_s, 0, 0);
2638 * wpa_supplicant_disable_network - Mark a configured network as disabled
2639 * @wpa_s: wpa_supplicant structure for a network interface
2640 * @ssid: wpa_ssid structure for a configured network or %NULL
2642 * Disables the specified network or all networks if no network specified.
2644 void wpa_supplicant_disable_network(struct wpa_supplicant *wpa_s,
2645 struct wpa_ssid *ssid)
2647 struct wpa_ssid *other_ssid;
2651 if (wpa_s->sched_scanning)
2652 wpa_supplicant_cancel_sched_scan(wpa_s);
2654 for (other_ssid = wpa_s->conf->ssid; other_ssid;
2655 other_ssid = other_ssid->next) {
2656 was_disabled = other_ssid->disabled;
2657 if (was_disabled == 2)
2658 continue; /* do not change persistent P2P group
2661 other_ssid->disabled = 1;
2663 if (was_disabled != other_ssid->disabled)
2664 wpas_notify_network_enabled_changed(
2667 if (wpa_s->current_ssid)
2668 wpa_supplicant_deauthenticate(
2669 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
2670 } else if (ssid->disabled != 2) {
2671 if (ssid == wpa_s->current_ssid)
2672 wpa_supplicant_deauthenticate(
2673 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
2675 was_disabled = ssid->disabled;
2679 if (was_disabled != ssid->disabled) {
2680 wpas_notify_network_enabled_changed(wpa_s, ssid);
2681 if (wpa_s->sched_scanning) {
2682 wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan "
2683 "to remove network from filters");
2684 wpa_supplicant_cancel_sched_scan(wpa_s);
2685 wpa_supplicant_req_scan(wpa_s, 0, 0);
2693 * wpa_supplicant_select_network - Attempt association with a network
2694 * @wpa_s: wpa_supplicant structure for a network interface
2695 * @ssid: wpa_ssid structure for a configured network or %NULL for any network
2697 void wpa_supplicant_select_network(struct wpa_supplicant *wpa_s,
2698 struct wpa_ssid *ssid)
2701 struct wpa_ssid *other_ssid;
2702 int disconnected = 0;
2704 if (ssid && ssid != wpa_s->current_ssid && wpa_s->current_ssid) {
2705 if (wpa_s->wpa_state >= WPA_AUTHENTICATING)
2706 wpa_s->own_disconnect_req = 1;
2707 wpa_supplicant_deauthenticate(
2708 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
2713 wpas_clear_temp_disabled(wpa_s, ssid, 1);
2716 * Mark all other networks disabled or mark all networks enabled if no
2717 * network specified.
2719 for (other_ssid = wpa_s->conf->ssid; other_ssid;
2720 other_ssid = other_ssid->next) {
2721 int was_disabled = other_ssid->disabled;
2722 if (was_disabled == 2)
2723 continue; /* do not change persistent P2P group data */
2725 other_ssid->disabled = ssid ? (ssid->id != other_ssid->id) : 0;
2726 if (was_disabled && !other_ssid->disabled)
2727 wpas_clear_temp_disabled(wpa_s, other_ssid, 0);
2729 if (was_disabled != other_ssid->disabled)
2730 wpas_notify_network_enabled_changed(wpa_s, other_ssid);
2733 if (ssid && ssid == wpa_s->current_ssid && wpa_s->current_ssid &&
2734 wpa_s->wpa_state >= WPA_AUTHENTICATING) {
2735 /* We are already associated with the selected network */
2736 wpa_printf(MSG_DEBUG, "Already associated with the "
2737 "selected network - do nothing");
2742 wpa_s->current_ssid = ssid;
2743 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
2744 wpa_s->connect_without_scan =
2745 (ssid->mode == WPAS_MODE_MESH) ? ssid : NULL;
2748 * Don't optimize next scan freqs since a new ESS has been
2751 os_free(wpa_s->next_scan_freqs);
2752 wpa_s->next_scan_freqs = NULL;
2754 wpa_s->connect_without_scan = NULL;
2757 wpa_s->disconnected = 0;
2758 wpa_s->reassociate = 1;
2760 if (wpa_s->connect_without_scan ||
2761 wpa_supplicant_fast_associate(wpa_s) != 1) {
2762 wpa_s->scan_req = NORMAL_SCAN_REQ;
2763 wpa_supplicant_req_scan(wpa_s, 0, disconnected ? 100000 : 0);
2767 wpas_notify_network_selected(wpa_s, ssid);
2772 * wpas_set_pkcs11_engine_and_module_path - Set PKCS #11 engine and module path
2773 * @wpa_s: wpa_supplicant structure for a network interface
2774 * @pkcs11_engine_path: PKCS #11 engine path or NULL
2775 * @pkcs11_module_path: PKCS #11 module path or NULL
2776 * Returns: 0 on success; -1 on failure
2778 * Sets the PKCS #11 engine and module path. Both have to be NULL or a valid
2779 * path. If resetting the EAPOL state machine with the new PKCS #11 engine and
2780 * module path fails the paths will be reset to the default value (NULL).
2782 int wpas_set_pkcs11_engine_and_module_path(struct wpa_supplicant *wpa_s,
2783 const char *pkcs11_engine_path,
2784 const char *pkcs11_module_path)
2786 char *pkcs11_engine_path_copy = NULL;
2787 char *pkcs11_module_path_copy = NULL;
2789 if (pkcs11_engine_path != NULL) {
2790 pkcs11_engine_path_copy = os_strdup(pkcs11_engine_path);
2791 if (pkcs11_engine_path_copy == NULL)
2794 if (pkcs11_module_path != NULL) {
2795 pkcs11_module_path_copy = os_strdup(pkcs11_module_path);
2796 if (pkcs11_module_path_copy == NULL) {
2797 os_free(pkcs11_engine_path_copy);
2802 os_free(wpa_s->conf->pkcs11_engine_path);
2803 os_free(wpa_s->conf->pkcs11_module_path);
2804 wpa_s->conf->pkcs11_engine_path = pkcs11_engine_path_copy;
2805 wpa_s->conf->pkcs11_module_path = pkcs11_module_path_copy;
2807 wpa_sm_set_eapol(wpa_s->wpa, NULL);
2808 eapol_sm_deinit(wpa_s->eapol);
2809 wpa_s->eapol = NULL;
2810 if (wpa_supplicant_init_eapol(wpa_s)) {
2811 /* Error -> Reset paths to the default value (NULL) once. */
2812 if (pkcs11_engine_path != NULL && pkcs11_module_path != NULL)
2813 wpas_set_pkcs11_engine_and_module_path(wpa_s, NULL,
2818 wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
2825 * wpa_supplicant_set_ap_scan - Set AP scan mode for interface
2826 * @wpa_s: wpa_supplicant structure for a network interface
2827 * @ap_scan: AP scan mode
2828 * Returns: 0 if succeed or -1 if ap_scan has an invalid value
2831 int wpa_supplicant_set_ap_scan(struct wpa_supplicant *wpa_s, int ap_scan)
2836 if (ap_scan < 0 || ap_scan > 2)
2839 if (ap_scan == 2 && os_strcmp(wpa_s->driver->name, "nl80211") == 0) {
2840 wpa_printf(MSG_INFO,
2841 "Note: nl80211 driver interface is not designed to be used with ap_scan=2; this can result in connection failures");
2845 if (ap_scan == 2 && ap_scan != wpa_s->conf->ap_scan &&
2846 wpa_s->wpa_state >= WPA_ASSOCIATING &&
2847 wpa_s->wpa_state < WPA_COMPLETED) {
2848 wpa_printf(MSG_ERROR, "ap_scan = %d (%d) rejected while "
2849 "associating", wpa_s->conf->ap_scan, ap_scan);
2852 #endif /* ANDROID */
2854 old_ap_scan = wpa_s->conf->ap_scan;
2855 wpa_s->conf->ap_scan = ap_scan;
2857 if (old_ap_scan != wpa_s->conf->ap_scan)
2858 wpas_notify_ap_scan_changed(wpa_s);
2865 * wpa_supplicant_set_bss_expiration_age - Set BSS entry expiration age
2866 * @wpa_s: wpa_supplicant structure for a network interface
2867 * @expire_age: Expiration age in seconds
2868 * Returns: 0 if succeed or -1 if expire_age has an invalid value
2871 int wpa_supplicant_set_bss_expiration_age(struct wpa_supplicant *wpa_s,
2872 unsigned int bss_expire_age)
2874 if (bss_expire_age < 10) {
2875 wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration age %u",
2879 wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration age: %d sec",
2881 wpa_s->conf->bss_expiration_age = bss_expire_age;
2888 * wpa_supplicant_set_bss_expiration_count - Set BSS entry expiration scan count
2889 * @wpa_s: wpa_supplicant structure for a network interface
2890 * @expire_count: number of scans after which an unseen BSS is reclaimed
2891 * Returns: 0 if succeed or -1 if expire_count has an invalid value
2894 int wpa_supplicant_set_bss_expiration_count(struct wpa_supplicant *wpa_s,
2895 unsigned int bss_expire_count)
2897 if (bss_expire_count < 1) {
2898 wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration count %u",
2902 wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration scan count: %u",
2904 wpa_s->conf->bss_expiration_scan_count = bss_expire_count;
2911 * wpa_supplicant_set_scan_interval - Set scan interval
2912 * @wpa_s: wpa_supplicant structure for a network interface
2913 * @scan_interval: scan interval in seconds
2914 * Returns: 0 if succeed or -1 if scan_interval has an invalid value
2917 int wpa_supplicant_set_scan_interval(struct wpa_supplicant *wpa_s,
2920 if (scan_interval < 0) {
2921 wpa_msg(wpa_s, MSG_ERROR, "Invalid scan interval %d",
2925 wpa_msg(wpa_s, MSG_DEBUG, "Setting scan interval: %d sec",
2927 wpa_supplicant_update_scan_int(wpa_s, scan_interval);
2934 * wpa_supplicant_set_debug_params - Set global debug params
2935 * @global: wpa_global structure
2936 * @debug_level: debug level
2937 * @debug_timestamp: determines if show timestamp in debug data
2938 * @debug_show_keys: determines if show keys in debug data
2939 * Returns: 0 if succeed or -1 if debug_level has wrong value
2941 int wpa_supplicant_set_debug_params(struct wpa_global *global, int debug_level,
2942 int debug_timestamp, int debug_show_keys)
2945 int old_level, old_timestamp, old_show_keys;
2947 /* check for allowed debuglevels */
2948 if (debug_level != MSG_EXCESSIVE &&
2949 debug_level != MSG_MSGDUMP &&
2950 debug_level != MSG_DEBUG &&
2951 debug_level != MSG_INFO &&
2952 debug_level != MSG_WARNING &&
2953 debug_level != MSG_ERROR)
2956 old_level = wpa_debug_level;
2957 old_timestamp = wpa_debug_timestamp;
2958 old_show_keys = wpa_debug_show_keys;
2960 wpa_debug_level = debug_level;
2961 wpa_debug_timestamp = debug_timestamp ? 1 : 0;
2962 wpa_debug_show_keys = debug_show_keys ? 1 : 0;
2964 if (wpa_debug_level != old_level)
2965 wpas_notify_debug_level_changed(global);
2966 if (wpa_debug_timestamp != old_timestamp)
2967 wpas_notify_debug_timestamp_changed(global);
2968 if (wpa_debug_show_keys != old_show_keys)
2969 wpas_notify_debug_show_keys_changed(global);
2976 * wpa_supplicant_get_ssid - Get a pointer to the current network structure
2977 * @wpa_s: Pointer to wpa_supplicant data
2978 * Returns: A pointer to the current network structure or %NULL on failure
2980 struct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s)
2982 struct wpa_ssid *entry;
2983 u8 ssid[SSID_MAX_LEN];
2989 res = wpa_drv_get_ssid(wpa_s, ssid);
2991 wpa_msg(wpa_s, MSG_WARNING, "Could not read SSID from "
2997 if (wpa_drv_get_bssid(wpa_s, bssid) < 0) {
2998 wpa_msg(wpa_s, MSG_WARNING, "Could not read BSSID from "
3003 wired = wpa_s->conf->ap_scan == 0 &&
3004 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED);
3006 entry = wpa_s->conf->ssid;
3008 if (!wpas_network_disabled(wpa_s, entry) &&
3009 ((ssid_len == entry->ssid_len &&
3010 os_memcmp(ssid, entry->ssid, ssid_len) == 0) || wired) &&
3011 (!entry->bssid_set ||
3012 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
3015 if (!wpas_network_disabled(wpa_s, entry) &&
3016 (entry->key_mgmt & WPA_KEY_MGMT_WPS) &&
3017 (entry->ssid == NULL || entry->ssid_len == 0) &&
3018 (!entry->bssid_set ||
3019 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
3021 #endif /* CONFIG_WPS */
3023 if (!wpas_network_disabled(wpa_s, entry) && entry->bssid_set &&
3024 entry->ssid_len == 0 &&
3025 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0)
3028 entry = entry->next;
3035 static int select_driver(struct wpa_supplicant *wpa_s, int i)
3037 struct wpa_global *global = wpa_s->global;
3039 if (wpa_drivers[i]->global_init && global->drv_priv[i] == NULL) {
3040 global->drv_priv[i] = wpa_drivers[i]->global_init();
3041 if (global->drv_priv[i] == NULL) {
3042 wpa_printf(MSG_ERROR, "Failed to initialize driver "
3043 "'%s'", wpa_drivers[i]->name);
3048 wpa_s->driver = wpa_drivers[i];
3049 wpa_s->global_drv_priv = global->drv_priv[i];
3055 static int wpa_supplicant_set_driver(struct wpa_supplicant *wpa_s,
3060 const char *pos, *driver = name;
3065 if (wpa_drivers[0] == NULL) {
3066 wpa_msg(wpa_s, MSG_ERROR, "No driver interfaces build into "
3072 /* default to first driver in the list */
3073 return select_driver(wpa_s, 0);
3077 pos = os_strchr(driver, ',');
3081 len = os_strlen(driver);
3083 for (i = 0; wpa_drivers[i]; i++) {
3084 if (os_strlen(wpa_drivers[i]->name) == len &&
3085 os_strncmp(driver, wpa_drivers[i]->name, len) ==
3087 /* First driver that succeeds wins */
3088 if (select_driver(wpa_s, i) == 0)
3096 wpa_msg(wpa_s, MSG_ERROR, "Unsupported driver '%s'", name);
3102 * wpa_supplicant_rx_eapol - Deliver a received EAPOL frame to wpa_supplicant
3103 * @ctx: Context pointer (wpa_s); this is the ctx variable registered
3104 * with struct wpa_driver_ops::init()
3105 * @src_addr: Source address of the EAPOL frame
3106 * @buf: EAPOL data starting from the EAPOL header (i.e., no Ethernet header)
3107 * @len: Length of the EAPOL data
3109 * This function is called for each received EAPOL frame. Most driver
3110 * interfaces rely on more generic OS mechanism for receiving frames through
3111 * l2_packet, but if such a mechanism is not available, the driver wrapper may
3112 * take care of received EAPOL frames and deliver them to the core supplicant
3113 * code by calling this function.
3115 void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr,
3116 const u8 *buf, size_t len)
3118 struct wpa_supplicant *wpa_s = ctx;
3120 wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR, MAC2STR(src_addr));
3121 wpa_hexdump(MSG_MSGDUMP, "RX EAPOL", buf, len);
3123 #ifdef CONFIG_PEERKEY
3124 if (wpa_s->wpa_state > WPA_ASSOCIATED && wpa_s->current_ssid &&
3125 wpa_s->current_ssid->peerkey &&
3126 !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) &&
3127 wpa_sm_rx_eapol_peerkey(wpa_s->wpa, src_addr, buf, len) == 1) {
3128 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: Processed PeerKey EAPOL-Key");
3131 #endif /* CONFIG_PEERKEY */
3133 if (wpa_s->wpa_state < WPA_ASSOCIATED ||
3134 (wpa_s->last_eapol_matches_bssid &&
3137 #endif /* CONFIG_AP */
3138 os_memcmp(src_addr, wpa_s->bssid, ETH_ALEN) != 0)) {
3140 * There is possible race condition between receiving the
3141 * association event and the EAPOL frame since they are coming
3142 * through different paths from the driver. In order to avoid
3143 * issues in trying to process the EAPOL frame before receiving
3144 * association information, lets queue it for processing until
3145 * the association event is received. This may also be needed in
3146 * driver-based roaming case, so also use src_addr != BSSID as a
3147 * trigger if we have previously confirmed that the
3148 * Authenticator uses BSSID as the src_addr (which is not the
3149 * case with wired IEEE 802.1X).
3151 wpa_dbg(wpa_s, MSG_DEBUG, "Not associated - Delay processing "
3152 "of received EAPOL frame (state=%s bssid=" MACSTR ")",
3153 wpa_supplicant_state_txt(wpa_s->wpa_state),
3154 MAC2STR(wpa_s->bssid));
3155 wpabuf_free(wpa_s->pending_eapol_rx);
3156 wpa_s->pending_eapol_rx = wpabuf_alloc_copy(buf, len);
3157 if (wpa_s->pending_eapol_rx) {
3158 os_get_reltime(&wpa_s->pending_eapol_rx_time);
3159 os_memcpy(wpa_s->pending_eapol_rx_src, src_addr,
3165 wpa_s->last_eapol_matches_bssid =
3166 os_memcmp(src_addr, wpa_s->bssid, ETH_ALEN) == 0;
3169 if (wpa_s->ap_iface) {
3170 wpa_supplicant_ap_rx_eapol(wpa_s, src_addr, buf, len);
3173 #endif /* CONFIG_AP */
3175 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE) {
3176 wpa_dbg(wpa_s, MSG_DEBUG, "Ignored received EAPOL frame since "
3177 "no key management is configured");
3181 if (wpa_s->eapol_received == 0 &&
3182 (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) ||
3183 !wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) ||
3184 wpa_s->wpa_state != WPA_COMPLETED) &&
3185 (wpa_s->current_ssid == NULL ||
3186 wpa_s->current_ssid->mode != IEEE80211_MODE_IBSS)) {
3187 /* Timeout for completing IEEE 802.1X and WPA authentication */
3190 if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) ||
3191 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA ||
3192 wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) {
3193 /* Use longer timeout for IEEE 802.1X/EAP */
3198 if (wpa_s->current_ssid && wpa_s->current_bss &&
3199 (wpa_s->current_ssid->key_mgmt & WPA_KEY_MGMT_WPS) &&
3200 eap_is_wps_pin_enrollee(&wpa_s->current_ssid->eap)) {
3202 * Use shorter timeout if going through WPS AP iteration
3203 * for PIN config method with an AP that does not
3204 * advertise Selected Registrar.
3206 struct wpabuf *wps_ie;
3208 wps_ie = wpa_bss_get_vendor_ie_multi(
3209 wpa_s->current_bss, WPS_IE_VENDOR_TYPE);
3211 !wps_is_addr_authorized(wps_ie, wpa_s->own_addr, 1))
3213 wpabuf_free(wps_ie);
3215 #endif /* CONFIG_WPS */
3217 wpa_supplicant_req_auth_timeout(wpa_s, timeout, 0);
3219 wpa_s->eapol_received++;
3221 if (wpa_s->countermeasures) {
3222 wpa_msg(wpa_s, MSG_INFO, "WPA: Countermeasures - dropped "
3227 #ifdef CONFIG_IBSS_RSN
3228 if (wpa_s->current_ssid &&
3229 wpa_s->current_ssid->mode == WPAS_MODE_IBSS) {
3230 ibss_rsn_rx_eapol(wpa_s->ibss_rsn, src_addr, buf, len);
3233 #endif /* CONFIG_IBSS_RSN */
3235 /* Source address of the incoming EAPOL frame could be compared to the
3236 * current BSSID. However, it is possible that a centralized
3237 * Authenticator could be using another MAC address than the BSSID of
3238 * an AP, so just allow any address to be used for now. The replies are
3239 * still sent to the current BSSID (if available), though. */
3241 os_memcpy(wpa_s->last_eapol_src, src_addr, ETH_ALEN);
3242 if (!wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) &&
3243 eapol_sm_rx_eapol(wpa_s->eapol, src_addr, buf, len) > 0)
3245 wpa_drv_poll(wpa_s);
3246 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE))
3247 wpa_sm_rx_eapol(wpa_s->wpa, src_addr, buf, len);
3248 else if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt)) {
3250 * Set portValid = TRUE here since we are going to skip 4-way
3251 * handshake processing which would normally set portValid. We
3252 * need this to allow the EAPOL state machines to be completed
3253 * without going through EAPOL-Key handshake.
3255 eapol_sm_notify_portValid(wpa_s->eapol, TRUE);
3260 int wpa_supplicant_update_mac_addr(struct wpa_supplicant *wpa_s)
3262 if ((!wpa_s->p2p_mgmt ||
3263 !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)) &&
3264 !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE)) {
3265 l2_packet_deinit(wpa_s->l2);
3266 wpa_s->l2 = l2_packet_init(wpa_s->ifname,
3267 wpa_drv_get_mac_addr(wpa_s),
3269 wpa_supplicant_rx_eapol, wpa_s, 0);
3270 if (wpa_s->l2 == NULL)
3273 const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
3275 os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
3278 if (wpa_s->l2 && l2_packet_get_own_addr(wpa_s->l2, wpa_s->own_addr)) {
3279 wpa_msg(wpa_s, MSG_ERROR, "Failed to get own L2 address");
3283 wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
3289 static void wpa_supplicant_rx_eapol_bridge(void *ctx, const u8 *src_addr,
3290 const u8 *buf, size_t len)
3292 struct wpa_supplicant *wpa_s = ctx;
3293 const struct l2_ethhdr *eth;
3295 if (len < sizeof(*eth))
3297 eth = (const struct l2_ethhdr *) buf;
3299 if (os_memcmp(eth->h_dest, wpa_s->own_addr, ETH_ALEN) != 0 &&
3300 !(eth->h_dest[0] & 0x01)) {
3301 wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR " to " MACSTR
3302 " (bridge - not for this interface - ignore)",
3303 MAC2STR(src_addr), MAC2STR(eth->h_dest));
3307 wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR " to " MACSTR
3308 " (bridge)", MAC2STR(src_addr), MAC2STR(eth->h_dest));
3309 wpa_supplicant_rx_eapol(wpa_s, src_addr, buf + sizeof(*eth),
3310 len - sizeof(*eth));
3315 * wpa_supplicant_driver_init - Initialize driver interface parameters
3316 * @wpa_s: Pointer to wpa_supplicant data
3317 * Returns: 0 on success, -1 on failure
3319 * This function is called to initialize driver interface parameters.
3320 * wpa_drv_init() must have been called before this function to initialize the
3323 int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s)
3325 static int interface_count = 0;
3327 if (wpa_supplicant_update_mac_addr(wpa_s) < 0)
3330 wpa_dbg(wpa_s, MSG_DEBUG, "Own MAC address: " MACSTR,
3331 MAC2STR(wpa_s->own_addr));
3332 os_memcpy(wpa_s->perm_addr, wpa_s->own_addr, ETH_ALEN);
3333 wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
3335 if (wpa_s->bridge_ifname[0]) {
3336 wpa_dbg(wpa_s, MSG_DEBUG, "Receiving packets from bridge "
3337 "interface '%s'", wpa_s->bridge_ifname);
3338 wpa_s->l2_br = l2_packet_init_bridge(
3339 wpa_s->bridge_ifname, wpa_s->ifname, wpa_s->own_addr,
3340 ETH_P_EAPOL, wpa_supplicant_rx_eapol_bridge, wpa_s, 1);
3341 if (wpa_s->l2_br == NULL) {
3342 wpa_msg(wpa_s, MSG_ERROR, "Failed to open l2_packet "
3343 "connection for the bridge interface '%s'",
3344 wpa_s->bridge_ifname);
3349 if (wpa_s->conf->ap_scan == 2 &&
3350 os_strcmp(wpa_s->driver->name, "nl80211") == 0) {
3351 wpa_printf(MSG_INFO,
3352 "Note: nl80211 driver interface is not designed to be used with ap_scan=2; this can result in connection failures");
3355 wpa_clear_keys(wpa_s, NULL);
3357 /* Make sure that TKIP countermeasures are not left enabled (could
3358 * happen if wpa_supplicant is killed during countermeasures. */
3359 wpa_drv_set_countermeasures(wpa_s, 0);
3361 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: flushing PMKID list in the driver");
3362 wpa_drv_flush_pmkid(wpa_s);
3364 wpa_s->prev_scan_ssid = WILDCARD_SSID_SCAN;
3365 wpa_s->prev_scan_wildcard = 0;
3367 if (wpa_supplicant_enabled_networks(wpa_s)) {
3368 if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
3369 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
3370 interface_count = 0;
3373 if (!wpa_s->p2p_mgmt &&
3374 wpa_supplicant_delayed_sched_scan(wpa_s,
3375 interface_count % 3,
3377 wpa_supplicant_req_scan(wpa_s, interface_count % 3,
3379 #endif /* ANDROID */
3382 wpa_supplicant_set_state(wpa_s, WPA_INACTIVE);
3388 static int wpa_supplicant_daemon(const char *pid_file)
3390 wpa_printf(MSG_DEBUG, "Daemonize..");
3391 return os_daemonize(pid_file);
3395 static struct wpa_supplicant *
3396 wpa_supplicant_alloc(struct wpa_supplicant *parent)
3398 struct wpa_supplicant *wpa_s;
3400 wpa_s = os_zalloc(sizeof(*wpa_s));
3403 wpa_s->scan_req = INITIAL_SCAN_REQ;
3404 wpa_s->scan_interval = 5;
3405 wpa_s->new_connection = 1;
3406 wpa_s->parent = parent ? parent : wpa_s;
3407 wpa_s->sched_scanning = 0;
3413 #ifdef CONFIG_HT_OVERRIDES
3415 static int wpa_set_htcap_mcs(struct wpa_supplicant *wpa_s,
3416 struct ieee80211_ht_capabilities *htcaps,
3417 struct ieee80211_ht_capabilities *htcaps_mask,
3420 /* parse ht_mcs into hex array */
3422 const char *tmp = ht_mcs;
3425 /* If ht_mcs is null, do not set anything */
3429 /* This is what we are setting in the kernel */
3430 os_memset(&htcaps->supported_mcs_set, 0, IEEE80211_HT_MCS_MASK_LEN);
3432 wpa_msg(wpa_s, MSG_DEBUG, "set_htcap, ht_mcs -:%s:-", ht_mcs);
3434 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
3436 long v = strtol(tmp, &end, 16);
3438 wpa_msg(wpa_s, MSG_DEBUG,
3439 "htcap value[%i]: %ld end: %p tmp: %p",
3444 htcaps->supported_mcs_set[i] = v;
3447 wpa_msg(wpa_s, MSG_ERROR,
3448 "Failed to parse ht-mcs: %s, error: %s\n",
3449 ht_mcs, strerror(errno));
3455 * If we were able to parse any values, then set mask for the MCS set.
3458 os_memset(&htcaps_mask->supported_mcs_set, 0xff,
3459 IEEE80211_HT_MCS_MASK_LEN - 1);
3460 /* skip the 3 reserved bits */
3461 htcaps_mask->supported_mcs_set[IEEE80211_HT_MCS_MASK_LEN - 1] =
3469 static int wpa_disable_max_amsdu(struct wpa_supplicant *wpa_s,
3470 struct ieee80211_ht_capabilities *htcaps,
3471 struct ieee80211_ht_capabilities *htcaps_mask,
3476 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_max_amsdu: %d", disabled);
3481 msk = host_to_le16(HT_CAP_INFO_MAX_AMSDU_SIZE);
3482 htcaps_mask->ht_capabilities_info |= msk;
3484 htcaps->ht_capabilities_info &= msk;
3486 htcaps->ht_capabilities_info |= msk;
3492 static int wpa_set_ampdu_factor(struct wpa_supplicant *wpa_s,
3493 struct ieee80211_ht_capabilities *htcaps,
3494 struct ieee80211_ht_capabilities *htcaps_mask,
3497 wpa_msg(wpa_s, MSG_DEBUG, "set_ampdu_factor: %d", factor);
3502 if (factor < 0 || factor > 3) {
3503 wpa_msg(wpa_s, MSG_ERROR, "ampdu_factor: %d out of range. "
3504 "Must be 0-3 or -1", factor);
3508 htcaps_mask->a_mpdu_params |= 0x3; /* 2 bits for factor */
3509 htcaps->a_mpdu_params &= ~0x3;
3510 htcaps->a_mpdu_params |= factor & 0x3;
3516 static int wpa_set_ampdu_density(struct wpa_supplicant *wpa_s,
3517 struct ieee80211_ht_capabilities *htcaps,
3518 struct ieee80211_ht_capabilities *htcaps_mask,
3521 wpa_msg(wpa_s, MSG_DEBUG, "set_ampdu_density: %d", density);
3526 if (density < 0 || density > 7) {
3527 wpa_msg(wpa_s, MSG_ERROR,
3528 "ampdu_density: %d out of range. Must be 0-7 or -1.",
3533 htcaps_mask->a_mpdu_params |= 0x1C;
3534 htcaps->a_mpdu_params &= ~(0x1C);
3535 htcaps->a_mpdu_params |= (density << 2) & 0x1C;
3541 static int wpa_set_disable_ht40(struct wpa_supplicant *wpa_s,
3542 struct ieee80211_ht_capabilities *htcaps,
3543 struct ieee80211_ht_capabilities *htcaps_mask,
3546 /* Masking these out disables HT40 */
3547 le16 msk = host_to_le16(HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET |
3548 HT_CAP_INFO_SHORT_GI40MHZ);
3550 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_ht40: %d", disabled);
3553 htcaps->ht_capabilities_info &= ~msk;
3555 htcaps->ht_capabilities_info |= msk;
3557 htcaps_mask->ht_capabilities_info |= msk;
3563 static int wpa_set_disable_sgi(struct wpa_supplicant *wpa_s,
3564 struct ieee80211_ht_capabilities *htcaps,
3565 struct ieee80211_ht_capabilities *htcaps_mask,
3568 /* Masking these out disables SGI */
3569 le16 msk = host_to_le16(HT_CAP_INFO_SHORT_GI20MHZ |
3570 HT_CAP_INFO_SHORT_GI40MHZ);
3572 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_sgi: %d", disabled);
3575 htcaps->ht_capabilities_info &= ~msk;
3577 htcaps->ht_capabilities_info |= msk;
3579 htcaps_mask->ht_capabilities_info |= msk;
3585 static int wpa_set_disable_ldpc(struct wpa_supplicant *wpa_s,
3586 struct ieee80211_ht_capabilities *htcaps,
3587 struct ieee80211_ht_capabilities *htcaps_mask,
3590 /* Masking these out disables LDPC */
3591 le16 msk = host_to_le16(HT_CAP_INFO_LDPC_CODING_CAP);
3593 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_ldpc: %d", disabled);
3596 htcaps->ht_capabilities_info &= ~msk;
3598 htcaps->ht_capabilities_info |= msk;
3600 htcaps_mask->ht_capabilities_info |= msk;
3606 void wpa_supplicant_apply_ht_overrides(
3607 struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
3608 struct wpa_driver_associate_params *params)
3610 struct ieee80211_ht_capabilities *htcaps;
3611 struct ieee80211_ht_capabilities *htcaps_mask;
3616 params->disable_ht = ssid->disable_ht;
3617 if (!params->htcaps || !params->htcaps_mask)
3620 htcaps = (struct ieee80211_ht_capabilities *) params->htcaps;
3621 htcaps_mask = (struct ieee80211_ht_capabilities *) params->htcaps_mask;
3622 wpa_set_htcap_mcs(wpa_s, htcaps, htcaps_mask, ssid->ht_mcs);
3623 wpa_disable_max_amsdu(wpa_s, htcaps, htcaps_mask,
3624 ssid->disable_max_amsdu);
3625 wpa_set_ampdu_factor(wpa_s, htcaps, htcaps_mask, ssid->ampdu_factor);
3626 wpa_set_ampdu_density(wpa_s, htcaps, htcaps_mask, ssid->ampdu_density);
3627 wpa_set_disable_ht40(wpa_s, htcaps, htcaps_mask, ssid->disable_ht40);
3628 wpa_set_disable_sgi(wpa_s, htcaps, htcaps_mask, ssid->disable_sgi);
3629 wpa_set_disable_ldpc(wpa_s, htcaps, htcaps_mask, ssid->disable_ldpc);
3631 if (ssid->ht40_intolerant) {
3632 le16 bit = host_to_le16(HT_CAP_INFO_40MHZ_INTOLERANT);
3633 htcaps->ht_capabilities_info |= bit;
3634 htcaps_mask->ht_capabilities_info |= bit;
3638 #endif /* CONFIG_HT_OVERRIDES */
3641 #ifdef CONFIG_VHT_OVERRIDES
3642 void wpa_supplicant_apply_vht_overrides(
3643 struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
3644 struct wpa_driver_associate_params *params)
3646 struct ieee80211_vht_capabilities *vhtcaps;
3647 struct ieee80211_vht_capabilities *vhtcaps_mask;
3652 params->disable_vht = ssid->disable_vht;
3654 vhtcaps = (void *) params->vhtcaps;
3655 vhtcaps_mask = (void *) params->vhtcaps_mask;
3657 if (!vhtcaps || !vhtcaps_mask)
3660 vhtcaps->vht_capabilities_info = ssid->vht_capa;
3661 vhtcaps_mask->vht_capabilities_info = ssid->vht_capa_mask;
3663 #ifdef CONFIG_HT_OVERRIDES
3664 /* if max ampdu is <= 3, we have to make the HT cap the same */
3665 if (ssid->vht_capa_mask & VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX) {
3668 max_ampdu = (ssid->vht_capa &
3669 VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX) >>
3670 VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX_SHIFT;
3672 max_ampdu = max_ampdu < 3 ? max_ampdu : 3;
3673 wpa_set_ampdu_factor(wpa_s,
3674 (void *) params->htcaps,
3675 (void *) params->htcaps_mask,
3678 #endif /* CONFIG_HT_OVERRIDES */
3680 #define OVERRIDE_MCS(i) \
3681 if (ssid->vht_tx_mcs_nss_ ##i >= 0) { \
3682 vhtcaps_mask->vht_supported_mcs_set.tx_map |= \
3684 vhtcaps->vht_supported_mcs_set.tx_map |= \
3685 ssid->vht_tx_mcs_nss_ ##i << 2 * (i - 1); \
3687 if (ssid->vht_rx_mcs_nss_ ##i >= 0) { \
3688 vhtcaps_mask->vht_supported_mcs_set.rx_map |= \
3690 vhtcaps->vht_supported_mcs_set.rx_map |= \
3691 ssid->vht_rx_mcs_nss_ ##i << 2 * (i - 1); \
3703 #endif /* CONFIG_VHT_OVERRIDES */
3706 static int pcsc_reader_init(struct wpa_supplicant *wpa_s)
3711 if (!wpa_s->conf->pcsc_reader)
3714 wpa_s->scard = scard_init(wpa_s->conf->pcsc_reader);
3718 if (wpa_s->conf->pcsc_pin &&
3719 scard_set_pin(wpa_s->scard, wpa_s->conf->pcsc_pin) < 0) {
3720 scard_deinit(wpa_s->scard);
3721 wpa_s->scard = NULL;
3722 wpa_msg(wpa_s, MSG_ERROR, "PC/SC PIN validation failed");
3726 len = sizeof(wpa_s->imsi) - 1;
3727 if (scard_get_imsi(wpa_s->scard, wpa_s->imsi, &len)) {
3728 scard_deinit(wpa_s->scard);
3729 wpa_s->scard = NULL;
3730 wpa_msg(wpa_s, MSG_ERROR, "Could not read IMSI");
3733 wpa_s->imsi[len] = '\0';
3735 wpa_s->mnc_len = scard_get_mnc_len(wpa_s->scard);
3737 wpa_printf(MSG_DEBUG, "SCARD: IMSI %s (MNC length %d)",
3738 wpa_s->imsi, wpa_s->mnc_len);
3740 wpa_sm_set_scard_ctx(wpa_s->wpa, wpa_s->scard);
3741 eapol_sm_register_scard_ctx(wpa_s->eapol, wpa_s->scard);
3742 #endif /* PCSC_FUNCS */
3748 int wpas_init_ext_pw(struct wpa_supplicant *wpa_s)
3752 ext_password_deinit(wpa_s->ext_pw);
3753 wpa_s->ext_pw = NULL;
3754 eapol_sm_set_ext_pw_ctx(wpa_s->eapol, NULL);
3756 if (!wpa_s->conf->ext_password_backend)
3759 val = os_strdup(wpa_s->conf->ext_password_backend);
3762 pos = os_strchr(val, ':');
3766 wpa_printf(MSG_DEBUG, "EXT PW: Initialize backend '%s'", val);
3768 wpa_s->ext_pw = ext_password_init(val, pos);
3770 if (wpa_s->ext_pw == NULL) {
3771 wpa_printf(MSG_DEBUG, "EXT PW: Failed to initialize backend");
3774 eapol_sm_set_ext_pw_ctx(wpa_s->eapol, wpa_s->ext_pw);
3782 static const u8 * wpas_fst_get_bssid_cb(void *ctx)
3784 struct wpa_supplicant *wpa_s = ctx;
3786 return (is_zero_ether_addr(wpa_s->bssid) ||
3787 wpa_s->wpa_state != WPA_COMPLETED) ? NULL : wpa_s->bssid;
3791 static void wpas_fst_get_channel_info_cb(void *ctx,
3792 enum hostapd_hw_mode *hw_mode,
3795 struct wpa_supplicant *wpa_s = ctx;
3797 if (wpa_s->current_bss) {
3798 *hw_mode = ieee80211_freq_to_chan(wpa_s->current_bss->freq,
3800 } else if (wpa_s->hw.num_modes) {
3801 *hw_mode = wpa_s->hw.modes[0].mode;
3809 static int wpas_fst_get_hw_modes(void *ctx, struct hostapd_hw_modes **modes)
3811 struct wpa_supplicant *wpa_s = ctx;
3813 *modes = wpa_s->hw.modes;
3814 return wpa_s->hw.num_modes;
3818 static void wpas_fst_set_ies_cb(void *ctx, const struct wpabuf *fst_ies)
3820 struct wpa_supplicant *wpa_s = ctx;
3822 wpa_hexdump_buf(MSG_DEBUG, "FST: Set IEs", fst_ies);
3823 wpa_s->fst_ies = fst_ies;
3827 static int wpas_fst_send_action_cb(void *ctx, const u8 *da, struct wpabuf *data)
3829 struct wpa_supplicant *wpa_s = ctx;
3831 WPA_ASSERT(os_memcmp(wpa_s->bssid, da, ETH_ALEN) == 0);
3832 return wpa_drv_send_action(wpa_s, wpa_s->assoc_freq, 0, wpa_s->bssid,
3833 wpa_s->own_addr, wpa_s->bssid,
3834 wpabuf_head(data), wpabuf_len(data),
3839 static const struct wpabuf * wpas_fst_get_mb_ie_cb(void *ctx, const u8 *addr)
3841 struct wpa_supplicant *wpa_s = ctx;
3843 WPA_ASSERT(os_memcmp(wpa_s->bssid, addr, ETH_ALEN) == 0);
3844 return wpa_s->received_mb_ies;
3848 static void wpas_fst_update_mb_ie_cb(void *ctx, const u8 *addr,
3849 const u8 *buf, size_t size)
3851 struct wpa_supplicant *wpa_s = ctx;
3852 struct mb_ies_info info;
3854 WPA_ASSERT(os_memcmp(wpa_s->bssid, addr, ETH_ALEN) == 0);
3856 if (!mb_ies_info_by_ies(&info, buf, size)) {
3857 wpabuf_free(wpa_s->received_mb_ies);
3858 wpa_s->received_mb_ies = mb_ies_by_info(&info);
3863 const u8 * wpas_fst_get_peer_first(void *ctx, struct fst_get_peer_ctx **get_ctx,
3866 struct wpa_supplicant *wpa_s = ctx;
3869 if (!is_zero_ether_addr(wpa_s->bssid))
3870 return (wpa_s->received_mb_ies || !mb_only) ?
3871 wpa_s->bssid : NULL;
3876 const u8 * wpas_fst_get_peer_next(void *ctx, struct fst_get_peer_ctx **get_ctx,
3882 void fst_wpa_supplicant_fill_iface_obj(struct wpa_supplicant *wpa_s,
3883 struct fst_wpa_obj *iface_obj)
3885 iface_obj->ctx = wpa_s;
3886 iface_obj->get_bssid = wpas_fst_get_bssid_cb;
3887 iface_obj->get_channel_info = wpas_fst_get_channel_info_cb;
3888 iface_obj->get_hw_modes = wpas_fst_get_hw_modes;
3889 iface_obj->set_ies = wpas_fst_set_ies_cb;
3890 iface_obj->send_action = wpas_fst_send_action_cb;
3891 iface_obj->get_mb_ie = wpas_fst_get_mb_ie_cb;
3892 iface_obj->update_mb_ie = wpas_fst_update_mb_ie_cb;
3893 iface_obj->get_peer_first = wpas_fst_get_peer_first;
3894 iface_obj->get_peer_next = wpas_fst_get_peer_next;
3896 #endif /* CONFIG_FST */
3898 static int wpas_set_wowlan_triggers(struct wpa_supplicant *wpa_s,
3899 const struct wpa_driver_capa *capa)
3901 struct wowlan_triggers *triggers;
3904 if (!wpa_s->conf->wowlan_triggers)
3907 triggers = wpa_get_wowlan_triggers(wpa_s->conf->wowlan_triggers, capa);
3909 ret = wpa_drv_wowlan(wpa_s, triggers);
3916 static enum wpa_radio_work_band wpas_freq_to_band(int freq)
3919 return BAND_2_4_GHZ;
3926 static unsigned int wpas_get_bands(struct wpa_supplicant *wpa_s,
3930 unsigned int band = 0;
3933 /* freqs are specified for the radio work */
3934 for (i = 0; freqs[i]; i++)
3935 band |= wpas_freq_to_band(freqs[i]);
3938 * freqs are not specified, implies all
3939 * the supported freqs by HW
3941 for (i = 0; i < wpa_s->hw.num_modes; i++) {
3942 if (wpa_s->hw.modes[i].num_channels != 0) {
3943 if (wpa_s->hw.modes[i].mode ==
3944 HOSTAPD_MODE_IEEE80211B ||
3945 wpa_s->hw.modes[i].mode ==
3946 HOSTAPD_MODE_IEEE80211G)
3947 band |= BAND_2_4_GHZ;
3948 else if (wpa_s->hw.modes[i].mode ==
3949 HOSTAPD_MODE_IEEE80211A)
3951 else if (wpa_s->hw.modes[i].mode ==
3952 HOSTAPD_MODE_IEEE80211AD)
3953 band |= BAND_60_GHZ;
3954 else if (wpa_s->hw.modes[i].mode ==
3955 HOSTAPD_MODE_IEEE80211ANY)
3956 band = BAND_2_4_GHZ | BAND_5_GHZ |
3966 static struct wpa_radio * radio_add_interface(struct wpa_supplicant *wpa_s,
3969 struct wpa_supplicant *iface = wpa_s->global->ifaces;
3970 struct wpa_radio *radio;
3972 while (rn && iface) {
3973 radio = iface->radio;
3974 if (radio && os_strcmp(rn, radio->name) == 0) {
3975 wpa_printf(MSG_DEBUG, "Add interface %s to existing radio %s",
3977 dl_list_add(&radio->ifaces, &wpa_s->radio_list);
3981 iface = iface->next;
3984 wpa_printf(MSG_DEBUG, "Add interface %s to a new radio %s",
3985 wpa_s->ifname, rn ? rn : "N/A");
3986 radio = os_zalloc(sizeof(*radio));
3991 os_strlcpy(radio->name, rn, sizeof(radio->name));
3992 dl_list_init(&radio->ifaces);
3993 dl_list_init(&radio->work);
3994 dl_list_add(&radio->ifaces, &wpa_s->radio_list);
4000 static void radio_work_free(struct wpa_radio_work *work)
4002 if (work->wpa_s->scan_work == work) {
4003 /* This should not really happen. */
4004 wpa_dbg(work->wpa_s, MSG_INFO, "Freeing radio work '%s'@%p (started=%d) that is marked as scan_work",
4005 work->type, work, work->started);
4006 work->wpa_s->scan_work = NULL;
4010 if (work->wpa_s->p2p_scan_work == work) {
4011 /* This should not really happen. */
4012 wpa_dbg(work->wpa_s, MSG_INFO, "Freeing radio work '%s'@%p (started=%d) that is marked as p2p_scan_work",
4013 work->type, work, work->started);
4014 work->wpa_s->p2p_scan_work = NULL;
4016 #endif /* CONFIG_P2P */
4018 if (work->started) {
4019 work->wpa_s->radio->num_active_works--;
4020 wpa_dbg(work->wpa_s, MSG_DEBUG,
4021 "radio_work_free('%s'@%p: num_active_works --> %u",
4023 work->wpa_s->radio->num_active_works);
4026 dl_list_del(&work->list);
4031 static struct wpa_radio_work * radio_work_get_next_work(struct wpa_radio *radio)
4033 struct wpa_radio_work *active_work = NULL;
4034 struct wpa_radio_work *tmp;
4036 /* Get the active work to know the type and band. */
4037 dl_list_for_each(tmp, &radio->work, struct wpa_radio_work, list) {
4045 /* No active work, start one */
4046 radio->num_active_works = 0;
4047 dl_list_for_each(tmp, &radio->work, struct wpa_radio_work,
4049 if (os_strcmp(tmp->type, "scan") == 0 &&
4050 radio->external_scan_running &&
4051 (((struct wpa_driver_scan_params *)
4052 tmp->ctx)->only_new_results ||
4053 tmp->wpa_s->clear_driver_scan_cache))
4060 if (os_strcmp(active_work->type, "sme-connect") == 0 ||
4061 os_strcmp(active_work->type, "connect") == 0) {
4063 * If the active work is either connect or sme-connect,
4064 * do not parallelize them with other radio works.
4066 wpa_dbg(active_work->wpa_s, MSG_DEBUG,
4067 "Do not parallelize radio work with %s",
4072 dl_list_for_each(tmp, &radio->work, struct wpa_radio_work, list) {
4077 * If connect or sme-connect are enqueued, parallelize only
4078 * those operations ahead of them in the queue.
4080 if (os_strcmp(tmp->type, "connect") == 0 ||
4081 os_strcmp(tmp->type, "sme-connect") == 0)
4085 * Check that the radio works are distinct and
4086 * on different bands.
4088 if (os_strcmp(active_work->type, tmp->type) != 0 &&
4089 (active_work->bands != tmp->bands)) {
4091 * If a scan has to be scheduled through nl80211 scan
4092 * interface and if an external scan is already running,
4093 * do not schedule the scan since it is likely to get
4094 * rejected by kernel.
4096 if (os_strcmp(tmp->type, "scan") == 0 &&
4097 radio->external_scan_running &&
4098 (((struct wpa_driver_scan_params *)
4099 tmp->ctx)->only_new_results ||
4100 tmp->wpa_s->clear_driver_scan_cache))
4103 wpa_dbg(active_work->wpa_s, MSG_DEBUG,
4104 "active_work:%s new_work:%s",
4105 active_work->type, tmp->type);
4110 /* Did not find a radio work to schedule in parallel. */
4115 static void radio_start_next_work(void *eloop_ctx, void *timeout_ctx)
4117 struct wpa_radio *radio = eloop_ctx;
4118 struct wpa_radio_work *work;
4119 struct os_reltime now, diff;
4120 struct wpa_supplicant *wpa_s;
4122 work = dl_list_first(&radio->work, struct wpa_radio_work, list);
4124 radio->num_active_works = 0;
4128 wpa_s = dl_list_first(&radio->ifaces, struct wpa_supplicant,
4132 wpa_s->drv_flags & WPA_DRIVER_FLAGS_OFFCHANNEL_SIMULTANEOUS)) {
4134 return; /* already started and still in progress */
4136 if (wpa_s && wpa_s->radio->external_scan_running) {
4137 wpa_printf(MSG_DEBUG, "Delay radio work start until externally triggered scan completes");
4142 if (radio->num_active_works < MAX_ACTIVE_WORKS) {
4143 /* get the work to schedule next */
4144 work = radio_work_get_next_work(radio);
4150 wpa_s = work->wpa_s;
4151 os_get_reltime(&now);
4152 os_reltime_sub(&now, &work->time, &diff);
4153 wpa_dbg(wpa_s, MSG_DEBUG,
4154 "Starting radio work '%s'@%p after %ld.%06ld second wait",
4155 work->type, work, diff.sec, diff.usec);
4158 radio->num_active_works++;
4162 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_OFFCHANNEL_SIMULTANEOUS) &&
4163 radio->num_active_works < MAX_ACTIVE_WORKS)
4164 radio_work_check_next(wpa_s);
4169 * This function removes both started and pending radio works running on
4170 * the provided interface's radio.
4171 * Prior to the removal of the radio work, its callback (cb) is called with
4172 * deinit set to be 1. Each work's callback is responsible for clearing its
4173 * internal data and restoring to a correct state.
4174 * @wpa_s: wpa_supplicant data
4175 * @type: type of works to be removed
4176 * @remove_all: 1 to remove all the works on this radio, 0 to remove only
4177 * this interface's works.
4179 void radio_remove_works(struct wpa_supplicant *wpa_s,
4180 const char *type, int remove_all)
4182 struct wpa_radio_work *work, *tmp;
4183 struct wpa_radio *radio = wpa_s->radio;
4185 dl_list_for_each_safe(work, tmp, &radio->work, struct wpa_radio_work,
4187 if (type && os_strcmp(type, work->type) != 0)
4190 /* skip other ifaces' works */
4191 if (!remove_all && work->wpa_s != wpa_s)
4194 wpa_dbg(wpa_s, MSG_DEBUG, "Remove radio work '%s'@%p%s",
4195 work->type, work, work->started ? " (started)" : "");
4197 radio_work_free(work);
4200 /* in case we removed the started work */
4201 radio_work_check_next(wpa_s);
4205 static void radio_remove_interface(struct wpa_supplicant *wpa_s)
4207 struct wpa_radio *radio = wpa_s->radio;
4212 wpa_printf(MSG_DEBUG, "Remove interface %s from radio %s",
4213 wpa_s->ifname, radio->name);
4214 dl_list_del(&wpa_s->radio_list);
4215 radio_remove_works(wpa_s, NULL, 0);
4216 wpa_s->radio = NULL;
4217 if (!dl_list_empty(&radio->ifaces))
4218 return; /* Interfaces remain for this radio */
4220 wpa_printf(MSG_DEBUG, "Remove radio %s", radio->name);
4221 eloop_cancel_timeout(radio_start_next_work, radio, NULL);
4226 void radio_work_check_next(struct wpa_supplicant *wpa_s)
4228 struct wpa_radio *radio = wpa_s->radio;
4230 if (dl_list_empty(&radio->work))
4232 if (wpa_s->ext_work_in_progress) {
4233 wpa_printf(MSG_DEBUG,
4234 "External radio work in progress - delay start of pending item");
4237 eloop_cancel_timeout(radio_start_next_work, radio, NULL);
4238 eloop_register_timeout(0, 0, radio_start_next_work, radio, NULL);
4243 * radio_add_work - Add a radio work item
4244 * @wpa_s: Pointer to wpa_supplicant data
4245 * @freq: Frequency of the offchannel operation in MHz or 0
4246 * @type: Unique identifier for each type of work
4247 * @next: Force as the next work to be executed
4248 * @cb: Callback function for indicating when radio is available
4249 * @ctx: Context pointer for the work (work->ctx in cb())
4250 * Returns: 0 on success, -1 on failure
4252 * This function is used to request time for an operation that requires
4253 * exclusive radio control. Once the radio is available, the registered callback
4254 * function will be called. radio_work_done() must be called once the exclusive
4255 * radio operation has been completed, so that the radio is freed for other
4256 * operations. The special case of deinit=1 is used to free the context data
4257 * during interface removal. That does not allow the callback function to start
4258 * the radio operation, i.e., it must free any resources allocated for the radio
4261 * The @freq parameter can be used to indicate a single channel on which the
4262 * offchannel operation will occur. This may allow multiple radio work
4263 * operations to be performed in parallel if they apply for the same channel.
4264 * Setting this to 0 indicates that the work item may use multiple channels or
4265 * requires exclusive control of the radio.
4267 int radio_add_work(struct wpa_supplicant *wpa_s, unsigned int freq,
4268 const char *type, int next,
4269 void (*cb)(struct wpa_radio_work *work, int deinit),
4272 struct wpa_radio *radio = wpa_s->radio;
4273 struct wpa_radio_work *work;
4276 work = os_zalloc(sizeof(*work));
4279 wpa_dbg(wpa_s, MSG_DEBUG, "Add radio work '%s'@%p", type, work);
4280 os_get_reltime(&work->time);
4283 work->wpa_s = wpa_s;
4288 work->bands = wpas_freq_to_band(freq);
4289 else if (os_strcmp(type, "scan") == 0 ||
4290 os_strcmp(type, "p2p-scan") == 0)
4291 work->bands = wpas_get_bands(wpa_s,
4292 ((struct wpa_driver_scan_params *)
4295 work->bands = wpas_get_bands(wpa_s, NULL);
4297 was_empty = dl_list_empty(&wpa_s->radio->work);
4299 dl_list_add(&wpa_s->radio->work, &work->list);
4301 dl_list_add_tail(&wpa_s->radio->work, &work->list);
4303 wpa_dbg(wpa_s, MSG_DEBUG, "First radio work item in the queue - schedule start immediately");
4304 radio_work_check_next(wpa_s);
4305 } else if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_OFFCHANNEL_SIMULTANEOUS)
4306 && radio->num_active_works < MAX_ACTIVE_WORKS) {
4307 wpa_dbg(wpa_s, MSG_DEBUG,
4308 "Try to schedule a radio work (num_active_works=%u)",
4309 radio->num_active_works);
4310 radio_work_check_next(wpa_s);
4318 * radio_work_done - Indicate that a radio work item has been completed
4319 * @work: Completed work
4321 * This function is called once the callback function registered with
4322 * radio_add_work() has completed its work.
4324 void radio_work_done(struct wpa_radio_work *work)
4326 struct wpa_supplicant *wpa_s = work->wpa_s;
4327 struct os_reltime now, diff;
4328 unsigned int started = work->started;
4330 os_get_reltime(&now);
4331 os_reltime_sub(&now, &work->time, &diff);
4332 wpa_dbg(wpa_s, MSG_DEBUG, "Radio work '%s'@%p %s in %ld.%06ld seconds",
4333 work->type, work, started ? "done" : "canceled",
4334 diff.sec, diff.usec);
4335 radio_work_free(work);
4337 radio_work_check_next(wpa_s);
4341 struct wpa_radio_work *
4342 radio_work_pending(struct wpa_supplicant *wpa_s, const char *type)
4344 struct wpa_radio_work *work;
4345 struct wpa_radio *radio = wpa_s->radio;
4347 dl_list_for_each(work, &radio->work, struct wpa_radio_work, list) {
4348 if (work->wpa_s == wpa_s && os_strcmp(work->type, type) == 0)
4356 static int wpas_init_driver(struct wpa_supplicant *wpa_s,
4357 struct wpa_interface *iface)
4359 const char *ifname, *driver, *rn;
4361 driver = iface->driver;
4363 if (wpa_supplicant_set_driver(wpa_s, driver) < 0)
4366 wpa_s->drv_priv = wpa_drv_init(wpa_s, wpa_s->ifname);
4367 if (wpa_s->drv_priv == NULL) {
4369 pos = driver ? os_strchr(driver, ',') : NULL;
4371 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize "
4372 "driver interface - try next driver wrapper");
4376 wpa_msg(wpa_s, MSG_ERROR, "Failed to initialize driver "
4380 if (wpa_drv_set_param(wpa_s, wpa_s->conf->driver_param) < 0) {
4381 wpa_msg(wpa_s, MSG_ERROR, "Driver interface rejected "
4382 "driver_param '%s'", wpa_s->conf->driver_param);
4386 ifname = wpa_drv_get_ifname(wpa_s);
4387 if (ifname && os_strcmp(ifname, wpa_s->ifname) != 0) {
4388 wpa_dbg(wpa_s, MSG_DEBUG, "Driver interface replaced "
4389 "interface name with '%s'", ifname);
4390 os_strlcpy(wpa_s->ifname, ifname, sizeof(wpa_s->ifname));
4393 rn = wpa_driver_get_radio_name(wpa_s);
4394 if (rn && rn[0] == '\0')
4397 wpa_s->radio = radio_add_interface(wpa_s, rn);
4398 if (wpa_s->radio == NULL)
4405 static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
4406 struct wpa_interface *iface)
4408 struct wpa_driver_capa capa;
4411 wpa_printf(MSG_DEBUG, "Initializing interface '%s' conf '%s' driver "
4412 "'%s' ctrl_interface '%s' bridge '%s'", iface->ifname,
4413 iface->confname ? iface->confname : "N/A",
4414 iface->driver ? iface->driver : "default",
4415 iface->ctrl_interface ? iface->ctrl_interface : "N/A",
4416 iface->bridge_ifname ? iface->bridge_ifname : "N/A");
4418 if (iface->confname) {
4419 #ifdef CONFIG_BACKEND_FILE
4420 wpa_s->confname = os_rel2abs_path(iface->confname);
4421 if (wpa_s->confname == NULL) {
4422 wpa_printf(MSG_ERROR, "Failed to get absolute path "
4423 "for configuration file '%s'.",
4427 wpa_printf(MSG_DEBUG, "Configuration file '%s' -> '%s'",
4428 iface->confname, wpa_s->confname);
4429 #else /* CONFIG_BACKEND_FILE */
4430 wpa_s->confname = os_strdup(iface->confname);
4431 #endif /* CONFIG_BACKEND_FILE */
4432 wpa_s->conf = wpa_config_read(wpa_s->confname, NULL);
4433 if (wpa_s->conf == NULL) {
4434 wpa_printf(MSG_ERROR, "Failed to read or parse "
4435 "configuration '%s'.", wpa_s->confname);
4438 wpa_s->confanother = os_rel2abs_path(iface->confanother);
4439 wpa_config_read(wpa_s->confanother, wpa_s->conf);
4442 * Override ctrl_interface and driver_param if set on command
4445 if (iface->ctrl_interface) {
4446 os_free(wpa_s->conf->ctrl_interface);
4447 wpa_s->conf->ctrl_interface =
4448 os_strdup(iface->ctrl_interface);
4451 if (iface->driver_param) {
4452 os_free(wpa_s->conf->driver_param);
4453 wpa_s->conf->driver_param =
4454 os_strdup(iface->driver_param);
4457 if (iface->p2p_mgmt && !iface->ctrl_interface) {
4458 os_free(wpa_s->conf->ctrl_interface);
4459 wpa_s->conf->ctrl_interface = NULL;
4462 wpa_s->conf = wpa_config_alloc_empty(iface->ctrl_interface,
4463 iface->driver_param);
4465 if (wpa_s->conf == NULL) {
4466 wpa_printf(MSG_ERROR, "\nNo configuration found.");
4470 if (iface->ifname == NULL) {
4471 wpa_printf(MSG_ERROR, "\nInterface name is required.");
4474 if (os_strlen(iface->ifname) >= sizeof(wpa_s->ifname)) {
4475 wpa_printf(MSG_ERROR, "\nToo long interface name '%s'.",
4479 os_strlcpy(wpa_s->ifname, iface->ifname, sizeof(wpa_s->ifname));
4481 if (iface->bridge_ifname) {
4482 if (os_strlen(iface->bridge_ifname) >=
4483 sizeof(wpa_s->bridge_ifname)) {
4484 wpa_printf(MSG_ERROR, "\nToo long bridge interface "
4485 "name '%s'.", iface->bridge_ifname);
4488 os_strlcpy(wpa_s->bridge_ifname, iface->bridge_ifname,
4489 sizeof(wpa_s->bridge_ifname));
4492 /* RSNA Supplicant Key Management - INITIALIZE */
4493 eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
4494 eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
4496 /* Initialize driver interface and register driver event handler before
4497 * L2 receive handler so that association events are processed before
4498 * EAPOL-Key packets if both become available for the same select()
4500 if (wpas_init_driver(wpa_s, iface) < 0)
4503 if (wpa_supplicant_init_wpa(wpa_s) < 0)
4506 wpa_sm_set_ifname(wpa_s->wpa, wpa_s->ifname,
4507 wpa_s->bridge_ifname[0] ? wpa_s->bridge_ifname :
4509 wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
4511 if (wpa_s->conf->dot11RSNAConfigPMKLifetime &&
4512 wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_LIFETIME,
4513 wpa_s->conf->dot11RSNAConfigPMKLifetime)) {
4514 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
4515 "dot11RSNAConfigPMKLifetime");
4519 if (wpa_s->conf->dot11RSNAConfigPMKReauthThreshold &&
4520 wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_REAUTH_THRESHOLD,
4521 wpa_s->conf->dot11RSNAConfigPMKReauthThreshold)) {
4522 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
4523 "dot11RSNAConfigPMKReauthThreshold");
4527 if (wpa_s->conf->dot11RSNAConfigSATimeout &&
4528 wpa_sm_set_param(wpa_s->wpa, RSNA_SA_TIMEOUT,
4529 wpa_s->conf->dot11RSNAConfigSATimeout)) {
4530 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
4531 "dot11RSNAConfigSATimeout");
4535 wpa_s->hw.modes = wpa_drv_get_hw_feature_data(wpa_s,
4536 &wpa_s->hw.num_modes,
4538 if (wpa_s->hw.modes) {
4541 for (i = 0; i < wpa_s->hw.num_modes; i++) {
4542 if (wpa_s->hw.modes[i].vht_capab) {
4543 wpa_s->hw_capab = CAPAB_VHT;
4547 if (wpa_s->hw.modes[i].ht_capab &
4548 HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET)
4549 wpa_s->hw_capab = CAPAB_HT40;
4550 else if (wpa_s->hw.modes[i].ht_capab &&
4551 wpa_s->hw_capab == CAPAB_NO_HT_VHT)
4552 wpa_s->hw_capab = CAPAB_HT;
4556 capa_res = wpa_drv_get_capa(wpa_s, &capa);
4557 if (capa_res == 0) {
4558 wpa_s->drv_capa_known = 1;
4559 wpa_s->drv_flags = capa.flags;
4560 wpa_s->drv_enc = capa.enc;
4561 wpa_s->drv_smps_modes = capa.smps_modes;
4562 wpa_s->drv_rrm_flags = capa.rrm_flags;
4563 wpa_s->probe_resp_offloads = capa.probe_resp_offloads;
4564 wpa_s->max_scan_ssids = capa.max_scan_ssids;
4565 wpa_s->max_sched_scan_ssids = capa.max_sched_scan_ssids;
4566 wpa_s->sched_scan_supported = capa.sched_scan_supported;
4567 wpa_s->max_match_sets = capa.max_match_sets;
4568 wpa_s->max_remain_on_chan = capa.max_remain_on_chan;
4569 wpa_s->max_stations = capa.max_stations;
4570 wpa_s->extended_capa = capa.extended_capa;
4571 wpa_s->extended_capa_mask = capa.extended_capa_mask;
4572 wpa_s->extended_capa_len = capa.extended_capa_len;
4573 wpa_s->num_multichan_concurrent =
4574 capa.num_multichan_concurrent;
4575 wpa_s->wmm_ac_supported = capa.wmm_ac_supported;
4577 if (capa.mac_addr_rand_scan_supported)
4578 wpa_s->mac_addr_rand_supported |= MAC_ADDR_RAND_SCAN;
4579 if (wpa_s->sched_scan_supported &&
4580 capa.mac_addr_rand_sched_scan_supported)
4581 wpa_s->mac_addr_rand_supported |=
4582 (MAC_ADDR_RAND_SCHED_SCAN | MAC_ADDR_RAND_PNO);
4584 if (wpa_s->max_remain_on_chan == 0)
4585 wpa_s->max_remain_on_chan = 1000;
4588 * Only take p2p_mgmt parameters when P2P Device is supported.
4589 * Doing it here as it determines whether l2_packet_init() will be done
4590 * during wpa_supplicant_driver_init().
4592 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)
4593 wpa_s->p2p_mgmt = iface->p2p_mgmt;
4595 iface->p2p_mgmt = 1;
4597 if (wpa_s->num_multichan_concurrent == 0)
4598 wpa_s->num_multichan_concurrent = 1;
4600 if (wpa_supplicant_driver_init(wpa_s) < 0)
4604 if ((!iface->p2p_mgmt ||
4605 !(wpa_s->drv_flags &
4606 WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)) &&
4607 wpa_tdls_init(wpa_s->wpa))
4609 #endif /* CONFIG_TDLS */
4611 if (wpa_s->conf->country[0] && wpa_s->conf->country[1] &&
4612 wpa_drv_set_country(wpa_s, wpa_s->conf->country)) {
4613 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to set country");
4618 if (wpa_s->conf->fst_group_id) {
4619 struct fst_iface_cfg cfg;
4620 struct fst_wpa_obj iface_obj;
4622 fst_wpa_supplicant_fill_iface_obj(wpa_s, &iface_obj);
4623 os_strlcpy(cfg.group_id, wpa_s->conf->fst_group_id,
4624 sizeof(cfg.group_id));
4625 cfg.priority = wpa_s->conf->fst_priority;
4626 cfg.llt = wpa_s->conf->fst_llt;
4628 wpa_s->fst = fst_attach(wpa_s->ifname, wpa_s->own_addr,
4631 wpa_msg(wpa_s, MSG_ERROR,
4632 "FST: Cannot attach iface %s to group %s",
4633 wpa_s->ifname, cfg.group_id);
4637 #endif /* CONFIG_FST */
4639 if (wpas_wps_init(wpa_s))
4642 if (wpa_supplicant_init_eapol(wpa_s) < 0)
4644 wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
4646 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
4647 if (wpa_s->ctrl_iface == NULL) {
4648 wpa_printf(MSG_ERROR,
4649 "Failed to initialize control interface '%s'.\n"
4650 "You may have another wpa_supplicant process "
4651 "already running or the file was\n"
4652 "left by an unclean termination of wpa_supplicant "
4653 "in which case you will need\n"
4654 "to manually remove this file before starting "
4655 "wpa_supplicant again.\n",
4656 wpa_s->conf->ctrl_interface);
4660 wpa_s->gas = gas_query_init(wpa_s);
4661 if (wpa_s->gas == NULL) {
4662 wpa_printf(MSG_ERROR, "Failed to initialize GAS query");
4666 if (iface->p2p_mgmt && wpas_p2p_init(wpa_s->global, wpa_s) < 0) {
4667 wpa_msg(wpa_s, MSG_ERROR, "Failed to init P2P");
4671 if (wpa_bss_init(wpa_s) < 0)
4675 * Set Wake-on-WLAN triggers, if configured.
4676 * Note: We don't restore/remove the triggers on shutdown (it doesn't
4677 * have effect anyway when the interface is down).
4679 if (capa_res == 0 && wpas_set_wowlan_triggers(wpa_s, &capa) < 0)
4682 #ifdef CONFIG_EAP_PROXY
4685 wpa_s->mnc_len = eapol_sm_get_eap_proxy_imsi(wpa_s->eapol, wpa_s->imsi,
4687 if (wpa_s->mnc_len > 0) {
4688 wpa_s->imsi[len] = '\0';
4689 wpa_printf(MSG_DEBUG, "eap_proxy: IMSI %s (MNC length %d)",
4690 wpa_s->imsi, wpa_s->mnc_len);
4692 wpa_printf(MSG_DEBUG, "eap_proxy: IMSI not available");
4695 #endif /* CONFIG_EAP_PROXY */
4697 if (pcsc_reader_init(wpa_s) < 0)
4700 if (wpas_init_ext_pw(wpa_s) < 0)
4703 wpas_rrm_reset(wpa_s);
4709 static void wpa_supplicant_deinit_iface(struct wpa_supplicant *wpa_s,
4710 int notify, int terminate)
4712 struct wpa_global *global = wpa_s->global;
4713 struct wpa_supplicant *iface, *prev;
4715 if (wpa_s == wpa_s->parent)
4716 wpas_p2p_group_remove(wpa_s, "*");
4718 iface = global->ifaces;
4720 if (iface == wpa_s || iface->parent != wpa_s) {
4721 iface = iface->next;
4724 wpa_printf(MSG_DEBUG,
4725 "Remove remaining child interface %s from parent %s",
4726 iface->ifname, wpa_s->ifname);
4728 iface = iface->next;
4729 wpa_supplicant_remove_iface(global, prev, terminate);
4732 wpa_s->disconnected = 1;
4733 if (wpa_s->drv_priv) {
4734 wpa_supplicant_deauthenticate(wpa_s,
4735 WLAN_REASON_DEAUTH_LEAVING);
4737 wpa_drv_set_countermeasures(wpa_s, 0);
4738 wpa_clear_keys(wpa_s, NULL);
4741 wpa_supplicant_cleanup(wpa_s);
4742 wpas_p2p_deinit_iface(wpa_s);
4744 wpas_ctrl_radio_work_flush(wpa_s);
4745 radio_remove_interface(wpa_s);
4749 fst_detach(wpa_s->fst);
4752 if (wpa_s->received_mb_ies) {
4753 wpabuf_free(wpa_s->received_mb_ies);
4754 wpa_s->received_mb_ies = NULL;
4756 #endif /* CONFIG_FST */
4758 if (wpa_s->drv_priv)
4759 wpa_drv_deinit(wpa_s);
4762 wpas_notify_iface_removed(wpa_s);
4765 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TERMINATING);
4767 if (wpa_s->ctrl_iface) {
4768 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
4769 wpa_s->ctrl_iface = NULL;
4774 wpa_supplicant_mesh_iface_deinit(wpa_s, wpa_s->ifmsh);
4775 wpa_s->ifmsh = NULL;
4777 #endif /* CONFIG_MESH */
4779 if (wpa_s->conf != NULL) {
4780 wpa_config_free(wpa_s->conf);
4784 os_free(wpa_s->ssids_from_scan_req);
4791 * wpa_supplicant_add_iface - Add a new network interface
4792 * @global: Pointer to global data from wpa_supplicant_init()
4793 * @iface: Interface configuration options
4794 * @parent: Parent interface or %NULL to assign new interface as parent
4795 * Returns: Pointer to the created interface or %NULL on failure
4797 * This function is used to add new network interfaces for %wpa_supplicant.
4798 * This can be called before wpa_supplicant_run() to add interfaces before the
4799 * main event loop has been started. In addition, new interfaces can be added
4800 * dynamically while %wpa_supplicant is already running. This could happen,
4801 * e.g., when a hotplug network adapter is inserted.
4803 struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
4804 struct wpa_interface *iface,
4805 struct wpa_supplicant *parent)
4807 struct wpa_supplicant *wpa_s;
4808 struct wpa_interface t_iface;
4809 struct wpa_ssid *ssid;
4811 if (global == NULL || iface == NULL)
4814 wpa_s = wpa_supplicant_alloc(parent);
4818 wpa_s->global = global;
4821 if (global->params.override_driver) {
4822 wpa_printf(MSG_DEBUG, "Override interface parameter: driver "
4824 iface->driver, global->params.override_driver);
4825 t_iface.driver = global->params.override_driver;
4827 if (global->params.override_ctrl_interface) {
4828 wpa_printf(MSG_DEBUG, "Override interface parameter: "
4829 "ctrl_interface ('%s' -> '%s')",
4830 iface->ctrl_interface,
4831 global->params.override_ctrl_interface);
4832 t_iface.ctrl_interface =
4833 global->params.override_ctrl_interface;
4835 if (wpa_supplicant_init_iface(wpa_s, &t_iface)) {
4836 wpa_printf(MSG_DEBUG, "Failed to add interface %s",
4838 wpa_supplicant_deinit_iface(wpa_s, 0, 0);
4842 if (iface->p2p_mgmt == 0) {
4843 /* Notify the control interfaces about new iface */
4844 if (wpas_notify_iface_added(wpa_s)) {
4845 wpa_supplicant_deinit_iface(wpa_s, 1, 0);
4849 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
4850 wpas_notify_network_added(wpa_s, ssid);
4853 wpa_s->next = global->ifaces;
4854 global->ifaces = wpa_s;
4856 wpa_dbg(wpa_s, MSG_DEBUG, "Added interface %s", wpa_s->ifname);
4857 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
4860 if (wpa_s->global->p2p == NULL &&
4861 !wpa_s->global->p2p_disabled && !wpa_s->conf->p2p_disabled &&
4862 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE) &&
4863 wpas_p2p_add_p2pdev_interface(
4864 wpa_s, wpa_s->global->params.conf_p2p_dev) < 0) {
4865 wpa_printf(MSG_INFO,
4866 "P2P: Failed to enable P2P Device interface");
4867 /* Try to continue without. P2P will be disabled. */
4869 #endif /* CONFIG_P2P */
4876 * wpa_supplicant_remove_iface - Remove a network interface
4877 * @global: Pointer to global data from wpa_supplicant_init()
4878 * @wpa_s: Pointer to the network interface to be removed
4879 * Returns: 0 if interface was removed, -1 if interface was not found
4881 * This function can be used to dynamically remove network interfaces from
4882 * %wpa_supplicant, e.g., when a hotplug network adapter is ejected. In
4883 * addition, this function is used to remove all remaining interfaces when
4884 * %wpa_supplicant is terminated.
4886 int wpa_supplicant_remove_iface(struct wpa_global *global,
4887 struct wpa_supplicant *wpa_s,
4890 struct wpa_supplicant *prev;
4892 unsigned int mesh_if_created = wpa_s->mesh_if_created;
4893 char *ifname = NULL;
4894 #endif /* CONFIG_MESH */
4896 /* Remove interface from the global list of interfaces */
4897 prev = global->ifaces;
4898 if (prev == wpa_s) {
4899 global->ifaces = wpa_s->next;
4901 while (prev && prev->next != wpa_s)
4905 prev->next = wpa_s->next;
4908 wpa_dbg(wpa_s, MSG_DEBUG, "Removing interface %s", wpa_s->ifname);
4911 if (mesh_if_created) {
4912 ifname = os_strdup(wpa_s->ifname);
4913 if (ifname == NULL) {
4914 wpa_dbg(wpa_s, MSG_ERROR,
4915 "mesh: Failed to malloc ifname");
4919 #endif /* CONFIG_MESH */
4921 if (global->p2p_group_formation == wpa_s)
4922 global->p2p_group_formation = NULL;
4923 if (global->p2p_invite_group == wpa_s)
4924 global->p2p_invite_group = NULL;
4925 wpa_supplicant_deinit_iface(wpa_s, 1, terminate);
4928 if (mesh_if_created) {
4929 wpa_drv_if_remove(global->ifaces, WPA_IF_MESH, ifname);
4932 #endif /* CONFIG_MESH */
4939 * wpa_supplicant_get_eap_mode - Get the current EAP mode
4940 * @wpa_s: Pointer to the network interface
4941 * Returns: Pointer to the eap mode or the string "UNKNOWN" if not found
4943 const char * wpa_supplicant_get_eap_mode(struct wpa_supplicant *wpa_s)
4945 const char *eapol_method;
4947 if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) == 0 &&
4948 wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
4952 eapol_method = eapol_sm_get_method_name(wpa_s->eapol);
4953 if (eapol_method == NULL)
4954 return "UNKNOWN-EAP";
4956 return eapol_method;
4961 * wpa_supplicant_get_iface - Get a new network interface
4962 * @global: Pointer to global data from wpa_supplicant_init()
4963 * @ifname: Interface name
4964 * Returns: Pointer to the interface or %NULL if not found
4966 struct wpa_supplicant * wpa_supplicant_get_iface(struct wpa_global *global,
4969 struct wpa_supplicant *wpa_s;
4971 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
4972 if (os_strcmp(wpa_s->ifname, ifname) == 0)
4979 #ifndef CONFIG_NO_WPA_MSG
4980 static const char * wpa_supplicant_msg_ifname_cb(void *ctx)
4982 struct wpa_supplicant *wpa_s = ctx;
4985 return wpa_s->ifname;
4987 #endif /* CONFIG_NO_WPA_MSG */
4990 #ifndef WPA_SUPPLICANT_CLEANUP_INTERVAL
4991 #define WPA_SUPPLICANT_CLEANUP_INTERVAL 10
4992 #endif /* WPA_SUPPLICANT_CLEANUP_INTERVAL */
4994 /* Periodic cleanup tasks */
4995 static void wpas_periodic(void *eloop_ctx, void *timeout_ctx)
4997 struct wpa_global *global = eloop_ctx;
4998 struct wpa_supplicant *wpa_s;
5000 eloop_register_timeout(WPA_SUPPLICANT_CLEANUP_INTERVAL, 0,
5001 wpas_periodic, global, NULL);
5005 p2p_expire_peers(global->p2p);
5006 #endif /* CONFIG_P2P */
5008 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
5009 wpa_bss_flush_by_age(wpa_s, wpa_s->conf->bss_expiration_age);
5012 #endif /* CONFIG_AP */
5018 * wpa_supplicant_init - Initialize %wpa_supplicant
5019 * @params: Parameters for %wpa_supplicant
5020 * Returns: Pointer to global %wpa_supplicant data, or %NULL on failure
5022 * This function is used to initialize %wpa_supplicant. After successful
5023 * initialization, the returned data pointer can be used to add and remove
5024 * network interfaces, and eventually, to deinitialize %wpa_supplicant.
5026 struct wpa_global * wpa_supplicant_init(struct wpa_params *params)
5028 struct wpa_global *global;
5034 #ifdef CONFIG_DRIVER_NDIS
5036 void driver_ndis_init_ops(void);
5037 driver_ndis_init_ops();
5039 #endif /* CONFIG_DRIVER_NDIS */
5041 #ifndef CONFIG_NO_WPA_MSG
5042 wpa_msg_register_ifname_cb(wpa_supplicant_msg_ifname_cb);
5043 #endif /* CONFIG_NO_WPA_MSG */
5045 if (params->wpa_debug_file_path)
5046 wpa_debug_open_file(params->wpa_debug_file_path);
5048 wpa_debug_setup_stdout();
5049 if (params->wpa_debug_syslog)
5050 wpa_debug_open_syslog();
5051 if (params->wpa_debug_tracing) {
5052 ret = wpa_debug_open_linux_tracing();
5054 wpa_printf(MSG_ERROR,
5055 "Failed to enable trace logging");
5060 ret = eap_register_methods();
5062 wpa_printf(MSG_ERROR, "Failed to register EAP methods");
5064 wpa_printf(MSG_ERROR, "Two or more EAP methods used "
5065 "the same EAP type.");
5069 global = os_zalloc(sizeof(*global));
5072 dl_list_init(&global->p2p_srv_bonjour);
5073 dl_list_init(&global->p2p_srv_upnp);
5074 global->params.daemonize = params->daemonize;
5075 global->params.wait_for_monitor = params->wait_for_monitor;
5076 global->params.dbus_ctrl_interface = params->dbus_ctrl_interface;
5077 if (params->pid_file)
5078 global->params.pid_file = os_strdup(params->pid_file);
5079 if (params->ctrl_interface)
5080 global->params.ctrl_interface =
5081 os_strdup(params->ctrl_interface);
5082 if (params->ctrl_interface_group)
5083 global->params.ctrl_interface_group =
5084 os_strdup(params->ctrl_interface_group);
5085 if (params->override_driver)
5086 global->params.override_driver =
5087 os_strdup(params->override_driver);
5088 if (params->override_ctrl_interface)
5089 global->params.override_ctrl_interface =
5090 os_strdup(params->override_ctrl_interface);
5092 if (params->conf_p2p_dev)
5093 global->params.conf_p2p_dev =
5094 os_strdup(params->conf_p2p_dev);
5095 #endif /* CONFIG_P2P */
5096 wpa_debug_level = global->params.wpa_debug_level =
5097 params->wpa_debug_level;
5098 wpa_debug_show_keys = global->params.wpa_debug_show_keys =
5099 params->wpa_debug_show_keys;
5100 wpa_debug_timestamp = global->params.wpa_debug_timestamp =
5101 params->wpa_debug_timestamp;
5103 wpa_printf(MSG_DEBUG, "wpa_supplicant v" VERSION_STR);
5106 wpa_printf(MSG_ERROR, "Failed to initialize event loop");
5107 wpa_supplicant_deinit(global);
5111 random_init(params->entropy_file);
5113 global->ctrl_iface = wpa_supplicant_global_ctrl_iface_init(global);
5114 if (global->ctrl_iface == NULL) {
5115 wpa_supplicant_deinit(global);
5119 if (wpas_notify_supplicant_initialized(global)) {
5120 wpa_supplicant_deinit(global);
5124 for (i = 0; wpa_drivers[i]; i++)
5125 global->drv_count++;
5126 if (global->drv_count == 0) {
5127 wpa_printf(MSG_ERROR, "No drivers enabled");
5128 wpa_supplicant_deinit(global);
5131 global->drv_priv = os_calloc(global->drv_count, sizeof(void *));
5132 if (global->drv_priv == NULL) {
5133 wpa_supplicant_deinit(global);
5137 #ifdef CONFIG_WIFI_DISPLAY
5138 if (wifi_display_init(global) < 0) {
5139 wpa_printf(MSG_ERROR, "Failed to initialize Wi-Fi Display");
5140 wpa_supplicant_deinit(global);
5143 #endif /* CONFIG_WIFI_DISPLAY */
5145 eloop_register_timeout(WPA_SUPPLICANT_CLEANUP_INTERVAL, 0,
5146 wpas_periodic, global, NULL);
5153 * wpa_supplicant_run - Run the %wpa_supplicant main event loop
5154 * @global: Pointer to global data from wpa_supplicant_init()
5155 * Returns: 0 after successful event loop run, -1 on failure
5157 * This function starts the main event loop and continues running as long as
5158 * there are any remaining events. In most cases, this function is running as
5159 * long as the %wpa_supplicant process in still in use.
5161 int wpa_supplicant_run(struct wpa_global *global)
5163 struct wpa_supplicant *wpa_s;
5165 if (global->params.daemonize &&
5166 wpa_supplicant_daemon(global->params.pid_file))
5169 if (global->params.wait_for_monitor) {
5170 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
5171 if (wpa_s->ctrl_iface)
5172 wpa_supplicant_ctrl_iface_wait(
5176 eloop_register_signal_terminate(wpa_supplicant_terminate, global);
5177 eloop_register_signal_reconfig(wpa_supplicant_reconfig, global);
5186 * wpa_supplicant_deinit - Deinitialize %wpa_supplicant
5187 * @global: Pointer to global data from wpa_supplicant_init()
5189 * This function is called to deinitialize %wpa_supplicant and to free all
5190 * allocated resources. Remaining network interfaces will also be removed.
5192 void wpa_supplicant_deinit(struct wpa_global *global)
5199 eloop_cancel_timeout(wpas_periodic, global, NULL);
5201 #ifdef CONFIG_WIFI_DISPLAY
5202 wifi_display_deinit(global);
5203 #endif /* CONFIG_WIFI_DISPLAY */
5205 while (global->ifaces)
5206 wpa_supplicant_remove_iface(global, global->ifaces, 1);
5208 if (global->ctrl_iface)
5209 wpa_supplicant_global_ctrl_iface_deinit(global->ctrl_iface);
5211 wpas_notify_supplicant_deinitialized(global);
5213 eap_peer_unregister_methods();
5215 eap_server_unregister_methods();
5216 #endif /* CONFIG_AP */
5218 for (i = 0; wpa_drivers[i] && global->drv_priv; i++) {
5219 if (!global->drv_priv[i])
5221 wpa_drivers[i]->global_deinit(global->drv_priv[i]);
5223 os_free(global->drv_priv);
5229 if (global->params.pid_file) {
5230 os_daemonize_terminate(global->params.pid_file);
5231 os_free(global->params.pid_file);
5233 os_free(global->params.ctrl_interface);
5234 os_free(global->params.ctrl_interface_group);
5235 os_free(global->params.override_driver);
5236 os_free(global->params.override_ctrl_interface);
5238 os_free(global->params.conf_p2p_dev);
5239 #endif /* CONFIG_P2P */
5241 os_free(global->p2p_disallow_freq.range);
5242 os_free(global->p2p_go_avoid_freq.range);
5243 os_free(global->add_psk);
5246 wpa_debug_close_syslog();
5247 wpa_debug_close_file();
5248 wpa_debug_close_linux_tracing();
5252 void wpa_supplicant_update_config(struct wpa_supplicant *wpa_s)
5254 if ((wpa_s->conf->changed_parameters & CFG_CHANGED_COUNTRY) &&
5255 wpa_s->conf->country[0] && wpa_s->conf->country[1]) {
5257 country[0] = wpa_s->conf->country[0];
5258 country[1] = wpa_s->conf->country[1];
5260 if (wpa_drv_set_country(wpa_s, country) < 0) {
5261 wpa_printf(MSG_ERROR, "Failed to set country code "
5266 if (wpa_s->conf->changed_parameters & CFG_CHANGED_EXT_PW_BACKEND)
5267 wpas_init_ext_pw(wpa_s);
5270 wpas_wps_update_config(wpa_s);
5271 #endif /* CONFIG_WPS */
5272 wpas_p2p_update_config(wpa_s);
5273 wpa_s->conf->changed_parameters = 0;
5277 void add_freq(int *freqs, int *num_freqs, int freq)
5281 for (i = 0; i < *num_freqs; i++) {
5282 if (freqs[i] == freq)
5286 freqs[*num_freqs] = freq;
5291 static int * get_bss_freqs_in_ess(struct wpa_supplicant *wpa_s)
5293 struct wpa_bss *bss, *cbss;
5294 const int max_freqs = 10;
5298 freqs = os_calloc(max_freqs + 1, sizeof(int));
5302 cbss = wpa_s->current_bss;
5304 dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
5307 if (bss->ssid_len == cbss->ssid_len &&
5308 os_memcmp(bss->ssid, cbss->ssid, bss->ssid_len) == 0 &&
5309 wpa_blacklist_get(wpa_s, bss->bssid) == NULL) {
5310 add_freq(freqs, &num_freqs, bss->freq);
5311 if (num_freqs == max_freqs)
5316 if (num_freqs == 0) {
5325 void wpas_connection_failed(struct wpa_supplicant *wpa_s, const u8 *bssid)
5331 wpas_connect_work_done(wpa_s);
5334 * Remove possible authentication timeout since the connection failed.
5336 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
5339 * There is no point in blacklisting the AP if this event is
5340 * generated based on local request to disconnect.
5342 if (wpa_s->own_disconnect_req) {
5343 wpa_s->own_disconnect_req = 0;
5344 wpa_dbg(wpa_s, MSG_DEBUG,
5345 "Ignore connection failure due to local request to disconnect");
5348 if (wpa_s->disconnected) {
5349 wpa_dbg(wpa_s, MSG_DEBUG, "Ignore connection failure "
5350 "indication since interface has been put into "
5351 "disconnected state");
5356 * Add the failed BSSID into the blacklist and speed up next scan
5357 * attempt if there could be other APs that could accept association.
5358 * The current blacklist count indicates how many times we have tried
5359 * connecting to this AP and multiple attempts mean that other APs are
5360 * either not available or has already been tried, so that we can start
5361 * increasing the delay here to avoid constant scanning.
5363 count = wpa_blacklist_add(wpa_s, bssid);
5364 if (count == 1 && wpa_s->current_bss) {
5366 * This BSS was not in the blacklist before. If there is
5367 * another BSS available for the same ESS, we should try that
5368 * next. Otherwise, we may as well try this one once more
5369 * before allowing other, likely worse, ESSes to be considered.
5371 freqs = get_bss_freqs_in_ess(wpa_s);
5373 wpa_dbg(wpa_s, MSG_DEBUG, "Another BSS in this ESS "
5374 "has been seen; try it next");
5375 wpa_blacklist_add(wpa_s, bssid);
5377 * On the next scan, go through only the known channels
5378 * used in this ESS based on previous scans to speed up
5379 * common load balancing use case.
5381 os_free(wpa_s->next_scan_freqs);
5382 wpa_s->next_scan_freqs = freqs;
5387 * Add previous failure count in case the temporary blacklist was
5388 * cleared due to no other BSSes being available.
5390 count += wpa_s->extra_blacklist_count;
5392 if (count > 3 && wpa_s->current_ssid) {
5393 wpa_printf(MSG_DEBUG, "Continuous association failures - "
5394 "consider temporary network disabling");
5395 wpas_auth_failed(wpa_s, "CONN_FAILED");
5416 wpa_dbg(wpa_s, MSG_DEBUG, "Blacklist count %d --> request scan in %d "
5417 "ms", count, timeout);
5420 * TODO: if more than one possible AP is available in scan results,
5421 * could try the other ones before requesting a new scan.
5423 wpa_supplicant_req_scan(wpa_s, timeout / 1000,
5424 1000 * (timeout % 1000));
5428 int wpas_driver_bss_selection(struct wpa_supplicant *wpa_s)
5430 return wpa_s->conf->ap_scan == 2 ||
5431 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_BSS_SELECTION);
5435 #if defined(CONFIG_CTRL_IFACE) || defined(CONFIG_CTRL_IFACE_DBUS_NEW)
5436 int wpa_supplicant_ctrl_iface_ctrl_rsp_handle(struct wpa_supplicant *wpa_s,
5437 struct wpa_ssid *ssid,
5441 #ifdef IEEE8021X_EAPOL
5442 struct eap_peer_config *eap = &ssid->eap;
5444 wpa_printf(MSG_DEBUG, "CTRL_IFACE: response handle field=%s", field);
5445 wpa_hexdump_ascii_key(MSG_DEBUG, "CTRL_IFACE: response value",
5446 (const u8 *) value, os_strlen(value));
5448 switch (wpa_supplicant_ctrl_req_from_string(field)) {
5449 case WPA_CTRL_REQ_EAP_IDENTITY:
5450 os_free(eap->identity);
5451 eap->identity = (u8 *) os_strdup(value);
5452 eap->identity_len = os_strlen(value);
5453 eap->pending_req_identity = 0;
5454 if (ssid == wpa_s->current_ssid)
5455 wpa_s->reassociate = 1;
5457 case WPA_CTRL_REQ_EAP_PASSWORD:
5458 bin_clear_free(eap->password, eap->password_len);
5459 eap->password = (u8 *) os_strdup(value);
5460 eap->password_len = os_strlen(value);
5461 eap->pending_req_password = 0;
5462 if (ssid == wpa_s->current_ssid)
5463 wpa_s->reassociate = 1;
5465 case WPA_CTRL_REQ_EAP_NEW_PASSWORD:
5466 bin_clear_free(eap->new_password, eap->new_password_len);
5467 eap->new_password = (u8 *) os_strdup(value);
5468 eap->new_password_len = os_strlen(value);
5469 eap->pending_req_new_password = 0;
5470 if (ssid == wpa_s->current_ssid)
5471 wpa_s->reassociate = 1;
5473 case WPA_CTRL_REQ_EAP_PIN:
5474 str_clear_free(eap->pin);
5475 eap->pin = os_strdup(value);
5476 eap->pending_req_pin = 0;
5477 if (ssid == wpa_s->current_ssid)
5478 wpa_s->reassociate = 1;
5480 case WPA_CTRL_REQ_EAP_OTP:
5481 bin_clear_free(eap->otp, eap->otp_len);
5482 eap->otp = (u8 *) os_strdup(value);
5483 eap->otp_len = os_strlen(value);
5484 os_free(eap->pending_req_otp);
5485 eap->pending_req_otp = NULL;
5486 eap->pending_req_otp_len = 0;
5488 case WPA_CTRL_REQ_EAP_PASSPHRASE:
5489 str_clear_free(eap->private_key_passwd);
5490 eap->private_key_passwd = os_strdup(value);
5491 eap->pending_req_passphrase = 0;
5492 if (ssid == wpa_s->current_ssid)
5493 wpa_s->reassociate = 1;
5495 case WPA_CTRL_REQ_SIM:
5496 str_clear_free(eap->external_sim_resp);
5497 eap->external_sim_resp = os_strdup(value);
5499 case WPA_CTRL_REQ_PSK_PASSPHRASE:
5500 if (wpa_config_set(ssid, "psk", value, 0) < 0)
5502 ssid->mem_only_psk = 1;
5503 if (ssid->passphrase)
5504 wpa_config_update_psk(ssid);
5505 if (wpa_s->wpa_state == WPA_SCANNING && !wpa_s->scanning)
5506 wpa_supplicant_req_scan(wpa_s, 0, 0);
5509 wpa_printf(MSG_DEBUG, "CTRL_IFACE: Unknown field '%s'", field);
5514 #else /* IEEE8021X_EAPOL */
5515 wpa_printf(MSG_DEBUG, "CTRL_IFACE: IEEE 802.1X not included");
5517 #endif /* IEEE8021X_EAPOL */
5519 #endif /* CONFIG_CTRL_IFACE || CONFIG_CTRL_IFACE_DBUS_NEW */
5522 int wpas_network_disabled(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
5525 unsigned int drv_enc;
5527 if (wpa_s->p2p_mgmt)
5528 return 1; /* no normal network profiles on p2p_mgmt interface */
5536 if (wpa_s->drv_capa_known)
5537 drv_enc = wpa_s->drv_enc;
5539 drv_enc = (unsigned int) -1;
5541 for (i = 0; i < NUM_WEP_KEYS; i++) {
5542 size_t len = ssid->wep_key_len[i];
5545 if (len == 5 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP40))
5547 if (len == 13 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP104))
5549 if (len == 16 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP128))
5551 return 1; /* invalid WEP key */
5554 if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt) && !ssid->psk_set &&
5555 (!ssid->passphrase || ssid->ssid_len != 0) && !ssid->ext_psk &&
5556 !ssid->mem_only_psk)
5563 int wpas_get_ssid_pmf(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
5565 #ifdef CONFIG_IEEE80211W
5566 if (ssid == NULL || ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT) {
5567 if (wpa_s->conf->pmf == MGMT_FRAME_PROTECTION_OPTIONAL &&
5568 !(wpa_s->drv_enc & WPA_DRIVER_CAPA_ENC_BIP)) {
5570 * Driver does not support BIP -- ignore pmf=1 default
5571 * since the connection with PMF would fail and the
5572 * configuration does not require PMF to be enabled.
5574 return NO_MGMT_FRAME_PROTECTION;
5577 return wpa_s->conf->pmf;
5580 return ssid->ieee80211w;
5581 #else /* CONFIG_IEEE80211W */
5582 return NO_MGMT_FRAME_PROTECTION;
5583 #endif /* CONFIG_IEEE80211W */
5587 int wpas_is_p2p_prioritized(struct wpa_supplicant *wpa_s)
5589 if (wpa_s->global->conc_pref == WPA_CONC_PREF_P2P)
5591 if (wpa_s->global->conc_pref == WPA_CONC_PREF_STA)
5597 void wpas_auth_failed(struct wpa_supplicant *wpa_s, char *reason)
5599 struct wpa_ssid *ssid = wpa_s->current_ssid;
5601 struct os_reltime now;
5604 wpa_printf(MSG_DEBUG, "Authentication failure but no known "
5609 if (ssid->key_mgmt == WPA_KEY_MGMT_WPS)
5612 ssid->auth_failures++;
5615 if (ssid->p2p_group &&
5616 (wpa_s->p2p_in_provisioning || wpa_s->show_group_started)) {
5618 * Skip the wait time since there is a short timeout on the
5619 * connection to a P2P group.
5623 #endif /* CONFIG_P2P */
5625 if (ssid->auth_failures > 50)
5627 else if (ssid->auth_failures > 10)
5629 else if (ssid->auth_failures > 5)
5631 else if (ssid->auth_failures > 3)
5633 else if (ssid->auth_failures > 2)
5635 else if (ssid->auth_failures > 1)
5640 if (ssid->auth_failures > 1 &&
5641 wpa_key_mgmt_wpa_ieee8021x(ssid->key_mgmt))
5642 dur += os_random() % (ssid->auth_failures * 10);
5644 os_get_reltime(&now);
5645 if (now.sec + dur <= ssid->disabled_until.sec)
5648 ssid->disabled_until.sec = now.sec + dur;
5650 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TEMP_DISABLED
5651 "id=%d ssid=\"%s\" auth_failures=%u duration=%d reason=%s",
5652 ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
5653 ssid->auth_failures, dur, reason);
5657 void wpas_clear_temp_disabled(struct wpa_supplicant *wpa_s,
5658 struct wpa_ssid *ssid, int clear_failures)
5663 if (ssid->disabled_until.sec) {
5664 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_REENABLED
5665 "id=%d ssid=\"%s\"",
5666 ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
5668 ssid->disabled_until.sec = 0;
5669 ssid->disabled_until.usec = 0;
5671 ssid->auth_failures = 0;
5675 int disallowed_bssid(struct wpa_supplicant *wpa_s, const u8 *bssid)
5679 if (wpa_s->disallow_aps_bssid == NULL)
5682 for (i = 0; i < wpa_s->disallow_aps_bssid_count; i++) {
5683 if (os_memcmp(wpa_s->disallow_aps_bssid + i * ETH_ALEN,
5684 bssid, ETH_ALEN) == 0)
5692 int disallowed_ssid(struct wpa_supplicant *wpa_s, const u8 *ssid,
5697 if (wpa_s->disallow_aps_ssid == NULL || ssid == NULL)
5700 for (i = 0; i < wpa_s->disallow_aps_ssid_count; i++) {
5701 struct wpa_ssid_value *s = &wpa_s->disallow_aps_ssid[i];
5702 if (ssid_len == s->ssid_len &&
5703 os_memcmp(ssid, s->ssid, ssid_len) == 0)
5712 * wpas_request_connection - Request a new connection
5713 * @wpa_s: Pointer to the network interface
5715 * This function is used to request a new connection to be found. It will mark
5716 * the interface to allow reassociation and request a new scan to find a
5717 * suitable network to connect to.
5719 void wpas_request_connection(struct wpa_supplicant *wpa_s)
5721 wpa_s->normal_scans = 0;
5722 wpa_s->scan_req = NORMAL_SCAN_REQ;
5723 wpa_supplicant_reinit_autoscan(wpa_s);
5724 wpa_s->extra_blacklist_count = 0;
5725 wpa_s->disconnected = 0;
5726 wpa_s->reassociate = 1;
5728 if (wpa_supplicant_fast_associate(wpa_s) != 1)
5729 wpa_supplicant_req_scan(wpa_s, 0, 0);
5731 wpa_s->reattach = 0;
5735 void dump_freq_data(struct wpa_supplicant *wpa_s, const char *title,
5736 struct wpa_used_freq_data *freqs_data,
5741 wpa_dbg(wpa_s, MSG_DEBUG, "Shared frequencies (len=%u): %s",
5743 for (i = 0; i < len; i++) {
5744 struct wpa_used_freq_data *cur = &freqs_data[i];
5745 wpa_dbg(wpa_s, MSG_DEBUG, "freq[%u]: %d, flags=0x%X",
5746 i, cur->freq, cur->flags);
5752 * Find the operating frequencies of any of the virtual interfaces that
5753 * are using the same radio as the current interface, and in addition, get
5754 * information about the interface types that are using the frequency.
5756 int get_shared_radio_freqs_data(struct wpa_supplicant *wpa_s,
5757 struct wpa_used_freq_data *freqs_data,
5760 struct wpa_supplicant *ifs;
5763 unsigned int idx = 0, i;
5765 wpa_dbg(wpa_s, MSG_DEBUG,
5766 "Determining shared radio frequencies (max len %u)", len);
5767 os_memset(freqs_data, 0, sizeof(struct wpa_used_freq_data) * len);
5769 dl_list_for_each(ifs, &wpa_s->radio->ifaces, struct wpa_supplicant,
5774 if (ifs->current_ssid == NULL || ifs->assoc_freq == 0)
5777 if (ifs->current_ssid->mode == WPAS_MODE_AP ||
5778 ifs->current_ssid->mode == WPAS_MODE_P2P_GO ||
5779 ifs->current_ssid->mode == WPAS_MODE_MESH)
5780 freq = ifs->current_ssid->frequency;
5781 else if (wpa_drv_get_bssid(ifs, bssid) == 0)
5782 freq = ifs->assoc_freq;
5786 /* Hold only distinct freqs */
5787 for (i = 0; i < idx; i++)
5788 if (freqs_data[i].freq == freq)
5792 freqs_data[idx++].freq = freq;
5794 if (ifs->current_ssid->mode == WPAS_MODE_INFRA) {
5795 freqs_data[i].flags |= ifs->current_ssid->p2p_group ?
5796 WPA_FREQ_USED_BY_P2P_CLIENT :
5797 WPA_FREQ_USED_BY_INFRA_STATION;
5801 dump_freq_data(wpa_s, "completed iteration", freqs_data, idx);
5807 * Find the operating frequencies of any of the virtual interfaces that
5808 * are using the same radio as the current interface.
5810 int get_shared_radio_freqs(struct wpa_supplicant *wpa_s,
5811 int *freq_array, unsigned int len)
5813 struct wpa_used_freq_data *freqs_data;
5816 os_memset(freq_array, 0, sizeof(int) * len);
5818 freqs_data = os_calloc(len, sizeof(struct wpa_used_freq_data));
5822 num = get_shared_radio_freqs_data(wpa_s, freqs_data, len);
5823 for (i = 0; i < num; i++)
5824 freq_array[i] = freqs_data[i].freq;
5826 os_free(freqs_data);
5832 static void wpas_rrm_neighbor_rep_timeout_handler(void *data, void *user_ctx)
5834 struct rrm_data *rrm = data;
5836 if (!rrm->notify_neighbor_rep) {
5837 wpa_printf(MSG_ERROR,
5838 "RRM: Unexpected neighbor report timeout");
5842 wpa_printf(MSG_DEBUG, "RRM: Notifying neighbor report - NONE");
5843 rrm->notify_neighbor_rep(rrm->neighbor_rep_cb_ctx, NULL);
5845 rrm->notify_neighbor_rep = NULL;
5846 rrm->neighbor_rep_cb_ctx = NULL;
5851 * wpas_rrm_reset - Clear and reset all RRM data in wpa_supplicant
5852 * @wpa_s: Pointer to wpa_supplicant
5854 void wpas_rrm_reset(struct wpa_supplicant *wpa_s)
5856 wpa_s->rrm.rrm_used = 0;
5858 eloop_cancel_timeout(wpas_rrm_neighbor_rep_timeout_handler, &wpa_s->rrm,
5860 if (wpa_s->rrm.notify_neighbor_rep)
5861 wpas_rrm_neighbor_rep_timeout_handler(&wpa_s->rrm, NULL);
5862 wpa_s->rrm.next_neighbor_rep_token = 1;
5867 * wpas_rrm_process_neighbor_rep - Handle incoming neighbor report
5868 * @wpa_s: Pointer to wpa_supplicant
5869 * @report: Neighbor report buffer, prefixed by a 1-byte dialog token
5870 * @report_len: Length of neighbor report buffer
5872 void wpas_rrm_process_neighbor_rep(struct wpa_supplicant *wpa_s,
5873 const u8 *report, size_t report_len)
5875 struct wpabuf *neighbor_rep;
5877 wpa_hexdump(MSG_DEBUG, "RRM: New Neighbor Report", report, report_len);
5881 if (report[0] != wpa_s->rrm.next_neighbor_rep_token - 1) {
5882 wpa_printf(MSG_DEBUG,
5883 "RRM: Discarding neighbor report with token %d (expected %d)",
5884 report[0], wpa_s->rrm.next_neighbor_rep_token - 1);
5888 eloop_cancel_timeout(wpas_rrm_neighbor_rep_timeout_handler, &wpa_s->rrm,
5891 if (!wpa_s->rrm.notify_neighbor_rep) {
5892 wpa_printf(MSG_ERROR, "RRM: Unexpected neighbor report");
5896 /* skipping the first byte, which is only an id (dialog token) */
5897 neighbor_rep = wpabuf_alloc(report_len - 1);
5898 if (neighbor_rep == NULL)
5900 wpabuf_put_data(neighbor_rep, report + 1, report_len - 1);
5901 wpa_printf(MSG_DEBUG, "RRM: Notifying neighbor report (token = %d)",
5903 wpa_s->rrm.notify_neighbor_rep(wpa_s->rrm.neighbor_rep_cb_ctx,
5905 wpa_s->rrm.notify_neighbor_rep = NULL;
5906 wpa_s->rrm.neighbor_rep_cb_ctx = NULL;
5910 #if defined(__CYGWIN__) || defined(CONFIG_NATIVE_WINDOWS)
5911 /* Workaround different, undefined for Windows, error codes used here */
5913 #define EOPNOTSUPP -1
5914 #define ECANCELED -1
5918 * wpas_rrm_send_neighbor_rep_request - Request a neighbor report from our AP
5919 * @wpa_s: Pointer to wpa_supplicant
5920 * @ssid: if not null, this is sent in the request. Otherwise, no SSID IE
5921 * is sent in the request.
5922 * @cb: Callback function to be called once the requested report arrives, or
5923 * timed out after RRM_NEIGHBOR_REPORT_TIMEOUT seconds.
5924 * In the former case, 'neighbor_rep' is a newly allocated wpabuf, and it's
5925 * the requester's responsibility to free it.
5926 * In the latter case NULL will be sent in 'neighbor_rep'.
5927 * @cb_ctx: Context value to send the callback function
5928 * Returns: 0 in case of success, negative error code otherwise
5930 * In case there is a previous request which has not been answered yet, the
5931 * new request fails. The caller may retry after RRM_NEIGHBOR_REPORT_TIMEOUT.
5932 * Request must contain a callback function.
5934 int wpas_rrm_send_neighbor_rep_request(struct wpa_supplicant *wpa_s,
5935 const struct wpa_ssid *ssid,
5936 void (*cb)(void *ctx,
5937 struct wpabuf *neighbor_rep),
5943 if (wpa_s->wpa_state != WPA_COMPLETED || wpa_s->current_ssid == NULL) {
5944 wpa_printf(MSG_DEBUG, "RRM: No connection, no RRM.");
5948 if (!wpa_s->rrm.rrm_used) {
5949 wpa_printf(MSG_DEBUG, "RRM: No RRM in current connection.");
5953 rrm_ie = wpa_bss_get_ie(wpa_s->current_bss,
5954 WLAN_EID_RRM_ENABLED_CAPABILITIES);
5955 if (!rrm_ie || !(wpa_s->current_bss->caps & IEEE80211_CAP_RRM) ||
5956 !(rrm_ie[2] & WLAN_RRM_CAPS_NEIGHBOR_REPORT)) {
5957 wpa_printf(MSG_DEBUG,
5958 "RRM: No network support for Neighbor Report.");
5963 wpa_printf(MSG_DEBUG,
5964 "RRM: Neighbor Report request must provide a callback.");
5968 /* Refuse if there's a live request */
5969 if (wpa_s->rrm.notify_neighbor_rep) {
5970 wpa_printf(MSG_DEBUG,
5971 "RRM: Currently handling previous Neighbor Report.");
5975 /* 3 = action category + action code + dialog token */
5976 buf = wpabuf_alloc(3 + (ssid ? 2 + ssid->ssid_len : 0));
5978 wpa_printf(MSG_DEBUG,
5979 "RRM: Failed to allocate Neighbor Report Request");
5983 wpa_printf(MSG_DEBUG, "RRM: Neighbor report request (for %s), token=%d",
5984 (ssid ? wpa_ssid_txt(ssid->ssid, ssid->ssid_len) : ""),
5985 wpa_s->rrm.next_neighbor_rep_token);
5987 wpabuf_put_u8(buf, WLAN_ACTION_RADIO_MEASUREMENT);
5988 wpabuf_put_u8(buf, WLAN_RRM_NEIGHBOR_REPORT_REQUEST);
5989 wpabuf_put_u8(buf, wpa_s->rrm.next_neighbor_rep_token);
5991 wpabuf_put_u8(buf, WLAN_EID_SSID);
5992 wpabuf_put_u8(buf, ssid->ssid_len);
5993 wpabuf_put_data(buf, ssid->ssid, ssid->ssid_len);
5996 wpa_s->rrm.next_neighbor_rep_token++;
5998 if (wpa_drv_send_action(wpa_s, wpa_s->assoc_freq, 0, wpa_s->bssid,
5999 wpa_s->own_addr, wpa_s->bssid,
6000 wpabuf_head(buf), wpabuf_len(buf), 0) < 0) {
6001 wpa_printf(MSG_DEBUG,
6002 "RRM: Failed to send Neighbor Report Request");
6007 wpa_s->rrm.neighbor_rep_cb_ctx = cb_ctx;
6008 wpa_s->rrm.notify_neighbor_rep = cb;
6009 eloop_register_timeout(RRM_NEIGHBOR_REPORT_TIMEOUT, 0,
6010 wpas_rrm_neighbor_rep_timeout_handler,
6018 void wpas_rrm_handle_link_measurement_request(struct wpa_supplicant *wpa_s,
6020 const u8 *frame, size_t len,
6024 const struct rrm_link_measurement_request *req;
6025 struct rrm_link_measurement_report report;
6027 if (wpa_s->wpa_state != WPA_COMPLETED) {
6028 wpa_printf(MSG_INFO,
6029 "RRM: Ignoring link measurement request. Not associated");
6033 if (!wpa_s->rrm.rrm_used) {
6034 wpa_printf(MSG_INFO,
6035 "RRM: Ignoring link measurement request. Not RRM network");
6039 if (!(wpa_s->drv_rrm_flags & WPA_DRIVER_FLAGS_TX_POWER_INSERTION)) {
6040 wpa_printf(MSG_INFO,
6041 "RRM: Measurement report failed. TX power insertion not supported");
6045 req = (const struct rrm_link_measurement_request *) frame;
6046 if (len < sizeof(*req)) {
6047 wpa_printf(MSG_INFO,
6048 "RRM: Link measurement report failed. Request too short");
6052 os_memset(&report, 0, sizeof(report));
6053 report.tpc.eid = WLAN_EID_TPC_REPORT;
6055 report.rsni = 255; /* 255 indicates that RSNI is not available */
6056 report.dialog_token = req->dialog_token;
6059 * It's possible to estimate RCPI based on RSSI in dBm. This
6060 * calculation will not reflect the correct value for high rates,
6061 * but it's good enough for Action frames which are transmitted
6062 * with up to 24 Mbps rates.
6065 report.rcpi = 255; /* not available */
6066 else if (rssi < -110)
6071 report.rcpi = (rssi + 110) * 2;
6073 /* action_category + action_code */
6074 buf = wpabuf_alloc(2 + sizeof(report));
6076 wpa_printf(MSG_ERROR,
6077 "RRM: Link measurement report failed. Buffer allocation failed");
6081 wpabuf_put_u8(buf, WLAN_ACTION_RADIO_MEASUREMENT);
6082 wpabuf_put_u8(buf, WLAN_RRM_LINK_MEASUREMENT_REPORT);
6083 wpabuf_put_data(buf, &report, sizeof(report));
6084 wpa_hexdump(MSG_DEBUG, "RRM: Link measurement report:",
6085 wpabuf_head(buf), wpabuf_len(buf));
6087 if (wpa_drv_send_action(wpa_s, wpa_s->assoc_freq, 0, src,
6088 wpa_s->own_addr, wpa_s->bssid,
6089 wpabuf_head(buf), wpabuf_len(buf), 0)) {
6090 wpa_printf(MSG_ERROR,
6091 "RRM: Link measurement report failed. Send action failed");