3 * Copyright (c) 2003-2014, Jouni Malinen <j@w1.fi>
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
8 * This file implements functions for registering and unregistering
9 * %wpa_supplicant interfaces. In addition, this file contains number of
10 * functions for managing network connections.
16 #include "crypto/random.h"
17 #include "crypto/sha1.h"
18 #include "eapol_supp/eapol_supp_sm.h"
19 #include "eap_peer/eap.h"
20 #include "eap_peer/eap_proxy.h"
21 #include "eap_server/eap_methods.h"
22 #include "rsn_supp/wpa.h"
25 #include "utils/ext_password.h"
26 #include "l2_packet/l2_packet.h"
27 #include "wpa_supplicant_i.h"
29 #include "ctrl_iface.h"
30 #include "pcsc_funcs.h"
31 #include "common/version.h"
32 #include "rsn_supp/preauth.h"
33 #include "rsn_supp/pmksa_cache.h"
34 #include "common/wpa_ctrl.h"
35 #include "common/ieee802_11_defs.h"
37 #include "blacklist.h"
38 #include "wpas_glue.h"
39 #include "wps_supplicant.h"
42 #include "gas_query.h"
44 #include "p2p_supplicant.h"
45 #include "wifi_display.h"
51 #include "offchannel.h"
52 #include "hs20_supplicant.h"
56 const char *wpa_supplicant_version =
57 "wpa_supplicant v" VERSION_STR "\n"
58 "Copyright (c) 2003-2014, Jouni Malinen <j@w1.fi> and contributors";
60 const char *wpa_supplicant_license =
61 "This software may be distributed under the terms of the BSD license.\n"
62 "See README for more details.\n"
63 #ifdef EAP_TLS_OPENSSL
64 "\nThis product includes software developed by the OpenSSL Project\n"
65 "for use in the OpenSSL Toolkit (http://www.openssl.org/)\n"
66 #endif /* EAP_TLS_OPENSSL */
69 #ifndef CONFIG_NO_STDOUT_DEBUG
70 /* Long text divided into parts in order to fit in C89 strings size limits. */
71 const char *wpa_supplicant_full_license1 =
73 const char *wpa_supplicant_full_license2 =
74 "This software may be distributed under the terms of the BSD license.\n"
76 "Redistribution and use in source and binary forms, with or without\n"
77 "modification, are permitted provided that the following conditions are\n"
80 const char *wpa_supplicant_full_license3 =
81 "1. Redistributions of source code must retain the above copyright\n"
82 " notice, this list of conditions and the following disclaimer.\n"
84 "2. Redistributions in binary form must reproduce the above copyright\n"
85 " notice, this list of conditions and the following disclaimer in the\n"
86 " documentation and/or other materials provided with the distribution.\n"
88 const char *wpa_supplicant_full_license4 =
89 "3. Neither the name(s) of the above-listed copyright holder(s) nor the\n"
90 " names of its contributors may be used to endorse or promote products\n"
91 " derived from this software without specific prior written permission.\n"
93 "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
94 "\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
95 "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
96 "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n";
97 const char *wpa_supplicant_full_license5 =
98 "OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
99 "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
100 "LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
101 "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
102 "THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
103 "(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
104 "OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
106 #endif /* CONFIG_NO_STDOUT_DEBUG */
108 /* Configure default/group WEP keys for static WEP */
109 int wpa_set_wep_keys(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
113 for (i = 0; i < NUM_WEP_KEYS; i++) {
114 if (ssid->wep_key_len[i] == 0)
118 wpa_drv_set_key(wpa_s, WPA_ALG_WEP, NULL,
119 i, i == ssid->wep_tx_keyidx, NULL, 0,
120 ssid->wep_key[i], ssid->wep_key_len[i]);
127 int wpa_supplicant_set_wpa_none_key(struct wpa_supplicant *wpa_s,
128 struct wpa_ssid *ssid)
135 /* IBSS/WPA-None uses only one key (Group) for both receiving and
136 * sending unicast and multicast packets. */
138 if (ssid->mode != WPAS_MODE_IBSS) {
139 wpa_msg(wpa_s, MSG_INFO, "WPA: Invalid mode %d (not "
140 "IBSS/ad-hoc) for WPA-None", ssid->mode);
144 if (!ssid->psk_set) {
145 wpa_msg(wpa_s, MSG_INFO, "WPA: No PSK configured for "
150 switch (wpa_s->group_cipher) {
151 case WPA_CIPHER_CCMP:
152 os_memcpy(key, ssid->psk, 16);
156 case WPA_CIPHER_GCMP:
157 os_memcpy(key, ssid->psk, 16);
161 case WPA_CIPHER_TKIP:
162 /* WPA-None uses the same Michael MIC key for both TX and RX */
163 os_memcpy(key, ssid->psk, 16 + 8);
164 os_memcpy(key + 16 + 8, ssid->psk + 16, 8);
169 wpa_msg(wpa_s, MSG_INFO, "WPA: Invalid group cipher %d for "
170 "WPA-None", wpa_s->group_cipher);
174 /* TODO: should actually remember the previously used seq#, both for TX
175 * and RX from each STA.. */
177 return wpa_drv_set_key(wpa_s, alg, NULL, 0, 1, seq, 6, key, keylen);
181 static void wpa_supplicant_timeout(void *eloop_ctx, void *timeout_ctx)
183 struct wpa_supplicant *wpa_s = eloop_ctx;
184 const u8 *bssid = wpa_s->bssid;
185 if (is_zero_ether_addr(bssid))
186 bssid = wpa_s->pending_bssid;
187 wpa_msg(wpa_s, MSG_INFO, "Authentication with " MACSTR " timed out.",
189 wpa_blacklist_add(wpa_s, bssid);
190 wpa_sm_notify_disassoc(wpa_s->wpa);
191 wpa_supplicant_deauthenticate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
192 wpa_s->reassociate = 1;
195 * If we timed out, the AP or the local radio may be busy.
196 * So, wait a second until scanning again.
198 wpa_supplicant_req_scan(wpa_s, 1, 0);
203 * wpa_supplicant_req_auth_timeout - Schedule a timeout for authentication
204 * @wpa_s: Pointer to wpa_supplicant data
205 * @sec: Number of seconds after which to time out authentication
206 * @usec: Number of microseconds after which to time out authentication
208 * This function is used to schedule a timeout for the current authentication
211 void wpa_supplicant_req_auth_timeout(struct wpa_supplicant *wpa_s,
214 if (wpa_s->conf->ap_scan == 0 &&
215 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED))
218 wpa_dbg(wpa_s, MSG_DEBUG, "Setting authentication timeout: %d sec "
219 "%d usec", sec, usec);
220 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
221 eloop_register_timeout(sec, usec, wpa_supplicant_timeout, wpa_s, NULL);
226 * wpa_supplicant_cancel_auth_timeout - Cancel authentication timeout
227 * @wpa_s: Pointer to wpa_supplicant data
229 * This function is used to cancel authentication timeout scheduled with
230 * wpa_supplicant_req_auth_timeout() and it is called when authentication has
233 void wpa_supplicant_cancel_auth_timeout(struct wpa_supplicant *wpa_s)
235 wpa_dbg(wpa_s, MSG_DEBUG, "Cancelling authentication timeout");
236 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
237 wpa_blacklist_del(wpa_s, wpa_s->bssid);
242 * wpa_supplicant_initiate_eapol - Configure EAPOL state machine
243 * @wpa_s: Pointer to wpa_supplicant data
245 * This function is used to configure EAPOL state machine based on the selected
246 * authentication mode.
248 void wpa_supplicant_initiate_eapol(struct wpa_supplicant *wpa_s)
250 #ifdef IEEE8021X_EAPOL
251 struct eapol_config eapol_conf;
252 struct wpa_ssid *ssid = wpa_s->current_ssid;
254 #ifdef CONFIG_IBSS_RSN
255 if (ssid->mode == WPAS_MODE_IBSS &&
256 wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
257 wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
259 * RSN IBSS authentication is per-STA and we can disable the
260 * per-BSSID EAPOL authentication.
262 eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
263 eapol_sm_notify_eap_success(wpa_s->eapol, TRUE);
264 eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
267 #endif /* CONFIG_IBSS_RSN */
269 eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
270 eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
272 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
273 wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE)
274 eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
276 eapol_sm_notify_portControl(wpa_s->eapol, Auto);
278 os_memset(&eapol_conf, 0, sizeof(eapol_conf));
279 if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
280 eapol_conf.accept_802_1x_keys = 1;
281 eapol_conf.required_keys = 0;
282 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_UNICAST) {
283 eapol_conf.required_keys |= EAPOL_REQUIRE_KEY_UNICAST;
285 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_BROADCAST) {
286 eapol_conf.required_keys |=
287 EAPOL_REQUIRE_KEY_BROADCAST;
290 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED)
291 eapol_conf.required_keys = 0;
293 eapol_conf.fast_reauth = wpa_s->conf->fast_reauth;
294 eapol_conf.workaround = ssid->eap_workaround;
295 eapol_conf.eap_disabled =
296 !wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) &&
297 wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA &&
298 wpa_s->key_mgmt != WPA_KEY_MGMT_WPS;
299 eapol_conf.external_sim = wpa_s->conf->external_sim;
300 eapol_conf.wps = wpa_s->key_mgmt == WPA_KEY_MGMT_WPS;
301 eapol_sm_notify_config(wpa_s->eapol, &ssid->eap, &eapol_conf);
302 #endif /* IEEE8021X_EAPOL */
304 ieee802_1x_alloc_kay_sm(wpa_s, ssid);
309 * wpa_supplicant_set_non_wpa_policy - Set WPA parameters to non-WPA mode
310 * @wpa_s: Pointer to wpa_supplicant data
311 * @ssid: Configuration data for the network
313 * This function is used to configure WPA state machine and related parameters
314 * to a mode where WPA is not enabled. This is called as part of the
315 * authentication configuration when the selected network does not use WPA.
317 void wpa_supplicant_set_non_wpa_policy(struct wpa_supplicant *wpa_s,
318 struct wpa_ssid *ssid)
322 if (ssid->key_mgmt & WPA_KEY_MGMT_WPS)
323 wpa_s->key_mgmt = WPA_KEY_MGMT_WPS;
324 else if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA)
325 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_NO_WPA;
327 wpa_s->key_mgmt = WPA_KEY_MGMT_NONE;
328 wpa_sm_set_ap_wpa_ie(wpa_s->wpa, NULL, 0);
329 wpa_sm_set_ap_rsn_ie(wpa_s->wpa, NULL, 0);
330 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
331 wpa_s->pairwise_cipher = WPA_CIPHER_NONE;
332 wpa_s->group_cipher = WPA_CIPHER_NONE;
333 wpa_s->mgmt_group_cipher = 0;
335 for (i = 0; i < NUM_WEP_KEYS; i++) {
336 if (ssid->wep_key_len[i] > 5) {
337 wpa_s->pairwise_cipher = WPA_CIPHER_WEP104;
338 wpa_s->group_cipher = WPA_CIPHER_WEP104;
340 } else if (ssid->wep_key_len[i] > 0) {
341 wpa_s->pairwise_cipher = WPA_CIPHER_WEP40;
342 wpa_s->group_cipher = WPA_CIPHER_WEP40;
347 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED, 0);
348 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
349 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
350 wpa_s->pairwise_cipher);
351 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
352 #ifdef CONFIG_IEEE80211W
353 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
354 wpa_s->mgmt_group_cipher);
355 #endif /* CONFIG_IEEE80211W */
357 pmksa_cache_clear_current(wpa_s->wpa);
361 void free_hw_features(struct wpa_supplicant *wpa_s)
364 if (wpa_s->hw.modes == NULL)
367 for (i = 0; i < wpa_s->hw.num_modes; i++) {
368 os_free(wpa_s->hw.modes[i].channels);
369 os_free(wpa_s->hw.modes[i].rates);
372 os_free(wpa_s->hw.modes);
373 wpa_s->hw.modes = NULL;
377 static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s)
381 bgscan_deinit(wpa_s);
382 autoscan_deinit(wpa_s);
383 scard_deinit(wpa_s->scard);
385 wpa_sm_set_scard_ctx(wpa_s->wpa, NULL);
386 eapol_sm_register_scard_ctx(wpa_s->eapol, NULL);
387 l2_packet_deinit(wpa_s->l2);
390 l2_packet_deinit(wpa_s->l2_br);
394 if (wpa_s->conf != NULL) {
395 struct wpa_ssid *ssid;
396 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
397 wpas_notify_network_removed(wpa_s, ssid);
400 os_free(wpa_s->confname);
401 wpa_s->confname = NULL;
403 os_free(wpa_s->confanother);
404 wpa_s->confanother = NULL;
407 os_free(wpa_s->conf_p2p_dev);
408 wpa_s->conf_p2p_dev = NULL;
409 #endif /* CONFIG_P2P */
411 wpa_sm_set_eapol(wpa_s->wpa, NULL);
412 eapol_sm_deinit(wpa_s->eapol);
415 rsn_preauth_deinit(wpa_s->wpa);
418 wpa_tdls_deinit(wpa_s->wpa);
419 #endif /* CONFIG_TDLS */
421 pmksa_candidate_free(wpa_s->wpa);
422 wpa_sm_deinit(wpa_s->wpa);
424 wpa_blacklist_clear(wpa_s);
426 wpa_bss_deinit(wpa_s);
428 wpa_supplicant_cancel_delayed_sched_scan(wpa_s);
429 wpa_supplicant_cancel_scan(wpa_s);
430 wpa_supplicant_cancel_auth_timeout(wpa_s);
431 eloop_cancel_timeout(wpa_supplicant_stop_countermeasures, wpa_s, NULL);
432 #ifdef CONFIG_DELAYED_MIC_ERROR_REPORT
433 eloop_cancel_timeout(wpa_supplicant_delayed_mic_error_report,
435 #endif /* CONFIG_DELAYED_MIC_ERROR_REPORT */
437 wpas_wps_deinit(wpa_s);
439 wpabuf_free(wpa_s->pending_eapol_rx);
440 wpa_s->pending_eapol_rx = NULL;
442 #ifdef CONFIG_IBSS_RSN
443 ibss_rsn_deinit(wpa_s->ibss_rsn);
444 wpa_s->ibss_rsn = NULL;
445 #endif /* CONFIG_IBSS_RSN */
450 wpa_supplicant_ap_deinit(wpa_s);
451 #endif /* CONFIG_AP */
453 wpas_p2p_deinit(wpa_s);
455 #ifdef CONFIG_OFFCHANNEL
456 offchannel_deinit(wpa_s);
457 #endif /* CONFIG_OFFCHANNEL */
459 wpa_supplicant_cancel_sched_scan(wpa_s);
461 os_free(wpa_s->next_scan_freqs);
462 wpa_s->next_scan_freqs = NULL;
464 os_free(wpa_s->manual_scan_freqs);
465 wpa_s->manual_scan_freqs = NULL;
467 os_free(wpa_s->manual_sched_scan_freqs);
468 wpa_s->manual_sched_scan_freqs = NULL;
470 gas_query_deinit(wpa_s->gas);
473 free_hw_features(wpa_s);
475 ieee802_1x_dealloc_kay_sm(wpa_s);
477 os_free(wpa_s->bssid_filter);
478 wpa_s->bssid_filter = NULL;
480 os_free(wpa_s->disallow_aps_bssid);
481 wpa_s->disallow_aps_bssid = NULL;
482 os_free(wpa_s->disallow_aps_ssid);
483 wpa_s->disallow_aps_ssid = NULL;
485 wnm_bss_keep_alive_deinit(wpa_s);
487 wnm_deallocate_memory(wpa_s);
488 #endif /* CONFIG_WNM */
490 ext_password_deinit(wpa_s->ext_pw);
491 wpa_s->ext_pw = NULL;
493 wpabuf_free(wpa_s->last_gas_resp);
494 wpa_s->last_gas_resp = NULL;
495 wpabuf_free(wpa_s->prev_gas_resp);
496 wpa_s->prev_gas_resp = NULL;
498 os_free(wpa_s->last_scan_res);
499 wpa_s->last_scan_res = NULL;
503 #endif /* CONFIG_HS20 */
505 for (i = 0; i < NUM_VENDOR_ELEM_FRAMES; i++) {
506 wpabuf_free(wpa_s->vendor_elem[i]);
507 wpa_s->vendor_elem[i] = NULL;
513 * wpa_clear_keys - Clear keys configured for the driver
514 * @wpa_s: Pointer to wpa_supplicant data
515 * @addr: Previously used BSSID or %NULL if not available
517 * This function clears the encryption keys that has been previously configured
520 void wpa_clear_keys(struct wpa_supplicant *wpa_s, const u8 *addr)
524 #ifdef CONFIG_IEEE80211W
526 #else /* CONFIG_IEEE80211W */
528 #endif /* CONFIG_IEEE80211W */
530 /* MLME-DELETEKEYS.request */
531 for (i = 0; i < max; i++) {
532 if (wpa_s->keys_cleared & BIT(i))
534 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, i, 0, NULL, 0,
537 if (!(wpa_s->keys_cleared & BIT(0)) && addr &&
538 !is_zero_ether_addr(addr)) {
539 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, addr, 0, 0, NULL, 0, NULL,
541 /* MLME-SETPROTECTION.request(None) */
542 wpa_drv_mlme_setprotection(
544 MLME_SETPROTECTION_PROTECT_TYPE_NONE,
545 MLME_SETPROTECTION_KEY_TYPE_PAIRWISE);
547 wpa_s->keys_cleared = (u32) -1;
552 * wpa_supplicant_state_txt - Get the connection state name as a text string
553 * @state: State (wpa_state; WPA_*)
554 * Returns: The state name as a printable text string
556 const char * wpa_supplicant_state_txt(enum wpa_states state)
559 case WPA_DISCONNECTED:
560 return "DISCONNECTED";
563 case WPA_INTERFACE_DISABLED:
564 return "INTERFACE_DISABLED";
567 case WPA_AUTHENTICATING:
568 return "AUTHENTICATING";
569 case WPA_ASSOCIATING:
570 return "ASSOCIATING";
573 case WPA_4WAY_HANDSHAKE:
574 return "4WAY_HANDSHAKE";
575 case WPA_GROUP_HANDSHAKE:
576 return "GROUP_HANDSHAKE";
587 static void wpa_supplicant_start_bgscan(struct wpa_supplicant *wpa_s)
591 if (wpa_s->current_ssid && wpa_s->current_ssid->bgscan)
592 name = wpa_s->current_ssid->bgscan;
594 name = wpa_s->conf->bgscan;
595 if (name == NULL || name[0] == '\0')
597 if (wpas_driver_bss_selection(wpa_s))
599 if (wpa_s->current_ssid == wpa_s->bgscan_ssid)
602 if (wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE)
604 #endif /* CONFIG_P2P */
606 bgscan_deinit(wpa_s);
607 if (wpa_s->current_ssid) {
608 if (bgscan_init(wpa_s, wpa_s->current_ssid, name)) {
609 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize "
612 * Live without bgscan; it is only used as a roaming
613 * optimization, so the initial connection is not
617 struct wpa_scan_results *scan_res;
618 wpa_s->bgscan_ssid = wpa_s->current_ssid;
619 scan_res = wpa_supplicant_get_scan_results(wpa_s, NULL,
622 bgscan_notify_scan(wpa_s, scan_res);
623 wpa_scan_results_free(scan_res);
627 wpa_s->bgscan_ssid = NULL;
631 static void wpa_supplicant_stop_bgscan(struct wpa_supplicant *wpa_s)
633 if (wpa_s->bgscan_ssid != NULL) {
634 bgscan_deinit(wpa_s);
635 wpa_s->bgscan_ssid = NULL;
639 #endif /* CONFIG_BGSCAN */
642 static void wpa_supplicant_start_autoscan(struct wpa_supplicant *wpa_s)
644 if (autoscan_init(wpa_s, 0))
645 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize autoscan");
649 static void wpa_supplicant_stop_autoscan(struct wpa_supplicant *wpa_s)
651 autoscan_deinit(wpa_s);
655 void wpa_supplicant_reinit_autoscan(struct wpa_supplicant *wpa_s)
657 if (wpa_s->wpa_state == WPA_DISCONNECTED ||
658 wpa_s->wpa_state == WPA_SCANNING) {
659 autoscan_deinit(wpa_s);
660 wpa_supplicant_start_autoscan(wpa_s);
666 * wpa_supplicant_set_state - Set current connection state
667 * @wpa_s: Pointer to wpa_supplicant data
668 * @state: The new connection state
670 * This function is called whenever the connection state changes, e.g.,
671 * association is completed for WPA/WPA2 4-Way Handshake is started.
673 void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s,
674 enum wpa_states state)
676 enum wpa_states old_state = wpa_s->wpa_state;
678 wpa_dbg(wpa_s, MSG_DEBUG, "State: %s -> %s",
679 wpa_supplicant_state_txt(wpa_s->wpa_state),
680 wpa_supplicant_state_txt(state));
682 if (state == WPA_INTERFACE_DISABLED) {
683 /* Assure normal scan when interface is restored */
684 wpa_s->normal_scans = 0;
687 if (state == WPA_COMPLETED) {
688 wpas_connect_work_done(wpa_s);
689 /* Reinitialize normal_scan counter */
690 wpa_s->normal_scans = 0;
693 if (state != WPA_SCANNING)
694 wpa_supplicant_notify_scanning(wpa_s, 0);
696 if (state == WPA_COMPLETED && wpa_s->new_connection) {
697 struct wpa_ssid *ssid = wpa_s->current_ssid;
698 #if defined(CONFIG_CTRL_IFACE) || !defined(CONFIG_NO_STDOUT_DEBUG)
699 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_CONNECTED "- Connection to "
700 MACSTR " completed [id=%d id_str=%s]",
701 MAC2STR(wpa_s->bssid),
702 ssid ? ssid->id : -1,
703 ssid && ssid->id_str ? ssid->id_str : "");
704 #endif /* CONFIG_CTRL_IFACE || !CONFIG_NO_STDOUT_DEBUG */
705 wpas_clear_temp_disabled(wpa_s, ssid, 1);
706 wpa_s->extra_blacklist_count = 0;
707 wpa_s->new_connection = 0;
708 wpa_drv_set_operstate(wpa_s, 1);
709 #ifndef IEEE8021X_EAPOL
710 wpa_drv_set_supp_port(wpa_s, 1);
711 #endif /* IEEE8021X_EAPOL */
712 wpa_s->after_wps = 0;
713 wpa_s->known_wps_freq = 0;
714 wpas_p2p_completed(wpa_s);
716 sme_sched_obss_scan(wpa_s, 1);
717 } else if (state == WPA_DISCONNECTED || state == WPA_ASSOCIATING ||
718 state == WPA_ASSOCIATED) {
719 wpa_s->new_connection = 1;
720 wpa_drv_set_operstate(wpa_s, 0);
721 #ifndef IEEE8021X_EAPOL
722 wpa_drv_set_supp_port(wpa_s, 0);
723 #endif /* IEEE8021X_EAPOL */
724 sme_sched_obss_scan(wpa_s, 0);
726 wpa_s->wpa_state = state;
729 if (state == WPA_COMPLETED)
730 wpa_supplicant_start_bgscan(wpa_s);
731 else if (state < WPA_ASSOCIATED)
732 wpa_supplicant_stop_bgscan(wpa_s);
733 #endif /* CONFIG_BGSCAN */
735 if (state == WPA_AUTHENTICATING)
736 wpa_supplicant_stop_autoscan(wpa_s);
738 if (state == WPA_DISCONNECTED || state == WPA_INACTIVE)
739 wpa_supplicant_start_autoscan(wpa_s);
741 if (wpa_s->wpa_state != old_state) {
742 wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
745 * Notify the P2P Device interface about a state change in one
748 wpas_p2p_indicate_state_change(wpa_s);
750 if (wpa_s->wpa_state == WPA_COMPLETED ||
751 old_state == WPA_COMPLETED)
752 wpas_notify_auth_changed(wpa_s);
757 void wpa_supplicant_terminate_proc(struct wpa_global *global)
761 struct wpa_supplicant *wpa_s = global->ifaces;
763 struct wpa_supplicant *next = wpa_s->next;
764 if (wpas_wps_terminate_pending(wpa_s) == 1)
767 if (wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE ||
768 (wpa_s->current_ssid && wpa_s->current_ssid->p2p_group))
769 wpas_p2p_disconnect(wpa_s);
770 #endif /* CONFIG_P2P */
773 #endif /* CONFIG_WPS */
780 static void wpa_supplicant_terminate(int sig, void *signal_ctx)
782 struct wpa_global *global = signal_ctx;
783 wpa_supplicant_terminate_proc(global);
787 void wpa_supplicant_clear_status(struct wpa_supplicant *wpa_s)
789 enum wpa_states old_state = wpa_s->wpa_state;
791 wpa_s->pairwise_cipher = 0;
792 wpa_s->group_cipher = 0;
793 wpa_s->mgmt_group_cipher = 0;
795 if (wpa_s->wpa_state != WPA_INTERFACE_DISABLED)
796 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
798 if (wpa_s->wpa_state != old_state)
799 wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
804 * wpa_supplicant_reload_configuration - Reload configuration data
805 * @wpa_s: Pointer to wpa_supplicant data
806 * Returns: 0 on success or -1 if configuration parsing failed
808 * This function can be used to request that the configuration data is reloaded
809 * (e.g., after configuration file change). This function is reloading
810 * configuration only for one interface, so this may need to be called multiple
811 * times if %wpa_supplicant is controlling multiple interfaces and all
812 * interfaces need reconfiguration.
814 int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s)
816 struct wpa_config *conf;
820 if (wpa_s->confname == NULL)
822 conf = wpa_config_read(wpa_s->confname, NULL);
824 wpa_msg(wpa_s, MSG_ERROR, "Failed to parse the configuration "
825 "file '%s' - exiting", wpa_s->confname);
828 wpa_config_read(wpa_s->confanother, conf);
830 conf->changed_parameters = (unsigned int) -1;
832 reconf_ctrl = !!conf->ctrl_interface != !!wpa_s->conf->ctrl_interface
833 || (conf->ctrl_interface && wpa_s->conf->ctrl_interface &&
834 os_strcmp(conf->ctrl_interface,
835 wpa_s->conf->ctrl_interface) != 0);
837 if (reconf_ctrl && wpa_s->ctrl_iface) {
838 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
839 wpa_s->ctrl_iface = NULL;
842 eapol_sm_invalidate_cached_session(wpa_s->eapol);
843 if (wpa_s->current_ssid) {
844 wpa_supplicant_deauthenticate(wpa_s,
845 WLAN_REASON_DEAUTH_LEAVING);
849 * TODO: should notify EAPOL SM about changes in opensc_engine_path,
850 * pkcs11_engine_path, pkcs11_module_path.
852 if (wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt)) {
854 * Clear forced success to clear EAP state for next
857 eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
859 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
860 wpa_sm_set_config(wpa_s->wpa, NULL);
861 wpa_sm_pmksa_cache_flush(wpa_s->wpa, NULL);
862 wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
863 rsn_preauth_deinit(wpa_s->wpa);
865 old_ap_scan = wpa_s->conf->ap_scan;
866 wpa_config_free(wpa_s->conf);
868 if (old_ap_scan != wpa_s->conf->ap_scan)
869 wpas_notify_ap_scan_changed(wpa_s);
872 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
874 wpa_supplicant_update_config(wpa_s);
876 wpa_supplicant_clear_status(wpa_s);
877 if (wpa_supplicant_enabled_networks(wpa_s)) {
878 wpa_s->reassociate = 1;
879 wpa_supplicant_req_scan(wpa_s, 0, 0);
881 wpa_dbg(wpa_s, MSG_DEBUG, "Reconfiguration completed");
886 static void wpa_supplicant_reconfig(int sig, void *signal_ctx)
888 struct wpa_global *global = signal_ctx;
889 struct wpa_supplicant *wpa_s;
890 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
891 wpa_dbg(wpa_s, MSG_DEBUG, "Signal %d received - reconfiguring",
893 if (wpa_supplicant_reload_configuration(wpa_s) < 0) {
894 wpa_supplicant_terminate_proc(global);
900 static int wpa_supplicant_suites_from_ai(struct wpa_supplicant *wpa_s,
901 struct wpa_ssid *ssid,
902 struct wpa_ie_data *ie)
904 int ret = wpa_sm_parse_own_wpa_ie(wpa_s->wpa, ie);
907 wpa_msg(wpa_s, MSG_INFO, "WPA: Failed to parse WPA IE "
908 "from association info");
913 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Using WPA IE from AssocReq to set "
915 if (!(ie->group_cipher & ssid->group_cipher)) {
916 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled group "
917 "cipher 0x%x (mask 0x%x) - reject",
918 ie->group_cipher, ssid->group_cipher);
921 if (!(ie->pairwise_cipher & ssid->pairwise_cipher)) {
922 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled pairwise "
923 "cipher 0x%x (mask 0x%x) - reject",
924 ie->pairwise_cipher, ssid->pairwise_cipher);
927 if (!(ie->key_mgmt & ssid->key_mgmt)) {
928 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled key "
929 "management 0x%x (mask 0x%x) - reject",
930 ie->key_mgmt, ssid->key_mgmt);
934 #ifdef CONFIG_IEEE80211W
935 if (!(ie->capabilities & WPA_CAPABILITY_MFPC) &&
936 (ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT ?
937 wpa_s->conf->pmf : ssid->ieee80211w) ==
938 MGMT_FRAME_PROTECTION_REQUIRED) {
939 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver associated with an AP "
940 "that does not support management frame protection - "
944 #endif /* CONFIG_IEEE80211W */
951 * wpa_supplicant_set_suites - Set authentication and encryption parameters
952 * @wpa_s: Pointer to wpa_supplicant data
953 * @bss: Scan results for the selected BSS, or %NULL if not available
954 * @ssid: Configuration data for the selected network
955 * @wpa_ie: Buffer for the WPA/RSN IE
956 * @wpa_ie_len: Maximum wpa_ie buffer size on input. This is changed to be the
957 * used buffer length in case the functions returns success.
958 * Returns: 0 on success or -1 on failure
960 * This function is used to configure authentication and encryption parameters
961 * based on the network configuration and scan result for the selected BSS (if
964 int wpa_supplicant_set_suites(struct wpa_supplicant *wpa_s,
965 struct wpa_bss *bss, struct wpa_ssid *ssid,
966 u8 *wpa_ie, size_t *wpa_ie_len)
968 struct wpa_ie_data ie;
970 const u8 *bss_wpa, *bss_rsn, *bss_osen;
973 bss_wpa = wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE);
974 bss_rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
975 bss_osen = wpa_bss_get_vendor_ie(bss, OSEN_IE_VENDOR_TYPE);
977 bss_wpa = bss_rsn = bss_osen = NULL;
979 if (bss_rsn && (ssid->proto & WPA_PROTO_RSN) &&
980 wpa_parse_wpa_ie(bss_rsn, 2 + bss_rsn[1], &ie) == 0 &&
981 (ie.group_cipher & ssid->group_cipher) &&
982 (ie.pairwise_cipher & ssid->pairwise_cipher) &&
983 (ie.key_mgmt & ssid->key_mgmt)) {
984 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using IEEE 802.11i/D9.0");
985 proto = WPA_PROTO_RSN;
986 } else if (bss_wpa && (ssid->proto & WPA_PROTO_WPA) &&
987 wpa_parse_wpa_ie(bss_wpa, 2 +bss_wpa[1], &ie) == 0 &&
988 (ie.group_cipher & ssid->group_cipher) &&
989 (ie.pairwise_cipher & ssid->pairwise_cipher) &&
990 (ie.key_mgmt & ssid->key_mgmt)) {
991 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using IEEE 802.11i/D3.0");
992 proto = WPA_PROTO_WPA;
994 } else if (bss_osen && (ssid->proto & WPA_PROTO_OSEN)) {
995 wpa_dbg(wpa_s, MSG_DEBUG, "HS 2.0: using OSEN");
996 /* TODO: parse OSEN element */
997 os_memset(&ie, 0, sizeof(ie));
998 ie.group_cipher = WPA_CIPHER_CCMP;
999 ie.pairwise_cipher = WPA_CIPHER_CCMP;
1000 ie.key_mgmt = WPA_KEY_MGMT_OSEN;
1001 proto = WPA_PROTO_OSEN;
1002 #endif /* CONFIG_HS20 */
1004 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select WPA/RSN");
1007 if (ssid->proto & WPA_PROTO_OSEN)
1008 proto = WPA_PROTO_OSEN;
1009 else if (ssid->proto & WPA_PROTO_RSN)
1010 proto = WPA_PROTO_RSN;
1012 proto = WPA_PROTO_WPA;
1013 if (wpa_supplicant_suites_from_ai(wpa_s, ssid, &ie) < 0) {
1014 os_memset(&ie, 0, sizeof(ie));
1015 ie.group_cipher = ssid->group_cipher;
1016 ie.pairwise_cipher = ssid->pairwise_cipher;
1017 ie.key_mgmt = ssid->key_mgmt;
1018 #ifdef CONFIG_IEEE80211W
1019 ie.mgmt_group_cipher =
1020 ssid->ieee80211w != NO_MGMT_FRAME_PROTECTION ?
1021 WPA_CIPHER_AES_128_CMAC : 0;
1022 #endif /* CONFIG_IEEE80211W */
1023 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Set cipher suites "
1024 "based on configuration");
1029 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected cipher suites: group %d "
1030 "pairwise %d key_mgmt %d proto %d",
1031 ie.group_cipher, ie.pairwise_cipher, ie.key_mgmt, proto);
1032 #ifdef CONFIG_IEEE80211W
1033 if (ssid->ieee80211w) {
1034 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected mgmt group cipher %d",
1035 ie.mgmt_group_cipher);
1037 #endif /* CONFIG_IEEE80211W */
1039 wpa_s->wpa_proto = proto;
1040 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PROTO, proto);
1041 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED,
1042 !!(ssid->proto & (WPA_PROTO_RSN | WPA_PROTO_OSEN)));
1044 if (bss || !wpa_s->ap_ies_from_associnfo) {
1045 if (wpa_sm_set_ap_wpa_ie(wpa_s->wpa, bss_wpa,
1046 bss_wpa ? 2 + bss_wpa[1] : 0) ||
1047 wpa_sm_set_ap_rsn_ie(wpa_s->wpa, bss_rsn,
1048 bss_rsn ? 2 + bss_rsn[1] : 0))
1052 sel = ie.group_cipher & ssid->group_cipher;
1053 wpa_s->group_cipher = wpa_pick_group_cipher(sel);
1054 if (wpa_s->group_cipher < 0) {
1055 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select group "
1059 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using GTK %s",
1060 wpa_cipher_txt(wpa_s->group_cipher));
1062 sel = ie.pairwise_cipher & ssid->pairwise_cipher;
1063 wpa_s->pairwise_cipher = wpa_pick_pairwise_cipher(sel, 1);
1064 if (wpa_s->pairwise_cipher < 0) {
1065 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select pairwise "
1069 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using PTK %s",
1070 wpa_cipher_txt(wpa_s->pairwise_cipher));
1072 sel = ie.key_mgmt & ssid->key_mgmt;
1074 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SAE))
1075 sel &= ~(WPA_KEY_MGMT_SAE | WPA_KEY_MGMT_FT_SAE);
1076 #endif /* CONFIG_SAE */
1078 #ifdef CONFIG_IEEE80211R
1079 } else if (sel & WPA_KEY_MGMT_FT_IEEE8021X) {
1080 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_IEEE8021X;
1081 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/802.1X");
1082 } else if (sel & WPA_KEY_MGMT_FT_PSK) {
1083 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_PSK;
1084 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/PSK");
1085 #endif /* CONFIG_IEEE80211R */
1087 } else if (sel & WPA_KEY_MGMT_SAE) {
1088 wpa_s->key_mgmt = WPA_KEY_MGMT_SAE;
1089 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT SAE");
1090 } else if (sel & WPA_KEY_MGMT_FT_SAE) {
1091 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_SAE;
1092 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT FT/SAE");
1093 #endif /* CONFIG_SAE */
1094 #ifdef CONFIG_IEEE80211W
1095 } else if (sel & WPA_KEY_MGMT_IEEE8021X_SHA256) {
1096 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SHA256;
1097 wpa_dbg(wpa_s, MSG_DEBUG,
1098 "WPA: using KEY_MGMT 802.1X with SHA256");
1099 } else if (sel & WPA_KEY_MGMT_PSK_SHA256) {
1100 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK_SHA256;
1101 wpa_dbg(wpa_s, MSG_DEBUG,
1102 "WPA: using KEY_MGMT PSK with SHA256");
1103 #endif /* CONFIG_IEEE80211W */
1104 } else if (sel & WPA_KEY_MGMT_IEEE8021X) {
1105 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X;
1106 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT 802.1X");
1107 } else if (sel & WPA_KEY_MGMT_PSK) {
1108 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK;
1109 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-PSK");
1110 } else if (sel & WPA_KEY_MGMT_WPA_NONE) {
1111 wpa_s->key_mgmt = WPA_KEY_MGMT_WPA_NONE;
1112 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-NONE");
1114 } else if (sel & WPA_KEY_MGMT_OSEN) {
1115 wpa_s->key_mgmt = WPA_KEY_MGMT_OSEN;
1116 wpa_dbg(wpa_s, MSG_DEBUG, "HS 2.0: using KEY_MGMT OSEN");
1117 #endif /* CONFIG_HS20 */
1119 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select "
1120 "authenticated key management type");
1124 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
1125 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
1126 wpa_s->pairwise_cipher);
1127 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
1129 #ifdef CONFIG_IEEE80211W
1130 sel = ie.mgmt_group_cipher;
1131 if ((ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT ?
1132 wpa_s->conf->pmf : ssid->ieee80211w) == NO_MGMT_FRAME_PROTECTION ||
1133 !(ie.capabilities & WPA_CAPABILITY_MFPC))
1135 if (sel & WPA_CIPHER_AES_128_CMAC) {
1136 wpa_s->mgmt_group_cipher = WPA_CIPHER_AES_128_CMAC;
1137 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1139 } else if (sel & WPA_CIPHER_BIP_GMAC_128) {
1140 wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_GMAC_128;
1141 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1143 } else if (sel & WPA_CIPHER_BIP_GMAC_256) {
1144 wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_GMAC_256;
1145 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1147 } else if (sel & WPA_CIPHER_BIP_CMAC_256) {
1148 wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_CMAC_256;
1149 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1152 wpa_s->mgmt_group_cipher = 0;
1153 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: not using MGMT group cipher");
1155 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
1156 wpa_s->mgmt_group_cipher);
1157 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MFP,
1158 (ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT ?
1159 wpa_s->conf->pmf : ssid->ieee80211w));
1160 #endif /* CONFIG_IEEE80211W */
1162 if (wpa_sm_set_assoc_wpa_ie_default(wpa_s->wpa, wpa_ie, wpa_ie_len)) {
1163 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to generate WPA IE");
1167 if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt)) {
1168 wpa_sm_set_pmk(wpa_s->wpa, ssid->psk, PMK_LEN);
1169 #ifndef CONFIG_NO_PBKDF2
1170 if (bss && ssid->bssid_set && ssid->ssid_len == 0 &&
1173 pbkdf2_sha1(ssid->passphrase, bss->ssid, bss->ssid_len,
1174 4096, psk, PMK_LEN);
1175 wpa_hexdump_key(MSG_MSGDUMP, "PSK (from passphrase)",
1177 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN);
1179 #endif /* CONFIG_NO_PBKDF2 */
1180 #ifdef CONFIG_EXT_PASSWORD
1181 if (ssid->ext_psk) {
1182 struct wpabuf *pw = ext_password_get(wpa_s->ext_pw,
1184 char pw_str[64 + 1];
1188 wpa_msg(wpa_s, MSG_INFO, "EXT PW: No PSK "
1189 "found from external storage");
1193 if (wpabuf_len(pw) < 8 || wpabuf_len(pw) > 64) {
1194 wpa_msg(wpa_s, MSG_INFO, "EXT PW: Unexpected "
1195 "PSK length %d in external storage",
1196 (int) wpabuf_len(pw));
1197 ext_password_free(pw);
1201 os_memcpy(pw_str, wpabuf_head(pw), wpabuf_len(pw));
1202 pw_str[wpabuf_len(pw)] = '\0';
1204 #ifndef CONFIG_NO_PBKDF2
1205 if (wpabuf_len(pw) >= 8 && wpabuf_len(pw) < 64 && bss)
1207 pbkdf2_sha1(pw_str, bss->ssid, bss->ssid_len,
1208 4096, psk, PMK_LEN);
1209 os_memset(pw_str, 0, sizeof(pw_str));
1210 wpa_hexdump_key(MSG_MSGDUMP, "PSK (from "
1211 "external passphrase)",
1213 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN);
1215 #endif /* CONFIG_NO_PBKDF2 */
1216 if (wpabuf_len(pw) == 2 * PMK_LEN) {
1217 if (hexstr2bin(pw_str, psk, PMK_LEN) < 0) {
1218 wpa_msg(wpa_s, MSG_INFO, "EXT PW: "
1219 "Invalid PSK hex string");
1220 os_memset(pw_str, 0, sizeof(pw_str));
1221 ext_password_free(pw);
1224 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN);
1226 wpa_msg(wpa_s, MSG_INFO, "EXT PW: No suitable "
1228 os_memset(pw_str, 0, sizeof(pw_str));
1229 ext_password_free(pw);
1233 os_memset(pw_str, 0, sizeof(pw_str));
1234 ext_password_free(pw);
1236 #endif /* CONFIG_EXT_PASSWORD */
1238 wpa_sm_set_pmk_from_pmksa(wpa_s->wpa);
1244 static void wpas_ext_capab_byte(struct wpa_supplicant *wpa_s, u8 *pos, int idx)
1249 case 0: /* Bits 0-7 */
1251 case 1: /* Bits 8-15 */
1253 case 2: /* Bits 16-23 */
1255 *pos |= 0x02; /* Bit 17 - WNM-Sleep Mode */
1256 *pos |= 0x08; /* Bit 19 - BSS Transition */
1257 #endif /* CONFIG_WNM */
1259 case 3: /* Bits 24-31 */
1261 *pos |= 0x02; /* Bit 25 - SSID List */
1262 #endif /* CONFIG_WNM */
1263 #ifdef CONFIG_INTERWORKING
1264 if (wpa_s->conf->interworking)
1265 *pos |= 0x80; /* Bit 31 - Interworking */
1266 #endif /* CONFIG_INTERWORKING */
1268 case 4: /* Bits 32-39 */
1269 #ifdef CONFIG_INTERWORKING
1270 if (wpa_s->drv_flags / WPA_DRIVER_FLAGS_QOS_MAPPING)
1271 *pos |= 0x01; /* Bit 32 - QoS Map */
1272 #endif /* CONFIG_INTERWORKING */
1274 case 5: /* Bits 40-47 */
1276 if (wpa_s->conf->hs20)
1277 *pos |= 0x40; /* Bit 46 - WNM-Notification */
1278 #endif /* CONFIG_HS20 */
1280 case 6: /* Bits 48-55 */
1286 int wpas_build_ext_capab(struct wpa_supplicant *wpa_s, u8 *buf, size_t buflen)
1291 if (len < wpa_s->extended_capa_len)
1292 len = wpa_s->extended_capa_len;
1293 if (buflen < (size_t) len + 2) {
1294 wpa_printf(MSG_INFO,
1295 "Not enough room for building extended capabilities element");
1299 *pos++ = WLAN_EID_EXT_CAPAB;
1301 for (i = 0; i < len; i++, pos++) {
1302 wpas_ext_capab_byte(wpa_s, pos, i);
1304 if (i < wpa_s->extended_capa_len) {
1305 *pos &= ~wpa_s->extended_capa_mask[i];
1306 *pos |= wpa_s->extended_capa[i];
1310 while (len > 0 && buf[1 + len] == 0) {
1321 static int wpas_valid_bss(struct wpa_supplicant *wpa_s,
1322 struct wpa_bss *test_bss)
1324 struct wpa_bss *bss;
1326 dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
1327 if (bss == test_bss)
1335 static int wpas_valid_ssid(struct wpa_supplicant *wpa_s,
1336 struct wpa_ssid *test_ssid)
1338 struct wpa_ssid *ssid;
1340 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) {
1341 if (ssid == test_ssid)
1349 int wpas_valid_bss_ssid(struct wpa_supplicant *wpa_s, struct wpa_bss *test_bss,
1350 struct wpa_ssid *test_ssid)
1352 if (test_bss && !wpas_valid_bss(wpa_s, test_bss))
1355 return test_ssid == NULL || wpas_valid_ssid(wpa_s, test_ssid);
1359 void wpas_connect_work_free(struct wpa_connect_work *cwork)
1367 void wpas_connect_work_done(struct wpa_supplicant *wpa_s)
1369 struct wpa_connect_work *cwork;
1370 struct wpa_radio_work *work = wpa_s->connect_work;
1375 wpa_s->connect_work = NULL;
1378 wpas_connect_work_free(cwork);
1379 radio_work_done(work);
1383 int wpas_update_random_addr(struct wpa_supplicant *wpa_s, int style)
1385 struct os_reltime now;
1388 os_get_reltime(&now);
1389 if (wpa_s->last_mac_addr_style == style &&
1390 wpa_s->last_mac_addr_change.sec != 0 &&
1391 !os_reltime_expired(&now, &wpa_s->last_mac_addr_change,
1392 wpa_s->conf->rand_addr_lifetime)) {
1393 wpa_msg(wpa_s, MSG_DEBUG,
1394 "Previously selected random MAC address has not yet expired");
1400 if (random_mac_addr(addr) < 0)
1404 os_memcpy(addr, wpa_s->perm_addr, ETH_ALEN);
1405 if (random_mac_addr_keep_oui(addr) < 0)
1412 if (wpa_drv_set_mac_addr(wpa_s, addr) < 0) {
1413 wpa_msg(wpa_s, MSG_INFO,
1414 "Failed to set random MAC address");
1418 os_get_reltime(&wpa_s->last_mac_addr_change);
1419 wpa_s->mac_addr_changed = 1;
1420 wpa_s->last_mac_addr_style = style;
1422 if (wpa_supplicant_update_mac_addr(wpa_s) < 0) {
1423 wpa_msg(wpa_s, MSG_INFO,
1424 "Could not update MAC address information");
1428 wpa_msg(wpa_s, MSG_DEBUG, "Using random MAC address " MACSTR,
1435 int wpas_update_random_addr_disassoc(struct wpa_supplicant *wpa_s)
1437 if (wpa_s->wpa_state >= WPA_AUTHENTICATING ||
1438 !wpa_s->conf->preassoc_mac_addr)
1441 return wpas_update_random_addr(wpa_s, wpa_s->conf->preassoc_mac_addr);
1445 static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit);
1448 * wpa_supplicant_associate - Request association
1449 * @wpa_s: Pointer to wpa_supplicant data
1450 * @bss: Scan results for the selected BSS, or %NULL if not available
1451 * @ssid: Configuration data for the selected network
1453 * This function is used to request %wpa_supplicant to associate with a BSS.
1455 void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
1456 struct wpa_bss *bss, struct wpa_ssid *ssid)
1458 struct wpa_connect_work *cwork;
1461 if (ssid->mac_addr == -1)
1462 rand_style = wpa_s->conf->mac_addr;
1464 rand_style = ssid->mac_addr;
1466 if (wpa_s->last_ssid == ssid) {
1467 wpa_dbg(wpa_s, MSG_DEBUG, "Re-association to the same ESS");
1468 } else if (rand_style > 0) {
1469 if (wpas_update_random_addr(wpa_s, rand_style) < 0)
1471 wpa_sm_pmksa_cache_flush(wpa_s->wpa, ssid);
1472 } else if (wpa_s->mac_addr_changed) {
1473 if (wpa_drv_set_mac_addr(wpa_s, NULL) < 0) {
1474 wpa_msg(wpa_s, MSG_INFO,
1475 "Could not restore permanent MAC address");
1478 wpa_s->mac_addr_changed = 0;
1479 if (wpa_supplicant_update_mac_addr(wpa_s) < 0) {
1480 wpa_msg(wpa_s, MSG_INFO,
1481 "Could not update MAC address information");
1484 wpa_msg(wpa_s, MSG_DEBUG, "Using permanent MAC address");
1486 wpa_s->last_ssid = ssid;
1488 #ifdef CONFIG_IBSS_RSN
1489 ibss_rsn_deinit(wpa_s->ibss_rsn);
1490 wpa_s->ibss_rsn = NULL;
1491 #endif /* CONFIG_IBSS_RSN */
1493 if (ssid->mode == WPAS_MODE_AP || ssid->mode == WPAS_MODE_P2P_GO ||
1494 ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) {
1496 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_AP)) {
1497 wpa_msg(wpa_s, MSG_INFO, "Driver does not support AP "
1501 if (wpa_supplicant_create_ap(wpa_s, ssid) < 0) {
1502 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
1503 if (ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION)
1504 wpas_p2p_ap_setup_failed(wpa_s);
1507 wpa_s->current_bss = bss;
1508 #else /* CONFIG_AP */
1509 wpa_msg(wpa_s, MSG_ERROR, "AP mode support not included in "
1511 #endif /* CONFIG_AP */
1517 wpa_tdls_ap_ies(wpa_s->wpa, (const u8 *) (bss + 1),
1519 #endif /* CONFIG_TDLS */
1521 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) &&
1522 ssid->mode == IEEE80211_MODE_INFRA) {
1523 sme_authenticate(wpa_s, bss, ssid);
1527 if (wpa_s->connect_work) {
1528 wpa_dbg(wpa_s, MSG_DEBUG, "Reject wpa_supplicant_associate() call since connect_work exist");
1532 if (radio_work_pending(wpa_s, "connect")) {
1533 wpa_dbg(wpa_s, MSG_DEBUG, "Reject wpa_supplicant_associate() call since pending work exist");
1537 cwork = os_zalloc(sizeof(*cwork));
1544 if (radio_add_work(wpa_s, bss ? bss->freq : 0, "connect", 1,
1545 wpas_start_assoc_cb, cwork) < 0) {
1551 static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
1553 struct wpa_connect_work *cwork = work->ctx;
1554 struct wpa_bss *bss = cwork->bss;
1555 struct wpa_ssid *ssid = cwork->ssid;
1556 struct wpa_supplicant *wpa_s = work->wpa_s;
1559 int use_crypt, ret, i, bssid_changed;
1560 int algs = WPA_AUTH_ALG_OPEN;
1561 unsigned int cipher_pairwise, cipher_group;
1562 struct wpa_driver_associate_params params;
1563 int wep_keys_set = 0;
1564 int assoc_failed = 0;
1565 struct wpa_ssid *old_ssid;
1566 #ifdef CONFIG_HT_OVERRIDES
1567 struct ieee80211_ht_capabilities htcaps;
1568 struct ieee80211_ht_capabilities htcaps_mask;
1569 #endif /* CONFIG_HT_OVERRIDES */
1570 #ifdef CONFIG_VHT_OVERRIDES
1571 struct ieee80211_vht_capabilities vhtcaps;
1572 struct ieee80211_vht_capabilities vhtcaps_mask;
1573 #endif /* CONFIG_VHT_OVERRIDES */
1576 if (work->started) {
1577 wpa_s->connect_work = NULL;
1579 /* cancel possible auth. timeout */
1580 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s,
1583 wpas_connect_work_free(cwork);
1587 wpa_s->connect_work = work;
1589 if (!wpas_valid_bss_ssid(wpa_s, bss, ssid)) {
1590 wpa_dbg(wpa_s, MSG_DEBUG, "BSS/SSID entry for association not valid anymore - drop connection attempt");
1591 wpas_connect_work_done(wpa_s);
1595 os_memset(¶ms, 0, sizeof(params));
1596 wpa_s->reassociate = 0;
1597 wpa_s->eap_expected_failure = 0;
1598 if (bss && !wpas_driver_bss_selection(wpa_s)) {
1599 #ifdef CONFIG_IEEE80211R
1600 const u8 *ie, *md = NULL;
1601 #endif /* CONFIG_IEEE80211R */
1602 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with " MACSTR
1603 " (SSID='%s' freq=%d MHz)", MAC2STR(bss->bssid),
1604 wpa_ssid_txt(bss->ssid, bss->ssid_len), bss->freq);
1605 bssid_changed = !is_zero_ether_addr(wpa_s->bssid);
1606 os_memset(wpa_s->bssid, 0, ETH_ALEN);
1607 os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN);
1609 wpas_notify_bssid_changed(wpa_s);
1610 #ifdef CONFIG_IEEE80211R
1611 ie = wpa_bss_get_ie(bss, WLAN_EID_MOBILITY_DOMAIN);
1612 if (ie && ie[1] >= MOBILITY_DOMAIN_ID_LEN)
1614 wpa_sm_set_ft_params(wpa_s->wpa, ie, ie ? 2 + ie[1] : 0);
1616 /* Prepare for the next transition */
1617 wpa_ft_prepare_auth_request(wpa_s->wpa, ie);
1619 #endif /* CONFIG_IEEE80211R */
1621 } else if ((ssid->ssid == NULL || ssid->ssid_len == 0) &&
1622 wpa_s->conf->ap_scan == 2 &&
1623 (ssid->key_mgmt & WPA_KEY_MGMT_WPS)) {
1624 /* Use ap_scan==1 style network selection to find the network
1626 wpa_s->scan_req = MANUAL_SCAN_REQ;
1627 wpa_s->reassociate = 1;
1628 wpa_supplicant_req_scan(wpa_s, 0, 0);
1630 #endif /* CONFIG_WPS */
1632 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with SSID '%s'",
1633 wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
1634 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
1636 wpa_supplicant_cancel_sched_scan(wpa_s);
1637 wpa_supplicant_cancel_scan(wpa_s);
1639 /* Starting new association, so clear the possibly used WPA IE from the
1640 * previous association. */
1641 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
1643 #ifdef IEEE8021X_EAPOL
1644 if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1646 if (ssid->non_leap == 0)
1647 algs = WPA_AUTH_ALG_LEAP;
1649 algs |= WPA_AUTH_ALG_LEAP;
1652 #endif /* IEEE8021X_EAPOL */
1653 wpa_dbg(wpa_s, MSG_DEBUG, "Automatic auth_alg selection: 0x%x", algs);
1654 if (ssid->auth_alg) {
1655 algs = ssid->auth_alg;
1656 wpa_dbg(wpa_s, MSG_DEBUG, "Overriding auth_alg selection: "
1660 if (bss && (wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE) ||
1661 wpa_bss_get_ie(bss, WLAN_EID_RSN)) &&
1662 wpa_key_mgmt_wpa(ssid->key_mgmt)) {
1663 int try_opportunistic;
1664 try_opportunistic = (ssid->proactive_key_caching < 0 ?
1666 ssid->proactive_key_caching) &&
1667 (ssid->proto & WPA_PROTO_RSN);
1668 if (pmksa_cache_set_current(wpa_s->wpa, NULL, bss->bssid,
1669 ssid, try_opportunistic) == 0)
1670 eapol_sm_notify_pmkid_attempt(wpa_s->eapol, 1);
1671 wpa_ie_len = sizeof(wpa_ie);
1672 if (wpa_supplicant_set_suites(wpa_s, bss, ssid,
1673 wpa_ie, &wpa_ie_len)) {
1674 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA "
1675 "key management and encryption suites");
1678 } else if ((ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) && bss &&
1679 wpa_key_mgmt_wpa_ieee8021x(ssid->key_mgmt)) {
1681 * Both WPA and non-WPA IEEE 802.1X enabled in configuration -
1682 * use non-WPA since the scan results did not indicate that the
1683 * AP is using WPA or WPA2.
1685 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
1687 wpa_s->wpa_proto = 0;
1688 } else if (wpa_key_mgmt_wpa_any(ssid->key_mgmt)) {
1689 wpa_ie_len = sizeof(wpa_ie);
1690 if (wpa_supplicant_set_suites(wpa_s, NULL, ssid,
1691 wpa_ie, &wpa_ie_len)) {
1692 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA "
1693 "key management and encryption suites (no "
1698 } else if (ssid->key_mgmt & WPA_KEY_MGMT_WPS) {
1699 struct wpabuf *wps_ie;
1700 wps_ie = wps_build_assoc_req_ie(wpas_wps_get_req_type(ssid));
1701 if (wps_ie && wpabuf_len(wps_ie) <= sizeof(wpa_ie)) {
1702 wpa_ie_len = wpabuf_len(wps_ie);
1703 os_memcpy(wpa_ie, wpabuf_head(wps_ie), wpa_ie_len);
1706 wpabuf_free(wps_ie);
1707 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
1708 if (!bss || (bss->caps & IEEE80211_CAP_PRIVACY))
1709 params.wps = WPS_MODE_PRIVACY;
1711 params.wps = WPS_MODE_OPEN;
1712 wpa_s->wpa_proto = 0;
1713 #endif /* CONFIG_WPS */
1715 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
1717 wpa_s->wpa_proto = 0;
1721 if (wpa_s->global->p2p) {
1725 pos = wpa_ie + wpa_ie_len;
1726 len = sizeof(wpa_ie) - wpa_ie_len;
1727 res = wpas_p2p_assoc_req_ie(wpa_s, bss, pos, len,
1733 wpa_s->cross_connect_disallowed = 0;
1736 p2p = wpa_bss_get_vendor_ie_multi(bss, P2P_IE_VENDOR_TYPE);
1738 wpa_s->cross_connect_disallowed =
1739 p2p_get_cross_connect_disallowed(p2p);
1741 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: WLAN AP %s cross "
1743 wpa_s->cross_connect_disallowed ?
1744 "disallows" : "allows");
1748 os_memset(wpa_s->p2p_ip_addr_info, 0, sizeof(wpa_s->p2p_ip_addr_info));
1749 #endif /* CONFIG_P2P */
1752 if (is_hs20_network(wpa_s, ssid, bss)) {
1753 struct wpabuf *hs20;
1754 hs20 = wpabuf_alloc(20);
1756 int pps_mo_id = hs20_get_pps_mo_id(wpa_s, ssid);
1759 wpas_hs20_add_indication(hs20, pps_mo_id);
1760 len = sizeof(wpa_ie) - wpa_ie_len;
1761 if (wpabuf_len(hs20) <= len) {
1762 os_memcpy(wpa_ie + wpa_ie_len,
1763 wpabuf_head(hs20), wpabuf_len(hs20));
1764 wpa_ie_len += wpabuf_len(hs20);
1769 #endif /* CONFIG_HS20 */
1772 * Workaround: Add Extended Capabilities element only if the AP
1773 * included this element in Beacon/Probe Response frames. Some older
1774 * APs seem to have interoperability issues if this element is
1775 * included, so while the standard may require us to include the
1776 * element in all cases, it is justifiable to skip it to avoid
1777 * interoperability issues.
1779 if (!bss || wpa_bss_get_ie(bss, WLAN_EID_EXT_CAPAB)) {
1782 ext_capab_len = wpas_build_ext_capab(wpa_s, ext_capab,
1784 if (ext_capab_len > 0) {
1786 if (wpa_ie_len > 0 && pos[0] == WLAN_EID_RSN)
1788 os_memmove(pos + ext_capab_len, pos,
1789 wpa_ie_len - (pos - wpa_ie));
1790 wpa_ie_len += ext_capab_len;
1791 os_memcpy(pos, ext_capab, ext_capab_len);
1795 wpa_clear_keys(wpa_s, bss ? bss->bssid : NULL);
1797 cipher_pairwise = wpa_s->pairwise_cipher;
1798 cipher_group = wpa_s->group_cipher;
1799 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
1800 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1801 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE)
1803 if (wpa_set_wep_keys(wpa_s, ssid)) {
1808 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS)
1811 #ifdef IEEE8021X_EAPOL
1812 if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1813 if ((ssid->eapol_flags &
1814 (EAPOL_FLAG_REQUIRE_KEY_UNICAST |
1815 EAPOL_FLAG_REQUIRE_KEY_BROADCAST)) == 0 &&
1819 /* Assume that dynamic WEP-104 keys will be used and
1820 * set cipher suites in order for drivers to expect
1822 cipher_pairwise = cipher_group = WPA_CIPHER_WEP104;
1825 #endif /* IEEE8021X_EAPOL */
1827 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
1828 /* Set the key before (and later after) association */
1829 wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
1832 wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING);
1834 params.ssid = bss->ssid;
1835 params.ssid_len = bss->ssid_len;
1836 if (!wpas_driver_bss_selection(wpa_s) || ssid->bssid_set) {
1837 wpa_printf(MSG_DEBUG, "Limit connection to BSSID "
1838 MACSTR " freq=%u MHz based on scan results "
1840 MAC2STR(bss->bssid), bss->freq,
1842 params.bssid = bss->bssid;
1843 params.freq = bss->freq;
1845 params.bssid_hint = bss->bssid;
1846 params.freq_hint = bss->freq;
1848 params.ssid = ssid->ssid;
1849 params.ssid_len = ssid->ssid_len;
1852 if (ssid->mode == WPAS_MODE_IBSS && ssid->bssid_set &&
1853 wpa_s->conf->ap_scan == 2) {
1854 params.bssid = ssid->bssid;
1855 params.fixed_bssid = 1;
1858 if (ssid->mode == WPAS_MODE_IBSS && ssid->frequency > 0 &&
1860 params.freq = ssid->frequency; /* Initial channel for IBSS */
1862 if (ssid->mode == WPAS_MODE_IBSS) {
1863 if (ssid->beacon_int)
1864 params.beacon_int = ssid->beacon_int;
1866 params.beacon_int = wpa_s->conf->beacon_int;
1869 params.wpa_ie = wpa_ie;
1870 params.wpa_ie_len = wpa_ie_len;
1871 params.pairwise_suite = cipher_pairwise;
1872 params.group_suite = cipher_group;
1873 params.key_mgmt_suite = wpa_s->key_mgmt;
1874 params.wpa_proto = wpa_s->wpa_proto;
1875 params.auth_alg = algs;
1876 params.mode = ssid->mode;
1877 params.bg_scan_period = ssid->bg_scan_period;
1878 for (i = 0; i < NUM_WEP_KEYS; i++) {
1879 if (ssid->wep_key_len[i])
1880 params.wep_key[i] = ssid->wep_key[i];
1881 params.wep_key_len[i] = ssid->wep_key_len[i];
1883 params.wep_tx_keyidx = ssid->wep_tx_keyidx;
1885 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) &&
1886 (params.key_mgmt_suite == WPA_KEY_MGMT_PSK ||
1887 params.key_mgmt_suite == WPA_KEY_MGMT_FT_PSK)) {
1888 params.passphrase = ssid->passphrase;
1890 params.psk = ssid->psk;
1893 params.drop_unencrypted = use_crypt;
1895 #ifdef CONFIG_IEEE80211W
1896 params.mgmt_frame_protection =
1897 ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT ?
1898 wpa_s->conf->pmf : ssid->ieee80211w;
1899 if (params.mgmt_frame_protection != NO_MGMT_FRAME_PROTECTION && bss) {
1900 const u8 *rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
1901 struct wpa_ie_data ie;
1902 if (rsn && wpa_parse_wpa_ie(rsn, 2 + rsn[1], &ie) == 0 &&
1904 (WPA_CAPABILITY_MFPC | WPA_CAPABILITY_MFPR)) {
1905 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected AP supports "
1906 "MFP: require MFP");
1907 params.mgmt_frame_protection =
1908 MGMT_FRAME_PROTECTION_REQUIRED;
1911 #endif /* CONFIG_IEEE80211W */
1913 params.p2p = ssid->p2p_group;
1915 if (wpa_s->parent->set_sta_uapsd)
1916 params.uapsd = wpa_s->parent->sta_uapsd;
1920 #ifdef CONFIG_HT_OVERRIDES
1921 os_memset(&htcaps, 0, sizeof(htcaps));
1922 os_memset(&htcaps_mask, 0, sizeof(htcaps_mask));
1923 params.htcaps = (u8 *) &htcaps;
1924 params.htcaps_mask = (u8 *) &htcaps_mask;
1925 wpa_supplicant_apply_ht_overrides(wpa_s, ssid, ¶ms);
1926 #endif /* CONFIG_HT_OVERRIDES */
1927 #ifdef CONFIG_VHT_OVERRIDES
1928 os_memset(&vhtcaps, 0, sizeof(vhtcaps));
1929 os_memset(&vhtcaps_mask, 0, sizeof(vhtcaps_mask));
1930 params.vhtcaps = &vhtcaps;
1931 params.vhtcaps_mask = &vhtcaps_mask;
1932 wpa_supplicant_apply_vht_overrides(wpa_s, wpa_s->current_ssid, ¶ms);
1933 #endif /* CONFIG_VHT_OVERRIDES */
1937 * If multi-channel concurrency is not supported, check for any
1938 * frequency conflict. In case of any frequency conflict, remove the
1939 * least prioritized connection.
1941 if (wpa_s->num_multichan_concurrent < 2) {
1943 num = get_shared_radio_freqs(wpa_s, &freq, 1);
1944 if (num > 0 && freq > 0 && freq != params.freq) {
1945 wpa_printf(MSG_DEBUG,
1946 "Assoc conflicting freq found (%d != %d)",
1948 if (wpas_p2p_handle_frequency_conflicts(wpa_s,
1954 #endif /* CONFIG_P2P */
1956 ret = wpa_drv_associate(wpa_s, ¶ms);
1958 wpa_msg(wpa_s, MSG_INFO, "Association request to the driver "
1960 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SANE_ERROR_CODES) {
1962 * The driver is known to mean what is saying, so we
1963 * can stop right here; the association will not
1966 wpas_connection_failed(wpa_s, wpa_s->pending_bssid);
1967 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
1968 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
1971 /* try to continue anyway; new association will be tried again
1976 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
1977 /* Set the key after the association just in case association
1978 * cleared the previously configured key. */
1979 wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
1980 /* No need to timeout authentication since there is no key
1982 wpa_supplicant_cancel_auth_timeout(wpa_s);
1983 wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
1984 #ifdef CONFIG_IBSS_RSN
1985 } else if (ssid->mode == WPAS_MODE_IBSS &&
1986 wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
1987 wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
1989 * RSN IBSS authentication is per-STA and we can disable the
1990 * per-BSSID authentication.
1992 wpa_supplicant_cancel_auth_timeout(wpa_s);
1993 #endif /* CONFIG_IBSS_RSN */
1995 /* Timeout for IEEE 802.11 authentication and association */
1999 /* give IBSS a bit more time */
2000 timeout = ssid->mode == WPAS_MODE_IBSS ? 10 : 5;
2001 } else if (wpa_s->conf->ap_scan == 1) {
2002 /* give IBSS a bit more time */
2003 timeout = ssid->mode == WPAS_MODE_IBSS ? 20 : 10;
2005 wpa_supplicant_req_auth_timeout(wpa_s, timeout, 0);
2009 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC)) {
2010 /* Set static WEP keys again */
2011 wpa_set_wep_keys(wpa_s, ssid);
2014 if (wpa_s->current_ssid && wpa_s->current_ssid != ssid) {
2016 * Do not allow EAP session resumption between different
2017 * network configurations.
2019 eapol_sm_invalidate_cached_session(wpa_s->eapol);
2021 old_ssid = wpa_s->current_ssid;
2022 wpa_s->current_ssid = ssid;
2023 wpa_s->current_bss = bss;
2024 wpa_supplicant_rsn_supp_set_config(wpa_s, wpa_s->current_ssid);
2025 wpa_supplicant_initiate_eapol(wpa_s);
2026 if (old_ssid != wpa_s->current_ssid)
2027 wpas_notify_network_changed(wpa_s);
2031 static void wpa_supplicant_clear_connection(struct wpa_supplicant *wpa_s,
2034 struct wpa_ssid *old_ssid;
2036 wpa_clear_keys(wpa_s, addr);
2037 old_ssid = wpa_s->current_ssid;
2038 wpa_supplicant_mark_disassoc(wpa_s);
2039 wpa_sm_set_config(wpa_s->wpa, NULL);
2040 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
2041 if (old_ssid != wpa_s->current_ssid)
2042 wpas_notify_network_changed(wpa_s);
2043 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
2048 * wpa_supplicant_deauthenticate - Deauthenticate the current connection
2049 * @wpa_s: Pointer to wpa_supplicant data
2050 * @reason_code: IEEE 802.11 reason code for the deauthenticate frame
2052 * This function is used to request %wpa_supplicant to deauthenticate from the
2055 void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
2059 union wpa_event_data event;
2062 wpa_dbg(wpa_s, MSG_DEBUG, "Request to deauthenticate - bssid=" MACSTR
2063 " pending_bssid=" MACSTR " reason=%d state=%s",
2064 MAC2STR(wpa_s->bssid), MAC2STR(wpa_s->pending_bssid),
2065 reason_code, wpa_supplicant_state_txt(wpa_s->wpa_state));
2067 if (!is_zero_ether_addr(wpa_s->bssid))
2068 addr = wpa_s->bssid;
2069 else if (!is_zero_ether_addr(wpa_s->pending_bssid) &&
2070 (wpa_s->wpa_state == WPA_AUTHENTICATING ||
2071 wpa_s->wpa_state == WPA_ASSOCIATING))
2072 addr = wpa_s->pending_bssid;
2073 else if (wpa_s->wpa_state == WPA_ASSOCIATING) {
2075 * When using driver-based BSS selection, we may not know the
2076 * BSSID with which we are currently trying to associate. We
2077 * need to notify the driver of this disconnection even in such
2078 * a case, so use the all zeros address here.
2080 addr = wpa_s->bssid;
2085 wpa_tdls_teardown_peers(wpa_s->wpa);
2086 #endif /* CONFIG_TDLS */
2089 wpa_drv_deauthenticate(wpa_s, addr, reason_code);
2090 os_memset(&event, 0, sizeof(event));
2091 event.deauth_info.reason_code = (u16) reason_code;
2092 event.deauth_info.locally_generated = 1;
2093 wpa_supplicant_event(wpa_s, EVENT_DEAUTH, &event);
2098 wpa_supplicant_clear_connection(wpa_s, addr);
2101 static void wpa_supplicant_enable_one_network(struct wpa_supplicant *wpa_s,
2102 struct wpa_ssid *ssid)
2104 if (!ssid || !ssid->disabled || ssid->disabled == 2)
2108 wpas_clear_temp_disabled(wpa_s, ssid, 1);
2109 wpas_notify_network_enabled_changed(wpa_s, ssid);
2112 * Try to reassociate since there is no current configuration and a new
2113 * network was made available.
2115 if (!wpa_s->current_ssid && !wpa_s->disconnected)
2116 wpa_s->reassociate = 1;
2121 * wpa_supplicant_enable_network - Mark a configured network as enabled
2122 * @wpa_s: wpa_supplicant structure for a network interface
2123 * @ssid: wpa_ssid structure for a configured network or %NULL
2125 * Enables the specified network or all networks if no network specified.
2127 void wpa_supplicant_enable_network(struct wpa_supplicant *wpa_s,
2128 struct wpa_ssid *ssid)
2131 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
2132 wpa_supplicant_enable_one_network(wpa_s, ssid);
2134 wpa_supplicant_enable_one_network(wpa_s, ssid);
2136 if (wpa_s->reassociate && !wpa_s->disconnected) {
2137 if (wpa_s->sched_scanning) {
2138 wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan to add "
2139 "new network to scan filters");
2140 wpa_supplicant_cancel_sched_scan(wpa_s);
2143 if (wpa_supplicant_fast_associate(wpa_s) != 1)
2144 wpa_supplicant_req_scan(wpa_s, 0, 0);
2150 * wpa_supplicant_disable_network - Mark a configured network as disabled
2151 * @wpa_s: wpa_supplicant structure for a network interface
2152 * @ssid: wpa_ssid structure for a configured network or %NULL
2154 * Disables the specified network or all networks if no network specified.
2156 void wpa_supplicant_disable_network(struct wpa_supplicant *wpa_s,
2157 struct wpa_ssid *ssid)
2159 struct wpa_ssid *other_ssid;
2163 if (wpa_s->sched_scanning)
2164 wpa_supplicant_cancel_sched_scan(wpa_s);
2166 for (other_ssid = wpa_s->conf->ssid; other_ssid;
2167 other_ssid = other_ssid->next) {
2168 was_disabled = other_ssid->disabled;
2169 if (was_disabled == 2)
2170 continue; /* do not change persistent P2P group
2173 other_ssid->disabled = 1;
2175 if (was_disabled != other_ssid->disabled)
2176 wpas_notify_network_enabled_changed(
2179 if (wpa_s->current_ssid)
2180 wpa_supplicant_deauthenticate(
2181 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
2182 } else if (ssid->disabled != 2) {
2183 if (ssid == wpa_s->current_ssid)
2184 wpa_supplicant_deauthenticate(
2185 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
2187 was_disabled = ssid->disabled;
2191 if (was_disabled != ssid->disabled) {
2192 wpas_notify_network_enabled_changed(wpa_s, ssid);
2193 if (wpa_s->sched_scanning) {
2194 wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan "
2195 "to remove network from filters");
2196 wpa_supplicant_cancel_sched_scan(wpa_s);
2197 wpa_supplicant_req_scan(wpa_s, 0, 0);
2205 * wpa_supplicant_select_network - Attempt association with a network
2206 * @wpa_s: wpa_supplicant structure for a network interface
2207 * @ssid: wpa_ssid structure for a configured network or %NULL for any network
2209 void wpa_supplicant_select_network(struct wpa_supplicant *wpa_s,
2210 struct wpa_ssid *ssid)
2213 struct wpa_ssid *other_ssid;
2214 int disconnected = 0;
2216 if (ssid && ssid != wpa_s->current_ssid && wpa_s->current_ssid) {
2217 wpa_supplicant_deauthenticate(
2218 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
2223 wpas_clear_temp_disabled(wpa_s, ssid, 1);
2226 * Mark all other networks disabled or mark all networks enabled if no
2227 * network specified.
2229 for (other_ssid = wpa_s->conf->ssid; other_ssid;
2230 other_ssid = other_ssid->next) {
2231 int was_disabled = other_ssid->disabled;
2232 if (was_disabled == 2)
2233 continue; /* do not change persistent P2P group data */
2235 other_ssid->disabled = ssid ? (ssid->id != other_ssid->id) : 0;
2236 if (was_disabled && !other_ssid->disabled)
2237 wpas_clear_temp_disabled(wpa_s, other_ssid, 0);
2239 if (was_disabled != other_ssid->disabled)
2240 wpas_notify_network_enabled_changed(wpa_s, other_ssid);
2243 if (ssid && ssid == wpa_s->current_ssid && wpa_s->current_ssid) {
2244 /* We are already associated with the selected network */
2245 wpa_printf(MSG_DEBUG, "Already associated with the "
2246 "selected network - do nothing");
2251 wpa_s->current_ssid = ssid;
2252 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
2254 wpa_s->connect_without_scan = NULL;
2255 wpa_s->disconnected = 0;
2256 wpa_s->reassociate = 1;
2258 if (wpa_supplicant_fast_associate(wpa_s) != 1)
2259 wpa_supplicant_req_scan(wpa_s, 0, disconnected ? 100000 : 0);
2262 wpas_notify_network_selected(wpa_s, ssid);
2267 * wpas_set_pkcs11_engine_and_module_path - Set PKCS #11 engine and module path
2268 * @wpa_s: wpa_supplicant structure for a network interface
2269 * @pkcs11_engine_path: PKCS #11 engine path or NULL
2270 * @pkcs11_module_path: PKCS #11 module path or NULL
2271 * Returns: 0 on success; -1 on failure
2273 * Sets the PKCS #11 engine and module path. Both have to be NULL or a valid
2274 * path. If resetting the EAPOL state machine with the new PKCS #11 engine and
2275 * module path fails the paths will be reset to the default value (NULL).
2277 int wpas_set_pkcs11_engine_and_module_path(struct wpa_supplicant *wpa_s,
2278 const char *pkcs11_engine_path,
2279 const char *pkcs11_module_path)
2281 char *pkcs11_engine_path_copy = NULL;
2282 char *pkcs11_module_path_copy = NULL;
2284 if (pkcs11_engine_path != NULL) {
2285 pkcs11_engine_path_copy = os_strdup(pkcs11_engine_path);
2286 if (pkcs11_engine_path_copy == NULL)
2289 if (pkcs11_module_path != NULL) {
2290 pkcs11_module_path_copy = os_strdup(pkcs11_module_path);
2291 if (pkcs11_module_path_copy == NULL) {
2292 os_free(pkcs11_engine_path_copy);
2297 os_free(wpa_s->conf->pkcs11_engine_path);
2298 os_free(wpa_s->conf->pkcs11_module_path);
2299 wpa_s->conf->pkcs11_engine_path = pkcs11_engine_path_copy;
2300 wpa_s->conf->pkcs11_module_path = pkcs11_module_path_copy;
2302 wpa_sm_set_eapol(wpa_s->wpa, NULL);
2303 eapol_sm_deinit(wpa_s->eapol);
2304 wpa_s->eapol = NULL;
2305 if (wpa_supplicant_init_eapol(wpa_s)) {
2306 /* Error -> Reset paths to the default value (NULL) once. */
2307 if (pkcs11_engine_path != NULL && pkcs11_module_path != NULL)
2308 wpas_set_pkcs11_engine_and_module_path(wpa_s, NULL,
2313 wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
2320 * wpa_supplicant_set_ap_scan - Set AP scan mode for interface
2321 * @wpa_s: wpa_supplicant structure for a network interface
2322 * @ap_scan: AP scan mode
2323 * Returns: 0 if succeed or -1 if ap_scan has an invalid value
2326 int wpa_supplicant_set_ap_scan(struct wpa_supplicant *wpa_s, int ap_scan)
2331 if (ap_scan < 0 || ap_scan > 2)
2335 if (ap_scan == 2 && ap_scan != wpa_s->conf->ap_scan &&
2336 wpa_s->wpa_state >= WPA_ASSOCIATING &&
2337 wpa_s->wpa_state < WPA_COMPLETED) {
2338 wpa_printf(MSG_ERROR, "ap_scan = %d (%d) rejected while "
2339 "associating", wpa_s->conf->ap_scan, ap_scan);
2342 #endif /* ANDROID */
2344 old_ap_scan = wpa_s->conf->ap_scan;
2345 wpa_s->conf->ap_scan = ap_scan;
2347 if (old_ap_scan != wpa_s->conf->ap_scan)
2348 wpas_notify_ap_scan_changed(wpa_s);
2355 * wpa_supplicant_set_bss_expiration_age - Set BSS entry expiration age
2356 * @wpa_s: wpa_supplicant structure for a network interface
2357 * @expire_age: Expiration age in seconds
2358 * Returns: 0 if succeed or -1 if expire_age has an invalid value
2361 int wpa_supplicant_set_bss_expiration_age(struct wpa_supplicant *wpa_s,
2362 unsigned int bss_expire_age)
2364 if (bss_expire_age < 10) {
2365 wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration age %u",
2369 wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration age: %d sec",
2371 wpa_s->conf->bss_expiration_age = bss_expire_age;
2378 * wpa_supplicant_set_bss_expiration_count - Set BSS entry expiration scan count
2379 * @wpa_s: wpa_supplicant structure for a network interface
2380 * @expire_count: number of scans after which an unseen BSS is reclaimed
2381 * Returns: 0 if succeed or -1 if expire_count has an invalid value
2384 int wpa_supplicant_set_bss_expiration_count(struct wpa_supplicant *wpa_s,
2385 unsigned int bss_expire_count)
2387 if (bss_expire_count < 1) {
2388 wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration count %u",
2392 wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration scan count: %u",
2394 wpa_s->conf->bss_expiration_scan_count = bss_expire_count;
2401 * wpa_supplicant_set_scan_interval - Set scan interval
2402 * @wpa_s: wpa_supplicant structure for a network interface
2403 * @scan_interval: scan interval in seconds
2404 * Returns: 0 if succeed or -1 if scan_interval has an invalid value
2407 int wpa_supplicant_set_scan_interval(struct wpa_supplicant *wpa_s,
2410 if (scan_interval < 0) {
2411 wpa_msg(wpa_s, MSG_ERROR, "Invalid scan interval %d",
2415 wpa_msg(wpa_s, MSG_DEBUG, "Setting scan interval: %d sec",
2417 wpa_supplicant_update_scan_int(wpa_s, scan_interval);
2424 * wpa_supplicant_set_debug_params - Set global debug params
2425 * @global: wpa_global structure
2426 * @debug_level: debug level
2427 * @debug_timestamp: determines if show timestamp in debug data
2428 * @debug_show_keys: determines if show keys in debug data
2429 * Returns: 0 if succeed or -1 if debug_level has wrong value
2431 int wpa_supplicant_set_debug_params(struct wpa_global *global, int debug_level,
2432 int debug_timestamp, int debug_show_keys)
2435 int old_level, old_timestamp, old_show_keys;
2437 /* check for allowed debuglevels */
2438 if (debug_level != MSG_EXCESSIVE &&
2439 debug_level != MSG_MSGDUMP &&
2440 debug_level != MSG_DEBUG &&
2441 debug_level != MSG_INFO &&
2442 debug_level != MSG_WARNING &&
2443 debug_level != MSG_ERROR)
2446 old_level = wpa_debug_level;
2447 old_timestamp = wpa_debug_timestamp;
2448 old_show_keys = wpa_debug_show_keys;
2450 wpa_debug_level = debug_level;
2451 wpa_debug_timestamp = debug_timestamp ? 1 : 0;
2452 wpa_debug_show_keys = debug_show_keys ? 1 : 0;
2454 if (wpa_debug_level != old_level)
2455 wpas_notify_debug_level_changed(global);
2456 if (wpa_debug_timestamp != old_timestamp)
2457 wpas_notify_debug_timestamp_changed(global);
2458 if (wpa_debug_show_keys != old_show_keys)
2459 wpas_notify_debug_show_keys_changed(global);
2466 * wpa_supplicant_get_ssid - Get a pointer to the current network structure
2467 * @wpa_s: Pointer to wpa_supplicant data
2468 * Returns: A pointer to the current network structure or %NULL on failure
2470 struct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s)
2472 struct wpa_ssid *entry;
2473 u8 ssid[MAX_SSID_LEN];
2479 res = wpa_drv_get_ssid(wpa_s, ssid);
2481 wpa_msg(wpa_s, MSG_WARNING, "Could not read SSID from "
2487 if (wpa_drv_get_bssid(wpa_s, bssid) < 0) {
2488 wpa_msg(wpa_s, MSG_WARNING, "Could not read BSSID from "
2493 wired = wpa_s->conf->ap_scan == 0 &&
2494 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED);
2496 entry = wpa_s->conf->ssid;
2498 if (!wpas_network_disabled(wpa_s, entry) &&
2499 ((ssid_len == entry->ssid_len &&
2500 os_memcmp(ssid, entry->ssid, ssid_len) == 0) || wired) &&
2501 (!entry->bssid_set ||
2502 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
2505 if (!wpas_network_disabled(wpa_s, entry) &&
2506 (entry->key_mgmt & WPA_KEY_MGMT_WPS) &&
2507 (entry->ssid == NULL || entry->ssid_len == 0) &&
2508 (!entry->bssid_set ||
2509 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
2511 #endif /* CONFIG_WPS */
2513 if (!wpas_network_disabled(wpa_s, entry) && entry->bssid_set &&
2514 entry->ssid_len == 0 &&
2515 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0)
2518 entry = entry->next;
2525 static int select_driver(struct wpa_supplicant *wpa_s, int i)
2527 struct wpa_global *global = wpa_s->global;
2529 if (wpa_drivers[i]->global_init && global->drv_priv[i] == NULL) {
2530 global->drv_priv[i] = wpa_drivers[i]->global_init();
2531 if (global->drv_priv[i] == NULL) {
2532 wpa_printf(MSG_ERROR, "Failed to initialize driver "
2533 "'%s'", wpa_drivers[i]->name);
2538 wpa_s->driver = wpa_drivers[i];
2539 wpa_s->global_drv_priv = global->drv_priv[i];
2545 static int wpa_supplicant_set_driver(struct wpa_supplicant *wpa_s,
2550 const char *pos, *driver = name;
2555 if (wpa_drivers[0] == NULL) {
2556 wpa_msg(wpa_s, MSG_ERROR, "No driver interfaces build into "
2562 /* default to first driver in the list */
2563 return select_driver(wpa_s, 0);
2567 pos = os_strchr(driver, ',');
2571 len = os_strlen(driver);
2573 for (i = 0; wpa_drivers[i]; i++) {
2574 if (os_strlen(wpa_drivers[i]->name) == len &&
2575 os_strncmp(driver, wpa_drivers[i]->name, len) ==
2577 /* First driver that succeeds wins */
2578 if (select_driver(wpa_s, i) == 0)
2586 wpa_msg(wpa_s, MSG_ERROR, "Unsupported driver '%s'", name);
2592 * wpa_supplicant_rx_eapol - Deliver a received EAPOL frame to wpa_supplicant
2593 * @ctx: Context pointer (wpa_s); this is the ctx variable registered
2594 * with struct wpa_driver_ops::init()
2595 * @src_addr: Source address of the EAPOL frame
2596 * @buf: EAPOL data starting from the EAPOL header (i.e., no Ethernet header)
2597 * @len: Length of the EAPOL data
2599 * This function is called for each received EAPOL frame. Most driver
2600 * interfaces rely on more generic OS mechanism for receiving frames through
2601 * l2_packet, but if such a mechanism is not available, the driver wrapper may
2602 * take care of received EAPOL frames and deliver them to the core supplicant
2603 * code by calling this function.
2605 void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr,
2606 const u8 *buf, size_t len)
2608 struct wpa_supplicant *wpa_s = ctx;
2610 wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR, MAC2STR(src_addr));
2611 wpa_hexdump(MSG_MSGDUMP, "RX EAPOL", buf, len);
2613 #ifdef CONFIG_PEERKEY
2614 if (wpa_s->wpa_state > WPA_ASSOCIATED && wpa_s->current_ssid &&
2615 wpa_s->current_ssid->peerkey &&
2616 !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) &&
2617 wpa_sm_rx_eapol_peerkey(wpa_s->wpa, src_addr, buf, len) == 1) {
2618 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: Processed PeerKey EAPOL-Key");
2621 #endif /* CONFIG_PEERKEY */
2623 if (wpa_s->wpa_state < WPA_ASSOCIATED ||
2624 (wpa_s->last_eapol_matches_bssid &&
2627 #endif /* CONFIG_AP */
2628 os_memcmp(src_addr, wpa_s->bssid, ETH_ALEN) != 0)) {
2630 * There is possible race condition between receiving the
2631 * association event and the EAPOL frame since they are coming
2632 * through different paths from the driver. In order to avoid
2633 * issues in trying to process the EAPOL frame before receiving
2634 * association information, lets queue it for processing until
2635 * the association event is received. This may also be needed in
2636 * driver-based roaming case, so also use src_addr != BSSID as a
2637 * trigger if we have previously confirmed that the
2638 * Authenticator uses BSSID as the src_addr (which is not the
2639 * case with wired IEEE 802.1X).
2641 wpa_dbg(wpa_s, MSG_DEBUG, "Not associated - Delay processing "
2642 "of received EAPOL frame (state=%s bssid=" MACSTR ")",
2643 wpa_supplicant_state_txt(wpa_s->wpa_state),
2644 MAC2STR(wpa_s->bssid));
2645 wpabuf_free(wpa_s->pending_eapol_rx);
2646 wpa_s->pending_eapol_rx = wpabuf_alloc_copy(buf, len);
2647 if (wpa_s->pending_eapol_rx) {
2648 os_get_reltime(&wpa_s->pending_eapol_rx_time);
2649 os_memcpy(wpa_s->pending_eapol_rx_src, src_addr,
2655 wpa_s->last_eapol_matches_bssid =
2656 os_memcmp(src_addr, wpa_s->bssid, ETH_ALEN) == 0;
2659 if (wpa_s->ap_iface) {
2660 wpa_supplicant_ap_rx_eapol(wpa_s, src_addr, buf, len);
2663 #endif /* CONFIG_AP */
2665 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE) {
2666 wpa_dbg(wpa_s, MSG_DEBUG, "Ignored received EAPOL frame since "
2667 "no key management is configured");
2671 if (wpa_s->eapol_received == 0 &&
2672 (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) ||
2673 !wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) ||
2674 wpa_s->wpa_state != WPA_COMPLETED) &&
2675 (wpa_s->current_ssid == NULL ||
2676 wpa_s->current_ssid->mode != IEEE80211_MODE_IBSS)) {
2677 /* Timeout for completing IEEE 802.1X and WPA authentication */
2678 wpa_supplicant_req_auth_timeout(
2680 (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) ||
2681 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA ||
2682 wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) ?
2685 wpa_s->eapol_received++;
2687 if (wpa_s->countermeasures) {
2688 wpa_msg(wpa_s, MSG_INFO, "WPA: Countermeasures - dropped "
2693 #ifdef CONFIG_IBSS_RSN
2694 if (wpa_s->current_ssid &&
2695 wpa_s->current_ssid->mode == WPAS_MODE_IBSS) {
2696 ibss_rsn_rx_eapol(wpa_s->ibss_rsn, src_addr, buf, len);
2699 #endif /* CONFIG_IBSS_RSN */
2701 /* Source address of the incoming EAPOL frame could be compared to the
2702 * current BSSID. However, it is possible that a centralized
2703 * Authenticator could be using another MAC address than the BSSID of
2704 * an AP, so just allow any address to be used for now. The replies are
2705 * still sent to the current BSSID (if available), though. */
2707 os_memcpy(wpa_s->last_eapol_src, src_addr, ETH_ALEN);
2708 if (!wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) &&
2709 eapol_sm_rx_eapol(wpa_s->eapol, src_addr, buf, len) > 0)
2711 wpa_drv_poll(wpa_s);
2712 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE))
2713 wpa_sm_rx_eapol(wpa_s->wpa, src_addr, buf, len);
2714 else if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt)) {
2716 * Set portValid = TRUE here since we are going to skip 4-way
2717 * handshake processing which would normally set portValid. We
2718 * need this to allow the EAPOL state machines to be completed
2719 * without going through EAPOL-Key handshake.
2721 eapol_sm_notify_portValid(wpa_s->eapol, TRUE);
2726 int wpa_supplicant_update_mac_addr(struct wpa_supplicant *wpa_s)
2728 if (wpa_s->driver->send_eapol) {
2729 const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
2731 os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
2732 } else if ((!wpa_s->p2p_mgmt ||
2733 !(wpa_s->drv_flags &
2734 WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)) &&
2735 !(wpa_s->drv_flags &
2736 WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE)) {
2737 l2_packet_deinit(wpa_s->l2);
2738 wpa_s->l2 = l2_packet_init(wpa_s->ifname,
2739 wpa_drv_get_mac_addr(wpa_s),
2741 wpa_supplicant_rx_eapol, wpa_s, 0);
2742 if (wpa_s->l2 == NULL)
2745 const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
2747 os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
2750 if (wpa_s->l2 && l2_packet_get_own_addr(wpa_s->l2, wpa_s->own_addr)) {
2751 wpa_msg(wpa_s, MSG_ERROR, "Failed to get own L2 address");
2755 wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
2761 static void wpa_supplicant_rx_eapol_bridge(void *ctx, const u8 *src_addr,
2762 const u8 *buf, size_t len)
2764 struct wpa_supplicant *wpa_s = ctx;
2765 const struct l2_ethhdr *eth;
2767 if (len < sizeof(*eth))
2769 eth = (const struct l2_ethhdr *) buf;
2771 if (os_memcmp(eth->h_dest, wpa_s->own_addr, ETH_ALEN) != 0 &&
2772 !(eth->h_dest[0] & 0x01)) {
2773 wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR " to " MACSTR
2774 " (bridge - not for this interface - ignore)",
2775 MAC2STR(src_addr), MAC2STR(eth->h_dest));
2779 wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR " to " MACSTR
2780 " (bridge)", MAC2STR(src_addr), MAC2STR(eth->h_dest));
2781 wpa_supplicant_rx_eapol(wpa_s, src_addr, buf + sizeof(*eth),
2782 len - sizeof(*eth));
2787 * wpa_supplicant_driver_init - Initialize driver interface parameters
2788 * @wpa_s: Pointer to wpa_supplicant data
2789 * Returns: 0 on success, -1 on failure
2791 * This function is called to initialize driver interface parameters.
2792 * wpa_drv_init() must have been called before this function to initialize the
2795 int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s)
2797 static int interface_count = 0;
2799 if (wpa_supplicant_update_mac_addr(wpa_s) < 0)
2802 wpa_dbg(wpa_s, MSG_DEBUG, "Own MAC address: " MACSTR,
2803 MAC2STR(wpa_s->own_addr));
2804 os_memcpy(wpa_s->perm_addr, wpa_s->own_addr, ETH_ALEN);
2805 wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
2807 if (wpa_s->bridge_ifname[0]) {
2808 wpa_dbg(wpa_s, MSG_DEBUG, "Receiving packets from bridge "
2809 "interface '%s'", wpa_s->bridge_ifname);
2810 wpa_s->l2_br = l2_packet_init(wpa_s->bridge_ifname,
2813 wpa_supplicant_rx_eapol_bridge,
2815 if (wpa_s->l2_br == NULL) {
2816 wpa_msg(wpa_s, MSG_ERROR, "Failed to open l2_packet "
2817 "connection for the bridge interface '%s'",
2818 wpa_s->bridge_ifname);
2823 wpa_clear_keys(wpa_s, NULL);
2825 /* Make sure that TKIP countermeasures are not left enabled (could
2826 * happen if wpa_supplicant is killed during countermeasures. */
2827 wpa_drv_set_countermeasures(wpa_s, 0);
2829 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: flushing PMKID list in the driver");
2830 wpa_drv_flush_pmkid(wpa_s);
2832 wpa_s->prev_scan_ssid = WILDCARD_SSID_SCAN;
2833 wpa_s->prev_scan_wildcard = 0;
2835 if (wpa_supplicant_enabled_networks(wpa_s)) {
2836 if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
2837 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
2838 interface_count = 0;
2840 if (!wpa_s->p2p_mgmt &&
2841 wpa_supplicant_delayed_sched_scan(wpa_s,
2842 interface_count % 3,
2844 wpa_supplicant_req_scan(wpa_s, interface_count % 3,
2848 wpa_supplicant_set_state(wpa_s, WPA_INACTIVE);
2854 static int wpa_supplicant_daemon(const char *pid_file)
2856 wpa_printf(MSG_DEBUG, "Daemonize..");
2857 return os_daemonize(pid_file);
2861 static struct wpa_supplicant * wpa_supplicant_alloc(void)
2863 struct wpa_supplicant *wpa_s;
2865 wpa_s = os_zalloc(sizeof(*wpa_s));
2868 wpa_s->scan_req = INITIAL_SCAN_REQ;
2869 wpa_s->scan_interval = 5;
2870 wpa_s->new_connection = 1;
2871 wpa_s->parent = wpa_s;
2872 wpa_s->sched_scanning = 0;
2878 #ifdef CONFIG_HT_OVERRIDES
2880 static int wpa_set_htcap_mcs(struct wpa_supplicant *wpa_s,
2881 struct ieee80211_ht_capabilities *htcaps,
2882 struct ieee80211_ht_capabilities *htcaps_mask,
2885 /* parse ht_mcs into hex array */
2887 const char *tmp = ht_mcs;
2890 /* If ht_mcs is null, do not set anything */
2894 /* This is what we are setting in the kernel */
2895 os_memset(&htcaps->supported_mcs_set, 0, IEEE80211_HT_MCS_MASK_LEN);
2897 wpa_msg(wpa_s, MSG_DEBUG, "set_htcap, ht_mcs -:%s:-", ht_mcs);
2899 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
2901 long v = strtol(tmp, &end, 16);
2903 wpa_msg(wpa_s, MSG_DEBUG,
2904 "htcap value[%i]: %ld end: %p tmp: %p",
2909 htcaps->supported_mcs_set[i] = v;
2912 wpa_msg(wpa_s, MSG_ERROR,
2913 "Failed to parse ht-mcs: %s, error: %s\n",
2914 ht_mcs, strerror(errno));
2920 * If we were able to parse any values, then set mask for the MCS set.
2923 os_memset(&htcaps_mask->supported_mcs_set, 0xff,
2924 IEEE80211_HT_MCS_MASK_LEN - 1);
2925 /* skip the 3 reserved bits */
2926 htcaps_mask->supported_mcs_set[IEEE80211_HT_MCS_MASK_LEN - 1] =
2934 static int wpa_disable_max_amsdu(struct wpa_supplicant *wpa_s,
2935 struct ieee80211_ht_capabilities *htcaps,
2936 struct ieee80211_ht_capabilities *htcaps_mask,
2941 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_max_amsdu: %d", disabled);
2946 msk = host_to_le16(HT_CAP_INFO_MAX_AMSDU_SIZE);
2947 htcaps_mask->ht_capabilities_info |= msk;
2949 htcaps->ht_capabilities_info &= msk;
2951 htcaps->ht_capabilities_info |= msk;
2957 static int wpa_set_ampdu_factor(struct wpa_supplicant *wpa_s,
2958 struct ieee80211_ht_capabilities *htcaps,
2959 struct ieee80211_ht_capabilities *htcaps_mask,
2962 wpa_msg(wpa_s, MSG_DEBUG, "set_ampdu_factor: %d", factor);
2967 if (factor < 0 || factor > 3) {
2968 wpa_msg(wpa_s, MSG_ERROR, "ampdu_factor: %d out of range. "
2969 "Must be 0-3 or -1", factor);
2973 htcaps_mask->a_mpdu_params |= 0x3; /* 2 bits for factor */
2974 htcaps->a_mpdu_params &= ~0x3;
2975 htcaps->a_mpdu_params |= factor & 0x3;
2981 static int wpa_set_ampdu_density(struct wpa_supplicant *wpa_s,
2982 struct ieee80211_ht_capabilities *htcaps,
2983 struct ieee80211_ht_capabilities *htcaps_mask,
2986 wpa_msg(wpa_s, MSG_DEBUG, "set_ampdu_density: %d", density);
2991 if (density < 0 || density > 7) {
2992 wpa_msg(wpa_s, MSG_ERROR,
2993 "ampdu_density: %d out of range. Must be 0-7 or -1.",
2998 htcaps_mask->a_mpdu_params |= 0x1C;
2999 htcaps->a_mpdu_params &= ~(0x1C);
3000 htcaps->a_mpdu_params |= (density << 2) & 0x1C;
3006 static int wpa_set_disable_ht40(struct wpa_supplicant *wpa_s,
3007 struct ieee80211_ht_capabilities *htcaps,
3008 struct ieee80211_ht_capabilities *htcaps_mask,
3011 /* Masking these out disables HT40 */
3012 le16 msk = host_to_le16(HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET |
3013 HT_CAP_INFO_SHORT_GI40MHZ);
3015 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_ht40: %d", disabled);
3018 htcaps->ht_capabilities_info &= ~msk;
3020 htcaps->ht_capabilities_info |= msk;
3022 htcaps_mask->ht_capabilities_info |= msk;
3028 static int wpa_set_disable_sgi(struct wpa_supplicant *wpa_s,
3029 struct ieee80211_ht_capabilities *htcaps,
3030 struct ieee80211_ht_capabilities *htcaps_mask,
3033 /* Masking these out disables SGI */
3034 le16 msk = host_to_le16(HT_CAP_INFO_SHORT_GI20MHZ |
3035 HT_CAP_INFO_SHORT_GI40MHZ);
3037 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_sgi: %d", disabled);
3040 htcaps->ht_capabilities_info &= ~msk;
3042 htcaps->ht_capabilities_info |= msk;
3044 htcaps_mask->ht_capabilities_info |= msk;
3050 static int wpa_set_disable_ldpc(struct wpa_supplicant *wpa_s,
3051 struct ieee80211_ht_capabilities *htcaps,
3052 struct ieee80211_ht_capabilities *htcaps_mask,
3055 /* Masking these out disables LDPC */
3056 le16 msk = host_to_le16(HT_CAP_INFO_LDPC_CODING_CAP);
3058 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_ldpc: %d", disabled);
3061 htcaps->ht_capabilities_info &= ~msk;
3063 htcaps->ht_capabilities_info |= msk;
3065 htcaps_mask->ht_capabilities_info |= msk;
3071 void wpa_supplicant_apply_ht_overrides(
3072 struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
3073 struct wpa_driver_associate_params *params)
3075 struct ieee80211_ht_capabilities *htcaps;
3076 struct ieee80211_ht_capabilities *htcaps_mask;
3081 params->disable_ht = ssid->disable_ht;
3082 if (!params->htcaps || !params->htcaps_mask)
3085 htcaps = (struct ieee80211_ht_capabilities *) params->htcaps;
3086 htcaps_mask = (struct ieee80211_ht_capabilities *) params->htcaps_mask;
3087 wpa_set_htcap_mcs(wpa_s, htcaps, htcaps_mask, ssid->ht_mcs);
3088 wpa_disable_max_amsdu(wpa_s, htcaps, htcaps_mask,
3089 ssid->disable_max_amsdu);
3090 wpa_set_ampdu_factor(wpa_s, htcaps, htcaps_mask, ssid->ampdu_factor);
3091 wpa_set_ampdu_density(wpa_s, htcaps, htcaps_mask, ssid->ampdu_density);
3092 wpa_set_disable_ht40(wpa_s, htcaps, htcaps_mask, ssid->disable_ht40);
3093 wpa_set_disable_sgi(wpa_s, htcaps, htcaps_mask, ssid->disable_sgi);
3094 wpa_set_disable_ldpc(wpa_s, htcaps, htcaps_mask, ssid->disable_ldpc);
3096 if (ssid->ht40_intolerant) {
3097 le16 bit = host_to_le16(HT_CAP_INFO_40MHZ_INTOLERANT);
3098 htcaps->ht_capabilities_info |= bit;
3099 htcaps_mask->ht_capabilities_info |= bit;
3103 #endif /* CONFIG_HT_OVERRIDES */
3106 #ifdef CONFIG_VHT_OVERRIDES
3107 void wpa_supplicant_apply_vht_overrides(
3108 struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
3109 struct wpa_driver_associate_params *params)
3111 struct ieee80211_vht_capabilities *vhtcaps;
3112 struct ieee80211_vht_capabilities *vhtcaps_mask;
3113 #ifdef CONFIG_HT_OVERRIDES
3115 const u32 max_ampdu_mask = VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX;
3116 #endif /* CONFIG_HT_OVERRIDES */
3121 params->disable_vht = ssid->disable_vht;
3123 vhtcaps = (void *) params->vhtcaps;
3124 vhtcaps_mask = (void *) params->vhtcaps_mask;
3126 if (!vhtcaps || !vhtcaps_mask)
3129 vhtcaps->vht_capabilities_info = ssid->vht_capa;
3130 vhtcaps_mask->vht_capabilities_info = ssid->vht_capa_mask;
3132 #ifdef CONFIG_HT_OVERRIDES
3133 /* if max ampdu is <= 3, we have to make the HT cap the same */
3134 if (ssid->vht_capa_mask & max_ampdu_mask) {
3135 max_ampdu = (ssid->vht_capa & max_ampdu_mask) >>
3136 find_first_bit(max_ampdu_mask);
3138 max_ampdu = max_ampdu < 3 ? max_ampdu : 3;
3139 wpa_set_ampdu_factor(wpa_s,
3140 (void *) params->htcaps,
3141 (void *) params->htcaps_mask,
3144 #endif /* CONFIG_HT_OVERRIDES */
3146 #define OVERRIDE_MCS(i) \
3147 if (ssid->vht_tx_mcs_nss_ ##i >= 0) { \
3148 vhtcaps_mask->vht_supported_mcs_set.tx_map |= \
3150 vhtcaps->vht_supported_mcs_set.tx_map |= \
3151 ssid->vht_tx_mcs_nss_ ##i << 2 * (i - 1); \
3153 if (ssid->vht_rx_mcs_nss_ ##i >= 0) { \
3154 vhtcaps_mask->vht_supported_mcs_set.rx_map |= \
3156 vhtcaps->vht_supported_mcs_set.rx_map |= \
3157 ssid->vht_rx_mcs_nss_ ##i << 2 * (i - 1); \
3169 #endif /* CONFIG_VHT_OVERRIDES */
3172 static int pcsc_reader_init(struct wpa_supplicant *wpa_s)
3177 if (!wpa_s->conf->pcsc_reader)
3180 wpa_s->scard = scard_init(wpa_s->conf->pcsc_reader);
3184 if (wpa_s->conf->pcsc_pin &&
3185 scard_set_pin(wpa_s->scard, wpa_s->conf->pcsc_pin) < 0) {
3186 scard_deinit(wpa_s->scard);
3187 wpa_s->scard = NULL;
3188 wpa_msg(wpa_s, MSG_ERROR, "PC/SC PIN validation failed");
3192 len = sizeof(wpa_s->imsi) - 1;
3193 if (scard_get_imsi(wpa_s->scard, wpa_s->imsi, &len)) {
3194 scard_deinit(wpa_s->scard);
3195 wpa_s->scard = NULL;
3196 wpa_msg(wpa_s, MSG_ERROR, "Could not read IMSI");
3199 wpa_s->imsi[len] = '\0';
3201 wpa_s->mnc_len = scard_get_mnc_len(wpa_s->scard);
3203 wpa_printf(MSG_DEBUG, "SCARD: IMSI %s (MNC length %d)",
3204 wpa_s->imsi, wpa_s->mnc_len);
3206 wpa_sm_set_scard_ctx(wpa_s->wpa, wpa_s->scard);
3207 eapol_sm_register_scard_ctx(wpa_s->eapol, wpa_s->scard);
3208 #endif /* PCSC_FUNCS */
3214 int wpas_init_ext_pw(struct wpa_supplicant *wpa_s)
3218 ext_password_deinit(wpa_s->ext_pw);
3219 wpa_s->ext_pw = NULL;
3220 eapol_sm_set_ext_pw_ctx(wpa_s->eapol, NULL);
3222 if (!wpa_s->conf->ext_password_backend)
3225 val = os_strdup(wpa_s->conf->ext_password_backend);
3228 pos = os_strchr(val, ':');
3232 wpa_printf(MSG_DEBUG, "EXT PW: Initialize backend '%s'", val);
3234 wpa_s->ext_pw = ext_password_init(val, pos);
3236 if (wpa_s->ext_pw == NULL) {
3237 wpa_printf(MSG_DEBUG, "EXT PW: Failed to initialize backend");
3240 eapol_sm_set_ext_pw_ctx(wpa_s->eapol, wpa_s->ext_pw);
3246 static int wpas_check_wowlan_trigger(const char *start, const char *trigger,
3247 int capa_trigger, u8 *param_trigger)
3249 if (os_strcmp(start, trigger) != 0)
3259 static int wpas_set_wowlan_triggers(struct wpa_supplicant *wpa_s,
3260 struct wpa_driver_capa *capa)
3262 struct wowlan_triggers triggers;
3263 char *start, *end, *buf;
3266 if (!wpa_s->conf->wowlan_triggers)
3269 buf = os_strdup(wpa_s->conf->wowlan_triggers);
3273 os_memset(&triggers, 0, sizeof(triggers));
3275 #define CHECK_TRIGGER(trigger) \
3276 wpas_check_wowlan_trigger(start, #trigger, \
3277 capa->wowlan_triggers.trigger, \
3281 while (*start != '\0') {
3282 while (isblank(*start))
3287 while (!isblank(*end) && *end != '\0')
3289 last = *end == '\0';
3292 if (!CHECK_TRIGGER(any) &&
3293 !CHECK_TRIGGER(disconnect) &&
3294 !CHECK_TRIGGER(magic_pkt) &&
3295 !CHECK_TRIGGER(gtk_rekey_failure) &&
3296 !CHECK_TRIGGER(eap_identity_req) &&
3297 !CHECK_TRIGGER(four_way_handshake) &&
3298 !CHECK_TRIGGER(rfkill_release)) {
3299 wpa_printf(MSG_DEBUG,
3300 "Unknown/unsupported wowlan trigger '%s'",
3310 #undef CHECK_TRIGGER
3312 ret = wpa_drv_wowlan(wpa_s, &triggers);
3319 static struct wpa_radio * radio_add_interface(struct wpa_supplicant *wpa_s,
3322 struct wpa_supplicant *iface = wpa_s->global->ifaces;
3323 struct wpa_radio *radio;
3325 while (rn && iface) {
3326 radio = iface->radio;
3327 if (radio && os_strcmp(rn, radio->name) == 0) {
3328 wpa_printf(MSG_DEBUG, "Add interface %s to existing radio %s",
3330 dl_list_add(&radio->ifaces, &wpa_s->radio_list);
3334 iface = iface->next;
3337 wpa_printf(MSG_DEBUG, "Add interface %s to a new radio %s",
3338 wpa_s->ifname, rn ? rn : "N/A");
3339 radio = os_zalloc(sizeof(*radio));
3344 os_strlcpy(radio->name, rn, sizeof(radio->name));
3345 dl_list_init(&radio->ifaces);
3346 dl_list_init(&radio->work);
3347 dl_list_add(&radio->ifaces, &wpa_s->radio_list);
3353 static void radio_work_free(struct wpa_radio_work *work)
3355 if (work->wpa_s->scan_work == work) {
3356 /* This should not really happen. */
3357 wpa_dbg(work->wpa_s, MSG_INFO, "Freeing radio work '%s'@%p (started=%d) that is marked as scan_work",
3358 work->type, work, work->started);
3359 work->wpa_s->scan_work = NULL;
3363 if (work->wpa_s->p2p_scan_work == work) {
3364 /* This should not really happen. */
3365 wpa_dbg(work->wpa_s, MSG_INFO, "Freeing radio work '%s'@%p (started=%d) that is marked as p2p_scan_work",
3366 work->type, work, work->started);
3367 work->wpa_s->p2p_scan_work = NULL;
3369 #endif /* CONFIG_P2P */
3371 dl_list_del(&work->list);
3376 static void radio_start_next_work(void *eloop_ctx, void *timeout_ctx)
3378 struct wpa_radio *radio = eloop_ctx;
3379 struct wpa_radio_work *work;
3380 struct os_reltime now, diff;
3381 struct wpa_supplicant *wpa_s;
3383 work = dl_list_first(&radio->work, struct wpa_radio_work, list);
3388 return; /* already started and still in progress */
3390 wpa_s = dl_list_first(&radio->ifaces, struct wpa_supplicant,
3392 if (wpa_s && wpa_s->external_scan_running) {
3393 wpa_printf(MSG_DEBUG, "Delay radio work start until externally triggered scan completes");
3397 os_get_reltime(&now);
3398 os_reltime_sub(&now, &work->time, &diff);
3399 wpa_dbg(work->wpa_s, MSG_DEBUG, "Starting radio work '%s'@%p after %ld.%06ld second wait",
3400 work->type, work, diff.sec, diff.usec);
3408 * This function removes both started and pending radio works running on
3409 * the provided interface's radio.
3410 * Prior to the removal of the radio work, its callback (cb) is called with
3411 * deinit set to be 1. Each work's callback is responsible for clearing its
3412 * internal data and restoring to a correct state.
3413 * @wpa_s: wpa_supplicant data
3414 * @type: type of works to be removed
3415 * @remove_all: 1 to remove all the works on this radio, 0 to remove only
3416 * this interface's works.
3418 void radio_remove_works(struct wpa_supplicant *wpa_s,
3419 const char *type, int remove_all)
3421 struct wpa_radio_work *work, *tmp;
3422 struct wpa_radio *radio = wpa_s->radio;
3424 dl_list_for_each_safe(work, tmp, &radio->work, struct wpa_radio_work,
3426 if (type && os_strcmp(type, work->type) != 0)
3429 /* skip other ifaces' works */
3430 if (!remove_all && work->wpa_s != wpa_s)
3433 wpa_dbg(wpa_s, MSG_DEBUG, "Remove radio work '%s'@%p%s",
3434 work->type, work, work->started ? " (started)" : "");
3436 radio_work_free(work);
3439 /* in case we removed the started work */
3440 radio_work_check_next(wpa_s);
3444 static void radio_remove_interface(struct wpa_supplicant *wpa_s)
3446 struct wpa_radio *radio = wpa_s->radio;
3451 wpa_printf(MSG_DEBUG, "Remove interface %s from radio %s",
3452 wpa_s->ifname, radio->name);
3453 dl_list_del(&wpa_s->radio_list);
3454 radio_remove_works(wpa_s, NULL, 0);
3455 wpa_s->radio = NULL;
3456 if (!dl_list_empty(&radio->ifaces))
3457 return; /* Interfaces remain for this radio */
3459 wpa_printf(MSG_DEBUG, "Remove radio %s", radio->name);
3460 eloop_cancel_timeout(radio_start_next_work, radio, NULL);
3465 void radio_work_check_next(struct wpa_supplicant *wpa_s)
3467 struct wpa_radio *radio = wpa_s->radio;
3469 if (dl_list_empty(&radio->work))
3471 eloop_cancel_timeout(radio_start_next_work, radio, NULL);
3472 eloop_register_timeout(0, 0, radio_start_next_work, radio, NULL);
3477 * radio_add_work - Add a radio work item
3478 * @wpa_s: Pointer to wpa_supplicant data
3479 * @freq: Frequency of the offchannel operation in MHz or 0
3480 * @type: Unique identifier for each type of work
3481 * @next: Force as the next work to be executed
3482 * @cb: Callback function for indicating when radio is available
3483 * @ctx: Context pointer for the work (work->ctx in cb())
3484 * Returns: 0 on success, -1 on failure
3486 * This function is used to request time for an operation that requires
3487 * exclusive radio control. Once the radio is available, the registered callback
3488 * function will be called. radio_work_done() must be called once the exclusive
3489 * radio operation has been completed, so that the radio is freed for other
3490 * operations. The special case of deinit=1 is used to free the context data
3491 * during interface removal. That does not allow the callback function to start
3492 * the radio operation, i.e., it must free any resources allocated for the radio
3495 * The @freq parameter can be used to indicate a single channel on which the
3496 * offchannel operation will occur. This may allow multiple radio work
3497 * operations to be performed in parallel if they apply for the same channel.
3498 * Setting this to 0 indicates that the work item may use multiple channels or
3499 * requires exclusive control of the radio.
3501 int radio_add_work(struct wpa_supplicant *wpa_s, unsigned int freq,
3502 const char *type, int next,
3503 void (*cb)(struct wpa_radio_work *work, int deinit),
3506 struct wpa_radio_work *work;
3509 work = os_zalloc(sizeof(*work));
3512 wpa_dbg(wpa_s, MSG_DEBUG, "Add radio work '%s'@%p", type, work);
3513 os_get_reltime(&work->time);
3516 work->wpa_s = wpa_s;
3520 was_empty = dl_list_empty(&wpa_s->radio->work);
3522 dl_list_add(&wpa_s->radio->work, &work->list);
3524 dl_list_add_tail(&wpa_s->radio->work, &work->list);
3526 wpa_dbg(wpa_s, MSG_DEBUG, "First radio work item in the queue - schedule start immediately");
3527 radio_work_check_next(wpa_s);
3535 * radio_work_done - Indicate that a radio work item has been completed
3536 * @work: Completed work
3538 * This function is called once the callback function registered with
3539 * radio_add_work() has completed its work.
3541 void radio_work_done(struct wpa_radio_work *work)
3543 struct wpa_supplicant *wpa_s = work->wpa_s;
3544 struct os_reltime now, diff;
3545 unsigned int started = work->started;
3547 os_get_reltime(&now);
3548 os_reltime_sub(&now, &work->time, &diff);
3549 wpa_dbg(wpa_s, MSG_DEBUG, "Radio work '%s'@%p %s in %ld.%06ld seconds",
3550 work->type, work, started ? "done" : "canceled",
3551 diff.sec, diff.usec);
3552 radio_work_free(work);
3554 radio_work_check_next(wpa_s);
3558 int radio_work_pending(struct wpa_supplicant *wpa_s, const char *type)
3560 struct wpa_radio_work *work;
3561 struct wpa_radio *radio = wpa_s->radio;
3563 dl_list_for_each(work, &radio->work, struct wpa_radio_work, list) {
3564 if (work->wpa_s == wpa_s && os_strcmp(work->type, type) == 0)
3572 static int wpas_init_driver(struct wpa_supplicant *wpa_s,
3573 struct wpa_interface *iface)
3575 const char *ifname, *driver, *rn;
3577 driver = iface->driver;
3579 if (wpa_supplicant_set_driver(wpa_s, driver) < 0)
3582 wpa_s->drv_priv = wpa_drv_init(wpa_s, wpa_s->ifname);
3583 if (wpa_s->drv_priv == NULL) {
3585 pos = driver ? os_strchr(driver, ',') : NULL;
3587 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize "
3588 "driver interface - try next driver wrapper");
3592 wpa_msg(wpa_s, MSG_ERROR, "Failed to initialize driver "
3596 if (wpa_drv_set_param(wpa_s, wpa_s->conf->driver_param) < 0) {
3597 wpa_msg(wpa_s, MSG_ERROR, "Driver interface rejected "
3598 "driver_param '%s'", wpa_s->conf->driver_param);
3602 ifname = wpa_drv_get_ifname(wpa_s);
3603 if (ifname && os_strcmp(ifname, wpa_s->ifname) != 0) {
3604 wpa_dbg(wpa_s, MSG_DEBUG, "Driver interface replaced "
3605 "interface name with '%s'", ifname);
3606 os_strlcpy(wpa_s->ifname, ifname, sizeof(wpa_s->ifname));
3609 rn = wpa_driver_get_radio_name(wpa_s);
3610 if (rn && rn[0] == '\0')
3613 wpa_s->radio = radio_add_interface(wpa_s, rn);
3614 if (wpa_s->radio == NULL)
3621 static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
3622 struct wpa_interface *iface)
3624 struct wpa_driver_capa capa;
3626 wpa_printf(MSG_DEBUG, "Initializing interface '%s' conf '%s' driver "
3627 "'%s' ctrl_interface '%s' bridge '%s'", iface->ifname,
3628 iface->confname ? iface->confname : "N/A",
3629 iface->driver ? iface->driver : "default",
3630 iface->ctrl_interface ? iface->ctrl_interface : "N/A",
3631 iface->bridge_ifname ? iface->bridge_ifname : "N/A");
3633 if (iface->confname) {
3634 #ifdef CONFIG_BACKEND_FILE
3635 wpa_s->confname = os_rel2abs_path(iface->confname);
3636 if (wpa_s->confname == NULL) {
3637 wpa_printf(MSG_ERROR, "Failed to get absolute path "
3638 "for configuration file '%s'.",
3642 wpa_printf(MSG_DEBUG, "Configuration file '%s' -> '%s'",
3643 iface->confname, wpa_s->confname);
3644 #else /* CONFIG_BACKEND_FILE */
3645 wpa_s->confname = os_strdup(iface->confname);
3646 #endif /* CONFIG_BACKEND_FILE */
3647 wpa_s->conf = wpa_config_read(wpa_s->confname, NULL);
3648 if (wpa_s->conf == NULL) {
3649 wpa_printf(MSG_ERROR, "Failed to read or parse "
3650 "configuration '%s'.", wpa_s->confname);
3653 wpa_s->confanother = os_rel2abs_path(iface->confanother);
3654 wpa_config_read(wpa_s->confanother, wpa_s->conf);
3657 wpa_s->conf_p2p_dev = os_rel2abs_path(iface->conf_p2p_dev);
3658 wpa_config_read(wpa_s->conf_p2p_dev, wpa_s->conf);
3659 #endif /* CONFIG_P2P */
3662 * Override ctrl_interface and driver_param if set on command
3665 if (iface->ctrl_interface) {
3666 os_free(wpa_s->conf->ctrl_interface);
3667 wpa_s->conf->ctrl_interface =
3668 os_strdup(iface->ctrl_interface);
3671 if (iface->driver_param) {
3672 os_free(wpa_s->conf->driver_param);
3673 wpa_s->conf->driver_param =
3674 os_strdup(iface->driver_param);
3677 if (iface->p2p_mgmt && !iface->ctrl_interface) {
3678 os_free(wpa_s->conf->ctrl_interface);
3679 wpa_s->conf->ctrl_interface = NULL;
3682 wpa_s->conf = wpa_config_alloc_empty(iface->ctrl_interface,
3683 iface->driver_param);
3685 if (wpa_s->conf == NULL) {
3686 wpa_printf(MSG_ERROR, "\nNo configuration found.");
3690 if (iface->ifname == NULL) {
3691 wpa_printf(MSG_ERROR, "\nInterface name is required.");
3694 if (os_strlen(iface->ifname) >= sizeof(wpa_s->ifname)) {
3695 wpa_printf(MSG_ERROR, "\nToo long interface name '%s'.",
3699 os_strlcpy(wpa_s->ifname, iface->ifname, sizeof(wpa_s->ifname));
3701 if (iface->bridge_ifname) {
3702 if (os_strlen(iface->bridge_ifname) >=
3703 sizeof(wpa_s->bridge_ifname)) {
3704 wpa_printf(MSG_ERROR, "\nToo long bridge interface "
3705 "name '%s'.", iface->bridge_ifname);
3708 os_strlcpy(wpa_s->bridge_ifname, iface->bridge_ifname,
3709 sizeof(wpa_s->bridge_ifname));
3712 /* RSNA Supplicant Key Management - INITIALIZE */
3713 eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
3714 eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
3716 /* Initialize driver interface and register driver event handler before
3717 * L2 receive handler so that association events are processed before
3718 * EAPOL-Key packets if both become available for the same select()
3720 if (wpas_init_driver(wpa_s, iface) < 0)
3723 if (wpa_supplicant_init_wpa(wpa_s) < 0)
3726 wpa_sm_set_ifname(wpa_s->wpa, wpa_s->ifname,
3727 wpa_s->bridge_ifname[0] ? wpa_s->bridge_ifname :
3729 wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
3731 if (wpa_s->conf->dot11RSNAConfigPMKLifetime &&
3732 wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_LIFETIME,
3733 wpa_s->conf->dot11RSNAConfigPMKLifetime)) {
3734 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
3735 "dot11RSNAConfigPMKLifetime");
3739 if (wpa_s->conf->dot11RSNAConfigPMKReauthThreshold &&
3740 wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_REAUTH_THRESHOLD,
3741 wpa_s->conf->dot11RSNAConfigPMKReauthThreshold)) {
3742 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
3743 "dot11RSNAConfigPMKReauthThreshold");
3747 if (wpa_s->conf->dot11RSNAConfigSATimeout &&
3748 wpa_sm_set_param(wpa_s->wpa, RSNA_SA_TIMEOUT,
3749 wpa_s->conf->dot11RSNAConfigSATimeout)) {
3750 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
3751 "dot11RSNAConfigSATimeout");
3755 wpa_s->hw.modes = wpa_drv_get_hw_feature_data(wpa_s,
3756 &wpa_s->hw.num_modes,
3759 if (wpa_drv_get_capa(wpa_s, &capa) == 0) {
3760 wpa_s->drv_capa_known = 1;
3761 wpa_s->drv_flags = capa.flags;
3762 wpa_s->drv_enc = capa.enc;
3763 wpa_s->probe_resp_offloads = capa.probe_resp_offloads;
3764 wpa_s->max_scan_ssids = capa.max_scan_ssids;
3765 wpa_s->max_sched_scan_ssids = capa.max_sched_scan_ssids;
3766 wpa_s->sched_scan_supported = capa.sched_scan_supported;
3767 wpa_s->max_match_sets = capa.max_match_sets;
3768 wpa_s->max_remain_on_chan = capa.max_remain_on_chan;
3769 wpa_s->max_stations = capa.max_stations;
3770 wpa_s->extended_capa = capa.extended_capa;
3771 wpa_s->extended_capa_mask = capa.extended_capa_mask;
3772 wpa_s->extended_capa_len = capa.extended_capa_len;
3773 wpa_s->num_multichan_concurrent =
3774 capa.num_multichan_concurrent;
3776 if (wpa_s->max_remain_on_chan == 0)
3777 wpa_s->max_remain_on_chan = 1000;
3780 * Only take p2p_mgmt parameters when P2P Device is supported.
3781 * Doing it here as it determines whether l2_packet_init() will be done
3782 * during wpa_supplicant_driver_init().
3784 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)
3785 wpa_s->p2p_mgmt = iface->p2p_mgmt;
3787 iface->p2p_mgmt = 1;
3789 if (wpa_s->num_multichan_concurrent == 0)
3790 wpa_s->num_multichan_concurrent = 1;
3792 if (wpa_supplicant_driver_init(wpa_s) < 0)
3796 if ((!iface->p2p_mgmt ||
3797 !(wpa_s->drv_flags &
3798 WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)) &&
3799 wpa_tdls_init(wpa_s->wpa))
3801 #endif /* CONFIG_TDLS */
3803 if (wpa_s->conf->country[0] && wpa_s->conf->country[1] &&
3804 wpa_drv_set_country(wpa_s, wpa_s->conf->country)) {
3805 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to set country");
3809 if (wpas_wps_init(wpa_s))
3812 if (wpa_supplicant_init_eapol(wpa_s) < 0)
3814 wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
3816 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
3817 if (wpa_s->ctrl_iface == NULL) {
3818 wpa_printf(MSG_ERROR,
3819 "Failed to initialize control interface '%s'.\n"
3820 "You may have another wpa_supplicant process "
3821 "already running or the file was\n"
3822 "left by an unclean termination of wpa_supplicant "
3823 "in which case you will need\n"
3824 "to manually remove this file before starting "
3825 "wpa_supplicant again.\n",
3826 wpa_s->conf->ctrl_interface);
3830 wpa_s->gas = gas_query_init(wpa_s);
3831 if (wpa_s->gas == NULL) {
3832 wpa_printf(MSG_ERROR, "Failed to initialize GAS query");
3836 if (iface->p2p_mgmt && wpas_p2p_init(wpa_s->global, wpa_s) < 0) {
3837 wpa_msg(wpa_s, MSG_ERROR, "Failed to init P2P");
3841 if (wpa_bss_init(wpa_s) < 0)
3845 * Set Wake-on-WLAN triggers, if configured.
3846 * Note: We don't restore/remove the triggers on shutdown (it doesn't
3847 * have effect anyway when the interface is down).
3849 if (wpas_set_wowlan_triggers(wpa_s, &capa) < 0)
3852 #ifdef CONFIG_EAP_PROXY
3855 wpa_s->mnc_len = eapol_sm_get_eap_proxy_imsi(wpa_s->eapol, wpa_s->imsi,
3857 if (wpa_s->mnc_len > 0) {
3858 wpa_s->imsi[len] = '\0';
3859 wpa_printf(MSG_DEBUG, "eap_proxy: IMSI %s (MNC length %d)",
3860 wpa_s->imsi, wpa_s->mnc_len);
3862 wpa_printf(MSG_DEBUG, "eap_proxy: IMSI not available");
3865 #endif /* CONFIG_EAP_PROXY */
3867 if (pcsc_reader_init(wpa_s) < 0)
3870 if (wpas_init_ext_pw(wpa_s) < 0)
3877 static void wpa_supplicant_deinit_iface(struct wpa_supplicant *wpa_s,
3878 int notify, int terminate)
3880 wpa_s->disconnected = 1;
3881 if (wpa_s->drv_priv) {
3882 wpa_supplicant_deauthenticate(wpa_s,
3883 WLAN_REASON_DEAUTH_LEAVING);
3885 wpa_drv_set_countermeasures(wpa_s, 0);
3886 wpa_clear_keys(wpa_s, NULL);
3889 wpa_supplicant_cleanup(wpa_s);
3890 wpas_p2p_deinit_iface(wpa_s);
3892 wpas_ctrl_radio_work_flush(wpa_s);
3893 radio_remove_interface(wpa_s);
3895 if (wpa_s->drv_priv)
3896 wpa_drv_deinit(wpa_s);
3899 wpas_notify_iface_removed(wpa_s);
3902 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TERMINATING);
3904 if (wpa_s->ctrl_iface) {
3905 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
3906 wpa_s->ctrl_iface = NULL;
3909 if (wpa_s->conf != NULL) {
3910 wpa_config_free(wpa_s->conf);
3919 * wpa_supplicant_add_iface - Add a new network interface
3920 * @global: Pointer to global data from wpa_supplicant_init()
3921 * @iface: Interface configuration options
3922 * Returns: Pointer to the created interface or %NULL on failure
3924 * This function is used to add new network interfaces for %wpa_supplicant.
3925 * This can be called before wpa_supplicant_run() to add interfaces before the
3926 * main event loop has been started. In addition, new interfaces can be added
3927 * dynamically while %wpa_supplicant is already running. This could happen,
3928 * e.g., when a hotplug network adapter is inserted.
3930 struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
3931 struct wpa_interface *iface)
3933 struct wpa_supplicant *wpa_s;
3934 struct wpa_interface t_iface;
3935 struct wpa_ssid *ssid;
3937 if (global == NULL || iface == NULL)
3940 wpa_s = wpa_supplicant_alloc();
3944 wpa_s->global = global;
3947 if (global->params.override_driver) {
3948 wpa_printf(MSG_DEBUG, "Override interface parameter: driver "
3950 iface->driver, global->params.override_driver);
3951 t_iface.driver = global->params.override_driver;
3953 if (global->params.override_ctrl_interface) {
3954 wpa_printf(MSG_DEBUG, "Override interface parameter: "
3955 "ctrl_interface ('%s' -> '%s')",
3956 iface->ctrl_interface,
3957 global->params.override_ctrl_interface);
3958 t_iface.ctrl_interface =
3959 global->params.override_ctrl_interface;
3961 if (wpa_supplicant_init_iface(wpa_s, &t_iface)) {
3962 wpa_printf(MSG_DEBUG, "Failed to add interface %s",
3964 wpa_supplicant_deinit_iface(wpa_s, 0, 0);
3968 /* Notify the control interfaces about new iface */
3969 if (wpas_notify_iface_added(wpa_s)) {
3970 wpa_supplicant_deinit_iface(wpa_s, 1, 0);
3974 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
3975 wpas_notify_network_added(wpa_s, ssid);
3977 wpa_s->next = global->ifaces;
3978 global->ifaces = wpa_s;
3980 wpa_dbg(wpa_s, MSG_DEBUG, "Added interface %s", wpa_s->ifname);
3981 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
3988 * wpa_supplicant_remove_iface - Remove a network interface
3989 * @global: Pointer to global data from wpa_supplicant_init()
3990 * @wpa_s: Pointer to the network interface to be removed
3991 * Returns: 0 if interface was removed, -1 if interface was not found
3993 * This function can be used to dynamically remove network interfaces from
3994 * %wpa_supplicant, e.g., when a hotplug network adapter is ejected. In
3995 * addition, this function is used to remove all remaining interfaces when
3996 * %wpa_supplicant is terminated.
3998 int wpa_supplicant_remove_iface(struct wpa_global *global,
3999 struct wpa_supplicant *wpa_s,
4002 struct wpa_supplicant *prev;
4004 /* Remove interface from the global list of interfaces */
4005 prev = global->ifaces;
4006 if (prev == wpa_s) {
4007 global->ifaces = wpa_s->next;
4009 while (prev && prev->next != wpa_s)
4013 prev->next = wpa_s->next;
4016 wpa_dbg(wpa_s, MSG_DEBUG, "Removing interface %s", wpa_s->ifname);
4018 if (global->p2p_group_formation == wpa_s)
4019 global->p2p_group_formation = NULL;
4020 if (global->p2p_invite_group == wpa_s)
4021 global->p2p_invite_group = NULL;
4022 wpa_supplicant_deinit_iface(wpa_s, 1, terminate);
4029 * wpa_supplicant_get_eap_mode - Get the current EAP mode
4030 * @wpa_s: Pointer to the network interface
4031 * Returns: Pointer to the eap mode or the string "UNKNOWN" if not found
4033 const char * wpa_supplicant_get_eap_mode(struct wpa_supplicant *wpa_s)
4035 const char *eapol_method;
4037 if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) == 0 &&
4038 wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
4042 eapol_method = eapol_sm_get_method_name(wpa_s->eapol);
4043 if (eapol_method == NULL)
4044 return "UNKNOWN-EAP";
4046 return eapol_method;
4051 * wpa_supplicant_get_iface - Get a new network interface
4052 * @global: Pointer to global data from wpa_supplicant_init()
4053 * @ifname: Interface name
4054 * Returns: Pointer to the interface or %NULL if not found
4056 struct wpa_supplicant * wpa_supplicant_get_iface(struct wpa_global *global,
4059 struct wpa_supplicant *wpa_s;
4061 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
4062 if (os_strcmp(wpa_s->ifname, ifname) == 0)
4069 #ifndef CONFIG_NO_WPA_MSG
4070 static const char * wpa_supplicant_msg_ifname_cb(void *ctx)
4072 struct wpa_supplicant *wpa_s = ctx;
4075 return wpa_s->ifname;
4077 #endif /* CONFIG_NO_WPA_MSG */
4081 * wpa_supplicant_init - Initialize %wpa_supplicant
4082 * @params: Parameters for %wpa_supplicant
4083 * Returns: Pointer to global %wpa_supplicant data, or %NULL on failure
4085 * This function is used to initialize %wpa_supplicant. After successful
4086 * initialization, the returned data pointer can be used to add and remove
4087 * network interfaces, and eventually, to deinitialize %wpa_supplicant.
4089 struct wpa_global * wpa_supplicant_init(struct wpa_params *params)
4091 struct wpa_global *global;
4097 #ifdef CONFIG_DRIVER_NDIS
4099 void driver_ndis_init_ops(void);
4100 driver_ndis_init_ops();
4102 #endif /* CONFIG_DRIVER_NDIS */
4104 #ifndef CONFIG_NO_WPA_MSG
4105 wpa_msg_register_ifname_cb(wpa_supplicant_msg_ifname_cb);
4106 #endif /* CONFIG_NO_WPA_MSG */
4108 wpa_debug_open_file(params->wpa_debug_file_path);
4109 if (params->wpa_debug_syslog)
4110 wpa_debug_open_syslog();
4111 if (params->wpa_debug_tracing) {
4112 ret = wpa_debug_open_linux_tracing();
4114 wpa_printf(MSG_ERROR,
4115 "Failed to enable trace logging");
4120 ret = eap_register_methods();
4122 wpa_printf(MSG_ERROR, "Failed to register EAP methods");
4124 wpa_printf(MSG_ERROR, "Two or more EAP methods used "
4125 "the same EAP type.");
4129 global = os_zalloc(sizeof(*global));
4132 dl_list_init(&global->p2p_srv_bonjour);
4133 dl_list_init(&global->p2p_srv_upnp);
4134 global->params.daemonize = params->daemonize;
4135 global->params.wait_for_monitor = params->wait_for_monitor;
4136 global->params.dbus_ctrl_interface = params->dbus_ctrl_interface;
4137 if (params->pid_file)
4138 global->params.pid_file = os_strdup(params->pid_file);
4139 if (params->ctrl_interface)
4140 global->params.ctrl_interface =
4141 os_strdup(params->ctrl_interface);
4142 if (params->ctrl_interface_group)
4143 global->params.ctrl_interface_group =
4144 os_strdup(params->ctrl_interface_group);
4145 if (params->override_driver)
4146 global->params.override_driver =
4147 os_strdup(params->override_driver);
4148 if (params->override_ctrl_interface)
4149 global->params.override_ctrl_interface =
4150 os_strdup(params->override_ctrl_interface);
4151 wpa_debug_level = global->params.wpa_debug_level =
4152 params->wpa_debug_level;
4153 wpa_debug_show_keys = global->params.wpa_debug_show_keys =
4154 params->wpa_debug_show_keys;
4155 wpa_debug_timestamp = global->params.wpa_debug_timestamp =
4156 params->wpa_debug_timestamp;
4158 wpa_printf(MSG_DEBUG, "wpa_supplicant v" VERSION_STR);
4161 wpa_printf(MSG_ERROR, "Failed to initialize event loop");
4162 wpa_supplicant_deinit(global);
4166 random_init(params->entropy_file);
4168 global->ctrl_iface = wpa_supplicant_global_ctrl_iface_init(global);
4169 if (global->ctrl_iface == NULL) {
4170 wpa_supplicant_deinit(global);
4174 if (wpas_notify_supplicant_initialized(global)) {
4175 wpa_supplicant_deinit(global);
4179 for (i = 0; wpa_drivers[i]; i++)
4180 global->drv_count++;
4181 if (global->drv_count == 0) {
4182 wpa_printf(MSG_ERROR, "No drivers enabled");
4183 wpa_supplicant_deinit(global);
4186 global->drv_priv = os_zalloc(global->drv_count * sizeof(void *));
4187 if (global->drv_priv == NULL) {
4188 wpa_supplicant_deinit(global);
4192 #ifdef CONFIG_WIFI_DISPLAY
4193 if (wifi_display_init(global) < 0) {
4194 wpa_printf(MSG_ERROR, "Failed to initialize Wi-Fi Display");
4195 wpa_supplicant_deinit(global);
4198 #endif /* CONFIG_WIFI_DISPLAY */
4205 * wpa_supplicant_run - Run the %wpa_supplicant main event loop
4206 * @global: Pointer to global data from wpa_supplicant_init()
4207 * Returns: 0 after successful event loop run, -1 on failure
4209 * This function starts the main event loop and continues running as long as
4210 * there are any remaining events. In most cases, this function is running as
4211 * long as the %wpa_supplicant process in still in use.
4213 int wpa_supplicant_run(struct wpa_global *global)
4215 struct wpa_supplicant *wpa_s;
4217 if (global->params.daemonize &&
4218 wpa_supplicant_daemon(global->params.pid_file))
4221 if (global->params.wait_for_monitor) {
4222 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
4223 if (wpa_s->ctrl_iface)
4224 wpa_supplicant_ctrl_iface_wait(
4228 eloop_register_signal_terminate(wpa_supplicant_terminate, global);
4229 eloop_register_signal_reconfig(wpa_supplicant_reconfig, global);
4238 * wpa_supplicant_deinit - Deinitialize %wpa_supplicant
4239 * @global: Pointer to global data from wpa_supplicant_init()
4241 * This function is called to deinitialize %wpa_supplicant and to free all
4242 * allocated resources. Remaining network interfaces will also be removed.
4244 void wpa_supplicant_deinit(struct wpa_global *global)
4251 #ifdef CONFIG_WIFI_DISPLAY
4252 wifi_display_deinit(global);
4253 #endif /* CONFIG_WIFI_DISPLAY */
4255 while (global->ifaces)
4256 wpa_supplicant_remove_iface(global, global->ifaces, 1);
4258 if (global->ctrl_iface)
4259 wpa_supplicant_global_ctrl_iface_deinit(global->ctrl_iface);
4261 wpas_notify_supplicant_deinitialized(global);
4263 eap_peer_unregister_methods();
4265 eap_server_unregister_methods();
4266 #endif /* CONFIG_AP */
4268 for (i = 0; wpa_drivers[i] && global->drv_priv; i++) {
4269 if (!global->drv_priv[i])
4271 wpa_drivers[i]->global_deinit(global->drv_priv[i]);
4273 os_free(global->drv_priv);
4279 if (global->params.pid_file) {
4280 os_daemonize_terminate(global->params.pid_file);
4281 os_free(global->params.pid_file);
4283 os_free(global->params.ctrl_interface);
4284 os_free(global->params.ctrl_interface_group);
4285 os_free(global->params.override_driver);
4286 os_free(global->params.override_ctrl_interface);
4288 os_free(global->p2p_disallow_freq.range);
4289 os_free(global->p2p_go_avoid_freq.range);
4290 os_free(global->add_psk);
4293 wpa_debug_close_syslog();
4294 wpa_debug_close_file();
4295 wpa_debug_close_linux_tracing();
4299 void wpa_supplicant_update_config(struct wpa_supplicant *wpa_s)
4301 if ((wpa_s->conf->changed_parameters & CFG_CHANGED_COUNTRY) &&
4302 wpa_s->conf->country[0] && wpa_s->conf->country[1]) {
4304 country[0] = wpa_s->conf->country[0];
4305 country[1] = wpa_s->conf->country[1];
4307 if (wpa_drv_set_country(wpa_s, country) < 0) {
4308 wpa_printf(MSG_ERROR, "Failed to set country code "
4313 if (wpa_s->conf->changed_parameters & CFG_CHANGED_EXT_PW_BACKEND)
4314 wpas_init_ext_pw(wpa_s);
4317 wpas_wps_update_config(wpa_s);
4318 #endif /* CONFIG_WPS */
4319 wpas_p2p_update_config(wpa_s);
4320 wpa_s->conf->changed_parameters = 0;
4324 static void add_freq(int *freqs, int *num_freqs, int freq)
4328 for (i = 0; i < *num_freqs; i++) {
4329 if (freqs[i] == freq)
4333 freqs[*num_freqs] = freq;
4338 static int * get_bss_freqs_in_ess(struct wpa_supplicant *wpa_s)
4340 struct wpa_bss *bss, *cbss;
4341 const int max_freqs = 10;
4345 freqs = os_zalloc(sizeof(int) * (max_freqs + 1));
4349 cbss = wpa_s->current_bss;
4351 dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
4354 if (bss->ssid_len == cbss->ssid_len &&
4355 os_memcmp(bss->ssid, cbss->ssid, bss->ssid_len) == 0 &&
4356 wpa_blacklist_get(wpa_s, bss->bssid) == NULL) {
4357 add_freq(freqs, &num_freqs, bss->freq);
4358 if (num_freqs == max_freqs)
4363 if (num_freqs == 0) {
4372 void wpas_connection_failed(struct wpa_supplicant *wpa_s, const u8 *bssid)
4378 wpas_connect_work_done(wpa_s);
4381 * Remove possible authentication timeout since the connection failed.
4383 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
4385 if (wpa_s->disconnected) {
4387 * There is no point in blacklisting the AP if this event is
4388 * generated based on local request to disconnect.
4390 wpa_dbg(wpa_s, MSG_DEBUG, "Ignore connection failure "
4391 "indication since interface has been put into "
4392 "disconnected state");
4397 * Add the failed BSSID into the blacklist and speed up next scan
4398 * attempt if there could be other APs that could accept association.
4399 * The current blacklist count indicates how many times we have tried
4400 * connecting to this AP and multiple attempts mean that other APs are
4401 * either not available or has already been tried, so that we can start
4402 * increasing the delay here to avoid constant scanning.
4404 count = wpa_blacklist_add(wpa_s, bssid);
4405 if (count == 1 && wpa_s->current_bss) {
4407 * This BSS was not in the blacklist before. If there is
4408 * another BSS available for the same ESS, we should try that
4409 * next. Otherwise, we may as well try this one once more
4410 * before allowing other, likely worse, ESSes to be considered.
4412 freqs = get_bss_freqs_in_ess(wpa_s);
4414 wpa_dbg(wpa_s, MSG_DEBUG, "Another BSS in this ESS "
4415 "has been seen; try it next");
4416 wpa_blacklist_add(wpa_s, bssid);
4418 * On the next scan, go through only the known channels
4419 * used in this ESS based on previous scans to speed up
4420 * common load balancing use case.
4422 os_free(wpa_s->next_scan_freqs);
4423 wpa_s->next_scan_freqs = freqs;
4428 * Add previous failure count in case the temporary blacklist was
4429 * cleared due to no other BSSes being available.
4431 count += wpa_s->extra_blacklist_count;
4433 if (count > 3 && wpa_s->current_ssid) {
4434 wpa_printf(MSG_DEBUG, "Continuous association failures - "
4435 "consider temporary network disabling");
4436 wpas_auth_failed(wpa_s, "CONN_FAILED");
4457 wpa_dbg(wpa_s, MSG_DEBUG, "Blacklist count %d --> request scan in %d "
4458 "ms", count, timeout);
4461 * TODO: if more than one possible AP is available in scan results,
4462 * could try the other ones before requesting a new scan.
4464 wpa_supplicant_req_scan(wpa_s, timeout / 1000,
4465 1000 * (timeout % 1000));
4469 int wpas_driver_bss_selection(struct wpa_supplicant *wpa_s)
4471 return wpa_s->conf->ap_scan == 2 ||
4472 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_BSS_SELECTION);
4476 #if defined(CONFIG_CTRL_IFACE) || defined(CONFIG_CTRL_IFACE_DBUS_NEW)
4477 int wpa_supplicant_ctrl_iface_ctrl_rsp_handle(struct wpa_supplicant *wpa_s,
4478 struct wpa_ssid *ssid,
4482 #ifdef IEEE8021X_EAPOL
4483 struct eap_peer_config *eap = &ssid->eap;
4485 wpa_printf(MSG_DEBUG, "CTRL_IFACE: response handle field=%s", field);
4486 wpa_hexdump_ascii_key(MSG_DEBUG, "CTRL_IFACE: response value",
4487 (const u8 *) value, os_strlen(value));
4489 switch (wpa_supplicant_ctrl_req_from_string(field)) {
4490 case WPA_CTRL_REQ_EAP_IDENTITY:
4491 os_free(eap->identity);
4492 eap->identity = (u8 *) os_strdup(value);
4493 eap->identity_len = os_strlen(value);
4494 eap->pending_req_identity = 0;
4495 if (ssid == wpa_s->current_ssid)
4496 wpa_s->reassociate = 1;
4498 case WPA_CTRL_REQ_EAP_PASSWORD:
4499 bin_clear_free(eap->password, eap->password_len);
4500 eap->password = (u8 *) os_strdup(value);
4501 eap->password_len = os_strlen(value);
4502 eap->pending_req_password = 0;
4503 if (ssid == wpa_s->current_ssid)
4504 wpa_s->reassociate = 1;
4506 case WPA_CTRL_REQ_EAP_NEW_PASSWORD:
4507 bin_clear_free(eap->new_password, eap->new_password_len);
4508 eap->new_password = (u8 *) os_strdup(value);
4509 eap->new_password_len = os_strlen(value);
4510 eap->pending_req_new_password = 0;
4511 if (ssid == wpa_s->current_ssid)
4512 wpa_s->reassociate = 1;
4514 case WPA_CTRL_REQ_EAP_PIN:
4515 str_clear_free(eap->pin);
4516 eap->pin = os_strdup(value);
4517 eap->pending_req_pin = 0;
4518 if (ssid == wpa_s->current_ssid)
4519 wpa_s->reassociate = 1;
4521 case WPA_CTRL_REQ_EAP_OTP:
4522 bin_clear_free(eap->otp, eap->otp_len);
4523 eap->otp = (u8 *) os_strdup(value);
4524 eap->otp_len = os_strlen(value);
4525 os_free(eap->pending_req_otp);
4526 eap->pending_req_otp = NULL;
4527 eap->pending_req_otp_len = 0;
4529 case WPA_CTRL_REQ_EAP_PASSPHRASE:
4530 str_clear_free(eap->private_key_passwd);
4531 eap->private_key_passwd = os_strdup(value);
4532 eap->pending_req_passphrase = 0;
4533 if (ssid == wpa_s->current_ssid)
4534 wpa_s->reassociate = 1;
4536 case WPA_CTRL_REQ_SIM:
4537 str_clear_free(eap->external_sim_resp);
4538 eap->external_sim_resp = os_strdup(value);
4541 wpa_printf(MSG_DEBUG, "CTRL_IFACE: Unknown field '%s'", field);
4546 #else /* IEEE8021X_EAPOL */
4547 wpa_printf(MSG_DEBUG, "CTRL_IFACE: IEEE 802.1X not included");
4549 #endif /* IEEE8021X_EAPOL */
4551 #endif /* CONFIG_CTRL_IFACE || CONFIG_CTRL_IFACE_DBUS_NEW */
4554 int wpas_network_disabled(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
4557 unsigned int drv_enc;
4565 if (wpa_s && wpa_s->drv_capa_known)
4566 drv_enc = wpa_s->drv_enc;
4568 drv_enc = (unsigned int) -1;
4570 for (i = 0; i < NUM_WEP_KEYS; i++) {
4571 size_t len = ssid->wep_key_len[i];
4574 if (len == 5 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP40))
4576 if (len == 13 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP104))
4578 if (len == 16 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP128))
4580 return 1; /* invalid WEP key */
4583 if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt) && !ssid->psk_set &&
4584 (!ssid->passphrase || ssid->ssid_len != 0) && !ssid->ext_psk)
4591 int wpas_is_p2p_prioritized(struct wpa_supplicant *wpa_s)
4593 if (wpa_s->global->conc_pref == WPA_CONC_PREF_P2P)
4595 if (wpa_s->global->conc_pref == WPA_CONC_PREF_STA)
4601 void wpas_auth_failed(struct wpa_supplicant *wpa_s, char *reason)
4603 struct wpa_ssid *ssid = wpa_s->current_ssid;
4605 struct os_reltime now;
4608 wpa_printf(MSG_DEBUG, "Authentication failure but no known "
4613 if (ssid->key_mgmt == WPA_KEY_MGMT_WPS)
4616 ssid->auth_failures++;
4619 if (ssid->p2p_group &&
4620 (wpa_s->p2p_in_provisioning || wpa_s->show_group_started)) {
4622 * Skip the wait time since there is a short timeout on the
4623 * connection to a P2P group.
4627 #endif /* CONFIG_P2P */
4629 if (ssid->auth_failures > 50)
4631 else if (ssid->auth_failures > 10)
4633 else if (ssid->auth_failures > 5)
4635 else if (ssid->auth_failures > 3)
4637 else if (ssid->auth_failures > 2)
4639 else if (ssid->auth_failures > 1)
4644 if (ssid->auth_failures > 1 &&
4645 wpa_key_mgmt_wpa_ieee8021x(ssid->key_mgmt))
4646 dur += os_random() % (ssid->auth_failures * 10);
4648 os_get_reltime(&now);
4649 if (now.sec + dur <= ssid->disabled_until.sec)
4652 ssid->disabled_until.sec = now.sec + dur;
4654 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TEMP_DISABLED
4655 "id=%d ssid=\"%s\" auth_failures=%u duration=%d reason=%s",
4656 ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
4657 ssid->auth_failures, dur, reason);
4661 void wpas_clear_temp_disabled(struct wpa_supplicant *wpa_s,
4662 struct wpa_ssid *ssid, int clear_failures)
4667 if (ssid->disabled_until.sec) {
4668 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_REENABLED
4669 "id=%d ssid=\"%s\"",
4670 ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
4672 ssid->disabled_until.sec = 0;
4673 ssid->disabled_until.usec = 0;
4675 ssid->auth_failures = 0;
4679 int disallowed_bssid(struct wpa_supplicant *wpa_s, const u8 *bssid)
4683 if (wpa_s->disallow_aps_bssid == NULL)
4686 for (i = 0; i < wpa_s->disallow_aps_bssid_count; i++) {
4687 if (os_memcmp(wpa_s->disallow_aps_bssid + i * ETH_ALEN,
4688 bssid, ETH_ALEN) == 0)
4696 int disallowed_ssid(struct wpa_supplicant *wpa_s, const u8 *ssid,
4701 if (wpa_s->disallow_aps_ssid == NULL || ssid == NULL)
4704 for (i = 0; i < wpa_s->disallow_aps_ssid_count; i++) {
4705 struct wpa_ssid_value *s = &wpa_s->disallow_aps_ssid[i];
4706 if (ssid_len == s->ssid_len &&
4707 os_memcmp(ssid, s->ssid, ssid_len) == 0)
4716 * wpas_request_connection - Request a new connection
4717 * @wpa_s: Pointer to the network interface
4719 * This function is used to request a new connection to be found. It will mark
4720 * the interface to allow reassociation and request a new scan to find a
4721 * suitable network to connect to.
4723 void wpas_request_connection(struct wpa_supplicant *wpa_s)
4725 wpa_s->normal_scans = 0;
4726 wpa_supplicant_reinit_autoscan(wpa_s);
4727 wpa_s->extra_blacklist_count = 0;
4728 wpa_s->disconnected = 0;
4729 wpa_s->reassociate = 1;
4731 if (wpa_supplicant_fast_associate(wpa_s) != 1)
4732 wpa_supplicant_req_scan(wpa_s, 0, 0);
4736 void dump_freq_data(struct wpa_supplicant *wpa_s, const char *title,
4737 struct wpa_used_freq_data *freqs_data,
4742 wpa_dbg(wpa_s, MSG_DEBUG, "Shared frequencies (len=%u): %s",
4744 for (i = 0; i < len; i++) {
4745 struct wpa_used_freq_data *cur = &freqs_data[i];
4746 wpa_dbg(wpa_s, MSG_DEBUG, "freq[%u]: %d, flags=0x%X",
4747 i, cur->freq, cur->flags);
4753 * Find the operating frequencies of any of the virtual interfaces that
4754 * are using the same radio as the current interface, and in addition, get
4755 * information about the interface types that are using the frequency.
4757 int get_shared_radio_freqs_data(struct wpa_supplicant *wpa_s,
4758 struct wpa_used_freq_data *freqs_data,
4761 struct wpa_supplicant *ifs;
4764 unsigned int idx = 0, i;
4766 wpa_dbg(wpa_s, MSG_DEBUG,
4767 "Determining shared radio frequencies (max len %u)", len);
4768 os_memset(freqs_data, 0, sizeof(struct wpa_used_freq_data) * len);
4770 dl_list_for_each(ifs, &wpa_s->radio->ifaces, struct wpa_supplicant,
4775 if (ifs->current_ssid == NULL || ifs->assoc_freq == 0)
4778 if (ifs->current_ssid->mode == WPAS_MODE_AP ||
4779 ifs->current_ssid->mode == WPAS_MODE_P2P_GO)
4780 freq = ifs->current_ssid->frequency;
4781 else if (wpa_drv_get_bssid(ifs, bssid) == 0)
4782 freq = ifs->assoc_freq;
4786 /* Hold only distinct freqs */
4787 for (i = 0; i < idx; i++)
4788 if (freqs_data[i].freq == freq)
4792 freqs_data[idx++].freq = freq;
4794 if (ifs->current_ssid->mode == WPAS_MODE_INFRA) {
4795 freqs_data[i].flags = ifs->current_ssid->p2p_group ?
4796 WPA_FREQ_USED_BY_P2P_CLIENT :
4797 WPA_FREQ_USED_BY_INFRA_STATION;
4801 dump_freq_data(wpa_s, "completed iteration", freqs_data, idx);
4807 * Find the operating frequencies of any of the virtual interfaces that
4808 * are using the same radio as the current interface.
4810 int get_shared_radio_freqs(struct wpa_supplicant *wpa_s,
4811 int *freq_array, unsigned int len)
4813 struct wpa_used_freq_data *freqs_data;
4816 os_memset(freq_array, 0, sizeof(int) * len);
4818 freqs_data = os_calloc(len, sizeof(struct wpa_used_freq_data));
4822 num = get_shared_radio_freqs_data(wpa_s, freqs_data, len);
4823 for (i = 0; i < num; i++)
4824 freq_array[i] = freqs_data[i].freq;
4826 os_free(freqs_data);