3 * Copyright (c) 2003-2012, 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_server/eap_methods.h"
21 #include "rsn_supp/wpa.h"
24 #include "utils/ext_password.h"
25 #include "l2_packet/l2_packet.h"
26 #include "wpa_supplicant_i.h"
28 #include "ctrl_iface.h"
29 #include "pcsc_funcs.h"
30 #include "common/version.h"
31 #include "rsn_supp/preauth.h"
32 #include "rsn_supp/pmksa_cache.h"
33 #include "common/wpa_ctrl.h"
34 #include "common/ieee802_11_defs.h"
36 #include "blacklist.h"
37 #include "wpas_glue.h"
38 #include "wps_supplicant.h"
41 #include "gas_query.h"
43 #include "p2p_supplicant.h"
44 #include "wifi_display.h"
50 #include "offchannel.h"
51 #include "hs20_supplicant.h"
53 const char *wpa_supplicant_version =
54 "wpa_supplicant v" VERSION_STR "\n"
55 "Copyright (c) 2003-2013, Jouni Malinen <j@w1.fi> and contributors";
57 const char *wpa_supplicant_license =
58 "This software may be distributed under the terms of the BSD license.\n"
59 "See README for more details.\n"
60 #ifdef EAP_TLS_OPENSSL
61 "\nThis product includes software developed by the OpenSSL Project\n"
62 "for use in the OpenSSL Toolkit (http://www.openssl.org/)\n"
63 #endif /* EAP_TLS_OPENSSL */
66 #ifndef CONFIG_NO_STDOUT_DEBUG
67 /* Long text divided into parts in order to fit in C89 strings size limits. */
68 const char *wpa_supplicant_full_license1 =
70 const char *wpa_supplicant_full_license2 =
71 "This software may be distributed under the terms of the BSD license.\n"
73 "Redistribution and use in source and binary forms, with or without\n"
74 "modification, are permitted provided that the following conditions are\n"
77 const char *wpa_supplicant_full_license3 =
78 "1. Redistributions of source code must retain the above copyright\n"
79 " notice, this list of conditions and the following disclaimer.\n"
81 "2. Redistributions in binary form must reproduce the above copyright\n"
82 " notice, this list of conditions and the following disclaimer in the\n"
83 " documentation and/or other materials provided with the distribution.\n"
85 const char *wpa_supplicant_full_license4 =
86 "3. Neither the name(s) of the above-listed copyright holder(s) nor the\n"
87 " names of its contributors may be used to endorse or promote products\n"
88 " derived from this software without specific prior written permission.\n"
90 "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
91 "\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
92 "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
93 "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n";
94 const char *wpa_supplicant_full_license5 =
95 "OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
96 "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
97 "LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
98 "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
99 "THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
100 "(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
101 "OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
103 #endif /* CONFIG_NO_STDOUT_DEBUG */
105 extern int wpa_debug_level;
106 extern int wpa_debug_show_keys;
107 extern int wpa_debug_timestamp;
108 extern struct wpa_driver_ops *wpa_drivers[];
110 /* Configure default/group WEP keys for static WEP */
111 int wpa_set_wep_keys(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
115 for (i = 0; i < NUM_WEP_KEYS; i++) {
116 if (ssid->wep_key_len[i] == 0)
120 wpa_drv_set_key(wpa_s, WPA_ALG_WEP, NULL,
121 i, i == ssid->wep_tx_keyidx, NULL, 0,
122 ssid->wep_key[i], ssid->wep_key_len[i]);
129 static int wpa_supplicant_set_wpa_none_key(struct wpa_supplicant *wpa_s,
130 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 return wpa_drv_set_key(wpa_s, alg, NULL, 0, 1, seq, 6, key, keylen);
183 static void wpa_supplicant_timeout(void *eloop_ctx, void *timeout_ctx)
185 struct wpa_supplicant *wpa_s = eloop_ctx;
186 const u8 *bssid = wpa_s->bssid;
187 if (is_zero_ether_addr(bssid))
188 bssid = wpa_s->pending_bssid;
189 wpa_msg(wpa_s, MSG_INFO, "Authentication with " MACSTR " timed out.",
191 wpa_blacklist_add(wpa_s, bssid);
192 wpa_sm_notify_disassoc(wpa_s->wpa);
193 wpa_supplicant_deauthenticate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
194 wpa_s->reassociate = 1;
197 * If we timed out, the AP or the local radio may be busy.
198 * So, wait a second until scanning again.
200 wpa_supplicant_req_scan(wpa_s, 1, 0);
202 wpas_p2p_continue_after_scan(wpa_s);
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 && 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->conf && (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED))
295 eapol_conf.required_keys = 0;
298 eapol_conf.fast_reauth = wpa_s->conf->fast_reauth;
299 eapol_conf.workaround = ssid->eap_workaround;
300 eapol_conf.eap_disabled =
301 !wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) &&
302 wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA &&
303 wpa_s->key_mgmt != WPA_KEY_MGMT_WPS;
304 eapol_sm_notify_config(wpa_s->eapol, &ssid->eap, &eapol_conf);
305 #endif /* IEEE8021X_EAPOL */
310 * wpa_supplicant_set_non_wpa_policy - Set WPA parameters to non-WPA mode
311 * @wpa_s: Pointer to wpa_supplicant data
312 * @ssid: Configuration data for the network
314 * This function is used to configure WPA state machine and related parameters
315 * to a mode where WPA is not enabled. This is called as part of the
316 * authentication configuration when the selected network does not use WPA.
318 void wpa_supplicant_set_non_wpa_policy(struct wpa_supplicant *wpa_s,
319 struct wpa_ssid *ssid)
323 if (ssid->key_mgmt & WPA_KEY_MGMT_WPS)
324 wpa_s->key_mgmt = WPA_KEY_MGMT_WPS;
325 else if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA)
326 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_NO_WPA;
328 wpa_s->key_mgmt = WPA_KEY_MGMT_NONE;
329 wpa_sm_set_ap_wpa_ie(wpa_s->wpa, NULL, 0);
330 wpa_sm_set_ap_rsn_ie(wpa_s->wpa, NULL, 0);
331 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
332 wpa_s->pairwise_cipher = WPA_CIPHER_NONE;
333 wpa_s->group_cipher = WPA_CIPHER_NONE;
334 wpa_s->mgmt_group_cipher = 0;
336 for (i = 0; i < NUM_WEP_KEYS; i++) {
337 if (ssid->wep_key_len[i] > 5) {
338 wpa_s->pairwise_cipher = WPA_CIPHER_WEP104;
339 wpa_s->group_cipher = WPA_CIPHER_WEP104;
341 } else if (ssid->wep_key_len[i] > 0) {
342 wpa_s->pairwise_cipher = WPA_CIPHER_WEP40;
343 wpa_s->group_cipher = WPA_CIPHER_WEP40;
348 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED, 0);
349 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
350 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
351 wpa_s->pairwise_cipher);
352 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
353 #ifdef CONFIG_IEEE80211W
354 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
355 wpa_s->mgmt_group_cipher);
356 #endif /* CONFIG_IEEE80211W */
358 pmksa_cache_clear_current(wpa_s->wpa);
362 void free_hw_features(struct wpa_supplicant *wpa_s)
365 if (wpa_s->hw.modes == NULL)
368 for (i = 0; i < wpa_s->hw.num_modes; i++) {
369 os_free(wpa_s->hw.modes[i].channels);
370 os_free(wpa_s->hw.modes[i].rates);
373 os_free(wpa_s->hw.modes);
374 wpa_s->hw.modes = NULL;
378 static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s)
380 bgscan_deinit(wpa_s);
381 autoscan_deinit(wpa_s);
382 scard_deinit(wpa_s->scard);
384 wpa_sm_set_scard_ctx(wpa_s->wpa, NULL);
385 eapol_sm_register_scard_ctx(wpa_s->eapol, NULL);
386 l2_packet_deinit(wpa_s->l2);
389 l2_packet_deinit(wpa_s->l2_br);
393 if (wpa_s->conf != NULL) {
394 struct wpa_ssid *ssid;
395 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
396 wpas_notify_network_removed(wpa_s, ssid);
399 os_free(wpa_s->confname);
400 wpa_s->confname = NULL;
402 os_free(wpa_s->confanother);
403 wpa_s->confanother = NULL;
405 wpa_sm_set_eapol(wpa_s->wpa, NULL);
406 eapol_sm_deinit(wpa_s->eapol);
409 rsn_preauth_deinit(wpa_s->wpa);
412 wpa_tdls_deinit(wpa_s->wpa);
413 #endif /* CONFIG_TDLS */
415 pmksa_candidate_free(wpa_s->wpa);
416 wpa_sm_deinit(wpa_s->wpa);
418 wpa_blacklist_clear(wpa_s);
420 wpa_bss_deinit(wpa_s);
422 wpa_supplicant_cancel_scan(wpa_s);
423 wpa_supplicant_cancel_auth_timeout(wpa_s);
424 eloop_cancel_timeout(wpa_supplicant_stop_countermeasures, wpa_s, NULL);
425 #ifdef CONFIG_DELAYED_MIC_ERROR_REPORT
426 eloop_cancel_timeout(wpa_supplicant_delayed_mic_error_report,
428 #endif /* CONFIG_DELAYED_MIC_ERROR_REPORT */
430 wpas_wps_deinit(wpa_s);
432 wpabuf_free(wpa_s->pending_eapol_rx);
433 wpa_s->pending_eapol_rx = NULL;
435 #ifdef CONFIG_IBSS_RSN
436 ibss_rsn_deinit(wpa_s->ibss_rsn);
437 wpa_s->ibss_rsn = NULL;
438 #endif /* CONFIG_IBSS_RSN */
443 wpa_supplicant_ap_deinit(wpa_s);
444 #endif /* CONFIG_AP */
447 wpas_p2p_deinit(wpa_s);
448 #endif /* CONFIG_P2P */
450 #ifdef CONFIG_OFFCHANNEL
451 offchannel_deinit(wpa_s);
452 #endif /* CONFIG_OFFCHANNEL */
454 wpa_supplicant_cancel_sched_scan(wpa_s);
456 os_free(wpa_s->next_scan_freqs);
457 wpa_s->next_scan_freqs = NULL;
459 gas_query_deinit(wpa_s->gas);
462 free_hw_features(wpa_s);
464 os_free(wpa_s->bssid_filter);
465 wpa_s->bssid_filter = NULL;
467 os_free(wpa_s->disallow_aps_bssid);
468 wpa_s->disallow_aps_bssid = NULL;
469 os_free(wpa_s->disallow_aps_ssid);
470 wpa_s->disallow_aps_ssid = NULL;
472 wnm_bss_keep_alive_deinit(wpa_s);
474 ext_password_deinit(wpa_s->ext_pw);
475 wpa_s->ext_pw = NULL;
477 wpabuf_free(wpa_s->last_gas_resp);
479 os_free(wpa_s->last_scan_res);
480 wpa_s->last_scan_res = NULL;
485 * wpa_clear_keys - Clear keys configured for the driver
486 * @wpa_s: Pointer to wpa_supplicant data
487 * @addr: Previously used BSSID or %NULL if not available
489 * This function clears the encryption keys that has been previously configured
492 void wpa_clear_keys(struct wpa_supplicant *wpa_s, const u8 *addr)
494 if (wpa_s->keys_cleared) {
495 /* Some drivers (e.g., ndiswrapper & NDIS drivers) seem to have
496 * timing issues with keys being cleared just before new keys
497 * are set or just after association or something similar. This
498 * shows up in group key handshake failing often because of the
499 * client not receiving the first encrypted packets correctly.
500 * Skipping some of the extra key clearing steps seems to help
501 * in completing group key handshake more reliably. */
502 wpa_dbg(wpa_s, MSG_DEBUG, "No keys have been configured - "
503 "skip key clearing");
507 /* MLME-DELETEKEYS.request */
508 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, 0, 0, NULL, 0, NULL, 0);
509 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, 1, 0, NULL, 0, NULL, 0);
510 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, 2, 0, NULL, 0, NULL, 0);
511 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, 3, 0, NULL, 0, NULL, 0);
512 #ifdef CONFIG_IEEE80211W
513 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, 4, 0, NULL, 0, NULL, 0);
514 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, 5, 0, NULL, 0, NULL, 0);
515 #endif /* CONFIG_IEEE80211W */
517 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, addr, 0, 0, NULL, 0, NULL,
519 /* MLME-SETPROTECTION.request(None) */
520 wpa_drv_mlme_setprotection(
522 MLME_SETPROTECTION_PROTECT_TYPE_NONE,
523 MLME_SETPROTECTION_KEY_TYPE_PAIRWISE);
525 wpa_s->keys_cleared = 1;
530 * wpa_supplicant_state_txt - Get the connection state name as a text string
531 * @state: State (wpa_state; WPA_*)
532 * Returns: The state name as a printable text string
534 const char * wpa_supplicant_state_txt(enum wpa_states state)
537 case WPA_DISCONNECTED:
538 return "DISCONNECTED";
541 case WPA_INTERFACE_DISABLED:
542 return "INTERFACE_DISABLED";
545 case WPA_AUTHENTICATING:
546 return "AUTHENTICATING";
547 case WPA_ASSOCIATING:
548 return "ASSOCIATING";
551 case WPA_4WAY_HANDSHAKE:
552 return "4WAY_HANDSHAKE";
553 case WPA_GROUP_HANDSHAKE:
554 return "GROUP_HANDSHAKE";
565 static void wpa_supplicant_start_bgscan(struct wpa_supplicant *wpa_s)
567 if (wpas_driver_bss_selection(wpa_s))
569 if (wpa_s->current_ssid == wpa_s->bgscan_ssid)
572 bgscan_deinit(wpa_s);
573 if (wpa_s->current_ssid && wpa_s->current_ssid->bgscan) {
574 if (bgscan_init(wpa_s, wpa_s->current_ssid)) {
575 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize "
578 * Live without bgscan; it is only used as a roaming
579 * optimization, so the initial connection is not
583 struct wpa_scan_results *scan_res;
584 wpa_s->bgscan_ssid = wpa_s->current_ssid;
585 scan_res = wpa_supplicant_get_scan_results(wpa_s, NULL,
588 bgscan_notify_scan(wpa_s, scan_res);
589 wpa_scan_results_free(scan_res);
593 wpa_s->bgscan_ssid = NULL;
597 static void wpa_supplicant_stop_bgscan(struct wpa_supplicant *wpa_s)
599 if (wpa_s->bgscan_ssid != NULL) {
600 bgscan_deinit(wpa_s);
601 wpa_s->bgscan_ssid = NULL;
605 #endif /* CONFIG_BGSCAN */
608 static void wpa_supplicant_start_autoscan(struct wpa_supplicant *wpa_s)
610 if (autoscan_init(wpa_s, 0))
611 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize autoscan");
615 static void wpa_supplicant_stop_autoscan(struct wpa_supplicant *wpa_s)
617 autoscan_deinit(wpa_s);
621 void wpa_supplicant_reinit_autoscan(struct wpa_supplicant *wpa_s)
623 if (wpa_s->wpa_state == WPA_DISCONNECTED ||
624 wpa_s->wpa_state == WPA_SCANNING) {
625 autoscan_deinit(wpa_s);
626 wpa_supplicant_start_autoscan(wpa_s);
632 * wpa_supplicant_set_state - Set current connection state
633 * @wpa_s: Pointer to wpa_supplicant data
634 * @state: The new connection state
636 * This function is called whenever the connection state changes, e.g.,
637 * association is completed for WPA/WPA2 4-Way Handshake is started.
639 void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s,
640 enum wpa_states state)
642 enum wpa_states old_state = wpa_s->wpa_state;
644 wpa_dbg(wpa_s, MSG_DEBUG, "State: %s -> %s",
645 wpa_supplicant_state_txt(wpa_s->wpa_state),
646 wpa_supplicant_state_txt(state));
649 if(state == WPA_ASSOCIATED && wpa_s->current_ssid) {
650 wpa_s->current_ssid->assoc_retry = 0;
652 #endif /* ANDROID_P2P */
654 if (state != WPA_SCANNING)
655 wpa_supplicant_notify_scanning(wpa_s, 0);
657 if (state == WPA_COMPLETED && wpa_s->new_connection) {
658 struct wpa_ssid *ssid = wpa_s->current_ssid;
659 #if defined(CONFIG_CTRL_IFACE) || !defined(CONFIG_NO_STDOUT_DEBUG)
660 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_CONNECTED "- Connection to "
661 MACSTR " completed (auth) [id=%d id_str=%s]",
662 MAC2STR(wpa_s->bssid),
663 ssid ? ssid->id : -1,
664 ssid && ssid->id_str ? ssid->id_str : "");
665 #endif /* CONFIG_CTRL_IFACE || !CONFIG_NO_STDOUT_DEBUG */
666 wpas_clear_temp_disabled(wpa_s, ssid, 1);
667 wpa_s->extra_blacklist_count = 0;
668 wpa_s->new_connection = 0;
669 wpa_drv_set_operstate(wpa_s, 1);
670 #ifndef IEEE8021X_EAPOL
671 wpa_drv_set_supp_port(wpa_s, 1);
672 #endif /* IEEE8021X_EAPOL */
673 wpa_s->after_wps = 0;
675 wpas_p2p_completed(wpa_s);
676 #endif /* CONFIG_P2P */
678 sme_sched_obss_scan(wpa_s, 1);
679 } else if (state == WPA_DISCONNECTED || state == WPA_ASSOCIATING ||
680 state == WPA_ASSOCIATED) {
681 wpa_s->new_connection = 1;
682 wpa_drv_set_operstate(wpa_s, 0);
683 #ifndef IEEE8021X_EAPOL
684 wpa_drv_set_supp_port(wpa_s, 0);
685 #endif /* IEEE8021X_EAPOL */
686 sme_sched_obss_scan(wpa_s, 0);
688 wpa_s->wpa_state = state;
691 if (state == WPA_COMPLETED)
692 wpa_supplicant_start_bgscan(wpa_s);
694 wpa_supplicant_stop_bgscan(wpa_s);
695 #endif /* CONFIG_BGSCAN */
697 if (state == WPA_AUTHENTICATING)
698 wpa_supplicant_stop_autoscan(wpa_s);
700 if (state == WPA_DISCONNECTED || state == WPA_INACTIVE)
701 wpa_supplicant_start_autoscan(wpa_s);
703 if (wpa_s->wpa_state != old_state) {
704 wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
706 if (wpa_s->wpa_state == WPA_COMPLETED ||
707 old_state == WPA_COMPLETED)
708 wpas_notify_auth_changed(wpa_s);
713 void wpa_supplicant_terminate_proc(struct wpa_global *global)
717 struct wpa_supplicant *wpa_s = global->ifaces;
719 if (wpas_wps_terminate_pending(wpa_s) == 1)
723 #endif /* CONFIG_WPS */
730 static void wpa_supplicant_terminate(int sig, void *signal_ctx)
732 struct wpa_global *global = signal_ctx;
733 wpa_supplicant_terminate_proc(global);
737 void wpa_supplicant_clear_status(struct wpa_supplicant *wpa_s)
739 enum wpa_states old_state = wpa_s->wpa_state;
741 wpa_s->pairwise_cipher = 0;
742 wpa_s->group_cipher = 0;
743 wpa_s->mgmt_group_cipher = 0;
745 if (wpa_s->wpa_state != WPA_INTERFACE_DISABLED)
746 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
748 if (wpa_s->wpa_state != old_state)
749 wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
754 * wpa_supplicant_reload_configuration - Reload configuration data
755 * @wpa_s: Pointer to wpa_supplicant data
756 * Returns: 0 on success or -1 if configuration parsing failed
758 * This function can be used to request that the configuration data is reloaded
759 * (e.g., after configuration file change). This function is reloading
760 * configuration only for one interface, so this may need to be called multiple
761 * times if %wpa_supplicant is controlling multiple interfaces and all
762 * interfaces need reconfiguration.
764 int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s)
766 struct wpa_config *conf;
770 if (wpa_s->confname == NULL)
772 conf = wpa_config_read(wpa_s->confname, NULL);
774 wpa_msg(wpa_s, MSG_ERROR, "Failed to parse the configuration "
775 "file '%s' - exiting", wpa_s->confname);
778 wpa_config_read(wpa_s->confanother, conf);
780 conf->changed_parameters = (unsigned int) -1;
782 reconf_ctrl = !!conf->ctrl_interface != !!wpa_s->conf->ctrl_interface
783 || (conf->ctrl_interface && wpa_s->conf->ctrl_interface &&
784 os_strcmp(conf->ctrl_interface,
785 wpa_s->conf->ctrl_interface) != 0);
787 if (reconf_ctrl && wpa_s->ctrl_iface) {
788 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
789 wpa_s->ctrl_iface = NULL;
792 eapol_sm_invalidate_cached_session(wpa_s->eapol);
793 if (wpa_s->current_ssid) {
794 wpa_supplicant_deauthenticate(wpa_s,
795 WLAN_REASON_DEAUTH_LEAVING);
799 * TODO: should notify EAPOL SM about changes in opensc_engine_path,
800 * pkcs11_engine_path, pkcs11_module_path.
802 if (wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt)) {
804 * Clear forced success to clear EAP state for next
807 eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
809 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
810 wpa_sm_set_config(wpa_s->wpa, NULL);
811 wpa_sm_pmksa_cache_flush(wpa_s->wpa, NULL);
812 wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
813 rsn_preauth_deinit(wpa_s->wpa);
815 old_ap_scan = wpa_s->conf->ap_scan;
816 wpa_config_free(wpa_s->conf);
818 if (old_ap_scan != wpa_s->conf->ap_scan)
819 wpas_notify_ap_scan_changed(wpa_s);
822 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
824 wpa_supplicant_update_config(wpa_s);
826 wpa_supplicant_clear_status(wpa_s);
827 if (wpa_supplicant_enabled_networks(wpa_s)) {
828 wpa_s->reassociate = 1;
829 wpa_supplicant_req_scan(wpa_s, 0, 0);
831 wpa_dbg(wpa_s, MSG_DEBUG, "Reconfiguration completed");
836 static void wpa_supplicant_reconfig(int sig, void *signal_ctx)
838 struct wpa_global *global = signal_ctx;
839 struct wpa_supplicant *wpa_s;
840 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
841 wpa_dbg(wpa_s, MSG_DEBUG, "Signal %d received - reconfiguring",
843 if (wpa_supplicant_reload_configuration(wpa_s) < 0) {
844 wpa_supplicant_terminate_proc(global);
850 enum wpa_key_mgmt key_mgmt2driver(int key_mgmt)
853 case WPA_KEY_MGMT_NONE:
854 return KEY_MGMT_NONE;
855 case WPA_KEY_MGMT_IEEE8021X_NO_WPA:
856 return KEY_MGMT_802_1X_NO_WPA;
857 case WPA_KEY_MGMT_IEEE8021X:
858 return KEY_MGMT_802_1X;
859 case WPA_KEY_MGMT_WPA_NONE:
860 return KEY_MGMT_WPA_NONE;
861 case WPA_KEY_MGMT_FT_IEEE8021X:
862 return KEY_MGMT_FT_802_1X;
863 case WPA_KEY_MGMT_FT_PSK:
864 return KEY_MGMT_FT_PSK;
865 case WPA_KEY_MGMT_IEEE8021X_SHA256:
866 return KEY_MGMT_802_1X_SHA256;
867 case WPA_KEY_MGMT_PSK_SHA256:
868 return KEY_MGMT_PSK_SHA256;
869 case WPA_KEY_MGMT_WPS:
871 case WPA_KEY_MGMT_PSK:
878 static int wpa_supplicant_suites_from_ai(struct wpa_supplicant *wpa_s,
879 struct wpa_ssid *ssid,
880 struct wpa_ie_data *ie)
882 int ret = wpa_sm_parse_own_wpa_ie(wpa_s->wpa, ie);
885 wpa_msg(wpa_s, MSG_INFO, "WPA: Failed to parse WPA IE "
886 "from association info");
891 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Using WPA IE from AssocReq to set "
893 if (!(ie->group_cipher & ssid->group_cipher)) {
894 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled group "
895 "cipher 0x%x (mask 0x%x) - reject",
896 ie->group_cipher, ssid->group_cipher);
899 if (!(ie->pairwise_cipher & ssid->pairwise_cipher)) {
900 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled pairwise "
901 "cipher 0x%x (mask 0x%x) - reject",
902 ie->pairwise_cipher, ssid->pairwise_cipher);
905 if (!(ie->key_mgmt & ssid->key_mgmt)) {
906 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled key "
907 "management 0x%x (mask 0x%x) - reject",
908 ie->key_mgmt, ssid->key_mgmt);
912 #ifdef CONFIG_IEEE80211W
913 if (!(ie->capabilities & WPA_CAPABILITY_MFPC) &&
914 (ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT ?
915 wpa_s->conf->pmf : ssid->ieee80211w) ==
916 MGMT_FRAME_PROTECTION_REQUIRED) {
917 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver associated with an AP "
918 "that does not support management frame protection - "
922 #endif /* CONFIG_IEEE80211W */
929 * wpa_supplicant_set_suites - Set authentication and encryption parameters
930 * @wpa_s: Pointer to wpa_supplicant data
931 * @bss: Scan results for the selected BSS, or %NULL if not available
932 * @ssid: Configuration data for the selected network
933 * @wpa_ie: Buffer for the WPA/RSN IE
934 * @wpa_ie_len: Maximum wpa_ie buffer size on input. This is changed to be the
935 * used buffer length in case the functions returns success.
936 * Returns: 0 on success or -1 on failure
938 * This function is used to configure authentication and encryption parameters
939 * based on the network configuration and scan result for the selected BSS (if
942 int wpa_supplicant_set_suites(struct wpa_supplicant *wpa_s,
943 struct wpa_bss *bss, struct wpa_ssid *ssid,
944 u8 *wpa_ie, size_t *wpa_ie_len)
946 struct wpa_ie_data ie;
948 const u8 *bss_wpa, *bss_rsn;
951 bss_wpa = wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE);
952 bss_rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
954 bss_wpa = bss_rsn = NULL;
956 if (bss_rsn && (ssid->proto & WPA_PROTO_RSN) &&
957 wpa_parse_wpa_ie(bss_rsn, 2 + bss_rsn[1], &ie) == 0 &&
958 (ie.group_cipher & ssid->group_cipher) &&
959 (ie.pairwise_cipher & ssid->pairwise_cipher) &&
960 (ie.key_mgmt & ssid->key_mgmt)) {
961 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using IEEE 802.11i/D9.0");
962 proto = WPA_PROTO_RSN;
963 } else if (bss_wpa && (ssid->proto & WPA_PROTO_WPA) &&
964 wpa_parse_wpa_ie(bss_wpa, 2 +bss_wpa[1], &ie) == 0 &&
965 (ie.group_cipher & ssid->group_cipher) &&
966 (ie.pairwise_cipher & ssid->pairwise_cipher) &&
967 (ie.key_mgmt & ssid->key_mgmt)) {
968 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using IEEE 802.11i/D3.0");
969 proto = WPA_PROTO_WPA;
971 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select WPA/RSN");
974 if (ssid->proto & WPA_PROTO_RSN)
975 proto = WPA_PROTO_RSN;
977 proto = WPA_PROTO_WPA;
978 if (wpa_supplicant_suites_from_ai(wpa_s, ssid, &ie) < 0) {
979 os_memset(&ie, 0, sizeof(ie));
980 ie.group_cipher = ssid->group_cipher;
981 ie.pairwise_cipher = ssid->pairwise_cipher;
982 ie.key_mgmt = ssid->key_mgmt;
983 #ifdef CONFIG_IEEE80211W
984 ie.mgmt_group_cipher =
985 ssid->ieee80211w != NO_MGMT_FRAME_PROTECTION ?
986 WPA_CIPHER_AES_128_CMAC : 0;
987 #endif /* CONFIG_IEEE80211W */
988 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Set cipher suites "
989 "based on configuration");
994 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected cipher suites: group %d "
995 "pairwise %d key_mgmt %d proto %d",
996 ie.group_cipher, ie.pairwise_cipher, ie.key_mgmt, proto);
997 #ifdef CONFIG_IEEE80211W
998 if (ssid->ieee80211w) {
999 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected mgmt group cipher %d",
1000 ie.mgmt_group_cipher);
1002 #endif /* CONFIG_IEEE80211W */
1004 wpa_s->wpa_proto = proto;
1005 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PROTO, proto);
1006 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED,
1007 !!(ssid->proto & WPA_PROTO_RSN));
1009 if (bss || !wpa_s->ap_ies_from_associnfo) {
1010 if (wpa_sm_set_ap_wpa_ie(wpa_s->wpa, bss_wpa,
1011 bss_wpa ? 2 + bss_wpa[1] : 0) ||
1012 wpa_sm_set_ap_rsn_ie(wpa_s->wpa, bss_rsn,
1013 bss_rsn ? 2 + bss_rsn[1] : 0))
1017 sel = ie.group_cipher & ssid->group_cipher;
1018 wpa_s->group_cipher = wpa_pick_group_cipher(sel);
1019 if (wpa_s->group_cipher < 0) {
1020 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select group "
1024 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using GTK %s",
1025 wpa_cipher_txt(wpa_s->group_cipher));
1027 sel = ie.pairwise_cipher & ssid->pairwise_cipher;
1028 wpa_s->pairwise_cipher = wpa_pick_pairwise_cipher(sel, 1);
1029 if (wpa_s->pairwise_cipher < 0) {
1030 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select pairwise "
1034 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using PTK %s",
1035 wpa_cipher_txt(wpa_s->pairwise_cipher));
1037 sel = ie.key_mgmt & ssid->key_mgmt;
1039 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SAE))
1040 sel &= ~(WPA_KEY_MGMT_SAE | WPA_KEY_MGMT_FT_SAE);
1041 #endif /* CONFIG_SAE */
1043 #ifdef CONFIG_IEEE80211R
1044 } else if (sel & WPA_KEY_MGMT_FT_IEEE8021X) {
1045 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_IEEE8021X;
1046 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/802.1X");
1047 } else if (sel & WPA_KEY_MGMT_FT_PSK) {
1048 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_PSK;
1049 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/PSK");
1050 #endif /* CONFIG_IEEE80211R */
1052 } else if (sel & WPA_KEY_MGMT_SAE) {
1053 wpa_s->key_mgmt = WPA_KEY_MGMT_SAE;
1054 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT SAE");
1055 } else if (sel & WPA_KEY_MGMT_FT_SAE) {
1056 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_SAE;
1057 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT FT/SAE");
1058 #endif /* CONFIG_SAE */
1059 #ifdef CONFIG_IEEE80211W
1060 } else if (sel & WPA_KEY_MGMT_IEEE8021X_SHA256) {
1061 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SHA256;
1062 wpa_dbg(wpa_s, MSG_DEBUG,
1063 "WPA: using KEY_MGMT 802.1X with SHA256");
1064 } else if (sel & WPA_KEY_MGMT_PSK_SHA256) {
1065 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK_SHA256;
1066 wpa_dbg(wpa_s, MSG_DEBUG,
1067 "WPA: using KEY_MGMT PSK with SHA256");
1068 #endif /* CONFIG_IEEE80211W */
1069 } else if (sel & WPA_KEY_MGMT_IEEE8021X) {
1070 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X;
1071 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT 802.1X");
1072 } else if (sel & WPA_KEY_MGMT_PSK) {
1073 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK;
1074 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-PSK");
1075 } else if (sel & WPA_KEY_MGMT_WPA_NONE) {
1076 wpa_s->key_mgmt = WPA_KEY_MGMT_WPA_NONE;
1077 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-NONE");
1079 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select "
1080 "authenticated key management type");
1084 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
1085 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
1086 wpa_s->pairwise_cipher);
1087 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
1089 #ifdef CONFIG_IEEE80211W
1090 sel = ie.mgmt_group_cipher;
1091 if ((ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT ?
1092 wpa_s->conf->pmf : ssid->ieee80211w) == NO_MGMT_FRAME_PROTECTION ||
1093 !(ie.capabilities & WPA_CAPABILITY_MFPC))
1095 if (sel & WPA_CIPHER_AES_128_CMAC) {
1096 wpa_s->mgmt_group_cipher = WPA_CIPHER_AES_128_CMAC;
1097 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1100 wpa_s->mgmt_group_cipher = 0;
1101 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: not using MGMT group cipher");
1103 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
1104 wpa_s->mgmt_group_cipher);
1105 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MFP,
1106 (ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT ?
1107 wpa_s->conf->pmf : ssid->ieee80211w));
1108 #endif /* CONFIG_IEEE80211W */
1110 if (wpa_sm_set_assoc_wpa_ie_default(wpa_s->wpa, wpa_ie, wpa_ie_len)) {
1111 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to generate WPA IE");
1115 if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt)) {
1116 wpa_sm_set_pmk(wpa_s->wpa, ssid->psk, PMK_LEN);
1117 #ifndef CONFIG_NO_PBKDF2
1118 if (bss && ssid->bssid_set && ssid->ssid_len == 0 &&
1121 pbkdf2_sha1(ssid->passphrase, bss->ssid, bss->ssid_len,
1122 4096, psk, PMK_LEN);
1123 wpa_hexdump_key(MSG_MSGDUMP, "PSK (from passphrase)",
1125 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN);
1127 #endif /* CONFIG_NO_PBKDF2 */
1128 #ifdef CONFIG_EXT_PASSWORD
1129 if (ssid->ext_psk) {
1130 struct wpabuf *pw = ext_password_get(wpa_s->ext_pw,
1132 char pw_str[64 + 1];
1136 wpa_msg(wpa_s, MSG_INFO, "EXT PW: No PSK "
1137 "found from external storage");
1141 if (wpabuf_len(pw) < 8 || wpabuf_len(pw) > 64) {
1142 wpa_msg(wpa_s, MSG_INFO, "EXT PW: Unexpected "
1143 "PSK length %d in external storage",
1144 (int) wpabuf_len(pw));
1145 ext_password_free(pw);
1149 os_memcpy(pw_str, wpabuf_head(pw), wpabuf_len(pw));
1150 pw_str[wpabuf_len(pw)] = '\0';
1152 #ifndef CONFIG_NO_PBKDF2
1153 if (wpabuf_len(pw) >= 8 && wpabuf_len(pw) < 64 && bss)
1155 pbkdf2_sha1(pw_str, bss->ssid, bss->ssid_len,
1156 4096, psk, PMK_LEN);
1157 os_memset(pw_str, 0, sizeof(pw_str));
1158 wpa_hexdump_key(MSG_MSGDUMP, "PSK (from "
1159 "external passphrase)",
1161 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN);
1163 #endif /* CONFIG_NO_PBKDF2 */
1164 if (wpabuf_len(pw) == 2 * PMK_LEN) {
1165 if (hexstr2bin(pw_str, psk, PMK_LEN) < 0) {
1166 wpa_msg(wpa_s, MSG_INFO, "EXT PW: "
1167 "Invalid PSK hex string");
1168 os_memset(pw_str, 0, sizeof(pw_str));
1169 ext_password_free(pw);
1172 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN);
1174 wpa_msg(wpa_s, MSG_INFO, "EXT PW: No suitable "
1176 os_memset(pw_str, 0, sizeof(pw_str));
1177 ext_password_free(pw);
1181 os_memset(pw_str, 0, sizeof(pw_str));
1182 ext_password_free(pw);
1184 #endif /* CONFIG_EXT_PASSWORD */
1186 wpa_sm_set_pmk_from_pmksa(wpa_s->wpa);
1192 static void wpas_ext_capab_byte(struct wpa_supplicant *wpa_s, u8 *pos, int idx)
1197 case 0: /* Bits 0-7 */
1199 case 1: /* Bits 8-15 */
1201 case 2: /* Bits 16-23 */
1203 *pos |= 0x02; /* Bit 17 - WNM-Sleep Mode */
1204 *pos |= 0x08; /* Bit 19 - BSS Transition */
1205 #endif /* CONFIG_WNM */
1207 case 3: /* Bits 24-31 */
1209 *pos |= 0x02; /* Bit 25 - SSID List */
1210 #endif /* CONFIG_WNM */
1211 #ifdef CONFIG_INTERWORKING
1212 if (wpa_s->conf->interworking)
1213 *pos |= 0x80; /* Bit 31 - Interworking */
1214 #endif /* CONFIG_INTERWORKING */
1216 case 4: /* Bits 32-39 */
1218 case 5: /* Bits 40-47 */
1220 case 6: /* Bits 48-55 */
1226 int wpas_build_ext_capab(struct wpa_supplicant *wpa_s, u8 *buf)
1231 if (len < wpa_s->extended_capa_len)
1232 len = wpa_s->extended_capa_len;
1234 *pos++ = WLAN_EID_EXT_CAPAB;
1236 for (i = 0; i < len; i++, pos++) {
1237 wpas_ext_capab_byte(wpa_s, pos, i);
1239 if (i < wpa_s->extended_capa_len) {
1240 *pos &= ~wpa_s->extended_capa_mask[i];
1241 *pos |= wpa_s->extended_capa[i];
1245 while (len > 0 && buf[1 + len] == 0) {
1257 * wpa_supplicant_associate - Request association
1258 * @wpa_s: Pointer to wpa_supplicant data
1259 * @bss: Scan results for the selected BSS, or %NULL if not available
1260 * @ssid: Configuration data for the selected network
1262 * This function is used to request %wpa_supplicant to associate with a BSS.
1264 void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
1265 struct wpa_bss *bss, struct wpa_ssid *ssid)
1269 int use_crypt, ret, i, bssid_changed;
1270 int algs = WPA_AUTH_ALG_OPEN;
1271 enum wpa_cipher cipher_pairwise, cipher_group;
1272 struct wpa_driver_associate_params params;
1273 int wep_keys_set = 0;
1274 struct wpa_driver_capa capa;
1275 int assoc_failed = 0;
1276 struct wpa_ssid *old_ssid;
1279 #ifdef CONFIG_HT_OVERRIDES
1280 struct ieee80211_ht_capabilities htcaps;
1281 struct ieee80211_ht_capabilities htcaps_mask;
1282 #endif /* CONFIG_HT_OVERRIDES */
1284 #ifdef CONFIG_IBSS_RSN
1285 ibss_rsn_deinit(wpa_s->ibss_rsn);
1286 wpa_s->ibss_rsn = NULL;
1287 #endif /* CONFIG_IBSS_RSN */
1292 if (ssid->mode == WPAS_MODE_AP || ssid->mode == WPAS_MODE_P2P_GO ||
1293 ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) {
1295 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_AP)) {
1296 wpa_msg(wpa_s, MSG_INFO, "Driver does not support AP "
1300 if (wpa_supplicant_create_ap(wpa_s, ssid) < 0) {
1301 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
1304 wpa_s->current_bss = bss;
1305 #else /* CONFIG_AP */
1306 wpa_msg(wpa_s, MSG_ERROR, "AP mode support not included in "
1308 #endif /* CONFIG_AP */
1314 wpa_tdls_ap_ies(wpa_s->wpa, (const u8 *) (bss + 1),
1316 #endif /* CONFIG_TDLS */
1318 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) &&
1319 ssid->mode == IEEE80211_MODE_INFRA) {
1320 sme_authenticate(wpa_s, bss, ssid);
1324 os_memset(¶ms, 0, sizeof(params));
1325 wpa_s->reassociate = 0;
1326 if (bss && !wpas_driver_bss_selection(wpa_s)) {
1327 #ifdef CONFIG_IEEE80211R
1328 const u8 *ie, *md = NULL;
1329 #endif /* CONFIG_IEEE80211R */
1330 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with " MACSTR
1331 " (SSID='%s' freq=%d MHz)", MAC2STR(bss->bssid),
1332 wpa_ssid_txt(bss->ssid, bss->ssid_len), bss->freq);
1333 bssid_changed = !is_zero_ether_addr(wpa_s->bssid);
1334 os_memset(wpa_s->bssid, 0, ETH_ALEN);
1335 os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN);
1337 wpas_notify_bssid_changed(wpa_s);
1338 #ifdef CONFIG_IEEE80211R
1339 ie = wpa_bss_get_ie(bss, WLAN_EID_MOBILITY_DOMAIN);
1340 if (ie && ie[1] >= MOBILITY_DOMAIN_ID_LEN)
1342 wpa_sm_set_ft_params(wpa_s->wpa, ie, ie ? 2 + ie[1] : 0);
1344 /* Prepare for the next transition */
1345 wpa_ft_prepare_auth_request(wpa_s->wpa, ie);
1347 #endif /* CONFIG_IEEE80211R */
1349 } else if ((ssid->ssid == NULL || ssid->ssid_len == 0) &&
1350 wpa_s->conf->ap_scan == 2 &&
1351 (ssid->key_mgmt & WPA_KEY_MGMT_WPS)) {
1352 /* Use ap_scan==1 style network selection to find the network
1354 wpa_s->scan_req = MANUAL_SCAN_REQ;
1355 wpa_s->reassociate = 1;
1356 wpa_supplicant_req_scan(wpa_s, 0, 0);
1358 #endif /* CONFIG_WPS */
1360 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with SSID '%s'",
1361 wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
1362 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
1364 wpa_supplicant_cancel_sched_scan(wpa_s);
1365 wpa_supplicant_cancel_scan(wpa_s);
1367 /* Starting new association, so clear the possibly used WPA IE from the
1368 * previous association. */
1369 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
1371 #ifdef IEEE8021X_EAPOL
1372 if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1374 if (ssid->non_leap == 0)
1375 algs = WPA_AUTH_ALG_LEAP;
1377 algs |= WPA_AUTH_ALG_LEAP;
1380 #endif /* IEEE8021X_EAPOL */
1381 wpa_dbg(wpa_s, MSG_DEBUG, "Automatic auth_alg selection: 0x%x", algs);
1382 if (ssid->auth_alg) {
1383 algs = ssid->auth_alg;
1384 wpa_dbg(wpa_s, MSG_DEBUG, "Overriding auth_alg selection: "
1388 if (bss && (wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE) ||
1389 wpa_bss_get_ie(bss, WLAN_EID_RSN)) &&
1390 wpa_key_mgmt_wpa(ssid->key_mgmt)) {
1391 int try_opportunistic;
1392 try_opportunistic = (ssid->proactive_key_caching < 0 ?
1394 ssid->proactive_key_caching) &&
1395 (ssid->proto & WPA_PROTO_RSN);
1396 if (pmksa_cache_set_current(wpa_s->wpa, NULL, bss->bssid,
1397 ssid, try_opportunistic) == 0)
1398 eapol_sm_notify_pmkid_attempt(wpa_s->eapol, 1);
1399 wpa_ie_len = sizeof(wpa_ie);
1400 if (wpa_supplicant_set_suites(wpa_s, bss, ssid,
1401 wpa_ie, &wpa_ie_len)) {
1402 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA "
1403 "key management and encryption suites");
1406 } else if ((ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) && bss &&
1407 wpa_key_mgmt_wpa_ieee8021x(ssid->key_mgmt)) {
1409 * Both WPA and non-WPA IEEE 802.1X enabled in configuration -
1410 * use non-WPA since the scan results did not indicate that the
1411 * AP is using WPA or WPA2.
1413 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
1415 wpa_s->wpa_proto = 0;
1416 } else if (wpa_key_mgmt_wpa_any(ssid->key_mgmt)) {
1417 wpa_ie_len = sizeof(wpa_ie);
1418 if (wpa_supplicant_set_suites(wpa_s, NULL, ssid,
1419 wpa_ie, &wpa_ie_len)) {
1420 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA "
1421 "key management and encryption suites (no "
1426 } else if (ssid->key_mgmt & WPA_KEY_MGMT_WPS) {
1427 struct wpabuf *wps_ie;
1428 wps_ie = wps_build_assoc_req_ie(wpas_wps_get_req_type(ssid));
1429 if (wps_ie && wpabuf_len(wps_ie) <= sizeof(wpa_ie)) {
1430 wpa_ie_len = wpabuf_len(wps_ie);
1431 os_memcpy(wpa_ie, wpabuf_head(wps_ie), wpa_ie_len);
1434 wpabuf_free(wps_ie);
1435 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
1436 if (!bss || (bss->caps & IEEE80211_CAP_PRIVACY))
1437 params.wps = WPS_MODE_PRIVACY;
1439 params.wps = WPS_MODE_OPEN;
1440 wpa_s->wpa_proto = 0;
1441 #endif /* CONFIG_WPS */
1443 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
1445 wpa_s->wpa_proto = 0;
1449 if (wpa_s->global->p2p) {
1453 pos = wpa_ie + wpa_ie_len;
1454 len = sizeof(wpa_ie) - wpa_ie_len;
1455 res = wpas_p2p_assoc_req_ie(wpa_s, bss, pos, len,
1461 wpa_s->cross_connect_disallowed = 0;
1464 p2p = wpa_bss_get_vendor_ie_multi(bss, P2P_IE_VENDOR_TYPE);
1466 wpa_s->cross_connect_disallowed =
1467 p2p_get_cross_connect_disallowed(p2p);
1469 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: WLAN AP %s cross "
1471 wpa_s->cross_connect_disallowed ?
1472 "disallows" : "allows");
1475 #endif /* CONFIG_P2P */
1478 if (wpa_s->conf->hs20) {
1479 struct wpabuf *hs20;
1480 hs20 = wpabuf_alloc(20);
1482 wpas_hs20_add_indication(hs20);
1483 os_memcpy(wpa_ie + wpa_ie_len, wpabuf_head(hs20),
1485 wpa_ie_len += wpabuf_len(hs20);
1489 #endif /* CONFIG_HS20 */
1491 ext_capab_len = wpas_build_ext_capab(wpa_s, ext_capab);
1492 if (ext_capab_len > 0) {
1494 if (wpa_ie_len > 0 && pos[0] == WLAN_EID_RSN)
1496 os_memmove(pos + ext_capab_len, pos,
1497 wpa_ie_len - (pos - wpa_ie));
1498 wpa_ie_len += ext_capab_len;
1499 os_memcpy(pos, ext_capab, ext_capab_len);
1502 wpa_clear_keys(wpa_s, bss ? bss->bssid : NULL);
1504 cipher_pairwise = wpa_cipher_to_suite_driver(wpa_s->pairwise_cipher);
1505 cipher_group = wpa_cipher_to_suite_driver(wpa_s->group_cipher);
1506 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
1507 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1508 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE)
1510 if (wpa_set_wep_keys(wpa_s, ssid)) {
1515 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS)
1518 #ifdef IEEE8021X_EAPOL
1519 if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1520 if ((ssid->eapol_flags &
1521 (EAPOL_FLAG_REQUIRE_KEY_UNICAST |
1522 EAPOL_FLAG_REQUIRE_KEY_BROADCAST)) == 0 &&
1526 /* Assume that dynamic WEP-104 keys will be used and
1527 * set cipher suites in order for drivers to expect
1529 cipher_pairwise = cipher_group = CIPHER_WEP104;
1532 #endif /* IEEE8021X_EAPOL */
1534 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
1535 /* Set the key before (and later after) association */
1536 wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
1539 wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING);
1541 params.ssid = bss->ssid;
1542 params.ssid_len = bss->ssid_len;
1543 if (!wpas_driver_bss_selection(wpa_s) || ssid->bssid_set) {
1544 wpa_printf(MSG_DEBUG, "Limit connection to BSSID "
1545 MACSTR " freq=%u MHz based on scan results "
1547 MAC2STR(bss->bssid), bss->freq,
1549 params.bssid = bss->bssid;
1550 params.freq = bss->freq;
1553 params.ssid = ssid->ssid;
1554 params.ssid_len = ssid->ssid_len;
1557 if (ssid->mode == WPAS_MODE_IBSS && ssid->bssid_set &&
1558 wpa_s->conf->ap_scan == 2) {
1559 params.bssid = ssid->bssid;
1560 params.fixed_bssid = 1;
1563 if (ssid->mode == WPAS_MODE_IBSS && ssid->frequency > 0 &&
1565 params.freq = ssid->frequency; /* Initial channel for IBSS */
1566 params.wpa_ie = wpa_ie;
1567 params.wpa_ie_len = wpa_ie_len;
1568 params.pairwise_suite = cipher_pairwise;
1569 params.group_suite = cipher_group;
1570 params.key_mgmt_suite = key_mgmt2driver(wpa_s->key_mgmt);
1571 params.wpa_proto = wpa_s->wpa_proto;
1572 params.auth_alg = algs;
1573 params.mode = ssid->mode;
1574 params.bg_scan_period = ssid->bg_scan_period;
1575 for (i = 0; i < NUM_WEP_KEYS; i++) {
1576 if (ssid->wep_key_len[i])
1577 params.wep_key[i] = ssid->wep_key[i];
1578 params.wep_key_len[i] = ssid->wep_key_len[i];
1580 params.wep_tx_keyidx = ssid->wep_tx_keyidx;
1582 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) &&
1583 (params.key_mgmt_suite == KEY_MGMT_PSK ||
1584 params.key_mgmt_suite == KEY_MGMT_FT_PSK)) {
1585 params.passphrase = ssid->passphrase;
1587 params.psk = ssid->psk;
1590 params.drop_unencrypted = use_crypt;
1592 #ifdef CONFIG_IEEE80211W
1593 params.mgmt_frame_protection =
1594 ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT ?
1595 wpa_s->conf->pmf : ssid->ieee80211w;
1596 if (params.mgmt_frame_protection != NO_MGMT_FRAME_PROTECTION && bss) {
1597 const u8 *rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
1598 struct wpa_ie_data ie;
1599 if (rsn && wpa_parse_wpa_ie(rsn, 2 + rsn[1], &ie) == 0 &&
1601 (WPA_CAPABILITY_MFPC | WPA_CAPABILITY_MFPR)) {
1602 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected AP supports "
1603 "MFP: require MFP");
1604 params.mgmt_frame_protection =
1605 MGMT_FRAME_PROTECTION_REQUIRED;
1608 #endif /* CONFIG_IEEE80211W */
1610 params.p2p = ssid->p2p_group;
1612 if (wpa_s->parent->set_sta_uapsd)
1613 params.uapsd = wpa_s->parent->sta_uapsd;
1617 #ifdef CONFIG_HT_OVERRIDES
1618 os_memset(&htcaps, 0, sizeof(htcaps));
1619 os_memset(&htcaps_mask, 0, sizeof(htcaps_mask));
1620 params.htcaps = (u8 *) &htcaps;
1621 params.htcaps_mask = (u8 *) &htcaps_mask;
1622 wpa_supplicant_apply_ht_overrides(wpa_s, ssid, ¶ms);
1623 #endif /* CONFIG_HT_OVERRIDES */
1626 /* If multichannel concurrency is not supported, check for any frequency
1627 * conflict and take appropriate action.
1629 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_MULTI_CHANNEL_CONCURRENT) &&
1630 ((freq = wpa_drv_shared_freq(wpa_s)) > 0) && (freq != params.freq)) {
1631 wpa_printf(MSG_DEBUG, "Shared interface with conflicting frequency found (%d != %d)"
1632 , freq, params.freq);
1633 if (wpas_p2p_handle_frequency_conflicts(wpa_s, params.freq, ssid) < 0)
1637 ret = wpa_drv_associate(wpa_s, ¶ms);
1639 wpa_msg(wpa_s, MSG_INFO, "Association request to the driver "
1641 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SANE_ERROR_CODES) {
1643 * The driver is known to mean what is saying, so we
1644 * can stop right here; the association will not
1647 wpas_connection_failed(wpa_s, wpa_s->pending_bssid);
1648 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
1649 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
1652 /* try to continue anyway; new association will be tried again
1657 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
1658 /* Set the key after the association just in case association
1659 * cleared the previously configured key. */
1660 wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
1661 /* No need to timeout authentication since there is no key
1663 wpa_supplicant_cancel_auth_timeout(wpa_s);
1664 wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
1665 #ifdef CONFIG_IBSS_RSN
1666 } else if (ssid->mode == WPAS_MODE_IBSS &&
1667 wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
1668 wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
1670 * RSN IBSS authentication is per-STA and we can disable the
1671 * per-BSSID authentication.
1673 wpa_supplicant_cancel_auth_timeout(wpa_s);
1674 #endif /* CONFIG_IBSS_RSN */
1676 /* Timeout for IEEE 802.11 authentication and association */
1680 /* give IBSS a bit more time */
1681 timeout = ssid->mode == WPAS_MODE_IBSS ? 10 : 5;
1682 } else if (wpa_s->conf->ap_scan == 1) {
1683 /* give IBSS a bit more time */
1684 timeout = ssid->mode == WPAS_MODE_IBSS ? 20 : 10;
1686 wpa_supplicant_req_auth_timeout(wpa_s, timeout, 0);
1689 if (wep_keys_set && wpa_drv_get_capa(wpa_s, &capa) == 0 &&
1690 capa.flags & WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC) {
1691 /* Set static WEP keys again */
1692 wpa_set_wep_keys(wpa_s, ssid);
1695 if (wpa_s->current_ssid && wpa_s->current_ssid != ssid) {
1697 * Do not allow EAP session resumption between different
1698 * network configurations.
1700 eapol_sm_invalidate_cached_session(wpa_s->eapol);
1702 old_ssid = wpa_s->current_ssid;
1703 wpa_s->current_ssid = ssid;
1704 wpa_s->current_bss = bss;
1705 wpa_supplicant_rsn_supp_set_config(wpa_s, wpa_s->current_ssid);
1706 wpa_supplicant_initiate_eapol(wpa_s);
1707 if (old_ssid != wpa_s->current_ssid)
1708 wpas_notify_network_changed(wpa_s);
1712 static void wpa_supplicant_clear_connection(struct wpa_supplicant *wpa_s,
1715 struct wpa_ssid *old_ssid;
1717 wpa_clear_keys(wpa_s, addr);
1718 old_ssid = wpa_s->current_ssid;
1719 wpa_supplicant_mark_disassoc(wpa_s);
1720 wpa_sm_set_config(wpa_s->wpa, NULL);
1721 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
1722 if (old_ssid != wpa_s->current_ssid)
1723 wpas_notify_network_changed(wpa_s);
1724 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
1729 * wpa_supplicant_deauthenticate - Deauthenticate the current connection
1730 * @wpa_s: Pointer to wpa_supplicant data
1731 * @reason_code: IEEE 802.11 reason code for the deauthenticate frame
1733 * This function is used to request %wpa_supplicant to deauthenticate from the
1736 void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
1740 union wpa_event_data event;
1743 wpa_dbg(wpa_s, MSG_DEBUG, "Request to deauthenticate - bssid=" MACSTR
1744 " pending_bssid=" MACSTR " reason=%d state=%s",
1745 MAC2STR(wpa_s->bssid), MAC2STR(wpa_s->pending_bssid),
1746 reason_code, wpa_supplicant_state_txt(wpa_s->wpa_state));
1748 if (!is_zero_ether_addr(wpa_s->bssid))
1749 addr = wpa_s->bssid;
1750 else if (!is_zero_ether_addr(wpa_s->pending_bssid) &&
1751 (wpa_s->wpa_state == WPA_AUTHENTICATING ||
1752 wpa_s->wpa_state == WPA_ASSOCIATING))
1753 addr = wpa_s->pending_bssid;
1754 else if (wpa_s->wpa_state == WPA_ASSOCIATING) {
1756 * When using driver-based BSS selection, we may not know the
1757 * BSSID with which we are currently trying to associate. We
1758 * need to notify the driver of this disconnection even in such
1759 * a case, so use the all zeros address here.
1761 addr = wpa_s->bssid;
1766 wpa_tdls_teardown_peers(wpa_s->wpa);
1767 #endif /* CONFIG_TDLS */
1770 wpa_drv_deauthenticate(wpa_s, addr, reason_code);
1771 os_memset(&event, 0, sizeof(event));
1772 event.deauth_info.reason_code = (u16) reason_code;
1773 event.deauth_info.locally_generated = 1;
1774 wpa_supplicant_event(wpa_s, EVENT_DEAUTH, &event);
1779 wpa_supplicant_clear_connection(wpa_s, addr);
1782 static void wpa_supplicant_enable_one_network(struct wpa_supplicant *wpa_s,
1783 struct wpa_ssid *ssid)
1785 if (!ssid || !ssid->disabled || ssid->disabled == 2)
1789 wpas_clear_temp_disabled(wpa_s, ssid, 1);
1790 wpas_notify_network_enabled_changed(wpa_s, ssid);
1793 * Try to reassociate since there is no current configuration and a new
1794 * network was made available.
1796 if (!wpa_s->current_ssid)
1797 wpa_s->reassociate = 1;
1802 * wpa_supplicant_enable_network - Mark a configured network as enabled
1803 * @wpa_s: wpa_supplicant structure for a network interface
1804 * @ssid: wpa_ssid structure for a configured network or %NULL
1806 * Enables the specified network or all networks if no network specified.
1808 void wpa_supplicant_enable_network(struct wpa_supplicant *wpa_s,
1809 struct wpa_ssid *ssid)
1812 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
1813 wpa_supplicant_enable_one_network(wpa_s, ssid);
1815 wpa_supplicant_enable_one_network(wpa_s, ssid);
1817 if (wpa_s->reassociate) {
1818 if (wpa_s->sched_scanning) {
1819 wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan to add "
1820 "new network to scan filters");
1821 wpa_supplicant_cancel_sched_scan(wpa_s);
1824 wpa_supplicant_req_scan(wpa_s, 0, 0);
1830 * wpa_supplicant_disable_network - Mark a configured network as disabled
1831 * @wpa_s: wpa_supplicant structure for a network interface
1832 * @ssid: wpa_ssid structure for a configured network or %NULL
1834 * Disables the specified network or all networks if no network specified.
1836 void wpa_supplicant_disable_network(struct wpa_supplicant *wpa_s,
1837 struct wpa_ssid *ssid)
1839 struct wpa_ssid *other_ssid;
1843 if (wpa_s->sched_scanning)
1844 wpa_supplicant_cancel_sched_scan(wpa_s);
1846 for (other_ssid = wpa_s->conf->ssid; other_ssid;
1847 other_ssid = other_ssid->next) {
1848 was_disabled = other_ssid->disabled;
1849 if (was_disabled == 2)
1850 continue; /* do not change persistent P2P group
1853 other_ssid->disabled = 1;
1855 if (was_disabled != other_ssid->disabled)
1856 wpas_notify_network_enabled_changed(
1859 if (wpa_s->current_ssid)
1860 wpa_supplicant_deauthenticate(
1861 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
1862 } else if (ssid->disabled != 2) {
1863 if (ssid == wpa_s->current_ssid)
1864 wpa_supplicant_deauthenticate(
1865 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
1867 was_disabled = ssid->disabled;
1871 if (was_disabled != ssid->disabled) {
1872 wpas_notify_network_enabled_changed(wpa_s, ssid);
1873 if (wpa_s->sched_scanning) {
1874 wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan "
1875 "to remove network from filters");
1876 wpa_supplicant_cancel_sched_scan(wpa_s);
1877 wpa_supplicant_req_scan(wpa_s, 0, 0);
1885 * wpa_supplicant_select_network - Attempt association with a network
1886 * @wpa_s: wpa_supplicant structure for a network interface
1887 * @ssid: wpa_ssid structure for a configured network or %NULL for any network
1889 void wpa_supplicant_select_network(struct wpa_supplicant *wpa_s,
1890 struct wpa_ssid *ssid)
1893 struct wpa_ssid *other_ssid;
1894 int disconnected = 0;
1896 if (ssid && ssid != wpa_s->current_ssid && wpa_s->current_ssid) {
1897 wpa_supplicant_deauthenticate(
1898 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
1903 wpas_clear_temp_disabled(wpa_s, ssid, 1);
1906 * Mark all other networks disabled or mark all networks enabled if no
1907 * network specified.
1909 for (other_ssid = wpa_s->conf->ssid; other_ssid;
1910 other_ssid = other_ssid->next) {
1911 int was_disabled = other_ssid->disabled;
1912 if (was_disabled == 2)
1913 continue; /* do not change persistent P2P group data */
1915 other_ssid->disabled = ssid ? (ssid->id != other_ssid->id) : 0;
1916 if (was_disabled && !other_ssid->disabled)
1917 wpas_clear_temp_disabled(wpa_s, other_ssid, 0);
1919 if (was_disabled != other_ssid->disabled)
1920 wpas_notify_network_enabled_changed(wpa_s, other_ssid);
1923 if (ssid && ssid == wpa_s->current_ssid && wpa_s->current_ssid) {
1924 /* We are already associated with the selected network */
1925 wpa_printf(MSG_DEBUG, "Already associated with the "
1926 "selected network - do nothing");
1931 wpa_s->current_ssid = ssid;
1932 wpa_s->connect_without_scan = NULL;
1933 wpa_s->disconnected = 0;
1934 wpa_s->reassociate = 1;
1936 if (wpa_supplicant_fast_associate(wpa_s) != 1)
1937 wpa_supplicant_req_scan(wpa_s, 0, disconnected ? 100000 : 0);
1940 wpas_notify_network_selected(wpa_s, ssid);
1945 * wpa_supplicant_set_ap_scan - Set AP scan mode for interface
1946 * @wpa_s: wpa_supplicant structure for a network interface
1947 * @ap_scan: AP scan mode
1948 * Returns: 0 if succeed or -1 if ap_scan has an invalid value
1951 int wpa_supplicant_set_ap_scan(struct wpa_supplicant *wpa_s, int ap_scan)
1956 if (ap_scan < 0 || ap_scan > 2)
1960 if (ap_scan == 2 && ap_scan != wpa_s->conf->ap_scan &&
1961 wpa_s->wpa_state >= WPA_ASSOCIATING &&
1962 wpa_s->wpa_state < WPA_COMPLETED) {
1963 wpa_printf(MSG_ERROR, "ap_scan = %d (%d) rejected while "
1964 "associating", wpa_s->conf->ap_scan, ap_scan);
1967 #endif /* ANDROID */
1969 old_ap_scan = wpa_s->conf->ap_scan;
1970 wpa_s->conf->ap_scan = ap_scan;
1972 if (old_ap_scan != wpa_s->conf->ap_scan)
1973 wpas_notify_ap_scan_changed(wpa_s);
1980 * wpa_supplicant_set_bss_expiration_age - Set BSS entry expiration age
1981 * @wpa_s: wpa_supplicant structure for a network interface
1982 * @expire_age: Expiration age in seconds
1983 * Returns: 0 if succeed or -1 if expire_age has an invalid value
1986 int wpa_supplicant_set_bss_expiration_age(struct wpa_supplicant *wpa_s,
1987 unsigned int bss_expire_age)
1989 if (bss_expire_age < 10) {
1990 wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration age %u",
1994 wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration age: %d sec",
1996 wpa_s->conf->bss_expiration_age = bss_expire_age;
2003 * wpa_supplicant_set_bss_expiration_count - Set BSS entry expiration scan count
2004 * @wpa_s: wpa_supplicant structure for a network interface
2005 * @expire_count: number of scans after which an unseen BSS is reclaimed
2006 * Returns: 0 if succeed or -1 if expire_count has an invalid value
2009 int wpa_supplicant_set_bss_expiration_count(struct wpa_supplicant *wpa_s,
2010 unsigned int bss_expire_count)
2012 if (bss_expire_count < 1) {
2013 wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration count %u",
2017 wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration scan count: %u",
2019 wpa_s->conf->bss_expiration_scan_count = bss_expire_count;
2026 * wpa_supplicant_set_scan_interval - Set scan interval
2027 * @wpa_s: wpa_supplicant structure for a network interface
2028 * @scan_interval: scan interval in seconds
2029 * Returns: 0 if succeed or -1 if scan_interval has an invalid value
2032 int wpa_supplicant_set_scan_interval(struct wpa_supplicant *wpa_s,
2035 if (scan_interval < 0) {
2036 wpa_msg(wpa_s, MSG_ERROR, "Invalid scan interval %d",
2040 wpa_msg(wpa_s, MSG_DEBUG, "Setting scan interval: %d sec",
2042 wpa_supplicant_update_scan_int(wpa_s, scan_interval);
2049 * wpa_supplicant_set_debug_params - Set global debug params
2050 * @global: wpa_global structure
2051 * @debug_level: debug level
2052 * @debug_timestamp: determines if show timestamp in debug data
2053 * @debug_show_keys: determines if show keys in debug data
2054 * Returns: 0 if succeed or -1 if debug_level has wrong value
2056 int wpa_supplicant_set_debug_params(struct wpa_global *global, int debug_level,
2057 int debug_timestamp, int debug_show_keys)
2060 int old_level, old_timestamp, old_show_keys;
2062 /* check for allowed debuglevels */
2063 if (debug_level != MSG_EXCESSIVE &&
2064 debug_level != MSG_MSGDUMP &&
2065 debug_level != MSG_DEBUG &&
2066 debug_level != MSG_INFO &&
2067 debug_level != MSG_WARNING &&
2068 debug_level != MSG_ERROR)
2071 old_level = wpa_debug_level;
2072 old_timestamp = wpa_debug_timestamp;
2073 old_show_keys = wpa_debug_show_keys;
2075 wpa_debug_level = debug_level;
2076 wpa_debug_timestamp = debug_timestamp ? 1 : 0;
2077 wpa_debug_show_keys = debug_show_keys ? 1 : 0;
2079 if (wpa_debug_level != old_level)
2080 wpas_notify_debug_level_changed(global);
2081 if (wpa_debug_timestamp != old_timestamp)
2082 wpas_notify_debug_timestamp_changed(global);
2083 if (wpa_debug_show_keys != old_show_keys)
2084 wpas_notify_debug_show_keys_changed(global);
2091 * wpa_supplicant_get_ssid - Get a pointer to the current network structure
2092 * @wpa_s: Pointer to wpa_supplicant data
2093 * Returns: A pointer to the current network structure or %NULL on failure
2095 struct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s)
2097 struct wpa_ssid *entry;
2098 u8 ssid[MAX_SSID_LEN];
2104 res = wpa_drv_get_ssid(wpa_s, ssid);
2106 wpa_msg(wpa_s, MSG_WARNING, "Could not read SSID from "
2112 if (wpa_drv_get_bssid(wpa_s, bssid) < 0) {
2113 wpa_msg(wpa_s, MSG_WARNING, "Could not read BSSID from "
2118 wired = wpa_s->conf->ap_scan == 0 &&
2119 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED);
2121 entry = wpa_s->conf->ssid;
2123 if (!wpas_network_disabled(wpa_s, entry) &&
2124 ((ssid_len == entry->ssid_len &&
2125 os_memcmp(ssid, entry->ssid, ssid_len) == 0) || wired) &&
2126 (!entry->bssid_set ||
2127 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
2130 if (!wpas_network_disabled(wpa_s, entry) &&
2131 (entry->key_mgmt & WPA_KEY_MGMT_WPS) &&
2132 (entry->ssid == NULL || entry->ssid_len == 0) &&
2133 (!entry->bssid_set ||
2134 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
2136 #endif /* CONFIG_WPS */
2138 if (!wpas_network_disabled(wpa_s, entry) && entry->bssid_set &&
2139 entry->ssid_len == 0 &&
2140 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0)
2143 entry = entry->next;
2150 static int select_driver(struct wpa_supplicant *wpa_s, int i)
2152 struct wpa_global *global = wpa_s->global;
2154 if (wpa_drivers[i]->global_init && global->drv_priv[i] == NULL) {
2155 global->drv_priv[i] = wpa_drivers[i]->global_init();
2156 if (global->drv_priv[i] == NULL) {
2157 wpa_printf(MSG_ERROR, "Failed to initialize driver "
2158 "'%s'", wpa_drivers[i]->name);
2163 wpa_s->driver = wpa_drivers[i];
2164 wpa_s->global_drv_priv = global->drv_priv[i];
2170 static int wpa_supplicant_set_driver(struct wpa_supplicant *wpa_s,
2175 const char *pos, *driver = name;
2180 if (wpa_drivers[0] == NULL) {
2181 wpa_msg(wpa_s, MSG_ERROR, "No driver interfaces build into "
2187 /* default to first driver in the list */
2188 return select_driver(wpa_s, 0);
2192 pos = os_strchr(driver, ',');
2196 len = os_strlen(driver);
2198 for (i = 0; wpa_drivers[i]; i++) {
2199 if (os_strlen(wpa_drivers[i]->name) == len &&
2200 os_strncmp(driver, wpa_drivers[i]->name, len) ==
2202 /* First driver that succeeds wins */
2203 if (select_driver(wpa_s, i) == 0)
2211 wpa_msg(wpa_s, MSG_ERROR, "Unsupported driver '%s'", name);
2217 * wpa_supplicant_rx_eapol - Deliver a received EAPOL frame to wpa_supplicant
2218 * @ctx: Context pointer (wpa_s); this is the ctx variable registered
2219 * with struct wpa_driver_ops::init()
2220 * @src_addr: Source address of the EAPOL frame
2221 * @buf: EAPOL data starting from the EAPOL header (i.e., no Ethernet header)
2222 * @len: Length of the EAPOL data
2224 * This function is called for each received EAPOL frame. Most driver
2225 * interfaces rely on more generic OS mechanism for receiving frames through
2226 * l2_packet, but if such a mechanism is not available, the driver wrapper may
2227 * take care of received EAPOL frames and deliver them to the core supplicant
2228 * code by calling this function.
2230 void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr,
2231 const u8 *buf, size_t len)
2233 struct wpa_supplicant *wpa_s = ctx;
2235 wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR, MAC2STR(src_addr));
2236 wpa_hexdump(MSG_MSGDUMP, "RX EAPOL", buf, len);
2238 if (wpa_s->wpa_state < WPA_ASSOCIATED ||
2239 (wpa_s->last_eapol_matches_bssid &&
2242 #endif /* CONFIG_AP */
2243 os_memcmp(src_addr, wpa_s->bssid, ETH_ALEN) != 0)) {
2245 * There is possible race condition between receiving the
2246 * association event and the EAPOL frame since they are coming
2247 * through different paths from the driver. In order to avoid
2248 * issues in trying to process the EAPOL frame before receiving
2249 * association information, lets queue it for processing until
2250 * the association event is received. This may also be needed in
2251 * driver-based roaming case, so also use src_addr != BSSID as a
2252 * trigger if we have previously confirmed that the
2253 * Authenticator uses BSSID as the src_addr (which is not the
2254 * case with wired IEEE 802.1X).
2256 wpa_dbg(wpa_s, MSG_DEBUG, "Not associated - Delay processing "
2257 "of received EAPOL frame (state=%s bssid=" MACSTR ")",
2258 wpa_supplicant_state_txt(wpa_s->wpa_state),
2259 MAC2STR(wpa_s->bssid));
2260 wpabuf_free(wpa_s->pending_eapol_rx);
2261 wpa_s->pending_eapol_rx = wpabuf_alloc_copy(buf, len);
2262 if (wpa_s->pending_eapol_rx) {
2263 os_get_time(&wpa_s->pending_eapol_rx_time);
2264 os_memcpy(wpa_s->pending_eapol_rx_src, src_addr,
2270 wpa_s->last_eapol_matches_bssid =
2271 os_memcmp(src_addr, wpa_s->bssid, ETH_ALEN) == 0;
2274 if (wpa_s->ap_iface) {
2275 wpa_supplicant_ap_rx_eapol(wpa_s, src_addr, buf, len);
2278 #endif /* CONFIG_AP */
2280 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE) {
2281 wpa_dbg(wpa_s, MSG_DEBUG, "Ignored received EAPOL frame since "
2282 "no key management is configured");
2286 if (wpa_s->eapol_received == 0 &&
2287 (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) ||
2288 !wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) ||
2289 wpa_s->wpa_state != WPA_COMPLETED) &&
2290 (wpa_s->current_ssid == NULL ||
2291 wpa_s->current_ssid->mode != IEEE80211_MODE_IBSS)) {
2292 /* Timeout for completing IEEE 802.1X and WPA authentication */
2293 wpa_supplicant_req_auth_timeout(
2295 (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) ||
2296 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA ||
2297 wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) ?
2300 wpa_s->eapol_received++;
2302 if (wpa_s->countermeasures) {
2303 wpa_msg(wpa_s, MSG_INFO, "WPA: Countermeasures - dropped "
2308 #ifdef CONFIG_IBSS_RSN
2309 if (wpa_s->current_ssid &&
2310 wpa_s->current_ssid->mode == WPAS_MODE_IBSS) {
2311 ibss_rsn_rx_eapol(wpa_s->ibss_rsn, src_addr, buf, len);
2314 #endif /* CONFIG_IBSS_RSN */
2316 /* Source address of the incoming EAPOL frame could be compared to the
2317 * current BSSID. However, it is possible that a centralized
2318 * Authenticator could be using another MAC address than the BSSID of
2319 * an AP, so just allow any address to be used for now. The replies are
2320 * still sent to the current BSSID (if available), though. */
2322 os_memcpy(wpa_s->last_eapol_src, src_addr, ETH_ALEN);
2323 if (!wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) &&
2324 eapol_sm_rx_eapol(wpa_s->eapol, src_addr, buf, len) > 0)
2326 wpa_drv_poll(wpa_s);
2327 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE))
2328 wpa_sm_rx_eapol(wpa_s->wpa, src_addr, buf, len);
2329 else if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt)) {
2331 * Set portValid = TRUE here since we are going to skip 4-way
2332 * handshake processing which would normally set portValid. We
2333 * need this to allow the EAPOL state machines to be completed
2334 * without going through EAPOL-Key handshake.
2336 eapol_sm_notify_portValid(wpa_s->eapol, TRUE);
2341 int wpa_supplicant_update_mac_addr(struct wpa_supplicant *wpa_s)
2343 if (wpa_s->driver->send_eapol) {
2344 const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
2346 os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
2347 } else if (!(wpa_s->drv_flags &
2348 WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE)) {
2349 l2_packet_deinit(wpa_s->l2);
2350 wpa_s->l2 = l2_packet_init(wpa_s->ifname,
2351 wpa_drv_get_mac_addr(wpa_s),
2353 wpa_supplicant_rx_eapol, wpa_s, 0);
2354 if (wpa_s->l2 == NULL)
2357 const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
2359 os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
2362 if (wpa_s->l2 && l2_packet_get_own_addr(wpa_s->l2, wpa_s->own_addr)) {
2363 wpa_msg(wpa_s, MSG_ERROR, "Failed to get own L2 address");
2367 wpa_dbg(wpa_s, MSG_DEBUG, "Own MAC address: " MACSTR,
2368 MAC2STR(wpa_s->own_addr));
2369 wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
2375 static void wpa_supplicant_rx_eapol_bridge(void *ctx, const u8 *src_addr,
2376 const u8 *buf, size_t len)
2378 struct wpa_supplicant *wpa_s = ctx;
2379 const struct l2_ethhdr *eth;
2381 if (len < sizeof(*eth))
2383 eth = (const struct l2_ethhdr *) buf;
2385 if (os_memcmp(eth->h_dest, wpa_s->own_addr, ETH_ALEN) != 0 &&
2386 !(eth->h_dest[0] & 0x01)) {
2387 wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR " to " MACSTR
2388 " (bridge - not for this interface - ignore)",
2389 MAC2STR(src_addr), MAC2STR(eth->h_dest));
2393 wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR " to " MACSTR
2394 " (bridge)", MAC2STR(src_addr), MAC2STR(eth->h_dest));
2395 wpa_supplicant_rx_eapol(wpa_s, src_addr, buf + sizeof(*eth),
2396 len - sizeof(*eth));
2401 * wpa_supplicant_driver_init - Initialize driver interface parameters
2402 * @wpa_s: Pointer to wpa_supplicant data
2403 * Returns: 0 on success, -1 on failure
2405 * This function is called to initialize driver interface parameters.
2406 * wpa_drv_init() must have been called before this function to initialize the
2409 int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s)
2411 static int interface_count = 0;
2413 if (wpa_supplicant_update_mac_addr(wpa_s) < 0)
2416 if (wpa_s->bridge_ifname[0]) {
2417 wpa_dbg(wpa_s, MSG_DEBUG, "Receiving packets from bridge "
2418 "interface '%s'", wpa_s->bridge_ifname);
2419 wpa_s->l2_br = l2_packet_init(wpa_s->bridge_ifname,
2422 wpa_supplicant_rx_eapol_bridge,
2424 if (wpa_s->l2_br == NULL) {
2425 wpa_msg(wpa_s, MSG_ERROR, "Failed to open l2_packet "
2426 "connection for the bridge interface '%s'",
2427 wpa_s->bridge_ifname);
2432 wpa_clear_keys(wpa_s, NULL);
2434 /* Make sure that TKIP countermeasures are not left enabled (could
2435 * happen if wpa_supplicant is killed during countermeasures. */
2436 wpa_drv_set_countermeasures(wpa_s, 0);
2438 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: flushing PMKID list in the driver");
2439 wpa_drv_flush_pmkid(wpa_s);
2441 wpa_s->prev_scan_ssid = WILDCARD_SSID_SCAN;
2442 wpa_s->prev_scan_wildcard = 0;
2444 if (wpa_supplicant_enabled_networks(wpa_s)) {
2445 if (wpa_supplicant_delayed_sched_scan(wpa_s, interface_count,
2447 wpa_supplicant_req_scan(wpa_s, interface_count,
2451 wpa_supplicant_set_state(wpa_s, WPA_INACTIVE);
2457 static int wpa_supplicant_daemon(const char *pid_file)
2459 wpa_printf(MSG_DEBUG, "Daemonize..");
2460 return os_daemonize(pid_file);
2464 static struct wpa_supplicant * wpa_supplicant_alloc(void)
2466 struct wpa_supplicant *wpa_s;
2468 wpa_s = os_zalloc(sizeof(*wpa_s));
2471 wpa_s->scan_req = INITIAL_SCAN_REQ;
2472 wpa_s->scan_interval = 5;
2473 wpa_s->new_connection = 1;
2474 wpa_s->parent = wpa_s;
2475 wpa_s->sched_scanning = 0;
2481 #ifdef CONFIG_HT_OVERRIDES
2483 static int wpa_set_htcap_mcs(struct wpa_supplicant *wpa_s,
2484 struct ieee80211_ht_capabilities *htcaps,
2485 struct ieee80211_ht_capabilities *htcaps_mask,
2488 /* parse ht_mcs into hex array */
2490 const char *tmp = ht_mcs;
2493 /* If ht_mcs is null, do not set anything */
2497 /* This is what we are setting in the kernel */
2498 os_memset(&htcaps->supported_mcs_set, 0, IEEE80211_HT_MCS_MASK_LEN);
2500 wpa_msg(wpa_s, MSG_DEBUG, "set_htcap, ht_mcs -:%s:-", ht_mcs);
2502 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
2504 long v = strtol(tmp, &end, 16);
2506 wpa_msg(wpa_s, MSG_DEBUG,
2507 "htcap value[%i]: %ld end: %p tmp: %p",
2512 htcaps->supported_mcs_set[i] = v;
2515 wpa_msg(wpa_s, MSG_ERROR,
2516 "Failed to parse ht-mcs: %s, error: %s\n",
2517 ht_mcs, strerror(errno));
2523 * If we were able to parse any values, then set mask for the MCS set.
2526 os_memset(&htcaps_mask->supported_mcs_set, 0xff,
2527 IEEE80211_HT_MCS_MASK_LEN - 1);
2528 /* skip the 3 reserved bits */
2529 htcaps_mask->supported_mcs_set[IEEE80211_HT_MCS_MASK_LEN - 1] =
2537 static int wpa_disable_max_amsdu(struct wpa_supplicant *wpa_s,
2538 struct ieee80211_ht_capabilities *htcaps,
2539 struct ieee80211_ht_capabilities *htcaps_mask,
2544 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_max_amsdu: %d", disabled);
2549 msk = host_to_le16(HT_CAP_INFO_MAX_AMSDU_SIZE);
2550 htcaps_mask->ht_capabilities_info |= msk;
2552 htcaps->ht_capabilities_info &= msk;
2554 htcaps->ht_capabilities_info |= msk;
2560 static int wpa_set_ampdu_factor(struct wpa_supplicant *wpa_s,
2561 struct ieee80211_ht_capabilities *htcaps,
2562 struct ieee80211_ht_capabilities *htcaps_mask,
2565 wpa_msg(wpa_s, MSG_DEBUG, "set_ampdu_factor: %d", factor);
2570 if (factor < 0 || factor > 3) {
2571 wpa_msg(wpa_s, MSG_ERROR, "ampdu_factor: %d out of range. "
2572 "Must be 0-3 or -1", factor);
2576 htcaps_mask->a_mpdu_params |= 0x3; /* 2 bits for factor */
2577 htcaps->a_mpdu_params &= ~0x3;
2578 htcaps->a_mpdu_params |= factor & 0x3;
2584 static int wpa_set_ampdu_density(struct wpa_supplicant *wpa_s,
2585 struct ieee80211_ht_capabilities *htcaps,
2586 struct ieee80211_ht_capabilities *htcaps_mask,
2589 wpa_msg(wpa_s, MSG_DEBUG, "set_ampdu_density: %d", density);
2594 if (density < 0 || density > 7) {
2595 wpa_msg(wpa_s, MSG_ERROR,
2596 "ampdu_density: %d out of range. Must be 0-7 or -1.",
2601 htcaps_mask->a_mpdu_params |= 0x1C;
2602 htcaps->a_mpdu_params &= ~(0x1C);
2603 htcaps->a_mpdu_params |= (density << 2) & 0x1C;
2609 static int wpa_set_disable_ht40(struct wpa_supplicant *wpa_s,
2610 struct ieee80211_ht_capabilities *htcaps,
2611 struct ieee80211_ht_capabilities *htcaps_mask,
2614 /* Masking these out disables HT40 */
2615 u16 msk = host_to_le16(HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET |
2616 HT_CAP_INFO_SHORT_GI40MHZ);
2618 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_ht40: %d", disabled);
2621 htcaps->ht_capabilities_info &= ~msk;
2623 htcaps->ht_capabilities_info |= msk;
2625 htcaps_mask->ht_capabilities_info |= msk;
2631 static int wpa_set_disable_sgi(struct wpa_supplicant *wpa_s,
2632 struct ieee80211_ht_capabilities *htcaps,
2633 struct ieee80211_ht_capabilities *htcaps_mask,
2636 /* Masking these out disables SGI */
2637 u16 msk = host_to_le16(HT_CAP_INFO_SHORT_GI20MHZ |
2638 HT_CAP_INFO_SHORT_GI40MHZ);
2640 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_sgi: %d", disabled);
2643 htcaps->ht_capabilities_info &= ~msk;
2645 htcaps->ht_capabilities_info |= msk;
2647 htcaps_mask->ht_capabilities_info |= msk;
2653 void wpa_supplicant_apply_ht_overrides(
2654 struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
2655 struct wpa_driver_associate_params *params)
2657 struct ieee80211_ht_capabilities *htcaps;
2658 struct ieee80211_ht_capabilities *htcaps_mask;
2663 params->disable_ht = ssid->disable_ht;
2664 if (!params->htcaps || !params->htcaps_mask)
2667 htcaps = (struct ieee80211_ht_capabilities *) params->htcaps;
2668 htcaps_mask = (struct ieee80211_ht_capabilities *) params->htcaps_mask;
2669 wpa_set_htcap_mcs(wpa_s, htcaps, htcaps_mask, ssid->ht_mcs);
2670 wpa_disable_max_amsdu(wpa_s, htcaps, htcaps_mask,
2671 ssid->disable_max_amsdu);
2672 wpa_set_ampdu_factor(wpa_s, htcaps, htcaps_mask, ssid->ampdu_factor);
2673 wpa_set_ampdu_density(wpa_s, htcaps, htcaps_mask, ssid->ampdu_density);
2674 wpa_set_disable_ht40(wpa_s, htcaps, htcaps_mask, ssid->disable_ht40);
2675 wpa_set_disable_sgi(wpa_s, htcaps, htcaps_mask, ssid->disable_sgi);
2678 #endif /* CONFIG_HT_OVERRIDES */
2681 #ifdef CONFIG_VHT_OVERRIDES
2682 void wpa_supplicant_apply_vht_overrides(
2683 struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
2684 struct wpa_driver_associate_params *params)
2686 struct ieee80211_vht_capabilities *vhtcaps;
2687 struct ieee80211_vht_capabilities *vhtcaps_mask;
2692 params->disable_vht = ssid->disable_vht;
2694 vhtcaps = (void *) params->vhtcaps;
2695 vhtcaps_mask = (void *) params->vhtcaps_mask;
2697 if (!vhtcaps || !vhtcaps_mask)
2700 vhtcaps->vht_capabilities_info = ssid->vht_capa;
2701 vhtcaps_mask->vht_capabilities_info = ssid->vht_capa_mask;
2703 #define OVERRIDE_MCS(i) \
2704 if (ssid->vht_tx_mcs_nss_ ##i >= 0) { \
2705 vhtcaps_mask->vht_supported_mcs_set.tx_map |= \
2707 vhtcaps->vht_supported_mcs_set.tx_map |= \
2708 ssid->vht_tx_mcs_nss_ ##i << 2 * (i - 1); \
2710 if (ssid->vht_rx_mcs_nss_ ##i >= 0) { \
2711 vhtcaps_mask->vht_supported_mcs_set.rx_map |= \
2713 vhtcaps->vht_supported_mcs_set.rx_map |= \
2714 ssid->vht_rx_mcs_nss_ ##i << 2 * (i - 1); \
2726 #endif /* CONFIG_VHT_OVERRIDES */
2729 static int pcsc_reader_init(struct wpa_supplicant *wpa_s)
2734 if (!wpa_s->conf->pcsc_reader)
2737 wpa_s->scard = scard_init(SCARD_TRY_BOTH, wpa_s->conf->pcsc_reader);
2741 if (wpa_s->conf->pcsc_pin &&
2742 scard_set_pin(wpa_s->scard, wpa_s->conf->pcsc_pin) < 0) {
2743 scard_deinit(wpa_s->scard);
2744 wpa_s->scard = NULL;
2745 wpa_msg(wpa_s, MSG_ERROR, "PC/SC PIN validation failed");
2749 len = sizeof(wpa_s->imsi) - 1;
2750 if (scard_get_imsi(wpa_s->scard, wpa_s->imsi, &len)) {
2751 scard_deinit(wpa_s->scard);
2752 wpa_s->scard = NULL;
2753 wpa_msg(wpa_s, MSG_ERROR, "Could not read IMSI");
2756 wpa_s->imsi[len] = '\0';
2758 wpa_s->mnc_len = scard_get_mnc_len(wpa_s->scard);
2760 wpa_printf(MSG_DEBUG, "SCARD: IMSI %s (MNC length %d)",
2761 wpa_s->imsi, wpa_s->mnc_len);
2763 wpa_sm_set_scard_ctx(wpa_s->wpa, wpa_s->scard);
2764 eapol_sm_register_scard_ctx(wpa_s->eapol, wpa_s->scard);
2765 #endif /* PCSC_FUNCS */
2771 int wpas_init_ext_pw(struct wpa_supplicant *wpa_s)
2775 ext_password_deinit(wpa_s->ext_pw);
2776 wpa_s->ext_pw = NULL;
2777 eapol_sm_set_ext_pw_ctx(wpa_s->eapol, NULL);
2779 if (!wpa_s->conf->ext_password_backend)
2782 val = os_strdup(wpa_s->conf->ext_password_backend);
2785 pos = os_strchr(val, ':');
2789 wpa_printf(MSG_DEBUG, "EXT PW: Initialize backend '%s'", val);
2791 wpa_s->ext_pw = ext_password_init(val, pos);
2793 if (wpa_s->ext_pw == NULL) {
2794 wpa_printf(MSG_DEBUG, "EXT PW: Failed to initialize backend");
2797 eapol_sm_set_ext_pw_ctx(wpa_s->eapol, wpa_s->ext_pw);
2803 static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
2804 struct wpa_interface *iface)
2806 const char *ifname, *driver;
2807 struct wpa_driver_capa capa;
2809 wpa_printf(MSG_DEBUG, "Initializing interface '%s' conf '%s' driver "
2810 "'%s' ctrl_interface '%s' bridge '%s'", iface->ifname,
2811 iface->confname ? iface->confname : "N/A",
2812 iface->driver ? iface->driver : "default",
2813 iface->ctrl_interface ? iface->ctrl_interface : "N/A",
2814 iface->bridge_ifname ? iface->bridge_ifname : "N/A");
2816 if (iface->confname) {
2817 #ifdef CONFIG_BACKEND_FILE
2818 wpa_s->confname = os_rel2abs_path(iface->confname);
2819 if (wpa_s->confname == NULL) {
2820 wpa_printf(MSG_ERROR, "Failed to get absolute path "
2821 "for configuration file '%s'.",
2825 wpa_printf(MSG_DEBUG, "Configuration file '%s' -> '%s'",
2826 iface->confname, wpa_s->confname);
2827 #else /* CONFIG_BACKEND_FILE */
2828 wpa_s->confname = os_strdup(iface->confname);
2829 #endif /* CONFIG_BACKEND_FILE */
2830 wpa_s->conf = wpa_config_read(wpa_s->confname, NULL);
2831 if (wpa_s->conf == NULL) {
2832 wpa_printf(MSG_ERROR, "Failed to read or parse "
2833 "configuration '%s'.", wpa_s->confname);
2836 wpa_s->confanother = os_rel2abs_path(iface->confanother);
2837 wpa_config_read(wpa_s->confanother, wpa_s->conf);
2840 * Override ctrl_interface and driver_param if set on command
2843 if (iface->ctrl_interface) {
2844 os_free(wpa_s->conf->ctrl_interface);
2845 wpa_s->conf->ctrl_interface =
2846 os_strdup(iface->ctrl_interface);
2849 if (iface->driver_param) {
2850 os_free(wpa_s->conf->driver_param);
2851 wpa_s->conf->driver_param =
2852 os_strdup(iface->driver_param);
2855 wpa_s->conf = wpa_config_alloc_empty(iface->ctrl_interface,
2856 iface->driver_param);
2858 if (wpa_s->conf == NULL) {
2859 wpa_printf(MSG_ERROR, "\nNo configuration found.");
2863 if (iface->ifname == NULL) {
2864 wpa_printf(MSG_ERROR, "\nInterface name is required.");
2867 if (os_strlen(iface->ifname) >= sizeof(wpa_s->ifname)) {
2868 wpa_printf(MSG_ERROR, "\nToo long interface name '%s'.",
2872 os_strlcpy(wpa_s->ifname, iface->ifname, sizeof(wpa_s->ifname));
2874 if (iface->bridge_ifname) {
2875 if (os_strlen(iface->bridge_ifname) >=
2876 sizeof(wpa_s->bridge_ifname)) {
2877 wpa_printf(MSG_ERROR, "\nToo long bridge interface "
2878 "name '%s'.", iface->bridge_ifname);
2881 os_strlcpy(wpa_s->bridge_ifname, iface->bridge_ifname,
2882 sizeof(wpa_s->bridge_ifname));
2885 /* RSNA Supplicant Key Management - INITIALIZE */
2886 eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
2887 eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
2889 /* Initialize driver interface and register driver event handler before
2890 * L2 receive handler so that association events are processed before
2891 * EAPOL-Key packets if both become available for the same select()
2893 driver = iface->driver;
2895 if (wpa_supplicant_set_driver(wpa_s, driver) < 0)
2898 wpa_s->drv_priv = wpa_drv_init(wpa_s, wpa_s->ifname);
2899 if (wpa_s->drv_priv == NULL) {
2901 pos = driver ? os_strchr(driver, ',') : NULL;
2903 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize "
2904 "driver interface - try next driver wrapper");
2908 wpa_msg(wpa_s, MSG_ERROR, "Failed to initialize driver "
2912 if (wpa_drv_set_param(wpa_s, wpa_s->conf->driver_param) < 0) {
2913 wpa_msg(wpa_s, MSG_ERROR, "Driver interface rejected "
2914 "driver_param '%s'", wpa_s->conf->driver_param);
2918 ifname = wpa_drv_get_ifname(wpa_s);
2919 if (ifname && os_strcmp(ifname, wpa_s->ifname) != 0) {
2920 wpa_dbg(wpa_s, MSG_DEBUG, "Driver interface replaced "
2921 "interface name with '%s'", ifname);
2922 os_strlcpy(wpa_s->ifname, ifname, sizeof(wpa_s->ifname));
2925 if (wpa_supplicant_init_wpa(wpa_s) < 0)
2928 wpa_sm_set_ifname(wpa_s->wpa, wpa_s->ifname,
2929 wpa_s->bridge_ifname[0] ? wpa_s->bridge_ifname :
2931 wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
2933 if (wpa_s->conf->dot11RSNAConfigPMKLifetime &&
2934 wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_LIFETIME,
2935 wpa_s->conf->dot11RSNAConfigPMKLifetime)) {
2936 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
2937 "dot11RSNAConfigPMKLifetime");
2941 if (wpa_s->conf->dot11RSNAConfigPMKReauthThreshold &&
2942 wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_REAUTH_THRESHOLD,
2943 wpa_s->conf->dot11RSNAConfigPMKReauthThreshold)) {
2944 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
2945 "dot11RSNAConfigPMKReauthThreshold");
2949 if (wpa_s->conf->dot11RSNAConfigSATimeout &&
2950 wpa_sm_set_param(wpa_s->wpa, RSNA_SA_TIMEOUT,
2951 wpa_s->conf->dot11RSNAConfigSATimeout)) {
2952 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
2953 "dot11RSNAConfigSATimeout");
2957 wpa_s->hw.modes = wpa_drv_get_hw_feature_data(wpa_s,
2958 &wpa_s->hw.num_modes,
2961 if (wpa_drv_get_capa(wpa_s, &capa) == 0) {
2962 wpa_s->drv_capa_known = 1;
2963 wpa_s->drv_flags = capa.flags;
2964 wpa_s->drv_enc = capa.enc;
2965 wpa_s->probe_resp_offloads = capa.probe_resp_offloads;
2966 wpa_s->max_scan_ssids = capa.max_scan_ssids;
2967 wpa_s->max_sched_scan_ssids = capa.max_sched_scan_ssids;
2968 wpa_s->sched_scan_supported = capa.sched_scan_supported;
2969 wpa_s->max_match_sets = capa.max_match_sets;
2970 wpa_s->max_remain_on_chan = capa.max_remain_on_chan;
2971 wpa_s->max_stations = capa.max_stations;
2972 wpa_s->extended_capa = capa.extended_capa;
2973 wpa_s->extended_capa_mask = capa.extended_capa_mask;
2974 wpa_s->extended_capa_len = capa.extended_capa_len;
2976 if (wpa_s->max_remain_on_chan == 0)
2977 wpa_s->max_remain_on_chan = 1000;
2979 if (wpa_supplicant_driver_init(wpa_s) < 0)
2983 if (wpa_tdls_init(wpa_s->wpa))
2985 #endif /* CONFIG_TDLS */
2987 if (wpa_s->conf->country[0] && wpa_s->conf->country[1] &&
2988 wpa_drv_set_country(wpa_s, wpa_s->conf->country)) {
2989 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to set country");
2993 if (wpas_wps_init(wpa_s))
2996 if (wpa_supplicant_init_eapol(wpa_s) < 0)
2998 wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
3000 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
3001 if (wpa_s->ctrl_iface == NULL) {
3002 wpa_printf(MSG_ERROR,
3003 "Failed to initialize control interface '%s'.\n"
3004 "You may have another wpa_supplicant process "
3005 "already running or the file was\n"
3006 "left by an unclean termination of wpa_supplicant "
3007 "in which case you will need\n"
3008 "to manually remove this file before starting "
3009 "wpa_supplicant again.\n",
3010 wpa_s->conf->ctrl_interface);
3014 wpa_s->gas = gas_query_init(wpa_s);
3015 if (wpa_s->gas == NULL) {
3016 wpa_printf(MSG_ERROR, "Failed to initialize GAS query");
3021 if (wpas_p2p_init(wpa_s->global, wpa_s) < 0) {
3022 wpa_msg(wpa_s, MSG_ERROR, "Failed to init P2P");
3025 #endif /* CONFIG_P2P */
3027 if (wpa_bss_init(wpa_s) < 0)
3030 if (pcsc_reader_init(wpa_s) < 0)
3033 if (wpas_init_ext_pw(wpa_s) < 0)
3040 static void wpa_supplicant_deinit_iface(struct wpa_supplicant *wpa_s,
3041 int notify, int terminate)
3043 if (wpa_s->drv_priv) {
3044 wpa_supplicant_deauthenticate(wpa_s,
3045 WLAN_REASON_DEAUTH_LEAVING);
3047 wpa_drv_set_countermeasures(wpa_s, 0);
3048 wpa_clear_keys(wpa_s, NULL);
3051 wpa_supplicant_cleanup(wpa_s);
3054 if (wpa_s == wpa_s->global->p2p_init_wpa_s && wpa_s->global->p2p) {
3055 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Disable P2P since removing "
3056 "the management interface is being removed");
3057 wpas_p2p_deinit_global(wpa_s->global);
3059 #endif /* CONFIG_P2P */
3061 if (wpa_s->drv_priv)
3062 wpa_drv_deinit(wpa_s);
3065 wpas_notify_iface_removed(wpa_s);
3068 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TERMINATING);
3070 if (wpa_s->ctrl_iface) {
3071 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
3072 wpa_s->ctrl_iface = NULL;
3075 if (wpa_s->conf != NULL) {
3076 wpa_config_free(wpa_s->conf);
3085 * wpa_supplicant_add_iface - Add a new network interface
3086 * @global: Pointer to global data from wpa_supplicant_init()
3087 * @iface: Interface configuration options
3088 * Returns: Pointer to the created interface or %NULL on failure
3090 * This function is used to add new network interfaces for %wpa_supplicant.
3091 * This can be called before wpa_supplicant_run() to add interfaces before the
3092 * main event loop has been started. In addition, new interfaces can be added
3093 * dynamically while %wpa_supplicant is already running. This could happen,
3094 * e.g., when a hotplug network adapter is inserted.
3096 struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
3097 struct wpa_interface *iface)
3099 struct wpa_supplicant *wpa_s;
3100 struct wpa_interface t_iface;
3101 struct wpa_ssid *ssid;
3103 if (global == NULL || iface == NULL)
3106 wpa_s = wpa_supplicant_alloc();
3110 wpa_s->global = global;
3113 if (global->params.override_driver) {
3114 wpa_printf(MSG_DEBUG, "Override interface parameter: driver "
3116 iface->driver, global->params.override_driver);
3117 t_iface.driver = global->params.override_driver;
3119 if (global->params.override_ctrl_interface) {
3120 wpa_printf(MSG_DEBUG, "Override interface parameter: "
3121 "ctrl_interface ('%s' -> '%s')",
3122 iface->ctrl_interface,
3123 global->params.override_ctrl_interface);
3124 t_iface.ctrl_interface =
3125 global->params.override_ctrl_interface;
3127 if (wpa_supplicant_init_iface(wpa_s, &t_iface)) {
3128 wpa_printf(MSG_DEBUG, "Failed to add interface %s",
3130 wpa_supplicant_deinit_iface(wpa_s, 0, 0);
3134 /* Notify the control interfaces about new iface */
3135 if (wpas_notify_iface_added(wpa_s)) {
3136 wpa_supplicant_deinit_iface(wpa_s, 1, 0);
3140 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
3141 wpas_notify_network_added(wpa_s, ssid);
3143 wpa_s->next = global->ifaces;
3144 global->ifaces = wpa_s;
3146 wpa_dbg(wpa_s, MSG_DEBUG, "Added interface %s", wpa_s->ifname);
3147 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
3154 * wpa_supplicant_remove_iface - Remove a network interface
3155 * @global: Pointer to global data from wpa_supplicant_init()
3156 * @wpa_s: Pointer to the network interface to be removed
3157 * Returns: 0 if interface was removed, -1 if interface was not found
3159 * This function can be used to dynamically remove network interfaces from
3160 * %wpa_supplicant, e.g., when a hotplug network adapter is ejected. In
3161 * addition, this function is used to remove all remaining interfaces when
3162 * %wpa_supplicant is terminated.
3164 int wpa_supplicant_remove_iface(struct wpa_global *global,
3165 struct wpa_supplicant *wpa_s,
3168 struct wpa_supplicant *prev;
3170 /* Remove interface from the global list of interfaces */
3171 prev = global->ifaces;
3172 if (prev == wpa_s) {
3173 global->ifaces = wpa_s->next;
3175 while (prev && prev->next != wpa_s)
3179 prev->next = wpa_s->next;
3182 wpa_dbg(wpa_s, MSG_DEBUG, "Removing interface %s", wpa_s->ifname);
3184 if (global->p2p_group_formation == wpa_s)
3185 global->p2p_group_formation = NULL;
3186 if (global->p2p_invite_group == wpa_s)
3187 global->p2p_invite_group = NULL;
3188 wpa_supplicant_deinit_iface(wpa_s, 1, terminate);
3195 * wpa_supplicant_get_eap_mode - Get the current EAP mode
3196 * @wpa_s: Pointer to the network interface
3197 * Returns: Pointer to the eap mode or the string "UNKNOWN" if not found
3199 const char * wpa_supplicant_get_eap_mode(struct wpa_supplicant *wpa_s)
3201 const char *eapol_method;
3203 if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) == 0 &&
3204 wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
3208 eapol_method = eapol_sm_get_method_name(wpa_s->eapol);
3209 if (eapol_method == NULL)
3210 return "UNKNOWN-EAP";
3212 return eapol_method;
3217 * wpa_supplicant_get_iface - Get a new network interface
3218 * @global: Pointer to global data from wpa_supplicant_init()
3219 * @ifname: Interface name
3220 * Returns: Pointer to the interface or %NULL if not found
3222 struct wpa_supplicant * wpa_supplicant_get_iface(struct wpa_global *global,
3225 struct wpa_supplicant *wpa_s;
3227 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
3228 if (os_strcmp(wpa_s->ifname, ifname) == 0)
3235 #ifndef CONFIG_NO_WPA_MSG
3236 static const char * wpa_supplicant_msg_ifname_cb(void *ctx)
3238 struct wpa_supplicant *wpa_s = ctx;
3241 return wpa_s->ifname;
3243 #endif /* CONFIG_NO_WPA_MSG */
3247 * wpa_supplicant_init - Initialize %wpa_supplicant
3248 * @params: Parameters for %wpa_supplicant
3249 * Returns: Pointer to global %wpa_supplicant data, or %NULL on failure
3251 * This function is used to initialize %wpa_supplicant. After successful
3252 * initialization, the returned data pointer can be used to add and remove
3253 * network interfaces, and eventually, to deinitialize %wpa_supplicant.
3255 struct wpa_global * wpa_supplicant_init(struct wpa_params *params)
3257 struct wpa_global *global;
3263 #ifdef CONFIG_DRIVER_NDIS
3265 void driver_ndis_init_ops(void);
3266 driver_ndis_init_ops();
3268 #endif /* CONFIG_DRIVER_NDIS */
3270 #ifndef CONFIG_NO_WPA_MSG
3271 wpa_msg_register_ifname_cb(wpa_supplicant_msg_ifname_cb);
3272 #endif /* CONFIG_NO_WPA_MSG */
3274 wpa_debug_open_file(params->wpa_debug_file_path);
3275 if (params->wpa_debug_syslog)
3276 wpa_debug_open_syslog();
3277 if (params->wpa_debug_tracing) {
3278 ret = wpa_debug_open_linux_tracing();
3280 wpa_printf(MSG_ERROR,
3281 "Failed to enable trace logging");
3286 ret = eap_register_methods();
3288 wpa_printf(MSG_ERROR, "Failed to register EAP methods");
3290 wpa_printf(MSG_ERROR, "Two or more EAP methods used "
3291 "the same EAP type.");
3295 global = os_zalloc(sizeof(*global));
3298 dl_list_init(&global->p2p_srv_bonjour);
3299 dl_list_init(&global->p2p_srv_upnp);
3300 global->params.daemonize = params->daemonize;
3301 global->params.wait_for_monitor = params->wait_for_monitor;
3302 global->params.dbus_ctrl_interface = params->dbus_ctrl_interface;
3303 if (params->pid_file)
3304 global->params.pid_file = os_strdup(params->pid_file);
3305 if (params->ctrl_interface)
3306 global->params.ctrl_interface =
3307 os_strdup(params->ctrl_interface);
3308 if (params->override_driver)
3309 global->params.override_driver =
3310 os_strdup(params->override_driver);
3311 if (params->override_ctrl_interface)
3312 global->params.override_ctrl_interface =
3313 os_strdup(params->override_ctrl_interface);
3314 wpa_debug_level = global->params.wpa_debug_level =
3315 params->wpa_debug_level;
3316 wpa_debug_show_keys = global->params.wpa_debug_show_keys =
3317 params->wpa_debug_show_keys;
3318 wpa_debug_timestamp = global->params.wpa_debug_timestamp =
3319 params->wpa_debug_timestamp;
3321 wpa_printf(MSG_DEBUG, "wpa_supplicant v" VERSION_STR);
3324 wpa_printf(MSG_ERROR, "Failed to initialize event loop");
3325 wpa_supplicant_deinit(global);
3329 random_init(params->entropy_file);
3331 global->ctrl_iface = wpa_supplicant_global_ctrl_iface_init(global);
3332 if (global->ctrl_iface == NULL) {
3333 wpa_supplicant_deinit(global);
3337 if (wpas_notify_supplicant_initialized(global)) {
3338 wpa_supplicant_deinit(global);
3342 for (i = 0; wpa_drivers[i]; i++)
3343 global->drv_count++;
3344 if (global->drv_count == 0) {
3345 wpa_printf(MSG_ERROR, "No drivers enabled");
3346 wpa_supplicant_deinit(global);
3349 global->drv_priv = os_zalloc(global->drv_count * sizeof(void *));
3350 if (global->drv_priv == NULL) {
3351 wpa_supplicant_deinit(global);
3355 #ifdef CONFIG_WIFI_DISPLAY
3356 if (wifi_display_init(global) < 0) {
3357 wpa_printf(MSG_ERROR, "Failed to initialize Wi-Fi Display");
3358 wpa_supplicant_deinit(global);
3361 #endif /* CONFIG_WIFI_DISPLAY */
3368 * wpa_supplicant_run - Run the %wpa_supplicant main event loop
3369 * @global: Pointer to global data from wpa_supplicant_init()
3370 * Returns: 0 after successful event loop run, -1 on failure
3372 * This function starts the main event loop and continues running as long as
3373 * there are any remaining events. In most cases, this function is running as
3374 * long as the %wpa_supplicant process in still in use.
3376 int wpa_supplicant_run(struct wpa_global *global)
3378 struct wpa_supplicant *wpa_s;
3380 if (global->params.daemonize &&
3381 wpa_supplicant_daemon(global->params.pid_file))
3384 if (global->params.wait_for_monitor) {
3385 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
3386 if (wpa_s->ctrl_iface)
3387 wpa_supplicant_ctrl_iface_wait(
3391 eloop_register_signal_terminate(wpa_supplicant_terminate, global);
3392 eloop_register_signal_reconfig(wpa_supplicant_reconfig, global);
3401 * wpa_supplicant_deinit - Deinitialize %wpa_supplicant
3402 * @global: Pointer to global data from wpa_supplicant_init()
3404 * This function is called to deinitialize %wpa_supplicant and to free all
3405 * allocated resources. Remaining network interfaces will also be removed.
3407 void wpa_supplicant_deinit(struct wpa_global *global)
3414 #ifdef CONFIG_WIFI_DISPLAY
3415 wifi_display_deinit(global);
3416 #endif /* CONFIG_WIFI_DISPLAY */
3418 wpas_p2p_deinit_global(global);
3419 #endif /* CONFIG_P2P */
3421 while (global->ifaces)
3422 wpa_supplicant_remove_iface(global, global->ifaces, 1);
3424 if (global->ctrl_iface)
3425 wpa_supplicant_global_ctrl_iface_deinit(global->ctrl_iface);
3427 wpas_notify_supplicant_deinitialized(global);
3429 eap_peer_unregister_methods();
3431 eap_server_unregister_methods();
3432 #endif /* CONFIG_AP */
3434 for (i = 0; wpa_drivers[i] && global->drv_priv; i++) {
3435 if (!global->drv_priv[i])
3437 wpa_drivers[i]->global_deinit(global->drv_priv[i]);
3439 os_free(global->drv_priv);
3445 if (global->params.pid_file) {
3446 os_daemonize_terminate(global->params.pid_file);
3447 os_free(global->params.pid_file);
3449 os_free(global->params.ctrl_interface);
3450 os_free(global->params.override_driver);
3451 os_free(global->params.override_ctrl_interface);
3453 os_free(global->p2p_disallow_freq);
3456 wpa_debug_close_syslog();
3457 wpa_debug_close_file();
3458 wpa_debug_close_linux_tracing();
3462 void wpa_supplicant_update_config(struct wpa_supplicant *wpa_s)
3464 if ((wpa_s->conf->changed_parameters & CFG_CHANGED_COUNTRY) &&
3465 wpa_s->conf->country[0] && wpa_s->conf->country[1]) {
3467 country[0] = wpa_s->conf->country[0];
3468 country[1] = wpa_s->conf->country[1];
3470 if (wpa_drv_set_country(wpa_s, country) < 0) {
3471 wpa_printf(MSG_ERROR, "Failed to set country code "
3476 if (wpa_s->conf->changed_parameters & CFG_CHANGED_EXT_PW_BACKEND)
3477 wpas_init_ext_pw(wpa_s);
3480 wpas_wps_update_config(wpa_s);
3481 #endif /* CONFIG_WPS */
3484 wpas_p2p_update_config(wpa_s);
3485 #endif /* CONFIG_P2P */
3487 wpa_s->conf->changed_parameters = 0;
3491 static void add_freq(int *freqs, int *num_freqs, int freq)
3495 for (i = 0; i < *num_freqs; i++) {
3496 if (freqs[i] == freq)
3500 freqs[*num_freqs] = freq;
3505 static int * get_bss_freqs_in_ess(struct wpa_supplicant *wpa_s)
3507 struct wpa_bss *bss, *cbss;
3508 const int max_freqs = 10;
3512 freqs = os_zalloc(sizeof(int) * (max_freqs + 1));
3516 cbss = wpa_s->current_bss;
3518 dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
3521 if (bss->ssid_len == cbss->ssid_len &&
3522 os_memcmp(bss->ssid, cbss->ssid, bss->ssid_len) == 0 &&
3523 wpa_blacklist_get(wpa_s, bss->bssid) == NULL) {
3524 add_freq(freqs, &num_freqs, bss->freq);
3525 if (num_freqs == max_freqs)
3530 if (num_freqs == 0) {
3539 void wpas_connection_failed(struct wpa_supplicant *wpa_s, const u8 *bssid)
3546 * Remove possible authentication timeout since the connection failed.
3548 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
3551 * Add the failed BSSID into the blacklist and speed up next scan
3552 * attempt if there could be other APs that could accept association.
3553 * The current blacklist count indicates how many times we have tried
3554 * connecting to this AP and multiple attempts mean that other APs are
3555 * either not available or has already been tried, so that we can start
3556 * increasing the delay here to avoid constant scanning.
3558 count = wpa_blacklist_add(wpa_s, bssid);
3559 if (count == 1 && wpa_s->current_bss) {
3561 * This BSS was not in the blacklist before. If there is
3562 * another BSS available for the same ESS, we should try that
3563 * next. Otherwise, we may as well try this one once more
3564 * before allowing other, likely worse, ESSes to be considered.
3566 freqs = get_bss_freqs_in_ess(wpa_s);
3568 wpa_dbg(wpa_s, MSG_DEBUG, "Another BSS in this ESS "
3569 "has been seen; try it next");
3570 wpa_blacklist_add(wpa_s, bssid);
3572 * On the next scan, go through only the known channels
3573 * used in this ESS based on previous scans to speed up
3574 * common load balancing use case.
3576 os_free(wpa_s->next_scan_freqs);
3577 wpa_s->next_scan_freqs = freqs;
3582 * Add previous failure count in case the temporary blacklist was
3583 * cleared due to no other BSSes being available.
3585 count += wpa_s->extra_blacklist_count;
3587 if (count > 3 && wpa_s->current_ssid) {
3588 wpa_printf(MSG_DEBUG, "Continuous association failures - "
3589 "consider temporary network disabling");
3590 wpas_auth_failed(wpa_s);
3611 wpa_dbg(wpa_s, MSG_DEBUG, "Blacklist count %d --> request scan in %d "
3612 "ms", count, timeout);
3615 * TODO: if more than one possible AP is available in scan results,
3616 * could try the other ones before requesting a new scan.
3618 wpa_supplicant_req_scan(wpa_s, timeout / 1000,
3619 1000 * (timeout % 1000));
3621 wpas_p2p_continue_after_scan(wpa_s);
3625 int wpas_driver_bss_selection(struct wpa_supplicant *wpa_s)
3627 return wpa_s->conf->ap_scan == 2 ||
3628 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_BSS_SELECTION);
3632 #if defined(CONFIG_CTRL_IFACE) || defined(CONFIG_CTRL_IFACE_DBUS_NEW)
3633 int wpa_supplicant_ctrl_iface_ctrl_rsp_handle(struct wpa_supplicant *wpa_s,
3634 struct wpa_ssid *ssid,
3638 #ifdef IEEE8021X_EAPOL
3639 struct eap_peer_config *eap = &ssid->eap;
3641 wpa_printf(MSG_DEBUG, "CTRL_IFACE: response handle field=%s", field);
3642 wpa_hexdump_ascii_key(MSG_DEBUG, "CTRL_IFACE: response value",
3643 (const u8 *) value, os_strlen(value));
3645 switch (wpa_supplicant_ctrl_req_from_string(field)) {
3646 case WPA_CTRL_REQ_EAP_IDENTITY:
3647 os_free(eap->identity);
3648 eap->identity = (u8 *) os_strdup(value);
3649 eap->identity_len = os_strlen(value);
3650 eap->pending_req_identity = 0;
3651 if (ssid == wpa_s->current_ssid)
3652 wpa_s->reassociate = 1;
3654 case WPA_CTRL_REQ_EAP_PASSWORD:
3655 os_free(eap->password);
3656 eap->password = (u8 *) os_strdup(value);
3657 eap->password_len = os_strlen(value);
3658 eap->pending_req_password = 0;
3659 if (ssid == wpa_s->current_ssid)
3660 wpa_s->reassociate = 1;
3662 case WPA_CTRL_REQ_EAP_NEW_PASSWORD:
3663 os_free(eap->new_password);
3664 eap->new_password = (u8 *) os_strdup(value);
3665 eap->new_password_len = os_strlen(value);
3666 eap->pending_req_new_password = 0;
3667 if (ssid == wpa_s->current_ssid)
3668 wpa_s->reassociate = 1;
3670 case WPA_CTRL_REQ_EAP_PIN:
3672 eap->pin = os_strdup(value);
3673 eap->pending_req_pin = 0;
3674 if (ssid == wpa_s->current_ssid)
3675 wpa_s->reassociate = 1;
3677 case WPA_CTRL_REQ_EAP_OTP:
3679 eap->otp = (u8 *) os_strdup(value);
3680 eap->otp_len = os_strlen(value);
3681 os_free(eap->pending_req_otp);
3682 eap->pending_req_otp = NULL;
3683 eap->pending_req_otp_len = 0;
3685 case WPA_CTRL_REQ_EAP_PASSPHRASE:
3686 os_free(eap->private_key_passwd);
3687 eap->private_key_passwd = (u8 *) os_strdup(value);
3688 eap->pending_req_passphrase = 0;
3689 if (ssid == wpa_s->current_ssid)
3690 wpa_s->reassociate = 1;
3693 wpa_printf(MSG_DEBUG, "CTRL_IFACE: Unknown field '%s'", field);
3698 #else /* IEEE8021X_EAPOL */
3699 wpa_printf(MSG_DEBUG, "CTRL_IFACE: IEEE 802.1X not included");
3701 #endif /* IEEE8021X_EAPOL */
3703 #endif /* CONFIG_CTRL_IFACE || CONFIG_CTRL_IFACE_DBUS_NEW */
3706 int wpas_network_disabled(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
3709 unsigned int drv_enc;
3717 if (wpa_s && wpa_s->drv_capa_known)
3718 drv_enc = wpa_s->drv_enc;
3720 drv_enc = (unsigned int) -1;
3722 for (i = 0; i < NUM_WEP_KEYS; i++) {
3723 size_t len = ssid->wep_key_len[i];
3726 if (len == 5 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP40))
3728 if (len == 13 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP104))
3730 if (len == 16 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP128))
3732 return 1; /* invalid WEP key */
3735 if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt) && !ssid->psk_set &&
3743 int wpas_is_p2p_prioritized(struct wpa_supplicant *wpa_s)
3745 if (wpa_s->global->conc_pref == WPA_CONC_PREF_P2P)
3747 if (wpa_s->global->conc_pref == WPA_CONC_PREF_STA)
3753 void wpas_auth_failed(struct wpa_supplicant *wpa_s)
3755 struct wpa_ssid *ssid = wpa_s->current_ssid;
3760 wpa_printf(MSG_DEBUG, "Authentication failure but no known "
3765 if (ssid->key_mgmt == WPA_KEY_MGMT_WPS)
3768 ssid->auth_failures++;
3769 if (ssid->auth_failures > 50)
3771 else if (ssid->auth_failures > 20)
3773 else if (ssid->auth_failures > 10)
3775 else if (ssid->auth_failures > 5)
3777 else if (ssid->auth_failures > 1)
3783 if (now.sec + dur <= ssid->disabled_until.sec)
3786 ssid->disabled_until.sec = now.sec + dur;
3788 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TEMP_DISABLED
3789 "id=%d ssid=\"%s\" auth_failures=%u duration=%d",
3790 ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
3791 ssid->auth_failures, dur);
3795 void wpas_clear_temp_disabled(struct wpa_supplicant *wpa_s,
3796 struct wpa_ssid *ssid, int clear_failures)
3801 if (ssid->disabled_until.sec) {
3802 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_REENABLED
3803 "id=%d ssid=\"%s\"",
3804 ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
3806 ssid->disabled_until.sec = 0;
3807 ssid->disabled_until.usec = 0;
3809 ssid->auth_failures = 0;
3813 int disallowed_bssid(struct wpa_supplicant *wpa_s, const u8 *bssid)
3817 if (wpa_s->disallow_aps_bssid == NULL)
3820 for (i = 0; i < wpa_s->disallow_aps_bssid_count; i++) {
3821 if (os_memcmp(wpa_s->disallow_aps_bssid + i * ETH_ALEN,
3822 bssid, ETH_ALEN) == 0)
3830 int disallowed_ssid(struct wpa_supplicant *wpa_s, const u8 *ssid,
3835 if (wpa_s->disallow_aps_ssid == NULL || ssid == NULL)
3838 for (i = 0; i < wpa_s->disallow_aps_ssid_count; i++) {
3839 struct wpa_ssid_value *s = &wpa_s->disallow_aps_ssid[i];
3840 if (ssid_len == s->ssid_len &&
3841 os_memcmp(ssid, s->ssid, ssid_len) == 0)
3850 * wpas_request_connection - Request a new connection
3851 * @wpa_s: Pointer to the network interface
3853 * This function is used to request a new connection to be found. It will mark
3854 * the interface to allow reassociation and request a new scan to find a
3855 * suitable network to connect to.
3857 void wpas_request_connection(struct wpa_supplicant *wpa_s)
3859 wpa_s->normal_scans = 0;
3860 wpa_supplicant_reinit_autoscan(wpa_s);
3861 wpa_s->extra_blacklist_count = 0;
3862 wpa_s->disconnected = 0;
3863 wpa_s->reassociate = 1;
3865 if (wpa_supplicant_fast_associate(wpa_s) != 1)
3866 wpa_supplicant_req_scan(wpa_s, 0, 0);