3 * Copyright (c) 2003-2016, Jouni Malinen <j@w1.fi>
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
8 * This file implements functions for registering and unregistering
9 * %wpa_supplicant interfaces. In addition, this file contains number of
10 * functions for managing network connections.
16 #include "crypto/random.h"
17 #include "crypto/sha1.h"
18 #include "eapol_supp/eapol_supp_sm.h"
19 #include "eap_peer/eap.h"
20 #include "eap_peer/eap_proxy.h"
21 #include "eap_server/eap_methods.h"
22 #include "rsn_supp/wpa.h"
25 #include "utils/ext_password.h"
26 #include "l2_packet/l2_packet.h"
27 #include "wpa_supplicant_i.h"
29 #include "ctrl_iface.h"
30 #include "pcsc_funcs.h"
31 #include "common/version.h"
32 #include "rsn_supp/preauth.h"
33 #include "rsn_supp/pmksa_cache.h"
34 #include "common/wpa_ctrl.h"
35 #include "common/ieee802_11_defs.h"
36 #include "common/hw_features_common.h"
39 #include "blacklist.h"
40 #include "wpas_glue.h"
41 #include "wps_supplicant.h"
44 #include "gas_query.h"
46 #include "p2p_supplicant.h"
47 #include "wifi_display.h"
53 #include "offchannel.h"
54 #include "hs20_supplicant.h"
59 const char *const wpa_supplicant_version =
60 "wpa_supplicant v" VERSION_STR "\n"
61 "Copyright (c) 2003-2016, Jouni Malinen <j@w1.fi> and contributors";
63 const char *const wpa_supplicant_license =
64 "This software may be distributed under the terms of the BSD license.\n"
65 "See README for more details.\n"
66 #ifdef EAP_TLS_OPENSSL
67 "\nThis product includes software developed by the OpenSSL Project\n"
68 "for use in the OpenSSL Toolkit (http://www.openssl.org/)\n"
69 #endif /* EAP_TLS_OPENSSL */
72 #ifndef CONFIG_NO_STDOUT_DEBUG
73 /* Long text divided into parts in order to fit in C89 strings size limits. */
74 const char *const wpa_supplicant_full_license1 =
76 const char *const wpa_supplicant_full_license2 =
77 "This software may be distributed under the terms of the BSD license.\n"
79 "Redistribution and use in source and binary forms, with or without\n"
80 "modification, are permitted provided that the following conditions are\n"
83 const char *const wpa_supplicant_full_license3 =
84 "1. Redistributions of source code must retain the above copyright\n"
85 " notice, this list of conditions and the following disclaimer.\n"
87 "2. Redistributions in binary form must reproduce the above copyright\n"
88 " notice, this list of conditions and the following disclaimer in the\n"
89 " documentation and/or other materials provided with the distribution.\n"
91 const char *const wpa_supplicant_full_license4 =
92 "3. Neither the name(s) of the above-listed copyright holder(s) nor the\n"
93 " names of its contributors may be used to endorse or promote products\n"
94 " derived from this software without specific prior written permission.\n"
96 "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
97 "\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
98 "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
99 "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n";
100 const char *const wpa_supplicant_full_license5 =
101 "OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
102 "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
103 "LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
104 "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
105 "THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
106 "(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
107 "OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
109 #endif /* CONFIG_NO_STDOUT_DEBUG */
111 /* Configure default/group WEP keys for static WEP */
112 int wpa_set_wep_keys(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
116 for (i = 0; i < NUM_WEP_KEYS; i++) {
117 if (ssid->wep_key_len[i] == 0)
121 wpa_drv_set_key(wpa_s, WPA_ALG_WEP, NULL,
122 i, i == ssid->wep_tx_keyidx, NULL, 0,
123 ssid->wep_key[i], ssid->wep_key_len[i]);
130 int wpa_supplicant_set_wpa_none_key(struct wpa_supplicant *wpa_s,
131 struct wpa_ssid *ssid)
139 /* IBSS/WPA-None uses only one key (Group) for both receiving and
140 * sending unicast and multicast packets. */
142 if (ssid->mode != WPAS_MODE_IBSS) {
143 wpa_msg(wpa_s, MSG_INFO, "WPA: Invalid mode %d (not "
144 "IBSS/ad-hoc) for WPA-None", ssid->mode);
148 if (!ssid->psk_set) {
149 wpa_msg(wpa_s, MSG_INFO, "WPA: No PSK configured for "
154 switch (wpa_s->group_cipher) {
155 case WPA_CIPHER_CCMP:
156 os_memcpy(key, ssid->psk, 16);
160 case WPA_CIPHER_GCMP:
161 os_memcpy(key, ssid->psk, 16);
165 case WPA_CIPHER_TKIP:
166 /* WPA-None uses the same Michael MIC key for both TX and RX */
167 os_memcpy(key, ssid->psk, 16 + 8);
168 os_memcpy(key + 16 + 8, ssid->psk + 16, 8);
173 wpa_msg(wpa_s, MSG_INFO, "WPA: Invalid group cipher %d for "
174 "WPA-None", wpa_s->group_cipher);
178 /* TODO: should actually remember the previously used seq#, both for TX
179 * and RX from each STA.. */
181 ret = wpa_drv_set_key(wpa_s, alg, NULL, 0, 1, seq, 6, key, keylen);
182 os_memset(key, 0, sizeof(key));
187 static void wpa_supplicant_timeout(void *eloop_ctx, void *timeout_ctx)
189 struct wpa_supplicant *wpa_s = eloop_ctx;
190 const u8 *bssid = wpa_s->bssid;
191 if (is_zero_ether_addr(bssid))
192 bssid = wpa_s->pending_bssid;
193 wpa_msg(wpa_s, MSG_INFO, "Authentication with " MACSTR " timed out.",
195 wpa_blacklist_add(wpa_s, bssid);
196 wpa_sm_notify_disassoc(wpa_s->wpa);
197 wpa_supplicant_deauthenticate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
198 wpa_s->reassociate = 1;
201 * If we timed out, the AP or the local radio may be busy.
202 * So, wait a second until scanning again.
204 wpa_supplicant_req_scan(wpa_s, 1, 0);
209 * wpa_supplicant_req_auth_timeout - Schedule a timeout for authentication
210 * @wpa_s: Pointer to wpa_supplicant data
211 * @sec: Number of seconds after which to time out authentication
212 * @usec: Number of microseconds after which to time out authentication
214 * This function is used to schedule a timeout for the current authentication
217 void wpa_supplicant_req_auth_timeout(struct wpa_supplicant *wpa_s,
220 if (wpa_s->conf->ap_scan == 0 &&
221 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED))
224 wpa_dbg(wpa_s, MSG_DEBUG, "Setting authentication timeout: %d sec "
225 "%d usec", sec, usec);
226 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
227 eloop_register_timeout(sec, usec, wpa_supplicant_timeout, wpa_s, NULL);
232 * wpa_supplicant_cancel_auth_timeout - Cancel authentication timeout
233 * @wpa_s: Pointer to wpa_supplicant data
235 * This function is used to cancel authentication timeout scheduled with
236 * wpa_supplicant_req_auth_timeout() and it is called when authentication has
239 void wpa_supplicant_cancel_auth_timeout(struct wpa_supplicant *wpa_s)
241 wpa_dbg(wpa_s, MSG_DEBUG, "Cancelling authentication timeout");
242 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
243 wpa_blacklist_del(wpa_s, wpa_s->bssid);
248 * wpa_supplicant_initiate_eapol - Configure EAPOL state machine
249 * @wpa_s: Pointer to wpa_supplicant data
251 * This function is used to configure EAPOL state machine based on the selected
252 * authentication mode.
254 void wpa_supplicant_initiate_eapol(struct wpa_supplicant *wpa_s)
256 #ifdef IEEE8021X_EAPOL
257 struct eapol_config eapol_conf;
258 struct wpa_ssid *ssid = wpa_s->current_ssid;
260 #ifdef CONFIG_IBSS_RSN
261 if (ssid->mode == WPAS_MODE_IBSS &&
262 wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
263 wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
265 * RSN IBSS authentication is per-STA and we can disable the
266 * per-BSSID EAPOL authentication.
268 eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
269 eapol_sm_notify_eap_success(wpa_s->eapol, TRUE);
270 eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
273 #endif /* CONFIG_IBSS_RSN */
275 eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
276 eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
278 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
279 wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE)
280 eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
282 eapol_sm_notify_portControl(wpa_s->eapol, Auto);
284 os_memset(&eapol_conf, 0, sizeof(eapol_conf));
285 if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
286 eapol_conf.accept_802_1x_keys = 1;
287 eapol_conf.required_keys = 0;
288 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_UNICAST) {
289 eapol_conf.required_keys |= EAPOL_REQUIRE_KEY_UNICAST;
291 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_BROADCAST) {
292 eapol_conf.required_keys |=
293 EAPOL_REQUIRE_KEY_BROADCAST;
296 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED)
297 eapol_conf.required_keys = 0;
299 eapol_conf.fast_reauth = wpa_s->conf->fast_reauth;
300 eapol_conf.workaround = ssid->eap_workaround;
301 eapol_conf.eap_disabled =
302 !wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) &&
303 wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA &&
304 wpa_s->key_mgmt != WPA_KEY_MGMT_WPS;
305 eapol_conf.external_sim = wpa_s->conf->external_sim;
308 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) {
309 eapol_conf.wps |= EAPOL_LOCAL_WPS_IN_USE;
310 if (wpa_s->current_bss) {
312 ie = wpa_bss_get_vendor_ie_multi(wpa_s->current_bss,
317 EAPOL_PEER_IS_WPS20_AP;
322 #endif /* CONFIG_WPS */
324 eapol_sm_notify_config(wpa_s->eapol, &ssid->eap, &eapol_conf);
326 ieee802_1x_alloc_kay_sm(wpa_s, ssid);
327 #endif /* IEEE8021X_EAPOL */
332 * wpa_supplicant_set_non_wpa_policy - Set WPA parameters to non-WPA mode
333 * @wpa_s: Pointer to wpa_supplicant data
334 * @ssid: Configuration data for the network
336 * This function is used to configure WPA state machine and related parameters
337 * to a mode where WPA is not enabled. This is called as part of the
338 * authentication configuration when the selected network does not use WPA.
340 void wpa_supplicant_set_non_wpa_policy(struct wpa_supplicant *wpa_s,
341 struct wpa_ssid *ssid)
345 if (ssid->key_mgmt & WPA_KEY_MGMT_WPS)
346 wpa_s->key_mgmt = WPA_KEY_MGMT_WPS;
347 else if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA)
348 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_NO_WPA;
350 wpa_s->key_mgmt = WPA_KEY_MGMT_NONE;
351 wpa_sm_set_ap_wpa_ie(wpa_s->wpa, NULL, 0);
352 wpa_sm_set_ap_rsn_ie(wpa_s->wpa, NULL, 0);
353 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
354 wpa_s->pairwise_cipher = WPA_CIPHER_NONE;
355 wpa_s->group_cipher = WPA_CIPHER_NONE;
356 wpa_s->mgmt_group_cipher = 0;
358 for (i = 0; i < NUM_WEP_KEYS; i++) {
359 if (ssid->wep_key_len[i] > 5) {
360 wpa_s->pairwise_cipher = WPA_CIPHER_WEP104;
361 wpa_s->group_cipher = WPA_CIPHER_WEP104;
363 } else if (ssid->wep_key_len[i] > 0) {
364 wpa_s->pairwise_cipher = WPA_CIPHER_WEP40;
365 wpa_s->group_cipher = WPA_CIPHER_WEP40;
370 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED, 0);
371 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
372 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
373 wpa_s->pairwise_cipher);
374 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
375 #ifdef CONFIG_IEEE80211W
376 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
377 wpa_s->mgmt_group_cipher);
378 #endif /* CONFIG_IEEE80211W */
380 pmksa_cache_clear_current(wpa_s->wpa);
384 void free_hw_features(struct wpa_supplicant *wpa_s)
387 if (wpa_s->hw.modes == NULL)
390 for (i = 0; i < wpa_s->hw.num_modes; i++) {
391 os_free(wpa_s->hw.modes[i].channels);
392 os_free(wpa_s->hw.modes[i].rates);
395 os_free(wpa_s->hw.modes);
396 wpa_s->hw.modes = NULL;
400 static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s)
404 bgscan_deinit(wpa_s);
405 autoscan_deinit(wpa_s);
406 scard_deinit(wpa_s->scard);
408 wpa_sm_set_scard_ctx(wpa_s->wpa, NULL);
409 eapol_sm_register_scard_ctx(wpa_s->eapol, NULL);
410 l2_packet_deinit(wpa_s->l2);
413 l2_packet_deinit(wpa_s->l2_br);
416 #ifdef CONFIG_TESTING_OPTIONS
417 l2_packet_deinit(wpa_s->l2_test);
418 wpa_s->l2_test = NULL;
419 #endif /* CONFIG_TESTING_OPTIONS */
421 if (wpa_s->conf != NULL) {
422 struct wpa_ssid *ssid;
423 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
424 wpas_notify_network_removed(wpa_s, ssid);
427 os_free(wpa_s->confname);
428 wpa_s->confname = NULL;
430 os_free(wpa_s->confanother);
431 wpa_s->confanother = NULL;
433 wpa_sm_set_eapol(wpa_s->wpa, NULL);
434 eapol_sm_deinit(wpa_s->eapol);
437 rsn_preauth_deinit(wpa_s->wpa);
440 wpa_tdls_deinit(wpa_s->wpa);
441 #endif /* CONFIG_TDLS */
443 wmm_ac_clear_saved_tspecs(wpa_s);
444 pmksa_candidate_free(wpa_s->wpa);
445 wpa_sm_deinit(wpa_s->wpa);
447 wpa_blacklist_clear(wpa_s);
449 wpa_bss_deinit(wpa_s);
451 wpa_supplicant_cancel_delayed_sched_scan(wpa_s);
452 wpa_supplicant_cancel_scan(wpa_s);
453 wpa_supplicant_cancel_auth_timeout(wpa_s);
454 eloop_cancel_timeout(wpa_supplicant_stop_countermeasures, wpa_s, NULL);
455 #ifdef CONFIG_DELAYED_MIC_ERROR_REPORT
456 eloop_cancel_timeout(wpa_supplicant_delayed_mic_error_report,
458 #endif /* CONFIG_DELAYED_MIC_ERROR_REPORT */
460 eloop_cancel_timeout(wpas_network_reenabled, wpa_s, NULL);
462 wpas_wps_deinit(wpa_s);
464 wpabuf_free(wpa_s->pending_eapol_rx);
465 wpa_s->pending_eapol_rx = NULL;
467 #ifdef CONFIG_IBSS_RSN
468 ibss_rsn_deinit(wpa_s->ibss_rsn);
469 wpa_s->ibss_rsn = NULL;
470 #endif /* CONFIG_IBSS_RSN */
475 wpa_supplicant_ap_deinit(wpa_s);
476 #endif /* CONFIG_AP */
478 wpas_p2p_deinit(wpa_s);
480 #ifdef CONFIG_OFFCHANNEL
481 offchannel_deinit(wpa_s);
482 #endif /* CONFIG_OFFCHANNEL */
484 wpa_supplicant_cancel_sched_scan(wpa_s);
486 os_free(wpa_s->next_scan_freqs);
487 wpa_s->next_scan_freqs = NULL;
489 os_free(wpa_s->manual_scan_freqs);
490 wpa_s->manual_scan_freqs = NULL;
492 os_free(wpa_s->manual_sched_scan_freqs);
493 wpa_s->manual_sched_scan_freqs = NULL;
495 wpas_mac_addr_rand_scan_clear(wpa_s, MAC_ADDR_RAND_ALL);
498 * Need to remove any pending gas-query radio work before the
499 * gas_query_deinit() call because gas_query::work has not yet been set
500 * for works that have not been started. gas_query_free() will be unable
501 * to cancel such pending radio works and once the pending gas-query
502 * radio work eventually gets removed, the deinit notification call to
503 * gas_query_start_cb() would result in dereferencing freed memory.
506 radio_remove_works(wpa_s, "gas-query", 0);
507 gas_query_deinit(wpa_s->gas);
510 free_hw_features(wpa_s);
512 ieee802_1x_dealloc_kay_sm(wpa_s);
514 os_free(wpa_s->bssid_filter);
515 wpa_s->bssid_filter = NULL;
517 os_free(wpa_s->disallow_aps_bssid);
518 wpa_s->disallow_aps_bssid = NULL;
519 os_free(wpa_s->disallow_aps_ssid);
520 wpa_s->disallow_aps_ssid = NULL;
522 wnm_bss_keep_alive_deinit(wpa_s);
524 wnm_deallocate_memory(wpa_s);
525 #endif /* CONFIG_WNM */
527 ext_password_deinit(wpa_s->ext_pw);
528 wpa_s->ext_pw = NULL;
530 wpabuf_free(wpa_s->last_gas_resp);
531 wpa_s->last_gas_resp = NULL;
532 wpabuf_free(wpa_s->prev_gas_resp);
533 wpa_s->prev_gas_resp = NULL;
535 os_free(wpa_s->last_scan_res);
536 wpa_s->last_scan_res = NULL;
540 #endif /* CONFIG_HS20 */
542 for (i = 0; i < NUM_VENDOR_ELEM_FRAMES; i++) {
543 wpabuf_free(wpa_s->vendor_elem[i]);
544 wpa_s->vendor_elem[i] = NULL;
547 wmm_ac_notify_disassoc(wpa_s);
549 wpa_s->sched_scan_plans_num = 0;
550 os_free(wpa_s->sched_scan_plans);
551 wpa_s->sched_scan_plans = NULL;
554 wpa_s->non_pref_chan_num = 0;
555 os_free(wpa_s->non_pref_chan);
556 wpa_s->non_pref_chan = NULL;
557 #endif /* CONFIG_MBO */
562 * wpa_clear_keys - Clear keys configured for the driver
563 * @wpa_s: Pointer to wpa_supplicant data
564 * @addr: Previously used BSSID or %NULL if not available
566 * This function clears the encryption keys that has been previously configured
569 void wpa_clear_keys(struct wpa_supplicant *wpa_s, const u8 *addr)
573 #ifdef CONFIG_IEEE80211W
575 #else /* CONFIG_IEEE80211W */
577 #endif /* CONFIG_IEEE80211W */
579 /* MLME-DELETEKEYS.request */
580 for (i = 0; i < max; i++) {
581 if (wpa_s->keys_cleared & BIT(i))
583 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, i, 0, NULL, 0,
586 if (!(wpa_s->keys_cleared & BIT(0)) && addr &&
587 !is_zero_ether_addr(addr)) {
588 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, addr, 0, 0, NULL, 0, NULL,
590 /* MLME-SETPROTECTION.request(None) */
591 wpa_drv_mlme_setprotection(
593 MLME_SETPROTECTION_PROTECT_TYPE_NONE,
594 MLME_SETPROTECTION_KEY_TYPE_PAIRWISE);
596 wpa_s->keys_cleared = (u32) -1;
601 * wpa_supplicant_state_txt - Get the connection state name as a text string
602 * @state: State (wpa_state; WPA_*)
603 * Returns: The state name as a printable text string
605 const char * wpa_supplicant_state_txt(enum wpa_states state)
608 case WPA_DISCONNECTED:
609 return "DISCONNECTED";
612 case WPA_INTERFACE_DISABLED:
613 return "INTERFACE_DISABLED";
616 case WPA_AUTHENTICATING:
617 return "AUTHENTICATING";
618 case WPA_ASSOCIATING:
619 return "ASSOCIATING";
622 case WPA_4WAY_HANDSHAKE:
623 return "4WAY_HANDSHAKE";
624 case WPA_GROUP_HANDSHAKE:
625 return "GROUP_HANDSHAKE";
636 static void wpa_supplicant_start_bgscan(struct wpa_supplicant *wpa_s)
640 if (wpa_s->current_ssid && wpa_s->current_ssid->bgscan)
641 name = wpa_s->current_ssid->bgscan;
643 name = wpa_s->conf->bgscan;
644 if (name == NULL || name[0] == '\0')
646 if (wpas_driver_bss_selection(wpa_s))
648 if (wpa_s->current_ssid == wpa_s->bgscan_ssid)
651 if (wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE)
653 #endif /* CONFIG_P2P */
655 bgscan_deinit(wpa_s);
656 if (wpa_s->current_ssid) {
657 if (bgscan_init(wpa_s, wpa_s->current_ssid, name)) {
658 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize "
661 * Live without bgscan; it is only used as a roaming
662 * optimization, so the initial connection is not
666 struct wpa_scan_results *scan_res;
667 wpa_s->bgscan_ssid = wpa_s->current_ssid;
668 scan_res = wpa_supplicant_get_scan_results(wpa_s, NULL,
671 bgscan_notify_scan(wpa_s, scan_res);
672 wpa_scan_results_free(scan_res);
676 wpa_s->bgscan_ssid = NULL;
680 static void wpa_supplicant_stop_bgscan(struct wpa_supplicant *wpa_s)
682 if (wpa_s->bgscan_ssid != NULL) {
683 bgscan_deinit(wpa_s);
684 wpa_s->bgscan_ssid = NULL;
688 #endif /* CONFIG_BGSCAN */
691 static void wpa_supplicant_start_autoscan(struct wpa_supplicant *wpa_s)
693 if (autoscan_init(wpa_s, 0))
694 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize autoscan");
698 static void wpa_supplicant_stop_autoscan(struct wpa_supplicant *wpa_s)
700 autoscan_deinit(wpa_s);
704 void wpa_supplicant_reinit_autoscan(struct wpa_supplicant *wpa_s)
706 if (wpa_s->wpa_state == WPA_DISCONNECTED ||
707 wpa_s->wpa_state == WPA_SCANNING) {
708 autoscan_deinit(wpa_s);
709 wpa_supplicant_start_autoscan(wpa_s);
715 * wpa_supplicant_set_state - Set current connection state
716 * @wpa_s: Pointer to wpa_supplicant data
717 * @state: The new connection state
719 * This function is called whenever the connection state changes, e.g.,
720 * association is completed for WPA/WPA2 4-Way Handshake is started.
722 void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s,
723 enum wpa_states state)
725 enum wpa_states old_state = wpa_s->wpa_state;
727 wpa_dbg(wpa_s, MSG_DEBUG, "State: %s -> %s",
728 wpa_supplicant_state_txt(wpa_s->wpa_state),
729 wpa_supplicant_state_txt(state));
731 if (state == WPA_INTERFACE_DISABLED) {
732 /* Assure normal scan when interface is restored */
733 wpa_s->normal_scans = 0;
736 if (state == WPA_COMPLETED) {
737 wpas_connect_work_done(wpa_s);
738 /* Reinitialize normal_scan counter */
739 wpa_s->normal_scans = 0;
744 * P2PS client has to reply to Probe Request frames received on the
745 * group operating channel. Enable Probe Request frame reporting for
746 * P2P connected client in case p2p_cli_probe configuration property is
749 if (wpa_s->conf->p2p_cli_probe && wpa_s->current_ssid &&
750 wpa_s->current_ssid->mode == WPAS_MODE_INFRA &&
751 wpa_s->current_ssid->p2p_group) {
752 if (state == WPA_COMPLETED && !wpa_s->p2p_cli_probe) {
753 wpa_dbg(wpa_s, MSG_DEBUG,
754 "P2P: Enable CLI Probe Request RX reporting");
755 wpa_s->p2p_cli_probe =
756 wpa_drv_probe_req_report(wpa_s, 1) >= 0;
757 } else if (state != WPA_COMPLETED && wpa_s->p2p_cli_probe) {
758 wpa_dbg(wpa_s, MSG_DEBUG,
759 "P2P: Disable CLI Probe Request RX reporting");
760 wpa_s->p2p_cli_probe = 0;
761 wpa_drv_probe_req_report(wpa_s, 0);
764 #endif /* CONFIG_P2P */
766 if (state != WPA_SCANNING)
767 wpa_supplicant_notify_scanning(wpa_s, 0);
769 if (state == WPA_COMPLETED && wpa_s->new_connection) {
770 struct wpa_ssid *ssid = wpa_s->current_ssid;
771 #if defined(CONFIG_CTRL_IFACE) || !defined(CONFIG_NO_STDOUT_DEBUG)
772 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_CONNECTED "- Connection to "
773 MACSTR " completed [id=%d id_str=%s]",
774 MAC2STR(wpa_s->bssid),
775 ssid ? ssid->id : -1,
776 ssid && ssid->id_str ? ssid->id_str : "");
777 #endif /* CONFIG_CTRL_IFACE || !CONFIG_NO_STDOUT_DEBUG */
778 wpas_clear_temp_disabled(wpa_s, ssid, 1);
779 wpa_blacklist_clear(wpa_s);
780 wpa_s->extra_blacklist_count = 0;
781 wpa_s->new_connection = 0;
782 wpa_drv_set_operstate(wpa_s, 1);
783 #ifndef IEEE8021X_EAPOL
784 wpa_drv_set_supp_port(wpa_s, 1);
785 #endif /* IEEE8021X_EAPOL */
786 wpa_s->after_wps = 0;
787 wpa_s->known_wps_freq = 0;
788 wpas_p2p_completed(wpa_s);
790 sme_sched_obss_scan(wpa_s, 1);
791 } else if (state == WPA_DISCONNECTED || state == WPA_ASSOCIATING ||
792 state == WPA_ASSOCIATED) {
793 wpa_s->new_connection = 1;
794 wpa_drv_set_operstate(wpa_s, 0);
795 #ifndef IEEE8021X_EAPOL
796 wpa_drv_set_supp_port(wpa_s, 0);
797 #endif /* IEEE8021X_EAPOL */
798 sme_sched_obss_scan(wpa_s, 0);
800 wpa_s->wpa_state = state;
803 if (state == WPA_COMPLETED)
804 wpa_supplicant_start_bgscan(wpa_s);
805 else if (state < WPA_ASSOCIATED)
806 wpa_supplicant_stop_bgscan(wpa_s);
807 #endif /* CONFIG_BGSCAN */
809 if (state == WPA_AUTHENTICATING)
810 wpa_supplicant_stop_autoscan(wpa_s);
812 if (state == WPA_DISCONNECTED || state == WPA_INACTIVE)
813 wpa_supplicant_start_autoscan(wpa_s);
815 if (old_state >= WPA_ASSOCIATED && wpa_s->wpa_state < WPA_ASSOCIATED)
816 wmm_ac_notify_disassoc(wpa_s);
818 if (wpa_s->wpa_state != old_state) {
819 wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
822 * Notify the P2P Device interface about a state change in one
825 wpas_p2p_indicate_state_change(wpa_s);
827 if (wpa_s->wpa_state == WPA_COMPLETED ||
828 old_state == WPA_COMPLETED)
829 wpas_notify_auth_changed(wpa_s);
834 void wpa_supplicant_terminate_proc(struct wpa_global *global)
838 struct wpa_supplicant *wpa_s = global->ifaces;
840 struct wpa_supplicant *next = wpa_s->next;
841 if (wpas_wps_terminate_pending(wpa_s) == 1)
844 if (wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE ||
845 (wpa_s->current_ssid && wpa_s->current_ssid->p2p_group))
846 wpas_p2p_disconnect(wpa_s);
847 #endif /* CONFIG_P2P */
850 #endif /* CONFIG_WPS */
857 static void wpa_supplicant_terminate(int sig, void *signal_ctx)
859 struct wpa_global *global = signal_ctx;
860 wpa_supplicant_terminate_proc(global);
864 void wpa_supplicant_clear_status(struct wpa_supplicant *wpa_s)
866 enum wpa_states old_state = wpa_s->wpa_state;
868 wpa_s->pairwise_cipher = 0;
869 wpa_s->group_cipher = 0;
870 wpa_s->mgmt_group_cipher = 0;
872 if (wpa_s->wpa_state != WPA_INTERFACE_DISABLED)
873 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
875 if (wpa_s->wpa_state != old_state)
876 wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
881 * wpa_supplicant_reload_configuration - Reload configuration data
882 * @wpa_s: Pointer to wpa_supplicant data
883 * Returns: 0 on success or -1 if configuration parsing failed
885 * This function can be used to request that the configuration data is reloaded
886 * (e.g., after configuration file change). This function is reloading
887 * configuration only for one interface, so this may need to be called multiple
888 * times if %wpa_supplicant is controlling multiple interfaces and all
889 * interfaces need reconfiguration.
891 int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s)
893 struct wpa_config *conf;
897 if (wpa_s->confname == NULL)
899 conf = wpa_config_read(wpa_s->confname, NULL);
901 wpa_msg(wpa_s, MSG_ERROR, "Failed to parse the configuration "
902 "file '%s' - exiting", wpa_s->confname);
905 wpa_config_read(wpa_s->confanother, conf);
907 conf->changed_parameters = (unsigned int) -1;
909 reconf_ctrl = !!conf->ctrl_interface != !!wpa_s->conf->ctrl_interface
910 || (conf->ctrl_interface && wpa_s->conf->ctrl_interface &&
911 os_strcmp(conf->ctrl_interface,
912 wpa_s->conf->ctrl_interface) != 0);
914 if (reconf_ctrl && wpa_s->ctrl_iface) {
915 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
916 wpa_s->ctrl_iface = NULL;
919 eapol_sm_invalidate_cached_session(wpa_s->eapol);
920 if (wpa_s->current_ssid) {
921 if (wpa_s->wpa_state >= WPA_AUTHENTICATING)
922 wpa_s->own_disconnect_req = 1;
923 wpa_supplicant_deauthenticate(wpa_s,
924 WLAN_REASON_DEAUTH_LEAVING);
928 * TODO: should notify EAPOL SM about changes in opensc_engine_path,
929 * pkcs11_engine_path, pkcs11_module_path, openssl_ciphers.
931 if (wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt)) {
933 * Clear forced success to clear EAP state for next
936 eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
938 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
939 wpa_sm_set_config(wpa_s->wpa, NULL);
940 wpa_sm_pmksa_cache_flush(wpa_s->wpa, NULL);
941 wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
942 rsn_preauth_deinit(wpa_s->wpa);
944 old_ap_scan = wpa_s->conf->ap_scan;
945 wpa_config_free(wpa_s->conf);
947 if (old_ap_scan != wpa_s->conf->ap_scan)
948 wpas_notify_ap_scan_changed(wpa_s);
951 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
953 wpa_supplicant_update_config(wpa_s);
955 wpa_supplicant_clear_status(wpa_s);
956 if (wpa_supplicant_enabled_networks(wpa_s)) {
957 wpa_s->reassociate = 1;
958 wpa_supplicant_req_scan(wpa_s, 0, 0);
960 wpa_dbg(wpa_s, MSG_DEBUG, "Reconfiguration completed");
965 static void wpa_supplicant_reconfig(int sig, void *signal_ctx)
967 struct wpa_global *global = signal_ctx;
968 struct wpa_supplicant *wpa_s;
969 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
970 wpa_dbg(wpa_s, MSG_DEBUG, "Signal %d received - reconfiguring",
972 if (wpa_supplicant_reload_configuration(wpa_s) < 0) {
973 wpa_supplicant_terminate_proc(global);
977 if (wpa_debug_reopen_file() < 0) {
978 /* Ignore errors since we cannot really do much to fix this */
979 wpa_printf(MSG_DEBUG, "Could not reopen debug log file");
984 static int wpa_supplicant_suites_from_ai(struct wpa_supplicant *wpa_s,
985 struct wpa_ssid *ssid,
986 struct wpa_ie_data *ie)
988 int ret = wpa_sm_parse_own_wpa_ie(wpa_s->wpa, ie);
991 wpa_msg(wpa_s, MSG_INFO, "WPA: Failed to parse WPA IE "
992 "from association info");
997 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Using WPA IE from AssocReq to set "
999 if (!(ie->group_cipher & ssid->group_cipher)) {
1000 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled group "
1001 "cipher 0x%x (mask 0x%x) - reject",
1002 ie->group_cipher, ssid->group_cipher);
1005 if (!(ie->pairwise_cipher & ssid->pairwise_cipher)) {
1006 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled pairwise "
1007 "cipher 0x%x (mask 0x%x) - reject",
1008 ie->pairwise_cipher, ssid->pairwise_cipher);
1011 if (!(ie->key_mgmt & ssid->key_mgmt)) {
1012 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled key "
1013 "management 0x%x (mask 0x%x) - reject",
1014 ie->key_mgmt, ssid->key_mgmt);
1018 #ifdef CONFIG_IEEE80211W
1019 if (!(ie->capabilities & WPA_CAPABILITY_MFPC) &&
1020 wpas_get_ssid_pmf(wpa_s, ssid) == MGMT_FRAME_PROTECTION_REQUIRED) {
1021 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver associated with an AP "
1022 "that does not support management frame protection - "
1026 #endif /* CONFIG_IEEE80211W */
1033 * wpa_supplicant_set_suites - Set authentication and encryption parameters
1034 * @wpa_s: Pointer to wpa_supplicant data
1035 * @bss: Scan results for the selected BSS, or %NULL if not available
1036 * @ssid: Configuration data for the selected network
1037 * @wpa_ie: Buffer for the WPA/RSN IE
1038 * @wpa_ie_len: Maximum wpa_ie buffer size on input. This is changed to be the
1039 * used buffer length in case the functions returns success.
1040 * Returns: 0 on success or -1 on failure
1042 * This function is used to configure authentication and encryption parameters
1043 * based on the network configuration and scan result for the selected BSS (if
1046 int wpa_supplicant_set_suites(struct wpa_supplicant *wpa_s,
1047 struct wpa_bss *bss, struct wpa_ssid *ssid,
1048 u8 *wpa_ie, size_t *wpa_ie_len)
1050 struct wpa_ie_data ie;
1052 const u8 *bss_wpa, *bss_rsn, *bss_osen;
1055 bss_wpa = wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE);
1056 bss_rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
1057 bss_osen = wpa_bss_get_vendor_ie(bss, OSEN_IE_VENDOR_TYPE);
1059 bss_wpa = bss_rsn = bss_osen = NULL;
1061 if (bss_rsn && (ssid->proto & WPA_PROTO_RSN) &&
1062 wpa_parse_wpa_ie(bss_rsn, 2 + bss_rsn[1], &ie) == 0 &&
1063 (ie.group_cipher & ssid->group_cipher) &&
1064 (ie.pairwise_cipher & ssid->pairwise_cipher) &&
1065 (ie.key_mgmt & ssid->key_mgmt)) {
1066 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using IEEE 802.11i/D9.0");
1067 proto = WPA_PROTO_RSN;
1068 } else if (bss_wpa && (ssid->proto & WPA_PROTO_WPA) &&
1069 wpa_parse_wpa_ie(bss_wpa, 2 + bss_wpa[1], &ie) == 0 &&
1070 (ie.group_cipher & ssid->group_cipher) &&
1071 (ie.pairwise_cipher & ssid->pairwise_cipher) &&
1072 (ie.key_mgmt & ssid->key_mgmt)) {
1073 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using IEEE 802.11i/D3.0");
1074 proto = WPA_PROTO_WPA;
1076 } else if (bss_osen && (ssid->proto & WPA_PROTO_OSEN)) {
1077 wpa_dbg(wpa_s, MSG_DEBUG, "HS 2.0: using OSEN");
1078 /* TODO: parse OSEN element */
1079 os_memset(&ie, 0, sizeof(ie));
1080 ie.group_cipher = WPA_CIPHER_CCMP;
1081 ie.pairwise_cipher = WPA_CIPHER_CCMP;
1082 ie.key_mgmt = WPA_KEY_MGMT_OSEN;
1083 proto = WPA_PROTO_OSEN;
1084 #endif /* CONFIG_HS20 */
1086 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select WPA/RSN");
1087 wpa_dbg(wpa_s, MSG_DEBUG,
1088 "WPA: ssid proto=0x%x pairwise_cipher=0x%x group_cipher=0x%x key_mgmt=0x%x",
1089 ssid->proto, ssid->pairwise_cipher, ssid->group_cipher,
1091 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: BSS " MACSTR " ssid='%s'%s%s%s",
1092 MAC2STR(bss->bssid),
1093 wpa_ssid_txt(bss->ssid, bss->ssid_len),
1094 bss_wpa ? " WPA" : "",
1095 bss_rsn ? " RSN" : "",
1096 bss_osen ? " OSEN" : "");
1098 wpa_hexdump(MSG_DEBUG, "RSN", bss_rsn, 2 + bss_rsn[1]);
1099 if (wpa_parse_wpa_ie(bss_rsn, 2 + bss_rsn[1], &ie)) {
1100 wpa_dbg(wpa_s, MSG_DEBUG,
1101 "Could not parse RSN element");
1103 wpa_dbg(wpa_s, MSG_DEBUG,
1104 "RSN: pairwise_cipher=0x%x group_cipher=0x%x key_mgmt=0x%x",
1105 ie.pairwise_cipher, ie.group_cipher,
1110 wpa_hexdump(MSG_DEBUG, "WPA", bss_wpa, 2 + bss_wpa[1]);
1111 if (wpa_parse_wpa_ie(bss_wpa, 2 + bss_wpa[1], &ie)) {
1112 wpa_dbg(wpa_s, MSG_DEBUG,
1113 "Could not parse WPA element");
1115 wpa_dbg(wpa_s, MSG_DEBUG,
1116 "WPA: pairwise_cipher=0x%x group_cipher=0x%x key_mgmt=0x%x",
1117 ie.pairwise_cipher, ie.group_cipher,
1123 if (ssid->proto & WPA_PROTO_OSEN)
1124 proto = WPA_PROTO_OSEN;
1125 else if (ssid->proto & WPA_PROTO_RSN)
1126 proto = WPA_PROTO_RSN;
1128 proto = WPA_PROTO_WPA;
1129 if (wpa_supplicant_suites_from_ai(wpa_s, ssid, &ie) < 0) {
1130 os_memset(&ie, 0, sizeof(ie));
1131 ie.group_cipher = ssid->group_cipher;
1132 ie.pairwise_cipher = ssid->pairwise_cipher;
1133 ie.key_mgmt = ssid->key_mgmt;
1134 #ifdef CONFIG_IEEE80211W
1135 ie.mgmt_group_cipher =
1136 ssid->ieee80211w != NO_MGMT_FRAME_PROTECTION ?
1137 WPA_CIPHER_AES_128_CMAC : 0;
1138 #endif /* CONFIG_IEEE80211W */
1139 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Set cipher suites "
1140 "based on configuration");
1145 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected cipher suites: group %d "
1146 "pairwise %d key_mgmt %d proto %d",
1147 ie.group_cipher, ie.pairwise_cipher, ie.key_mgmt, proto);
1148 #ifdef CONFIG_IEEE80211W
1149 if (ssid->ieee80211w) {
1150 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected mgmt group cipher %d",
1151 ie.mgmt_group_cipher);
1153 #endif /* CONFIG_IEEE80211W */
1155 wpa_s->wpa_proto = proto;
1156 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PROTO, proto);
1157 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED,
1158 !!(ssid->proto & (WPA_PROTO_RSN | WPA_PROTO_OSEN)));
1160 if (bss || !wpa_s->ap_ies_from_associnfo) {
1161 if (wpa_sm_set_ap_wpa_ie(wpa_s->wpa, bss_wpa,
1162 bss_wpa ? 2 + bss_wpa[1] : 0) ||
1163 wpa_sm_set_ap_rsn_ie(wpa_s->wpa, bss_rsn,
1164 bss_rsn ? 2 + bss_rsn[1] : 0))
1168 #ifdef CONFIG_NO_WPA
1169 wpa_s->group_cipher = WPA_CIPHER_NONE;
1170 wpa_s->pairwise_cipher = WPA_CIPHER_NONE;
1171 #else /* CONFIG_NO_WPA */
1172 sel = ie.group_cipher & ssid->group_cipher;
1173 wpa_s->group_cipher = wpa_pick_group_cipher(sel);
1174 if (wpa_s->group_cipher < 0) {
1175 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select group "
1179 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using GTK %s",
1180 wpa_cipher_txt(wpa_s->group_cipher));
1182 sel = ie.pairwise_cipher & ssid->pairwise_cipher;
1183 wpa_s->pairwise_cipher = wpa_pick_pairwise_cipher(sel, 1);
1184 if (wpa_s->pairwise_cipher < 0) {
1185 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select pairwise "
1189 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using PTK %s",
1190 wpa_cipher_txt(wpa_s->pairwise_cipher));
1191 #endif /* CONFIG_NO_WPA */
1193 sel = ie.key_mgmt & ssid->key_mgmt;
1195 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SAE))
1196 sel &= ~(WPA_KEY_MGMT_SAE | WPA_KEY_MGMT_FT_SAE);
1197 #endif /* CONFIG_SAE */
1199 #ifdef CONFIG_SUITEB192
1200 } else if (sel & WPA_KEY_MGMT_IEEE8021X_SUITE_B_192) {
1201 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SUITE_B_192;
1202 wpa_dbg(wpa_s, MSG_DEBUG,
1203 "WPA: using KEY_MGMT 802.1X with Suite B (192-bit)");
1204 #endif /* CONFIG_SUITEB192 */
1205 #ifdef CONFIG_SUITEB
1206 } else if (sel & WPA_KEY_MGMT_IEEE8021X_SUITE_B) {
1207 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SUITE_B;
1208 wpa_dbg(wpa_s, MSG_DEBUG,
1209 "WPA: using KEY_MGMT 802.1X with Suite B");
1210 #endif /* CONFIG_SUITEB */
1211 #ifdef CONFIG_IEEE80211R
1212 } else if (sel & WPA_KEY_MGMT_FT_IEEE8021X) {
1213 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_IEEE8021X;
1214 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/802.1X");
1215 } else if (sel & WPA_KEY_MGMT_FT_PSK) {
1216 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_PSK;
1217 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/PSK");
1218 #endif /* CONFIG_IEEE80211R */
1220 } else if (sel & WPA_KEY_MGMT_SAE) {
1221 wpa_s->key_mgmt = WPA_KEY_MGMT_SAE;
1222 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT SAE");
1223 } else if (sel & WPA_KEY_MGMT_FT_SAE) {
1224 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_SAE;
1225 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT FT/SAE");
1226 #endif /* CONFIG_SAE */
1227 #ifdef CONFIG_IEEE80211W
1228 } else if (sel & WPA_KEY_MGMT_IEEE8021X_SHA256) {
1229 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SHA256;
1230 wpa_dbg(wpa_s, MSG_DEBUG,
1231 "WPA: using KEY_MGMT 802.1X with SHA256");
1232 } else if (sel & WPA_KEY_MGMT_PSK_SHA256) {
1233 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK_SHA256;
1234 wpa_dbg(wpa_s, MSG_DEBUG,
1235 "WPA: using KEY_MGMT PSK with SHA256");
1236 #endif /* CONFIG_IEEE80211W */
1237 } else if (sel & WPA_KEY_MGMT_IEEE8021X) {
1238 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X;
1239 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT 802.1X");
1240 } else if (sel & WPA_KEY_MGMT_PSK) {
1241 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK;
1242 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-PSK");
1243 } else if (sel & WPA_KEY_MGMT_WPA_NONE) {
1244 wpa_s->key_mgmt = WPA_KEY_MGMT_WPA_NONE;
1245 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-NONE");
1247 } else if (sel & WPA_KEY_MGMT_OSEN) {
1248 wpa_s->key_mgmt = WPA_KEY_MGMT_OSEN;
1249 wpa_dbg(wpa_s, MSG_DEBUG, "HS 2.0: using KEY_MGMT OSEN");
1250 #endif /* CONFIG_HS20 */
1252 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select "
1253 "authenticated key management type");
1257 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
1258 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
1259 wpa_s->pairwise_cipher);
1260 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
1262 #ifdef CONFIG_IEEE80211W
1263 sel = ie.mgmt_group_cipher;
1264 if (wpas_get_ssid_pmf(wpa_s, ssid) == NO_MGMT_FRAME_PROTECTION ||
1265 !(ie.capabilities & WPA_CAPABILITY_MFPC))
1267 if (sel & WPA_CIPHER_AES_128_CMAC) {
1268 wpa_s->mgmt_group_cipher = WPA_CIPHER_AES_128_CMAC;
1269 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1271 } else if (sel & WPA_CIPHER_BIP_GMAC_128) {
1272 wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_GMAC_128;
1273 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1275 } else if (sel & WPA_CIPHER_BIP_GMAC_256) {
1276 wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_GMAC_256;
1277 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1279 } else if (sel & WPA_CIPHER_BIP_CMAC_256) {
1280 wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_CMAC_256;
1281 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1284 wpa_s->mgmt_group_cipher = 0;
1285 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: not using MGMT group cipher");
1287 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
1288 wpa_s->mgmt_group_cipher);
1289 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MFP,
1290 wpas_get_ssid_pmf(wpa_s, ssid));
1291 #endif /* CONFIG_IEEE80211W */
1293 if (wpa_sm_set_assoc_wpa_ie_default(wpa_s->wpa, wpa_ie, wpa_ie_len)) {
1294 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to generate WPA IE");
1298 if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt)) {
1301 if (ssid->psk_set) {
1302 wpa_sm_set_pmk(wpa_s->wpa, ssid->psk, PMK_LEN, NULL,
1306 #ifndef CONFIG_NO_PBKDF2
1307 if (bss && ssid->bssid_set && ssid->ssid_len == 0 &&
1310 pbkdf2_sha1(ssid->passphrase, bss->ssid, bss->ssid_len,
1311 4096, psk, PMK_LEN);
1312 wpa_hexdump_key(MSG_MSGDUMP, "PSK (from passphrase)",
1314 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN, NULL, NULL);
1316 os_memset(psk, 0, sizeof(psk));
1318 #endif /* CONFIG_NO_PBKDF2 */
1319 #ifdef CONFIG_EXT_PASSWORD
1320 if (ssid->ext_psk) {
1321 struct wpabuf *pw = ext_password_get(wpa_s->ext_pw,
1323 char pw_str[64 + 1];
1327 wpa_msg(wpa_s, MSG_INFO, "EXT PW: No PSK "
1328 "found from external storage");
1332 if (wpabuf_len(pw) < 8 || wpabuf_len(pw) > 64) {
1333 wpa_msg(wpa_s, MSG_INFO, "EXT PW: Unexpected "
1334 "PSK length %d in external storage",
1335 (int) wpabuf_len(pw));
1336 ext_password_free(pw);
1340 os_memcpy(pw_str, wpabuf_head(pw), wpabuf_len(pw));
1341 pw_str[wpabuf_len(pw)] = '\0';
1343 #ifndef CONFIG_NO_PBKDF2
1344 if (wpabuf_len(pw) >= 8 && wpabuf_len(pw) < 64 && bss)
1346 pbkdf2_sha1(pw_str, bss->ssid, bss->ssid_len,
1347 4096, psk, PMK_LEN);
1348 os_memset(pw_str, 0, sizeof(pw_str));
1349 wpa_hexdump_key(MSG_MSGDUMP, "PSK (from "
1350 "external passphrase)",
1352 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN, NULL,
1355 os_memset(psk, 0, sizeof(psk));
1357 #endif /* CONFIG_NO_PBKDF2 */
1358 if (wpabuf_len(pw) == 2 * PMK_LEN) {
1359 if (hexstr2bin(pw_str, psk, PMK_LEN) < 0) {
1360 wpa_msg(wpa_s, MSG_INFO, "EXT PW: "
1361 "Invalid PSK hex string");
1362 os_memset(pw_str, 0, sizeof(pw_str));
1363 ext_password_free(pw);
1366 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN, NULL,
1369 os_memset(psk, 0, sizeof(psk));
1371 wpa_msg(wpa_s, MSG_INFO, "EXT PW: No suitable "
1373 os_memset(pw_str, 0, sizeof(pw_str));
1374 ext_password_free(pw);
1378 os_memset(pw_str, 0, sizeof(pw_str));
1379 ext_password_free(pw);
1381 #endif /* CONFIG_EXT_PASSWORD */
1384 wpa_msg(wpa_s, MSG_INFO,
1385 "No PSK available for association");
1389 wpa_sm_set_pmk_from_pmksa(wpa_s->wpa);
1395 static void wpas_ext_capab_byte(struct wpa_supplicant *wpa_s, u8 *pos, int idx)
1400 case 0: /* Bits 0-7 */
1402 case 1: /* Bits 8-15 */
1404 case 2: /* Bits 16-23 */
1406 *pos |= 0x02; /* Bit 17 - WNM-Sleep Mode */
1407 *pos |= 0x08; /* Bit 19 - BSS Transition */
1408 #endif /* CONFIG_WNM */
1410 case 3: /* Bits 24-31 */
1412 *pos |= 0x02; /* Bit 25 - SSID List */
1413 #endif /* CONFIG_WNM */
1414 #ifdef CONFIG_INTERWORKING
1415 if (wpa_s->conf->interworking)
1416 *pos |= 0x80; /* Bit 31 - Interworking */
1417 #endif /* CONFIG_INTERWORKING */
1419 case 4: /* Bits 32-39 */
1420 #ifdef CONFIG_INTERWORKING
1421 if (wpa_s->drv_flags / WPA_DRIVER_FLAGS_QOS_MAPPING)
1422 *pos |= 0x01; /* Bit 32 - QoS Map */
1423 #endif /* CONFIG_INTERWORKING */
1425 case 5: /* Bits 40-47 */
1427 if (wpa_s->conf->hs20)
1428 *pos |= 0x40; /* Bit 46 - WNM-Notification */
1429 #endif /* CONFIG_HS20 */
1431 *pos |= 0x40; /* Bit 46 - WNM-Notification */
1432 #endif /* CONFIG_MBO */
1434 case 6: /* Bits 48-55 */
1440 int wpas_build_ext_capab(struct wpa_supplicant *wpa_s, u8 *buf, size_t buflen)
1445 if (len < wpa_s->extended_capa_len)
1446 len = wpa_s->extended_capa_len;
1447 if (buflen < (size_t) len + 2) {
1448 wpa_printf(MSG_INFO,
1449 "Not enough room for building extended capabilities element");
1453 *pos++ = WLAN_EID_EXT_CAPAB;
1455 for (i = 0; i < len; i++, pos++) {
1456 wpas_ext_capab_byte(wpa_s, pos, i);
1458 if (i < wpa_s->extended_capa_len) {
1459 *pos &= ~wpa_s->extended_capa_mask[i];
1460 *pos |= wpa_s->extended_capa[i];
1464 while (len > 0 && buf[1 + len] == 0) {
1475 static int wpas_valid_bss(struct wpa_supplicant *wpa_s,
1476 struct wpa_bss *test_bss)
1478 struct wpa_bss *bss;
1480 dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
1481 if (bss == test_bss)
1489 static int wpas_valid_ssid(struct wpa_supplicant *wpa_s,
1490 struct wpa_ssid *test_ssid)
1492 struct wpa_ssid *ssid;
1494 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) {
1495 if (ssid == test_ssid)
1503 int wpas_valid_bss_ssid(struct wpa_supplicant *wpa_s, struct wpa_bss *test_bss,
1504 struct wpa_ssid *test_ssid)
1506 if (test_bss && !wpas_valid_bss(wpa_s, test_bss))
1509 return test_ssid == NULL || wpas_valid_ssid(wpa_s, test_ssid);
1513 void wpas_connect_work_free(struct wpa_connect_work *cwork)
1521 void wpas_connect_work_done(struct wpa_supplicant *wpa_s)
1523 struct wpa_connect_work *cwork;
1524 struct wpa_radio_work *work = wpa_s->connect_work;
1529 wpa_s->connect_work = NULL;
1532 wpas_connect_work_free(cwork);
1533 radio_work_done(work);
1537 int wpas_update_random_addr(struct wpa_supplicant *wpa_s, int style)
1539 struct os_reltime now;
1542 os_get_reltime(&now);
1543 if (wpa_s->last_mac_addr_style == style &&
1544 wpa_s->last_mac_addr_change.sec != 0 &&
1545 !os_reltime_expired(&now, &wpa_s->last_mac_addr_change,
1546 wpa_s->conf->rand_addr_lifetime)) {
1547 wpa_msg(wpa_s, MSG_DEBUG,
1548 "Previously selected random MAC address has not yet expired");
1554 if (random_mac_addr(addr) < 0)
1558 os_memcpy(addr, wpa_s->perm_addr, ETH_ALEN);
1559 if (random_mac_addr_keep_oui(addr) < 0)
1566 if (wpa_drv_set_mac_addr(wpa_s, addr) < 0) {
1567 wpa_msg(wpa_s, MSG_INFO,
1568 "Failed to set random MAC address");
1572 os_get_reltime(&wpa_s->last_mac_addr_change);
1573 wpa_s->mac_addr_changed = 1;
1574 wpa_s->last_mac_addr_style = style;
1576 if (wpa_supplicant_update_mac_addr(wpa_s) < 0) {
1577 wpa_msg(wpa_s, MSG_INFO,
1578 "Could not update MAC address information");
1582 wpa_msg(wpa_s, MSG_DEBUG, "Using random MAC address " MACSTR,
1589 int wpas_update_random_addr_disassoc(struct wpa_supplicant *wpa_s)
1591 if (wpa_s->wpa_state >= WPA_AUTHENTICATING ||
1592 !wpa_s->conf->preassoc_mac_addr)
1595 return wpas_update_random_addr(wpa_s, wpa_s->conf->preassoc_mac_addr);
1599 static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit);
1602 * wpa_supplicant_associate - Request association
1603 * @wpa_s: Pointer to wpa_supplicant data
1604 * @bss: Scan results for the selected BSS, or %NULL if not available
1605 * @ssid: Configuration data for the selected network
1607 * This function is used to request %wpa_supplicant to associate with a BSS.
1609 void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
1610 struct wpa_bss *bss, struct wpa_ssid *ssid)
1612 struct wpa_connect_work *cwork;
1615 wpa_s->own_disconnect_req = 0;
1618 * If we are starting a new connection, any previously pending EAPOL
1619 * RX cannot be valid anymore.
1621 wpabuf_free(wpa_s->pending_eapol_rx);
1622 wpa_s->pending_eapol_rx = NULL;
1624 if (ssid->mac_addr == -1)
1625 rand_style = wpa_s->conf->mac_addr;
1627 rand_style = ssid->mac_addr;
1629 wmm_ac_clear_saved_tspecs(wpa_s);
1630 wpa_s->reassoc_same_bss = 0;
1632 if (wpa_s->last_ssid == ssid) {
1633 wpa_dbg(wpa_s, MSG_DEBUG, "Re-association to the same ESS");
1634 if (wpa_s->current_bss && wpa_s->current_bss == bss) {
1635 wmm_ac_save_tspecs(wpa_s);
1636 wpa_s->reassoc_same_bss = 1;
1638 } else if (rand_style > 0) {
1639 if (wpas_update_random_addr(wpa_s, rand_style) < 0)
1641 wpa_sm_pmksa_cache_flush(wpa_s->wpa, ssid);
1642 } else if (wpa_s->mac_addr_changed) {
1643 if (wpa_drv_set_mac_addr(wpa_s, NULL) < 0) {
1644 wpa_msg(wpa_s, MSG_INFO,
1645 "Could not restore permanent MAC address");
1648 wpa_s->mac_addr_changed = 0;
1649 if (wpa_supplicant_update_mac_addr(wpa_s) < 0) {
1650 wpa_msg(wpa_s, MSG_INFO,
1651 "Could not update MAC address information");
1654 wpa_msg(wpa_s, MSG_DEBUG, "Using permanent MAC address");
1656 wpa_s->last_ssid = ssid;
1658 #ifdef CONFIG_IBSS_RSN
1659 ibss_rsn_deinit(wpa_s->ibss_rsn);
1660 wpa_s->ibss_rsn = NULL;
1661 #endif /* CONFIG_IBSS_RSN */
1663 if (ssid->mode == WPAS_MODE_AP || ssid->mode == WPAS_MODE_P2P_GO ||
1664 ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) {
1666 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_AP)) {
1667 wpa_msg(wpa_s, MSG_INFO, "Driver does not support AP "
1671 if (wpa_supplicant_create_ap(wpa_s, ssid) < 0) {
1672 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
1673 if (ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION)
1674 wpas_p2p_ap_setup_failed(wpa_s);
1677 wpa_s->current_bss = bss;
1678 #else /* CONFIG_AP */
1679 wpa_msg(wpa_s, MSG_ERROR, "AP mode support not included in "
1681 #endif /* CONFIG_AP */
1685 if (ssid->mode == WPAS_MODE_MESH) {
1687 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_MESH)) {
1688 wpa_msg(wpa_s, MSG_INFO,
1689 "Driver does not support mesh mode");
1693 ssid->frequency = bss->freq;
1694 if (wpa_supplicant_join_mesh(wpa_s, ssid) < 0) {
1695 wpa_msg(wpa_s, MSG_ERROR, "Could not join mesh");
1698 wpa_s->current_bss = bss;
1699 wpa_msg(wpa_s, MSG_INFO, MESH_GROUP_STARTED "ssid=\"%s\" id=%d",
1700 wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
1702 #else /* CONFIG_MESH */
1703 wpa_msg(wpa_s, MSG_ERROR,
1704 "mesh mode support not included in the build");
1705 #endif /* CONFIG_MESH */
1711 wpa_tdls_ap_ies(wpa_s->wpa, (const u8 *) (bss + 1),
1713 #endif /* CONFIG_TDLS */
1715 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) &&
1716 ssid->mode == IEEE80211_MODE_INFRA) {
1717 sme_authenticate(wpa_s, bss, ssid);
1721 if (wpa_s->connect_work) {
1722 wpa_dbg(wpa_s, MSG_DEBUG, "Reject wpa_supplicant_associate() call since connect_work exist");
1726 if (radio_work_pending(wpa_s, "connect")) {
1727 wpa_dbg(wpa_s, MSG_DEBUG, "Reject wpa_supplicant_associate() call since pending work exist");
1731 wpas_abort_ongoing_scan(wpa_s);
1733 cwork = os_zalloc(sizeof(*cwork));
1740 if (radio_add_work(wpa_s, bss ? bss->freq : 0, "connect", 1,
1741 wpas_start_assoc_cb, cwork) < 0) {
1747 static int bss_is_ibss(struct wpa_bss *bss)
1749 return (bss->caps & (IEEE80211_CAP_ESS | IEEE80211_CAP_IBSS)) ==
1754 static int drv_supports_vht(struct wpa_supplicant *wpa_s,
1755 const struct wpa_ssid *ssid)
1757 enum hostapd_hw_mode hw_mode;
1758 struct hostapd_hw_modes *mode = NULL;
1762 #ifdef CONFIG_HT_OVERRIDES
1763 if (ssid->disable_ht)
1765 #endif /* CONFIG_HT_OVERRIDES */
1767 hw_mode = ieee80211_freq_to_chan(ssid->frequency, &channel);
1768 if (hw_mode == NUM_HOSTAPD_MODES)
1770 for (i = 0; wpa_s->hw.modes && i < wpa_s->hw.num_modes; i++) {
1771 if (wpa_s->hw.modes[i].mode == hw_mode) {
1772 mode = &wpa_s->hw.modes[i];
1780 return mode->vht_capab != 0;
1784 void ibss_mesh_setup_freq(struct wpa_supplicant *wpa_s,
1785 const struct wpa_ssid *ssid,
1786 struct hostapd_freq_params *freq)
1788 enum hostapd_hw_mode hw_mode;
1789 struct hostapd_hw_modes *mode = NULL;
1790 int ht40plus[] = { 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157,
1792 int vht80[] = { 36, 52, 100, 116, 132, 149 };
1793 struct hostapd_channel_data *pri_chan = NULL, *sec_chan = NULL;
1795 int i, chan_idx, ht40 = -1, res, obss_scan = 1;
1797 struct hostapd_freq_params vht_freq;
1798 int chwidth, seg0, seg1;
1801 freq->freq = ssid->frequency;
1803 for (j = 0; j < wpa_s->last_scan_res_used; j++) {
1804 struct wpa_bss *bss = wpa_s->last_scan_res[j];
1806 if (ssid->mode != WPAS_MODE_IBSS)
1809 /* Don't adjust control freq in case of fixed_freq */
1810 if (ssid->fixed_freq)
1813 if (!bss_is_ibss(bss))
1816 if (ssid->ssid_len == bss->ssid_len &&
1817 os_memcmp(ssid->ssid, bss->ssid, bss->ssid_len) == 0) {
1818 wpa_printf(MSG_DEBUG,
1819 "IBSS already found in scan results, adjust control freq: %d",
1821 freq->freq = bss->freq;
1827 /* For IBSS check HT_IBSS flag */
1828 if (ssid->mode == WPAS_MODE_IBSS &&
1829 !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_HT_IBSS))
1832 if (wpa_s->group_cipher == WPA_CIPHER_WEP40 ||
1833 wpa_s->group_cipher == WPA_CIPHER_WEP104 ||
1834 wpa_s->pairwise_cipher == WPA_CIPHER_TKIP) {
1835 wpa_printf(MSG_DEBUG,
1836 "IBSS: WEP/TKIP detected, do not try to enable HT");
1840 hw_mode = ieee80211_freq_to_chan(freq->freq, &channel);
1841 for (i = 0; wpa_s->hw.modes && i < wpa_s->hw.num_modes; i++) {
1842 if (wpa_s->hw.modes[i].mode == hw_mode) {
1843 mode = &wpa_s->hw.modes[i];
1851 freq->ht_enabled = ht_supported(mode);
1852 if (!freq->ht_enabled)
1855 /* Setup higher BW only for 5 GHz */
1856 if (mode->mode != HOSTAPD_MODE_IEEE80211A)
1859 for (chan_idx = 0; chan_idx < mode->num_channels; chan_idx++) {
1860 pri_chan = &mode->channels[chan_idx];
1861 if (pri_chan->chan == channel)
1868 /* Check primary channel flags */
1869 if (pri_chan->flag & (HOSTAPD_CHAN_DISABLED | HOSTAPD_CHAN_NO_IR))
1872 /* Check/setup HT40+/HT40- */
1873 for (j = 0; j < ARRAY_SIZE(ht40plus); j++) {
1874 if (ht40plus[j] == channel) {
1880 /* Find secondary channel */
1881 for (i = 0; i < mode->num_channels; i++) {
1882 sec_chan = &mode->channels[i];
1883 if (sec_chan->chan == channel + ht40 * 4)
1890 /* Check secondary channel flags */
1891 if (sec_chan->flag & (HOSTAPD_CHAN_DISABLED | HOSTAPD_CHAN_NO_IR))
1894 freq->channel = pri_chan->chan;
1898 if (!(pri_chan->flag & HOSTAPD_CHAN_HT40MINUS))
1900 freq->sec_channel_offset = -1;
1903 if (!(pri_chan->flag & HOSTAPD_CHAN_HT40PLUS))
1905 freq->sec_channel_offset = 1;
1911 if (freq->sec_channel_offset && obss_scan) {
1912 struct wpa_scan_results *scan_res;
1914 scan_res = wpa_supplicant_get_scan_results(wpa_s, NULL, 0);
1915 if (scan_res == NULL) {
1917 freq->sec_channel_offset = 0;
1921 res = check_40mhz_5g(mode, scan_res, pri_chan->chan,
1926 freq->sec_channel_offset = 0;
1929 /* Configuration allowed */
1932 /* Switch pri/sec channels */
1933 freq->freq = hw_get_freq(mode, sec_chan->chan);
1934 freq->sec_channel_offset = -freq->sec_channel_offset;
1935 freq->channel = sec_chan->chan;
1938 freq->sec_channel_offset = 0;
1942 wpa_scan_results_free(scan_res);
1945 wpa_printf(MSG_DEBUG,
1946 "IBSS/mesh: setup freq channel %d, sec_channel_offset %d",
1947 freq->channel, freq->sec_channel_offset);
1949 if (!drv_supports_vht(wpa_s, ssid))
1952 /* For IBSS check VHT_IBSS flag */
1953 if (ssid->mode == WPAS_MODE_IBSS &&
1954 !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_VHT_IBSS))
1959 vht_freq.vht_enabled = vht_supported(mode);
1960 if (!vht_freq.vht_enabled)
1963 /* setup center_freq1, bandwidth */
1964 for (j = 0; j < ARRAY_SIZE(vht80); j++) {
1965 if (freq->channel >= vht80[j] &&
1966 freq->channel < vht80[j] + 16)
1970 if (j == ARRAY_SIZE(vht80))
1973 for (i = vht80[j]; i < vht80[j] + 16; i += 4) {
1974 struct hostapd_channel_data *chan;
1976 chan = hw_get_channel_chan(mode, i, NULL);
1980 /* Back to HT configuration if channel not usable */
1981 if (chan->flag & (HOSTAPD_CHAN_DISABLED | HOSTAPD_CHAN_NO_IR))
1985 chwidth = VHT_CHANWIDTH_80MHZ;
1986 seg0 = vht80[j] + 6;
1989 if (ssid->max_oper_chwidth == VHT_CHANWIDTH_80P80MHZ) {
1990 /* setup center_freq2, bandwidth */
1991 for (k = 0; k < ARRAY_SIZE(vht80); k++) {
1992 /* Only accept 80 MHz segments separated by a gap */
1993 if (j == k || abs(vht80[j] - vht80[k]) == 16)
1995 for (i = vht80[k]; i < vht80[k] + 16; i += 4) {
1996 struct hostapd_channel_data *chan;
1998 chan = hw_get_channel_chan(mode, i, NULL);
2002 if (chan->flag & (HOSTAPD_CHAN_DISABLED |
2003 HOSTAPD_CHAN_NO_IR |
2004 HOSTAPD_CHAN_RADAR))
2007 /* Found a suitable second segment for 80+80 */
2008 chwidth = VHT_CHANWIDTH_80P80MHZ;
2010 VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ;
2011 seg1 = vht80[k] + 6;
2014 if (chwidth == VHT_CHANWIDTH_80P80MHZ)
2019 if (hostapd_set_freq_params(&vht_freq, mode->mode, freq->freq,
2020 freq->channel, freq->ht_enabled,
2021 vht_freq.vht_enabled,
2022 freq->sec_channel_offset,
2023 chwidth, seg0, seg1, vht_caps) != 0)
2028 wpa_printf(MSG_DEBUG, "IBSS: VHT setup freq cf1 %d, cf2 %d, bw %d",
2029 freq->center_freq1, freq->center_freq2, freq->bandwidth);
2033 static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
2035 struct wpa_connect_work *cwork = work->ctx;
2036 struct wpa_bss *bss = cwork->bss;
2037 struct wpa_ssid *ssid = cwork->ssid;
2038 struct wpa_supplicant *wpa_s = work->wpa_s;
2041 int use_crypt, ret, i, bssid_changed;
2042 int algs = WPA_AUTH_ALG_OPEN;
2043 unsigned int cipher_pairwise, cipher_group;
2044 struct wpa_driver_associate_params params;
2045 int wep_keys_set = 0;
2046 int assoc_failed = 0;
2047 struct wpa_ssid *old_ssid;
2048 #ifdef CONFIG_HT_OVERRIDES
2049 struct ieee80211_ht_capabilities htcaps;
2050 struct ieee80211_ht_capabilities htcaps_mask;
2051 #endif /* CONFIG_HT_OVERRIDES */
2052 #ifdef CONFIG_VHT_OVERRIDES
2053 struct ieee80211_vht_capabilities vhtcaps;
2054 struct ieee80211_vht_capabilities vhtcaps_mask;
2055 #endif /* CONFIG_VHT_OVERRIDES */
2058 if (work->started) {
2059 wpa_s->connect_work = NULL;
2061 /* cancel possible auth. timeout */
2062 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s,
2065 wpas_connect_work_free(cwork);
2069 wpa_s->connect_work = work;
2071 if (cwork->bss_removed || !wpas_valid_bss_ssid(wpa_s, bss, ssid) ||
2072 wpas_network_disabled(wpa_s, ssid)) {
2073 wpa_dbg(wpa_s, MSG_DEBUG, "BSS/SSID entry for association not valid anymore - drop connection attempt");
2074 wpas_connect_work_done(wpa_s);
2078 os_memset(¶ms, 0, sizeof(params));
2079 wpa_s->reassociate = 0;
2080 wpa_s->eap_expected_failure = 0;
2082 (!wpas_driver_bss_selection(wpa_s) || wpas_wps_searching(wpa_s))) {
2083 #ifdef CONFIG_IEEE80211R
2084 const u8 *ie, *md = NULL;
2085 #endif /* CONFIG_IEEE80211R */
2086 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with " MACSTR
2087 " (SSID='%s' freq=%d MHz)", MAC2STR(bss->bssid),
2088 wpa_ssid_txt(bss->ssid, bss->ssid_len), bss->freq);
2089 bssid_changed = !is_zero_ether_addr(wpa_s->bssid);
2090 os_memset(wpa_s->bssid, 0, ETH_ALEN);
2091 os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN);
2093 wpas_notify_bssid_changed(wpa_s);
2094 #ifdef CONFIG_IEEE80211R
2095 ie = wpa_bss_get_ie(bss, WLAN_EID_MOBILITY_DOMAIN);
2096 if (ie && ie[1] >= MOBILITY_DOMAIN_ID_LEN)
2098 wpa_sm_set_ft_params(wpa_s->wpa, ie, ie ? 2 + ie[1] : 0);
2100 /* Prepare for the next transition */
2101 wpa_ft_prepare_auth_request(wpa_s->wpa, ie);
2103 #endif /* CONFIG_IEEE80211R */
2105 } else if ((ssid->ssid == NULL || ssid->ssid_len == 0) &&
2106 wpa_s->conf->ap_scan == 2 &&
2107 (ssid->key_mgmt & WPA_KEY_MGMT_WPS)) {
2108 /* Use ap_scan==1 style network selection to find the network
2110 wpas_connect_work_done(wpa_s);
2111 wpa_s->scan_req = MANUAL_SCAN_REQ;
2112 wpa_s->reassociate = 1;
2113 wpa_supplicant_req_scan(wpa_s, 0, 0);
2115 #endif /* CONFIG_WPS */
2117 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with SSID '%s'",
2118 wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
2119 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
2122 wpa_supplicant_cancel_sched_scan(wpa_s);
2124 wpa_supplicant_cancel_scan(wpa_s);
2126 /* Starting new association, so clear the possibly used WPA IE from the
2127 * previous association. */
2128 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
2130 #ifdef IEEE8021X_EAPOL
2131 if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
2133 if (ssid->non_leap == 0)
2134 algs = WPA_AUTH_ALG_LEAP;
2136 algs |= WPA_AUTH_ALG_LEAP;
2139 #endif /* IEEE8021X_EAPOL */
2140 wpa_dbg(wpa_s, MSG_DEBUG, "Automatic auth_alg selection: 0x%x", algs);
2141 if (ssid->auth_alg) {
2142 algs = ssid->auth_alg;
2143 wpa_dbg(wpa_s, MSG_DEBUG, "Overriding auth_alg selection: "
2147 if (bss && (wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE) ||
2148 wpa_bss_get_ie(bss, WLAN_EID_RSN)) &&
2149 wpa_key_mgmt_wpa(ssid->key_mgmt)) {
2150 int try_opportunistic;
2151 try_opportunistic = (ssid->proactive_key_caching < 0 ?
2153 ssid->proactive_key_caching) &&
2154 (ssid->proto & WPA_PROTO_RSN);
2155 if (pmksa_cache_set_current(wpa_s->wpa, NULL, bss->bssid,
2156 ssid, try_opportunistic) == 0)
2157 eapol_sm_notify_pmkid_attempt(wpa_s->eapol);
2158 wpa_ie_len = sizeof(wpa_ie);
2159 if (wpa_supplicant_set_suites(wpa_s, bss, ssid,
2160 wpa_ie, &wpa_ie_len)) {
2161 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA "
2162 "key management and encryption suites");
2163 wpas_connect_work_done(wpa_s);
2166 } else if ((ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) && bss &&
2167 wpa_key_mgmt_wpa_ieee8021x(ssid->key_mgmt)) {
2169 * Both WPA and non-WPA IEEE 802.1X enabled in configuration -
2170 * use non-WPA since the scan results did not indicate that the
2171 * AP is using WPA or WPA2.
2173 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
2175 wpa_s->wpa_proto = 0;
2176 } else if (wpa_key_mgmt_wpa_any(ssid->key_mgmt)) {
2177 wpa_ie_len = sizeof(wpa_ie);
2178 if (wpa_supplicant_set_suites(wpa_s, NULL, ssid,
2179 wpa_ie, &wpa_ie_len)) {
2180 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA "
2181 "key management and encryption suites (no "
2183 wpas_connect_work_done(wpa_s);
2187 } else if (ssid->key_mgmt & WPA_KEY_MGMT_WPS) {
2188 struct wpabuf *wps_ie;
2189 wps_ie = wps_build_assoc_req_ie(wpas_wps_get_req_type(ssid));
2190 if (wps_ie && wpabuf_len(wps_ie) <= sizeof(wpa_ie)) {
2191 wpa_ie_len = wpabuf_len(wps_ie);
2192 os_memcpy(wpa_ie, wpabuf_head(wps_ie), wpa_ie_len);
2195 wpabuf_free(wps_ie);
2196 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
2197 if (!bss || (bss->caps & IEEE80211_CAP_PRIVACY))
2198 params.wps = WPS_MODE_PRIVACY;
2200 params.wps = WPS_MODE_OPEN;
2201 wpa_s->wpa_proto = 0;
2202 #endif /* CONFIG_WPS */
2204 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
2206 wpa_s->wpa_proto = 0;
2210 if (wpa_s->global->p2p) {
2214 pos = wpa_ie + wpa_ie_len;
2215 len = sizeof(wpa_ie) - wpa_ie_len;
2216 res = wpas_p2p_assoc_req_ie(wpa_s, bss, pos, len,
2222 wpa_s->cross_connect_disallowed = 0;
2225 p2p = wpa_bss_get_vendor_ie_multi(bss, P2P_IE_VENDOR_TYPE);
2227 wpa_s->cross_connect_disallowed =
2228 p2p_get_cross_connect_disallowed(p2p);
2230 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: WLAN AP %s cross "
2232 wpa_s->cross_connect_disallowed ?
2233 "disallows" : "allows");
2237 os_memset(wpa_s->p2p_ip_addr_info, 0, sizeof(wpa_s->p2p_ip_addr_info));
2238 #endif /* CONFIG_P2P */
2241 if (is_hs20_network(wpa_s, ssid, bss)) {
2242 struct wpabuf *hs20;
2243 hs20 = wpabuf_alloc(20);
2245 int pps_mo_id = hs20_get_pps_mo_id(wpa_s, ssid);
2248 wpas_hs20_add_indication(hs20, pps_mo_id);
2249 len = sizeof(wpa_ie) - wpa_ie_len;
2250 if (wpabuf_len(hs20) <= len) {
2251 os_memcpy(wpa_ie + wpa_ie_len,
2252 wpabuf_head(hs20), wpabuf_len(hs20));
2253 wpa_ie_len += wpabuf_len(hs20);
2258 #endif /* CONFIG_HS20 */
2261 * Workaround: Add Extended Capabilities element only if the AP
2262 * included this element in Beacon/Probe Response frames. Some older
2263 * APs seem to have interoperability issues if this element is
2264 * included, so while the standard may require us to include the
2265 * element in all cases, it is justifiable to skip it to avoid
2266 * interoperability issues.
2268 if (!bss || wpa_bss_get_ie(bss, WLAN_EID_EXT_CAPAB)) {
2271 ext_capab_len = wpas_build_ext_capab(wpa_s, ext_capab,
2273 if (ext_capab_len > 0) {
2275 if (wpa_ie_len > 0 && pos[0] == WLAN_EID_RSN)
2277 os_memmove(pos + ext_capab_len, pos,
2278 wpa_ie_len - (pos - wpa_ie));
2279 wpa_ie_len += ext_capab_len;
2280 os_memcpy(pos, ext_capab, ext_capab_len);
2284 if (wpa_s->vendor_elem[VENDOR_ELEM_ASSOC_REQ]) {
2285 struct wpabuf *buf = wpa_s->vendor_elem[VENDOR_ELEM_ASSOC_REQ];
2288 len = sizeof(wpa_ie) - wpa_ie_len;
2289 if (wpabuf_len(buf) <= len) {
2290 os_memcpy(wpa_ie + wpa_ie_len,
2291 wpabuf_head(buf), wpabuf_len(buf));
2292 wpa_ie_len += wpabuf_len(buf);
2297 if (wpa_s->fst_ies) {
2298 int fst_ies_len = wpabuf_len(wpa_s->fst_ies);
2300 if (wpa_ie_len + fst_ies_len <= sizeof(wpa_ie)) {
2301 os_memcpy(wpa_ie + wpa_ie_len,
2302 wpabuf_head(wpa_s->fst_ies), fst_ies_len);
2303 wpa_ie_len += fst_ies_len;
2306 #endif /* CONFIG_FST */
2309 if (wpa_bss_get_vendor_ie(bss, MBO_IE_VENDOR_TYPE)) {
2314 pos = wpa_ie + wpa_ie_len;
2315 len = sizeof(wpa_ie) - wpa_ie_len;
2316 res = wpas_mbo_ie(wpa_s, pos, len);
2320 #endif /* CONFIG_MBO */
2322 wpa_clear_keys(wpa_s, bss ? bss->bssid : NULL);
2324 cipher_pairwise = wpa_s->pairwise_cipher;
2325 cipher_group = wpa_s->group_cipher;
2326 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
2327 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
2328 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE)
2330 if (wpa_set_wep_keys(wpa_s, ssid)) {
2335 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS)
2338 #ifdef IEEE8021X_EAPOL
2339 if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
2340 if ((ssid->eapol_flags &
2341 (EAPOL_FLAG_REQUIRE_KEY_UNICAST |
2342 EAPOL_FLAG_REQUIRE_KEY_BROADCAST)) == 0 &&
2346 /* Assume that dynamic WEP-104 keys will be used and
2347 * set cipher suites in order for drivers to expect
2349 cipher_pairwise = cipher_group = WPA_CIPHER_WEP104;
2352 #endif /* IEEE8021X_EAPOL */
2354 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
2355 /* Set the key before (and later after) association */
2356 wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
2359 wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING);
2361 params.ssid = bss->ssid;
2362 params.ssid_len = bss->ssid_len;
2363 if (!wpas_driver_bss_selection(wpa_s) || ssid->bssid_set) {
2364 wpa_printf(MSG_DEBUG, "Limit connection to BSSID "
2365 MACSTR " freq=%u MHz based on scan results "
2367 MAC2STR(bss->bssid), bss->freq,
2369 params.bssid = bss->bssid;
2370 params.freq.freq = bss->freq;
2372 params.bssid_hint = bss->bssid;
2373 params.freq_hint = bss->freq;
2374 params.pbss = bss_is_pbss(bss);
2376 params.ssid = ssid->ssid;
2377 params.ssid_len = ssid->ssid_len;
2378 params.pbss = ssid->pbss;
2381 if (ssid->mode == WPAS_MODE_IBSS && ssid->bssid_set &&
2382 wpa_s->conf->ap_scan == 2) {
2383 params.bssid = ssid->bssid;
2384 params.fixed_bssid = 1;
2387 /* Initial frequency for IBSS/mesh */
2388 if ((ssid->mode == WPAS_MODE_IBSS || ssid->mode == WPAS_MODE_MESH) &&
2389 ssid->frequency > 0 && params.freq.freq == 0)
2390 ibss_mesh_setup_freq(wpa_s, ssid, ¶ms.freq);
2392 if (ssid->mode == WPAS_MODE_IBSS) {
2393 params.fixed_freq = ssid->fixed_freq;
2394 if (ssid->beacon_int)
2395 params.beacon_int = ssid->beacon_int;
2397 params.beacon_int = wpa_s->conf->beacon_int;
2400 params.wpa_ie = wpa_ie;
2401 params.wpa_ie_len = wpa_ie_len;
2402 params.pairwise_suite = cipher_pairwise;
2403 params.group_suite = cipher_group;
2404 params.key_mgmt_suite = wpa_s->key_mgmt;
2405 params.wpa_proto = wpa_s->wpa_proto;
2406 params.auth_alg = algs;
2407 params.mode = ssid->mode;
2408 params.bg_scan_period = ssid->bg_scan_period;
2409 for (i = 0; i < NUM_WEP_KEYS; i++) {
2410 if (ssid->wep_key_len[i])
2411 params.wep_key[i] = ssid->wep_key[i];
2412 params.wep_key_len[i] = ssid->wep_key_len[i];
2414 params.wep_tx_keyidx = ssid->wep_tx_keyidx;
2416 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) &&
2417 (params.key_mgmt_suite == WPA_KEY_MGMT_PSK ||
2418 params.key_mgmt_suite == WPA_KEY_MGMT_FT_PSK)) {
2419 params.passphrase = ssid->passphrase;
2421 params.psk = ssid->psk;
2424 if (wpa_s->conf->key_mgmt_offload) {
2425 if (params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X ||
2426 params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SHA256 ||
2427 params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SUITE_B ||
2428 params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SUITE_B_192)
2429 params.req_key_mgmt_offload =
2430 ssid->proactive_key_caching < 0 ?
2431 wpa_s->conf->okc : ssid->proactive_key_caching;
2433 params.req_key_mgmt_offload = 1;
2435 if ((params.key_mgmt_suite == WPA_KEY_MGMT_PSK ||
2436 params.key_mgmt_suite == WPA_KEY_MGMT_PSK_SHA256 ||
2437 params.key_mgmt_suite == WPA_KEY_MGMT_FT_PSK) &&
2439 params.psk = ssid->psk;
2442 params.drop_unencrypted = use_crypt;
2444 #ifdef CONFIG_IEEE80211W
2445 params.mgmt_frame_protection = wpas_get_ssid_pmf(wpa_s, ssid);
2446 if (params.mgmt_frame_protection != NO_MGMT_FRAME_PROTECTION && bss) {
2447 const u8 *rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
2448 struct wpa_ie_data ie;
2449 if (rsn && wpa_parse_wpa_ie(rsn, 2 + rsn[1], &ie) == 0 &&
2451 (WPA_CAPABILITY_MFPC | WPA_CAPABILITY_MFPR)) {
2452 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected AP supports "
2453 "MFP: require MFP");
2454 params.mgmt_frame_protection =
2455 MGMT_FRAME_PROTECTION_REQUIRED;
2458 #endif /* CONFIG_IEEE80211W */
2460 params.p2p = ssid->p2p_group;
2462 if (wpa_s->parent->set_sta_uapsd)
2463 params.uapsd = wpa_s->parent->sta_uapsd;
2467 #ifdef CONFIG_HT_OVERRIDES
2468 os_memset(&htcaps, 0, sizeof(htcaps));
2469 os_memset(&htcaps_mask, 0, sizeof(htcaps_mask));
2470 params.htcaps = (u8 *) &htcaps;
2471 params.htcaps_mask = (u8 *) &htcaps_mask;
2472 wpa_supplicant_apply_ht_overrides(wpa_s, ssid, ¶ms);
2473 #endif /* CONFIG_HT_OVERRIDES */
2474 #ifdef CONFIG_VHT_OVERRIDES
2475 os_memset(&vhtcaps, 0, sizeof(vhtcaps));
2476 os_memset(&vhtcaps_mask, 0, sizeof(vhtcaps_mask));
2477 params.vhtcaps = &vhtcaps;
2478 params.vhtcaps_mask = &vhtcaps_mask;
2479 wpa_supplicant_apply_vht_overrides(wpa_s, ssid, ¶ms);
2480 #endif /* CONFIG_VHT_OVERRIDES */
2484 * If multi-channel concurrency is not supported, check for any
2485 * frequency conflict. In case of any frequency conflict, remove the
2486 * least prioritized connection.
2488 if (wpa_s->num_multichan_concurrent < 2) {
2490 num = get_shared_radio_freqs(wpa_s, &freq, 1);
2491 if (num > 0 && freq > 0 && freq != params.freq.freq) {
2492 wpa_printf(MSG_DEBUG,
2493 "Assoc conflicting freq found (%d != %d)",
2494 freq, params.freq.freq);
2495 if (wpas_p2p_handle_frequency_conflicts(
2496 wpa_s, params.freq.freq, ssid) < 0) {
2497 wpas_connect_work_done(wpa_s);
2502 #endif /* CONFIG_P2P */
2504 ret = wpa_drv_associate(wpa_s, ¶ms);
2506 wpa_msg(wpa_s, MSG_INFO, "Association request to the driver "
2508 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SANE_ERROR_CODES) {
2510 * The driver is known to mean what is saying, so we
2511 * can stop right here; the association will not
2514 wpas_connection_failed(wpa_s, wpa_s->pending_bssid);
2515 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
2516 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
2519 /* try to continue anyway; new association will be tried again
2524 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
2525 /* Set the key after the association just in case association
2526 * cleared the previously configured key. */
2527 wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
2528 /* No need to timeout authentication since there is no key
2530 wpa_supplicant_cancel_auth_timeout(wpa_s);
2531 wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
2532 #ifdef CONFIG_IBSS_RSN
2533 } else if (ssid->mode == WPAS_MODE_IBSS &&
2534 wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
2535 wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
2537 * RSN IBSS authentication is per-STA and we can disable the
2538 * per-BSSID authentication.
2540 wpa_supplicant_cancel_auth_timeout(wpa_s);
2541 #endif /* CONFIG_IBSS_RSN */
2543 /* Timeout for IEEE 802.11 authentication and association */
2547 /* give IBSS a bit more time */
2548 timeout = ssid->mode == WPAS_MODE_IBSS ? 10 : 5;
2549 } else if (wpa_s->conf->ap_scan == 1) {
2550 /* give IBSS a bit more time */
2551 timeout = ssid->mode == WPAS_MODE_IBSS ? 20 : 10;
2553 wpa_supplicant_req_auth_timeout(wpa_s, timeout, 0);
2557 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC)) {
2558 /* Set static WEP keys again */
2559 wpa_set_wep_keys(wpa_s, ssid);
2562 if (wpa_s->current_ssid && wpa_s->current_ssid != ssid) {
2564 * Do not allow EAP session resumption between different
2565 * network configurations.
2567 eapol_sm_invalidate_cached_session(wpa_s->eapol);
2569 old_ssid = wpa_s->current_ssid;
2570 wpa_s->current_ssid = ssid;
2571 if (!wpas_driver_bss_selection(wpa_s) || ssid->bssid_set)
2572 wpa_s->current_bss = bss;
2573 wpa_supplicant_rsn_supp_set_config(wpa_s, wpa_s->current_ssid);
2574 wpa_supplicant_initiate_eapol(wpa_s);
2575 if (old_ssid != wpa_s->current_ssid)
2576 wpas_notify_network_changed(wpa_s);
2580 static void wpa_supplicant_clear_connection(struct wpa_supplicant *wpa_s,
2583 struct wpa_ssid *old_ssid;
2585 wpas_connect_work_done(wpa_s);
2586 wpa_clear_keys(wpa_s, addr);
2587 old_ssid = wpa_s->current_ssid;
2588 wpa_supplicant_mark_disassoc(wpa_s);
2589 wpa_sm_set_config(wpa_s->wpa, NULL);
2590 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
2591 if (old_ssid != wpa_s->current_ssid)
2592 wpas_notify_network_changed(wpa_s);
2593 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
2598 * wpa_supplicant_deauthenticate - Deauthenticate the current connection
2599 * @wpa_s: Pointer to wpa_supplicant data
2600 * @reason_code: IEEE 802.11 reason code for the deauthenticate frame
2602 * This function is used to request %wpa_supplicant to deauthenticate from the
2605 void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
2609 union wpa_event_data event;
2612 wpa_dbg(wpa_s, MSG_DEBUG, "Request to deauthenticate - bssid=" MACSTR
2613 " pending_bssid=" MACSTR " reason=%d state=%s",
2614 MAC2STR(wpa_s->bssid), MAC2STR(wpa_s->pending_bssid),
2615 reason_code, wpa_supplicant_state_txt(wpa_s->wpa_state));
2617 if (!is_zero_ether_addr(wpa_s->bssid))
2618 addr = wpa_s->bssid;
2619 else if (!is_zero_ether_addr(wpa_s->pending_bssid) &&
2620 (wpa_s->wpa_state == WPA_AUTHENTICATING ||
2621 wpa_s->wpa_state == WPA_ASSOCIATING))
2622 addr = wpa_s->pending_bssid;
2623 else if (wpa_s->wpa_state == WPA_ASSOCIATING) {
2625 * When using driver-based BSS selection, we may not know the
2626 * BSSID with which we are currently trying to associate. We
2627 * need to notify the driver of this disconnection even in such
2628 * a case, so use the all zeros address here.
2630 addr = wpa_s->bssid;
2635 wpa_tdls_teardown_peers(wpa_s->wpa);
2636 #endif /* CONFIG_TDLS */
2640 wpa_msg(wpa_s, MSG_INFO, MESH_GROUP_REMOVED "%s",
2642 wpa_supplicant_leave_mesh(wpa_s);
2644 #endif /* CONFIG_MESH */
2647 wpa_drv_deauthenticate(wpa_s, addr, reason_code);
2648 os_memset(&event, 0, sizeof(event));
2649 event.deauth_info.reason_code = (u16) reason_code;
2650 event.deauth_info.locally_generated = 1;
2651 wpa_supplicant_event(wpa_s, EVENT_DEAUTH, &event);
2656 wpa_supplicant_clear_connection(wpa_s, addr);
2659 static void wpa_supplicant_enable_one_network(struct wpa_supplicant *wpa_s,
2660 struct wpa_ssid *ssid)
2662 if (!ssid || !ssid->disabled || ssid->disabled == 2)
2666 wpas_clear_temp_disabled(wpa_s, ssid, 1);
2667 wpas_notify_network_enabled_changed(wpa_s, ssid);
2670 * Try to reassociate since there is no current configuration and a new
2671 * network was made available.
2673 if (!wpa_s->current_ssid && !wpa_s->disconnected)
2674 wpa_s->reassociate = 1;
2679 * wpa_supplicant_enable_network - Mark a configured network as enabled
2680 * @wpa_s: wpa_supplicant structure for a network interface
2681 * @ssid: wpa_ssid structure for a configured network or %NULL
2683 * Enables the specified network or all networks if no network specified.
2685 void wpa_supplicant_enable_network(struct wpa_supplicant *wpa_s,
2686 struct wpa_ssid *ssid)
2689 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
2690 wpa_supplicant_enable_one_network(wpa_s, ssid);
2692 wpa_supplicant_enable_one_network(wpa_s, ssid);
2694 if (wpa_s->reassociate && !wpa_s->disconnected &&
2695 (!wpa_s->current_ssid ||
2696 wpa_s->wpa_state == WPA_DISCONNECTED ||
2697 wpa_s->wpa_state == WPA_SCANNING)) {
2698 if (wpa_s->sched_scanning) {
2699 wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan to add "
2700 "new network to scan filters");
2701 wpa_supplicant_cancel_sched_scan(wpa_s);
2704 if (wpa_supplicant_fast_associate(wpa_s) != 1) {
2705 wpa_s->scan_req = NORMAL_SCAN_REQ;
2706 wpa_supplicant_req_scan(wpa_s, 0, 0);
2713 * wpa_supplicant_disable_network - Mark a configured network as disabled
2714 * @wpa_s: wpa_supplicant structure for a network interface
2715 * @ssid: wpa_ssid structure for a configured network or %NULL
2717 * Disables the specified network or all networks if no network specified.
2719 void wpa_supplicant_disable_network(struct wpa_supplicant *wpa_s,
2720 struct wpa_ssid *ssid)
2722 struct wpa_ssid *other_ssid;
2726 if (wpa_s->sched_scanning)
2727 wpa_supplicant_cancel_sched_scan(wpa_s);
2729 for (other_ssid = wpa_s->conf->ssid; other_ssid;
2730 other_ssid = other_ssid->next) {
2731 was_disabled = other_ssid->disabled;
2732 if (was_disabled == 2)
2733 continue; /* do not change persistent P2P group
2736 other_ssid->disabled = 1;
2738 if (was_disabled != other_ssid->disabled)
2739 wpas_notify_network_enabled_changed(
2742 if (wpa_s->current_ssid)
2743 wpa_supplicant_deauthenticate(
2744 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
2745 } else if (ssid->disabled != 2) {
2746 if (ssid == wpa_s->current_ssid)
2747 wpa_supplicant_deauthenticate(
2748 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
2750 was_disabled = ssid->disabled;
2754 if (was_disabled != ssid->disabled) {
2755 wpas_notify_network_enabled_changed(wpa_s, ssid);
2756 if (wpa_s->sched_scanning) {
2757 wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan "
2758 "to remove network from filters");
2759 wpa_supplicant_cancel_sched_scan(wpa_s);
2760 wpa_supplicant_req_scan(wpa_s, 0, 0);
2768 * wpa_supplicant_select_network - Attempt association with a network
2769 * @wpa_s: wpa_supplicant structure for a network interface
2770 * @ssid: wpa_ssid structure for a configured network or %NULL for any network
2772 void wpa_supplicant_select_network(struct wpa_supplicant *wpa_s,
2773 struct wpa_ssid *ssid)
2776 struct wpa_ssid *other_ssid;
2777 int disconnected = 0;
2779 if (ssid && ssid != wpa_s->current_ssid && wpa_s->current_ssid) {
2780 if (wpa_s->wpa_state >= WPA_AUTHENTICATING)
2781 wpa_s->own_disconnect_req = 1;
2782 wpa_supplicant_deauthenticate(
2783 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
2788 wpas_clear_temp_disabled(wpa_s, ssid, 1);
2791 * Mark all other networks disabled or mark all networks enabled if no
2792 * network specified.
2794 for (other_ssid = wpa_s->conf->ssid; other_ssid;
2795 other_ssid = other_ssid->next) {
2796 int was_disabled = other_ssid->disabled;
2797 if (was_disabled == 2)
2798 continue; /* do not change persistent P2P group data */
2800 other_ssid->disabled = ssid ? (ssid->id != other_ssid->id) : 0;
2801 if (was_disabled && !other_ssid->disabled)
2802 wpas_clear_temp_disabled(wpa_s, other_ssid, 0);
2804 if (was_disabled != other_ssid->disabled)
2805 wpas_notify_network_enabled_changed(wpa_s, other_ssid);
2808 if (ssid && ssid == wpa_s->current_ssid && wpa_s->current_ssid &&
2809 wpa_s->wpa_state >= WPA_AUTHENTICATING) {
2810 /* We are already associated with the selected network */
2811 wpa_printf(MSG_DEBUG, "Already associated with the "
2812 "selected network - do nothing");
2817 wpa_s->current_ssid = ssid;
2818 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
2819 wpa_s->connect_without_scan =
2820 (ssid->mode == WPAS_MODE_MESH) ? ssid : NULL;
2823 * Don't optimize next scan freqs since a new ESS has been
2826 os_free(wpa_s->next_scan_freqs);
2827 wpa_s->next_scan_freqs = NULL;
2829 wpa_s->connect_without_scan = NULL;
2832 wpa_s->disconnected = 0;
2833 wpa_s->reassociate = 1;
2835 if (wpa_s->connect_without_scan ||
2836 wpa_supplicant_fast_associate(wpa_s) != 1) {
2837 wpa_s->scan_req = NORMAL_SCAN_REQ;
2838 wpa_supplicant_req_scan(wpa_s, 0, disconnected ? 100000 : 0);
2842 wpas_notify_network_selected(wpa_s, ssid);
2847 * wpas_set_pkcs11_engine_and_module_path - Set PKCS #11 engine and module path
2848 * @wpa_s: wpa_supplicant structure for a network interface
2849 * @pkcs11_engine_path: PKCS #11 engine path or NULL
2850 * @pkcs11_module_path: PKCS #11 module path or NULL
2851 * Returns: 0 on success; -1 on failure
2853 * Sets the PKCS #11 engine and module path. Both have to be NULL or a valid
2854 * path. If resetting the EAPOL state machine with the new PKCS #11 engine and
2855 * module path fails the paths will be reset to the default value (NULL).
2857 int wpas_set_pkcs11_engine_and_module_path(struct wpa_supplicant *wpa_s,
2858 const char *pkcs11_engine_path,
2859 const char *pkcs11_module_path)
2861 char *pkcs11_engine_path_copy = NULL;
2862 char *pkcs11_module_path_copy = NULL;
2864 if (pkcs11_engine_path != NULL) {
2865 pkcs11_engine_path_copy = os_strdup(pkcs11_engine_path);
2866 if (pkcs11_engine_path_copy == NULL)
2869 if (pkcs11_module_path != NULL) {
2870 pkcs11_module_path_copy = os_strdup(pkcs11_module_path);
2871 if (pkcs11_module_path_copy == NULL) {
2872 os_free(pkcs11_engine_path_copy);
2877 os_free(wpa_s->conf->pkcs11_engine_path);
2878 os_free(wpa_s->conf->pkcs11_module_path);
2879 wpa_s->conf->pkcs11_engine_path = pkcs11_engine_path_copy;
2880 wpa_s->conf->pkcs11_module_path = pkcs11_module_path_copy;
2882 wpa_sm_set_eapol(wpa_s->wpa, NULL);
2883 eapol_sm_deinit(wpa_s->eapol);
2884 wpa_s->eapol = NULL;
2885 if (wpa_supplicant_init_eapol(wpa_s)) {
2886 /* Error -> Reset paths to the default value (NULL) once. */
2887 if (pkcs11_engine_path != NULL && pkcs11_module_path != NULL)
2888 wpas_set_pkcs11_engine_and_module_path(wpa_s, NULL,
2893 wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
2900 * wpa_supplicant_set_ap_scan - Set AP scan mode for interface
2901 * @wpa_s: wpa_supplicant structure for a network interface
2902 * @ap_scan: AP scan mode
2903 * Returns: 0 if succeed or -1 if ap_scan has an invalid value
2906 int wpa_supplicant_set_ap_scan(struct wpa_supplicant *wpa_s, int ap_scan)
2911 if (ap_scan < 0 || ap_scan > 2)
2914 if (ap_scan == 2 && os_strcmp(wpa_s->driver->name, "nl80211") == 0) {
2915 wpa_printf(MSG_INFO,
2916 "Note: nl80211 driver interface is not designed to be used with ap_scan=2; this can result in connection failures");
2920 if (ap_scan == 2 && ap_scan != wpa_s->conf->ap_scan &&
2921 wpa_s->wpa_state >= WPA_ASSOCIATING &&
2922 wpa_s->wpa_state < WPA_COMPLETED) {
2923 wpa_printf(MSG_ERROR, "ap_scan = %d (%d) rejected while "
2924 "associating", wpa_s->conf->ap_scan, ap_scan);
2927 #endif /* ANDROID */
2929 old_ap_scan = wpa_s->conf->ap_scan;
2930 wpa_s->conf->ap_scan = ap_scan;
2932 if (old_ap_scan != wpa_s->conf->ap_scan)
2933 wpas_notify_ap_scan_changed(wpa_s);
2940 * wpa_supplicant_set_bss_expiration_age - Set BSS entry expiration age
2941 * @wpa_s: wpa_supplicant structure for a network interface
2942 * @expire_age: Expiration age in seconds
2943 * Returns: 0 if succeed or -1 if expire_age has an invalid value
2946 int wpa_supplicant_set_bss_expiration_age(struct wpa_supplicant *wpa_s,
2947 unsigned int bss_expire_age)
2949 if (bss_expire_age < 10) {
2950 wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration age %u",
2954 wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration age: %d sec",
2956 wpa_s->conf->bss_expiration_age = bss_expire_age;
2963 * wpa_supplicant_set_bss_expiration_count - Set BSS entry expiration scan count
2964 * @wpa_s: wpa_supplicant structure for a network interface
2965 * @expire_count: number of scans after which an unseen BSS is reclaimed
2966 * Returns: 0 if succeed or -1 if expire_count has an invalid value
2969 int wpa_supplicant_set_bss_expiration_count(struct wpa_supplicant *wpa_s,
2970 unsigned int bss_expire_count)
2972 if (bss_expire_count < 1) {
2973 wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration count %u",
2977 wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration scan count: %u",
2979 wpa_s->conf->bss_expiration_scan_count = bss_expire_count;
2986 * wpa_supplicant_set_scan_interval - Set scan interval
2987 * @wpa_s: wpa_supplicant structure for a network interface
2988 * @scan_interval: scan interval in seconds
2989 * Returns: 0 if succeed or -1 if scan_interval has an invalid value
2992 int wpa_supplicant_set_scan_interval(struct wpa_supplicant *wpa_s,
2995 if (scan_interval < 0) {
2996 wpa_msg(wpa_s, MSG_ERROR, "Invalid scan interval %d",
3000 wpa_msg(wpa_s, MSG_DEBUG, "Setting scan interval: %d sec",
3002 wpa_supplicant_update_scan_int(wpa_s, scan_interval);
3009 * wpa_supplicant_set_debug_params - Set global debug params
3010 * @global: wpa_global structure
3011 * @debug_level: debug level
3012 * @debug_timestamp: determines if show timestamp in debug data
3013 * @debug_show_keys: determines if show keys in debug data
3014 * Returns: 0 if succeed or -1 if debug_level has wrong value
3016 int wpa_supplicant_set_debug_params(struct wpa_global *global, int debug_level,
3017 int debug_timestamp, int debug_show_keys)
3020 int old_level, old_timestamp, old_show_keys;
3022 /* check for allowed debuglevels */
3023 if (debug_level != MSG_EXCESSIVE &&
3024 debug_level != MSG_MSGDUMP &&
3025 debug_level != MSG_DEBUG &&
3026 debug_level != MSG_INFO &&
3027 debug_level != MSG_WARNING &&
3028 debug_level != MSG_ERROR)
3031 old_level = wpa_debug_level;
3032 old_timestamp = wpa_debug_timestamp;
3033 old_show_keys = wpa_debug_show_keys;
3035 wpa_debug_level = debug_level;
3036 wpa_debug_timestamp = debug_timestamp ? 1 : 0;
3037 wpa_debug_show_keys = debug_show_keys ? 1 : 0;
3039 if (wpa_debug_level != old_level)
3040 wpas_notify_debug_level_changed(global);
3041 if (wpa_debug_timestamp != old_timestamp)
3042 wpas_notify_debug_timestamp_changed(global);
3043 if (wpa_debug_show_keys != old_show_keys)
3044 wpas_notify_debug_show_keys_changed(global);
3051 * wpa_supplicant_get_ssid - Get a pointer to the current network structure
3052 * @wpa_s: Pointer to wpa_supplicant data
3053 * Returns: A pointer to the current network structure or %NULL on failure
3055 struct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s)
3057 struct wpa_ssid *entry;
3058 u8 ssid[SSID_MAX_LEN];
3064 res = wpa_drv_get_ssid(wpa_s, ssid);
3066 wpa_msg(wpa_s, MSG_WARNING, "Could not read SSID from "
3072 if (wpa_drv_get_bssid(wpa_s, bssid) < 0) {
3073 wpa_msg(wpa_s, MSG_WARNING, "Could not read BSSID from "
3078 wired = wpa_s->conf->ap_scan == 0 &&
3079 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED);
3081 entry = wpa_s->conf->ssid;
3083 if (!wpas_network_disabled(wpa_s, entry) &&
3084 ((ssid_len == entry->ssid_len &&
3085 os_memcmp(ssid, entry->ssid, ssid_len) == 0) || wired) &&
3086 (!entry->bssid_set ||
3087 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
3090 if (!wpas_network_disabled(wpa_s, entry) &&
3091 (entry->key_mgmt & WPA_KEY_MGMT_WPS) &&
3092 (entry->ssid == NULL || entry->ssid_len == 0) &&
3093 (!entry->bssid_set ||
3094 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
3096 #endif /* CONFIG_WPS */
3098 if (!wpas_network_disabled(wpa_s, entry) && entry->bssid_set &&
3099 entry->ssid_len == 0 &&
3100 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0)
3103 entry = entry->next;
3110 static int select_driver(struct wpa_supplicant *wpa_s, int i)
3112 struct wpa_global *global = wpa_s->global;
3114 if (wpa_drivers[i]->global_init && global->drv_priv[i] == NULL) {
3115 global->drv_priv[i] = wpa_drivers[i]->global_init();
3116 if (global->drv_priv[i] == NULL) {
3117 wpa_printf(MSG_ERROR, "Failed to initialize driver "
3118 "'%s'", wpa_drivers[i]->name);
3123 wpa_s->driver = wpa_drivers[i];
3124 wpa_s->global_drv_priv = global->drv_priv[i];
3130 static int wpa_supplicant_set_driver(struct wpa_supplicant *wpa_s,
3135 const char *pos, *driver = name;
3140 if (wpa_drivers[0] == NULL) {
3141 wpa_msg(wpa_s, MSG_ERROR, "No driver interfaces build into "
3147 /* default to first driver in the list */
3148 return select_driver(wpa_s, 0);
3152 pos = os_strchr(driver, ',');
3156 len = os_strlen(driver);
3158 for (i = 0; wpa_drivers[i]; i++) {
3159 if (os_strlen(wpa_drivers[i]->name) == len &&
3160 os_strncmp(driver, wpa_drivers[i]->name, len) ==
3162 /* First driver that succeeds wins */
3163 if (select_driver(wpa_s, i) == 0)
3171 wpa_msg(wpa_s, MSG_ERROR, "Unsupported driver '%s'", name);
3177 * wpa_supplicant_rx_eapol - Deliver a received EAPOL frame to wpa_supplicant
3178 * @ctx: Context pointer (wpa_s); this is the ctx variable registered
3179 * with struct wpa_driver_ops::init()
3180 * @src_addr: Source address of the EAPOL frame
3181 * @buf: EAPOL data starting from the EAPOL header (i.e., no Ethernet header)
3182 * @len: Length of the EAPOL data
3184 * This function is called for each received EAPOL frame. Most driver
3185 * interfaces rely on more generic OS mechanism for receiving frames through
3186 * l2_packet, but if such a mechanism is not available, the driver wrapper may
3187 * take care of received EAPOL frames and deliver them to the core supplicant
3188 * code by calling this function.
3190 void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr,
3191 const u8 *buf, size_t len)
3193 struct wpa_supplicant *wpa_s = ctx;
3195 wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR, MAC2STR(src_addr));
3196 wpa_hexdump(MSG_MSGDUMP, "RX EAPOL", buf, len);
3198 #ifdef CONFIG_PEERKEY
3199 if (wpa_s->wpa_state > WPA_ASSOCIATED && wpa_s->current_ssid &&
3200 wpa_s->current_ssid->peerkey &&
3201 !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) &&
3202 wpa_sm_rx_eapol_peerkey(wpa_s->wpa, src_addr, buf, len) == 1) {
3203 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: Processed PeerKey EAPOL-Key");
3206 #endif /* CONFIG_PEERKEY */
3208 if (wpa_s->wpa_state < WPA_ASSOCIATED ||
3209 (wpa_s->last_eapol_matches_bssid &&
3212 #endif /* CONFIG_AP */
3213 os_memcmp(src_addr, wpa_s->bssid, ETH_ALEN) != 0)) {
3215 * There is possible race condition between receiving the
3216 * association event and the EAPOL frame since they are coming
3217 * through different paths from the driver. In order to avoid
3218 * issues in trying to process the EAPOL frame before receiving
3219 * association information, lets queue it for processing until
3220 * the association event is received. This may also be needed in
3221 * driver-based roaming case, so also use src_addr != BSSID as a
3222 * trigger if we have previously confirmed that the
3223 * Authenticator uses BSSID as the src_addr (which is not the
3224 * case with wired IEEE 802.1X).
3226 wpa_dbg(wpa_s, MSG_DEBUG, "Not associated - Delay processing "
3227 "of received EAPOL frame (state=%s bssid=" MACSTR ")",
3228 wpa_supplicant_state_txt(wpa_s->wpa_state),
3229 MAC2STR(wpa_s->bssid));
3230 wpabuf_free(wpa_s->pending_eapol_rx);
3231 wpa_s->pending_eapol_rx = wpabuf_alloc_copy(buf, len);
3232 if (wpa_s->pending_eapol_rx) {
3233 os_get_reltime(&wpa_s->pending_eapol_rx_time);
3234 os_memcpy(wpa_s->pending_eapol_rx_src, src_addr,
3240 wpa_s->last_eapol_matches_bssid =
3241 os_memcmp(src_addr, wpa_s->bssid, ETH_ALEN) == 0;
3244 if (wpa_s->ap_iface) {
3245 wpa_supplicant_ap_rx_eapol(wpa_s, src_addr, buf, len);
3248 #endif /* CONFIG_AP */
3250 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE) {
3251 wpa_dbg(wpa_s, MSG_DEBUG, "Ignored received EAPOL frame since "
3252 "no key management is configured");
3256 if (wpa_s->eapol_received == 0 &&
3257 (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) ||
3258 !wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) ||
3259 wpa_s->wpa_state != WPA_COMPLETED) &&
3260 (wpa_s->current_ssid == NULL ||
3261 wpa_s->current_ssid->mode != IEEE80211_MODE_IBSS)) {
3262 /* Timeout for completing IEEE 802.1X and WPA authentication */
3265 if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) ||
3266 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA ||
3267 wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) {
3268 /* Use longer timeout for IEEE 802.1X/EAP */
3273 if (wpa_s->current_ssid && wpa_s->current_bss &&
3274 (wpa_s->current_ssid->key_mgmt & WPA_KEY_MGMT_WPS) &&
3275 eap_is_wps_pin_enrollee(&wpa_s->current_ssid->eap)) {
3277 * Use shorter timeout if going through WPS AP iteration
3278 * for PIN config method with an AP that does not
3279 * advertise Selected Registrar.
3281 struct wpabuf *wps_ie;
3283 wps_ie = wpa_bss_get_vendor_ie_multi(
3284 wpa_s->current_bss, WPS_IE_VENDOR_TYPE);
3286 !wps_is_addr_authorized(wps_ie, wpa_s->own_addr, 1))
3288 wpabuf_free(wps_ie);
3290 #endif /* CONFIG_WPS */
3292 wpa_supplicant_req_auth_timeout(wpa_s, timeout, 0);
3294 wpa_s->eapol_received++;
3296 if (wpa_s->countermeasures) {
3297 wpa_msg(wpa_s, MSG_INFO, "WPA: Countermeasures - dropped "
3302 #ifdef CONFIG_IBSS_RSN
3303 if (wpa_s->current_ssid &&
3304 wpa_s->current_ssid->mode == WPAS_MODE_IBSS) {
3305 ibss_rsn_rx_eapol(wpa_s->ibss_rsn, src_addr, buf, len);
3308 #endif /* CONFIG_IBSS_RSN */
3310 /* Source address of the incoming EAPOL frame could be compared to the
3311 * current BSSID. However, it is possible that a centralized
3312 * Authenticator could be using another MAC address than the BSSID of
3313 * an AP, so just allow any address to be used for now. The replies are
3314 * still sent to the current BSSID (if available), though. */
3316 os_memcpy(wpa_s->last_eapol_src, src_addr, ETH_ALEN);
3317 if (!wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) &&
3318 eapol_sm_rx_eapol(wpa_s->eapol, src_addr, buf, len) > 0)
3320 wpa_drv_poll(wpa_s);
3321 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE))
3322 wpa_sm_rx_eapol(wpa_s->wpa, src_addr, buf, len);
3323 else if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt)) {
3325 * Set portValid = TRUE here since we are going to skip 4-way
3326 * handshake processing which would normally set portValid. We
3327 * need this to allow the EAPOL state machines to be completed
3328 * without going through EAPOL-Key handshake.
3330 eapol_sm_notify_portValid(wpa_s->eapol, TRUE);
3335 int wpa_supplicant_update_mac_addr(struct wpa_supplicant *wpa_s)
3337 if ((!wpa_s->p2p_mgmt ||
3338 !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)) &&
3339 !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE)) {
3340 l2_packet_deinit(wpa_s->l2);
3341 wpa_s->l2 = l2_packet_init(wpa_s->ifname,
3342 wpa_drv_get_mac_addr(wpa_s),
3344 wpa_supplicant_rx_eapol, wpa_s, 0);
3345 if (wpa_s->l2 == NULL)
3348 const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
3350 os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
3353 if (wpa_s->l2 && l2_packet_get_own_addr(wpa_s->l2, wpa_s->own_addr)) {
3354 wpa_msg(wpa_s, MSG_ERROR, "Failed to get own L2 address");
3358 wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
3364 static void wpa_supplicant_rx_eapol_bridge(void *ctx, const u8 *src_addr,
3365 const u8 *buf, size_t len)
3367 struct wpa_supplicant *wpa_s = ctx;
3368 const struct l2_ethhdr *eth;
3370 if (len < sizeof(*eth))
3372 eth = (const struct l2_ethhdr *) buf;
3374 if (os_memcmp(eth->h_dest, wpa_s->own_addr, ETH_ALEN) != 0 &&
3375 !(eth->h_dest[0] & 0x01)) {
3376 wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR " to " MACSTR
3377 " (bridge - not for this interface - ignore)",
3378 MAC2STR(src_addr), MAC2STR(eth->h_dest));
3382 wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR " to " MACSTR
3383 " (bridge)", MAC2STR(src_addr), MAC2STR(eth->h_dest));
3384 wpa_supplicant_rx_eapol(wpa_s, src_addr, buf + sizeof(*eth),
3385 len - sizeof(*eth));
3390 * wpa_supplicant_driver_init - Initialize driver interface parameters
3391 * @wpa_s: Pointer to wpa_supplicant data
3392 * Returns: 0 on success, -1 on failure
3394 * This function is called to initialize driver interface parameters.
3395 * wpa_drv_init() must have been called before this function to initialize the
3398 int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s)
3400 static int interface_count = 0;
3402 if (wpa_supplicant_update_mac_addr(wpa_s) < 0)
3405 wpa_dbg(wpa_s, MSG_DEBUG, "Own MAC address: " MACSTR,
3406 MAC2STR(wpa_s->own_addr));
3407 os_memcpy(wpa_s->perm_addr, wpa_s->own_addr, ETH_ALEN);
3408 wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
3410 if (wpa_s->bridge_ifname[0]) {
3411 wpa_dbg(wpa_s, MSG_DEBUG, "Receiving packets from bridge "
3412 "interface '%s'", wpa_s->bridge_ifname);
3413 wpa_s->l2_br = l2_packet_init_bridge(
3414 wpa_s->bridge_ifname, wpa_s->ifname, wpa_s->own_addr,
3415 ETH_P_EAPOL, wpa_supplicant_rx_eapol_bridge, wpa_s, 1);
3416 if (wpa_s->l2_br == NULL) {
3417 wpa_msg(wpa_s, MSG_ERROR, "Failed to open l2_packet "
3418 "connection for the bridge interface '%s'",
3419 wpa_s->bridge_ifname);
3424 if (wpa_s->conf->ap_scan == 2 &&
3425 os_strcmp(wpa_s->driver->name, "nl80211") == 0) {
3426 wpa_printf(MSG_INFO,
3427 "Note: nl80211 driver interface is not designed to be used with ap_scan=2; this can result in connection failures");
3430 wpa_clear_keys(wpa_s, NULL);
3432 /* Make sure that TKIP countermeasures are not left enabled (could
3433 * happen if wpa_supplicant is killed during countermeasures. */
3434 wpa_drv_set_countermeasures(wpa_s, 0);
3436 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: flushing PMKID list in the driver");
3437 wpa_drv_flush_pmkid(wpa_s);
3439 wpa_s->prev_scan_ssid = WILDCARD_SSID_SCAN;
3440 wpa_s->prev_scan_wildcard = 0;
3442 if (wpa_supplicant_enabled_networks(wpa_s)) {
3443 if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
3444 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
3445 interface_count = 0;
3448 if (!wpa_s->p2p_mgmt &&
3449 wpa_supplicant_delayed_sched_scan(wpa_s,
3450 interface_count % 3,
3452 wpa_supplicant_req_scan(wpa_s, interface_count % 3,
3454 #endif /* ANDROID */
3457 wpa_supplicant_set_state(wpa_s, WPA_INACTIVE);
3463 static int wpa_supplicant_daemon(const char *pid_file)
3465 wpa_printf(MSG_DEBUG, "Daemonize..");
3466 return os_daemonize(pid_file);
3470 static struct wpa_supplicant *
3471 wpa_supplicant_alloc(struct wpa_supplicant *parent)
3473 struct wpa_supplicant *wpa_s;
3475 wpa_s = os_zalloc(sizeof(*wpa_s));
3478 wpa_s->scan_req = INITIAL_SCAN_REQ;
3479 wpa_s->scan_interval = 5;
3480 wpa_s->new_connection = 1;
3481 wpa_s->parent = parent ? parent : wpa_s;
3482 wpa_s->sched_scanning = 0;
3488 #ifdef CONFIG_HT_OVERRIDES
3490 static int wpa_set_htcap_mcs(struct wpa_supplicant *wpa_s,
3491 struct ieee80211_ht_capabilities *htcaps,
3492 struct ieee80211_ht_capabilities *htcaps_mask,
3495 /* parse ht_mcs into hex array */
3497 const char *tmp = ht_mcs;
3500 /* If ht_mcs is null, do not set anything */
3504 /* This is what we are setting in the kernel */
3505 os_memset(&htcaps->supported_mcs_set, 0, IEEE80211_HT_MCS_MASK_LEN);
3507 wpa_msg(wpa_s, MSG_DEBUG, "set_htcap, ht_mcs -:%s:-", ht_mcs);
3509 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
3511 long v = strtol(tmp, &end, 16);
3513 wpa_msg(wpa_s, MSG_DEBUG,
3514 "htcap value[%i]: %ld end: %p tmp: %p",
3519 htcaps->supported_mcs_set[i] = v;
3522 wpa_msg(wpa_s, MSG_ERROR,
3523 "Failed to parse ht-mcs: %s, error: %s\n",
3524 ht_mcs, strerror(errno));
3530 * If we were able to parse any values, then set mask for the MCS set.
3533 os_memset(&htcaps_mask->supported_mcs_set, 0xff,
3534 IEEE80211_HT_MCS_MASK_LEN - 1);
3535 /* skip the 3 reserved bits */
3536 htcaps_mask->supported_mcs_set[IEEE80211_HT_MCS_MASK_LEN - 1] =
3544 static int wpa_disable_max_amsdu(struct wpa_supplicant *wpa_s,
3545 struct ieee80211_ht_capabilities *htcaps,
3546 struct ieee80211_ht_capabilities *htcaps_mask,
3551 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_max_amsdu: %d", disabled);
3556 msk = host_to_le16(HT_CAP_INFO_MAX_AMSDU_SIZE);
3557 htcaps_mask->ht_capabilities_info |= msk;
3559 htcaps->ht_capabilities_info &= msk;
3561 htcaps->ht_capabilities_info |= msk;
3567 static int wpa_set_ampdu_factor(struct wpa_supplicant *wpa_s,
3568 struct ieee80211_ht_capabilities *htcaps,
3569 struct ieee80211_ht_capabilities *htcaps_mask,
3572 wpa_msg(wpa_s, MSG_DEBUG, "set_ampdu_factor: %d", factor);
3577 if (factor < 0 || factor > 3) {
3578 wpa_msg(wpa_s, MSG_ERROR, "ampdu_factor: %d out of range. "
3579 "Must be 0-3 or -1", factor);
3583 htcaps_mask->a_mpdu_params |= 0x3; /* 2 bits for factor */
3584 htcaps->a_mpdu_params &= ~0x3;
3585 htcaps->a_mpdu_params |= factor & 0x3;
3591 static int wpa_set_ampdu_density(struct wpa_supplicant *wpa_s,
3592 struct ieee80211_ht_capabilities *htcaps,
3593 struct ieee80211_ht_capabilities *htcaps_mask,
3596 wpa_msg(wpa_s, MSG_DEBUG, "set_ampdu_density: %d", density);
3601 if (density < 0 || density > 7) {
3602 wpa_msg(wpa_s, MSG_ERROR,
3603 "ampdu_density: %d out of range. Must be 0-7 or -1.",
3608 htcaps_mask->a_mpdu_params |= 0x1C;
3609 htcaps->a_mpdu_params &= ~(0x1C);
3610 htcaps->a_mpdu_params |= (density << 2) & 0x1C;
3616 static int wpa_set_disable_ht40(struct wpa_supplicant *wpa_s,
3617 struct ieee80211_ht_capabilities *htcaps,
3618 struct ieee80211_ht_capabilities *htcaps_mask,
3621 /* Masking these out disables HT40 */
3622 le16 msk = host_to_le16(HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET |
3623 HT_CAP_INFO_SHORT_GI40MHZ);
3625 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_ht40: %d", disabled);
3628 htcaps->ht_capabilities_info &= ~msk;
3630 htcaps->ht_capabilities_info |= msk;
3632 htcaps_mask->ht_capabilities_info |= msk;
3638 static int wpa_set_disable_sgi(struct wpa_supplicant *wpa_s,
3639 struct ieee80211_ht_capabilities *htcaps,
3640 struct ieee80211_ht_capabilities *htcaps_mask,
3643 /* Masking these out disables SGI */
3644 le16 msk = host_to_le16(HT_CAP_INFO_SHORT_GI20MHZ |
3645 HT_CAP_INFO_SHORT_GI40MHZ);
3647 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_sgi: %d", disabled);
3650 htcaps->ht_capabilities_info &= ~msk;
3652 htcaps->ht_capabilities_info |= msk;
3654 htcaps_mask->ht_capabilities_info |= msk;
3660 static int wpa_set_disable_ldpc(struct wpa_supplicant *wpa_s,
3661 struct ieee80211_ht_capabilities *htcaps,
3662 struct ieee80211_ht_capabilities *htcaps_mask,
3665 /* Masking these out disables LDPC */
3666 le16 msk = host_to_le16(HT_CAP_INFO_LDPC_CODING_CAP);
3668 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_ldpc: %d", disabled);
3671 htcaps->ht_capabilities_info &= ~msk;
3673 htcaps->ht_capabilities_info |= msk;
3675 htcaps_mask->ht_capabilities_info |= msk;
3681 void wpa_supplicant_apply_ht_overrides(
3682 struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
3683 struct wpa_driver_associate_params *params)
3685 struct ieee80211_ht_capabilities *htcaps;
3686 struct ieee80211_ht_capabilities *htcaps_mask;
3691 params->disable_ht = ssid->disable_ht;
3692 if (!params->htcaps || !params->htcaps_mask)
3695 htcaps = (struct ieee80211_ht_capabilities *) params->htcaps;
3696 htcaps_mask = (struct ieee80211_ht_capabilities *) params->htcaps_mask;
3697 wpa_set_htcap_mcs(wpa_s, htcaps, htcaps_mask, ssid->ht_mcs);
3698 wpa_disable_max_amsdu(wpa_s, htcaps, htcaps_mask,
3699 ssid->disable_max_amsdu);
3700 wpa_set_ampdu_factor(wpa_s, htcaps, htcaps_mask, ssid->ampdu_factor);
3701 wpa_set_ampdu_density(wpa_s, htcaps, htcaps_mask, ssid->ampdu_density);
3702 wpa_set_disable_ht40(wpa_s, htcaps, htcaps_mask, ssid->disable_ht40);
3703 wpa_set_disable_sgi(wpa_s, htcaps, htcaps_mask, ssid->disable_sgi);
3704 wpa_set_disable_ldpc(wpa_s, htcaps, htcaps_mask, ssid->disable_ldpc);
3706 if (ssid->ht40_intolerant) {
3707 le16 bit = host_to_le16(HT_CAP_INFO_40MHZ_INTOLERANT);
3708 htcaps->ht_capabilities_info |= bit;
3709 htcaps_mask->ht_capabilities_info |= bit;
3713 #endif /* CONFIG_HT_OVERRIDES */
3716 #ifdef CONFIG_VHT_OVERRIDES
3717 void wpa_supplicant_apply_vht_overrides(
3718 struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
3719 struct wpa_driver_associate_params *params)
3721 struct ieee80211_vht_capabilities *vhtcaps;
3722 struct ieee80211_vht_capabilities *vhtcaps_mask;
3727 params->disable_vht = ssid->disable_vht;
3729 vhtcaps = (void *) params->vhtcaps;
3730 vhtcaps_mask = (void *) params->vhtcaps_mask;
3732 if (!vhtcaps || !vhtcaps_mask)
3735 vhtcaps->vht_capabilities_info = ssid->vht_capa;
3736 vhtcaps_mask->vht_capabilities_info = ssid->vht_capa_mask;
3738 #ifdef CONFIG_HT_OVERRIDES
3739 /* if max ampdu is <= 3, we have to make the HT cap the same */
3740 if (ssid->vht_capa_mask & VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX) {
3743 max_ampdu = (ssid->vht_capa &
3744 VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX) >>
3745 VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX_SHIFT;
3747 max_ampdu = max_ampdu < 3 ? max_ampdu : 3;
3748 wpa_set_ampdu_factor(wpa_s,
3749 (void *) params->htcaps,
3750 (void *) params->htcaps_mask,
3753 #endif /* CONFIG_HT_OVERRIDES */
3755 #define OVERRIDE_MCS(i) \
3756 if (ssid->vht_tx_mcs_nss_ ##i >= 0) { \
3757 vhtcaps_mask->vht_supported_mcs_set.tx_map |= \
3759 vhtcaps->vht_supported_mcs_set.tx_map |= \
3760 ssid->vht_tx_mcs_nss_ ##i << 2 * (i - 1); \
3762 if (ssid->vht_rx_mcs_nss_ ##i >= 0) { \
3763 vhtcaps_mask->vht_supported_mcs_set.rx_map |= \
3765 vhtcaps->vht_supported_mcs_set.rx_map |= \
3766 ssid->vht_rx_mcs_nss_ ##i << 2 * (i - 1); \
3778 #endif /* CONFIG_VHT_OVERRIDES */
3781 static int pcsc_reader_init(struct wpa_supplicant *wpa_s)
3786 if (!wpa_s->conf->pcsc_reader)
3789 wpa_s->scard = scard_init(wpa_s->conf->pcsc_reader);
3793 if (wpa_s->conf->pcsc_pin &&
3794 scard_set_pin(wpa_s->scard, wpa_s->conf->pcsc_pin) < 0) {
3795 scard_deinit(wpa_s->scard);
3796 wpa_s->scard = NULL;
3797 wpa_msg(wpa_s, MSG_ERROR, "PC/SC PIN validation failed");
3801 len = sizeof(wpa_s->imsi) - 1;
3802 if (scard_get_imsi(wpa_s->scard, wpa_s->imsi, &len)) {
3803 scard_deinit(wpa_s->scard);
3804 wpa_s->scard = NULL;
3805 wpa_msg(wpa_s, MSG_ERROR, "Could not read IMSI");
3808 wpa_s->imsi[len] = '\0';
3810 wpa_s->mnc_len = scard_get_mnc_len(wpa_s->scard);
3812 wpa_printf(MSG_DEBUG, "SCARD: IMSI %s (MNC length %d)",
3813 wpa_s->imsi, wpa_s->mnc_len);
3815 wpa_sm_set_scard_ctx(wpa_s->wpa, wpa_s->scard);
3816 eapol_sm_register_scard_ctx(wpa_s->eapol, wpa_s->scard);
3817 #endif /* PCSC_FUNCS */
3823 int wpas_init_ext_pw(struct wpa_supplicant *wpa_s)
3827 ext_password_deinit(wpa_s->ext_pw);
3828 wpa_s->ext_pw = NULL;
3829 eapol_sm_set_ext_pw_ctx(wpa_s->eapol, NULL);
3831 if (!wpa_s->conf->ext_password_backend)
3834 val = os_strdup(wpa_s->conf->ext_password_backend);
3837 pos = os_strchr(val, ':');
3841 wpa_printf(MSG_DEBUG, "EXT PW: Initialize backend '%s'", val);
3843 wpa_s->ext_pw = ext_password_init(val, pos);
3845 if (wpa_s->ext_pw == NULL) {
3846 wpa_printf(MSG_DEBUG, "EXT PW: Failed to initialize backend");
3849 eapol_sm_set_ext_pw_ctx(wpa_s->eapol, wpa_s->ext_pw);
3857 static const u8 * wpas_fst_get_bssid_cb(void *ctx)
3859 struct wpa_supplicant *wpa_s = ctx;
3861 return (is_zero_ether_addr(wpa_s->bssid) ||
3862 wpa_s->wpa_state != WPA_COMPLETED) ? NULL : wpa_s->bssid;
3866 static void wpas_fst_get_channel_info_cb(void *ctx,
3867 enum hostapd_hw_mode *hw_mode,
3870 struct wpa_supplicant *wpa_s = ctx;
3872 if (wpa_s->current_bss) {
3873 *hw_mode = ieee80211_freq_to_chan(wpa_s->current_bss->freq,
3875 } else if (wpa_s->hw.num_modes) {
3876 *hw_mode = wpa_s->hw.modes[0].mode;
3884 static int wpas_fst_get_hw_modes(void *ctx, struct hostapd_hw_modes **modes)
3886 struct wpa_supplicant *wpa_s = ctx;
3888 *modes = wpa_s->hw.modes;
3889 return wpa_s->hw.num_modes;
3893 static void wpas_fst_set_ies_cb(void *ctx, const struct wpabuf *fst_ies)
3895 struct wpa_supplicant *wpa_s = ctx;
3897 wpa_hexdump_buf(MSG_DEBUG, "FST: Set IEs", fst_ies);
3898 wpa_s->fst_ies = fst_ies;
3902 static int wpas_fst_send_action_cb(void *ctx, const u8 *da, struct wpabuf *data)
3904 struct wpa_supplicant *wpa_s = ctx;
3906 WPA_ASSERT(os_memcmp(wpa_s->bssid, da, ETH_ALEN) == 0);
3907 return wpa_drv_send_action(wpa_s, wpa_s->assoc_freq, 0, wpa_s->bssid,
3908 wpa_s->own_addr, wpa_s->bssid,
3909 wpabuf_head(data), wpabuf_len(data),
3914 static const struct wpabuf * wpas_fst_get_mb_ie_cb(void *ctx, const u8 *addr)
3916 struct wpa_supplicant *wpa_s = ctx;
3918 WPA_ASSERT(os_memcmp(wpa_s->bssid, addr, ETH_ALEN) == 0);
3919 return wpa_s->received_mb_ies;
3923 static void wpas_fst_update_mb_ie_cb(void *ctx, const u8 *addr,
3924 const u8 *buf, size_t size)
3926 struct wpa_supplicant *wpa_s = ctx;
3927 struct mb_ies_info info;
3929 WPA_ASSERT(os_memcmp(wpa_s->bssid, addr, ETH_ALEN) == 0);
3931 if (!mb_ies_info_by_ies(&info, buf, size)) {
3932 wpabuf_free(wpa_s->received_mb_ies);
3933 wpa_s->received_mb_ies = mb_ies_by_info(&info);
3938 const u8 * wpas_fst_get_peer_first(void *ctx, struct fst_get_peer_ctx **get_ctx,
3941 struct wpa_supplicant *wpa_s = ctx;
3944 if (!is_zero_ether_addr(wpa_s->bssid))
3945 return (wpa_s->received_mb_ies || !mb_only) ?
3946 wpa_s->bssid : NULL;
3951 const u8 * wpas_fst_get_peer_next(void *ctx, struct fst_get_peer_ctx **get_ctx,
3957 void fst_wpa_supplicant_fill_iface_obj(struct wpa_supplicant *wpa_s,
3958 struct fst_wpa_obj *iface_obj)
3960 iface_obj->ctx = wpa_s;
3961 iface_obj->get_bssid = wpas_fst_get_bssid_cb;
3962 iface_obj->get_channel_info = wpas_fst_get_channel_info_cb;
3963 iface_obj->get_hw_modes = wpas_fst_get_hw_modes;
3964 iface_obj->set_ies = wpas_fst_set_ies_cb;
3965 iface_obj->send_action = wpas_fst_send_action_cb;
3966 iface_obj->get_mb_ie = wpas_fst_get_mb_ie_cb;
3967 iface_obj->update_mb_ie = wpas_fst_update_mb_ie_cb;
3968 iface_obj->get_peer_first = wpas_fst_get_peer_first;
3969 iface_obj->get_peer_next = wpas_fst_get_peer_next;
3971 #endif /* CONFIG_FST */
3973 static int wpas_set_wowlan_triggers(struct wpa_supplicant *wpa_s,
3974 const struct wpa_driver_capa *capa)
3976 struct wowlan_triggers *triggers;
3979 if (!wpa_s->conf->wowlan_triggers)
3982 triggers = wpa_get_wowlan_triggers(wpa_s->conf->wowlan_triggers, capa);
3984 ret = wpa_drv_wowlan(wpa_s, triggers);
3991 static enum wpa_radio_work_band wpas_freq_to_band(int freq)
3994 return BAND_2_4_GHZ;
4001 static unsigned int wpas_get_bands(struct wpa_supplicant *wpa_s,
4005 unsigned int band = 0;
4008 /* freqs are specified for the radio work */
4009 for (i = 0; freqs[i]; i++)
4010 band |= wpas_freq_to_band(freqs[i]);
4013 * freqs are not specified, implies all
4014 * the supported freqs by HW
4016 for (i = 0; i < wpa_s->hw.num_modes; i++) {
4017 if (wpa_s->hw.modes[i].num_channels != 0) {
4018 if (wpa_s->hw.modes[i].mode ==
4019 HOSTAPD_MODE_IEEE80211B ||
4020 wpa_s->hw.modes[i].mode ==
4021 HOSTAPD_MODE_IEEE80211G)
4022 band |= BAND_2_4_GHZ;
4023 else if (wpa_s->hw.modes[i].mode ==
4024 HOSTAPD_MODE_IEEE80211A)
4026 else if (wpa_s->hw.modes[i].mode ==
4027 HOSTAPD_MODE_IEEE80211AD)
4028 band |= BAND_60_GHZ;
4029 else if (wpa_s->hw.modes[i].mode ==
4030 HOSTAPD_MODE_IEEE80211ANY)
4031 band = BAND_2_4_GHZ | BAND_5_GHZ |
4041 static struct wpa_radio * radio_add_interface(struct wpa_supplicant *wpa_s,
4044 struct wpa_supplicant *iface = wpa_s->global->ifaces;
4045 struct wpa_radio *radio;
4047 while (rn && iface) {
4048 radio = iface->radio;
4049 if (radio && os_strcmp(rn, radio->name) == 0) {
4050 wpa_printf(MSG_DEBUG, "Add interface %s to existing radio %s",
4052 dl_list_add(&radio->ifaces, &wpa_s->radio_list);
4056 iface = iface->next;
4059 wpa_printf(MSG_DEBUG, "Add interface %s to a new radio %s",
4060 wpa_s->ifname, rn ? rn : "N/A");
4061 radio = os_zalloc(sizeof(*radio));
4066 os_strlcpy(radio->name, rn, sizeof(radio->name));
4067 dl_list_init(&radio->ifaces);
4068 dl_list_init(&radio->work);
4069 dl_list_add(&radio->ifaces, &wpa_s->radio_list);
4075 static void radio_work_free(struct wpa_radio_work *work)
4077 if (work->wpa_s->scan_work == work) {
4078 /* This should not really happen. */
4079 wpa_dbg(work->wpa_s, MSG_INFO, "Freeing radio work '%s'@%p (started=%d) that is marked as scan_work",
4080 work->type, work, work->started);
4081 work->wpa_s->scan_work = NULL;
4085 if (work->wpa_s->p2p_scan_work == work) {
4086 /* This should not really happen. */
4087 wpa_dbg(work->wpa_s, MSG_INFO, "Freeing radio work '%s'@%p (started=%d) that is marked as p2p_scan_work",
4088 work->type, work, work->started);
4089 work->wpa_s->p2p_scan_work = NULL;
4091 #endif /* CONFIG_P2P */
4093 if (work->started) {
4094 work->wpa_s->radio->num_active_works--;
4095 wpa_dbg(work->wpa_s, MSG_DEBUG,
4096 "radio_work_free('%s'@%p: num_active_works --> %u",
4098 work->wpa_s->radio->num_active_works);
4101 dl_list_del(&work->list);
4106 static struct wpa_radio_work * radio_work_get_next_work(struct wpa_radio *radio)
4108 struct wpa_radio_work *active_work = NULL;
4109 struct wpa_radio_work *tmp;
4111 /* Get the active work to know the type and band. */
4112 dl_list_for_each(tmp, &radio->work, struct wpa_radio_work, list) {
4120 /* No active work, start one */
4121 radio->num_active_works = 0;
4122 dl_list_for_each(tmp, &radio->work, struct wpa_radio_work,
4124 if (os_strcmp(tmp->type, "scan") == 0 &&
4125 radio->external_scan_running &&
4126 (((struct wpa_driver_scan_params *)
4127 tmp->ctx)->only_new_results ||
4128 tmp->wpa_s->clear_driver_scan_cache))
4135 if (os_strcmp(active_work->type, "sme-connect") == 0 ||
4136 os_strcmp(active_work->type, "connect") == 0) {
4138 * If the active work is either connect or sme-connect,
4139 * do not parallelize them with other radio works.
4141 wpa_dbg(active_work->wpa_s, MSG_DEBUG,
4142 "Do not parallelize radio work with %s",
4147 dl_list_for_each(tmp, &radio->work, struct wpa_radio_work, list) {
4152 * If connect or sme-connect are enqueued, parallelize only
4153 * those operations ahead of them in the queue.
4155 if (os_strcmp(tmp->type, "connect") == 0 ||
4156 os_strcmp(tmp->type, "sme-connect") == 0)
4160 * Check that the radio works are distinct and
4161 * on different bands.
4163 if (os_strcmp(active_work->type, tmp->type) != 0 &&
4164 (active_work->bands != tmp->bands)) {
4166 * If a scan has to be scheduled through nl80211 scan
4167 * interface and if an external scan is already running,
4168 * do not schedule the scan since it is likely to get
4169 * rejected by kernel.
4171 if (os_strcmp(tmp->type, "scan") == 0 &&
4172 radio->external_scan_running &&
4173 (((struct wpa_driver_scan_params *)
4174 tmp->ctx)->only_new_results ||
4175 tmp->wpa_s->clear_driver_scan_cache))
4178 wpa_dbg(active_work->wpa_s, MSG_DEBUG,
4179 "active_work:%s new_work:%s",
4180 active_work->type, tmp->type);
4185 /* Did not find a radio work to schedule in parallel. */
4190 static void radio_start_next_work(void *eloop_ctx, void *timeout_ctx)
4192 struct wpa_radio *radio = eloop_ctx;
4193 struct wpa_radio_work *work;
4194 struct os_reltime now, diff;
4195 struct wpa_supplicant *wpa_s;
4197 work = dl_list_first(&radio->work, struct wpa_radio_work, list);
4199 radio->num_active_works = 0;
4203 wpa_s = dl_list_first(&radio->ifaces, struct wpa_supplicant,
4207 wpa_s->drv_flags & WPA_DRIVER_FLAGS_OFFCHANNEL_SIMULTANEOUS)) {
4209 return; /* already started and still in progress */
4211 if (wpa_s && wpa_s->radio->external_scan_running) {
4212 wpa_printf(MSG_DEBUG, "Delay radio work start until externally triggered scan completes");
4217 if (radio->num_active_works < MAX_ACTIVE_WORKS) {
4218 /* get the work to schedule next */
4219 work = radio_work_get_next_work(radio);
4225 wpa_s = work->wpa_s;
4226 os_get_reltime(&now);
4227 os_reltime_sub(&now, &work->time, &diff);
4228 wpa_dbg(wpa_s, MSG_DEBUG,
4229 "Starting radio work '%s'@%p after %ld.%06ld second wait",
4230 work->type, work, diff.sec, diff.usec);
4233 radio->num_active_works++;
4237 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_OFFCHANNEL_SIMULTANEOUS) &&
4238 radio->num_active_works < MAX_ACTIVE_WORKS)
4239 radio_work_check_next(wpa_s);
4244 * This function removes both started and pending radio works running on
4245 * the provided interface's radio.
4246 * Prior to the removal of the radio work, its callback (cb) is called with
4247 * deinit set to be 1. Each work's callback is responsible for clearing its
4248 * internal data and restoring to a correct state.
4249 * @wpa_s: wpa_supplicant data
4250 * @type: type of works to be removed
4251 * @remove_all: 1 to remove all the works on this radio, 0 to remove only
4252 * this interface's works.
4254 void radio_remove_works(struct wpa_supplicant *wpa_s,
4255 const char *type, int remove_all)
4257 struct wpa_radio_work *work, *tmp;
4258 struct wpa_radio *radio = wpa_s->radio;
4260 dl_list_for_each_safe(work, tmp, &radio->work, struct wpa_radio_work,
4262 if (type && os_strcmp(type, work->type) != 0)
4265 /* skip other ifaces' works */
4266 if (!remove_all && work->wpa_s != wpa_s)
4269 wpa_dbg(wpa_s, MSG_DEBUG, "Remove radio work '%s'@%p%s",
4270 work->type, work, work->started ? " (started)" : "");
4272 radio_work_free(work);
4275 /* in case we removed the started work */
4276 radio_work_check_next(wpa_s);
4280 static void radio_remove_interface(struct wpa_supplicant *wpa_s)
4282 struct wpa_radio *radio = wpa_s->radio;
4287 wpa_printf(MSG_DEBUG, "Remove interface %s from radio %s",
4288 wpa_s->ifname, radio->name);
4289 dl_list_del(&wpa_s->radio_list);
4290 radio_remove_works(wpa_s, NULL, 0);
4291 wpa_s->radio = NULL;
4292 if (!dl_list_empty(&radio->ifaces))
4293 return; /* Interfaces remain for this radio */
4295 wpa_printf(MSG_DEBUG, "Remove radio %s", radio->name);
4296 eloop_cancel_timeout(radio_start_next_work, radio, NULL);
4301 void radio_work_check_next(struct wpa_supplicant *wpa_s)
4303 struct wpa_radio *radio = wpa_s->radio;
4305 if (dl_list_empty(&radio->work))
4307 if (wpa_s->ext_work_in_progress) {
4308 wpa_printf(MSG_DEBUG,
4309 "External radio work in progress - delay start of pending item");
4312 eloop_cancel_timeout(radio_start_next_work, radio, NULL);
4313 eloop_register_timeout(0, 0, radio_start_next_work, radio, NULL);
4318 * radio_add_work - Add a radio work item
4319 * @wpa_s: Pointer to wpa_supplicant data
4320 * @freq: Frequency of the offchannel operation in MHz or 0
4321 * @type: Unique identifier for each type of work
4322 * @next: Force as the next work to be executed
4323 * @cb: Callback function for indicating when radio is available
4324 * @ctx: Context pointer for the work (work->ctx in cb())
4325 * Returns: 0 on success, -1 on failure
4327 * This function is used to request time for an operation that requires
4328 * exclusive radio control. Once the radio is available, the registered callback
4329 * function will be called. radio_work_done() must be called once the exclusive
4330 * radio operation has been completed, so that the radio is freed for other
4331 * operations. The special case of deinit=1 is used to free the context data
4332 * during interface removal. That does not allow the callback function to start
4333 * the radio operation, i.e., it must free any resources allocated for the radio
4336 * The @freq parameter can be used to indicate a single channel on which the
4337 * offchannel operation will occur. This may allow multiple radio work
4338 * operations to be performed in parallel if they apply for the same channel.
4339 * Setting this to 0 indicates that the work item may use multiple channels or
4340 * requires exclusive control of the radio.
4342 int radio_add_work(struct wpa_supplicant *wpa_s, unsigned int freq,
4343 const char *type, int next,
4344 void (*cb)(struct wpa_radio_work *work, int deinit),
4347 struct wpa_radio *radio = wpa_s->radio;
4348 struct wpa_radio_work *work;
4351 work = os_zalloc(sizeof(*work));
4354 wpa_dbg(wpa_s, MSG_DEBUG, "Add radio work '%s'@%p", type, work);
4355 os_get_reltime(&work->time);
4358 work->wpa_s = wpa_s;
4363 work->bands = wpas_freq_to_band(freq);
4364 else if (os_strcmp(type, "scan") == 0 ||
4365 os_strcmp(type, "p2p-scan") == 0)
4366 work->bands = wpas_get_bands(wpa_s,
4367 ((struct wpa_driver_scan_params *)
4370 work->bands = wpas_get_bands(wpa_s, NULL);
4372 was_empty = dl_list_empty(&wpa_s->radio->work);
4374 dl_list_add(&wpa_s->radio->work, &work->list);
4376 dl_list_add_tail(&wpa_s->radio->work, &work->list);
4378 wpa_dbg(wpa_s, MSG_DEBUG, "First radio work item in the queue - schedule start immediately");
4379 radio_work_check_next(wpa_s);
4380 } else if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_OFFCHANNEL_SIMULTANEOUS)
4381 && radio->num_active_works < MAX_ACTIVE_WORKS) {
4382 wpa_dbg(wpa_s, MSG_DEBUG,
4383 "Try to schedule a radio work (num_active_works=%u)",
4384 radio->num_active_works);
4385 radio_work_check_next(wpa_s);
4393 * radio_work_done - Indicate that a radio work item has been completed
4394 * @work: Completed work
4396 * This function is called once the callback function registered with
4397 * radio_add_work() has completed its work.
4399 void radio_work_done(struct wpa_radio_work *work)
4401 struct wpa_supplicant *wpa_s = work->wpa_s;
4402 struct os_reltime now, diff;
4403 unsigned int started = work->started;
4405 os_get_reltime(&now);
4406 os_reltime_sub(&now, &work->time, &diff);
4407 wpa_dbg(wpa_s, MSG_DEBUG, "Radio work '%s'@%p %s in %ld.%06ld seconds",
4408 work->type, work, started ? "done" : "canceled",
4409 diff.sec, diff.usec);
4410 radio_work_free(work);
4412 radio_work_check_next(wpa_s);
4416 struct wpa_radio_work *
4417 radio_work_pending(struct wpa_supplicant *wpa_s, const char *type)
4419 struct wpa_radio_work *work;
4420 struct wpa_radio *radio = wpa_s->radio;
4422 dl_list_for_each(work, &radio->work, struct wpa_radio_work, list) {
4423 if (work->wpa_s == wpa_s && os_strcmp(work->type, type) == 0)
4431 static int wpas_init_driver(struct wpa_supplicant *wpa_s,
4432 struct wpa_interface *iface)
4434 const char *ifname, *driver, *rn;
4436 driver = iface->driver;
4438 if (wpa_supplicant_set_driver(wpa_s, driver) < 0)
4441 wpa_s->drv_priv = wpa_drv_init(wpa_s, wpa_s->ifname);
4442 if (wpa_s->drv_priv == NULL) {
4444 pos = driver ? os_strchr(driver, ',') : NULL;
4446 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize "
4447 "driver interface - try next driver wrapper");
4451 wpa_msg(wpa_s, MSG_ERROR, "Failed to initialize driver "
4455 if (wpa_drv_set_param(wpa_s, wpa_s->conf->driver_param) < 0) {
4456 wpa_msg(wpa_s, MSG_ERROR, "Driver interface rejected "
4457 "driver_param '%s'", wpa_s->conf->driver_param);
4461 ifname = wpa_drv_get_ifname(wpa_s);
4462 if (ifname && os_strcmp(ifname, wpa_s->ifname) != 0) {
4463 wpa_dbg(wpa_s, MSG_DEBUG, "Driver interface replaced "
4464 "interface name with '%s'", ifname);
4465 os_strlcpy(wpa_s->ifname, ifname, sizeof(wpa_s->ifname));
4468 rn = wpa_driver_get_radio_name(wpa_s);
4469 if (rn && rn[0] == '\0')
4472 wpa_s->radio = radio_add_interface(wpa_s, rn);
4473 if (wpa_s->radio == NULL)
4480 static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
4481 struct wpa_interface *iface)
4483 struct wpa_driver_capa capa;
4486 wpa_printf(MSG_DEBUG, "Initializing interface '%s' conf '%s' driver "
4487 "'%s' ctrl_interface '%s' bridge '%s'", iface->ifname,
4488 iface->confname ? iface->confname : "N/A",
4489 iface->driver ? iface->driver : "default",
4490 iface->ctrl_interface ? iface->ctrl_interface : "N/A",
4491 iface->bridge_ifname ? iface->bridge_ifname : "N/A");
4493 if (iface->confname) {
4494 #ifdef CONFIG_BACKEND_FILE
4495 wpa_s->confname = os_rel2abs_path(iface->confname);
4496 if (wpa_s->confname == NULL) {
4497 wpa_printf(MSG_ERROR, "Failed to get absolute path "
4498 "for configuration file '%s'.",
4502 wpa_printf(MSG_DEBUG, "Configuration file '%s' -> '%s'",
4503 iface->confname, wpa_s->confname);
4504 #else /* CONFIG_BACKEND_FILE */
4505 wpa_s->confname = os_strdup(iface->confname);
4506 #endif /* CONFIG_BACKEND_FILE */
4507 wpa_s->conf = wpa_config_read(wpa_s->confname, NULL);
4508 if (wpa_s->conf == NULL) {
4509 wpa_printf(MSG_ERROR, "Failed to read or parse "
4510 "configuration '%s'.", wpa_s->confname);
4513 wpa_s->confanother = os_rel2abs_path(iface->confanother);
4514 wpa_config_read(wpa_s->confanother, wpa_s->conf);
4517 * Override ctrl_interface and driver_param if set on command
4520 if (iface->ctrl_interface) {
4521 os_free(wpa_s->conf->ctrl_interface);
4522 wpa_s->conf->ctrl_interface =
4523 os_strdup(iface->ctrl_interface);
4526 if (iface->driver_param) {
4527 os_free(wpa_s->conf->driver_param);
4528 wpa_s->conf->driver_param =
4529 os_strdup(iface->driver_param);
4532 if (iface->p2p_mgmt && !iface->ctrl_interface) {
4533 os_free(wpa_s->conf->ctrl_interface);
4534 wpa_s->conf->ctrl_interface = NULL;
4537 wpa_s->conf = wpa_config_alloc_empty(iface->ctrl_interface,
4538 iface->driver_param);
4540 if (wpa_s->conf == NULL) {
4541 wpa_printf(MSG_ERROR, "\nNo configuration found.");
4545 if (iface->ifname == NULL) {
4546 wpa_printf(MSG_ERROR, "\nInterface name is required.");
4549 if (os_strlen(iface->ifname) >= sizeof(wpa_s->ifname)) {
4550 wpa_printf(MSG_ERROR, "\nToo long interface name '%s'.",
4554 os_strlcpy(wpa_s->ifname, iface->ifname, sizeof(wpa_s->ifname));
4556 if (iface->bridge_ifname) {
4557 if (os_strlen(iface->bridge_ifname) >=
4558 sizeof(wpa_s->bridge_ifname)) {
4559 wpa_printf(MSG_ERROR, "\nToo long bridge interface "
4560 "name '%s'.", iface->bridge_ifname);
4563 os_strlcpy(wpa_s->bridge_ifname, iface->bridge_ifname,
4564 sizeof(wpa_s->bridge_ifname));
4567 /* RSNA Supplicant Key Management - INITIALIZE */
4568 eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
4569 eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
4571 /* Initialize driver interface and register driver event handler before
4572 * L2 receive handler so that association events are processed before
4573 * EAPOL-Key packets if both become available for the same select()
4575 if (wpas_init_driver(wpa_s, iface) < 0)
4578 if (wpa_supplicant_init_wpa(wpa_s) < 0)
4581 wpa_sm_set_ifname(wpa_s->wpa, wpa_s->ifname,
4582 wpa_s->bridge_ifname[0] ? wpa_s->bridge_ifname :
4584 wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
4586 if (wpa_s->conf->dot11RSNAConfigPMKLifetime &&
4587 wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_LIFETIME,
4588 wpa_s->conf->dot11RSNAConfigPMKLifetime)) {
4589 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
4590 "dot11RSNAConfigPMKLifetime");
4594 if (wpa_s->conf->dot11RSNAConfigPMKReauthThreshold &&
4595 wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_REAUTH_THRESHOLD,
4596 wpa_s->conf->dot11RSNAConfigPMKReauthThreshold)) {
4597 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
4598 "dot11RSNAConfigPMKReauthThreshold");
4602 if (wpa_s->conf->dot11RSNAConfigSATimeout &&
4603 wpa_sm_set_param(wpa_s->wpa, RSNA_SA_TIMEOUT,
4604 wpa_s->conf->dot11RSNAConfigSATimeout)) {
4605 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
4606 "dot11RSNAConfigSATimeout");
4610 wpa_s->hw.modes = wpa_drv_get_hw_feature_data(wpa_s,
4611 &wpa_s->hw.num_modes,
4613 if (wpa_s->hw.modes) {
4616 for (i = 0; i < wpa_s->hw.num_modes; i++) {
4617 if (wpa_s->hw.modes[i].vht_capab) {
4618 wpa_s->hw_capab = CAPAB_VHT;
4622 if (wpa_s->hw.modes[i].ht_capab &
4623 HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET)
4624 wpa_s->hw_capab = CAPAB_HT40;
4625 else if (wpa_s->hw.modes[i].ht_capab &&
4626 wpa_s->hw_capab == CAPAB_NO_HT_VHT)
4627 wpa_s->hw_capab = CAPAB_HT;
4631 capa_res = wpa_drv_get_capa(wpa_s, &capa);
4632 if (capa_res == 0) {
4633 wpa_s->drv_capa_known = 1;
4634 wpa_s->drv_flags = capa.flags;
4635 wpa_s->drv_enc = capa.enc;
4636 wpa_s->drv_smps_modes = capa.smps_modes;
4637 wpa_s->drv_rrm_flags = capa.rrm_flags;
4638 wpa_s->probe_resp_offloads = capa.probe_resp_offloads;
4639 wpa_s->max_scan_ssids = capa.max_scan_ssids;
4640 wpa_s->max_sched_scan_ssids = capa.max_sched_scan_ssids;
4641 wpa_s->max_sched_scan_plans = capa.max_sched_scan_plans;
4642 wpa_s->max_sched_scan_plan_interval =
4643 capa.max_sched_scan_plan_interval;
4644 wpa_s->max_sched_scan_plan_iterations =
4645 capa.max_sched_scan_plan_iterations;
4646 wpa_s->sched_scan_supported = capa.sched_scan_supported;
4647 wpa_s->max_match_sets = capa.max_match_sets;
4648 wpa_s->max_remain_on_chan = capa.max_remain_on_chan;
4649 wpa_s->max_stations = capa.max_stations;
4650 wpa_s->extended_capa = capa.extended_capa;
4651 wpa_s->extended_capa_mask = capa.extended_capa_mask;
4652 wpa_s->extended_capa_len = capa.extended_capa_len;
4653 wpa_s->num_multichan_concurrent =
4654 capa.num_multichan_concurrent;
4655 wpa_s->wmm_ac_supported = capa.wmm_ac_supported;
4657 if (capa.mac_addr_rand_scan_supported)
4658 wpa_s->mac_addr_rand_supported |= MAC_ADDR_RAND_SCAN;
4659 if (wpa_s->sched_scan_supported &&
4660 capa.mac_addr_rand_sched_scan_supported)
4661 wpa_s->mac_addr_rand_supported |=
4662 (MAC_ADDR_RAND_SCHED_SCAN | MAC_ADDR_RAND_PNO);
4664 if (wpa_s->max_remain_on_chan == 0)
4665 wpa_s->max_remain_on_chan = 1000;
4668 * Only take p2p_mgmt parameters when P2P Device is supported.
4669 * Doing it here as it determines whether l2_packet_init() will be done
4670 * during wpa_supplicant_driver_init().
4672 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)
4673 wpa_s->p2p_mgmt = iface->p2p_mgmt;
4675 iface->p2p_mgmt = 1;
4677 if (wpa_s->num_multichan_concurrent == 0)
4678 wpa_s->num_multichan_concurrent = 1;
4680 if (wpa_supplicant_driver_init(wpa_s) < 0)
4684 if ((!iface->p2p_mgmt ||
4685 !(wpa_s->drv_flags &
4686 WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)) &&
4687 wpa_tdls_init(wpa_s->wpa))
4689 #endif /* CONFIG_TDLS */
4691 if (wpa_s->conf->country[0] && wpa_s->conf->country[1] &&
4692 wpa_drv_set_country(wpa_s, wpa_s->conf->country)) {
4693 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to set country");
4698 if (wpa_s->conf->fst_group_id) {
4699 struct fst_iface_cfg cfg;
4700 struct fst_wpa_obj iface_obj;
4702 fst_wpa_supplicant_fill_iface_obj(wpa_s, &iface_obj);
4703 os_strlcpy(cfg.group_id, wpa_s->conf->fst_group_id,
4704 sizeof(cfg.group_id));
4705 cfg.priority = wpa_s->conf->fst_priority;
4706 cfg.llt = wpa_s->conf->fst_llt;
4708 wpa_s->fst = fst_attach(wpa_s->ifname, wpa_s->own_addr,
4711 wpa_msg(wpa_s, MSG_ERROR,
4712 "FST: Cannot attach iface %s to group %s",
4713 wpa_s->ifname, cfg.group_id);
4717 #endif /* CONFIG_FST */
4719 if (wpas_wps_init(wpa_s))
4722 if (wpa_supplicant_init_eapol(wpa_s) < 0)
4724 wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
4726 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
4727 if (wpa_s->ctrl_iface == NULL) {
4728 wpa_printf(MSG_ERROR,
4729 "Failed to initialize control interface '%s'.\n"
4730 "You may have another wpa_supplicant process "
4731 "already running or the file was\n"
4732 "left by an unclean termination of wpa_supplicant "
4733 "in which case you will need\n"
4734 "to manually remove this file before starting "
4735 "wpa_supplicant again.\n",
4736 wpa_s->conf->ctrl_interface);
4740 wpa_s->gas = gas_query_init(wpa_s);
4741 if (wpa_s->gas == NULL) {
4742 wpa_printf(MSG_ERROR, "Failed to initialize GAS query");
4746 if (iface->p2p_mgmt && wpas_p2p_init(wpa_s->global, wpa_s) < 0) {
4747 wpa_msg(wpa_s, MSG_ERROR, "Failed to init P2P");
4751 if (wpa_bss_init(wpa_s) < 0)
4755 * Set Wake-on-WLAN triggers, if configured.
4756 * Note: We don't restore/remove the triggers on shutdown (it doesn't
4757 * have effect anyway when the interface is down).
4759 if (capa_res == 0 && wpas_set_wowlan_triggers(wpa_s, &capa) < 0)
4762 #ifdef CONFIG_EAP_PROXY
4765 wpa_s->mnc_len = eapol_sm_get_eap_proxy_imsi(wpa_s->eapol, wpa_s->imsi,
4767 if (wpa_s->mnc_len > 0) {
4768 wpa_s->imsi[len] = '\0';
4769 wpa_printf(MSG_DEBUG, "eap_proxy: IMSI %s (MNC length %d)",
4770 wpa_s->imsi, wpa_s->mnc_len);
4772 wpa_printf(MSG_DEBUG, "eap_proxy: IMSI not available");
4775 #endif /* CONFIG_EAP_PROXY */
4777 if (pcsc_reader_init(wpa_s) < 0)
4780 if (wpas_init_ext_pw(wpa_s) < 0)
4783 wpas_rrm_reset(wpa_s);
4785 wpas_sched_scan_plans_set(wpa_s, wpa_s->conf->sched_scan_plans);
4789 #endif /* CONFIG_HS20 */
4791 wpas_mbo_update_non_pref_chan(wpa_s, wpa_s->conf->non_pref_chan);
4792 #endif /* CONFIG_MBO */
4798 static void wpa_supplicant_deinit_iface(struct wpa_supplicant *wpa_s,
4799 int notify, int terminate)
4801 struct wpa_global *global = wpa_s->global;
4802 struct wpa_supplicant *iface, *prev;
4804 if (wpa_s == wpa_s->parent)
4805 wpas_p2p_group_remove(wpa_s, "*");
4807 iface = global->ifaces;
4809 if (iface == wpa_s || iface->parent != wpa_s) {
4810 iface = iface->next;
4813 wpa_printf(MSG_DEBUG,
4814 "Remove remaining child interface %s from parent %s",
4815 iface->ifname, wpa_s->ifname);
4817 iface = iface->next;
4818 wpa_supplicant_remove_iface(global, prev, terminate);
4821 wpa_s->disconnected = 1;
4822 if (wpa_s->drv_priv) {
4823 wpa_supplicant_deauthenticate(wpa_s,
4824 WLAN_REASON_DEAUTH_LEAVING);
4826 wpa_drv_set_countermeasures(wpa_s, 0);
4827 wpa_clear_keys(wpa_s, NULL);
4830 wpa_supplicant_cleanup(wpa_s);
4831 wpas_p2p_deinit_iface(wpa_s);
4833 wpas_ctrl_radio_work_flush(wpa_s);
4834 radio_remove_interface(wpa_s);
4838 fst_detach(wpa_s->fst);
4841 if (wpa_s->received_mb_ies) {
4842 wpabuf_free(wpa_s->received_mb_ies);
4843 wpa_s->received_mb_ies = NULL;
4845 #endif /* CONFIG_FST */
4847 if (wpa_s->drv_priv)
4848 wpa_drv_deinit(wpa_s);
4851 wpas_notify_iface_removed(wpa_s);
4854 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TERMINATING);
4856 if (wpa_s->ctrl_iface) {
4857 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
4858 wpa_s->ctrl_iface = NULL;
4863 wpa_supplicant_mesh_iface_deinit(wpa_s, wpa_s->ifmsh);
4864 wpa_s->ifmsh = NULL;
4866 #endif /* CONFIG_MESH */
4868 if (wpa_s->conf != NULL) {
4869 wpa_config_free(wpa_s->conf);
4873 os_free(wpa_s->ssids_from_scan_req);
4880 * wpa_supplicant_add_iface - Add a new network interface
4881 * @global: Pointer to global data from wpa_supplicant_init()
4882 * @iface: Interface configuration options
4883 * @parent: Parent interface or %NULL to assign new interface as parent
4884 * Returns: Pointer to the created interface or %NULL on failure
4886 * This function is used to add new network interfaces for %wpa_supplicant.
4887 * This can be called before wpa_supplicant_run() to add interfaces before the
4888 * main event loop has been started. In addition, new interfaces can be added
4889 * dynamically while %wpa_supplicant is already running. This could happen,
4890 * e.g., when a hotplug network adapter is inserted.
4892 struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
4893 struct wpa_interface *iface,
4894 struct wpa_supplicant *parent)
4896 struct wpa_supplicant *wpa_s;
4897 struct wpa_interface t_iface;
4898 struct wpa_ssid *ssid;
4900 if (global == NULL || iface == NULL)
4903 wpa_s = wpa_supplicant_alloc(parent);
4907 wpa_s->global = global;
4910 if (global->params.override_driver) {
4911 wpa_printf(MSG_DEBUG, "Override interface parameter: driver "
4913 iface->driver, global->params.override_driver);
4914 t_iface.driver = global->params.override_driver;
4916 if (global->params.override_ctrl_interface) {
4917 wpa_printf(MSG_DEBUG, "Override interface parameter: "
4918 "ctrl_interface ('%s' -> '%s')",
4919 iface->ctrl_interface,
4920 global->params.override_ctrl_interface);
4921 t_iface.ctrl_interface =
4922 global->params.override_ctrl_interface;
4924 if (wpa_supplicant_init_iface(wpa_s, &t_iface)) {
4925 wpa_printf(MSG_DEBUG, "Failed to add interface %s",
4927 wpa_supplicant_deinit_iface(wpa_s, 0, 0);
4931 if (iface->p2p_mgmt == 0) {
4932 /* Notify the control interfaces about new iface */
4933 if (wpas_notify_iface_added(wpa_s)) {
4934 wpa_supplicant_deinit_iface(wpa_s, 1, 0);
4938 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
4939 wpas_notify_network_added(wpa_s, ssid);
4942 wpa_s->next = global->ifaces;
4943 global->ifaces = wpa_s;
4945 wpa_dbg(wpa_s, MSG_DEBUG, "Added interface %s", wpa_s->ifname);
4946 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
4949 if (wpa_s->global->p2p == NULL &&
4950 !wpa_s->global->p2p_disabled && !wpa_s->conf->p2p_disabled &&
4951 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE) &&
4952 wpas_p2p_add_p2pdev_interface(
4953 wpa_s, wpa_s->global->params.conf_p2p_dev) < 0) {
4954 wpa_printf(MSG_INFO,
4955 "P2P: Failed to enable P2P Device interface");
4956 /* Try to continue without. P2P will be disabled. */
4958 #endif /* CONFIG_P2P */
4965 * wpa_supplicant_remove_iface - Remove a network interface
4966 * @global: Pointer to global data from wpa_supplicant_init()
4967 * @wpa_s: Pointer to the network interface to be removed
4968 * Returns: 0 if interface was removed, -1 if interface was not found
4970 * This function can be used to dynamically remove network interfaces from
4971 * %wpa_supplicant, e.g., when a hotplug network adapter is ejected. In
4972 * addition, this function is used to remove all remaining interfaces when
4973 * %wpa_supplicant is terminated.
4975 int wpa_supplicant_remove_iface(struct wpa_global *global,
4976 struct wpa_supplicant *wpa_s,
4979 struct wpa_supplicant *prev;
4981 unsigned int mesh_if_created = wpa_s->mesh_if_created;
4982 char *ifname = NULL;
4983 #endif /* CONFIG_MESH */
4985 /* Remove interface from the global list of interfaces */
4986 prev = global->ifaces;
4987 if (prev == wpa_s) {
4988 global->ifaces = wpa_s->next;
4990 while (prev && prev->next != wpa_s)
4994 prev->next = wpa_s->next;
4997 wpa_dbg(wpa_s, MSG_DEBUG, "Removing interface %s", wpa_s->ifname);
5000 if (mesh_if_created) {
5001 ifname = os_strdup(wpa_s->ifname);
5002 if (ifname == NULL) {
5003 wpa_dbg(wpa_s, MSG_ERROR,
5004 "mesh: Failed to malloc ifname");
5008 #endif /* CONFIG_MESH */
5010 if (global->p2p_group_formation == wpa_s)
5011 global->p2p_group_formation = NULL;
5012 if (global->p2p_invite_group == wpa_s)
5013 global->p2p_invite_group = NULL;
5014 wpa_supplicant_deinit_iface(wpa_s, 1, terminate);
5017 if (mesh_if_created) {
5018 wpa_drv_if_remove(global->ifaces, WPA_IF_MESH, ifname);
5021 #endif /* CONFIG_MESH */
5028 * wpa_supplicant_get_eap_mode - Get the current EAP mode
5029 * @wpa_s: Pointer to the network interface
5030 * Returns: Pointer to the eap mode or the string "UNKNOWN" if not found
5032 const char * wpa_supplicant_get_eap_mode(struct wpa_supplicant *wpa_s)
5034 const char *eapol_method;
5036 if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) == 0 &&
5037 wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
5041 eapol_method = eapol_sm_get_method_name(wpa_s->eapol);
5042 if (eapol_method == NULL)
5043 return "UNKNOWN-EAP";
5045 return eapol_method;
5050 * wpa_supplicant_get_iface - Get a new network interface
5051 * @global: Pointer to global data from wpa_supplicant_init()
5052 * @ifname: Interface name
5053 * Returns: Pointer to the interface or %NULL if not found
5055 struct wpa_supplicant * wpa_supplicant_get_iface(struct wpa_global *global,
5058 struct wpa_supplicant *wpa_s;
5060 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
5061 if (os_strcmp(wpa_s->ifname, ifname) == 0)
5068 #ifndef CONFIG_NO_WPA_MSG
5069 static const char * wpa_supplicant_msg_ifname_cb(void *ctx)
5071 struct wpa_supplicant *wpa_s = ctx;
5074 return wpa_s->ifname;
5076 #endif /* CONFIG_NO_WPA_MSG */
5079 #ifndef WPA_SUPPLICANT_CLEANUP_INTERVAL
5080 #define WPA_SUPPLICANT_CLEANUP_INTERVAL 10
5081 #endif /* WPA_SUPPLICANT_CLEANUP_INTERVAL */
5083 /* Periodic cleanup tasks */
5084 static void wpas_periodic(void *eloop_ctx, void *timeout_ctx)
5086 struct wpa_global *global = eloop_ctx;
5087 struct wpa_supplicant *wpa_s;
5089 eloop_register_timeout(WPA_SUPPLICANT_CLEANUP_INTERVAL, 0,
5090 wpas_periodic, global, NULL);
5094 p2p_expire_peers(global->p2p);
5095 #endif /* CONFIG_P2P */
5097 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
5098 wpa_bss_flush_by_age(wpa_s, wpa_s->conf->bss_expiration_age);
5101 #endif /* CONFIG_AP */
5107 * wpa_supplicant_init - Initialize %wpa_supplicant
5108 * @params: Parameters for %wpa_supplicant
5109 * Returns: Pointer to global %wpa_supplicant data, or %NULL on failure
5111 * This function is used to initialize %wpa_supplicant. After successful
5112 * initialization, the returned data pointer can be used to add and remove
5113 * network interfaces, and eventually, to deinitialize %wpa_supplicant.
5115 struct wpa_global * wpa_supplicant_init(struct wpa_params *params)
5117 struct wpa_global *global;
5123 #ifdef CONFIG_DRIVER_NDIS
5125 void driver_ndis_init_ops(void);
5126 driver_ndis_init_ops();
5128 #endif /* CONFIG_DRIVER_NDIS */
5130 #ifndef CONFIG_NO_WPA_MSG
5131 wpa_msg_register_ifname_cb(wpa_supplicant_msg_ifname_cb);
5132 #endif /* CONFIG_NO_WPA_MSG */
5134 if (params->wpa_debug_file_path)
5135 wpa_debug_open_file(params->wpa_debug_file_path);
5137 wpa_debug_setup_stdout();
5138 if (params->wpa_debug_syslog)
5139 wpa_debug_open_syslog();
5140 if (params->wpa_debug_tracing) {
5141 ret = wpa_debug_open_linux_tracing();
5143 wpa_printf(MSG_ERROR,
5144 "Failed to enable trace logging");
5149 ret = eap_register_methods();
5151 wpa_printf(MSG_ERROR, "Failed to register EAP methods");
5153 wpa_printf(MSG_ERROR, "Two or more EAP methods used "
5154 "the same EAP type.");
5158 global = os_zalloc(sizeof(*global));
5161 dl_list_init(&global->p2p_srv_bonjour);
5162 dl_list_init(&global->p2p_srv_upnp);
5163 global->params.daemonize = params->daemonize;
5164 global->params.wait_for_monitor = params->wait_for_monitor;
5165 global->params.dbus_ctrl_interface = params->dbus_ctrl_interface;
5166 if (params->pid_file)
5167 global->params.pid_file = os_strdup(params->pid_file);
5168 if (params->ctrl_interface)
5169 global->params.ctrl_interface =
5170 os_strdup(params->ctrl_interface);
5171 if (params->ctrl_interface_group)
5172 global->params.ctrl_interface_group =
5173 os_strdup(params->ctrl_interface_group);
5174 if (params->override_driver)
5175 global->params.override_driver =
5176 os_strdup(params->override_driver);
5177 if (params->override_ctrl_interface)
5178 global->params.override_ctrl_interface =
5179 os_strdup(params->override_ctrl_interface);
5181 if (params->conf_p2p_dev)
5182 global->params.conf_p2p_dev =
5183 os_strdup(params->conf_p2p_dev);
5184 #endif /* CONFIG_P2P */
5185 wpa_debug_level = global->params.wpa_debug_level =
5186 params->wpa_debug_level;
5187 wpa_debug_show_keys = global->params.wpa_debug_show_keys =
5188 params->wpa_debug_show_keys;
5189 wpa_debug_timestamp = global->params.wpa_debug_timestamp =
5190 params->wpa_debug_timestamp;
5192 wpa_printf(MSG_DEBUG, "wpa_supplicant v" VERSION_STR);
5195 wpa_printf(MSG_ERROR, "Failed to initialize event loop");
5196 wpa_supplicant_deinit(global);
5200 random_init(params->entropy_file);
5202 global->ctrl_iface = wpa_supplicant_global_ctrl_iface_init(global);
5203 if (global->ctrl_iface == NULL) {
5204 wpa_supplicant_deinit(global);
5208 if (wpas_notify_supplicant_initialized(global)) {
5209 wpa_supplicant_deinit(global);
5213 for (i = 0; wpa_drivers[i]; i++)
5214 global->drv_count++;
5215 if (global->drv_count == 0) {
5216 wpa_printf(MSG_ERROR, "No drivers enabled");
5217 wpa_supplicant_deinit(global);
5220 global->drv_priv = os_calloc(global->drv_count, sizeof(void *));
5221 if (global->drv_priv == NULL) {
5222 wpa_supplicant_deinit(global);
5226 #ifdef CONFIG_WIFI_DISPLAY
5227 if (wifi_display_init(global) < 0) {
5228 wpa_printf(MSG_ERROR, "Failed to initialize Wi-Fi Display");
5229 wpa_supplicant_deinit(global);
5232 #endif /* CONFIG_WIFI_DISPLAY */
5234 eloop_register_timeout(WPA_SUPPLICANT_CLEANUP_INTERVAL, 0,
5235 wpas_periodic, global, NULL);
5242 * wpa_supplicant_run - Run the %wpa_supplicant main event loop
5243 * @global: Pointer to global data from wpa_supplicant_init()
5244 * Returns: 0 after successful event loop run, -1 on failure
5246 * This function starts the main event loop and continues running as long as
5247 * there are any remaining events. In most cases, this function is running as
5248 * long as the %wpa_supplicant process in still in use.
5250 int wpa_supplicant_run(struct wpa_global *global)
5252 struct wpa_supplicant *wpa_s;
5254 if (global->params.daemonize &&
5255 (wpa_supplicant_daemon(global->params.pid_file) ||
5256 eloop_sock_requeue()))
5259 if (global->params.wait_for_monitor) {
5260 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
5261 if (wpa_s->ctrl_iface && !wpa_s->p2p_mgmt)
5262 wpa_supplicant_ctrl_iface_wait(
5266 eloop_register_signal_terminate(wpa_supplicant_terminate, global);
5267 eloop_register_signal_reconfig(wpa_supplicant_reconfig, global);
5276 * wpa_supplicant_deinit - Deinitialize %wpa_supplicant
5277 * @global: Pointer to global data from wpa_supplicant_init()
5279 * This function is called to deinitialize %wpa_supplicant and to free all
5280 * allocated resources. Remaining network interfaces will also be removed.
5282 void wpa_supplicant_deinit(struct wpa_global *global)
5289 eloop_cancel_timeout(wpas_periodic, global, NULL);
5291 #ifdef CONFIG_WIFI_DISPLAY
5292 wifi_display_deinit(global);
5293 #endif /* CONFIG_WIFI_DISPLAY */
5295 while (global->ifaces)
5296 wpa_supplicant_remove_iface(global, global->ifaces, 1);
5298 if (global->ctrl_iface)
5299 wpa_supplicant_global_ctrl_iface_deinit(global->ctrl_iface);
5301 wpas_notify_supplicant_deinitialized(global);
5303 eap_peer_unregister_methods();
5305 eap_server_unregister_methods();
5306 #endif /* CONFIG_AP */
5308 for (i = 0; wpa_drivers[i] && global->drv_priv; i++) {
5309 if (!global->drv_priv[i])
5311 wpa_drivers[i]->global_deinit(global->drv_priv[i]);
5313 os_free(global->drv_priv);
5319 if (global->params.pid_file) {
5320 os_daemonize_terminate(global->params.pid_file);
5321 os_free(global->params.pid_file);
5323 os_free(global->params.ctrl_interface);
5324 os_free(global->params.ctrl_interface_group);
5325 os_free(global->params.override_driver);
5326 os_free(global->params.override_ctrl_interface);
5328 os_free(global->params.conf_p2p_dev);
5329 #endif /* CONFIG_P2P */
5331 os_free(global->p2p_disallow_freq.range);
5332 os_free(global->p2p_go_avoid_freq.range);
5333 os_free(global->add_psk);
5336 wpa_debug_close_syslog();
5337 wpa_debug_close_file();
5338 wpa_debug_close_linux_tracing();
5342 void wpa_supplicant_update_config(struct wpa_supplicant *wpa_s)
5344 if ((wpa_s->conf->changed_parameters & CFG_CHANGED_COUNTRY) &&
5345 wpa_s->conf->country[0] && wpa_s->conf->country[1]) {
5347 country[0] = wpa_s->conf->country[0];
5348 country[1] = wpa_s->conf->country[1];
5350 if (wpa_drv_set_country(wpa_s, country) < 0) {
5351 wpa_printf(MSG_ERROR, "Failed to set country code "
5356 if (wpa_s->conf->changed_parameters & CFG_CHANGED_EXT_PW_BACKEND)
5357 wpas_init_ext_pw(wpa_s);
5359 if (wpa_s->conf->changed_parameters & CFG_CHANGED_SCHED_SCAN_PLANS)
5360 wpas_sched_scan_plans_set(wpa_s, wpa_s->conf->sched_scan_plans);
5363 wpas_wps_update_config(wpa_s);
5364 #endif /* CONFIG_WPS */
5365 wpas_p2p_update_config(wpa_s);
5366 wpa_s->conf->changed_parameters = 0;
5370 void add_freq(int *freqs, int *num_freqs, int freq)
5374 for (i = 0; i < *num_freqs; i++) {
5375 if (freqs[i] == freq)
5379 freqs[*num_freqs] = freq;
5384 static int * get_bss_freqs_in_ess(struct wpa_supplicant *wpa_s)
5386 struct wpa_bss *bss, *cbss;
5387 const int max_freqs = 10;
5391 freqs = os_calloc(max_freqs + 1, sizeof(int));
5395 cbss = wpa_s->current_bss;
5397 dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
5400 if (bss->ssid_len == cbss->ssid_len &&
5401 os_memcmp(bss->ssid, cbss->ssid, bss->ssid_len) == 0 &&
5402 wpa_blacklist_get(wpa_s, bss->bssid) == NULL) {
5403 add_freq(freqs, &num_freqs, bss->freq);
5404 if (num_freqs == max_freqs)
5409 if (num_freqs == 0) {
5418 void wpas_connection_failed(struct wpa_supplicant *wpa_s, const u8 *bssid)
5424 wpas_connect_work_done(wpa_s);
5427 * Remove possible authentication timeout since the connection failed.
5429 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
5432 * There is no point in blacklisting the AP if this event is
5433 * generated based on local request to disconnect.
5435 if (wpa_s->own_disconnect_req) {
5436 wpa_s->own_disconnect_req = 0;
5437 wpa_dbg(wpa_s, MSG_DEBUG,
5438 "Ignore connection failure due to local request to disconnect");
5441 if (wpa_s->disconnected) {
5442 wpa_dbg(wpa_s, MSG_DEBUG, "Ignore connection failure "
5443 "indication since interface has been put into "
5444 "disconnected state");
5449 * Add the failed BSSID into the blacklist and speed up next scan
5450 * attempt if there could be other APs that could accept association.
5451 * The current blacklist count indicates how many times we have tried
5452 * connecting to this AP and multiple attempts mean that other APs are
5453 * either not available or has already been tried, so that we can start
5454 * increasing the delay here to avoid constant scanning.
5456 count = wpa_blacklist_add(wpa_s, bssid);
5457 if (count == 1 && wpa_s->current_bss) {
5459 * This BSS was not in the blacklist before. If there is
5460 * another BSS available for the same ESS, we should try that
5461 * next. Otherwise, we may as well try this one once more
5462 * before allowing other, likely worse, ESSes to be considered.
5464 freqs = get_bss_freqs_in_ess(wpa_s);
5466 wpa_dbg(wpa_s, MSG_DEBUG, "Another BSS in this ESS "
5467 "has been seen; try it next");
5468 wpa_blacklist_add(wpa_s, bssid);
5470 * On the next scan, go through only the known channels
5471 * used in this ESS based on previous scans to speed up
5472 * common load balancing use case.
5474 os_free(wpa_s->next_scan_freqs);
5475 wpa_s->next_scan_freqs = freqs;
5480 * Add previous failure count in case the temporary blacklist was
5481 * cleared due to no other BSSes being available.
5483 count += wpa_s->extra_blacklist_count;
5485 if (count > 3 && wpa_s->current_ssid) {
5486 wpa_printf(MSG_DEBUG, "Continuous association failures - "
5487 "consider temporary network disabling");
5488 wpas_auth_failed(wpa_s, "CONN_FAILED");
5509 wpa_dbg(wpa_s, MSG_DEBUG, "Blacklist count %d --> request scan in %d "
5510 "ms", count, timeout);
5513 * TODO: if more than one possible AP is available in scan results,
5514 * could try the other ones before requesting a new scan.
5516 wpa_supplicant_req_scan(wpa_s, timeout / 1000,
5517 1000 * (timeout % 1000));
5521 int wpas_driver_bss_selection(struct wpa_supplicant *wpa_s)
5523 return wpa_s->conf->ap_scan == 2 ||
5524 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_BSS_SELECTION);
5528 #if defined(CONFIG_CTRL_IFACE) || defined(CONFIG_CTRL_IFACE_DBUS_NEW)
5529 int wpa_supplicant_ctrl_iface_ctrl_rsp_handle(struct wpa_supplicant *wpa_s,
5530 struct wpa_ssid *ssid,
5534 #ifdef IEEE8021X_EAPOL
5535 struct eap_peer_config *eap = &ssid->eap;
5537 wpa_printf(MSG_DEBUG, "CTRL_IFACE: response handle field=%s", field);
5538 wpa_hexdump_ascii_key(MSG_DEBUG, "CTRL_IFACE: response value",
5539 (const u8 *) value, os_strlen(value));
5541 switch (wpa_supplicant_ctrl_req_from_string(field)) {
5542 case WPA_CTRL_REQ_EAP_IDENTITY:
5543 os_free(eap->identity);
5544 eap->identity = (u8 *) os_strdup(value);
5545 eap->identity_len = os_strlen(value);
5546 eap->pending_req_identity = 0;
5547 if (ssid == wpa_s->current_ssid)
5548 wpa_s->reassociate = 1;
5550 case WPA_CTRL_REQ_EAP_PASSWORD:
5551 bin_clear_free(eap->password, eap->password_len);
5552 eap->password = (u8 *) os_strdup(value);
5553 eap->password_len = os_strlen(value);
5554 eap->pending_req_password = 0;
5555 if (ssid == wpa_s->current_ssid)
5556 wpa_s->reassociate = 1;
5558 case WPA_CTRL_REQ_EAP_NEW_PASSWORD:
5559 bin_clear_free(eap->new_password, eap->new_password_len);
5560 eap->new_password = (u8 *) os_strdup(value);
5561 eap->new_password_len = os_strlen(value);
5562 eap->pending_req_new_password = 0;
5563 if (ssid == wpa_s->current_ssid)
5564 wpa_s->reassociate = 1;
5566 case WPA_CTRL_REQ_EAP_PIN:
5567 str_clear_free(eap->pin);
5568 eap->pin = os_strdup(value);
5569 eap->pending_req_pin = 0;
5570 if (ssid == wpa_s->current_ssid)
5571 wpa_s->reassociate = 1;
5573 case WPA_CTRL_REQ_EAP_OTP:
5574 bin_clear_free(eap->otp, eap->otp_len);
5575 eap->otp = (u8 *) os_strdup(value);
5576 eap->otp_len = os_strlen(value);
5577 os_free(eap->pending_req_otp);
5578 eap->pending_req_otp = NULL;
5579 eap->pending_req_otp_len = 0;
5581 case WPA_CTRL_REQ_EAP_PASSPHRASE:
5582 str_clear_free(eap->private_key_passwd);
5583 eap->private_key_passwd = os_strdup(value);
5584 eap->pending_req_passphrase = 0;
5585 if (ssid == wpa_s->current_ssid)
5586 wpa_s->reassociate = 1;
5588 case WPA_CTRL_REQ_SIM:
5589 str_clear_free(eap->external_sim_resp);
5590 eap->external_sim_resp = os_strdup(value);
5592 case WPA_CTRL_REQ_PSK_PASSPHRASE:
5593 if (wpa_config_set(ssid, "psk", value, 0) < 0)
5595 ssid->mem_only_psk = 1;
5596 if (ssid->passphrase)
5597 wpa_config_update_psk(ssid);
5598 if (wpa_s->wpa_state == WPA_SCANNING && !wpa_s->scanning)
5599 wpa_supplicant_req_scan(wpa_s, 0, 0);
5601 case WPA_CTRL_REQ_EXT_CERT_CHECK:
5602 if (eap->pending_ext_cert_check != PENDING_CHECK)
5604 if (os_strcmp(value, "good") == 0)
5605 eap->pending_ext_cert_check = EXT_CERT_CHECK_GOOD;
5606 else if (os_strcmp(value, "bad") == 0)
5607 eap->pending_ext_cert_check = EXT_CERT_CHECK_BAD;
5612 wpa_printf(MSG_DEBUG, "CTRL_IFACE: Unknown field '%s'", field);
5617 #else /* IEEE8021X_EAPOL */
5618 wpa_printf(MSG_DEBUG, "CTRL_IFACE: IEEE 802.1X not included");
5620 #endif /* IEEE8021X_EAPOL */
5622 #endif /* CONFIG_CTRL_IFACE || CONFIG_CTRL_IFACE_DBUS_NEW */
5625 int wpas_network_disabled(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
5628 unsigned int drv_enc;
5630 if (wpa_s->p2p_mgmt)
5631 return 1; /* no normal network profiles on p2p_mgmt interface */
5639 if (wpa_s->drv_capa_known)
5640 drv_enc = wpa_s->drv_enc;
5642 drv_enc = (unsigned int) -1;
5644 for (i = 0; i < NUM_WEP_KEYS; i++) {
5645 size_t len = ssid->wep_key_len[i];
5648 if (len == 5 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP40))
5650 if (len == 13 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP104))
5652 if (len == 16 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP128))
5654 return 1; /* invalid WEP key */
5657 if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt) && !ssid->psk_set &&
5658 (!ssid->passphrase || ssid->ssid_len != 0) && !ssid->ext_psk &&
5659 !ssid->mem_only_psk)
5666 int wpas_get_ssid_pmf(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
5668 #ifdef CONFIG_IEEE80211W
5669 if (ssid == NULL || ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT) {
5670 if (wpa_s->conf->pmf == MGMT_FRAME_PROTECTION_OPTIONAL &&
5671 !(wpa_s->drv_enc & WPA_DRIVER_CAPA_ENC_BIP)) {
5673 * Driver does not support BIP -- ignore pmf=1 default
5674 * since the connection with PMF would fail and the
5675 * configuration does not require PMF to be enabled.
5677 return NO_MGMT_FRAME_PROTECTION;
5680 return wpa_s->conf->pmf;
5683 return ssid->ieee80211w;
5684 #else /* CONFIG_IEEE80211W */
5685 return NO_MGMT_FRAME_PROTECTION;
5686 #endif /* CONFIG_IEEE80211W */
5690 int wpas_is_p2p_prioritized(struct wpa_supplicant *wpa_s)
5692 if (wpa_s->global->conc_pref == WPA_CONC_PREF_P2P)
5694 if (wpa_s->global->conc_pref == WPA_CONC_PREF_STA)
5700 void wpas_auth_failed(struct wpa_supplicant *wpa_s, char *reason)
5702 struct wpa_ssid *ssid = wpa_s->current_ssid;
5704 struct os_reltime now;
5707 wpa_printf(MSG_DEBUG, "Authentication failure but no known "
5712 if (ssid->key_mgmt == WPA_KEY_MGMT_WPS)
5715 ssid->auth_failures++;
5718 if (ssid->p2p_group &&
5719 (wpa_s->p2p_in_provisioning || wpa_s->show_group_started)) {
5721 * Skip the wait time since there is a short timeout on the
5722 * connection to a P2P group.
5726 #endif /* CONFIG_P2P */
5728 if (ssid->auth_failures > 50)
5730 else if (ssid->auth_failures > 10)
5732 else if (ssid->auth_failures > 5)
5734 else if (ssid->auth_failures > 3)
5736 else if (ssid->auth_failures > 2)
5738 else if (ssid->auth_failures > 1)
5743 if (ssid->auth_failures > 1 &&
5744 wpa_key_mgmt_wpa_ieee8021x(ssid->key_mgmt))
5745 dur += os_random() % (ssid->auth_failures * 10);
5747 os_get_reltime(&now);
5748 if (now.sec + dur <= ssid->disabled_until.sec)
5751 ssid->disabled_until.sec = now.sec + dur;
5753 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TEMP_DISABLED
5754 "id=%d ssid=\"%s\" auth_failures=%u duration=%d reason=%s",
5755 ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
5756 ssid->auth_failures, dur, reason);
5760 void wpas_clear_temp_disabled(struct wpa_supplicant *wpa_s,
5761 struct wpa_ssid *ssid, int clear_failures)
5766 if (ssid->disabled_until.sec) {
5767 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_REENABLED
5768 "id=%d ssid=\"%s\"",
5769 ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
5771 ssid->disabled_until.sec = 0;
5772 ssid->disabled_until.usec = 0;
5774 ssid->auth_failures = 0;
5778 int disallowed_bssid(struct wpa_supplicant *wpa_s, const u8 *bssid)
5782 if (wpa_s->disallow_aps_bssid == NULL)
5785 for (i = 0; i < wpa_s->disallow_aps_bssid_count; i++) {
5786 if (os_memcmp(wpa_s->disallow_aps_bssid + i * ETH_ALEN,
5787 bssid, ETH_ALEN) == 0)
5795 int disallowed_ssid(struct wpa_supplicant *wpa_s, const u8 *ssid,
5800 if (wpa_s->disallow_aps_ssid == NULL || ssid == NULL)
5803 for (i = 0; i < wpa_s->disallow_aps_ssid_count; i++) {
5804 struct wpa_ssid_value *s = &wpa_s->disallow_aps_ssid[i];
5805 if (ssid_len == s->ssid_len &&
5806 os_memcmp(ssid, s->ssid, ssid_len) == 0)
5815 * wpas_request_connection - Request a new connection
5816 * @wpa_s: Pointer to the network interface
5818 * This function is used to request a new connection to be found. It will mark
5819 * the interface to allow reassociation and request a new scan to find a
5820 * suitable network to connect to.
5822 void wpas_request_connection(struct wpa_supplicant *wpa_s)
5824 wpa_s->normal_scans = 0;
5825 wpa_s->scan_req = NORMAL_SCAN_REQ;
5826 wpa_supplicant_reinit_autoscan(wpa_s);
5827 wpa_s->extra_blacklist_count = 0;
5828 wpa_s->disconnected = 0;
5829 wpa_s->reassociate = 1;
5831 if (wpa_supplicant_fast_associate(wpa_s) != 1)
5832 wpa_supplicant_req_scan(wpa_s, 0, 0);
5834 wpa_s->reattach = 0;
5838 void dump_freq_data(struct wpa_supplicant *wpa_s, const char *title,
5839 struct wpa_used_freq_data *freqs_data,
5844 wpa_dbg(wpa_s, MSG_DEBUG, "Shared frequencies (len=%u): %s",
5846 for (i = 0; i < len; i++) {
5847 struct wpa_used_freq_data *cur = &freqs_data[i];
5848 wpa_dbg(wpa_s, MSG_DEBUG, "freq[%u]: %d, flags=0x%X",
5849 i, cur->freq, cur->flags);
5855 * Find the operating frequencies of any of the virtual interfaces that
5856 * are using the same radio as the current interface, and in addition, get
5857 * information about the interface types that are using the frequency.
5859 int get_shared_radio_freqs_data(struct wpa_supplicant *wpa_s,
5860 struct wpa_used_freq_data *freqs_data,
5863 struct wpa_supplicant *ifs;
5866 unsigned int idx = 0, i;
5868 wpa_dbg(wpa_s, MSG_DEBUG,
5869 "Determining shared radio frequencies (max len %u)", len);
5870 os_memset(freqs_data, 0, sizeof(struct wpa_used_freq_data) * len);
5872 dl_list_for_each(ifs, &wpa_s->radio->ifaces, struct wpa_supplicant,
5877 if (ifs->current_ssid == NULL || ifs->assoc_freq == 0)
5880 if (ifs->current_ssid->mode == WPAS_MODE_AP ||
5881 ifs->current_ssid->mode == WPAS_MODE_P2P_GO ||
5882 ifs->current_ssid->mode == WPAS_MODE_MESH)
5883 freq = ifs->current_ssid->frequency;
5884 else if (wpa_drv_get_bssid(ifs, bssid) == 0)
5885 freq = ifs->assoc_freq;
5889 /* Hold only distinct freqs */
5890 for (i = 0; i < idx; i++)
5891 if (freqs_data[i].freq == freq)
5895 freqs_data[idx++].freq = freq;
5897 if (ifs->current_ssid->mode == WPAS_MODE_INFRA) {
5898 freqs_data[i].flags |= ifs->current_ssid->p2p_group ?
5899 WPA_FREQ_USED_BY_P2P_CLIENT :
5900 WPA_FREQ_USED_BY_INFRA_STATION;
5904 dump_freq_data(wpa_s, "completed iteration", freqs_data, idx);
5910 * Find the operating frequencies of any of the virtual interfaces that
5911 * are using the same radio as the current interface.
5913 int get_shared_radio_freqs(struct wpa_supplicant *wpa_s,
5914 int *freq_array, unsigned int len)
5916 struct wpa_used_freq_data *freqs_data;
5919 os_memset(freq_array, 0, sizeof(int) * len);
5921 freqs_data = os_calloc(len, sizeof(struct wpa_used_freq_data));
5925 num = get_shared_radio_freqs_data(wpa_s, freqs_data, len);
5926 for (i = 0; i < num; i++)
5927 freq_array[i] = freqs_data[i].freq;
5929 os_free(freqs_data);
5935 static void wpas_rrm_neighbor_rep_timeout_handler(void *data, void *user_ctx)
5937 struct rrm_data *rrm = data;
5939 if (!rrm->notify_neighbor_rep) {
5940 wpa_printf(MSG_ERROR,
5941 "RRM: Unexpected neighbor report timeout");
5945 wpa_printf(MSG_DEBUG, "RRM: Notifying neighbor report - NONE");
5946 rrm->notify_neighbor_rep(rrm->neighbor_rep_cb_ctx, NULL);
5948 rrm->notify_neighbor_rep = NULL;
5949 rrm->neighbor_rep_cb_ctx = NULL;
5954 * wpas_rrm_reset - Clear and reset all RRM data in wpa_supplicant
5955 * @wpa_s: Pointer to wpa_supplicant
5957 void wpas_rrm_reset(struct wpa_supplicant *wpa_s)
5959 wpa_s->rrm.rrm_used = 0;
5961 eloop_cancel_timeout(wpas_rrm_neighbor_rep_timeout_handler, &wpa_s->rrm,
5963 if (wpa_s->rrm.notify_neighbor_rep)
5964 wpas_rrm_neighbor_rep_timeout_handler(&wpa_s->rrm, NULL);
5965 wpa_s->rrm.next_neighbor_rep_token = 1;
5970 * wpas_rrm_process_neighbor_rep - Handle incoming neighbor report
5971 * @wpa_s: Pointer to wpa_supplicant
5972 * @report: Neighbor report buffer, prefixed by a 1-byte dialog token
5973 * @report_len: Length of neighbor report buffer
5975 void wpas_rrm_process_neighbor_rep(struct wpa_supplicant *wpa_s,
5976 const u8 *report, size_t report_len)
5978 struct wpabuf *neighbor_rep;
5980 wpa_hexdump(MSG_DEBUG, "RRM: New Neighbor Report", report, report_len);
5984 if (report[0] != wpa_s->rrm.next_neighbor_rep_token - 1) {
5985 wpa_printf(MSG_DEBUG,
5986 "RRM: Discarding neighbor report with token %d (expected %d)",
5987 report[0], wpa_s->rrm.next_neighbor_rep_token - 1);
5991 eloop_cancel_timeout(wpas_rrm_neighbor_rep_timeout_handler, &wpa_s->rrm,
5994 if (!wpa_s->rrm.notify_neighbor_rep) {
5995 wpa_printf(MSG_ERROR, "RRM: Unexpected neighbor report");
5999 /* skipping the first byte, which is only an id (dialog token) */
6000 neighbor_rep = wpabuf_alloc(report_len - 1);
6001 if (neighbor_rep == NULL)
6003 wpabuf_put_data(neighbor_rep, report + 1, report_len - 1);
6004 wpa_printf(MSG_DEBUG, "RRM: Notifying neighbor report (token = %d)",
6006 wpa_s->rrm.notify_neighbor_rep(wpa_s->rrm.neighbor_rep_cb_ctx,
6008 wpa_s->rrm.notify_neighbor_rep = NULL;
6009 wpa_s->rrm.neighbor_rep_cb_ctx = NULL;
6013 #if defined(__CYGWIN__) || defined(CONFIG_NATIVE_WINDOWS)
6014 /* Workaround different, undefined for Windows, error codes used here */
6016 #define EOPNOTSUPP -1
6017 #define ECANCELED -1
6021 * wpas_rrm_send_neighbor_rep_request - Request a neighbor report from our AP
6022 * @wpa_s: Pointer to wpa_supplicant
6023 * @ssid: if not null, this is sent in the request. Otherwise, no SSID IE
6024 * is sent in the request.
6025 * @cb: Callback function to be called once the requested report arrives, or
6026 * timed out after RRM_NEIGHBOR_REPORT_TIMEOUT seconds.
6027 * In the former case, 'neighbor_rep' is a newly allocated wpabuf, and it's
6028 * the requester's responsibility to free it.
6029 * In the latter case NULL will be sent in 'neighbor_rep'.
6030 * @cb_ctx: Context value to send the callback function
6031 * Returns: 0 in case of success, negative error code otherwise
6033 * In case there is a previous request which has not been answered yet, the
6034 * new request fails. The caller may retry after RRM_NEIGHBOR_REPORT_TIMEOUT.
6035 * Request must contain a callback function.
6037 int wpas_rrm_send_neighbor_rep_request(struct wpa_supplicant *wpa_s,
6038 const struct wpa_ssid *ssid,
6039 void (*cb)(void *ctx,
6040 struct wpabuf *neighbor_rep),
6046 if (wpa_s->wpa_state != WPA_COMPLETED || wpa_s->current_ssid == NULL) {
6047 wpa_printf(MSG_DEBUG, "RRM: No connection, no RRM.");
6051 if (!wpa_s->rrm.rrm_used) {
6052 wpa_printf(MSG_DEBUG, "RRM: No RRM in current connection.");
6056 rrm_ie = wpa_bss_get_ie(wpa_s->current_bss,
6057 WLAN_EID_RRM_ENABLED_CAPABILITIES);
6058 if (!rrm_ie || !(wpa_s->current_bss->caps & IEEE80211_CAP_RRM) ||
6059 !(rrm_ie[2] & WLAN_RRM_CAPS_NEIGHBOR_REPORT)) {
6060 wpa_printf(MSG_DEBUG,
6061 "RRM: No network support for Neighbor Report.");
6066 wpa_printf(MSG_DEBUG,
6067 "RRM: Neighbor Report request must provide a callback.");
6071 /* Refuse if there's a live request */
6072 if (wpa_s->rrm.notify_neighbor_rep) {
6073 wpa_printf(MSG_DEBUG,
6074 "RRM: Currently handling previous Neighbor Report.");
6078 /* 3 = action category + action code + dialog token */
6079 buf = wpabuf_alloc(3 + (ssid ? 2 + ssid->ssid_len : 0));
6081 wpa_printf(MSG_DEBUG,
6082 "RRM: Failed to allocate Neighbor Report Request");
6086 wpa_printf(MSG_DEBUG, "RRM: Neighbor report request (for %s), token=%d",
6087 (ssid ? wpa_ssid_txt(ssid->ssid, ssid->ssid_len) : ""),
6088 wpa_s->rrm.next_neighbor_rep_token);
6090 wpabuf_put_u8(buf, WLAN_ACTION_RADIO_MEASUREMENT);
6091 wpabuf_put_u8(buf, WLAN_RRM_NEIGHBOR_REPORT_REQUEST);
6092 wpabuf_put_u8(buf, wpa_s->rrm.next_neighbor_rep_token);
6094 wpabuf_put_u8(buf, WLAN_EID_SSID);
6095 wpabuf_put_u8(buf, ssid->ssid_len);
6096 wpabuf_put_data(buf, ssid->ssid, ssid->ssid_len);
6099 wpa_s->rrm.next_neighbor_rep_token++;
6101 if (wpa_drv_send_action(wpa_s, wpa_s->assoc_freq, 0, wpa_s->bssid,
6102 wpa_s->own_addr, wpa_s->bssid,
6103 wpabuf_head(buf), wpabuf_len(buf), 0) < 0) {
6104 wpa_printf(MSG_DEBUG,
6105 "RRM: Failed to send Neighbor Report Request");
6110 wpa_s->rrm.neighbor_rep_cb_ctx = cb_ctx;
6111 wpa_s->rrm.notify_neighbor_rep = cb;
6112 eloop_register_timeout(RRM_NEIGHBOR_REPORT_TIMEOUT, 0,
6113 wpas_rrm_neighbor_rep_timeout_handler,
6121 void wpas_rrm_handle_link_measurement_request(struct wpa_supplicant *wpa_s,
6123 const u8 *frame, size_t len,
6127 const struct rrm_link_measurement_request *req;
6128 struct rrm_link_measurement_report report;
6130 if (wpa_s->wpa_state != WPA_COMPLETED) {
6131 wpa_printf(MSG_INFO,
6132 "RRM: Ignoring link measurement request. Not associated");
6136 if (!wpa_s->rrm.rrm_used) {
6137 wpa_printf(MSG_INFO,
6138 "RRM: Ignoring link measurement request. Not RRM network");
6142 if (!(wpa_s->drv_rrm_flags & WPA_DRIVER_FLAGS_TX_POWER_INSERTION)) {
6143 wpa_printf(MSG_INFO,
6144 "RRM: Measurement report failed. TX power insertion not supported");
6148 req = (const struct rrm_link_measurement_request *) frame;
6149 if (len < sizeof(*req)) {
6150 wpa_printf(MSG_INFO,
6151 "RRM: Link measurement report failed. Request too short");
6155 os_memset(&report, 0, sizeof(report));
6156 report.tpc.eid = WLAN_EID_TPC_REPORT;
6158 report.rsni = 255; /* 255 indicates that RSNI is not available */
6159 report.dialog_token = req->dialog_token;
6162 * It's possible to estimate RCPI based on RSSI in dBm. This
6163 * calculation will not reflect the correct value for high rates,
6164 * but it's good enough for Action frames which are transmitted
6165 * with up to 24 Mbps rates.
6168 report.rcpi = 255; /* not available */
6169 else if (rssi < -110)
6174 report.rcpi = (rssi + 110) * 2;
6176 /* action_category + action_code */
6177 buf = wpabuf_alloc(2 + sizeof(report));
6179 wpa_printf(MSG_ERROR,
6180 "RRM: Link measurement report failed. Buffer allocation failed");
6184 wpabuf_put_u8(buf, WLAN_ACTION_RADIO_MEASUREMENT);
6185 wpabuf_put_u8(buf, WLAN_RRM_LINK_MEASUREMENT_REPORT);
6186 wpabuf_put_data(buf, &report, sizeof(report));
6187 wpa_hexdump(MSG_DEBUG, "RRM: Link measurement report:",
6188 wpabuf_head(buf), wpabuf_len(buf));
6190 if (wpa_drv_send_action(wpa_s, wpa_s->assoc_freq, 0, src,
6191 wpa_s->own_addr, wpa_s->bssid,
6192 wpabuf_head(buf), wpabuf_len(buf), 0)) {
6193 wpa_printf(MSG_ERROR,
6194 "RRM: Link measurement report failed. Send action failed");
6200 struct wpa_supplicant *
6201 wpas_vendor_elem(struct wpa_supplicant *wpa_s, enum wpa_vendor_elem_frame frame)
6205 case VENDOR_ELEM_PROBE_REQ_P2P:
6206 case VENDOR_ELEM_PROBE_RESP_P2P:
6207 case VENDOR_ELEM_PROBE_RESP_P2P_GO:
6208 case VENDOR_ELEM_BEACON_P2P_GO:
6209 case VENDOR_ELEM_P2P_PD_REQ:
6210 case VENDOR_ELEM_P2P_PD_RESP:
6211 case VENDOR_ELEM_P2P_GO_NEG_REQ:
6212 case VENDOR_ELEM_P2P_GO_NEG_RESP:
6213 case VENDOR_ELEM_P2P_GO_NEG_CONF:
6214 case VENDOR_ELEM_P2P_INV_REQ:
6215 case VENDOR_ELEM_P2P_INV_RESP:
6216 case VENDOR_ELEM_P2P_ASSOC_REQ:
6217 case VENDOR_ELEM_P2P_ASSOC_RESP:
6218 return wpa_s->parent;
6219 #endif /* CONFIG_P2P */
6226 void wpas_vendor_elem_update(struct wpa_supplicant *wpa_s)
6231 wpa_printf(MSG_DEBUG, "Update vendor elements");
6233 for (i = 0; i < NUM_VENDOR_ELEM_FRAMES; i++) {
6234 if (wpa_s->vendor_elem[i]) {
6237 res = os_snprintf(buf, sizeof(buf), "frame[%u]", i);
6238 if (!os_snprintf_error(sizeof(buf), res)) {
6239 wpa_hexdump_buf(MSG_DEBUG, buf,
6240 wpa_s->vendor_elem[i]);
6246 if (wpa_s->parent == wpa_s &&
6247 wpa_s->global->p2p &&
6248 !wpa_s->global->p2p_disabled)
6249 p2p_set_vendor_elems(wpa_s->global->p2p, wpa_s->vendor_elem);
6250 #endif /* CONFIG_P2P */
6254 int wpas_vendor_elem_remove(struct wpa_supplicant *wpa_s, int frame,
6255 const u8 *elem, size_t len)
6259 ie = wpabuf_mhead_u8(wpa_s->vendor_elem[frame]);
6260 end = ie + wpabuf_len(wpa_s->vendor_elem[frame]);
6262 for (; ie + 1 < end; ie += 2 + ie[1]) {
6265 if (os_memcmp(ie, elem, len) != 0)
6268 if (wpabuf_len(wpa_s->vendor_elem[frame]) == len) {
6269 wpabuf_free(wpa_s->vendor_elem[frame]);
6270 wpa_s->vendor_elem[frame] = NULL;
6272 os_memmove(ie, ie + len, end - (ie + len));
6273 wpa_s->vendor_elem[frame]->used -= len;
6275 wpas_vendor_elem_update(wpa_s);
6283 struct hostapd_hw_modes * get_mode(struct hostapd_hw_modes *modes,
6284 u16 num_modes, enum hostapd_hw_mode mode)
6288 for (i = 0; i < num_modes; i++) {
6289 if (modes[i].mode == mode)