3 * Copyright (c) 2003-2014, Jouni Malinen <j@w1.fi>
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
8 * This file implements functions for registering and unregistering
9 * %wpa_supplicant interfaces. In addition, this file contains number of
10 * functions for managing network connections.
16 #include "crypto/random.h"
17 #include "crypto/sha1.h"
18 #include "eapol_supp/eapol_supp_sm.h"
19 #include "eap_peer/eap.h"
20 #include "eap_peer/eap_proxy.h"
21 #include "eap_server/eap_methods.h"
22 #include "rsn_supp/wpa.h"
25 #include "utils/ext_password.h"
26 #include "l2_packet/l2_packet.h"
27 #include "wpa_supplicant_i.h"
29 #include "ctrl_iface.h"
30 #include "pcsc_funcs.h"
31 #include "common/version.h"
32 #include "rsn_supp/preauth.h"
33 #include "rsn_supp/pmksa_cache.h"
34 #include "common/wpa_ctrl.h"
35 #include "common/ieee802_11_defs.h"
37 #include "blacklist.h"
38 #include "wpas_glue.h"
39 #include "wps_supplicant.h"
42 #include "gas_query.h"
44 #include "p2p_supplicant.h"
45 #include "wifi_display.h"
51 #include "offchannel.h"
52 #include "hs20_supplicant.h"
57 const char *wpa_supplicant_version =
58 "wpa_supplicant v" VERSION_STR "\n"
59 "Copyright (c) 2003-2014, Jouni Malinen <j@w1.fi> and contributors";
61 const char *wpa_supplicant_license =
62 "This software may be distributed under the terms of the BSD license.\n"
63 "See README for more details.\n"
64 #ifdef EAP_TLS_OPENSSL
65 "\nThis product includes software developed by the OpenSSL Project\n"
66 "for use in the OpenSSL Toolkit (http://www.openssl.org/)\n"
67 #endif /* EAP_TLS_OPENSSL */
70 #ifndef CONFIG_NO_STDOUT_DEBUG
71 /* Long text divided into parts in order to fit in C89 strings size limits. */
72 const char *wpa_supplicant_full_license1 =
74 const char *wpa_supplicant_full_license2 =
75 "This software may be distributed under the terms of the BSD license.\n"
77 "Redistribution and use in source and binary forms, with or without\n"
78 "modification, are permitted provided that the following conditions are\n"
81 const char *wpa_supplicant_full_license3 =
82 "1. Redistributions of source code must retain the above copyright\n"
83 " notice, this list of conditions and the following disclaimer.\n"
85 "2. Redistributions in binary form must reproduce the above copyright\n"
86 " notice, this list of conditions and the following disclaimer in the\n"
87 " documentation and/or other materials provided with the distribution.\n"
89 const char *wpa_supplicant_full_license4 =
90 "3. Neither the name(s) of the above-listed copyright holder(s) nor the\n"
91 " names of its contributors may be used to endorse or promote products\n"
92 " derived from this software without specific prior written permission.\n"
94 "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
95 "\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
96 "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
97 "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n";
98 const char *wpa_supplicant_full_license5 =
99 "OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
100 "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
101 "LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
102 "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
103 "THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
104 "(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
105 "OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
107 #endif /* CONFIG_NO_STDOUT_DEBUG */
109 /* Configure default/group WEP keys for static WEP */
110 int wpa_set_wep_keys(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
114 for (i = 0; i < NUM_WEP_KEYS; i++) {
115 if (ssid->wep_key_len[i] == 0)
119 wpa_drv_set_key(wpa_s, WPA_ALG_WEP, NULL,
120 i, i == ssid->wep_tx_keyidx, NULL, 0,
121 ssid->wep_key[i], ssid->wep_key_len[i]);
128 int wpa_supplicant_set_wpa_none_key(struct wpa_supplicant *wpa_s,
129 struct wpa_ssid *ssid)
137 /* IBSS/WPA-None uses only one key (Group) for both receiving and
138 * sending unicast and multicast packets. */
140 if (ssid->mode != WPAS_MODE_IBSS) {
141 wpa_msg(wpa_s, MSG_INFO, "WPA: Invalid mode %d (not "
142 "IBSS/ad-hoc) for WPA-None", ssid->mode);
146 if (!ssid->psk_set) {
147 wpa_msg(wpa_s, MSG_INFO, "WPA: No PSK configured for "
152 switch (wpa_s->group_cipher) {
153 case WPA_CIPHER_CCMP:
154 os_memcpy(key, ssid->psk, 16);
158 case WPA_CIPHER_GCMP:
159 os_memcpy(key, ssid->psk, 16);
163 case WPA_CIPHER_TKIP:
164 /* WPA-None uses the same Michael MIC key for both TX and RX */
165 os_memcpy(key, ssid->psk, 16 + 8);
166 os_memcpy(key + 16 + 8, ssid->psk + 16, 8);
171 wpa_msg(wpa_s, MSG_INFO, "WPA: Invalid group cipher %d for "
172 "WPA-None", wpa_s->group_cipher);
176 /* TODO: should actually remember the previously used seq#, both for TX
177 * and RX from each STA.. */
179 ret = wpa_drv_set_key(wpa_s, alg, NULL, 0, 1, seq, 6, key, keylen);
180 os_memset(key, 0, sizeof(key));
185 static void wpa_supplicant_timeout(void *eloop_ctx, void *timeout_ctx)
187 struct wpa_supplicant *wpa_s = eloop_ctx;
188 const u8 *bssid = wpa_s->bssid;
189 if (is_zero_ether_addr(bssid))
190 bssid = wpa_s->pending_bssid;
191 wpa_msg(wpa_s, MSG_INFO, "Authentication with " MACSTR " timed out.",
193 wpa_blacklist_add(wpa_s, bssid);
194 wpa_sm_notify_disassoc(wpa_s->wpa);
195 wpa_supplicant_deauthenticate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
196 wpa_s->reassociate = 1;
199 * If we timed out, the AP or the local radio may be busy.
200 * So, wait a second until scanning again.
202 wpa_supplicant_req_scan(wpa_s, 1, 0);
207 * wpa_supplicant_req_auth_timeout - Schedule a timeout for authentication
208 * @wpa_s: Pointer to wpa_supplicant data
209 * @sec: Number of seconds after which to time out authentication
210 * @usec: Number of microseconds after which to time out authentication
212 * This function is used to schedule a timeout for the current authentication
215 void wpa_supplicant_req_auth_timeout(struct wpa_supplicant *wpa_s,
218 if (wpa_s->conf->ap_scan == 0 &&
219 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED))
222 wpa_dbg(wpa_s, MSG_DEBUG, "Setting authentication timeout: %d sec "
223 "%d usec", sec, usec);
224 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
225 eloop_register_timeout(sec, usec, wpa_supplicant_timeout, wpa_s, NULL);
230 * wpa_supplicant_cancel_auth_timeout - Cancel authentication timeout
231 * @wpa_s: Pointer to wpa_supplicant data
233 * This function is used to cancel authentication timeout scheduled with
234 * wpa_supplicant_req_auth_timeout() and it is called when authentication has
237 void wpa_supplicant_cancel_auth_timeout(struct wpa_supplicant *wpa_s)
239 wpa_dbg(wpa_s, MSG_DEBUG, "Cancelling authentication timeout");
240 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
241 wpa_blacklist_del(wpa_s, wpa_s->bssid);
246 * wpa_supplicant_initiate_eapol - Configure EAPOL state machine
247 * @wpa_s: Pointer to wpa_supplicant data
249 * This function is used to configure EAPOL state machine based on the selected
250 * authentication mode.
252 void wpa_supplicant_initiate_eapol(struct wpa_supplicant *wpa_s)
254 #ifdef IEEE8021X_EAPOL
255 struct eapol_config eapol_conf;
256 struct wpa_ssid *ssid = wpa_s->current_ssid;
258 #ifdef CONFIG_IBSS_RSN
259 if (ssid->mode == WPAS_MODE_IBSS &&
260 wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
261 wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
263 * RSN IBSS authentication is per-STA and we can disable the
264 * per-BSSID EAPOL authentication.
266 eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
267 eapol_sm_notify_eap_success(wpa_s->eapol, TRUE);
268 eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
271 #endif /* CONFIG_IBSS_RSN */
273 eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
274 eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
276 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
277 wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE)
278 eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
280 eapol_sm_notify_portControl(wpa_s->eapol, Auto);
282 os_memset(&eapol_conf, 0, sizeof(eapol_conf));
283 if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
284 eapol_conf.accept_802_1x_keys = 1;
285 eapol_conf.required_keys = 0;
286 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_UNICAST) {
287 eapol_conf.required_keys |= EAPOL_REQUIRE_KEY_UNICAST;
289 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_BROADCAST) {
290 eapol_conf.required_keys |=
291 EAPOL_REQUIRE_KEY_BROADCAST;
294 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED)
295 eapol_conf.required_keys = 0;
297 eapol_conf.fast_reauth = wpa_s->conf->fast_reauth;
298 eapol_conf.workaround = ssid->eap_workaround;
299 eapol_conf.eap_disabled =
300 !wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) &&
301 wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA &&
302 wpa_s->key_mgmt != WPA_KEY_MGMT_WPS;
303 eapol_conf.external_sim = wpa_s->conf->external_sim;
306 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) {
307 eapol_conf.wps |= EAPOL_LOCAL_WPS_IN_USE;
308 if (wpa_s->current_bss) {
310 ie = wpa_bss_get_vendor_ie_multi(wpa_s->current_bss,
315 EAPOL_PEER_IS_WPS20_AP;
320 #endif /* CONFIG_WPS */
322 eapol_sm_notify_config(wpa_s->eapol, &ssid->eap, &eapol_conf);
324 ieee802_1x_alloc_kay_sm(wpa_s, ssid);
325 #endif /* IEEE8021X_EAPOL */
330 * wpa_supplicant_set_non_wpa_policy - Set WPA parameters to non-WPA mode
331 * @wpa_s: Pointer to wpa_supplicant data
332 * @ssid: Configuration data for the network
334 * This function is used to configure WPA state machine and related parameters
335 * to a mode where WPA is not enabled. This is called as part of the
336 * authentication configuration when the selected network does not use WPA.
338 void wpa_supplicant_set_non_wpa_policy(struct wpa_supplicant *wpa_s,
339 struct wpa_ssid *ssid)
343 if (ssid->key_mgmt & WPA_KEY_MGMT_WPS)
344 wpa_s->key_mgmt = WPA_KEY_MGMT_WPS;
345 else if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA)
346 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_NO_WPA;
348 wpa_s->key_mgmt = WPA_KEY_MGMT_NONE;
349 wpa_sm_set_ap_wpa_ie(wpa_s->wpa, NULL, 0);
350 wpa_sm_set_ap_rsn_ie(wpa_s->wpa, NULL, 0);
351 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
352 wpa_s->pairwise_cipher = WPA_CIPHER_NONE;
353 wpa_s->group_cipher = WPA_CIPHER_NONE;
354 wpa_s->mgmt_group_cipher = 0;
356 for (i = 0; i < NUM_WEP_KEYS; i++) {
357 if (ssid->wep_key_len[i] > 5) {
358 wpa_s->pairwise_cipher = WPA_CIPHER_WEP104;
359 wpa_s->group_cipher = WPA_CIPHER_WEP104;
361 } else if (ssid->wep_key_len[i] > 0) {
362 wpa_s->pairwise_cipher = WPA_CIPHER_WEP40;
363 wpa_s->group_cipher = WPA_CIPHER_WEP40;
368 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED, 0);
369 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
370 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
371 wpa_s->pairwise_cipher);
372 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
373 #ifdef CONFIG_IEEE80211W
374 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
375 wpa_s->mgmt_group_cipher);
376 #endif /* CONFIG_IEEE80211W */
378 pmksa_cache_clear_current(wpa_s->wpa);
382 void free_hw_features(struct wpa_supplicant *wpa_s)
385 if (wpa_s->hw.modes == NULL)
388 for (i = 0; i < wpa_s->hw.num_modes; i++) {
389 os_free(wpa_s->hw.modes[i].channels);
390 os_free(wpa_s->hw.modes[i].rates);
393 os_free(wpa_s->hw.modes);
394 wpa_s->hw.modes = NULL;
398 static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s)
402 bgscan_deinit(wpa_s);
403 autoscan_deinit(wpa_s);
404 scard_deinit(wpa_s->scard);
406 wpa_sm_set_scard_ctx(wpa_s->wpa, NULL);
407 eapol_sm_register_scard_ctx(wpa_s->eapol, NULL);
408 l2_packet_deinit(wpa_s->l2);
411 l2_packet_deinit(wpa_s->l2_br);
414 #ifdef CONFIG_TESTING_OPTIONS
415 l2_packet_deinit(wpa_s->l2_test);
416 wpa_s->l2_test = NULL;
417 #endif /* CONFIG_TESTING_OPTIONS */
419 if (wpa_s->conf != NULL) {
420 struct wpa_ssid *ssid;
421 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
422 wpas_notify_network_removed(wpa_s, ssid);
425 os_free(wpa_s->confname);
426 wpa_s->confname = NULL;
428 os_free(wpa_s->confanother);
429 wpa_s->confanother = NULL;
431 wpa_sm_set_eapol(wpa_s->wpa, NULL);
432 eapol_sm_deinit(wpa_s->eapol);
435 rsn_preauth_deinit(wpa_s->wpa);
438 wpa_tdls_deinit(wpa_s->wpa);
439 #endif /* CONFIG_TDLS */
441 wmm_ac_clear_saved_tspecs(wpa_s);
442 pmksa_candidate_free(wpa_s->wpa);
443 wpa_sm_deinit(wpa_s->wpa);
445 wpa_blacklist_clear(wpa_s);
447 wpa_bss_deinit(wpa_s);
449 wpa_supplicant_cancel_delayed_sched_scan(wpa_s);
450 wpa_supplicant_cancel_scan(wpa_s);
451 wpa_supplicant_cancel_auth_timeout(wpa_s);
452 eloop_cancel_timeout(wpa_supplicant_stop_countermeasures, wpa_s, NULL);
453 #ifdef CONFIG_DELAYED_MIC_ERROR_REPORT
454 eloop_cancel_timeout(wpa_supplicant_delayed_mic_error_report,
456 #endif /* CONFIG_DELAYED_MIC_ERROR_REPORT */
458 wpas_wps_deinit(wpa_s);
460 wpabuf_free(wpa_s->pending_eapol_rx);
461 wpa_s->pending_eapol_rx = NULL;
463 #ifdef CONFIG_IBSS_RSN
464 ibss_rsn_deinit(wpa_s->ibss_rsn);
465 wpa_s->ibss_rsn = NULL;
466 #endif /* CONFIG_IBSS_RSN */
471 wpa_supplicant_ap_deinit(wpa_s);
472 #endif /* CONFIG_AP */
474 wpas_p2p_deinit(wpa_s);
476 #ifdef CONFIG_OFFCHANNEL
477 offchannel_deinit(wpa_s);
478 #endif /* CONFIG_OFFCHANNEL */
480 wpa_supplicant_cancel_sched_scan(wpa_s);
482 os_free(wpa_s->next_scan_freqs);
483 wpa_s->next_scan_freqs = NULL;
485 os_free(wpa_s->manual_scan_freqs);
486 wpa_s->manual_scan_freqs = NULL;
488 os_free(wpa_s->manual_sched_scan_freqs);
489 wpa_s->manual_sched_scan_freqs = NULL;
491 gas_query_deinit(wpa_s->gas);
494 free_hw_features(wpa_s);
496 ieee802_1x_dealloc_kay_sm(wpa_s);
498 os_free(wpa_s->bssid_filter);
499 wpa_s->bssid_filter = NULL;
501 os_free(wpa_s->disallow_aps_bssid);
502 wpa_s->disallow_aps_bssid = NULL;
503 os_free(wpa_s->disallow_aps_ssid);
504 wpa_s->disallow_aps_ssid = NULL;
506 wnm_bss_keep_alive_deinit(wpa_s);
508 wnm_deallocate_memory(wpa_s);
509 #endif /* CONFIG_WNM */
511 ext_password_deinit(wpa_s->ext_pw);
512 wpa_s->ext_pw = NULL;
514 wpabuf_free(wpa_s->last_gas_resp);
515 wpa_s->last_gas_resp = NULL;
516 wpabuf_free(wpa_s->prev_gas_resp);
517 wpa_s->prev_gas_resp = NULL;
519 os_free(wpa_s->last_scan_res);
520 wpa_s->last_scan_res = NULL;
524 #endif /* CONFIG_HS20 */
526 for (i = 0; i < NUM_VENDOR_ELEM_FRAMES; i++) {
527 wpabuf_free(wpa_s->vendor_elem[i]);
528 wpa_s->vendor_elem[i] = NULL;
531 wmm_ac_notify_disassoc(wpa_s);
536 * wpa_clear_keys - Clear keys configured for the driver
537 * @wpa_s: Pointer to wpa_supplicant data
538 * @addr: Previously used BSSID or %NULL if not available
540 * This function clears the encryption keys that has been previously configured
543 void wpa_clear_keys(struct wpa_supplicant *wpa_s, const u8 *addr)
547 #ifdef CONFIG_IEEE80211W
549 #else /* CONFIG_IEEE80211W */
551 #endif /* CONFIG_IEEE80211W */
553 /* MLME-DELETEKEYS.request */
554 for (i = 0; i < max; i++) {
555 if (wpa_s->keys_cleared & BIT(i))
557 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, i, 0, NULL, 0,
560 if (!(wpa_s->keys_cleared & BIT(0)) && addr &&
561 !is_zero_ether_addr(addr)) {
562 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, addr, 0, 0, NULL, 0, NULL,
564 /* MLME-SETPROTECTION.request(None) */
565 wpa_drv_mlme_setprotection(
567 MLME_SETPROTECTION_PROTECT_TYPE_NONE,
568 MLME_SETPROTECTION_KEY_TYPE_PAIRWISE);
570 wpa_s->keys_cleared = (u32) -1;
575 * wpa_supplicant_state_txt - Get the connection state name as a text string
576 * @state: State (wpa_state; WPA_*)
577 * Returns: The state name as a printable text string
579 const char * wpa_supplicant_state_txt(enum wpa_states state)
582 case WPA_DISCONNECTED:
583 return "DISCONNECTED";
586 case WPA_INTERFACE_DISABLED:
587 return "INTERFACE_DISABLED";
590 case WPA_AUTHENTICATING:
591 return "AUTHENTICATING";
592 case WPA_ASSOCIATING:
593 return "ASSOCIATING";
596 case WPA_4WAY_HANDSHAKE:
597 return "4WAY_HANDSHAKE";
598 case WPA_GROUP_HANDSHAKE:
599 return "GROUP_HANDSHAKE";
610 static void wpa_supplicant_start_bgscan(struct wpa_supplicant *wpa_s)
614 if (wpa_s->current_ssid && wpa_s->current_ssid->bgscan)
615 name = wpa_s->current_ssid->bgscan;
617 name = wpa_s->conf->bgscan;
618 if (name == NULL || name[0] == '\0')
620 if (wpas_driver_bss_selection(wpa_s))
622 if (wpa_s->current_ssid == wpa_s->bgscan_ssid)
625 if (wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE)
627 #endif /* CONFIG_P2P */
629 bgscan_deinit(wpa_s);
630 if (wpa_s->current_ssid) {
631 if (bgscan_init(wpa_s, wpa_s->current_ssid, name)) {
632 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize "
635 * Live without bgscan; it is only used as a roaming
636 * optimization, so the initial connection is not
640 struct wpa_scan_results *scan_res;
641 wpa_s->bgscan_ssid = wpa_s->current_ssid;
642 scan_res = wpa_supplicant_get_scan_results(wpa_s, NULL,
645 bgscan_notify_scan(wpa_s, scan_res);
646 wpa_scan_results_free(scan_res);
650 wpa_s->bgscan_ssid = NULL;
654 static void wpa_supplicant_stop_bgscan(struct wpa_supplicant *wpa_s)
656 if (wpa_s->bgscan_ssid != NULL) {
657 bgscan_deinit(wpa_s);
658 wpa_s->bgscan_ssid = NULL;
662 #endif /* CONFIG_BGSCAN */
665 static void wpa_supplicant_start_autoscan(struct wpa_supplicant *wpa_s)
667 if (autoscan_init(wpa_s, 0))
668 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize autoscan");
672 static void wpa_supplicant_stop_autoscan(struct wpa_supplicant *wpa_s)
674 autoscan_deinit(wpa_s);
678 void wpa_supplicant_reinit_autoscan(struct wpa_supplicant *wpa_s)
680 if (wpa_s->wpa_state == WPA_DISCONNECTED ||
681 wpa_s->wpa_state == WPA_SCANNING) {
682 autoscan_deinit(wpa_s);
683 wpa_supplicant_start_autoscan(wpa_s);
689 * wpa_supplicant_set_state - Set current connection state
690 * @wpa_s: Pointer to wpa_supplicant data
691 * @state: The new connection state
693 * This function is called whenever the connection state changes, e.g.,
694 * association is completed for WPA/WPA2 4-Way Handshake is started.
696 void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s,
697 enum wpa_states state)
699 enum wpa_states old_state = wpa_s->wpa_state;
701 wpa_dbg(wpa_s, MSG_DEBUG, "State: %s -> %s",
702 wpa_supplicant_state_txt(wpa_s->wpa_state),
703 wpa_supplicant_state_txt(state));
705 if (state == WPA_INTERFACE_DISABLED) {
706 /* Assure normal scan when interface is restored */
707 wpa_s->normal_scans = 0;
710 if (state == WPA_COMPLETED) {
711 wpas_connect_work_done(wpa_s);
712 /* Reinitialize normal_scan counter */
713 wpa_s->normal_scans = 0;
716 if (state != WPA_SCANNING)
717 wpa_supplicant_notify_scanning(wpa_s, 0);
719 if (state == WPA_COMPLETED && wpa_s->new_connection) {
720 struct wpa_ssid *ssid = wpa_s->current_ssid;
721 #if defined(CONFIG_CTRL_IFACE) || !defined(CONFIG_NO_STDOUT_DEBUG)
722 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_CONNECTED "- Connection to "
723 MACSTR " completed [id=%d id_str=%s]",
724 MAC2STR(wpa_s->bssid),
725 ssid ? ssid->id : -1,
726 ssid && ssid->id_str ? ssid->id_str : "");
727 #endif /* CONFIG_CTRL_IFACE || !CONFIG_NO_STDOUT_DEBUG */
728 wpas_clear_temp_disabled(wpa_s, ssid, 1);
729 wpa_s->extra_blacklist_count = 0;
730 wpa_s->new_connection = 0;
731 wpa_drv_set_operstate(wpa_s, 1);
732 #ifndef IEEE8021X_EAPOL
733 wpa_drv_set_supp_port(wpa_s, 1);
734 #endif /* IEEE8021X_EAPOL */
735 wpa_s->after_wps = 0;
736 wpa_s->known_wps_freq = 0;
737 wpas_p2p_completed(wpa_s);
739 sme_sched_obss_scan(wpa_s, 1);
740 } else if (state == WPA_DISCONNECTED || state == WPA_ASSOCIATING ||
741 state == WPA_ASSOCIATED) {
742 wpa_s->new_connection = 1;
743 wpa_drv_set_operstate(wpa_s, 0);
744 #ifndef IEEE8021X_EAPOL
745 wpa_drv_set_supp_port(wpa_s, 0);
746 #endif /* IEEE8021X_EAPOL */
747 sme_sched_obss_scan(wpa_s, 0);
749 wpa_s->wpa_state = state;
752 if (state == WPA_COMPLETED)
753 wpa_supplicant_start_bgscan(wpa_s);
754 else if (state < WPA_ASSOCIATED)
755 wpa_supplicant_stop_bgscan(wpa_s);
756 #endif /* CONFIG_BGSCAN */
758 if (state == WPA_AUTHENTICATING)
759 wpa_supplicant_stop_autoscan(wpa_s);
761 if (state == WPA_DISCONNECTED || state == WPA_INACTIVE)
762 wpa_supplicant_start_autoscan(wpa_s);
764 if (old_state >= WPA_ASSOCIATED && wpa_s->wpa_state < WPA_ASSOCIATED)
765 wmm_ac_notify_disassoc(wpa_s);
767 if (wpa_s->wpa_state != old_state) {
768 wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
771 * Notify the P2P Device interface about a state change in one
774 wpas_p2p_indicate_state_change(wpa_s);
776 if (wpa_s->wpa_state == WPA_COMPLETED ||
777 old_state == WPA_COMPLETED)
778 wpas_notify_auth_changed(wpa_s);
783 void wpa_supplicant_terminate_proc(struct wpa_global *global)
787 struct wpa_supplicant *wpa_s = global->ifaces;
789 struct wpa_supplicant *next = wpa_s->next;
790 if (wpas_wps_terminate_pending(wpa_s) == 1)
793 if (wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE ||
794 (wpa_s->current_ssid && wpa_s->current_ssid->p2p_group))
795 wpas_p2p_disconnect(wpa_s);
796 #endif /* CONFIG_P2P */
799 #endif /* CONFIG_WPS */
806 static void wpa_supplicant_terminate(int sig, void *signal_ctx)
808 struct wpa_global *global = signal_ctx;
809 wpa_supplicant_terminate_proc(global);
813 void wpa_supplicant_clear_status(struct wpa_supplicant *wpa_s)
815 enum wpa_states old_state = wpa_s->wpa_state;
817 wpa_s->pairwise_cipher = 0;
818 wpa_s->group_cipher = 0;
819 wpa_s->mgmt_group_cipher = 0;
821 if (wpa_s->wpa_state != WPA_INTERFACE_DISABLED)
822 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
824 if (wpa_s->wpa_state != old_state)
825 wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
830 * wpa_supplicant_reload_configuration - Reload configuration data
831 * @wpa_s: Pointer to wpa_supplicant data
832 * Returns: 0 on success or -1 if configuration parsing failed
834 * This function can be used to request that the configuration data is reloaded
835 * (e.g., after configuration file change). This function is reloading
836 * configuration only for one interface, so this may need to be called multiple
837 * times if %wpa_supplicant is controlling multiple interfaces and all
838 * interfaces need reconfiguration.
840 int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s)
842 struct wpa_config *conf;
846 if (wpa_s->confname == NULL)
848 conf = wpa_config_read(wpa_s->confname, NULL);
850 wpa_msg(wpa_s, MSG_ERROR, "Failed to parse the configuration "
851 "file '%s' - exiting", wpa_s->confname);
854 wpa_config_read(wpa_s->confanother, conf);
856 conf->changed_parameters = (unsigned int) -1;
858 reconf_ctrl = !!conf->ctrl_interface != !!wpa_s->conf->ctrl_interface
859 || (conf->ctrl_interface && wpa_s->conf->ctrl_interface &&
860 os_strcmp(conf->ctrl_interface,
861 wpa_s->conf->ctrl_interface) != 0);
863 if (reconf_ctrl && wpa_s->ctrl_iface) {
864 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
865 wpa_s->ctrl_iface = NULL;
868 eapol_sm_invalidate_cached_session(wpa_s->eapol);
869 if (wpa_s->current_ssid) {
870 wpa_supplicant_deauthenticate(wpa_s,
871 WLAN_REASON_DEAUTH_LEAVING);
875 * TODO: should notify EAPOL SM about changes in opensc_engine_path,
876 * pkcs11_engine_path, pkcs11_module_path, openssl_ciphers.
878 if (wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt)) {
880 * Clear forced success to clear EAP state for next
883 eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
885 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
886 wpa_sm_set_config(wpa_s->wpa, NULL);
887 wpa_sm_pmksa_cache_flush(wpa_s->wpa, NULL);
888 wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
889 rsn_preauth_deinit(wpa_s->wpa);
891 old_ap_scan = wpa_s->conf->ap_scan;
892 wpa_config_free(wpa_s->conf);
894 if (old_ap_scan != wpa_s->conf->ap_scan)
895 wpas_notify_ap_scan_changed(wpa_s);
898 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
900 wpa_supplicant_update_config(wpa_s);
902 wpa_supplicant_clear_status(wpa_s);
903 if (wpa_supplicant_enabled_networks(wpa_s)) {
904 wpa_s->reassociate = 1;
905 wpa_supplicant_req_scan(wpa_s, 0, 0);
907 wpa_dbg(wpa_s, MSG_DEBUG, "Reconfiguration completed");
912 static void wpa_supplicant_reconfig(int sig, void *signal_ctx)
914 struct wpa_global *global = signal_ctx;
915 struct wpa_supplicant *wpa_s;
916 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
917 wpa_dbg(wpa_s, MSG_DEBUG, "Signal %d received - reconfiguring",
919 if (wpa_supplicant_reload_configuration(wpa_s) < 0) {
920 wpa_supplicant_terminate_proc(global);
926 static int wpa_supplicant_suites_from_ai(struct wpa_supplicant *wpa_s,
927 struct wpa_ssid *ssid,
928 struct wpa_ie_data *ie)
930 int ret = wpa_sm_parse_own_wpa_ie(wpa_s->wpa, ie);
933 wpa_msg(wpa_s, MSG_INFO, "WPA: Failed to parse WPA IE "
934 "from association info");
939 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Using WPA IE from AssocReq to set "
941 if (!(ie->group_cipher & ssid->group_cipher)) {
942 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled group "
943 "cipher 0x%x (mask 0x%x) - reject",
944 ie->group_cipher, ssid->group_cipher);
947 if (!(ie->pairwise_cipher & ssid->pairwise_cipher)) {
948 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled pairwise "
949 "cipher 0x%x (mask 0x%x) - reject",
950 ie->pairwise_cipher, ssid->pairwise_cipher);
953 if (!(ie->key_mgmt & ssid->key_mgmt)) {
954 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled key "
955 "management 0x%x (mask 0x%x) - reject",
956 ie->key_mgmt, ssid->key_mgmt);
960 #ifdef CONFIG_IEEE80211W
961 if (!(ie->capabilities & WPA_CAPABILITY_MFPC) &&
962 (ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT ?
963 wpa_s->conf->pmf : ssid->ieee80211w) ==
964 MGMT_FRAME_PROTECTION_REQUIRED) {
965 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver associated with an AP "
966 "that does not support management frame protection - "
970 #endif /* CONFIG_IEEE80211W */
977 * wpa_supplicant_set_suites - Set authentication and encryption parameters
978 * @wpa_s: Pointer to wpa_supplicant data
979 * @bss: Scan results for the selected BSS, or %NULL if not available
980 * @ssid: Configuration data for the selected network
981 * @wpa_ie: Buffer for the WPA/RSN IE
982 * @wpa_ie_len: Maximum wpa_ie buffer size on input. This is changed to be the
983 * used buffer length in case the functions returns success.
984 * Returns: 0 on success or -1 on failure
986 * This function is used to configure authentication and encryption parameters
987 * based on the network configuration and scan result for the selected BSS (if
990 int wpa_supplicant_set_suites(struct wpa_supplicant *wpa_s,
991 struct wpa_bss *bss, struct wpa_ssid *ssid,
992 u8 *wpa_ie, size_t *wpa_ie_len)
994 struct wpa_ie_data ie;
996 const u8 *bss_wpa, *bss_rsn, *bss_osen;
999 bss_wpa = wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE);
1000 bss_rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
1001 bss_osen = wpa_bss_get_vendor_ie(bss, OSEN_IE_VENDOR_TYPE);
1003 bss_wpa = bss_rsn = bss_osen = NULL;
1005 if (bss_rsn && (ssid->proto & WPA_PROTO_RSN) &&
1006 wpa_parse_wpa_ie(bss_rsn, 2 + bss_rsn[1], &ie) == 0 &&
1007 (ie.group_cipher & ssid->group_cipher) &&
1008 (ie.pairwise_cipher & ssid->pairwise_cipher) &&
1009 (ie.key_mgmt & ssid->key_mgmt)) {
1010 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using IEEE 802.11i/D9.0");
1011 proto = WPA_PROTO_RSN;
1012 } else if (bss_wpa && (ssid->proto & WPA_PROTO_WPA) &&
1013 wpa_parse_wpa_ie(bss_wpa, 2 + bss_wpa[1], &ie) == 0 &&
1014 (ie.group_cipher & ssid->group_cipher) &&
1015 (ie.pairwise_cipher & ssid->pairwise_cipher) &&
1016 (ie.key_mgmt & ssid->key_mgmt)) {
1017 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using IEEE 802.11i/D3.0");
1018 proto = WPA_PROTO_WPA;
1020 } else if (bss_osen && (ssid->proto & WPA_PROTO_OSEN)) {
1021 wpa_dbg(wpa_s, MSG_DEBUG, "HS 2.0: using OSEN");
1022 /* TODO: parse OSEN element */
1023 os_memset(&ie, 0, sizeof(ie));
1024 ie.group_cipher = WPA_CIPHER_CCMP;
1025 ie.pairwise_cipher = WPA_CIPHER_CCMP;
1026 ie.key_mgmt = WPA_KEY_MGMT_OSEN;
1027 proto = WPA_PROTO_OSEN;
1028 #endif /* CONFIG_HS20 */
1030 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select WPA/RSN");
1031 wpa_dbg(wpa_s, MSG_DEBUG,
1032 "WPA: ssid proto=0x%x pairwise_cipher=0x%x group_cipher=0x%x key_mgmt=0x%x",
1033 ssid->proto, ssid->pairwise_cipher, ssid->group_cipher,
1035 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: BSS " MACSTR " ssid='%s'%s%s%s",
1036 MAC2STR(bss->bssid),
1037 wpa_ssid_txt(bss->ssid, bss->ssid_len),
1038 bss_wpa ? " WPA" : "",
1039 bss_rsn ? " RSN" : "",
1040 bss_osen ? " OSEN" : "");
1042 wpa_hexdump(MSG_DEBUG, "RSN", bss_rsn, 2 + bss_rsn[1]);
1043 if (wpa_parse_wpa_ie(bss_rsn, 2 + bss_rsn[1], &ie)) {
1044 wpa_dbg(wpa_s, MSG_DEBUG,
1045 "Could not parse RSN element");
1047 wpa_dbg(wpa_s, MSG_DEBUG,
1048 "RSN: pairwise_cipher=0x%x group_cipher=0x%x key_mgmt=0x%x",
1049 ie.pairwise_cipher, ie.group_cipher,
1054 wpa_hexdump(MSG_DEBUG, "WPA", bss_wpa, 2 + bss_wpa[1]);
1055 if (wpa_parse_wpa_ie(bss_wpa, 2 + bss_wpa[1], &ie)) {
1056 wpa_dbg(wpa_s, MSG_DEBUG,
1057 "Could not parse WPA element");
1059 wpa_dbg(wpa_s, MSG_DEBUG,
1060 "WPA: pairwise_cipher=0x%x group_cipher=0x%x key_mgmt=0x%x",
1061 ie.pairwise_cipher, ie.group_cipher,
1067 if (ssid->proto & WPA_PROTO_OSEN)
1068 proto = WPA_PROTO_OSEN;
1069 else if (ssid->proto & WPA_PROTO_RSN)
1070 proto = WPA_PROTO_RSN;
1072 proto = WPA_PROTO_WPA;
1073 if (wpa_supplicant_suites_from_ai(wpa_s, ssid, &ie) < 0) {
1074 os_memset(&ie, 0, sizeof(ie));
1075 ie.group_cipher = ssid->group_cipher;
1076 ie.pairwise_cipher = ssid->pairwise_cipher;
1077 ie.key_mgmt = ssid->key_mgmt;
1078 #ifdef CONFIG_IEEE80211W
1079 ie.mgmt_group_cipher =
1080 ssid->ieee80211w != NO_MGMT_FRAME_PROTECTION ?
1081 WPA_CIPHER_AES_128_CMAC : 0;
1082 #endif /* CONFIG_IEEE80211W */
1083 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Set cipher suites "
1084 "based on configuration");
1089 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected cipher suites: group %d "
1090 "pairwise %d key_mgmt %d proto %d",
1091 ie.group_cipher, ie.pairwise_cipher, ie.key_mgmt, proto);
1092 #ifdef CONFIG_IEEE80211W
1093 if (ssid->ieee80211w) {
1094 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected mgmt group cipher %d",
1095 ie.mgmt_group_cipher);
1097 #endif /* CONFIG_IEEE80211W */
1099 wpa_s->wpa_proto = proto;
1100 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PROTO, proto);
1101 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED,
1102 !!(ssid->proto & (WPA_PROTO_RSN | WPA_PROTO_OSEN)));
1104 if (bss || !wpa_s->ap_ies_from_associnfo) {
1105 if (wpa_sm_set_ap_wpa_ie(wpa_s->wpa, bss_wpa,
1106 bss_wpa ? 2 + bss_wpa[1] : 0) ||
1107 wpa_sm_set_ap_rsn_ie(wpa_s->wpa, bss_rsn,
1108 bss_rsn ? 2 + bss_rsn[1] : 0))
1112 sel = ie.group_cipher & ssid->group_cipher;
1113 wpa_s->group_cipher = wpa_pick_group_cipher(sel);
1114 if (wpa_s->group_cipher < 0) {
1115 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select group "
1119 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using GTK %s",
1120 wpa_cipher_txt(wpa_s->group_cipher));
1122 sel = ie.pairwise_cipher & ssid->pairwise_cipher;
1123 wpa_s->pairwise_cipher = wpa_pick_pairwise_cipher(sel, 1);
1124 if (wpa_s->pairwise_cipher < 0) {
1125 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select pairwise "
1129 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using PTK %s",
1130 wpa_cipher_txt(wpa_s->pairwise_cipher));
1132 sel = ie.key_mgmt & ssid->key_mgmt;
1134 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SAE))
1135 sel &= ~(WPA_KEY_MGMT_SAE | WPA_KEY_MGMT_FT_SAE);
1136 #endif /* CONFIG_SAE */
1138 } else if (sel & WPA_KEY_MGMT_IEEE8021X_SUITE_B) {
1139 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SUITE_B;
1140 wpa_dbg(wpa_s, MSG_DEBUG,
1141 "WPA: using KEY_MGMT 802.1X with Suite B");
1142 #ifdef CONFIG_IEEE80211R
1143 } else if (sel & WPA_KEY_MGMT_FT_IEEE8021X) {
1144 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_IEEE8021X;
1145 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/802.1X");
1146 } else if (sel & WPA_KEY_MGMT_FT_PSK) {
1147 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_PSK;
1148 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/PSK");
1149 #endif /* CONFIG_IEEE80211R */
1151 } else if (sel & WPA_KEY_MGMT_SAE) {
1152 wpa_s->key_mgmt = WPA_KEY_MGMT_SAE;
1153 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT SAE");
1154 } else if (sel & WPA_KEY_MGMT_FT_SAE) {
1155 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_SAE;
1156 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT FT/SAE");
1157 #endif /* CONFIG_SAE */
1158 #ifdef CONFIG_IEEE80211W
1159 } else if (sel & WPA_KEY_MGMT_IEEE8021X_SHA256) {
1160 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SHA256;
1161 wpa_dbg(wpa_s, MSG_DEBUG,
1162 "WPA: using KEY_MGMT 802.1X with SHA256");
1163 } else if (sel & WPA_KEY_MGMT_PSK_SHA256) {
1164 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK_SHA256;
1165 wpa_dbg(wpa_s, MSG_DEBUG,
1166 "WPA: using KEY_MGMT PSK with SHA256");
1167 #endif /* CONFIG_IEEE80211W */
1168 } else if (sel & WPA_KEY_MGMT_IEEE8021X) {
1169 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X;
1170 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT 802.1X");
1171 } else if (sel & WPA_KEY_MGMT_PSK) {
1172 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK;
1173 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-PSK");
1174 } else if (sel & WPA_KEY_MGMT_WPA_NONE) {
1175 wpa_s->key_mgmt = WPA_KEY_MGMT_WPA_NONE;
1176 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-NONE");
1178 } else if (sel & WPA_KEY_MGMT_OSEN) {
1179 wpa_s->key_mgmt = WPA_KEY_MGMT_OSEN;
1180 wpa_dbg(wpa_s, MSG_DEBUG, "HS 2.0: using KEY_MGMT OSEN");
1181 #endif /* CONFIG_HS20 */
1183 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select "
1184 "authenticated key management type");
1188 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
1189 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
1190 wpa_s->pairwise_cipher);
1191 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
1193 #ifdef CONFIG_IEEE80211W
1194 sel = ie.mgmt_group_cipher;
1195 if ((ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT ?
1196 wpa_s->conf->pmf : ssid->ieee80211w) == NO_MGMT_FRAME_PROTECTION ||
1197 !(ie.capabilities & WPA_CAPABILITY_MFPC))
1199 if (sel & WPA_CIPHER_AES_128_CMAC) {
1200 wpa_s->mgmt_group_cipher = WPA_CIPHER_AES_128_CMAC;
1201 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1203 } else if (sel & WPA_CIPHER_BIP_GMAC_128) {
1204 wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_GMAC_128;
1205 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1207 } else if (sel & WPA_CIPHER_BIP_GMAC_256) {
1208 wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_GMAC_256;
1209 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1211 } else if (sel & WPA_CIPHER_BIP_CMAC_256) {
1212 wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_CMAC_256;
1213 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1216 wpa_s->mgmt_group_cipher = 0;
1217 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: not using MGMT group cipher");
1219 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
1220 wpa_s->mgmt_group_cipher);
1221 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MFP,
1222 (ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT ?
1223 wpa_s->conf->pmf : ssid->ieee80211w));
1224 #endif /* CONFIG_IEEE80211W */
1226 if (wpa_sm_set_assoc_wpa_ie_default(wpa_s->wpa, wpa_ie, wpa_ie_len)) {
1227 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to generate WPA IE");
1231 if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt)) {
1232 wpa_sm_set_pmk(wpa_s->wpa, ssid->psk, PMK_LEN, NULL);
1233 #ifndef CONFIG_NO_PBKDF2
1234 if (bss && ssid->bssid_set && ssid->ssid_len == 0 &&
1237 pbkdf2_sha1(ssid->passphrase, bss->ssid, bss->ssid_len,
1238 4096, psk, PMK_LEN);
1239 wpa_hexdump_key(MSG_MSGDUMP, "PSK (from passphrase)",
1241 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN, NULL);
1242 os_memset(psk, 0, sizeof(psk));
1244 #endif /* CONFIG_NO_PBKDF2 */
1245 #ifdef CONFIG_EXT_PASSWORD
1246 if (ssid->ext_psk) {
1247 struct wpabuf *pw = ext_password_get(wpa_s->ext_pw,
1249 char pw_str[64 + 1];
1253 wpa_msg(wpa_s, MSG_INFO, "EXT PW: No PSK "
1254 "found from external storage");
1258 if (wpabuf_len(pw) < 8 || wpabuf_len(pw) > 64) {
1259 wpa_msg(wpa_s, MSG_INFO, "EXT PW: Unexpected "
1260 "PSK length %d in external storage",
1261 (int) wpabuf_len(pw));
1262 ext_password_free(pw);
1266 os_memcpy(pw_str, wpabuf_head(pw), wpabuf_len(pw));
1267 pw_str[wpabuf_len(pw)] = '\0';
1269 #ifndef CONFIG_NO_PBKDF2
1270 if (wpabuf_len(pw) >= 8 && wpabuf_len(pw) < 64 && bss)
1272 pbkdf2_sha1(pw_str, bss->ssid, bss->ssid_len,
1273 4096, psk, PMK_LEN);
1274 os_memset(pw_str, 0, sizeof(pw_str));
1275 wpa_hexdump_key(MSG_MSGDUMP, "PSK (from "
1276 "external passphrase)",
1278 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN, NULL);
1279 os_memset(psk, 0, sizeof(psk));
1281 #endif /* CONFIG_NO_PBKDF2 */
1282 if (wpabuf_len(pw) == 2 * PMK_LEN) {
1283 if (hexstr2bin(pw_str, psk, PMK_LEN) < 0) {
1284 wpa_msg(wpa_s, MSG_INFO, "EXT PW: "
1285 "Invalid PSK hex string");
1286 os_memset(pw_str, 0, sizeof(pw_str));
1287 ext_password_free(pw);
1290 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN, NULL);
1291 os_memset(psk, 0, sizeof(psk));
1293 wpa_msg(wpa_s, MSG_INFO, "EXT PW: No suitable "
1295 os_memset(pw_str, 0, sizeof(pw_str));
1296 ext_password_free(pw);
1300 os_memset(pw_str, 0, sizeof(pw_str));
1301 ext_password_free(pw);
1303 #endif /* CONFIG_EXT_PASSWORD */
1305 wpa_sm_set_pmk_from_pmksa(wpa_s->wpa);
1311 static void wpas_ext_capab_byte(struct wpa_supplicant *wpa_s, u8 *pos, int idx)
1316 case 0: /* Bits 0-7 */
1318 case 1: /* Bits 8-15 */
1320 case 2: /* Bits 16-23 */
1322 *pos |= 0x02; /* Bit 17 - WNM-Sleep Mode */
1323 *pos |= 0x08; /* Bit 19 - BSS Transition */
1324 #endif /* CONFIG_WNM */
1326 case 3: /* Bits 24-31 */
1328 *pos |= 0x02; /* Bit 25 - SSID List */
1329 #endif /* CONFIG_WNM */
1330 #ifdef CONFIG_INTERWORKING
1331 if (wpa_s->conf->interworking)
1332 *pos |= 0x80; /* Bit 31 - Interworking */
1333 #endif /* CONFIG_INTERWORKING */
1335 case 4: /* Bits 32-39 */
1336 #ifdef CONFIG_INTERWORKING
1337 if (wpa_s->drv_flags / WPA_DRIVER_FLAGS_QOS_MAPPING)
1338 *pos |= 0x01; /* Bit 32 - QoS Map */
1339 #endif /* CONFIG_INTERWORKING */
1341 case 5: /* Bits 40-47 */
1343 if (wpa_s->conf->hs20)
1344 *pos |= 0x40; /* Bit 46 - WNM-Notification */
1345 #endif /* CONFIG_HS20 */
1347 case 6: /* Bits 48-55 */
1353 int wpas_build_ext_capab(struct wpa_supplicant *wpa_s, u8 *buf, size_t buflen)
1358 if (len < wpa_s->extended_capa_len)
1359 len = wpa_s->extended_capa_len;
1360 if (buflen < (size_t) len + 2) {
1361 wpa_printf(MSG_INFO,
1362 "Not enough room for building extended capabilities element");
1366 *pos++ = WLAN_EID_EXT_CAPAB;
1368 for (i = 0; i < len; i++, pos++) {
1369 wpas_ext_capab_byte(wpa_s, pos, i);
1371 if (i < wpa_s->extended_capa_len) {
1372 *pos &= ~wpa_s->extended_capa_mask[i];
1373 *pos |= wpa_s->extended_capa[i];
1377 while (len > 0 && buf[1 + len] == 0) {
1388 static int wpas_valid_bss(struct wpa_supplicant *wpa_s,
1389 struct wpa_bss *test_bss)
1391 struct wpa_bss *bss;
1393 dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
1394 if (bss == test_bss)
1402 static int wpas_valid_ssid(struct wpa_supplicant *wpa_s,
1403 struct wpa_ssid *test_ssid)
1405 struct wpa_ssid *ssid;
1407 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) {
1408 if (ssid == test_ssid)
1416 int wpas_valid_bss_ssid(struct wpa_supplicant *wpa_s, struct wpa_bss *test_bss,
1417 struct wpa_ssid *test_ssid)
1419 if (test_bss && !wpas_valid_bss(wpa_s, test_bss))
1422 return test_ssid == NULL || wpas_valid_ssid(wpa_s, test_ssid);
1426 void wpas_connect_work_free(struct wpa_connect_work *cwork)
1434 void wpas_connect_work_done(struct wpa_supplicant *wpa_s)
1436 struct wpa_connect_work *cwork;
1437 struct wpa_radio_work *work = wpa_s->connect_work;
1442 wpa_s->connect_work = NULL;
1445 wpas_connect_work_free(cwork);
1446 radio_work_done(work);
1450 int wpas_update_random_addr(struct wpa_supplicant *wpa_s, int style)
1452 struct os_reltime now;
1455 os_get_reltime(&now);
1456 if (wpa_s->last_mac_addr_style == style &&
1457 wpa_s->last_mac_addr_change.sec != 0 &&
1458 !os_reltime_expired(&now, &wpa_s->last_mac_addr_change,
1459 wpa_s->conf->rand_addr_lifetime)) {
1460 wpa_msg(wpa_s, MSG_DEBUG,
1461 "Previously selected random MAC address has not yet expired");
1467 if (random_mac_addr(addr) < 0)
1471 os_memcpy(addr, wpa_s->perm_addr, ETH_ALEN);
1472 if (random_mac_addr_keep_oui(addr) < 0)
1479 if (wpa_drv_set_mac_addr(wpa_s, addr) < 0) {
1480 wpa_msg(wpa_s, MSG_INFO,
1481 "Failed to set random MAC address");
1485 os_get_reltime(&wpa_s->last_mac_addr_change);
1486 wpa_s->mac_addr_changed = 1;
1487 wpa_s->last_mac_addr_style = style;
1489 if (wpa_supplicant_update_mac_addr(wpa_s) < 0) {
1490 wpa_msg(wpa_s, MSG_INFO,
1491 "Could not update MAC address information");
1495 wpa_msg(wpa_s, MSG_DEBUG, "Using random MAC address " MACSTR,
1502 int wpas_update_random_addr_disassoc(struct wpa_supplicant *wpa_s)
1504 if (wpa_s->wpa_state >= WPA_AUTHENTICATING ||
1505 !wpa_s->conf->preassoc_mac_addr)
1508 return wpas_update_random_addr(wpa_s, wpa_s->conf->preassoc_mac_addr);
1512 static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit);
1515 * wpa_supplicant_associate - Request association
1516 * @wpa_s: Pointer to wpa_supplicant data
1517 * @bss: Scan results for the selected BSS, or %NULL if not available
1518 * @ssid: Configuration data for the selected network
1520 * This function is used to request %wpa_supplicant to associate with a BSS.
1522 void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
1523 struct wpa_bss *bss, struct wpa_ssid *ssid)
1525 struct wpa_connect_work *cwork;
1528 if (ssid->mac_addr == -1)
1529 rand_style = wpa_s->conf->mac_addr;
1531 rand_style = ssid->mac_addr;
1533 wmm_ac_clear_saved_tspecs(wpa_s);
1534 wpa_s->reassoc_same_bss = 0;
1536 if (wpa_s->last_ssid == ssid) {
1537 wpa_dbg(wpa_s, MSG_DEBUG, "Re-association to the same ESS");
1538 if (wpa_s->current_bss && wpa_s->current_bss == bss) {
1539 wmm_ac_save_tspecs(wpa_s);
1540 wpa_s->reassoc_same_bss = 1;
1542 } else if (rand_style > 0) {
1543 if (wpas_update_random_addr(wpa_s, rand_style) < 0)
1545 wpa_sm_pmksa_cache_flush(wpa_s->wpa, ssid);
1546 } else if (wpa_s->mac_addr_changed) {
1547 if (wpa_drv_set_mac_addr(wpa_s, NULL) < 0) {
1548 wpa_msg(wpa_s, MSG_INFO,
1549 "Could not restore permanent MAC address");
1552 wpa_s->mac_addr_changed = 0;
1553 if (wpa_supplicant_update_mac_addr(wpa_s) < 0) {
1554 wpa_msg(wpa_s, MSG_INFO,
1555 "Could not update MAC address information");
1558 wpa_msg(wpa_s, MSG_DEBUG, "Using permanent MAC address");
1560 wpa_s->last_ssid = ssid;
1562 #ifdef CONFIG_IBSS_RSN
1563 ibss_rsn_deinit(wpa_s->ibss_rsn);
1564 wpa_s->ibss_rsn = NULL;
1565 #endif /* CONFIG_IBSS_RSN */
1567 if (ssid->mode == WPAS_MODE_AP || ssid->mode == WPAS_MODE_P2P_GO ||
1568 ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) {
1570 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_AP)) {
1571 wpa_msg(wpa_s, MSG_INFO, "Driver does not support AP "
1575 if (wpa_supplicant_create_ap(wpa_s, ssid) < 0) {
1576 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
1577 if (ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION)
1578 wpas_p2p_ap_setup_failed(wpa_s);
1581 wpa_s->current_bss = bss;
1582 #else /* CONFIG_AP */
1583 wpa_msg(wpa_s, MSG_ERROR, "AP mode support not included in "
1585 #endif /* CONFIG_AP */
1589 if (ssid->mode == WPAS_MODE_MESH) {
1591 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_MESH)) {
1592 wpa_msg(wpa_s, MSG_INFO,
1593 "Driver does not support mesh mode");
1597 ssid->frequency = bss->freq;
1598 if (wpa_supplicant_join_mesh(wpa_s, ssid) < 0) {
1599 wpa_msg(wpa_s, MSG_ERROR, "Could not join mesh");
1602 wpa_s->current_bss = bss;
1603 wpa_msg_ctrl(wpa_s, MSG_INFO, MESH_GROUP_STARTED
1604 "ssid=\"%s\" id=%d",
1605 wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
1607 #else /* CONFIG_MESH */
1608 wpa_msg(wpa_s, MSG_ERROR,
1609 "mesh mode support not included in the build");
1610 #endif /* CONFIG_MESH */
1616 wpa_tdls_ap_ies(wpa_s->wpa, (const u8 *) (bss + 1),
1618 #endif /* CONFIG_TDLS */
1620 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) &&
1621 ssid->mode == IEEE80211_MODE_INFRA) {
1622 sme_authenticate(wpa_s, bss, ssid);
1626 if (wpa_s->connect_work) {
1627 wpa_dbg(wpa_s, MSG_DEBUG, "Reject wpa_supplicant_associate() call since connect_work exist");
1631 if (radio_work_pending(wpa_s, "connect")) {
1632 wpa_dbg(wpa_s, MSG_DEBUG, "Reject wpa_supplicant_associate() call since pending work exist");
1636 cwork = os_zalloc(sizeof(*cwork));
1643 if (radio_add_work(wpa_s, bss ? bss->freq : 0, "connect", 1,
1644 wpas_start_assoc_cb, cwork) < 0) {
1650 static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
1652 struct wpa_connect_work *cwork = work->ctx;
1653 struct wpa_bss *bss = cwork->bss;
1654 struct wpa_ssid *ssid = cwork->ssid;
1655 struct wpa_supplicant *wpa_s = work->wpa_s;
1658 int use_crypt, ret, i, bssid_changed;
1659 int algs = WPA_AUTH_ALG_OPEN;
1660 unsigned int cipher_pairwise, cipher_group;
1661 struct wpa_driver_associate_params params;
1662 int wep_keys_set = 0;
1663 int assoc_failed = 0;
1664 struct wpa_ssid *old_ssid;
1665 #ifdef CONFIG_HT_OVERRIDES
1666 struct ieee80211_ht_capabilities htcaps;
1667 struct ieee80211_ht_capabilities htcaps_mask;
1668 #endif /* CONFIG_HT_OVERRIDES */
1669 #ifdef CONFIG_VHT_OVERRIDES
1670 struct ieee80211_vht_capabilities vhtcaps;
1671 struct ieee80211_vht_capabilities vhtcaps_mask;
1672 #endif /* CONFIG_VHT_OVERRIDES */
1675 if (work->started) {
1676 wpa_s->connect_work = NULL;
1678 /* cancel possible auth. timeout */
1679 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s,
1682 wpas_connect_work_free(cwork);
1686 wpa_s->connect_work = work;
1688 if (cwork->bss_removed || !wpas_valid_bss_ssid(wpa_s, bss, ssid)) {
1689 wpa_dbg(wpa_s, MSG_DEBUG, "BSS/SSID entry for association not valid anymore - drop connection attempt");
1690 wpas_connect_work_done(wpa_s);
1694 os_memset(¶ms, 0, sizeof(params));
1695 wpa_s->reassociate = 0;
1696 wpa_s->eap_expected_failure = 0;
1698 (!wpas_driver_bss_selection(wpa_s) || wpas_wps_searching(wpa_s))) {
1699 #ifdef CONFIG_IEEE80211R
1700 const u8 *ie, *md = NULL;
1701 #endif /* CONFIG_IEEE80211R */
1702 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with " MACSTR
1703 " (SSID='%s' freq=%d MHz)", MAC2STR(bss->bssid),
1704 wpa_ssid_txt(bss->ssid, bss->ssid_len), bss->freq);
1705 bssid_changed = !is_zero_ether_addr(wpa_s->bssid);
1706 os_memset(wpa_s->bssid, 0, ETH_ALEN);
1707 os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN);
1709 wpas_notify_bssid_changed(wpa_s);
1710 #ifdef CONFIG_IEEE80211R
1711 ie = wpa_bss_get_ie(bss, WLAN_EID_MOBILITY_DOMAIN);
1712 if (ie && ie[1] >= MOBILITY_DOMAIN_ID_LEN)
1714 wpa_sm_set_ft_params(wpa_s->wpa, ie, ie ? 2 + ie[1] : 0);
1716 /* Prepare for the next transition */
1717 wpa_ft_prepare_auth_request(wpa_s->wpa, ie);
1719 #endif /* CONFIG_IEEE80211R */
1721 } else if ((ssid->ssid == NULL || ssid->ssid_len == 0) &&
1722 wpa_s->conf->ap_scan == 2 &&
1723 (ssid->key_mgmt & WPA_KEY_MGMT_WPS)) {
1724 /* Use ap_scan==1 style network selection to find the network
1726 wpas_connect_work_done(wpa_s);
1727 wpa_s->scan_req = MANUAL_SCAN_REQ;
1728 wpa_s->reassociate = 1;
1729 wpa_supplicant_req_scan(wpa_s, 0, 0);
1731 #endif /* CONFIG_WPS */
1733 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with SSID '%s'",
1734 wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
1735 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
1737 wpa_supplicant_cancel_sched_scan(wpa_s);
1738 wpa_supplicant_cancel_scan(wpa_s);
1740 /* Starting new association, so clear the possibly used WPA IE from the
1741 * previous association. */
1742 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
1744 #ifdef IEEE8021X_EAPOL
1745 if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1747 if (ssid->non_leap == 0)
1748 algs = WPA_AUTH_ALG_LEAP;
1750 algs |= WPA_AUTH_ALG_LEAP;
1753 #endif /* IEEE8021X_EAPOL */
1754 wpa_dbg(wpa_s, MSG_DEBUG, "Automatic auth_alg selection: 0x%x", algs);
1755 if (ssid->auth_alg) {
1756 algs = ssid->auth_alg;
1757 wpa_dbg(wpa_s, MSG_DEBUG, "Overriding auth_alg selection: "
1761 if (bss && (wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE) ||
1762 wpa_bss_get_ie(bss, WLAN_EID_RSN)) &&
1763 wpa_key_mgmt_wpa(ssid->key_mgmt)) {
1764 int try_opportunistic;
1765 try_opportunistic = (ssid->proactive_key_caching < 0 ?
1767 ssid->proactive_key_caching) &&
1768 (ssid->proto & WPA_PROTO_RSN);
1769 if (pmksa_cache_set_current(wpa_s->wpa, NULL, bss->bssid,
1770 ssid, try_opportunistic) == 0)
1771 eapol_sm_notify_pmkid_attempt(wpa_s->eapol, 1);
1772 wpa_ie_len = sizeof(wpa_ie);
1773 if (wpa_supplicant_set_suites(wpa_s, bss, ssid,
1774 wpa_ie, &wpa_ie_len)) {
1775 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA "
1776 "key management and encryption suites");
1777 wpas_connect_work_done(wpa_s);
1780 } else if ((ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) && bss &&
1781 wpa_key_mgmt_wpa_ieee8021x(ssid->key_mgmt)) {
1783 * Both WPA and non-WPA IEEE 802.1X enabled in configuration -
1784 * use non-WPA since the scan results did not indicate that the
1785 * AP is using WPA or WPA2.
1787 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
1789 wpa_s->wpa_proto = 0;
1790 } else if (wpa_key_mgmt_wpa_any(ssid->key_mgmt)) {
1791 wpa_ie_len = sizeof(wpa_ie);
1792 if (wpa_supplicant_set_suites(wpa_s, NULL, ssid,
1793 wpa_ie, &wpa_ie_len)) {
1794 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA "
1795 "key management and encryption suites (no "
1797 wpas_connect_work_done(wpa_s);
1801 } else if (ssid->key_mgmt & WPA_KEY_MGMT_WPS) {
1802 struct wpabuf *wps_ie;
1803 wps_ie = wps_build_assoc_req_ie(wpas_wps_get_req_type(ssid));
1804 if (wps_ie && wpabuf_len(wps_ie) <= sizeof(wpa_ie)) {
1805 wpa_ie_len = wpabuf_len(wps_ie);
1806 os_memcpy(wpa_ie, wpabuf_head(wps_ie), wpa_ie_len);
1809 wpabuf_free(wps_ie);
1810 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
1811 if (!bss || (bss->caps & IEEE80211_CAP_PRIVACY))
1812 params.wps = WPS_MODE_PRIVACY;
1814 params.wps = WPS_MODE_OPEN;
1815 wpa_s->wpa_proto = 0;
1816 #endif /* CONFIG_WPS */
1818 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
1820 wpa_s->wpa_proto = 0;
1824 if (wpa_s->global->p2p) {
1828 pos = wpa_ie + wpa_ie_len;
1829 len = sizeof(wpa_ie) - wpa_ie_len;
1830 res = wpas_p2p_assoc_req_ie(wpa_s, bss, pos, len,
1836 wpa_s->cross_connect_disallowed = 0;
1839 p2p = wpa_bss_get_vendor_ie_multi(bss, P2P_IE_VENDOR_TYPE);
1841 wpa_s->cross_connect_disallowed =
1842 p2p_get_cross_connect_disallowed(p2p);
1844 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: WLAN AP %s cross "
1846 wpa_s->cross_connect_disallowed ?
1847 "disallows" : "allows");
1851 os_memset(wpa_s->p2p_ip_addr_info, 0, sizeof(wpa_s->p2p_ip_addr_info));
1852 #endif /* CONFIG_P2P */
1855 if (is_hs20_network(wpa_s, ssid, bss)) {
1856 struct wpabuf *hs20;
1857 hs20 = wpabuf_alloc(20);
1859 int pps_mo_id = hs20_get_pps_mo_id(wpa_s, ssid);
1862 wpas_hs20_add_indication(hs20, pps_mo_id);
1863 len = sizeof(wpa_ie) - wpa_ie_len;
1864 if (wpabuf_len(hs20) <= len) {
1865 os_memcpy(wpa_ie + wpa_ie_len,
1866 wpabuf_head(hs20), wpabuf_len(hs20));
1867 wpa_ie_len += wpabuf_len(hs20);
1872 #endif /* CONFIG_HS20 */
1875 * Workaround: Add Extended Capabilities element only if the AP
1876 * included this element in Beacon/Probe Response frames. Some older
1877 * APs seem to have interoperability issues if this element is
1878 * included, so while the standard may require us to include the
1879 * element in all cases, it is justifiable to skip it to avoid
1880 * interoperability issues.
1882 if (!bss || wpa_bss_get_ie(bss, WLAN_EID_EXT_CAPAB)) {
1885 ext_capab_len = wpas_build_ext_capab(wpa_s, ext_capab,
1887 if (ext_capab_len > 0) {
1889 if (wpa_ie_len > 0 && pos[0] == WLAN_EID_RSN)
1891 os_memmove(pos + ext_capab_len, pos,
1892 wpa_ie_len - (pos - wpa_ie));
1893 wpa_ie_len += ext_capab_len;
1894 os_memcpy(pos, ext_capab, ext_capab_len);
1898 wpa_clear_keys(wpa_s, bss ? bss->bssid : NULL);
1900 cipher_pairwise = wpa_s->pairwise_cipher;
1901 cipher_group = wpa_s->group_cipher;
1902 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
1903 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1904 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE)
1906 if (wpa_set_wep_keys(wpa_s, ssid)) {
1911 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS)
1914 #ifdef IEEE8021X_EAPOL
1915 if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1916 if ((ssid->eapol_flags &
1917 (EAPOL_FLAG_REQUIRE_KEY_UNICAST |
1918 EAPOL_FLAG_REQUIRE_KEY_BROADCAST)) == 0 &&
1922 /* Assume that dynamic WEP-104 keys will be used and
1923 * set cipher suites in order for drivers to expect
1925 cipher_pairwise = cipher_group = WPA_CIPHER_WEP104;
1928 #endif /* IEEE8021X_EAPOL */
1930 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
1931 /* Set the key before (and later after) association */
1932 wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
1935 wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING);
1937 params.ssid = bss->ssid;
1938 params.ssid_len = bss->ssid_len;
1939 if (!wpas_driver_bss_selection(wpa_s) || ssid->bssid_set) {
1940 wpa_printf(MSG_DEBUG, "Limit connection to BSSID "
1941 MACSTR " freq=%u MHz based on scan results "
1943 MAC2STR(bss->bssid), bss->freq,
1945 params.bssid = bss->bssid;
1946 params.freq.freq = bss->freq;
1948 params.bssid_hint = bss->bssid;
1949 params.freq_hint = bss->freq;
1951 params.ssid = ssid->ssid;
1952 params.ssid_len = ssid->ssid_len;
1955 if (ssid->mode == WPAS_MODE_IBSS && ssid->bssid_set &&
1956 wpa_s->conf->ap_scan == 2) {
1957 params.bssid = ssid->bssid;
1958 params.fixed_bssid = 1;
1961 /* Initial frequency for IBSS/mesh */
1962 if ((ssid->mode == WPAS_MODE_IBSS || ssid->mode == WPAS_MODE_MESH) &&
1963 ssid->frequency > 0 && params.freq.freq == 0) {
1964 enum hostapd_hw_mode hw_mode;
1967 params.freq.freq = ssid->frequency;
1969 hw_mode = ieee80211_freq_to_chan(ssid->frequency, &channel);
1970 for (i = 0; wpa_s->hw.modes && i < wpa_s->hw.num_modes; i++) {
1971 if (wpa_s->hw.modes[i].mode == hw_mode) {
1972 struct hostapd_hw_modes *mode;
1974 mode = &wpa_s->hw.modes[i];
1975 params.freq.ht_enabled = ht_supported(mode);
1981 if (ssid->mode == WPAS_MODE_IBSS) {
1982 if (ssid->beacon_int)
1983 params.beacon_int = ssid->beacon_int;
1985 params.beacon_int = wpa_s->conf->beacon_int;
1988 params.wpa_ie = wpa_ie;
1989 params.wpa_ie_len = wpa_ie_len;
1990 params.pairwise_suite = cipher_pairwise;
1991 params.group_suite = cipher_group;
1992 params.key_mgmt_suite = wpa_s->key_mgmt;
1993 params.wpa_proto = wpa_s->wpa_proto;
1994 params.auth_alg = algs;
1995 params.mode = ssid->mode;
1996 params.bg_scan_period = ssid->bg_scan_period;
1997 for (i = 0; i < NUM_WEP_KEYS; i++) {
1998 if (ssid->wep_key_len[i])
1999 params.wep_key[i] = ssid->wep_key[i];
2000 params.wep_key_len[i] = ssid->wep_key_len[i];
2002 params.wep_tx_keyidx = ssid->wep_tx_keyidx;
2004 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) &&
2005 (params.key_mgmt_suite == WPA_KEY_MGMT_PSK ||
2006 params.key_mgmt_suite == WPA_KEY_MGMT_FT_PSK)) {
2007 params.passphrase = ssid->passphrase;
2009 params.psk = ssid->psk;
2012 if (wpa_s->conf->key_mgmt_offload) {
2013 if (params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X ||
2014 params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SHA256 ||
2015 params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SUITE_B)
2016 params.req_key_mgmt_offload =
2017 ssid->proactive_key_caching < 0 ?
2018 wpa_s->conf->okc : ssid->proactive_key_caching;
2020 params.req_key_mgmt_offload = 1;
2022 if ((params.key_mgmt_suite == WPA_KEY_MGMT_PSK ||
2023 params.key_mgmt_suite == WPA_KEY_MGMT_PSK_SHA256 ||
2024 params.key_mgmt_suite == WPA_KEY_MGMT_FT_PSK) &&
2026 params.psk = ssid->psk;
2029 params.drop_unencrypted = use_crypt;
2031 #ifdef CONFIG_IEEE80211W
2032 params.mgmt_frame_protection =
2033 ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT ?
2034 wpa_s->conf->pmf : ssid->ieee80211w;
2035 if (params.mgmt_frame_protection != NO_MGMT_FRAME_PROTECTION && bss) {
2036 const u8 *rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
2037 struct wpa_ie_data ie;
2038 if (rsn && wpa_parse_wpa_ie(rsn, 2 + rsn[1], &ie) == 0 &&
2040 (WPA_CAPABILITY_MFPC | WPA_CAPABILITY_MFPR)) {
2041 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected AP supports "
2042 "MFP: require MFP");
2043 params.mgmt_frame_protection =
2044 MGMT_FRAME_PROTECTION_REQUIRED;
2047 #endif /* CONFIG_IEEE80211W */
2049 params.p2p = ssid->p2p_group;
2051 if (wpa_s->parent->set_sta_uapsd)
2052 params.uapsd = wpa_s->parent->sta_uapsd;
2056 #ifdef CONFIG_HT_OVERRIDES
2057 os_memset(&htcaps, 0, sizeof(htcaps));
2058 os_memset(&htcaps_mask, 0, sizeof(htcaps_mask));
2059 params.htcaps = (u8 *) &htcaps;
2060 params.htcaps_mask = (u8 *) &htcaps_mask;
2061 wpa_supplicant_apply_ht_overrides(wpa_s, ssid, ¶ms);
2062 #endif /* CONFIG_HT_OVERRIDES */
2063 #ifdef CONFIG_VHT_OVERRIDES
2064 os_memset(&vhtcaps, 0, sizeof(vhtcaps));
2065 os_memset(&vhtcaps_mask, 0, sizeof(vhtcaps_mask));
2066 params.vhtcaps = &vhtcaps;
2067 params.vhtcaps_mask = &vhtcaps_mask;
2068 wpa_supplicant_apply_vht_overrides(wpa_s, wpa_s->current_ssid, ¶ms);
2069 #endif /* CONFIG_VHT_OVERRIDES */
2073 * If multi-channel concurrency is not supported, check for any
2074 * frequency conflict. In case of any frequency conflict, remove the
2075 * least prioritized connection.
2077 if (wpa_s->num_multichan_concurrent < 2) {
2079 num = get_shared_radio_freqs(wpa_s, &freq, 1);
2080 if (num > 0 && freq > 0 && freq != params.freq.freq) {
2081 wpa_printf(MSG_DEBUG,
2082 "Assoc conflicting freq found (%d != %d)",
2083 freq, params.freq.freq);
2084 if (wpas_p2p_handle_frequency_conflicts(
2085 wpa_s, params.freq.freq, ssid) < 0) {
2086 wpas_connect_work_done(wpa_s);
2091 #endif /* CONFIG_P2P */
2093 ret = wpa_drv_associate(wpa_s, ¶ms);
2095 wpa_msg(wpa_s, MSG_INFO, "Association request to the driver "
2097 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SANE_ERROR_CODES) {
2099 * The driver is known to mean what is saying, so we
2100 * can stop right here; the association will not
2103 wpas_connection_failed(wpa_s, wpa_s->pending_bssid);
2104 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
2105 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
2108 /* try to continue anyway; new association will be tried again
2113 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
2114 /* Set the key after the association just in case association
2115 * cleared the previously configured key. */
2116 wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
2117 /* No need to timeout authentication since there is no key
2119 wpa_supplicant_cancel_auth_timeout(wpa_s);
2120 wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
2121 #ifdef CONFIG_IBSS_RSN
2122 } else if (ssid->mode == WPAS_MODE_IBSS &&
2123 wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
2124 wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
2126 * RSN IBSS authentication is per-STA and we can disable the
2127 * per-BSSID authentication.
2129 wpa_supplicant_cancel_auth_timeout(wpa_s);
2130 #endif /* CONFIG_IBSS_RSN */
2132 /* Timeout for IEEE 802.11 authentication and association */
2136 /* give IBSS a bit more time */
2137 timeout = ssid->mode == WPAS_MODE_IBSS ? 10 : 5;
2138 } else if (wpa_s->conf->ap_scan == 1) {
2139 /* give IBSS a bit more time */
2140 timeout = ssid->mode == WPAS_MODE_IBSS ? 20 : 10;
2142 wpa_supplicant_req_auth_timeout(wpa_s, timeout, 0);
2146 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC)) {
2147 /* Set static WEP keys again */
2148 wpa_set_wep_keys(wpa_s, ssid);
2151 if (wpa_s->current_ssid && wpa_s->current_ssid != ssid) {
2153 * Do not allow EAP session resumption between different
2154 * network configurations.
2156 eapol_sm_invalidate_cached_session(wpa_s->eapol);
2158 old_ssid = wpa_s->current_ssid;
2159 wpa_s->current_ssid = ssid;
2160 wpa_s->current_bss = bss;
2161 wpa_supplicant_rsn_supp_set_config(wpa_s, wpa_s->current_ssid);
2162 wpa_supplicant_initiate_eapol(wpa_s);
2163 if (old_ssid != wpa_s->current_ssid)
2164 wpas_notify_network_changed(wpa_s);
2168 static void wpa_supplicant_clear_connection(struct wpa_supplicant *wpa_s,
2171 struct wpa_ssid *old_ssid;
2173 wpas_connect_work_done(wpa_s);
2174 wpa_clear_keys(wpa_s, addr);
2175 old_ssid = wpa_s->current_ssid;
2176 wpa_supplicant_mark_disassoc(wpa_s);
2177 wpa_sm_set_config(wpa_s->wpa, NULL);
2178 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
2179 if (old_ssid != wpa_s->current_ssid)
2180 wpas_notify_network_changed(wpa_s);
2181 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
2186 * wpa_supplicant_deauthenticate - Deauthenticate the current connection
2187 * @wpa_s: Pointer to wpa_supplicant data
2188 * @reason_code: IEEE 802.11 reason code for the deauthenticate frame
2190 * This function is used to request %wpa_supplicant to deauthenticate from the
2193 void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
2197 union wpa_event_data event;
2200 wpa_dbg(wpa_s, MSG_DEBUG, "Request to deauthenticate - bssid=" MACSTR
2201 " pending_bssid=" MACSTR " reason=%d state=%s",
2202 MAC2STR(wpa_s->bssid), MAC2STR(wpa_s->pending_bssid),
2203 reason_code, wpa_supplicant_state_txt(wpa_s->wpa_state));
2205 if (!is_zero_ether_addr(wpa_s->bssid))
2206 addr = wpa_s->bssid;
2207 else if (!is_zero_ether_addr(wpa_s->pending_bssid) &&
2208 (wpa_s->wpa_state == WPA_AUTHENTICATING ||
2209 wpa_s->wpa_state == WPA_ASSOCIATING))
2210 addr = wpa_s->pending_bssid;
2211 else if (wpa_s->wpa_state == WPA_ASSOCIATING) {
2213 * When using driver-based BSS selection, we may not know the
2214 * BSSID with which we are currently trying to associate. We
2215 * need to notify the driver of this disconnection even in such
2216 * a case, so use the all zeros address here.
2218 addr = wpa_s->bssid;
2223 wpa_tdls_teardown_peers(wpa_s->wpa);
2224 #endif /* CONFIG_TDLS */
2228 wpa_msg_ctrl(wpa_s, MSG_INFO, MESH_GROUP_REMOVED "%s",
2230 wpa_supplicant_leave_mesh(wpa_s);
2232 #endif /* CONFIG_MESH */
2235 wpa_drv_deauthenticate(wpa_s, addr, reason_code);
2236 os_memset(&event, 0, sizeof(event));
2237 event.deauth_info.reason_code = (u16) reason_code;
2238 event.deauth_info.locally_generated = 1;
2239 wpa_supplicant_event(wpa_s, EVENT_DEAUTH, &event);
2244 wpa_supplicant_clear_connection(wpa_s, addr);
2247 static void wpa_supplicant_enable_one_network(struct wpa_supplicant *wpa_s,
2248 struct wpa_ssid *ssid)
2250 if (!ssid || !ssid->disabled || ssid->disabled == 2)
2254 wpas_clear_temp_disabled(wpa_s, ssid, 1);
2255 wpas_notify_network_enabled_changed(wpa_s, ssid);
2258 * Try to reassociate since there is no current configuration and a new
2259 * network was made available.
2261 if (!wpa_s->current_ssid && !wpa_s->disconnected)
2262 wpa_s->reassociate = 1;
2267 * wpa_supplicant_enable_network - Mark a configured network as enabled
2268 * @wpa_s: wpa_supplicant structure for a network interface
2269 * @ssid: wpa_ssid structure for a configured network or %NULL
2271 * Enables the specified network or all networks if no network specified.
2273 void wpa_supplicant_enable_network(struct wpa_supplicant *wpa_s,
2274 struct wpa_ssid *ssid)
2277 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
2278 wpa_supplicant_enable_one_network(wpa_s, ssid);
2280 wpa_supplicant_enable_one_network(wpa_s, ssid);
2282 if (wpa_s->reassociate && !wpa_s->disconnected) {
2283 if (wpa_s->sched_scanning) {
2284 wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan to add "
2285 "new network to scan filters");
2286 wpa_supplicant_cancel_sched_scan(wpa_s);
2289 if (wpa_supplicant_fast_associate(wpa_s) != 1)
2290 wpa_supplicant_req_scan(wpa_s, 0, 0);
2296 * wpa_supplicant_disable_network - Mark a configured network as disabled
2297 * @wpa_s: wpa_supplicant structure for a network interface
2298 * @ssid: wpa_ssid structure for a configured network or %NULL
2300 * Disables the specified network or all networks if no network specified.
2302 void wpa_supplicant_disable_network(struct wpa_supplicant *wpa_s,
2303 struct wpa_ssid *ssid)
2305 struct wpa_ssid *other_ssid;
2309 if (wpa_s->sched_scanning)
2310 wpa_supplicant_cancel_sched_scan(wpa_s);
2312 for (other_ssid = wpa_s->conf->ssid; other_ssid;
2313 other_ssid = other_ssid->next) {
2314 was_disabled = other_ssid->disabled;
2315 if (was_disabled == 2)
2316 continue; /* do not change persistent P2P group
2319 other_ssid->disabled = 1;
2321 if (was_disabled != other_ssid->disabled)
2322 wpas_notify_network_enabled_changed(
2325 if (wpa_s->current_ssid)
2326 wpa_supplicant_deauthenticate(
2327 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
2328 } else if (ssid->disabled != 2) {
2329 if (ssid == wpa_s->current_ssid)
2330 wpa_supplicant_deauthenticate(
2331 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
2333 was_disabled = ssid->disabled;
2337 if (was_disabled != ssid->disabled) {
2338 wpas_notify_network_enabled_changed(wpa_s, ssid);
2339 if (wpa_s->sched_scanning) {
2340 wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan "
2341 "to remove network from filters");
2342 wpa_supplicant_cancel_sched_scan(wpa_s);
2343 wpa_supplicant_req_scan(wpa_s, 0, 0);
2351 * wpa_supplicant_select_network - Attempt association with a network
2352 * @wpa_s: wpa_supplicant structure for a network interface
2353 * @ssid: wpa_ssid structure for a configured network or %NULL for any network
2355 void wpa_supplicant_select_network(struct wpa_supplicant *wpa_s,
2356 struct wpa_ssid *ssid)
2359 struct wpa_ssid *other_ssid;
2360 int disconnected = 0;
2362 if (ssid && ssid != wpa_s->current_ssid && wpa_s->current_ssid) {
2363 wpa_supplicant_deauthenticate(
2364 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
2369 wpas_clear_temp_disabled(wpa_s, ssid, 1);
2372 * Mark all other networks disabled or mark all networks enabled if no
2373 * network specified.
2375 for (other_ssid = wpa_s->conf->ssid; other_ssid;
2376 other_ssid = other_ssid->next) {
2377 int was_disabled = other_ssid->disabled;
2378 if (was_disabled == 2)
2379 continue; /* do not change persistent P2P group data */
2381 other_ssid->disabled = ssid ? (ssid->id != other_ssid->id) : 0;
2382 if (was_disabled && !other_ssid->disabled)
2383 wpas_clear_temp_disabled(wpa_s, other_ssid, 0);
2385 if (was_disabled != other_ssid->disabled)
2386 wpas_notify_network_enabled_changed(wpa_s, other_ssid);
2389 if (ssid && ssid == wpa_s->current_ssid && wpa_s->current_ssid) {
2390 /* We are already associated with the selected network */
2391 wpa_printf(MSG_DEBUG, "Already associated with the "
2392 "selected network - do nothing");
2397 wpa_s->current_ssid = ssid;
2398 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
2399 wpa_s->connect_without_scan =
2400 (ssid->mode == WPAS_MODE_MESH) ? ssid : NULL;
2402 wpa_s->connect_without_scan = NULL;
2405 wpa_s->disconnected = 0;
2406 wpa_s->reassociate = 1;
2408 if (wpa_s->connect_without_scan ||
2409 wpa_supplicant_fast_associate(wpa_s) != 1)
2410 wpa_supplicant_req_scan(wpa_s, 0, disconnected ? 100000 : 0);
2413 wpas_notify_network_selected(wpa_s, ssid);
2418 * wpas_set_pkcs11_engine_and_module_path - Set PKCS #11 engine and module path
2419 * @wpa_s: wpa_supplicant structure for a network interface
2420 * @pkcs11_engine_path: PKCS #11 engine path or NULL
2421 * @pkcs11_module_path: PKCS #11 module path or NULL
2422 * Returns: 0 on success; -1 on failure
2424 * Sets the PKCS #11 engine and module path. Both have to be NULL or a valid
2425 * path. If resetting the EAPOL state machine with the new PKCS #11 engine and
2426 * module path fails the paths will be reset to the default value (NULL).
2428 int wpas_set_pkcs11_engine_and_module_path(struct wpa_supplicant *wpa_s,
2429 const char *pkcs11_engine_path,
2430 const char *pkcs11_module_path)
2432 char *pkcs11_engine_path_copy = NULL;
2433 char *pkcs11_module_path_copy = NULL;
2435 if (pkcs11_engine_path != NULL) {
2436 pkcs11_engine_path_copy = os_strdup(pkcs11_engine_path);
2437 if (pkcs11_engine_path_copy == NULL)
2440 if (pkcs11_module_path != NULL) {
2441 pkcs11_module_path_copy = os_strdup(pkcs11_module_path);
2442 if (pkcs11_module_path_copy == NULL) {
2443 os_free(pkcs11_engine_path_copy);
2448 os_free(wpa_s->conf->pkcs11_engine_path);
2449 os_free(wpa_s->conf->pkcs11_module_path);
2450 wpa_s->conf->pkcs11_engine_path = pkcs11_engine_path_copy;
2451 wpa_s->conf->pkcs11_module_path = pkcs11_module_path_copy;
2453 wpa_sm_set_eapol(wpa_s->wpa, NULL);
2454 eapol_sm_deinit(wpa_s->eapol);
2455 wpa_s->eapol = NULL;
2456 if (wpa_supplicant_init_eapol(wpa_s)) {
2457 /* Error -> Reset paths to the default value (NULL) once. */
2458 if (pkcs11_engine_path != NULL && pkcs11_module_path != NULL)
2459 wpas_set_pkcs11_engine_and_module_path(wpa_s, NULL,
2464 wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
2471 * wpa_supplicant_set_ap_scan - Set AP scan mode for interface
2472 * @wpa_s: wpa_supplicant structure for a network interface
2473 * @ap_scan: AP scan mode
2474 * Returns: 0 if succeed or -1 if ap_scan has an invalid value
2477 int wpa_supplicant_set_ap_scan(struct wpa_supplicant *wpa_s, int ap_scan)
2482 if (ap_scan < 0 || ap_scan > 2)
2486 if (ap_scan == 2 && ap_scan != wpa_s->conf->ap_scan &&
2487 wpa_s->wpa_state >= WPA_ASSOCIATING &&
2488 wpa_s->wpa_state < WPA_COMPLETED) {
2489 wpa_printf(MSG_ERROR, "ap_scan = %d (%d) rejected while "
2490 "associating", wpa_s->conf->ap_scan, ap_scan);
2493 #endif /* ANDROID */
2495 old_ap_scan = wpa_s->conf->ap_scan;
2496 wpa_s->conf->ap_scan = ap_scan;
2498 if (old_ap_scan != wpa_s->conf->ap_scan)
2499 wpas_notify_ap_scan_changed(wpa_s);
2506 * wpa_supplicant_set_bss_expiration_age - Set BSS entry expiration age
2507 * @wpa_s: wpa_supplicant structure for a network interface
2508 * @expire_age: Expiration age in seconds
2509 * Returns: 0 if succeed or -1 if expire_age has an invalid value
2512 int wpa_supplicant_set_bss_expiration_age(struct wpa_supplicant *wpa_s,
2513 unsigned int bss_expire_age)
2515 if (bss_expire_age < 10) {
2516 wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration age %u",
2520 wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration age: %d sec",
2522 wpa_s->conf->bss_expiration_age = bss_expire_age;
2529 * wpa_supplicant_set_bss_expiration_count - Set BSS entry expiration scan count
2530 * @wpa_s: wpa_supplicant structure for a network interface
2531 * @expire_count: number of scans after which an unseen BSS is reclaimed
2532 * Returns: 0 if succeed or -1 if expire_count has an invalid value
2535 int wpa_supplicant_set_bss_expiration_count(struct wpa_supplicant *wpa_s,
2536 unsigned int bss_expire_count)
2538 if (bss_expire_count < 1) {
2539 wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration count %u",
2543 wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration scan count: %u",
2545 wpa_s->conf->bss_expiration_scan_count = bss_expire_count;
2552 * wpa_supplicant_set_scan_interval - Set scan interval
2553 * @wpa_s: wpa_supplicant structure for a network interface
2554 * @scan_interval: scan interval in seconds
2555 * Returns: 0 if succeed or -1 if scan_interval has an invalid value
2558 int wpa_supplicant_set_scan_interval(struct wpa_supplicant *wpa_s,
2561 if (scan_interval < 0) {
2562 wpa_msg(wpa_s, MSG_ERROR, "Invalid scan interval %d",
2566 wpa_msg(wpa_s, MSG_DEBUG, "Setting scan interval: %d sec",
2568 wpa_supplicant_update_scan_int(wpa_s, scan_interval);
2575 * wpa_supplicant_set_debug_params - Set global debug params
2576 * @global: wpa_global structure
2577 * @debug_level: debug level
2578 * @debug_timestamp: determines if show timestamp in debug data
2579 * @debug_show_keys: determines if show keys in debug data
2580 * Returns: 0 if succeed or -1 if debug_level has wrong value
2582 int wpa_supplicant_set_debug_params(struct wpa_global *global, int debug_level,
2583 int debug_timestamp, int debug_show_keys)
2586 int old_level, old_timestamp, old_show_keys;
2588 /* check for allowed debuglevels */
2589 if (debug_level != MSG_EXCESSIVE &&
2590 debug_level != MSG_MSGDUMP &&
2591 debug_level != MSG_DEBUG &&
2592 debug_level != MSG_INFO &&
2593 debug_level != MSG_WARNING &&
2594 debug_level != MSG_ERROR)
2597 old_level = wpa_debug_level;
2598 old_timestamp = wpa_debug_timestamp;
2599 old_show_keys = wpa_debug_show_keys;
2601 wpa_debug_level = debug_level;
2602 wpa_debug_timestamp = debug_timestamp ? 1 : 0;
2603 wpa_debug_show_keys = debug_show_keys ? 1 : 0;
2605 if (wpa_debug_level != old_level)
2606 wpas_notify_debug_level_changed(global);
2607 if (wpa_debug_timestamp != old_timestamp)
2608 wpas_notify_debug_timestamp_changed(global);
2609 if (wpa_debug_show_keys != old_show_keys)
2610 wpas_notify_debug_show_keys_changed(global);
2617 * wpa_supplicant_get_ssid - Get a pointer to the current network structure
2618 * @wpa_s: Pointer to wpa_supplicant data
2619 * Returns: A pointer to the current network structure or %NULL on failure
2621 struct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s)
2623 struct wpa_ssid *entry;
2624 u8 ssid[MAX_SSID_LEN];
2630 res = wpa_drv_get_ssid(wpa_s, ssid);
2632 wpa_msg(wpa_s, MSG_WARNING, "Could not read SSID from "
2638 if (wpa_drv_get_bssid(wpa_s, bssid) < 0) {
2639 wpa_msg(wpa_s, MSG_WARNING, "Could not read BSSID from "
2644 wired = wpa_s->conf->ap_scan == 0 &&
2645 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED);
2647 entry = wpa_s->conf->ssid;
2649 if (!wpas_network_disabled(wpa_s, entry) &&
2650 ((ssid_len == entry->ssid_len &&
2651 os_memcmp(ssid, entry->ssid, ssid_len) == 0) || wired) &&
2652 (!entry->bssid_set ||
2653 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
2656 if (!wpas_network_disabled(wpa_s, entry) &&
2657 (entry->key_mgmt & WPA_KEY_MGMT_WPS) &&
2658 (entry->ssid == NULL || entry->ssid_len == 0) &&
2659 (!entry->bssid_set ||
2660 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
2662 #endif /* CONFIG_WPS */
2664 if (!wpas_network_disabled(wpa_s, entry) && entry->bssid_set &&
2665 entry->ssid_len == 0 &&
2666 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0)
2669 entry = entry->next;
2676 static int select_driver(struct wpa_supplicant *wpa_s, int i)
2678 struct wpa_global *global = wpa_s->global;
2680 if (wpa_drivers[i]->global_init && global->drv_priv[i] == NULL) {
2681 global->drv_priv[i] = wpa_drivers[i]->global_init();
2682 if (global->drv_priv[i] == NULL) {
2683 wpa_printf(MSG_ERROR, "Failed to initialize driver "
2684 "'%s'", wpa_drivers[i]->name);
2689 wpa_s->driver = wpa_drivers[i];
2690 wpa_s->global_drv_priv = global->drv_priv[i];
2696 static int wpa_supplicant_set_driver(struct wpa_supplicant *wpa_s,
2701 const char *pos, *driver = name;
2706 if (wpa_drivers[0] == NULL) {
2707 wpa_msg(wpa_s, MSG_ERROR, "No driver interfaces build into "
2713 /* default to first driver in the list */
2714 return select_driver(wpa_s, 0);
2718 pos = os_strchr(driver, ',');
2722 len = os_strlen(driver);
2724 for (i = 0; wpa_drivers[i]; i++) {
2725 if (os_strlen(wpa_drivers[i]->name) == len &&
2726 os_strncmp(driver, wpa_drivers[i]->name, len) ==
2728 /* First driver that succeeds wins */
2729 if (select_driver(wpa_s, i) == 0)
2737 wpa_msg(wpa_s, MSG_ERROR, "Unsupported driver '%s'", name);
2743 * wpa_supplicant_rx_eapol - Deliver a received EAPOL frame to wpa_supplicant
2744 * @ctx: Context pointer (wpa_s); this is the ctx variable registered
2745 * with struct wpa_driver_ops::init()
2746 * @src_addr: Source address of the EAPOL frame
2747 * @buf: EAPOL data starting from the EAPOL header (i.e., no Ethernet header)
2748 * @len: Length of the EAPOL data
2750 * This function is called for each received EAPOL frame. Most driver
2751 * interfaces rely on more generic OS mechanism for receiving frames through
2752 * l2_packet, but if such a mechanism is not available, the driver wrapper may
2753 * take care of received EAPOL frames and deliver them to the core supplicant
2754 * code by calling this function.
2756 void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr,
2757 const u8 *buf, size_t len)
2759 struct wpa_supplicant *wpa_s = ctx;
2761 wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR, MAC2STR(src_addr));
2762 wpa_hexdump(MSG_MSGDUMP, "RX EAPOL", buf, len);
2764 #ifdef CONFIG_PEERKEY
2765 if (wpa_s->wpa_state > WPA_ASSOCIATED && wpa_s->current_ssid &&
2766 wpa_s->current_ssid->peerkey &&
2767 !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) &&
2768 wpa_sm_rx_eapol_peerkey(wpa_s->wpa, src_addr, buf, len) == 1) {
2769 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: Processed PeerKey EAPOL-Key");
2772 #endif /* CONFIG_PEERKEY */
2774 if (wpa_s->wpa_state < WPA_ASSOCIATED ||
2775 (wpa_s->last_eapol_matches_bssid &&
2778 #endif /* CONFIG_AP */
2779 os_memcmp(src_addr, wpa_s->bssid, ETH_ALEN) != 0)) {
2781 * There is possible race condition between receiving the
2782 * association event and the EAPOL frame since they are coming
2783 * through different paths from the driver. In order to avoid
2784 * issues in trying to process the EAPOL frame before receiving
2785 * association information, lets queue it for processing until
2786 * the association event is received. This may also be needed in
2787 * driver-based roaming case, so also use src_addr != BSSID as a
2788 * trigger if we have previously confirmed that the
2789 * Authenticator uses BSSID as the src_addr (which is not the
2790 * case with wired IEEE 802.1X).
2792 wpa_dbg(wpa_s, MSG_DEBUG, "Not associated - Delay processing "
2793 "of received EAPOL frame (state=%s bssid=" MACSTR ")",
2794 wpa_supplicant_state_txt(wpa_s->wpa_state),
2795 MAC2STR(wpa_s->bssid));
2796 wpabuf_free(wpa_s->pending_eapol_rx);
2797 wpa_s->pending_eapol_rx = wpabuf_alloc_copy(buf, len);
2798 if (wpa_s->pending_eapol_rx) {
2799 os_get_reltime(&wpa_s->pending_eapol_rx_time);
2800 os_memcpy(wpa_s->pending_eapol_rx_src, src_addr,
2806 wpa_s->last_eapol_matches_bssid =
2807 os_memcmp(src_addr, wpa_s->bssid, ETH_ALEN) == 0;
2810 if (wpa_s->ap_iface) {
2811 wpa_supplicant_ap_rx_eapol(wpa_s, src_addr, buf, len);
2814 #endif /* CONFIG_AP */
2816 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE) {
2817 wpa_dbg(wpa_s, MSG_DEBUG, "Ignored received EAPOL frame since "
2818 "no key management is configured");
2822 if (wpa_s->eapol_received == 0 &&
2823 (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) ||
2824 !wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) ||
2825 wpa_s->wpa_state != WPA_COMPLETED) &&
2826 (wpa_s->current_ssid == NULL ||
2827 wpa_s->current_ssid->mode != IEEE80211_MODE_IBSS)) {
2828 /* Timeout for completing IEEE 802.1X and WPA authentication */
2829 wpa_supplicant_req_auth_timeout(
2831 (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) ||
2832 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA ||
2833 wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) ?
2836 wpa_s->eapol_received++;
2838 if (wpa_s->countermeasures) {
2839 wpa_msg(wpa_s, MSG_INFO, "WPA: Countermeasures - dropped "
2844 #ifdef CONFIG_IBSS_RSN
2845 if (wpa_s->current_ssid &&
2846 wpa_s->current_ssid->mode == WPAS_MODE_IBSS) {
2847 ibss_rsn_rx_eapol(wpa_s->ibss_rsn, src_addr, buf, len);
2850 #endif /* CONFIG_IBSS_RSN */
2852 /* Source address of the incoming EAPOL frame could be compared to the
2853 * current BSSID. However, it is possible that a centralized
2854 * Authenticator could be using another MAC address than the BSSID of
2855 * an AP, so just allow any address to be used for now. The replies are
2856 * still sent to the current BSSID (if available), though. */
2858 os_memcpy(wpa_s->last_eapol_src, src_addr, ETH_ALEN);
2859 if (!wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) &&
2860 eapol_sm_rx_eapol(wpa_s->eapol, src_addr, buf, len) > 0)
2862 wpa_drv_poll(wpa_s);
2863 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE))
2864 wpa_sm_rx_eapol(wpa_s->wpa, src_addr, buf, len);
2865 else if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt)) {
2867 * Set portValid = TRUE here since we are going to skip 4-way
2868 * handshake processing which would normally set portValid. We
2869 * need this to allow the EAPOL state machines to be completed
2870 * without going through EAPOL-Key handshake.
2872 eapol_sm_notify_portValid(wpa_s->eapol, TRUE);
2877 int wpa_supplicant_update_mac_addr(struct wpa_supplicant *wpa_s)
2879 if ((!wpa_s->p2p_mgmt ||
2880 !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)) &&
2881 !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE)) {
2882 l2_packet_deinit(wpa_s->l2);
2883 wpa_s->l2 = l2_packet_init(wpa_s->ifname,
2884 wpa_drv_get_mac_addr(wpa_s),
2886 wpa_supplicant_rx_eapol, wpa_s, 0);
2887 if (wpa_s->l2 == NULL)
2890 const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
2892 os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
2895 if (wpa_s->l2 && l2_packet_get_own_addr(wpa_s->l2, wpa_s->own_addr)) {
2896 wpa_msg(wpa_s, MSG_ERROR, "Failed to get own L2 address");
2900 wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
2906 static void wpa_supplicant_rx_eapol_bridge(void *ctx, const u8 *src_addr,
2907 const u8 *buf, size_t len)
2909 struct wpa_supplicant *wpa_s = ctx;
2910 const struct l2_ethhdr *eth;
2912 if (len < sizeof(*eth))
2914 eth = (const struct l2_ethhdr *) buf;
2916 if (os_memcmp(eth->h_dest, wpa_s->own_addr, ETH_ALEN) != 0 &&
2917 !(eth->h_dest[0] & 0x01)) {
2918 wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR " to " MACSTR
2919 " (bridge - not for this interface - ignore)",
2920 MAC2STR(src_addr), MAC2STR(eth->h_dest));
2924 wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR " to " MACSTR
2925 " (bridge)", MAC2STR(src_addr), MAC2STR(eth->h_dest));
2926 wpa_supplicant_rx_eapol(wpa_s, src_addr, buf + sizeof(*eth),
2927 len - sizeof(*eth));
2932 * wpa_supplicant_driver_init - Initialize driver interface parameters
2933 * @wpa_s: Pointer to wpa_supplicant data
2934 * Returns: 0 on success, -1 on failure
2936 * This function is called to initialize driver interface parameters.
2937 * wpa_drv_init() must have been called before this function to initialize the
2940 int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s)
2942 static int interface_count = 0;
2944 if (wpa_supplicant_update_mac_addr(wpa_s) < 0)
2947 wpa_dbg(wpa_s, MSG_DEBUG, "Own MAC address: " MACSTR,
2948 MAC2STR(wpa_s->own_addr));
2949 os_memcpy(wpa_s->perm_addr, wpa_s->own_addr, ETH_ALEN);
2950 wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
2952 if (wpa_s->bridge_ifname[0]) {
2953 wpa_dbg(wpa_s, MSG_DEBUG, "Receiving packets from bridge "
2954 "interface '%s'", wpa_s->bridge_ifname);
2955 wpa_s->l2_br = l2_packet_init(wpa_s->bridge_ifname,
2958 wpa_supplicant_rx_eapol_bridge,
2960 if (wpa_s->l2_br == NULL) {
2961 wpa_msg(wpa_s, MSG_ERROR, "Failed to open l2_packet "
2962 "connection for the bridge interface '%s'",
2963 wpa_s->bridge_ifname);
2968 wpa_clear_keys(wpa_s, NULL);
2970 /* Make sure that TKIP countermeasures are not left enabled (could
2971 * happen if wpa_supplicant is killed during countermeasures. */
2972 wpa_drv_set_countermeasures(wpa_s, 0);
2974 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: flushing PMKID list in the driver");
2975 wpa_drv_flush_pmkid(wpa_s);
2977 wpa_s->prev_scan_ssid = WILDCARD_SSID_SCAN;
2978 wpa_s->prev_scan_wildcard = 0;
2980 if (wpa_supplicant_enabled_networks(wpa_s)) {
2981 if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
2982 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
2983 interface_count = 0;
2986 if (!wpa_s->p2p_mgmt &&
2987 wpa_supplicant_delayed_sched_scan(wpa_s,
2988 interface_count % 3,
2990 wpa_supplicant_req_scan(wpa_s, interface_count % 3,
2992 #endif /* ANDROID */
2995 wpa_supplicant_set_state(wpa_s, WPA_INACTIVE);
3001 static int wpa_supplicant_daemon(const char *pid_file)
3003 wpa_printf(MSG_DEBUG, "Daemonize..");
3004 return os_daemonize(pid_file);
3008 static struct wpa_supplicant * wpa_supplicant_alloc(void)
3010 struct wpa_supplicant *wpa_s;
3012 wpa_s = os_zalloc(sizeof(*wpa_s));
3015 wpa_s->scan_req = INITIAL_SCAN_REQ;
3016 wpa_s->scan_interval = 5;
3017 wpa_s->new_connection = 1;
3018 wpa_s->parent = wpa_s;
3019 wpa_s->sched_scanning = 0;
3025 #ifdef CONFIG_HT_OVERRIDES
3027 static int wpa_set_htcap_mcs(struct wpa_supplicant *wpa_s,
3028 struct ieee80211_ht_capabilities *htcaps,
3029 struct ieee80211_ht_capabilities *htcaps_mask,
3032 /* parse ht_mcs into hex array */
3034 const char *tmp = ht_mcs;
3037 /* If ht_mcs is null, do not set anything */
3041 /* This is what we are setting in the kernel */
3042 os_memset(&htcaps->supported_mcs_set, 0, IEEE80211_HT_MCS_MASK_LEN);
3044 wpa_msg(wpa_s, MSG_DEBUG, "set_htcap, ht_mcs -:%s:-", ht_mcs);
3046 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
3048 long v = strtol(tmp, &end, 16);
3050 wpa_msg(wpa_s, MSG_DEBUG,
3051 "htcap value[%i]: %ld end: %p tmp: %p",
3056 htcaps->supported_mcs_set[i] = v;
3059 wpa_msg(wpa_s, MSG_ERROR,
3060 "Failed to parse ht-mcs: %s, error: %s\n",
3061 ht_mcs, strerror(errno));
3067 * If we were able to parse any values, then set mask for the MCS set.
3070 os_memset(&htcaps_mask->supported_mcs_set, 0xff,
3071 IEEE80211_HT_MCS_MASK_LEN - 1);
3072 /* skip the 3 reserved bits */
3073 htcaps_mask->supported_mcs_set[IEEE80211_HT_MCS_MASK_LEN - 1] =
3081 static int wpa_disable_max_amsdu(struct wpa_supplicant *wpa_s,
3082 struct ieee80211_ht_capabilities *htcaps,
3083 struct ieee80211_ht_capabilities *htcaps_mask,
3088 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_max_amsdu: %d", disabled);
3093 msk = host_to_le16(HT_CAP_INFO_MAX_AMSDU_SIZE);
3094 htcaps_mask->ht_capabilities_info |= msk;
3096 htcaps->ht_capabilities_info &= msk;
3098 htcaps->ht_capabilities_info |= msk;
3104 static int wpa_set_ampdu_factor(struct wpa_supplicant *wpa_s,
3105 struct ieee80211_ht_capabilities *htcaps,
3106 struct ieee80211_ht_capabilities *htcaps_mask,
3109 wpa_msg(wpa_s, MSG_DEBUG, "set_ampdu_factor: %d", factor);
3114 if (factor < 0 || factor > 3) {
3115 wpa_msg(wpa_s, MSG_ERROR, "ampdu_factor: %d out of range. "
3116 "Must be 0-3 or -1", factor);
3120 htcaps_mask->a_mpdu_params |= 0x3; /* 2 bits for factor */
3121 htcaps->a_mpdu_params &= ~0x3;
3122 htcaps->a_mpdu_params |= factor & 0x3;
3128 static int wpa_set_ampdu_density(struct wpa_supplicant *wpa_s,
3129 struct ieee80211_ht_capabilities *htcaps,
3130 struct ieee80211_ht_capabilities *htcaps_mask,
3133 wpa_msg(wpa_s, MSG_DEBUG, "set_ampdu_density: %d", density);
3138 if (density < 0 || density > 7) {
3139 wpa_msg(wpa_s, MSG_ERROR,
3140 "ampdu_density: %d out of range. Must be 0-7 or -1.",
3145 htcaps_mask->a_mpdu_params |= 0x1C;
3146 htcaps->a_mpdu_params &= ~(0x1C);
3147 htcaps->a_mpdu_params |= (density << 2) & 0x1C;
3153 static int wpa_set_disable_ht40(struct wpa_supplicant *wpa_s,
3154 struct ieee80211_ht_capabilities *htcaps,
3155 struct ieee80211_ht_capabilities *htcaps_mask,
3158 /* Masking these out disables HT40 */
3159 le16 msk = host_to_le16(HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET |
3160 HT_CAP_INFO_SHORT_GI40MHZ);
3162 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_ht40: %d", disabled);
3165 htcaps->ht_capabilities_info &= ~msk;
3167 htcaps->ht_capabilities_info |= msk;
3169 htcaps_mask->ht_capabilities_info |= msk;
3175 static int wpa_set_disable_sgi(struct wpa_supplicant *wpa_s,
3176 struct ieee80211_ht_capabilities *htcaps,
3177 struct ieee80211_ht_capabilities *htcaps_mask,
3180 /* Masking these out disables SGI */
3181 le16 msk = host_to_le16(HT_CAP_INFO_SHORT_GI20MHZ |
3182 HT_CAP_INFO_SHORT_GI40MHZ);
3184 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_sgi: %d", disabled);
3187 htcaps->ht_capabilities_info &= ~msk;
3189 htcaps->ht_capabilities_info |= msk;
3191 htcaps_mask->ht_capabilities_info |= msk;
3197 static int wpa_set_disable_ldpc(struct wpa_supplicant *wpa_s,
3198 struct ieee80211_ht_capabilities *htcaps,
3199 struct ieee80211_ht_capabilities *htcaps_mask,
3202 /* Masking these out disables LDPC */
3203 le16 msk = host_to_le16(HT_CAP_INFO_LDPC_CODING_CAP);
3205 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_ldpc: %d", disabled);
3208 htcaps->ht_capabilities_info &= ~msk;
3210 htcaps->ht_capabilities_info |= msk;
3212 htcaps_mask->ht_capabilities_info |= msk;
3218 void wpa_supplicant_apply_ht_overrides(
3219 struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
3220 struct wpa_driver_associate_params *params)
3222 struct ieee80211_ht_capabilities *htcaps;
3223 struct ieee80211_ht_capabilities *htcaps_mask;
3228 params->disable_ht = ssid->disable_ht;
3229 if (!params->htcaps || !params->htcaps_mask)
3232 htcaps = (struct ieee80211_ht_capabilities *) params->htcaps;
3233 htcaps_mask = (struct ieee80211_ht_capabilities *) params->htcaps_mask;
3234 wpa_set_htcap_mcs(wpa_s, htcaps, htcaps_mask, ssid->ht_mcs);
3235 wpa_disable_max_amsdu(wpa_s, htcaps, htcaps_mask,
3236 ssid->disable_max_amsdu);
3237 wpa_set_ampdu_factor(wpa_s, htcaps, htcaps_mask, ssid->ampdu_factor);
3238 wpa_set_ampdu_density(wpa_s, htcaps, htcaps_mask, ssid->ampdu_density);
3239 wpa_set_disable_ht40(wpa_s, htcaps, htcaps_mask, ssid->disable_ht40);
3240 wpa_set_disable_sgi(wpa_s, htcaps, htcaps_mask, ssid->disable_sgi);
3241 wpa_set_disable_ldpc(wpa_s, htcaps, htcaps_mask, ssid->disable_ldpc);
3243 if (ssid->ht40_intolerant) {
3244 le16 bit = host_to_le16(HT_CAP_INFO_40MHZ_INTOLERANT);
3245 htcaps->ht_capabilities_info |= bit;
3246 htcaps_mask->ht_capabilities_info |= bit;
3250 #endif /* CONFIG_HT_OVERRIDES */
3253 #ifdef CONFIG_VHT_OVERRIDES
3254 void wpa_supplicant_apply_vht_overrides(
3255 struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
3256 struct wpa_driver_associate_params *params)
3258 struct ieee80211_vht_capabilities *vhtcaps;
3259 struct ieee80211_vht_capabilities *vhtcaps_mask;
3264 params->disable_vht = ssid->disable_vht;
3266 vhtcaps = (void *) params->vhtcaps;
3267 vhtcaps_mask = (void *) params->vhtcaps_mask;
3269 if (!vhtcaps || !vhtcaps_mask)
3272 vhtcaps->vht_capabilities_info = ssid->vht_capa;
3273 vhtcaps_mask->vht_capabilities_info = ssid->vht_capa_mask;
3275 #ifdef CONFIG_HT_OVERRIDES
3276 /* if max ampdu is <= 3, we have to make the HT cap the same */
3277 if (ssid->vht_capa_mask & VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX) {
3280 max_ampdu = (ssid->vht_capa &
3281 VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX) >>
3282 VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX_SHIFT;
3284 max_ampdu = max_ampdu < 3 ? max_ampdu : 3;
3285 wpa_set_ampdu_factor(wpa_s,
3286 (void *) params->htcaps,
3287 (void *) params->htcaps_mask,
3290 #endif /* CONFIG_HT_OVERRIDES */
3292 #define OVERRIDE_MCS(i) \
3293 if (ssid->vht_tx_mcs_nss_ ##i >= 0) { \
3294 vhtcaps_mask->vht_supported_mcs_set.tx_map |= \
3296 vhtcaps->vht_supported_mcs_set.tx_map |= \
3297 ssid->vht_tx_mcs_nss_ ##i << 2 * (i - 1); \
3299 if (ssid->vht_rx_mcs_nss_ ##i >= 0) { \
3300 vhtcaps_mask->vht_supported_mcs_set.rx_map |= \
3302 vhtcaps->vht_supported_mcs_set.rx_map |= \
3303 ssid->vht_rx_mcs_nss_ ##i << 2 * (i - 1); \
3315 #endif /* CONFIG_VHT_OVERRIDES */
3318 static int pcsc_reader_init(struct wpa_supplicant *wpa_s)
3323 if (!wpa_s->conf->pcsc_reader)
3326 wpa_s->scard = scard_init(wpa_s->conf->pcsc_reader);
3330 if (wpa_s->conf->pcsc_pin &&
3331 scard_set_pin(wpa_s->scard, wpa_s->conf->pcsc_pin) < 0) {
3332 scard_deinit(wpa_s->scard);
3333 wpa_s->scard = NULL;
3334 wpa_msg(wpa_s, MSG_ERROR, "PC/SC PIN validation failed");
3338 len = sizeof(wpa_s->imsi) - 1;
3339 if (scard_get_imsi(wpa_s->scard, wpa_s->imsi, &len)) {
3340 scard_deinit(wpa_s->scard);
3341 wpa_s->scard = NULL;
3342 wpa_msg(wpa_s, MSG_ERROR, "Could not read IMSI");
3345 wpa_s->imsi[len] = '\0';
3347 wpa_s->mnc_len = scard_get_mnc_len(wpa_s->scard);
3349 wpa_printf(MSG_DEBUG, "SCARD: IMSI %s (MNC length %d)",
3350 wpa_s->imsi, wpa_s->mnc_len);
3352 wpa_sm_set_scard_ctx(wpa_s->wpa, wpa_s->scard);
3353 eapol_sm_register_scard_ctx(wpa_s->eapol, wpa_s->scard);
3354 #endif /* PCSC_FUNCS */
3360 int wpas_init_ext_pw(struct wpa_supplicant *wpa_s)
3364 ext_password_deinit(wpa_s->ext_pw);
3365 wpa_s->ext_pw = NULL;
3366 eapol_sm_set_ext_pw_ctx(wpa_s->eapol, NULL);
3368 if (!wpa_s->conf->ext_password_backend)
3371 val = os_strdup(wpa_s->conf->ext_password_backend);
3374 pos = os_strchr(val, ':');
3378 wpa_printf(MSG_DEBUG, "EXT PW: Initialize backend '%s'", val);
3380 wpa_s->ext_pw = ext_password_init(val, pos);
3382 if (wpa_s->ext_pw == NULL) {
3383 wpa_printf(MSG_DEBUG, "EXT PW: Failed to initialize backend");
3386 eapol_sm_set_ext_pw_ctx(wpa_s->eapol, wpa_s->ext_pw);
3392 static int wpas_set_wowlan_triggers(struct wpa_supplicant *wpa_s,
3393 const struct wpa_driver_capa *capa)
3395 struct wowlan_triggers *triggers;
3398 if (!wpa_s->conf->wowlan_triggers)
3401 triggers = wpa_get_wowlan_triggers(wpa_s->conf->wowlan_triggers, capa);
3403 ret = wpa_drv_wowlan(wpa_s, triggers);
3410 static struct wpa_radio * radio_add_interface(struct wpa_supplicant *wpa_s,
3413 struct wpa_supplicant *iface = wpa_s->global->ifaces;
3414 struct wpa_radio *radio;
3416 while (rn && iface) {
3417 radio = iface->radio;
3418 if (radio && os_strcmp(rn, radio->name) == 0) {
3419 wpa_printf(MSG_DEBUG, "Add interface %s to existing radio %s",
3421 dl_list_add(&radio->ifaces, &wpa_s->radio_list);
3425 iface = iface->next;
3428 wpa_printf(MSG_DEBUG, "Add interface %s to a new radio %s",
3429 wpa_s->ifname, rn ? rn : "N/A");
3430 radio = os_zalloc(sizeof(*radio));
3435 os_strlcpy(radio->name, rn, sizeof(radio->name));
3436 dl_list_init(&radio->ifaces);
3437 dl_list_init(&radio->work);
3438 dl_list_add(&radio->ifaces, &wpa_s->radio_list);
3444 static void radio_work_free(struct wpa_radio_work *work)
3446 if (work->wpa_s->scan_work == work) {
3447 /* This should not really happen. */
3448 wpa_dbg(work->wpa_s, MSG_INFO, "Freeing radio work '%s'@%p (started=%d) that is marked as scan_work",
3449 work->type, work, work->started);
3450 work->wpa_s->scan_work = NULL;
3454 if (work->wpa_s->p2p_scan_work == work) {
3455 /* This should not really happen. */
3456 wpa_dbg(work->wpa_s, MSG_INFO, "Freeing radio work '%s'@%p (started=%d) that is marked as p2p_scan_work",
3457 work->type, work, work->started);
3458 work->wpa_s->p2p_scan_work = NULL;
3460 #endif /* CONFIG_P2P */
3462 dl_list_del(&work->list);
3467 static void radio_start_next_work(void *eloop_ctx, void *timeout_ctx)
3469 struct wpa_radio *radio = eloop_ctx;
3470 struct wpa_radio_work *work;
3471 struct os_reltime now, diff;
3472 struct wpa_supplicant *wpa_s;
3474 work = dl_list_first(&radio->work, struct wpa_radio_work, list);
3479 return; /* already started and still in progress */
3481 wpa_s = dl_list_first(&radio->ifaces, struct wpa_supplicant,
3483 if (wpa_s && wpa_s->external_scan_running) {
3484 wpa_printf(MSG_DEBUG, "Delay radio work start until externally triggered scan completes");
3488 os_get_reltime(&now);
3489 os_reltime_sub(&now, &work->time, &diff);
3490 wpa_dbg(work->wpa_s, MSG_DEBUG, "Starting radio work '%s'@%p after %ld.%06ld second wait",
3491 work->type, work, diff.sec, diff.usec);
3499 * This function removes both started and pending radio works running on
3500 * the provided interface's radio.
3501 * Prior to the removal of the radio work, its callback (cb) is called with
3502 * deinit set to be 1. Each work's callback is responsible for clearing its
3503 * internal data and restoring to a correct state.
3504 * @wpa_s: wpa_supplicant data
3505 * @type: type of works to be removed
3506 * @remove_all: 1 to remove all the works on this radio, 0 to remove only
3507 * this interface's works.
3509 void radio_remove_works(struct wpa_supplicant *wpa_s,
3510 const char *type, int remove_all)
3512 struct wpa_radio_work *work, *tmp;
3513 struct wpa_radio *radio = wpa_s->radio;
3515 dl_list_for_each_safe(work, tmp, &radio->work, struct wpa_radio_work,
3517 if (type && os_strcmp(type, work->type) != 0)
3520 /* skip other ifaces' works */
3521 if (!remove_all && work->wpa_s != wpa_s)
3524 wpa_dbg(wpa_s, MSG_DEBUG, "Remove radio work '%s'@%p%s",
3525 work->type, work, work->started ? " (started)" : "");
3527 radio_work_free(work);
3530 /* in case we removed the started work */
3531 radio_work_check_next(wpa_s);
3535 static void radio_remove_interface(struct wpa_supplicant *wpa_s)
3537 struct wpa_radio *radio = wpa_s->radio;
3542 wpa_printf(MSG_DEBUG, "Remove interface %s from radio %s",
3543 wpa_s->ifname, radio->name);
3544 dl_list_del(&wpa_s->radio_list);
3545 radio_remove_works(wpa_s, NULL, 0);
3546 wpa_s->radio = NULL;
3547 if (!dl_list_empty(&radio->ifaces))
3548 return; /* Interfaces remain for this radio */
3550 wpa_printf(MSG_DEBUG, "Remove radio %s", radio->name);
3551 eloop_cancel_timeout(radio_start_next_work, radio, NULL);
3556 void radio_work_check_next(struct wpa_supplicant *wpa_s)
3558 struct wpa_radio *radio = wpa_s->radio;
3560 if (dl_list_empty(&radio->work))
3562 if (wpa_s->ext_work_in_progress) {
3563 wpa_printf(MSG_DEBUG,
3564 "External radio work in progress - delay start of pending item");
3567 eloop_cancel_timeout(radio_start_next_work, radio, NULL);
3568 eloop_register_timeout(0, 0, radio_start_next_work, radio, NULL);
3573 * radio_add_work - Add a radio work item
3574 * @wpa_s: Pointer to wpa_supplicant data
3575 * @freq: Frequency of the offchannel operation in MHz or 0
3576 * @type: Unique identifier for each type of work
3577 * @next: Force as the next work to be executed
3578 * @cb: Callback function for indicating when radio is available
3579 * @ctx: Context pointer for the work (work->ctx in cb())
3580 * Returns: 0 on success, -1 on failure
3582 * This function is used to request time for an operation that requires
3583 * exclusive radio control. Once the radio is available, the registered callback
3584 * function will be called. radio_work_done() must be called once the exclusive
3585 * radio operation has been completed, so that the radio is freed for other
3586 * operations. The special case of deinit=1 is used to free the context data
3587 * during interface removal. That does not allow the callback function to start
3588 * the radio operation, i.e., it must free any resources allocated for the radio
3591 * The @freq parameter can be used to indicate a single channel on which the
3592 * offchannel operation will occur. This may allow multiple radio work
3593 * operations to be performed in parallel if they apply for the same channel.
3594 * Setting this to 0 indicates that the work item may use multiple channels or
3595 * requires exclusive control of the radio.
3597 int radio_add_work(struct wpa_supplicant *wpa_s, unsigned int freq,
3598 const char *type, int next,
3599 void (*cb)(struct wpa_radio_work *work, int deinit),
3602 struct wpa_radio_work *work;
3605 work = os_zalloc(sizeof(*work));
3608 wpa_dbg(wpa_s, MSG_DEBUG, "Add radio work '%s'@%p", type, work);
3609 os_get_reltime(&work->time);
3612 work->wpa_s = wpa_s;
3616 was_empty = dl_list_empty(&wpa_s->radio->work);
3618 dl_list_add(&wpa_s->radio->work, &work->list);
3620 dl_list_add_tail(&wpa_s->radio->work, &work->list);
3622 wpa_dbg(wpa_s, MSG_DEBUG, "First radio work item in the queue - schedule start immediately");
3623 radio_work_check_next(wpa_s);
3631 * radio_work_done - Indicate that a radio work item has been completed
3632 * @work: Completed work
3634 * This function is called once the callback function registered with
3635 * radio_add_work() has completed its work.
3637 void radio_work_done(struct wpa_radio_work *work)
3639 struct wpa_supplicant *wpa_s = work->wpa_s;
3640 struct os_reltime now, diff;
3641 unsigned int started = work->started;
3643 os_get_reltime(&now);
3644 os_reltime_sub(&now, &work->time, &diff);
3645 wpa_dbg(wpa_s, MSG_DEBUG, "Radio work '%s'@%p %s in %ld.%06ld seconds",
3646 work->type, work, started ? "done" : "canceled",
3647 diff.sec, diff.usec);
3648 radio_work_free(work);
3650 radio_work_check_next(wpa_s);
3654 struct wpa_radio_work *
3655 radio_work_pending(struct wpa_supplicant *wpa_s, const char *type)
3657 struct wpa_radio_work *work;
3658 struct wpa_radio *radio = wpa_s->radio;
3660 dl_list_for_each(work, &radio->work, struct wpa_radio_work, list) {
3661 if (work->wpa_s == wpa_s && os_strcmp(work->type, type) == 0)
3669 static int wpas_init_driver(struct wpa_supplicant *wpa_s,
3670 struct wpa_interface *iface)
3672 const char *ifname, *driver, *rn;
3674 driver = iface->driver;
3676 if (wpa_supplicant_set_driver(wpa_s, driver) < 0)
3679 wpa_s->drv_priv = wpa_drv_init(wpa_s, wpa_s->ifname);
3680 if (wpa_s->drv_priv == NULL) {
3682 pos = driver ? os_strchr(driver, ',') : NULL;
3684 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize "
3685 "driver interface - try next driver wrapper");
3689 wpa_msg(wpa_s, MSG_ERROR, "Failed to initialize driver "
3693 if (wpa_drv_set_param(wpa_s, wpa_s->conf->driver_param) < 0) {
3694 wpa_msg(wpa_s, MSG_ERROR, "Driver interface rejected "
3695 "driver_param '%s'", wpa_s->conf->driver_param);
3699 ifname = wpa_drv_get_ifname(wpa_s);
3700 if (ifname && os_strcmp(ifname, wpa_s->ifname) != 0) {
3701 wpa_dbg(wpa_s, MSG_DEBUG, "Driver interface replaced "
3702 "interface name with '%s'", ifname);
3703 os_strlcpy(wpa_s->ifname, ifname, sizeof(wpa_s->ifname));
3706 rn = wpa_driver_get_radio_name(wpa_s);
3707 if (rn && rn[0] == '\0')
3710 wpa_s->radio = radio_add_interface(wpa_s, rn);
3711 if (wpa_s->radio == NULL)
3718 static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
3719 struct wpa_interface *iface)
3721 struct wpa_driver_capa capa;
3724 wpa_printf(MSG_DEBUG, "Initializing interface '%s' conf '%s' driver "
3725 "'%s' ctrl_interface '%s' bridge '%s'", iface->ifname,
3726 iface->confname ? iface->confname : "N/A",
3727 iface->driver ? iface->driver : "default",
3728 iface->ctrl_interface ? iface->ctrl_interface : "N/A",
3729 iface->bridge_ifname ? iface->bridge_ifname : "N/A");
3731 if (iface->confname) {
3732 #ifdef CONFIG_BACKEND_FILE
3733 wpa_s->confname = os_rel2abs_path(iface->confname);
3734 if (wpa_s->confname == NULL) {
3735 wpa_printf(MSG_ERROR, "Failed to get absolute path "
3736 "for configuration file '%s'.",
3740 wpa_printf(MSG_DEBUG, "Configuration file '%s' -> '%s'",
3741 iface->confname, wpa_s->confname);
3742 #else /* CONFIG_BACKEND_FILE */
3743 wpa_s->confname = os_strdup(iface->confname);
3744 #endif /* CONFIG_BACKEND_FILE */
3745 wpa_s->conf = wpa_config_read(wpa_s->confname, NULL);
3746 if (wpa_s->conf == NULL) {
3747 wpa_printf(MSG_ERROR, "Failed to read or parse "
3748 "configuration '%s'.", wpa_s->confname);
3751 wpa_s->confanother = os_rel2abs_path(iface->confanother);
3752 wpa_config_read(wpa_s->confanother, wpa_s->conf);
3755 * Override ctrl_interface and driver_param if set on command
3758 if (iface->ctrl_interface) {
3759 os_free(wpa_s->conf->ctrl_interface);
3760 wpa_s->conf->ctrl_interface =
3761 os_strdup(iface->ctrl_interface);
3764 if (iface->driver_param) {
3765 os_free(wpa_s->conf->driver_param);
3766 wpa_s->conf->driver_param =
3767 os_strdup(iface->driver_param);
3770 if (iface->p2p_mgmt && !iface->ctrl_interface) {
3771 os_free(wpa_s->conf->ctrl_interface);
3772 wpa_s->conf->ctrl_interface = NULL;
3775 wpa_s->conf = wpa_config_alloc_empty(iface->ctrl_interface,
3776 iface->driver_param);
3778 if (wpa_s->conf == NULL) {
3779 wpa_printf(MSG_ERROR, "\nNo configuration found.");
3783 if (iface->ifname == NULL) {
3784 wpa_printf(MSG_ERROR, "\nInterface name is required.");
3787 if (os_strlen(iface->ifname) >= sizeof(wpa_s->ifname)) {
3788 wpa_printf(MSG_ERROR, "\nToo long interface name '%s'.",
3792 os_strlcpy(wpa_s->ifname, iface->ifname, sizeof(wpa_s->ifname));
3794 if (iface->bridge_ifname) {
3795 if (os_strlen(iface->bridge_ifname) >=
3796 sizeof(wpa_s->bridge_ifname)) {
3797 wpa_printf(MSG_ERROR, "\nToo long bridge interface "
3798 "name '%s'.", iface->bridge_ifname);
3801 os_strlcpy(wpa_s->bridge_ifname, iface->bridge_ifname,
3802 sizeof(wpa_s->bridge_ifname));
3805 /* RSNA Supplicant Key Management - INITIALIZE */
3806 eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
3807 eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
3809 /* Initialize driver interface and register driver event handler before
3810 * L2 receive handler so that association events are processed before
3811 * EAPOL-Key packets if both become available for the same select()
3813 if (wpas_init_driver(wpa_s, iface) < 0)
3816 if (wpa_supplicant_init_wpa(wpa_s) < 0)
3819 wpa_sm_set_ifname(wpa_s->wpa, wpa_s->ifname,
3820 wpa_s->bridge_ifname[0] ? wpa_s->bridge_ifname :
3822 wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
3824 if (wpa_s->conf->dot11RSNAConfigPMKLifetime &&
3825 wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_LIFETIME,
3826 wpa_s->conf->dot11RSNAConfigPMKLifetime)) {
3827 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
3828 "dot11RSNAConfigPMKLifetime");
3832 if (wpa_s->conf->dot11RSNAConfigPMKReauthThreshold &&
3833 wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_REAUTH_THRESHOLD,
3834 wpa_s->conf->dot11RSNAConfigPMKReauthThreshold)) {
3835 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
3836 "dot11RSNAConfigPMKReauthThreshold");
3840 if (wpa_s->conf->dot11RSNAConfigSATimeout &&
3841 wpa_sm_set_param(wpa_s->wpa, RSNA_SA_TIMEOUT,
3842 wpa_s->conf->dot11RSNAConfigSATimeout)) {
3843 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
3844 "dot11RSNAConfigSATimeout");
3848 wpa_s->hw.modes = wpa_drv_get_hw_feature_data(wpa_s,
3849 &wpa_s->hw.num_modes,
3852 capa_res = wpa_drv_get_capa(wpa_s, &capa);
3853 if (capa_res == 0) {
3854 wpa_s->drv_capa_known = 1;
3855 wpa_s->drv_flags = capa.flags;
3856 wpa_s->drv_enc = capa.enc;
3857 wpa_s->drv_smps_modes = capa.smps_modes;
3858 wpa_s->drv_rrm_flags = capa.rrm_flags;
3859 wpa_s->probe_resp_offloads = capa.probe_resp_offloads;
3860 wpa_s->max_scan_ssids = capa.max_scan_ssids;
3861 wpa_s->max_sched_scan_ssids = capa.max_sched_scan_ssids;
3862 wpa_s->sched_scan_supported = capa.sched_scan_supported;
3863 wpa_s->max_match_sets = capa.max_match_sets;
3864 wpa_s->max_remain_on_chan = capa.max_remain_on_chan;
3865 wpa_s->max_stations = capa.max_stations;
3866 wpa_s->extended_capa = capa.extended_capa;
3867 wpa_s->extended_capa_mask = capa.extended_capa_mask;
3868 wpa_s->extended_capa_len = capa.extended_capa_len;
3869 wpa_s->num_multichan_concurrent =
3870 capa.num_multichan_concurrent;
3871 wpa_s->wmm_ac_supported = capa.wmm_ac_supported;
3873 if (wpa_s->max_remain_on_chan == 0)
3874 wpa_s->max_remain_on_chan = 1000;
3877 * Only take p2p_mgmt parameters when P2P Device is supported.
3878 * Doing it here as it determines whether l2_packet_init() will be done
3879 * during wpa_supplicant_driver_init().
3881 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)
3882 wpa_s->p2p_mgmt = iface->p2p_mgmt;
3884 iface->p2p_mgmt = 1;
3886 if (wpa_s->num_multichan_concurrent == 0)
3887 wpa_s->num_multichan_concurrent = 1;
3889 if (wpa_supplicant_driver_init(wpa_s) < 0)
3893 if ((!iface->p2p_mgmt ||
3894 !(wpa_s->drv_flags &
3895 WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)) &&
3896 wpa_tdls_init(wpa_s->wpa))
3898 #endif /* CONFIG_TDLS */
3900 if (wpa_s->conf->country[0] && wpa_s->conf->country[1] &&
3901 wpa_drv_set_country(wpa_s, wpa_s->conf->country)) {
3902 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to set country");
3906 if (wpas_wps_init(wpa_s))
3909 if (wpa_supplicant_init_eapol(wpa_s) < 0)
3911 wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
3913 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
3914 if (wpa_s->ctrl_iface == NULL) {
3915 wpa_printf(MSG_ERROR,
3916 "Failed to initialize control interface '%s'.\n"
3917 "You may have another wpa_supplicant process "
3918 "already running or the file was\n"
3919 "left by an unclean termination of wpa_supplicant "
3920 "in which case you will need\n"
3921 "to manually remove this file before starting "
3922 "wpa_supplicant again.\n",
3923 wpa_s->conf->ctrl_interface);
3927 wpa_s->gas = gas_query_init(wpa_s);
3928 if (wpa_s->gas == NULL) {
3929 wpa_printf(MSG_ERROR, "Failed to initialize GAS query");
3933 if (iface->p2p_mgmt && wpas_p2p_init(wpa_s->global, wpa_s) < 0) {
3934 wpa_msg(wpa_s, MSG_ERROR, "Failed to init P2P");
3938 if (wpa_bss_init(wpa_s) < 0)
3942 * Set Wake-on-WLAN triggers, if configured.
3943 * Note: We don't restore/remove the triggers on shutdown (it doesn't
3944 * have effect anyway when the interface is down).
3946 if (capa_res == 0 && wpas_set_wowlan_triggers(wpa_s, &capa) < 0)
3949 #ifdef CONFIG_EAP_PROXY
3952 wpa_s->mnc_len = eapol_sm_get_eap_proxy_imsi(wpa_s->eapol, wpa_s->imsi,
3954 if (wpa_s->mnc_len > 0) {
3955 wpa_s->imsi[len] = '\0';
3956 wpa_printf(MSG_DEBUG, "eap_proxy: IMSI %s (MNC length %d)",
3957 wpa_s->imsi, wpa_s->mnc_len);
3959 wpa_printf(MSG_DEBUG, "eap_proxy: IMSI not available");
3962 #endif /* CONFIG_EAP_PROXY */
3964 if (pcsc_reader_init(wpa_s) < 0)
3967 if (wpas_init_ext_pw(wpa_s) < 0)
3970 wpas_rrm_reset(wpa_s);
3976 static void wpa_supplicant_deinit_iface(struct wpa_supplicant *wpa_s,
3977 int notify, int terminate)
3979 struct wpa_global *global = wpa_s->global;
3980 struct wpa_supplicant *iface, *prev;
3982 if (wpa_s == wpa_s->parent)
3983 wpas_p2p_group_remove(wpa_s, "*");
3985 iface = global->ifaces;
3987 if (iface == wpa_s || iface->parent != wpa_s) {
3988 iface = iface->next;
3991 wpa_printf(MSG_DEBUG,
3992 "Remove remaining child interface %s from parent %s",
3993 iface->ifname, wpa_s->ifname);
3995 iface = iface->next;
3996 wpa_supplicant_remove_iface(global, prev, terminate);
3999 wpa_s->disconnected = 1;
4000 if (wpa_s->drv_priv) {
4001 wpa_supplicant_deauthenticate(wpa_s,
4002 WLAN_REASON_DEAUTH_LEAVING);
4004 wpa_drv_set_countermeasures(wpa_s, 0);
4005 wpa_clear_keys(wpa_s, NULL);
4008 wpa_supplicant_cleanup(wpa_s);
4009 wpas_p2p_deinit_iface(wpa_s);
4011 wpas_ctrl_radio_work_flush(wpa_s);
4012 radio_remove_interface(wpa_s);
4014 if (wpa_s->drv_priv)
4015 wpa_drv_deinit(wpa_s);
4018 wpas_notify_iface_removed(wpa_s);
4021 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TERMINATING);
4023 if (wpa_s->ctrl_iface) {
4024 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
4025 wpa_s->ctrl_iface = NULL;
4030 wpa_supplicant_mesh_iface_deinit(wpa_s, wpa_s->ifmsh);
4031 wpa_s->ifmsh = NULL;
4033 #endif /* CONFIG_MESH */
4035 if (wpa_s->conf != NULL) {
4036 wpa_config_free(wpa_s->conf);
4045 * wpa_supplicant_add_iface - Add a new network interface
4046 * @global: Pointer to global data from wpa_supplicant_init()
4047 * @iface: Interface configuration options
4048 * Returns: Pointer to the created interface or %NULL on failure
4050 * This function is used to add new network interfaces for %wpa_supplicant.
4051 * This can be called before wpa_supplicant_run() to add interfaces before the
4052 * main event loop has been started. In addition, new interfaces can be added
4053 * dynamically while %wpa_supplicant is already running. This could happen,
4054 * e.g., when a hotplug network adapter is inserted.
4056 struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
4057 struct wpa_interface *iface)
4059 struct wpa_supplicant *wpa_s;
4060 struct wpa_interface t_iface;
4061 struct wpa_ssid *ssid;
4063 if (global == NULL || iface == NULL)
4066 wpa_s = wpa_supplicant_alloc();
4070 wpa_s->global = global;
4073 if (global->params.override_driver) {
4074 wpa_printf(MSG_DEBUG, "Override interface parameter: driver "
4076 iface->driver, global->params.override_driver);
4077 t_iface.driver = global->params.override_driver;
4079 if (global->params.override_ctrl_interface) {
4080 wpa_printf(MSG_DEBUG, "Override interface parameter: "
4081 "ctrl_interface ('%s' -> '%s')",
4082 iface->ctrl_interface,
4083 global->params.override_ctrl_interface);
4084 t_iface.ctrl_interface =
4085 global->params.override_ctrl_interface;
4087 if (wpa_supplicant_init_iface(wpa_s, &t_iface)) {
4088 wpa_printf(MSG_DEBUG, "Failed to add interface %s",
4090 wpa_supplicant_deinit_iface(wpa_s, 0, 0);
4094 if (iface->p2p_mgmt == 0) {
4095 /* Notify the control interfaces about new iface */
4096 if (wpas_notify_iface_added(wpa_s)) {
4097 wpa_supplicant_deinit_iface(wpa_s, 1, 0);
4101 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
4102 wpas_notify_network_added(wpa_s, ssid);
4105 wpa_s->next = global->ifaces;
4106 global->ifaces = wpa_s;
4108 wpa_dbg(wpa_s, MSG_DEBUG, "Added interface %s", wpa_s->ifname);
4109 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
4112 if (wpa_s->global->p2p == NULL &&
4113 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE) &&
4114 wpas_p2p_add_p2pdev_interface(wpa_s, iface->conf_p2p_dev) < 0) {
4115 wpa_printf(MSG_INFO,
4116 "P2P: Failed to enable P2P Device interface");
4117 /* Try to continue without. P2P will be disabled. */
4119 #endif /* CONFIG_P2P */
4126 * wpa_supplicant_remove_iface - Remove a network interface
4127 * @global: Pointer to global data from wpa_supplicant_init()
4128 * @wpa_s: Pointer to the network interface to be removed
4129 * Returns: 0 if interface was removed, -1 if interface was not found
4131 * This function can be used to dynamically remove network interfaces from
4132 * %wpa_supplicant, e.g., when a hotplug network adapter is ejected. In
4133 * addition, this function is used to remove all remaining interfaces when
4134 * %wpa_supplicant is terminated.
4136 int wpa_supplicant_remove_iface(struct wpa_global *global,
4137 struct wpa_supplicant *wpa_s,
4140 struct wpa_supplicant *prev;
4142 unsigned int mesh_if_created = wpa_s->mesh_if_created;
4143 char *ifname = NULL;
4144 #endif /* CONFIG_MESH */
4146 /* Remove interface from the global list of interfaces */
4147 prev = global->ifaces;
4148 if (prev == wpa_s) {
4149 global->ifaces = wpa_s->next;
4151 while (prev && prev->next != wpa_s)
4155 prev->next = wpa_s->next;
4158 wpa_dbg(wpa_s, MSG_DEBUG, "Removing interface %s", wpa_s->ifname);
4161 if (mesh_if_created) {
4162 ifname = os_strdup(wpa_s->ifname);
4163 if (ifname == NULL) {
4164 wpa_dbg(wpa_s, MSG_ERROR,
4165 "mesh: Failed to malloc ifname");
4169 #endif /* CONFIG_MESH */
4171 if (global->p2p_group_formation == wpa_s)
4172 global->p2p_group_formation = NULL;
4173 if (global->p2p_invite_group == wpa_s)
4174 global->p2p_invite_group = NULL;
4175 wpa_supplicant_deinit_iface(wpa_s, 1, terminate);
4178 if (mesh_if_created) {
4179 wpa_drv_if_remove(global->ifaces, WPA_IF_MESH, ifname);
4182 #endif /* CONFIG_MESH */
4189 * wpa_supplicant_get_eap_mode - Get the current EAP mode
4190 * @wpa_s: Pointer to the network interface
4191 * Returns: Pointer to the eap mode or the string "UNKNOWN" if not found
4193 const char * wpa_supplicant_get_eap_mode(struct wpa_supplicant *wpa_s)
4195 const char *eapol_method;
4197 if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) == 0 &&
4198 wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
4202 eapol_method = eapol_sm_get_method_name(wpa_s->eapol);
4203 if (eapol_method == NULL)
4204 return "UNKNOWN-EAP";
4206 return eapol_method;
4211 * wpa_supplicant_get_iface - Get a new network interface
4212 * @global: Pointer to global data from wpa_supplicant_init()
4213 * @ifname: Interface name
4214 * Returns: Pointer to the interface or %NULL if not found
4216 struct wpa_supplicant * wpa_supplicant_get_iface(struct wpa_global *global,
4219 struct wpa_supplicant *wpa_s;
4221 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
4222 if (os_strcmp(wpa_s->ifname, ifname) == 0)
4229 #ifndef CONFIG_NO_WPA_MSG
4230 static const char * wpa_supplicant_msg_ifname_cb(void *ctx)
4232 struct wpa_supplicant *wpa_s = ctx;
4235 return wpa_s->ifname;
4237 #endif /* CONFIG_NO_WPA_MSG */
4241 * wpa_supplicant_init - Initialize %wpa_supplicant
4242 * @params: Parameters for %wpa_supplicant
4243 * Returns: Pointer to global %wpa_supplicant data, or %NULL on failure
4245 * This function is used to initialize %wpa_supplicant. After successful
4246 * initialization, the returned data pointer can be used to add and remove
4247 * network interfaces, and eventually, to deinitialize %wpa_supplicant.
4249 struct wpa_global * wpa_supplicant_init(struct wpa_params *params)
4251 struct wpa_global *global;
4257 #ifdef CONFIG_DRIVER_NDIS
4259 void driver_ndis_init_ops(void);
4260 driver_ndis_init_ops();
4262 #endif /* CONFIG_DRIVER_NDIS */
4264 #ifndef CONFIG_NO_WPA_MSG
4265 wpa_msg_register_ifname_cb(wpa_supplicant_msg_ifname_cb);
4266 #endif /* CONFIG_NO_WPA_MSG */
4268 if (params->wpa_debug_file_path)
4269 wpa_debug_open_file(params->wpa_debug_file_path);
4271 wpa_debug_setup_stdout();
4272 if (params->wpa_debug_syslog)
4273 wpa_debug_open_syslog();
4274 if (params->wpa_debug_tracing) {
4275 ret = wpa_debug_open_linux_tracing();
4277 wpa_printf(MSG_ERROR,
4278 "Failed to enable trace logging");
4283 ret = eap_register_methods();
4285 wpa_printf(MSG_ERROR, "Failed to register EAP methods");
4287 wpa_printf(MSG_ERROR, "Two or more EAP methods used "
4288 "the same EAP type.");
4292 global = os_zalloc(sizeof(*global));
4295 dl_list_init(&global->p2p_srv_bonjour);
4296 dl_list_init(&global->p2p_srv_upnp);
4297 global->params.daemonize = params->daemonize;
4298 global->params.wait_for_monitor = params->wait_for_monitor;
4299 global->params.dbus_ctrl_interface = params->dbus_ctrl_interface;
4300 if (params->pid_file)
4301 global->params.pid_file = os_strdup(params->pid_file);
4302 if (params->ctrl_interface)
4303 global->params.ctrl_interface =
4304 os_strdup(params->ctrl_interface);
4305 if (params->ctrl_interface_group)
4306 global->params.ctrl_interface_group =
4307 os_strdup(params->ctrl_interface_group);
4308 if (params->override_driver)
4309 global->params.override_driver =
4310 os_strdup(params->override_driver);
4311 if (params->override_ctrl_interface)
4312 global->params.override_ctrl_interface =
4313 os_strdup(params->override_ctrl_interface);
4314 wpa_debug_level = global->params.wpa_debug_level =
4315 params->wpa_debug_level;
4316 wpa_debug_show_keys = global->params.wpa_debug_show_keys =
4317 params->wpa_debug_show_keys;
4318 wpa_debug_timestamp = global->params.wpa_debug_timestamp =
4319 params->wpa_debug_timestamp;
4321 wpa_printf(MSG_DEBUG, "wpa_supplicant v" VERSION_STR);
4324 wpa_printf(MSG_ERROR, "Failed to initialize event loop");
4325 wpa_supplicant_deinit(global);
4329 random_init(params->entropy_file);
4331 global->ctrl_iface = wpa_supplicant_global_ctrl_iface_init(global);
4332 if (global->ctrl_iface == NULL) {
4333 wpa_supplicant_deinit(global);
4337 if (wpas_notify_supplicant_initialized(global)) {
4338 wpa_supplicant_deinit(global);
4342 for (i = 0; wpa_drivers[i]; i++)
4343 global->drv_count++;
4344 if (global->drv_count == 0) {
4345 wpa_printf(MSG_ERROR, "No drivers enabled");
4346 wpa_supplicant_deinit(global);
4349 global->drv_priv = os_calloc(global->drv_count, sizeof(void *));
4350 if (global->drv_priv == NULL) {
4351 wpa_supplicant_deinit(global);
4355 #ifdef CONFIG_WIFI_DISPLAY
4356 if (wifi_display_init(global) < 0) {
4357 wpa_printf(MSG_ERROR, "Failed to initialize Wi-Fi Display");
4358 wpa_supplicant_deinit(global);
4361 #endif /* CONFIG_WIFI_DISPLAY */
4368 * wpa_supplicant_run - Run the %wpa_supplicant main event loop
4369 * @global: Pointer to global data from wpa_supplicant_init()
4370 * Returns: 0 after successful event loop run, -1 on failure
4372 * This function starts the main event loop and continues running as long as
4373 * there are any remaining events. In most cases, this function is running as
4374 * long as the %wpa_supplicant process in still in use.
4376 int wpa_supplicant_run(struct wpa_global *global)
4378 struct wpa_supplicant *wpa_s;
4380 if (global->params.daemonize &&
4381 wpa_supplicant_daemon(global->params.pid_file))
4384 if (global->params.wait_for_monitor) {
4385 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
4386 if (wpa_s->ctrl_iface)
4387 wpa_supplicant_ctrl_iface_wait(
4391 eloop_register_signal_terminate(wpa_supplicant_terminate, global);
4392 eloop_register_signal_reconfig(wpa_supplicant_reconfig, global);
4401 * wpa_supplicant_deinit - Deinitialize %wpa_supplicant
4402 * @global: Pointer to global data from wpa_supplicant_init()
4404 * This function is called to deinitialize %wpa_supplicant and to free all
4405 * allocated resources. Remaining network interfaces will also be removed.
4407 void wpa_supplicant_deinit(struct wpa_global *global)
4414 #ifdef CONFIG_WIFI_DISPLAY
4415 wifi_display_deinit(global);
4416 #endif /* CONFIG_WIFI_DISPLAY */
4418 while (global->ifaces)
4419 wpa_supplicant_remove_iface(global, global->ifaces, 1);
4421 if (global->ctrl_iface)
4422 wpa_supplicant_global_ctrl_iface_deinit(global->ctrl_iface);
4424 wpas_notify_supplicant_deinitialized(global);
4426 eap_peer_unregister_methods();
4428 eap_server_unregister_methods();
4429 #endif /* CONFIG_AP */
4431 for (i = 0; wpa_drivers[i] && global->drv_priv; i++) {
4432 if (!global->drv_priv[i])
4434 wpa_drivers[i]->global_deinit(global->drv_priv[i]);
4436 os_free(global->drv_priv);
4442 if (global->params.pid_file) {
4443 os_daemonize_terminate(global->params.pid_file);
4444 os_free(global->params.pid_file);
4446 os_free(global->params.ctrl_interface);
4447 os_free(global->params.ctrl_interface_group);
4448 os_free(global->params.override_driver);
4449 os_free(global->params.override_ctrl_interface);
4451 os_free(global->p2p_disallow_freq.range);
4452 os_free(global->p2p_go_avoid_freq.range);
4453 os_free(global->add_psk);
4456 wpa_debug_close_syslog();
4457 wpa_debug_close_file();
4458 wpa_debug_close_linux_tracing();
4462 void wpa_supplicant_update_config(struct wpa_supplicant *wpa_s)
4464 if ((wpa_s->conf->changed_parameters & CFG_CHANGED_COUNTRY) &&
4465 wpa_s->conf->country[0] && wpa_s->conf->country[1]) {
4467 country[0] = wpa_s->conf->country[0];
4468 country[1] = wpa_s->conf->country[1];
4470 if (wpa_drv_set_country(wpa_s, country) < 0) {
4471 wpa_printf(MSG_ERROR, "Failed to set country code "
4476 if (wpa_s->conf->changed_parameters & CFG_CHANGED_EXT_PW_BACKEND)
4477 wpas_init_ext_pw(wpa_s);
4480 wpas_wps_update_config(wpa_s);
4481 #endif /* CONFIG_WPS */
4482 wpas_p2p_update_config(wpa_s);
4483 wpa_s->conf->changed_parameters = 0;
4487 void add_freq(int *freqs, int *num_freqs, int freq)
4491 for (i = 0; i < *num_freqs; i++) {
4492 if (freqs[i] == freq)
4496 freqs[*num_freqs] = freq;
4501 static int * get_bss_freqs_in_ess(struct wpa_supplicant *wpa_s)
4503 struct wpa_bss *bss, *cbss;
4504 const int max_freqs = 10;
4508 freqs = os_calloc(max_freqs + 1, sizeof(int));
4512 cbss = wpa_s->current_bss;
4514 dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
4517 if (bss->ssid_len == cbss->ssid_len &&
4518 os_memcmp(bss->ssid, cbss->ssid, bss->ssid_len) == 0 &&
4519 wpa_blacklist_get(wpa_s, bss->bssid) == NULL) {
4520 add_freq(freqs, &num_freqs, bss->freq);
4521 if (num_freqs == max_freqs)
4526 if (num_freqs == 0) {
4535 void wpas_connection_failed(struct wpa_supplicant *wpa_s, const u8 *bssid)
4541 wpas_connect_work_done(wpa_s);
4544 * Remove possible authentication timeout since the connection failed.
4546 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
4548 if (wpa_s->disconnected) {
4550 * There is no point in blacklisting the AP if this event is
4551 * generated based on local request to disconnect.
4553 wpa_dbg(wpa_s, MSG_DEBUG, "Ignore connection failure "
4554 "indication since interface has been put into "
4555 "disconnected state");
4560 * Add the failed BSSID into the blacklist and speed up next scan
4561 * attempt if there could be other APs that could accept association.
4562 * The current blacklist count indicates how many times we have tried
4563 * connecting to this AP and multiple attempts mean that other APs are
4564 * either not available or has already been tried, so that we can start
4565 * increasing the delay here to avoid constant scanning.
4567 count = wpa_blacklist_add(wpa_s, bssid);
4568 if (count == 1 && wpa_s->current_bss) {
4570 * This BSS was not in the blacklist before. If there is
4571 * another BSS available for the same ESS, we should try that
4572 * next. Otherwise, we may as well try this one once more
4573 * before allowing other, likely worse, ESSes to be considered.
4575 freqs = get_bss_freqs_in_ess(wpa_s);
4577 wpa_dbg(wpa_s, MSG_DEBUG, "Another BSS in this ESS "
4578 "has been seen; try it next");
4579 wpa_blacklist_add(wpa_s, bssid);
4581 * On the next scan, go through only the known channels
4582 * used in this ESS based on previous scans to speed up
4583 * common load balancing use case.
4585 os_free(wpa_s->next_scan_freqs);
4586 wpa_s->next_scan_freqs = freqs;
4591 * Add previous failure count in case the temporary blacklist was
4592 * cleared due to no other BSSes being available.
4594 count += wpa_s->extra_blacklist_count;
4596 if (count > 3 && wpa_s->current_ssid) {
4597 wpa_printf(MSG_DEBUG, "Continuous association failures - "
4598 "consider temporary network disabling");
4599 wpas_auth_failed(wpa_s, "CONN_FAILED");
4620 wpa_dbg(wpa_s, MSG_DEBUG, "Blacklist count %d --> request scan in %d "
4621 "ms", count, timeout);
4624 * TODO: if more than one possible AP is available in scan results,
4625 * could try the other ones before requesting a new scan.
4627 wpa_supplicant_req_scan(wpa_s, timeout / 1000,
4628 1000 * (timeout % 1000));
4632 int wpas_driver_bss_selection(struct wpa_supplicant *wpa_s)
4634 return wpa_s->conf->ap_scan == 2 ||
4635 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_BSS_SELECTION);
4639 #if defined(CONFIG_CTRL_IFACE) || defined(CONFIG_CTRL_IFACE_DBUS_NEW)
4640 int wpa_supplicant_ctrl_iface_ctrl_rsp_handle(struct wpa_supplicant *wpa_s,
4641 struct wpa_ssid *ssid,
4645 #ifdef IEEE8021X_EAPOL
4646 struct eap_peer_config *eap = &ssid->eap;
4648 wpa_printf(MSG_DEBUG, "CTRL_IFACE: response handle field=%s", field);
4649 wpa_hexdump_ascii_key(MSG_DEBUG, "CTRL_IFACE: response value",
4650 (const u8 *) value, os_strlen(value));
4652 switch (wpa_supplicant_ctrl_req_from_string(field)) {
4653 case WPA_CTRL_REQ_EAP_IDENTITY:
4654 os_free(eap->identity);
4655 eap->identity = (u8 *) os_strdup(value);
4656 eap->identity_len = os_strlen(value);
4657 eap->pending_req_identity = 0;
4658 if (ssid == wpa_s->current_ssid)
4659 wpa_s->reassociate = 1;
4661 case WPA_CTRL_REQ_EAP_PASSWORD:
4662 bin_clear_free(eap->password, eap->password_len);
4663 eap->password = (u8 *) os_strdup(value);
4664 eap->password_len = os_strlen(value);
4665 eap->pending_req_password = 0;
4666 if (ssid == wpa_s->current_ssid)
4667 wpa_s->reassociate = 1;
4669 case WPA_CTRL_REQ_EAP_NEW_PASSWORD:
4670 bin_clear_free(eap->new_password, eap->new_password_len);
4671 eap->new_password = (u8 *) os_strdup(value);
4672 eap->new_password_len = os_strlen(value);
4673 eap->pending_req_new_password = 0;
4674 if (ssid == wpa_s->current_ssid)
4675 wpa_s->reassociate = 1;
4677 case WPA_CTRL_REQ_EAP_PIN:
4678 str_clear_free(eap->pin);
4679 eap->pin = os_strdup(value);
4680 eap->pending_req_pin = 0;
4681 if (ssid == wpa_s->current_ssid)
4682 wpa_s->reassociate = 1;
4684 case WPA_CTRL_REQ_EAP_OTP:
4685 bin_clear_free(eap->otp, eap->otp_len);
4686 eap->otp = (u8 *) os_strdup(value);
4687 eap->otp_len = os_strlen(value);
4688 os_free(eap->pending_req_otp);
4689 eap->pending_req_otp = NULL;
4690 eap->pending_req_otp_len = 0;
4692 case WPA_CTRL_REQ_EAP_PASSPHRASE:
4693 str_clear_free(eap->private_key_passwd);
4694 eap->private_key_passwd = os_strdup(value);
4695 eap->pending_req_passphrase = 0;
4696 if (ssid == wpa_s->current_ssid)
4697 wpa_s->reassociate = 1;
4699 case WPA_CTRL_REQ_SIM:
4700 str_clear_free(eap->external_sim_resp);
4701 eap->external_sim_resp = os_strdup(value);
4704 wpa_printf(MSG_DEBUG, "CTRL_IFACE: Unknown field '%s'", field);
4709 #else /* IEEE8021X_EAPOL */
4710 wpa_printf(MSG_DEBUG, "CTRL_IFACE: IEEE 802.1X not included");
4712 #endif /* IEEE8021X_EAPOL */
4714 #endif /* CONFIG_CTRL_IFACE || CONFIG_CTRL_IFACE_DBUS_NEW */
4717 int wpas_network_disabled(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
4720 unsigned int drv_enc;
4728 if (wpa_s && wpa_s->drv_capa_known)
4729 drv_enc = wpa_s->drv_enc;
4731 drv_enc = (unsigned int) -1;
4733 for (i = 0; i < NUM_WEP_KEYS; i++) {
4734 size_t len = ssid->wep_key_len[i];
4737 if (len == 5 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP40))
4739 if (len == 13 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP104))
4741 if (len == 16 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP128))
4743 return 1; /* invalid WEP key */
4746 if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt) && !ssid->psk_set &&
4747 (!ssid->passphrase || ssid->ssid_len != 0) && !ssid->ext_psk)
4754 int wpas_is_p2p_prioritized(struct wpa_supplicant *wpa_s)
4756 if (wpa_s->global->conc_pref == WPA_CONC_PREF_P2P)
4758 if (wpa_s->global->conc_pref == WPA_CONC_PREF_STA)
4764 void wpas_auth_failed(struct wpa_supplicant *wpa_s, char *reason)
4766 struct wpa_ssid *ssid = wpa_s->current_ssid;
4768 struct os_reltime now;
4771 wpa_printf(MSG_DEBUG, "Authentication failure but no known "
4776 if (ssid->key_mgmt == WPA_KEY_MGMT_WPS)
4779 ssid->auth_failures++;
4782 if (ssid->p2p_group &&
4783 (wpa_s->p2p_in_provisioning || wpa_s->show_group_started)) {
4785 * Skip the wait time since there is a short timeout on the
4786 * connection to a P2P group.
4790 #endif /* CONFIG_P2P */
4792 if (ssid->auth_failures > 50)
4794 else if (ssid->auth_failures > 10)
4796 else if (ssid->auth_failures > 5)
4798 else if (ssid->auth_failures > 3)
4800 else if (ssid->auth_failures > 2)
4802 else if (ssid->auth_failures > 1)
4807 if (ssid->auth_failures > 1 &&
4808 wpa_key_mgmt_wpa_ieee8021x(ssid->key_mgmt))
4809 dur += os_random() % (ssid->auth_failures * 10);
4811 os_get_reltime(&now);
4812 if (now.sec + dur <= ssid->disabled_until.sec)
4815 ssid->disabled_until.sec = now.sec + dur;
4817 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TEMP_DISABLED
4818 "id=%d ssid=\"%s\" auth_failures=%u duration=%d reason=%s",
4819 ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
4820 ssid->auth_failures, dur, reason);
4824 void wpas_clear_temp_disabled(struct wpa_supplicant *wpa_s,
4825 struct wpa_ssid *ssid, int clear_failures)
4830 if (ssid->disabled_until.sec) {
4831 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_REENABLED
4832 "id=%d ssid=\"%s\"",
4833 ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
4835 ssid->disabled_until.sec = 0;
4836 ssid->disabled_until.usec = 0;
4838 ssid->auth_failures = 0;
4842 int disallowed_bssid(struct wpa_supplicant *wpa_s, const u8 *bssid)
4846 if (wpa_s->disallow_aps_bssid == NULL)
4849 for (i = 0; i < wpa_s->disallow_aps_bssid_count; i++) {
4850 if (os_memcmp(wpa_s->disallow_aps_bssid + i * ETH_ALEN,
4851 bssid, ETH_ALEN) == 0)
4859 int disallowed_ssid(struct wpa_supplicant *wpa_s, const u8 *ssid,
4864 if (wpa_s->disallow_aps_ssid == NULL || ssid == NULL)
4867 for (i = 0; i < wpa_s->disallow_aps_ssid_count; i++) {
4868 struct wpa_ssid_value *s = &wpa_s->disallow_aps_ssid[i];
4869 if (ssid_len == s->ssid_len &&
4870 os_memcmp(ssid, s->ssid, ssid_len) == 0)
4879 * wpas_request_connection - Request a new connection
4880 * @wpa_s: Pointer to the network interface
4882 * This function is used to request a new connection to be found. It will mark
4883 * the interface to allow reassociation and request a new scan to find a
4884 * suitable network to connect to.
4886 void wpas_request_connection(struct wpa_supplicant *wpa_s)
4888 wpa_s->normal_scans = 0;
4889 wpa_s->scan_req = NORMAL_SCAN_REQ;
4890 wpa_supplicant_reinit_autoscan(wpa_s);
4891 wpa_s->extra_blacklist_count = 0;
4892 wpa_s->disconnected = 0;
4893 wpa_s->reassociate = 1;
4895 if (wpa_supplicant_fast_associate(wpa_s) != 1)
4896 wpa_supplicant_req_scan(wpa_s, 0, 0);
4900 void dump_freq_data(struct wpa_supplicant *wpa_s, const char *title,
4901 struct wpa_used_freq_data *freqs_data,
4906 wpa_dbg(wpa_s, MSG_DEBUG, "Shared frequencies (len=%u): %s",
4908 for (i = 0; i < len; i++) {
4909 struct wpa_used_freq_data *cur = &freqs_data[i];
4910 wpa_dbg(wpa_s, MSG_DEBUG, "freq[%u]: %d, flags=0x%X",
4911 i, cur->freq, cur->flags);
4917 * Find the operating frequencies of any of the virtual interfaces that
4918 * are using the same radio as the current interface, and in addition, get
4919 * information about the interface types that are using the frequency.
4921 int get_shared_radio_freqs_data(struct wpa_supplicant *wpa_s,
4922 struct wpa_used_freq_data *freqs_data,
4925 struct wpa_supplicant *ifs;
4928 unsigned int idx = 0, i;
4930 wpa_dbg(wpa_s, MSG_DEBUG,
4931 "Determining shared radio frequencies (max len %u)", len);
4932 os_memset(freqs_data, 0, sizeof(struct wpa_used_freq_data) * len);
4934 dl_list_for_each(ifs, &wpa_s->radio->ifaces, struct wpa_supplicant,
4939 if (ifs->current_ssid == NULL || ifs->assoc_freq == 0)
4942 if (ifs->current_ssid->mode == WPAS_MODE_AP ||
4943 ifs->current_ssid->mode == WPAS_MODE_P2P_GO)
4944 freq = ifs->current_ssid->frequency;
4945 else if (wpa_drv_get_bssid(ifs, bssid) == 0)
4946 freq = ifs->assoc_freq;
4950 /* Hold only distinct freqs */
4951 for (i = 0; i < idx; i++)
4952 if (freqs_data[i].freq == freq)
4956 freqs_data[idx++].freq = freq;
4958 if (ifs->current_ssid->mode == WPAS_MODE_INFRA) {
4959 freqs_data[i].flags = ifs->current_ssid->p2p_group ?
4960 WPA_FREQ_USED_BY_P2P_CLIENT :
4961 WPA_FREQ_USED_BY_INFRA_STATION;
4965 dump_freq_data(wpa_s, "completed iteration", freqs_data, idx);
4971 * Find the operating frequencies of any of the virtual interfaces that
4972 * are using the same radio as the current interface.
4974 int get_shared_radio_freqs(struct wpa_supplicant *wpa_s,
4975 int *freq_array, unsigned int len)
4977 struct wpa_used_freq_data *freqs_data;
4980 os_memset(freq_array, 0, sizeof(int) * len);
4982 freqs_data = os_calloc(len, sizeof(struct wpa_used_freq_data));
4986 num = get_shared_radio_freqs_data(wpa_s, freqs_data, len);
4987 for (i = 0; i < num; i++)
4988 freq_array[i] = freqs_data[i].freq;
4990 os_free(freqs_data);
4996 static void wpas_rrm_neighbor_rep_timeout_handler(void *data, void *user_ctx)
4998 struct rrm_data *rrm = data;
5000 if (!rrm->notify_neighbor_rep) {
5001 wpa_printf(MSG_ERROR,
5002 "RRM: Unexpected neighbor report timeout");
5006 wpa_printf(MSG_DEBUG, "RRM: Notifying neighbor report - NONE");
5007 rrm->notify_neighbor_rep(rrm->neighbor_rep_cb_ctx, NULL);
5009 rrm->notify_neighbor_rep = NULL;
5010 rrm->neighbor_rep_cb_ctx = NULL;
5015 * wpas_rrm_reset - Clear and reset all RRM data in wpa_supplicant
5016 * @wpa_s: Pointer to wpa_supplicant
5018 void wpas_rrm_reset(struct wpa_supplicant *wpa_s)
5020 wpa_s->rrm.rrm_used = 0;
5022 eloop_cancel_timeout(wpas_rrm_neighbor_rep_timeout_handler, &wpa_s->rrm,
5024 if (wpa_s->rrm.notify_neighbor_rep)
5025 wpas_rrm_neighbor_rep_timeout_handler(&wpa_s->rrm, NULL);
5026 wpa_s->rrm.next_neighbor_rep_token = 1;
5031 * wpas_rrm_process_neighbor_rep - Handle incoming neighbor report
5032 * @wpa_s: Pointer to wpa_supplicant
5033 * @report: Neighbor report buffer, prefixed by a 1-byte dialog token
5034 * @report_len: Length of neighbor report buffer
5036 void wpas_rrm_process_neighbor_rep(struct wpa_supplicant *wpa_s,
5037 const u8 *report, size_t report_len)
5039 struct wpabuf *neighbor_rep;
5041 wpa_hexdump(MSG_DEBUG, "RRM: New Neighbor Report", report, report_len);
5045 if (report[0] != wpa_s->rrm.next_neighbor_rep_token - 1) {
5046 wpa_printf(MSG_DEBUG,
5047 "RRM: Discarding neighbor report with token %d (expected %d)",
5048 report[0], wpa_s->rrm.next_neighbor_rep_token - 1);
5052 eloop_cancel_timeout(wpas_rrm_neighbor_rep_timeout_handler, &wpa_s->rrm,
5055 if (!wpa_s->rrm.notify_neighbor_rep) {
5056 wpa_printf(MSG_ERROR, "RRM: Unexpected neighbor report");
5060 /* skipping the first byte, which is only an id (dialog token) */
5061 neighbor_rep = wpabuf_alloc(report_len - 1);
5062 if (neighbor_rep == NULL)
5064 wpabuf_put_data(neighbor_rep, report + 1, report_len - 1);
5065 wpa_printf(MSG_DEBUG, "RRM: Notifying neighbor report (token = %d)",
5067 wpa_s->rrm.notify_neighbor_rep(wpa_s->rrm.neighbor_rep_cb_ctx,
5069 wpa_s->rrm.notify_neighbor_rep = NULL;
5070 wpa_s->rrm.neighbor_rep_cb_ctx = NULL;
5075 * wpas_rrm_send_neighbor_rep_request - Request a neighbor report from our AP
5076 * @wpa_s: Pointer to wpa_supplicant
5077 * @ssid: if not null, this is sent in the request. Otherwise, no SSID IE
5078 * is sent in the request.
5079 * @cb: Callback function to be called once the requested report arrives, or
5080 * timed out after RRM_NEIGHBOR_REPORT_TIMEOUT seconds.
5081 * In the former case, 'neighbor_rep' is a newly allocated wpabuf, and it's
5082 * the requester's responsibility to free it.
5083 * In the latter case NULL will be sent in 'neighbor_rep'.
5084 * @cb_ctx: Context value to send the callback function
5085 * Returns: 0 in case of success, negative error code otherwise
5087 * In case there is a previous request which has not been answered yet, the
5088 * new request fails. The caller may retry after RRM_NEIGHBOR_REPORT_TIMEOUT.
5089 * Request must contain a callback function.
5091 int wpas_rrm_send_neighbor_rep_request(struct wpa_supplicant *wpa_s,
5092 const struct wpa_ssid *ssid,
5093 void (*cb)(void *ctx,
5094 struct wpabuf *neighbor_rep),
5100 if (wpa_s->wpa_state != WPA_COMPLETED || wpa_s->current_ssid == NULL) {
5101 wpa_printf(MSG_DEBUG, "RRM: No connection, no RRM.");
5105 if (!wpa_s->rrm.rrm_used) {
5106 wpa_printf(MSG_DEBUG, "RRM: No RRM in current connection.");
5110 rrm_ie = wpa_bss_get_ie(wpa_s->current_bss,
5111 WLAN_EID_RRM_ENABLED_CAPABILITIES);
5112 if (!rrm_ie || !(wpa_s->current_bss->caps & IEEE80211_CAP_RRM) ||
5113 !(rrm_ie[2] & WLAN_RRM_CAPS_NEIGHBOR_REPORT)) {
5114 wpa_printf(MSG_DEBUG,
5115 "RRM: No network support for Neighbor Report.");
5120 wpa_printf(MSG_DEBUG,
5121 "RRM: Neighbor Report request must provide a callback.");
5125 /* Refuse if there's a live request */
5126 if (wpa_s->rrm.notify_neighbor_rep) {
5127 wpa_printf(MSG_DEBUG,
5128 "RRM: Currently handling previous Neighbor Report.");
5132 /* 3 = action category + action code + dialog token */
5133 buf = wpabuf_alloc(3 + (ssid ? 2 + ssid->ssid_len : 0));
5135 wpa_printf(MSG_DEBUG,
5136 "RRM: Failed to allocate Neighbor Report Request");
5140 wpa_printf(MSG_DEBUG, "RRM: Neighbor report request (for %s), token=%d",
5141 (ssid ? wpa_ssid_txt(ssid->ssid, ssid->ssid_len) : ""),
5142 wpa_s->rrm.next_neighbor_rep_token);
5144 wpabuf_put_u8(buf, WLAN_ACTION_RADIO_MEASUREMENT);
5145 wpabuf_put_u8(buf, WLAN_RRM_NEIGHBOR_REPORT_REQUEST);
5146 wpabuf_put_u8(buf, wpa_s->rrm.next_neighbor_rep_token);
5148 wpabuf_put_u8(buf, WLAN_EID_SSID);
5149 wpabuf_put_u8(buf, ssid->ssid_len);
5150 wpabuf_put_data(buf, ssid->ssid, ssid->ssid_len);
5153 wpa_s->rrm.next_neighbor_rep_token++;
5155 if (wpa_drv_send_action(wpa_s, wpa_s->assoc_freq, 0, wpa_s->bssid,
5156 wpa_s->own_addr, wpa_s->bssid,
5157 wpabuf_head(buf), wpabuf_len(buf), 0) < 0) {
5158 wpa_printf(MSG_DEBUG,
5159 "RRM: Failed to send Neighbor Report Request");
5164 wpa_s->rrm.neighbor_rep_cb_ctx = cb_ctx;
5165 wpa_s->rrm.notify_neighbor_rep = cb;
5166 eloop_register_timeout(RRM_NEIGHBOR_REPORT_TIMEOUT, 0,
5167 wpas_rrm_neighbor_rep_timeout_handler,
5175 void wpas_rrm_handle_link_measurement_request(struct wpa_supplicant *wpa_s,
5177 const u8 *frame, size_t len,
5181 const struct rrm_link_measurement_request *req;
5182 struct rrm_link_measurement_report report;
5184 if (wpa_s->wpa_state != WPA_COMPLETED) {
5185 wpa_printf(MSG_INFO,
5186 "RRM: Ignoring link measurement request. Not associated");
5190 if (!wpa_s->rrm.rrm_used) {
5191 wpa_printf(MSG_INFO,
5192 "RRM: Ignoring link measurement request. Not RRM network");
5196 if (!(wpa_s->drv_rrm_flags & WPA_DRIVER_FLAGS_TX_POWER_INSERTION)) {
5197 wpa_printf(MSG_INFO,
5198 "RRM: Measurement report failed. TX power insertion not supported");
5202 req = (const struct rrm_link_measurement_request *) frame;
5203 if (len < sizeof(*req)) {
5204 wpa_printf(MSG_INFO,
5205 "RRM: Link measurement report failed. Request too short");
5209 os_memset(&report, 0, sizeof(report));
5210 report.tpc.eid = WLAN_EID_TPC_REPORT;
5212 report.rsni = 255; /* 255 indicates that RSNI is not available */
5213 report.dialog_token = req->dialog_token;
5216 * It's possible to estimate RCPI based on RSSI in dBm. This
5217 * calculation will not reflect the correct value for high rates,
5218 * but it's good enough for Action frames which are transmitted
5219 * with up to 24 Mbps rates.
5222 report.rcpi = 255; /* not available */
5223 else if (rssi < -110)
5228 report.rcpi = (rssi + 110) * 2;
5230 /* action_category + action_code */
5231 buf = wpabuf_alloc(2 + sizeof(report));
5233 wpa_printf(MSG_ERROR,
5234 "RRM: Link measurement report failed. Buffer allocation failed");
5238 wpabuf_put_u8(buf, WLAN_ACTION_RADIO_MEASUREMENT);
5239 wpabuf_put_u8(buf, WLAN_RRM_LINK_MEASUREMENT_REPORT);
5240 wpabuf_put_data(buf, &report, sizeof(report));
5241 wpa_hexdump(MSG_DEBUG, "RRM: Link measurement report:",
5242 wpabuf_head(buf), wpabuf_len(buf));
5244 if (wpa_drv_send_action(wpa_s, wpa_s->assoc_freq, 0, src,
5245 wpa_s->own_addr, wpa_s->bssid,
5246 wpabuf_head(buf), wpabuf_len(buf), 0)) {
5247 wpa_printf(MSG_ERROR,
5248 "RRM: Link measurement report failed. Send action failed");