wpa_supplicant.c revision 5d1c8ad11de48ba5e449e83e1e5dcd844e9c35d1
1/* 2 * WPA Supplicant 3 * Copyright (c) 2003-2012, Jouni Malinen <j@w1.fi> 4 * 5 * This software may be distributed under the terms of the BSD license. 6 * See README for more details. 7 * 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. 11 */ 12 13#include "includes.h" 14 15#include "common.h" 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" 22#include "eloop.h" 23#include "config.h" 24#include "utils/ext_password.h" 25#include "l2_packet/l2_packet.h" 26#include "wpa_supplicant_i.h" 27#include "driver_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" 35#include "p2p/p2p.h" 36#include "blacklist.h" 37#include "wpas_glue.h" 38#include "wps_supplicant.h" 39#include "ibss_rsn.h" 40#include "sme.h" 41#include "gas_query.h" 42#include "ap.h" 43#include "p2p_supplicant.h" 44#include "wifi_display.h" 45#include "notify.h" 46#include "bgscan.h" 47#include "autoscan.h" 48#include "bss.h" 49#include "scan.h" 50#include "offchannel.h" 51#include "hs20_supplicant.h" 52 53const char *wpa_supplicant_version = 54"wpa_supplicant v" VERSION_STR "\n" 55"Copyright (c) 2003-2013, Jouni Malinen <j@w1.fi> and contributors"; 56 57const 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 */ 64; 65 66#ifndef CONFIG_NO_STDOUT_DEBUG 67/* Long text divided into parts in order to fit in C89 strings size limits. */ 68const char *wpa_supplicant_full_license1 = 69""; 70const char *wpa_supplicant_full_license2 = 71"This software may be distributed under the terms of the BSD license.\n" 72"\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" 75"met:\n" 76"\n"; 77const 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" 80"\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" 84"\n"; 85const 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" 89"\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"; 94const 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" 102"\n"; 103#endif /* CONFIG_NO_STDOUT_DEBUG */ 104 105extern int wpa_debug_level; 106extern int wpa_debug_show_keys; 107extern int wpa_debug_timestamp; 108extern struct wpa_driver_ops *wpa_drivers[]; 109 110/* Configure default/group WEP keys for static WEP */ 111int wpa_set_wep_keys(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid) 112{ 113 int i, set = 0; 114 115 for (i = 0; i < NUM_WEP_KEYS; i++) { 116 if (ssid->wep_key_len[i] == 0) 117 continue; 118 119 set = 1; 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]); 123 } 124 125 return set; 126} 127 128 129static int wpa_supplicant_set_wpa_none_key(struct wpa_supplicant *wpa_s, 130 struct wpa_ssid *ssid) 131{ 132 u8 key[32]; 133 size_t keylen; 134 enum wpa_alg alg; 135 u8 seq[6] = { 0 }; 136 137 /* IBSS/WPA-None uses only one key (Group) for both receiving and 138 * sending unicast and multicast packets. */ 139 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); 143 return -1; 144 } 145 146 if (!ssid->psk_set) { 147 wpa_msg(wpa_s, MSG_INFO, "WPA: No PSK configured for " 148 "WPA-None"); 149 return -1; 150 } 151 152 switch (wpa_s->group_cipher) { 153 case WPA_CIPHER_CCMP: 154 os_memcpy(key, ssid->psk, 16); 155 keylen = 16; 156 alg = WPA_ALG_CCMP; 157 break; 158 case WPA_CIPHER_GCMP: 159 os_memcpy(key, ssid->psk, 16); 160 keylen = 16; 161 alg = WPA_ALG_GCMP; 162 break; 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); 167 keylen = 32; 168 alg = WPA_ALG_TKIP; 169 break; 170 default: 171 wpa_msg(wpa_s, MSG_INFO, "WPA: Invalid group cipher %d for " 172 "WPA-None", wpa_s->group_cipher); 173 return -1; 174 } 175 176 /* TODO: should actually remember the previously used seq#, both for TX 177 * and RX from each STA.. */ 178 179 return wpa_drv_set_key(wpa_s, alg, NULL, 0, 1, seq, 6, key, keylen); 180} 181 182 183static void wpa_supplicant_timeout(void *eloop_ctx, void *timeout_ctx) 184{ 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.", 190 MAC2STR(bssid)); 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; 195 196 /* 197 * If we timed out, the AP or the local radio may be busy. 198 * So, wait a second until scanning again. 199 */ 200 wpa_supplicant_req_scan(wpa_s, 1, 0); 201 202 wpas_p2p_continue_after_scan(wpa_s); 203} 204 205 206/** 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 211 * 212 * This function is used to schedule a timeout for the current authentication 213 * attempt. 214 */ 215void wpa_supplicant_req_auth_timeout(struct wpa_supplicant *wpa_s, 216 int sec, int usec) 217{ 218 if (wpa_s->conf && wpa_s->conf->ap_scan == 0 && 219 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED)) 220 return; 221 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); 226} 227 228 229/** 230 * wpa_supplicant_cancel_auth_timeout - Cancel authentication timeout 231 * @wpa_s: Pointer to wpa_supplicant data 232 * 233 * This function is used to cancel authentication timeout scheduled with 234 * wpa_supplicant_req_auth_timeout() and it is called when authentication has 235 * been completed. 236 */ 237void wpa_supplicant_cancel_auth_timeout(struct wpa_supplicant *wpa_s) 238{ 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); 242} 243 244 245/** 246 * wpa_supplicant_initiate_eapol - Configure EAPOL state machine 247 * @wpa_s: Pointer to wpa_supplicant data 248 * 249 * This function is used to configure EAPOL state machine based on the selected 250 * authentication mode. 251 */ 252void wpa_supplicant_initiate_eapol(struct wpa_supplicant *wpa_s) 253{ 254#ifdef IEEE8021X_EAPOL 255 struct eapol_config eapol_conf; 256 struct wpa_ssid *ssid = wpa_s->current_ssid; 257 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) { 262 /* 263 * RSN IBSS authentication is per-STA and we can disable the 264 * per-BSSID EAPOL authentication. 265 */ 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); 269 return; 270 } 271#endif /* CONFIG_IBSS_RSN */ 272 273 eapol_sm_notify_eap_success(wpa_s->eapol, FALSE); 274 eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE); 275 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); 279 else 280 eapol_sm_notify_portControl(wpa_s->eapol, Auto); 281 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; 288 } 289 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_BROADCAST) { 290 eapol_conf.required_keys |= 291 EAPOL_REQUIRE_KEY_BROADCAST; 292 } 293 294 if (wpa_s->conf && (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED)) 295 eapol_conf.required_keys = 0; 296 } 297 if (wpa_s->conf) 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 */ 306} 307 308 309/** 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 313 * 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. 317 */ 318void wpa_supplicant_set_non_wpa_policy(struct wpa_supplicant *wpa_s, 319 struct wpa_ssid *ssid) 320{ 321 int i; 322 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; 327 else 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; 335 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; 340 break; 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; 344 break; 345 } 346 } 347 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 */ 357 358 pmksa_cache_clear_current(wpa_s->wpa); 359} 360 361 362void free_hw_features(struct wpa_supplicant *wpa_s) 363{ 364 int i; 365 if (wpa_s->hw.modes == NULL) 366 return; 367 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); 371 } 372 373 os_free(wpa_s->hw.modes); 374 wpa_s->hw.modes = NULL; 375} 376 377 378static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s) 379{ 380 bgscan_deinit(wpa_s); 381 autoscan_deinit(wpa_s); 382 scard_deinit(wpa_s->scard); 383 wpa_s->scard = NULL; 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); 387 wpa_s->l2 = NULL; 388 if (wpa_s->l2_br) { 389 l2_packet_deinit(wpa_s->l2_br); 390 wpa_s->l2_br = NULL; 391 } 392 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); 397 } 398 399 os_free(wpa_s->confname); 400 wpa_s->confname = NULL; 401 402 os_free(wpa_s->confanother); 403 wpa_s->confanother = NULL; 404 405 wpa_sm_set_eapol(wpa_s->wpa, NULL); 406 eapol_sm_deinit(wpa_s->eapol); 407 wpa_s->eapol = NULL; 408 409 rsn_preauth_deinit(wpa_s->wpa); 410 411#ifdef CONFIG_TDLS 412 wpa_tdls_deinit(wpa_s->wpa); 413#endif /* CONFIG_TDLS */ 414 415 pmksa_candidate_free(wpa_s->wpa); 416 wpa_sm_deinit(wpa_s->wpa); 417 wpa_s->wpa = NULL; 418 wpa_blacklist_clear(wpa_s); 419 420 wpa_bss_deinit(wpa_s); 421 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, 427 wpa_s, NULL); 428#endif /* CONFIG_DELAYED_MIC_ERROR_REPORT */ 429 430 wpas_wps_deinit(wpa_s); 431 432 wpabuf_free(wpa_s->pending_eapol_rx); 433 wpa_s->pending_eapol_rx = NULL; 434 435#ifdef CONFIG_IBSS_RSN 436 ibss_rsn_deinit(wpa_s->ibss_rsn); 437 wpa_s->ibss_rsn = NULL; 438#endif /* CONFIG_IBSS_RSN */ 439 440 sme_deinit(wpa_s); 441 442#ifdef CONFIG_AP 443 wpa_supplicant_ap_deinit(wpa_s); 444#endif /* CONFIG_AP */ 445 446#ifdef CONFIG_P2P 447 wpas_p2p_deinit(wpa_s); 448#endif /* CONFIG_P2P */ 449 450#ifdef CONFIG_OFFCHANNEL 451 offchannel_deinit(wpa_s); 452#endif /* CONFIG_OFFCHANNEL */ 453 454 wpa_supplicant_cancel_sched_scan(wpa_s); 455 456 os_free(wpa_s->next_scan_freqs); 457 wpa_s->next_scan_freqs = NULL; 458 459 gas_query_deinit(wpa_s->gas); 460 wpa_s->gas = NULL; 461 462 free_hw_features(wpa_s); 463 464 os_free(wpa_s->bssid_filter); 465 wpa_s->bssid_filter = NULL; 466 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; 471 472 wnm_bss_keep_alive_deinit(wpa_s); 473 474 ext_password_deinit(wpa_s->ext_pw); 475 wpa_s->ext_pw = NULL; 476 477 wpabuf_free(wpa_s->last_gas_resp); 478 479 os_free(wpa_s->last_scan_res); 480 wpa_s->last_scan_res = NULL; 481} 482 483 484/** 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 488 * 489 * This function clears the encryption keys that has been previously configured 490 * for the driver. 491 */ 492void wpa_clear_keys(struct wpa_supplicant *wpa_s, const u8 *addr) 493{ 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"); 504 return; 505 } 506 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 */ 516 if (addr) { 517 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, addr, 0, 0, NULL, 0, NULL, 518 0); 519 /* MLME-SETPROTECTION.request(None) */ 520 wpa_drv_mlme_setprotection( 521 wpa_s, addr, 522 MLME_SETPROTECTION_PROTECT_TYPE_NONE, 523 MLME_SETPROTECTION_KEY_TYPE_PAIRWISE); 524 } 525 wpa_s->keys_cleared = 1; 526} 527 528 529/** 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 533 */ 534const char * wpa_supplicant_state_txt(enum wpa_states state) 535{ 536 switch (state) { 537 case WPA_DISCONNECTED: 538 return "DISCONNECTED"; 539 case WPA_INACTIVE: 540 return "INACTIVE"; 541 case WPA_INTERFACE_DISABLED: 542 return "INTERFACE_DISABLED"; 543 case WPA_SCANNING: 544 return "SCANNING"; 545 case WPA_AUTHENTICATING: 546 return "AUTHENTICATING"; 547 case WPA_ASSOCIATING: 548 return "ASSOCIATING"; 549 case WPA_ASSOCIATED: 550 return "ASSOCIATED"; 551 case WPA_4WAY_HANDSHAKE: 552 return "4WAY_HANDSHAKE"; 553 case WPA_GROUP_HANDSHAKE: 554 return "GROUP_HANDSHAKE"; 555 case WPA_COMPLETED: 556 return "COMPLETED"; 557 default: 558 return "UNKNOWN"; 559 } 560} 561 562 563#ifdef CONFIG_BGSCAN 564 565static void wpa_supplicant_start_bgscan(struct wpa_supplicant *wpa_s) 566{ 567 if (wpas_driver_bss_selection(wpa_s)) 568 return; 569 if (wpa_s->current_ssid == wpa_s->bgscan_ssid) 570 return; 571 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 " 576 "bgscan"); 577 /* 578 * Live without bgscan; it is only used as a roaming 579 * optimization, so the initial connection is not 580 * affected. 581 */ 582 } else { 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, 586 0); 587 if (scan_res) { 588 bgscan_notify_scan(wpa_s, scan_res); 589 wpa_scan_results_free(scan_res); 590 } 591 } 592 } else 593 wpa_s->bgscan_ssid = NULL; 594} 595 596 597static void wpa_supplicant_stop_bgscan(struct wpa_supplicant *wpa_s) 598{ 599 if (wpa_s->bgscan_ssid != NULL) { 600 bgscan_deinit(wpa_s); 601 wpa_s->bgscan_ssid = NULL; 602 } 603} 604 605#endif /* CONFIG_BGSCAN */ 606 607 608static void wpa_supplicant_start_autoscan(struct wpa_supplicant *wpa_s) 609{ 610 if (autoscan_init(wpa_s, 0)) 611 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize autoscan"); 612} 613 614 615static void wpa_supplicant_stop_autoscan(struct wpa_supplicant *wpa_s) 616{ 617 autoscan_deinit(wpa_s); 618} 619 620 621void wpa_supplicant_reinit_autoscan(struct wpa_supplicant *wpa_s) 622{ 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); 627 } 628} 629 630 631/** 632 * wpa_supplicant_set_state - Set current connection state 633 * @wpa_s: Pointer to wpa_supplicant data 634 * @state: The new connection state 635 * 636 * This function is called whenever the connection state changes, e.g., 637 * association is completed for WPA/WPA2 4-Way Handshake is started. 638 */ 639void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s, 640 enum wpa_states state) 641{ 642 enum wpa_states old_state = wpa_s->wpa_state; 643 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)); 647 648#ifdef ANDROID_P2P 649 if(state == WPA_ASSOCIATED && wpa_s->current_ssid) { 650 wpa_s->current_ssid->assoc_retry = 0; 651 } 652#endif /* ANDROID_P2P */ 653 654 if (state != WPA_SCANNING) 655 wpa_supplicant_notify_scanning(wpa_s, 0); 656 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; 674#ifdef CONFIG_P2P 675 wpas_p2p_completed(wpa_s); 676#endif /* CONFIG_P2P */ 677 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); 687 } 688 wpa_s->wpa_state = state; 689 690#ifdef CONFIG_BGSCAN 691 if (state == WPA_COMPLETED) 692 wpa_supplicant_start_bgscan(wpa_s); 693 else 694 wpa_supplicant_stop_bgscan(wpa_s); 695#endif /* CONFIG_BGSCAN */ 696 697 if (state == WPA_AUTHENTICATING) 698 wpa_supplicant_stop_autoscan(wpa_s); 699 700 if (state == WPA_DISCONNECTED || state == WPA_INACTIVE) 701 wpa_supplicant_start_autoscan(wpa_s); 702 703 if (wpa_s->wpa_state != old_state) { 704 wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state); 705 706 if (wpa_s->wpa_state == WPA_COMPLETED || 707 old_state == WPA_COMPLETED) 708 wpas_notify_auth_changed(wpa_s); 709 } 710} 711 712 713void wpa_supplicant_terminate_proc(struct wpa_global *global) 714{ 715 int pending = 0; 716#ifdef CONFIG_WPS 717 struct wpa_supplicant *wpa_s = global->ifaces; 718 while (wpa_s) { 719 if (wpas_wps_terminate_pending(wpa_s) == 1) 720 pending = 1; 721 wpa_s = wpa_s->next; 722 } 723#endif /* CONFIG_WPS */ 724 if (pending) 725 return; 726 eloop_terminate(); 727} 728 729 730static void wpa_supplicant_terminate(int sig, void *signal_ctx) 731{ 732 struct wpa_global *global = signal_ctx; 733 wpa_supplicant_terminate_proc(global); 734} 735 736 737void wpa_supplicant_clear_status(struct wpa_supplicant *wpa_s) 738{ 739 enum wpa_states old_state = wpa_s->wpa_state; 740 741 wpa_s->pairwise_cipher = 0; 742 wpa_s->group_cipher = 0; 743 wpa_s->mgmt_group_cipher = 0; 744 wpa_s->key_mgmt = 0; 745 if (wpa_s->wpa_state != WPA_INTERFACE_DISABLED) 746 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED); 747 748 if (wpa_s->wpa_state != old_state) 749 wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state); 750} 751 752 753/** 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 757 * 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. 763 */ 764int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s) 765{ 766 struct wpa_config *conf; 767 int reconf_ctrl; 768 int old_ap_scan; 769 770 if (wpa_s->confname == NULL) 771 return -1; 772 conf = wpa_config_read(wpa_s->confname, NULL); 773 if (conf == NULL) { 774 wpa_msg(wpa_s, MSG_ERROR, "Failed to parse the configuration " 775 "file '%s' - exiting", wpa_s->confname); 776 return -1; 777 } 778 wpa_config_read(wpa_s->confanother, conf); 779 780 conf->changed_parameters = (unsigned int) -1; 781 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); 786 787 if (reconf_ctrl && wpa_s->ctrl_iface) { 788 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface); 789 wpa_s->ctrl_iface = NULL; 790 } 791 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); 796 } 797 798 /* 799 * TODO: should notify EAPOL SM about changes in opensc_engine_path, 800 * pkcs11_engine_path, pkcs11_module_path. 801 */ 802 if (wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt)) { 803 /* 804 * Clear forced success to clear EAP state for next 805 * authentication. 806 */ 807 eapol_sm_notify_eap_success(wpa_s->eapol, FALSE); 808 } 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); 814 815 old_ap_scan = wpa_s->conf->ap_scan; 816 wpa_config_free(wpa_s->conf); 817 wpa_s->conf = conf; 818 if (old_ap_scan != wpa_s->conf->ap_scan) 819 wpas_notify_ap_scan_changed(wpa_s); 820 821 if (reconf_ctrl) 822 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s); 823 824 wpa_supplicant_update_config(wpa_s); 825 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); 830 } 831 wpa_dbg(wpa_s, MSG_DEBUG, "Reconfiguration completed"); 832 return 0; 833} 834 835 836static void wpa_supplicant_reconfig(int sig, void *signal_ctx) 837{ 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", 842 sig); 843 if (wpa_supplicant_reload_configuration(wpa_s) < 0) { 844 wpa_supplicant_terminate_proc(global); 845 } 846 } 847} 848 849 850enum wpa_key_mgmt key_mgmt2driver(int key_mgmt) 851{ 852 switch (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: 870 return KEY_MGMT_WPS; 871 case WPA_KEY_MGMT_PSK: 872 default: 873 return KEY_MGMT_PSK; 874 } 875} 876 877 878static int wpa_supplicant_suites_from_ai(struct wpa_supplicant *wpa_s, 879 struct wpa_ssid *ssid, 880 struct wpa_ie_data *ie) 881{ 882 int ret = wpa_sm_parse_own_wpa_ie(wpa_s->wpa, ie); 883 if (ret) { 884 if (ret == -2) { 885 wpa_msg(wpa_s, MSG_INFO, "WPA: Failed to parse WPA IE " 886 "from association info"); 887 } 888 return -1; 889 } 890 891 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Using WPA IE from AssocReq to set " 892 "cipher suites"); 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); 897 return -1; 898 } 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); 903 return -1; 904 } 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); 909 return -1; 910 } 911 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 - " 919 "reject"); 920 return -1; 921 } 922#endif /* CONFIG_IEEE80211W */ 923 924 return 0; 925} 926 927 928/** 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 937 * 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 940 * available). 941 */ 942int 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) 945{ 946 struct wpa_ie_data ie; 947 int sel, proto; 948 const u8 *bss_wpa, *bss_rsn; 949 950 if (bss) { 951 bss_wpa = wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE); 952 bss_rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN); 953 } else 954 bss_wpa = bss_rsn = NULL; 955 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; 970 } else if (bss) { 971 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select WPA/RSN"); 972 return -1; 973 } else { 974 if (ssid->proto & WPA_PROTO_RSN) 975 proto = WPA_PROTO_RSN; 976 else 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"); 990 } else 991 proto = ie.proto; 992 } 993 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); 1001 } 1002#endif /* CONFIG_IEEE80211W */ 1003 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)); 1008 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)) 1014 return -1; 1015 } 1016 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 " 1021 "cipher"); 1022 return -1; 1023 } 1024 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using GTK %s", 1025 wpa_cipher_txt(wpa_s->group_cipher)); 1026 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 " 1031 "cipher"); 1032 return -1; 1033 } 1034 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using PTK %s", 1035 wpa_cipher_txt(wpa_s->pairwise_cipher)); 1036 1037 sel = ie.key_mgmt & ssid->key_mgmt; 1038#ifdef CONFIG_SAE 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 */ 1042 if (0) { 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 */ 1051#ifdef CONFIG_SAE 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"); 1078 } else { 1079 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select " 1080 "authenticated key management type"); 1081 return -1; 1082 } 1083 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); 1088 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)) 1094 sel = 0; 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 " 1098 "AES-128-CMAC"); 1099 } else { 1100 wpa_s->mgmt_group_cipher = 0; 1101 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: not using MGMT group cipher"); 1102 } 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 */ 1109 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"); 1112 return -1; 1113 } 1114 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 && 1119 ssid->passphrase) { 1120 u8 psk[PMK_LEN]; 1121 pbkdf2_sha1(ssid->passphrase, bss->ssid, bss->ssid_len, 1122 4096, psk, PMK_LEN); 1123 wpa_hexdump_key(MSG_MSGDUMP, "PSK (from passphrase)", 1124 psk, PMK_LEN); 1125 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN); 1126 } 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, 1131 ssid->ext_psk); 1132 char pw_str[64 + 1]; 1133 u8 psk[PMK_LEN]; 1134 1135 if (pw == NULL) { 1136 wpa_msg(wpa_s, MSG_INFO, "EXT PW: No PSK " 1137 "found from external storage"); 1138 return -1; 1139 } 1140 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); 1146 return -1; 1147 } 1148 1149 os_memcpy(pw_str, wpabuf_head(pw), wpabuf_len(pw)); 1150 pw_str[wpabuf_len(pw)] = '\0'; 1151 1152#ifndef CONFIG_NO_PBKDF2 1153 if (wpabuf_len(pw) >= 8 && wpabuf_len(pw) < 64 && bss) 1154 { 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)", 1160 psk, PMK_LEN); 1161 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN); 1162 } else 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); 1170 return -1; 1171 } 1172 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN); 1173 } else { 1174 wpa_msg(wpa_s, MSG_INFO, "EXT PW: No suitable " 1175 "PSK available"); 1176 os_memset(pw_str, 0, sizeof(pw_str)); 1177 ext_password_free(pw); 1178 return -1; 1179 } 1180 1181 os_memset(pw_str, 0, sizeof(pw_str)); 1182 ext_password_free(pw); 1183 } 1184#endif /* CONFIG_EXT_PASSWORD */ 1185 } else 1186 wpa_sm_set_pmk_from_pmksa(wpa_s->wpa); 1187 1188 return 0; 1189} 1190 1191 1192static void wpas_ext_capab_byte(struct wpa_supplicant *wpa_s, u8 *pos, int idx) 1193{ 1194 *pos = 0x00; 1195 1196 switch (idx) { 1197 case 0: /* Bits 0-7 */ 1198 break; 1199 case 1: /* Bits 8-15 */ 1200 break; 1201 case 2: /* Bits 16-23 */ 1202#ifdef CONFIG_WNM 1203 *pos |= 0x02; /* Bit 17 - WNM-Sleep Mode */ 1204 *pos |= 0x08; /* Bit 19 - BSS Transition */ 1205#endif /* CONFIG_WNM */ 1206 break; 1207 case 3: /* Bits 24-31 */ 1208#ifdef CONFIG_WNM 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 */ 1215 break; 1216 case 4: /* Bits 32-39 */ 1217 break; 1218 case 5: /* Bits 40-47 */ 1219 break; 1220 case 6: /* Bits 48-55 */ 1221 break; 1222 } 1223} 1224 1225 1226int wpas_build_ext_capab(struct wpa_supplicant *wpa_s, u8 *buf) 1227{ 1228 u8 *pos = buf; 1229 u8 len = 4, i; 1230 1231 if (len < wpa_s->extended_capa_len) 1232 len = wpa_s->extended_capa_len; 1233 1234 *pos++ = WLAN_EID_EXT_CAPAB; 1235 *pos++ = len; 1236 for (i = 0; i < len; i++, pos++) { 1237 wpas_ext_capab_byte(wpa_s, pos, i); 1238 1239 if (i < wpa_s->extended_capa_len) { 1240 *pos &= ~wpa_s->extended_capa_mask[i]; 1241 *pos |= wpa_s->extended_capa[i]; 1242 } 1243 } 1244 1245 while (len > 0 && buf[1 + len] == 0) { 1246 len--; 1247 buf[1] = len; 1248 } 1249 if (len == 0) 1250 return 0; 1251 1252 return 2 + len; 1253} 1254 1255 1256/** 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 1261 * 1262 * This function is used to request %wpa_supplicant to associate with a BSS. 1263 */ 1264void wpa_supplicant_associate(struct wpa_supplicant *wpa_s, 1265 struct wpa_bss *bss, struct wpa_ssid *ssid) 1266{ 1267 u8 wpa_ie[200]; 1268 size_t wpa_ie_len; 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; 1277 u8 ext_capab[10]; 1278 int ext_capab_len; 1279#ifdef CONFIG_HT_OVERRIDES 1280 struct ieee80211_ht_capabilities htcaps; 1281 struct ieee80211_ht_capabilities htcaps_mask; 1282#endif /* CONFIG_HT_OVERRIDES */ 1283 1284#ifdef CONFIG_IBSS_RSN 1285 ibss_rsn_deinit(wpa_s->ibss_rsn); 1286 wpa_s->ibss_rsn = NULL; 1287#endif /* CONFIG_IBSS_RSN */ 1288#ifdef ANDROID_P2P 1289 int freq = 0; 1290#endif 1291 1292 if (ssid->mode == WPAS_MODE_AP || ssid->mode == WPAS_MODE_P2P_GO || 1293 ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) { 1294#ifdef CONFIG_AP 1295 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_AP)) { 1296 wpa_msg(wpa_s, MSG_INFO, "Driver does not support AP " 1297 "mode"); 1298 return; 1299 } 1300 if (wpa_supplicant_create_ap(wpa_s, ssid) < 0) { 1301 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED); 1302 return; 1303 } 1304 wpa_s->current_bss = bss; 1305#else /* CONFIG_AP */ 1306 wpa_msg(wpa_s, MSG_ERROR, "AP mode support not included in " 1307 "the build"); 1308#endif /* CONFIG_AP */ 1309 return; 1310 } 1311 1312#ifdef CONFIG_TDLS 1313 if (bss) 1314 wpa_tdls_ap_ies(wpa_s->wpa, (const u8 *) (bss + 1), 1315 bss->ie_len); 1316#endif /* CONFIG_TDLS */ 1317 1318 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) && 1319 ssid->mode == IEEE80211_MODE_INFRA) { 1320 sme_authenticate(wpa_s, bss, ssid); 1321 return; 1322 } 1323 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); 1336 if (bssid_changed) 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) 1341 md = ie + 2; 1342 wpa_sm_set_ft_params(wpa_s->wpa, ie, ie ? 2 + ie[1] : 0); 1343 if (md) { 1344 /* Prepare for the next transition */ 1345 wpa_ft_prepare_auth_request(wpa_s->wpa, ie); 1346 } 1347#endif /* CONFIG_IEEE80211R */ 1348#ifdef CONFIG_WPS 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 1353 */ 1354 wpa_s->scan_req = MANUAL_SCAN_REQ; 1355 wpa_s->reassociate = 1; 1356 wpa_supplicant_req_scan(wpa_s, 0, 0); 1357 return; 1358#endif /* CONFIG_WPS */ 1359 } else { 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); 1363 } 1364 wpa_supplicant_cancel_sched_scan(wpa_s); 1365 wpa_supplicant_cancel_scan(wpa_s); 1366 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); 1370 1371#ifdef IEEE8021X_EAPOL 1372 if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) { 1373 if (ssid->leap) { 1374 if (ssid->non_leap == 0) 1375 algs = WPA_AUTH_ALG_LEAP; 1376 else 1377 algs |= WPA_AUTH_ALG_LEAP; 1378 } 1379 } 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: " 1385 "0x%x", algs); 1386 } 1387 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 ? 1393 wpa_s->conf->okc : 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"); 1404 return; 1405 } 1406 } else if ((ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) && bss && 1407 wpa_key_mgmt_wpa_ieee8021x(ssid->key_mgmt)) { 1408 /* 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. 1412 */ 1413 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid); 1414 wpa_ie_len = 0; 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 " 1422 "scan results)"); 1423 return; 1424 } 1425#ifdef CONFIG_WPS 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); 1432 } else 1433 wpa_ie_len = 0; 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; 1438 else 1439 params.wps = WPS_MODE_OPEN; 1440 wpa_s->wpa_proto = 0; 1441#endif /* CONFIG_WPS */ 1442 } else { 1443 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid); 1444 wpa_ie_len = 0; 1445 wpa_s->wpa_proto = 0; 1446 } 1447 1448#ifdef CONFIG_P2P 1449 if (wpa_s->global->p2p) { 1450 u8 *pos; 1451 size_t len; 1452 int res; 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, 1456 ssid->p2p_group); 1457 if (res >= 0) 1458 wpa_ie_len += res; 1459 } 1460 1461 wpa_s->cross_connect_disallowed = 0; 1462 if (bss) { 1463 struct wpabuf *p2p; 1464 p2p = wpa_bss_get_vendor_ie_multi(bss, P2P_IE_VENDOR_TYPE); 1465 if (p2p) { 1466 wpa_s->cross_connect_disallowed = 1467 p2p_get_cross_connect_disallowed(p2p); 1468 wpabuf_free(p2p); 1469 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: WLAN AP %s cross " 1470 "connection", 1471 wpa_s->cross_connect_disallowed ? 1472 "disallows" : "allows"); 1473 } 1474 } 1475#endif /* CONFIG_P2P */ 1476 1477#ifdef CONFIG_HS20 1478 if (wpa_s->conf->hs20) { 1479 struct wpabuf *hs20; 1480 hs20 = wpabuf_alloc(20); 1481 if (hs20) { 1482 wpas_hs20_add_indication(hs20); 1483 os_memcpy(wpa_ie + wpa_ie_len, wpabuf_head(hs20), 1484 wpabuf_len(hs20)); 1485 wpa_ie_len += wpabuf_len(hs20); 1486 wpabuf_free(hs20); 1487 } 1488 } 1489#endif /* CONFIG_HS20 */ 1490 1491 ext_capab_len = wpas_build_ext_capab(wpa_s, ext_capab); 1492 if (ext_capab_len > 0) { 1493 u8 *pos = wpa_ie; 1494 if (wpa_ie_len > 0 && pos[0] == WLAN_EID_RSN) 1495 pos += 2 + pos[1]; 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); 1500 } 1501 1502 wpa_clear_keys(wpa_s, bss ? bss->bssid : NULL); 1503 use_crypt = 1; 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) 1509 use_crypt = 0; 1510 if (wpa_set_wep_keys(wpa_s, ssid)) { 1511 use_crypt = 1; 1512 wep_keys_set = 1; 1513 } 1514 } 1515 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) 1516 use_crypt = 0; 1517 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 && 1523 !wep_keys_set) { 1524 use_crypt = 0; 1525 } else { 1526 /* Assume that dynamic WEP-104 keys will be used and 1527 * set cipher suites in order for drivers to expect 1528 * encryption. */ 1529 cipher_pairwise = cipher_group = CIPHER_WEP104; 1530 } 1531 } 1532#endif /* IEEE8021X_EAPOL */ 1533 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); 1537 } 1538 1539 wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING); 1540 if (bss) { 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 " 1546 "(bssid_set=%d)", 1547 MAC2STR(bss->bssid), bss->freq, 1548 ssid->bssid_set); 1549 params.bssid = bss->bssid; 1550 params.freq = bss->freq; 1551 } 1552 } else { 1553 params.ssid = ssid->ssid; 1554 params.ssid_len = ssid->ssid_len; 1555 } 1556 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; 1561 } 1562 1563 if (ssid->mode == WPAS_MODE_IBSS && ssid->frequency > 0 && 1564 params.freq == 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]; 1579 } 1580 params.wep_tx_keyidx = ssid->wep_tx_keyidx; 1581 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; 1586 if (ssid->psk_set) 1587 params.psk = ssid->psk; 1588 } 1589 1590 params.drop_unencrypted = use_crypt; 1591 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 && 1600 ie.capabilities & 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; 1606 } 1607 } 1608#endif /* CONFIG_IEEE80211W */ 1609 1610 params.p2p = ssid->p2p_group; 1611 1612 if (wpa_s->parent->set_sta_uapsd) 1613 params.uapsd = wpa_s->parent->sta_uapsd; 1614 else 1615 params.uapsd = -1; 1616 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 */ 1624 1625#ifdef ANDROID_P2P 1626 /* If multichannel concurrency is not supported, check for any frequency 1627 * conflict and take appropriate action. 1628 */ 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) 1634 return; 1635 } 1636#endif 1637 ret = wpa_drv_associate(wpa_s, ¶ms); 1638 if (ret < 0) { 1639 wpa_msg(wpa_s, MSG_INFO, "Association request to the driver " 1640 "failed"); 1641 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SANE_ERROR_CODES) { 1642 /* 1643 * The driver is known to mean what is saying, so we 1644 * can stop right here; the association will not 1645 * succeed. 1646 */ 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); 1650 return; 1651 } 1652 /* try to continue anyway; new association will be tried again 1653 * after timeout */ 1654 assoc_failed = 1; 1655 } 1656 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 1662 * management. */ 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) { 1669 /* 1670 * RSN IBSS authentication is per-STA and we can disable the 1671 * per-BSSID authentication. 1672 */ 1673 wpa_supplicant_cancel_auth_timeout(wpa_s); 1674#endif /* CONFIG_IBSS_RSN */ 1675 } else { 1676 /* Timeout for IEEE 802.11 authentication and association */ 1677 int timeout = 60; 1678 1679 if (assoc_failed) { 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; 1685 } 1686 wpa_supplicant_req_auth_timeout(wpa_s, timeout, 0); 1687 } 1688 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); 1693 } 1694 1695 if (wpa_s->current_ssid && wpa_s->current_ssid != ssid) { 1696 /* 1697 * Do not allow EAP session resumption between different 1698 * network configurations. 1699 */ 1700 eapol_sm_invalidate_cached_session(wpa_s->eapol); 1701 } 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); 1709} 1710 1711 1712static void wpa_supplicant_clear_connection(struct wpa_supplicant *wpa_s, 1713 const u8 *addr) 1714{ 1715 struct wpa_ssid *old_ssid; 1716 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); 1725} 1726 1727 1728/** 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 1732 * 1733 * This function is used to request %wpa_supplicant to deauthenticate from the 1734 * current AP. 1735 */ 1736void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s, 1737 int reason_code) 1738{ 1739 u8 *addr = NULL; 1740 union wpa_event_data event; 1741 int zero_addr = 0; 1742 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)); 1747 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) { 1755 /* 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. 1760 */ 1761 addr = wpa_s->bssid; 1762 zero_addr = 1; 1763 } 1764 1765#ifdef CONFIG_TDLS 1766 wpa_tdls_teardown_peers(wpa_s->wpa); 1767#endif /* CONFIG_TDLS */ 1768 1769 if (addr) { 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); 1775 if (zero_addr) 1776 addr = NULL; 1777 } 1778 1779 wpa_supplicant_clear_connection(wpa_s, addr); 1780} 1781 1782static void wpa_supplicant_enable_one_network(struct wpa_supplicant *wpa_s, 1783 struct wpa_ssid *ssid) 1784{ 1785 if (!ssid || !ssid->disabled || ssid->disabled == 2) 1786 return; 1787 1788 ssid->disabled = 0; 1789 wpas_clear_temp_disabled(wpa_s, ssid, 1); 1790 wpas_notify_network_enabled_changed(wpa_s, ssid); 1791 1792 /* 1793 * Try to reassociate since there is no current configuration and a new 1794 * network was made available. 1795 */ 1796 if (!wpa_s->current_ssid) 1797 wpa_s->reassociate = 1; 1798} 1799 1800 1801/** 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 1805 * 1806 * Enables the specified network or all networks if no network specified. 1807 */ 1808void wpa_supplicant_enable_network(struct wpa_supplicant *wpa_s, 1809 struct wpa_ssid *ssid) 1810{ 1811 if (ssid == NULL) { 1812 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) 1813 wpa_supplicant_enable_one_network(wpa_s, ssid); 1814 } else 1815 wpa_supplicant_enable_one_network(wpa_s, ssid); 1816 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); 1822 } 1823 1824 wpa_supplicant_req_scan(wpa_s, 0, 0); 1825 } 1826} 1827 1828 1829/** 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 1833 * 1834 * Disables the specified network or all networks if no network specified. 1835 */ 1836void wpa_supplicant_disable_network(struct wpa_supplicant *wpa_s, 1837 struct wpa_ssid *ssid) 1838{ 1839 struct wpa_ssid *other_ssid; 1840 int was_disabled; 1841 1842 if (ssid == NULL) { 1843 if (wpa_s->sched_scanning) 1844 wpa_supplicant_cancel_sched_scan(wpa_s); 1845 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 1851 * data */ 1852 1853 other_ssid->disabled = 1; 1854 1855 if (was_disabled != other_ssid->disabled) 1856 wpas_notify_network_enabled_changed( 1857 wpa_s, other_ssid); 1858 } 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); 1866 1867 was_disabled = ssid->disabled; 1868 1869 ssid->disabled = 1; 1870 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); 1878 } 1879 } 1880 } 1881} 1882 1883 1884/** 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 1888 */ 1889void wpa_supplicant_select_network(struct wpa_supplicant *wpa_s, 1890 struct wpa_ssid *ssid) 1891{ 1892 1893 struct wpa_ssid *other_ssid; 1894 int disconnected = 0; 1895 1896 if (ssid && ssid != wpa_s->current_ssid && wpa_s->current_ssid) { 1897 wpa_supplicant_deauthenticate( 1898 wpa_s, WLAN_REASON_DEAUTH_LEAVING); 1899 disconnected = 1; 1900 } 1901 1902 if (ssid) 1903 wpas_clear_temp_disabled(wpa_s, ssid, 1); 1904 1905 /* 1906 * Mark all other networks disabled or mark all networks enabled if no 1907 * network specified. 1908 */ 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 */ 1914 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); 1918 1919 if (was_disabled != other_ssid->disabled) 1920 wpas_notify_network_enabled_changed(wpa_s, other_ssid); 1921 } 1922 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"); 1927 return; 1928 } 1929 1930 if (ssid) 1931 wpa_s->current_ssid = ssid; 1932 wpa_s->connect_without_scan = NULL; 1933 wpa_s->disconnected = 0; 1934 wpa_s->reassociate = 1; 1935 1936 if (wpa_supplicant_fast_associate(wpa_s) != 1) 1937 wpa_supplicant_req_scan(wpa_s, 0, disconnected ? 100000 : 0); 1938 1939 if (ssid) 1940 wpas_notify_network_selected(wpa_s, ssid); 1941} 1942 1943 1944/** 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 1949 * 1950 */ 1951int wpa_supplicant_set_ap_scan(struct wpa_supplicant *wpa_s, int ap_scan) 1952{ 1953 1954 int old_ap_scan; 1955 1956 if (ap_scan < 0 || ap_scan > 2) 1957 return -1; 1958 1959#ifdef ANDROID 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); 1965 return 0; 1966 } 1967#endif /* ANDROID */ 1968 1969 old_ap_scan = wpa_s->conf->ap_scan; 1970 wpa_s->conf->ap_scan = ap_scan; 1971 1972 if (old_ap_scan != wpa_s->conf->ap_scan) 1973 wpas_notify_ap_scan_changed(wpa_s); 1974 1975 return 0; 1976} 1977 1978 1979/** 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 1984 * 1985 */ 1986int wpa_supplicant_set_bss_expiration_age(struct wpa_supplicant *wpa_s, 1987 unsigned int bss_expire_age) 1988{ 1989 if (bss_expire_age < 10) { 1990 wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration age %u", 1991 bss_expire_age); 1992 return -1; 1993 } 1994 wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration age: %d sec", 1995 bss_expire_age); 1996 wpa_s->conf->bss_expiration_age = bss_expire_age; 1997 1998 return 0; 1999} 2000 2001 2002/** 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 2007 * 2008 */ 2009int wpa_supplicant_set_bss_expiration_count(struct wpa_supplicant *wpa_s, 2010 unsigned int bss_expire_count) 2011{ 2012 if (bss_expire_count < 1) { 2013 wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration count %u", 2014 bss_expire_count); 2015 return -1; 2016 } 2017 wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration scan count: %u", 2018 bss_expire_count); 2019 wpa_s->conf->bss_expiration_scan_count = bss_expire_count; 2020 2021 return 0; 2022} 2023 2024 2025/** 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 2030 * 2031 */ 2032int wpa_supplicant_set_scan_interval(struct wpa_supplicant *wpa_s, 2033 int scan_interval) 2034{ 2035 if (scan_interval < 0) { 2036 wpa_msg(wpa_s, MSG_ERROR, "Invalid scan interval %d", 2037 scan_interval); 2038 return -1; 2039 } 2040 wpa_msg(wpa_s, MSG_DEBUG, "Setting scan interval: %d sec", 2041 scan_interval); 2042 wpa_supplicant_update_scan_int(wpa_s, scan_interval); 2043 2044 return 0; 2045} 2046 2047 2048/** 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 2055 */ 2056int wpa_supplicant_set_debug_params(struct wpa_global *global, int debug_level, 2057 int debug_timestamp, int debug_show_keys) 2058{ 2059 2060 int old_level, old_timestamp, old_show_keys; 2061 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) 2069 return -1; 2070 2071 old_level = wpa_debug_level; 2072 old_timestamp = wpa_debug_timestamp; 2073 old_show_keys = wpa_debug_show_keys; 2074 2075 wpa_debug_level = debug_level; 2076 wpa_debug_timestamp = debug_timestamp ? 1 : 0; 2077 wpa_debug_show_keys = debug_show_keys ? 1 : 0; 2078 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); 2085 2086 return 0; 2087} 2088 2089 2090/** 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 2094 */ 2095struct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s) 2096{ 2097 struct wpa_ssid *entry; 2098 u8 ssid[MAX_SSID_LEN]; 2099 int res; 2100 size_t ssid_len; 2101 u8 bssid[ETH_ALEN]; 2102 int wired; 2103 2104 res = wpa_drv_get_ssid(wpa_s, ssid); 2105 if (res < 0) { 2106 wpa_msg(wpa_s, MSG_WARNING, "Could not read SSID from " 2107 "driver"); 2108 return NULL; 2109 } 2110 ssid_len = res; 2111 2112 if (wpa_drv_get_bssid(wpa_s, bssid) < 0) { 2113 wpa_msg(wpa_s, MSG_WARNING, "Could not read BSSID from " 2114 "driver"); 2115 return NULL; 2116 } 2117 2118 wired = wpa_s->conf->ap_scan == 0 && 2119 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED); 2120 2121 entry = wpa_s->conf->ssid; 2122 while (entry) { 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)) 2128 return entry; 2129#ifdef CONFIG_WPS 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)) 2135 return entry; 2136#endif /* CONFIG_WPS */ 2137 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) 2141 return entry; 2142 2143 entry = entry->next; 2144 } 2145 2146 return NULL; 2147} 2148 2149 2150static int select_driver(struct wpa_supplicant *wpa_s, int i) 2151{ 2152 struct wpa_global *global = wpa_s->global; 2153 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); 2159 return -1; 2160 } 2161 } 2162 2163 wpa_s->driver = wpa_drivers[i]; 2164 wpa_s->global_drv_priv = global->drv_priv[i]; 2165 2166 return 0; 2167} 2168 2169 2170static int wpa_supplicant_set_driver(struct wpa_supplicant *wpa_s, 2171 const char *name) 2172{ 2173 int i; 2174 size_t len; 2175 const char *pos, *driver = name; 2176 2177 if (wpa_s == NULL) 2178 return -1; 2179 2180 if (wpa_drivers[0] == NULL) { 2181 wpa_msg(wpa_s, MSG_ERROR, "No driver interfaces build into " 2182 "wpa_supplicant"); 2183 return -1; 2184 } 2185 2186 if (name == NULL) { 2187 /* default to first driver in the list */ 2188 return select_driver(wpa_s, 0); 2189 } 2190 2191 do { 2192 pos = os_strchr(driver, ','); 2193 if (pos) 2194 len = pos - driver; 2195 else 2196 len = os_strlen(driver); 2197 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) == 2201 0) { 2202 /* First driver that succeeds wins */ 2203 if (select_driver(wpa_s, i) == 0) 2204 return 0; 2205 } 2206 } 2207 2208 driver = pos + 1; 2209 } while (pos); 2210 2211 wpa_msg(wpa_s, MSG_ERROR, "Unsupported driver '%s'", name); 2212 return -1; 2213} 2214 2215 2216/** 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 2223 * 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. 2229 */ 2230void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr, 2231 const u8 *buf, size_t len) 2232{ 2233 struct wpa_supplicant *wpa_s = ctx; 2234 2235 wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR, MAC2STR(src_addr)); 2236 wpa_hexdump(MSG_MSGDUMP, "RX EAPOL", buf, len); 2237 2238 if (wpa_s->wpa_state < WPA_ASSOCIATED || 2239 (wpa_s->last_eapol_matches_bssid && 2240#ifdef CONFIG_AP 2241 !wpa_s->ap_iface && 2242#endif /* CONFIG_AP */ 2243 os_memcmp(src_addr, wpa_s->bssid, ETH_ALEN) != 0)) { 2244 /* 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). 2255 */ 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, 2265 ETH_ALEN); 2266 } 2267 return; 2268 } 2269 2270 wpa_s->last_eapol_matches_bssid = 2271 os_memcmp(src_addr, wpa_s->bssid, ETH_ALEN) == 0; 2272 2273#ifdef CONFIG_AP 2274 if (wpa_s->ap_iface) { 2275 wpa_supplicant_ap_rx_eapol(wpa_s, src_addr, buf, len); 2276 return; 2277 } 2278#endif /* CONFIG_AP */ 2279 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"); 2283 return; 2284 } 2285 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( 2294 wpa_s, 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) ? 2298 70 : 10, 0); 2299 } 2300 wpa_s->eapol_received++; 2301 2302 if (wpa_s->countermeasures) { 2303 wpa_msg(wpa_s, MSG_INFO, "WPA: Countermeasures - dropped " 2304 "EAPOL packet"); 2305 return; 2306 } 2307 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); 2312 return; 2313 } 2314#endif /* CONFIG_IBSS_RSN */ 2315 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. */ 2321 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) 2325 return; 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)) { 2330 /* 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. 2335 */ 2336 eapol_sm_notify_portValid(wpa_s->eapol, TRUE); 2337 } 2338} 2339 2340 2341int wpa_supplicant_update_mac_addr(struct wpa_supplicant *wpa_s) 2342{ 2343 if (wpa_s->driver->send_eapol) { 2344 const u8 *addr = wpa_drv_get_mac_addr(wpa_s); 2345 if (addr) 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), 2352 ETH_P_EAPOL, 2353 wpa_supplicant_rx_eapol, wpa_s, 0); 2354 if (wpa_s->l2 == NULL) 2355 return -1; 2356 } else { 2357 const u8 *addr = wpa_drv_get_mac_addr(wpa_s); 2358 if (addr) 2359 os_memcpy(wpa_s->own_addr, addr, ETH_ALEN); 2360 } 2361 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"); 2364 return -1; 2365 } 2366 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); 2370 2371 return 0; 2372} 2373 2374 2375static void wpa_supplicant_rx_eapol_bridge(void *ctx, const u8 *src_addr, 2376 const u8 *buf, size_t len) 2377{ 2378 struct wpa_supplicant *wpa_s = ctx; 2379 const struct l2_ethhdr *eth; 2380 2381 if (len < sizeof(*eth)) 2382 return; 2383 eth = (const struct l2_ethhdr *) buf; 2384 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)); 2390 return; 2391 } 2392 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)); 2397} 2398 2399 2400/** 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 2404 * 2405 * This function is called to initialize driver interface parameters. 2406 * wpa_drv_init() must have been called before this function to initialize the 2407 * driver interface. 2408 */ 2409int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s) 2410{ 2411 static int interface_count = 0; 2412 2413 if (wpa_supplicant_update_mac_addr(wpa_s) < 0) 2414 return -1; 2415 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, 2420 wpa_s->own_addr, 2421 ETH_P_EAPOL, 2422 wpa_supplicant_rx_eapol_bridge, 2423 wpa_s, 1); 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); 2428 return -1; 2429 } 2430 } 2431 2432 wpa_clear_keys(wpa_s, NULL); 2433 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); 2437 2438 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: flushing PMKID list in the driver"); 2439 wpa_drv_flush_pmkid(wpa_s); 2440 2441 wpa_s->prev_scan_ssid = WILDCARD_SSID_SCAN; 2442 wpa_s->prev_scan_wildcard = 0; 2443 2444 if (wpa_supplicant_enabled_networks(wpa_s)) { 2445 if (wpa_supplicant_delayed_sched_scan(wpa_s, interface_count, 2446 100000)) 2447 wpa_supplicant_req_scan(wpa_s, interface_count, 2448 100000); 2449 interface_count++; 2450 } else 2451 wpa_supplicant_set_state(wpa_s, WPA_INACTIVE); 2452 2453 return 0; 2454} 2455 2456 2457static int wpa_supplicant_daemon(const char *pid_file) 2458{ 2459 wpa_printf(MSG_DEBUG, "Daemonize.."); 2460 return os_daemonize(pid_file); 2461} 2462 2463 2464static struct wpa_supplicant * wpa_supplicant_alloc(void) 2465{ 2466 struct wpa_supplicant *wpa_s; 2467 2468 wpa_s = os_zalloc(sizeof(*wpa_s)); 2469 if (wpa_s == NULL) 2470 return NULL; 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; 2476 2477 return wpa_s; 2478} 2479 2480 2481#ifdef CONFIG_HT_OVERRIDES 2482 2483static int wpa_set_htcap_mcs(struct wpa_supplicant *wpa_s, 2484 struct ieee80211_ht_capabilities *htcaps, 2485 struct ieee80211_ht_capabilities *htcaps_mask, 2486 const char *ht_mcs) 2487{ 2488 /* parse ht_mcs into hex array */ 2489 int i; 2490 const char *tmp = ht_mcs; 2491 char *end = NULL; 2492 2493 /* If ht_mcs is null, do not set anything */ 2494 if (!ht_mcs) 2495 return 0; 2496 2497 /* This is what we are setting in the kernel */ 2498 os_memset(&htcaps->supported_mcs_set, 0, IEEE80211_HT_MCS_MASK_LEN); 2499 2500 wpa_msg(wpa_s, MSG_DEBUG, "set_htcap, ht_mcs -:%s:-", ht_mcs); 2501 2502 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) { 2503 errno = 0; 2504 long v = strtol(tmp, &end, 16); 2505 if (errno == 0) { 2506 wpa_msg(wpa_s, MSG_DEBUG, 2507 "htcap value[%i]: %ld end: %p tmp: %p", 2508 i, v, end, tmp); 2509 if (end == tmp) 2510 break; 2511 2512 htcaps->supported_mcs_set[i] = v; 2513 tmp = end; 2514 } else { 2515 wpa_msg(wpa_s, MSG_ERROR, 2516 "Failed to parse ht-mcs: %s, error: %s\n", 2517 ht_mcs, strerror(errno)); 2518 return -1; 2519 } 2520 } 2521 2522 /* 2523 * If we were able to parse any values, then set mask for the MCS set. 2524 */ 2525 if (i) { 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] = 2530 0x1f; 2531 } 2532 2533 return 0; 2534} 2535 2536 2537static int wpa_disable_max_amsdu(struct wpa_supplicant *wpa_s, 2538 struct ieee80211_ht_capabilities *htcaps, 2539 struct ieee80211_ht_capabilities *htcaps_mask, 2540 int disabled) 2541{ 2542 u16 msk; 2543 2544 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_max_amsdu: %d", disabled); 2545 2546 if (disabled == -1) 2547 return 0; 2548 2549 msk = host_to_le16(HT_CAP_INFO_MAX_AMSDU_SIZE); 2550 htcaps_mask->ht_capabilities_info |= msk; 2551 if (disabled) 2552 htcaps->ht_capabilities_info &= msk; 2553 else 2554 htcaps->ht_capabilities_info |= msk; 2555 2556 return 0; 2557} 2558 2559 2560static int wpa_set_ampdu_factor(struct wpa_supplicant *wpa_s, 2561 struct ieee80211_ht_capabilities *htcaps, 2562 struct ieee80211_ht_capabilities *htcaps_mask, 2563 int factor) 2564{ 2565 wpa_msg(wpa_s, MSG_DEBUG, "set_ampdu_factor: %d", factor); 2566 2567 if (factor == -1) 2568 return 0; 2569 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); 2573 return -EINVAL; 2574 } 2575 2576 htcaps_mask->a_mpdu_params |= 0x3; /* 2 bits for factor */ 2577 htcaps->a_mpdu_params &= ~0x3; 2578 htcaps->a_mpdu_params |= factor & 0x3; 2579 2580 return 0; 2581} 2582 2583 2584static int wpa_set_ampdu_density(struct wpa_supplicant *wpa_s, 2585 struct ieee80211_ht_capabilities *htcaps, 2586 struct ieee80211_ht_capabilities *htcaps_mask, 2587 int density) 2588{ 2589 wpa_msg(wpa_s, MSG_DEBUG, "set_ampdu_density: %d", density); 2590 2591 if (density == -1) 2592 return 0; 2593 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.", 2597 density); 2598 return -EINVAL; 2599 } 2600 2601 htcaps_mask->a_mpdu_params |= 0x1C; 2602 htcaps->a_mpdu_params &= ~(0x1C); 2603 htcaps->a_mpdu_params |= (density << 2) & 0x1C; 2604 2605 return 0; 2606} 2607 2608 2609static int wpa_set_disable_ht40(struct wpa_supplicant *wpa_s, 2610 struct ieee80211_ht_capabilities *htcaps, 2611 struct ieee80211_ht_capabilities *htcaps_mask, 2612 int disabled) 2613{ 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); 2617 2618 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_ht40: %d", disabled); 2619 2620 if (disabled) 2621 htcaps->ht_capabilities_info &= ~msk; 2622 else 2623 htcaps->ht_capabilities_info |= msk; 2624 2625 htcaps_mask->ht_capabilities_info |= msk; 2626 2627 return 0; 2628} 2629 2630 2631static int wpa_set_disable_sgi(struct wpa_supplicant *wpa_s, 2632 struct ieee80211_ht_capabilities *htcaps, 2633 struct ieee80211_ht_capabilities *htcaps_mask, 2634 int disabled) 2635{ 2636 /* Masking these out disables SGI */ 2637 u16 msk = host_to_le16(HT_CAP_INFO_SHORT_GI20MHZ | 2638 HT_CAP_INFO_SHORT_GI40MHZ); 2639 2640 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_sgi: %d", disabled); 2641 2642 if (disabled) 2643 htcaps->ht_capabilities_info &= ~msk; 2644 else 2645 htcaps->ht_capabilities_info |= msk; 2646 2647 htcaps_mask->ht_capabilities_info |= msk; 2648 2649 return 0; 2650} 2651 2652 2653void wpa_supplicant_apply_ht_overrides( 2654 struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid, 2655 struct wpa_driver_associate_params *params) 2656{ 2657 struct ieee80211_ht_capabilities *htcaps; 2658 struct ieee80211_ht_capabilities *htcaps_mask; 2659 2660 if (!ssid) 2661 return; 2662 2663 params->disable_ht = ssid->disable_ht; 2664 if (!params->htcaps || !params->htcaps_mask) 2665 return; 2666 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); 2676} 2677 2678#endif /* CONFIG_HT_OVERRIDES */ 2679 2680 2681#ifdef CONFIG_VHT_OVERRIDES 2682void wpa_supplicant_apply_vht_overrides( 2683 struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid, 2684 struct wpa_driver_associate_params *params) 2685{ 2686 struct ieee80211_vht_capabilities *vhtcaps; 2687 struct ieee80211_vht_capabilities *vhtcaps_mask; 2688 2689 if (!ssid) 2690 return; 2691 2692 params->disable_vht = ssid->disable_vht; 2693 2694 vhtcaps = (void *) params->vhtcaps; 2695 vhtcaps_mask = (void *) params->vhtcaps_mask; 2696 2697 if (!vhtcaps || !vhtcaps_mask) 2698 return; 2699 2700 vhtcaps->vht_capabilities_info = ssid->vht_capa; 2701 vhtcaps_mask->vht_capabilities_info = ssid->vht_capa_mask; 2702 2703#define OVERRIDE_MCS(i) \ 2704 if (ssid->vht_tx_mcs_nss_ ##i >= 0) { \ 2705 vhtcaps_mask->vht_supported_mcs_set.tx_map |= \ 2706 3 << 2 * (i - 1); \ 2707 vhtcaps->vht_supported_mcs_set.tx_map |= \ 2708 ssid->vht_tx_mcs_nss_ ##i << 2 * (i - 1); \ 2709 } \ 2710 if (ssid->vht_rx_mcs_nss_ ##i >= 0) { \ 2711 vhtcaps_mask->vht_supported_mcs_set.rx_map |= \ 2712 3 << 2 * (i - 1); \ 2713 vhtcaps->vht_supported_mcs_set.rx_map |= \ 2714 ssid->vht_rx_mcs_nss_ ##i << 2 * (i - 1); \ 2715 } 2716 2717 OVERRIDE_MCS(1); 2718 OVERRIDE_MCS(2); 2719 OVERRIDE_MCS(3); 2720 OVERRIDE_MCS(4); 2721 OVERRIDE_MCS(5); 2722 OVERRIDE_MCS(6); 2723 OVERRIDE_MCS(7); 2724 OVERRIDE_MCS(8); 2725} 2726#endif /* CONFIG_VHT_OVERRIDES */ 2727 2728 2729static int pcsc_reader_init(struct wpa_supplicant *wpa_s) 2730{ 2731#ifdef PCSC_FUNCS 2732 size_t len; 2733 2734 if (!wpa_s->conf->pcsc_reader) 2735 return 0; 2736 2737 wpa_s->scard = scard_init(SCARD_TRY_BOTH, wpa_s->conf->pcsc_reader); 2738 if (!wpa_s->scard) 2739 return 1; 2740 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"); 2746 return -1; 2747 } 2748 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"); 2754 return -1; 2755 } 2756 wpa_s->imsi[len] = '\0'; 2757 2758 wpa_s->mnc_len = scard_get_mnc_len(wpa_s->scard); 2759 2760 wpa_printf(MSG_DEBUG, "SCARD: IMSI %s (MNC length %d)", 2761 wpa_s->imsi, wpa_s->mnc_len); 2762 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 */ 2766 2767 return 0; 2768} 2769 2770 2771int wpas_init_ext_pw(struct wpa_supplicant *wpa_s) 2772{ 2773 char *val, *pos; 2774 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); 2778 2779 if (!wpa_s->conf->ext_password_backend) 2780 return 0; 2781 2782 val = os_strdup(wpa_s->conf->ext_password_backend); 2783 if (val == NULL) 2784 return -1; 2785 pos = os_strchr(val, ':'); 2786 if (pos) 2787 *pos++ = '\0'; 2788 2789 wpa_printf(MSG_DEBUG, "EXT PW: Initialize backend '%s'", val); 2790 2791 wpa_s->ext_pw = ext_password_init(val, pos); 2792 os_free(val); 2793 if (wpa_s->ext_pw == NULL) { 2794 wpa_printf(MSG_DEBUG, "EXT PW: Failed to initialize backend"); 2795 return -1; 2796 } 2797 eapol_sm_set_ext_pw_ctx(wpa_s->eapol, wpa_s->ext_pw); 2798 2799 return 0; 2800} 2801 2802 2803static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s, 2804 struct wpa_interface *iface) 2805{ 2806 const char *ifname, *driver; 2807 struct wpa_driver_capa capa; 2808 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"); 2815 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'.", 2822 iface->confname); 2823 return -1; 2824 } 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); 2834 return -1; 2835 } 2836 wpa_s->confanother = os_rel2abs_path(iface->confanother); 2837 wpa_config_read(wpa_s->confanother, wpa_s->conf); 2838 2839 /* 2840 * Override ctrl_interface and driver_param if set on command 2841 * line. 2842 */ 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); 2847 } 2848 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); 2853 } 2854 } else 2855 wpa_s->conf = wpa_config_alloc_empty(iface->ctrl_interface, 2856 iface->driver_param); 2857 2858 if (wpa_s->conf == NULL) { 2859 wpa_printf(MSG_ERROR, "\nNo configuration found."); 2860 return -1; 2861 } 2862 2863 if (iface->ifname == NULL) { 2864 wpa_printf(MSG_ERROR, "\nInterface name is required."); 2865 return -1; 2866 } 2867 if (os_strlen(iface->ifname) >= sizeof(wpa_s->ifname)) { 2868 wpa_printf(MSG_ERROR, "\nToo long interface name '%s'.", 2869 iface->ifname); 2870 return -1; 2871 } 2872 os_strlcpy(wpa_s->ifname, iface->ifname, sizeof(wpa_s->ifname)); 2873 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); 2879 return -1; 2880 } 2881 os_strlcpy(wpa_s->bridge_ifname, iface->bridge_ifname, 2882 sizeof(wpa_s->bridge_ifname)); 2883 } 2884 2885 /* RSNA Supplicant Key Management - INITIALIZE */ 2886 eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE); 2887 eapol_sm_notify_portValid(wpa_s->eapol, FALSE); 2888 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() 2892 * call. */ 2893 driver = iface->driver; 2894next_driver: 2895 if (wpa_supplicant_set_driver(wpa_s, driver) < 0) 2896 return -1; 2897 2898 wpa_s->drv_priv = wpa_drv_init(wpa_s, wpa_s->ifname); 2899 if (wpa_s->drv_priv == NULL) { 2900 const char *pos; 2901 pos = driver ? os_strchr(driver, ',') : NULL; 2902 if (pos) { 2903 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize " 2904 "driver interface - try next driver wrapper"); 2905 driver = pos + 1; 2906 goto next_driver; 2907 } 2908 wpa_msg(wpa_s, MSG_ERROR, "Failed to initialize driver " 2909 "interface"); 2910 return -1; 2911 } 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); 2915 return -1; 2916 } 2917 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)); 2923 } 2924 2925 if (wpa_supplicant_init_wpa(wpa_s) < 0) 2926 return -1; 2927 2928 wpa_sm_set_ifname(wpa_s->wpa, wpa_s->ifname, 2929 wpa_s->bridge_ifname[0] ? wpa_s->bridge_ifname : 2930 NULL); 2931 wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth); 2932 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"); 2938 return -1; 2939 } 2940 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"); 2946 return -1; 2947 } 2948 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"); 2954 return -1; 2955 } 2956 2957 wpa_s->hw.modes = wpa_drv_get_hw_feature_data(wpa_s, 2958 &wpa_s->hw.num_modes, 2959 &wpa_s->hw.flags); 2960 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; 2975 } 2976 if (wpa_s->max_remain_on_chan == 0) 2977 wpa_s->max_remain_on_chan = 1000; 2978 2979 if (wpa_supplicant_driver_init(wpa_s) < 0) 2980 return -1; 2981 2982#ifdef CONFIG_TDLS 2983 if (wpa_tdls_init(wpa_s->wpa)) 2984 return -1; 2985#endif /* CONFIG_TDLS */ 2986 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"); 2990 return -1; 2991 } 2992 2993 if (wpas_wps_init(wpa_s)) 2994 return -1; 2995 2996 if (wpa_supplicant_init_eapol(wpa_s) < 0) 2997 return -1; 2998 wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol); 2999 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); 3011 return -1; 3012 } 3013 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"); 3017 return -1; 3018 } 3019 3020#ifdef CONFIG_P2P 3021 if (wpas_p2p_init(wpa_s->global, wpa_s) < 0) { 3022 wpa_msg(wpa_s, MSG_ERROR, "Failed to init P2P"); 3023 return -1; 3024 } 3025#endif /* CONFIG_P2P */ 3026 3027 if (wpa_bss_init(wpa_s) < 0) 3028 return -1; 3029 3030 if (pcsc_reader_init(wpa_s) < 0) 3031 return -1; 3032 3033 if (wpas_init_ext_pw(wpa_s) < 0) 3034 return -1; 3035 3036 return 0; 3037} 3038 3039 3040static void wpa_supplicant_deinit_iface(struct wpa_supplicant *wpa_s, 3041 int notify, int terminate) 3042{ 3043 if (wpa_s->drv_priv) { 3044 wpa_supplicant_deauthenticate(wpa_s, 3045 WLAN_REASON_DEAUTH_LEAVING); 3046 3047 wpa_drv_set_countermeasures(wpa_s, 0); 3048 wpa_clear_keys(wpa_s, NULL); 3049 } 3050 3051 wpa_supplicant_cleanup(wpa_s); 3052 3053#ifdef CONFIG_P2P 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); 3058 } 3059#endif /* CONFIG_P2P */ 3060 3061 if (wpa_s->drv_priv) 3062 wpa_drv_deinit(wpa_s); 3063 3064 if (notify) 3065 wpas_notify_iface_removed(wpa_s); 3066 3067 if (terminate) 3068 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TERMINATING); 3069 3070 if (wpa_s->ctrl_iface) { 3071 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface); 3072 wpa_s->ctrl_iface = NULL; 3073 } 3074 3075 if (wpa_s->conf != NULL) { 3076 wpa_config_free(wpa_s->conf); 3077 wpa_s->conf = NULL; 3078 } 3079} 3080 3081 3082/** 3083 * wpa_supplicant_add_iface - Add a new network interface 3084 * @global: Pointer to global data from wpa_supplicant_init() 3085 * @iface: Interface configuration options 3086 * Returns: Pointer to the created interface or %NULL on failure 3087 * 3088 * This function is used to add new network interfaces for %wpa_supplicant. 3089 * This can be called before wpa_supplicant_run() to add interfaces before the 3090 * main event loop has been started. In addition, new interfaces can be added 3091 * dynamically while %wpa_supplicant is already running. This could happen, 3092 * e.g., when a hotplug network adapter is inserted. 3093 */ 3094struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global, 3095 struct wpa_interface *iface) 3096{ 3097 struct wpa_supplicant *wpa_s; 3098 struct wpa_interface t_iface; 3099 struct wpa_ssid *ssid; 3100 3101 if (global == NULL || iface == NULL) 3102 return NULL; 3103 3104 wpa_s = wpa_supplicant_alloc(); 3105 if (wpa_s == NULL) 3106 return NULL; 3107 3108 wpa_s->global = global; 3109 3110 t_iface = *iface; 3111 if (global->params.override_driver) { 3112 wpa_printf(MSG_DEBUG, "Override interface parameter: driver " 3113 "('%s' -> '%s')", 3114 iface->driver, global->params.override_driver); 3115 t_iface.driver = global->params.override_driver; 3116 } 3117 if (global->params.override_ctrl_interface) { 3118 wpa_printf(MSG_DEBUG, "Override interface parameter: " 3119 "ctrl_interface ('%s' -> '%s')", 3120 iface->ctrl_interface, 3121 global->params.override_ctrl_interface); 3122 t_iface.ctrl_interface = 3123 global->params.override_ctrl_interface; 3124 } 3125 if (wpa_supplicant_init_iface(wpa_s, &t_iface)) { 3126 wpa_printf(MSG_DEBUG, "Failed to add interface %s", 3127 iface->ifname); 3128 wpa_supplicant_deinit_iface(wpa_s, 0, 0); 3129 os_free(wpa_s); 3130 return NULL; 3131 } 3132 3133 /* Notify the control interfaces about new iface */ 3134 if (wpas_notify_iface_added(wpa_s)) { 3135 wpa_supplicant_deinit_iface(wpa_s, 1, 0); 3136 os_free(wpa_s); 3137 return NULL; 3138 } 3139 3140 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) 3141 wpas_notify_network_added(wpa_s, ssid); 3142 3143 wpa_s->next = global->ifaces; 3144 global->ifaces = wpa_s; 3145 3146 wpa_dbg(wpa_s, MSG_DEBUG, "Added interface %s", wpa_s->ifname); 3147 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED); 3148 3149 return wpa_s; 3150} 3151 3152 3153/** 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 3158 * 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. 3163 */ 3164int wpa_supplicant_remove_iface(struct wpa_global *global, 3165 struct wpa_supplicant *wpa_s, 3166 int terminate) 3167{ 3168 struct wpa_supplicant *prev; 3169 3170 /* Remove interface from the global list of interfaces */ 3171 prev = global->ifaces; 3172 if (prev == wpa_s) { 3173 global->ifaces = wpa_s->next; 3174 } else { 3175 while (prev && prev->next != wpa_s) 3176 prev = prev->next; 3177 if (prev == NULL) 3178 return -1; 3179 prev->next = wpa_s->next; 3180 } 3181 3182 wpa_dbg(wpa_s, MSG_DEBUG, "Removing interface %s", wpa_s->ifname); 3183 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); 3189 os_free(wpa_s); 3190 3191 return 0; 3192} 3193 3194 3195/** 3196 * wpa_supplicant_get_eap_mode - Get the current EAP mode 3197 * @wpa_s: Pointer to the network interface 3198 * Returns: Pointer to the eap mode or the string "UNKNOWN" if not found 3199 */ 3200const char * wpa_supplicant_get_eap_mode(struct wpa_supplicant *wpa_s) 3201{ 3202 const char *eapol_method; 3203 3204 if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) == 0 && 3205 wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA) { 3206 return "NO-EAP"; 3207 } 3208 3209 eapol_method = eapol_sm_get_method_name(wpa_s->eapol); 3210 if (eapol_method == NULL) 3211 return "UNKNOWN-EAP"; 3212 3213 return eapol_method; 3214} 3215 3216 3217/** 3218 * wpa_supplicant_get_iface - Get a new network interface 3219 * @global: Pointer to global data from wpa_supplicant_init() 3220 * @ifname: Interface name 3221 * Returns: Pointer to the interface or %NULL if not found 3222 */ 3223struct wpa_supplicant * wpa_supplicant_get_iface(struct wpa_global *global, 3224 const char *ifname) 3225{ 3226 struct wpa_supplicant *wpa_s; 3227 3228 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { 3229 if (os_strcmp(wpa_s->ifname, ifname) == 0) 3230 return wpa_s; 3231 } 3232 return NULL; 3233} 3234 3235 3236#ifndef CONFIG_NO_WPA_MSG 3237static const char * wpa_supplicant_msg_ifname_cb(void *ctx) 3238{ 3239 struct wpa_supplicant *wpa_s = ctx; 3240 if (wpa_s == NULL) 3241 return NULL; 3242 return wpa_s->ifname; 3243} 3244#endif /* CONFIG_NO_WPA_MSG */ 3245 3246 3247/** 3248 * wpa_supplicant_init - Initialize %wpa_supplicant 3249 * @params: Parameters for %wpa_supplicant 3250 * Returns: Pointer to global %wpa_supplicant data, or %NULL on failure 3251 * 3252 * This function is used to initialize %wpa_supplicant. After successful 3253 * initialization, the returned data pointer can be used to add and remove 3254 * network interfaces, and eventually, to deinitialize %wpa_supplicant. 3255 */ 3256struct wpa_global * wpa_supplicant_init(struct wpa_params *params) 3257{ 3258 struct wpa_global *global; 3259 int ret, i; 3260 3261 if (params == NULL) 3262 return NULL; 3263 3264#ifdef CONFIG_DRIVER_NDIS 3265 { 3266 void driver_ndis_init_ops(void); 3267 driver_ndis_init_ops(); 3268 } 3269#endif /* CONFIG_DRIVER_NDIS */ 3270 3271#ifndef CONFIG_NO_WPA_MSG 3272 wpa_msg_register_ifname_cb(wpa_supplicant_msg_ifname_cb); 3273#endif /* CONFIG_NO_WPA_MSG */ 3274 3275 wpa_debug_open_file(params->wpa_debug_file_path); 3276 if (params->wpa_debug_syslog) 3277 wpa_debug_open_syslog(); 3278 if (params->wpa_debug_tracing) { 3279 ret = wpa_debug_open_linux_tracing(); 3280 if (ret) { 3281 wpa_printf(MSG_ERROR, 3282 "Failed to enable trace logging"); 3283 return NULL; 3284 } 3285 } 3286 3287 ret = eap_register_methods(); 3288 if (ret) { 3289 wpa_printf(MSG_ERROR, "Failed to register EAP methods"); 3290 if (ret == -2) 3291 wpa_printf(MSG_ERROR, "Two or more EAP methods used " 3292 "the same EAP type."); 3293 return NULL; 3294 } 3295 3296 global = os_zalloc(sizeof(*global)); 3297 if (global == NULL) 3298 return NULL; 3299 dl_list_init(&global->p2p_srv_bonjour); 3300 dl_list_init(&global->p2p_srv_upnp); 3301 global->params.daemonize = params->daemonize; 3302 global->params.wait_for_monitor = params->wait_for_monitor; 3303 global->params.dbus_ctrl_interface = params->dbus_ctrl_interface; 3304 if (params->pid_file) 3305 global->params.pid_file = os_strdup(params->pid_file); 3306 if (params->ctrl_interface) 3307 global->params.ctrl_interface = 3308 os_strdup(params->ctrl_interface); 3309 if (params->override_driver) 3310 global->params.override_driver = 3311 os_strdup(params->override_driver); 3312 if (params->override_ctrl_interface) 3313 global->params.override_ctrl_interface = 3314 os_strdup(params->override_ctrl_interface); 3315 wpa_debug_level = global->params.wpa_debug_level = 3316 params->wpa_debug_level; 3317 wpa_debug_show_keys = global->params.wpa_debug_show_keys = 3318 params->wpa_debug_show_keys; 3319 wpa_debug_timestamp = global->params.wpa_debug_timestamp = 3320 params->wpa_debug_timestamp; 3321 3322 wpa_printf(MSG_DEBUG, "wpa_supplicant v" VERSION_STR); 3323 3324 if (eloop_init()) { 3325 wpa_printf(MSG_ERROR, "Failed to initialize event loop"); 3326 wpa_supplicant_deinit(global); 3327 return NULL; 3328 } 3329 3330 random_init(params->entropy_file); 3331 3332 global->ctrl_iface = wpa_supplicant_global_ctrl_iface_init(global); 3333 if (global->ctrl_iface == NULL) { 3334 wpa_supplicant_deinit(global); 3335 return NULL; 3336 } 3337 3338 if (wpas_notify_supplicant_initialized(global)) { 3339 wpa_supplicant_deinit(global); 3340 return NULL; 3341 } 3342 3343 for (i = 0; wpa_drivers[i]; i++) 3344 global->drv_count++; 3345 if (global->drv_count == 0) { 3346 wpa_printf(MSG_ERROR, "No drivers enabled"); 3347 wpa_supplicant_deinit(global); 3348 return NULL; 3349 } 3350 global->drv_priv = os_zalloc(global->drv_count * sizeof(void *)); 3351 if (global->drv_priv == NULL) { 3352 wpa_supplicant_deinit(global); 3353 return NULL; 3354 } 3355 3356#ifdef CONFIG_WIFI_DISPLAY 3357 if (wifi_display_init(global) < 0) { 3358 wpa_printf(MSG_ERROR, "Failed to initialize Wi-Fi Display"); 3359 wpa_supplicant_deinit(global); 3360 return NULL; 3361 } 3362#endif /* CONFIG_WIFI_DISPLAY */ 3363 3364 return global; 3365} 3366 3367 3368/** 3369 * wpa_supplicant_run - Run the %wpa_supplicant main event loop 3370 * @global: Pointer to global data from wpa_supplicant_init() 3371 * Returns: 0 after successful event loop run, -1 on failure 3372 * 3373 * This function starts the main event loop and continues running as long as 3374 * there are any remaining events. In most cases, this function is running as 3375 * long as the %wpa_supplicant process in still in use. 3376 */ 3377int wpa_supplicant_run(struct wpa_global *global) 3378{ 3379 struct wpa_supplicant *wpa_s; 3380 3381 if (global->params.daemonize && 3382 wpa_supplicant_daemon(global->params.pid_file)) 3383 return -1; 3384 3385 if (global->params.wait_for_monitor) { 3386 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) 3387 if (wpa_s->ctrl_iface) 3388 wpa_supplicant_ctrl_iface_wait( 3389 wpa_s->ctrl_iface); 3390 } 3391 3392 eloop_register_signal_terminate(wpa_supplicant_terminate, global); 3393 eloop_register_signal_reconfig(wpa_supplicant_reconfig, global); 3394 3395 eloop_run(); 3396 3397 return 0; 3398} 3399 3400 3401/** 3402 * wpa_supplicant_deinit - Deinitialize %wpa_supplicant 3403 * @global: Pointer to global data from wpa_supplicant_init() 3404 * 3405 * This function is called to deinitialize %wpa_supplicant and to free all 3406 * allocated resources. Remaining network interfaces will also be removed. 3407 */ 3408void wpa_supplicant_deinit(struct wpa_global *global) 3409{ 3410 int i; 3411 3412 if (global == NULL) 3413 return; 3414 3415#ifdef CONFIG_WIFI_DISPLAY 3416 wifi_display_deinit(global); 3417#endif /* CONFIG_WIFI_DISPLAY */ 3418#ifdef CONFIG_P2P 3419 wpas_p2p_deinit_global(global); 3420#endif /* CONFIG_P2P */ 3421 3422 while (global->ifaces) 3423 wpa_supplicant_remove_iface(global, global->ifaces, 1); 3424 3425 if (global->ctrl_iface) 3426 wpa_supplicant_global_ctrl_iface_deinit(global->ctrl_iface); 3427 3428 wpas_notify_supplicant_deinitialized(global); 3429 3430 eap_peer_unregister_methods(); 3431#ifdef CONFIG_AP 3432 eap_server_unregister_methods(); 3433#endif /* CONFIG_AP */ 3434 3435 for (i = 0; wpa_drivers[i] && global->drv_priv; i++) { 3436 if (!global->drv_priv[i]) 3437 continue; 3438 wpa_drivers[i]->global_deinit(global->drv_priv[i]); 3439 } 3440 os_free(global->drv_priv); 3441 3442 random_deinit(); 3443 3444 eloop_destroy(); 3445 3446 if (global->params.pid_file) { 3447 os_daemonize_terminate(global->params.pid_file); 3448 os_free(global->params.pid_file); 3449 } 3450 os_free(global->params.ctrl_interface); 3451 os_free(global->params.override_driver); 3452 os_free(global->params.override_ctrl_interface); 3453 3454 os_free(global->p2p_disallow_freq); 3455 3456 os_free(global); 3457 wpa_debug_close_syslog(); 3458 wpa_debug_close_file(); 3459 wpa_debug_close_linux_tracing(); 3460} 3461 3462 3463void wpa_supplicant_update_config(struct wpa_supplicant *wpa_s) 3464{ 3465 if ((wpa_s->conf->changed_parameters & CFG_CHANGED_COUNTRY) && 3466 wpa_s->conf->country[0] && wpa_s->conf->country[1]) { 3467 char country[3]; 3468 country[0] = wpa_s->conf->country[0]; 3469 country[1] = wpa_s->conf->country[1]; 3470 country[2] = '\0'; 3471 if (wpa_drv_set_country(wpa_s, country) < 0) { 3472 wpa_printf(MSG_ERROR, "Failed to set country code " 3473 "'%s'", country); 3474 } 3475 } 3476 3477 if (wpa_s->conf->changed_parameters & CFG_CHANGED_EXT_PW_BACKEND) 3478 wpas_init_ext_pw(wpa_s); 3479 3480#ifdef CONFIG_WPS 3481 wpas_wps_update_config(wpa_s); 3482#endif /* CONFIG_WPS */ 3483 3484#ifdef CONFIG_P2P 3485 wpas_p2p_update_config(wpa_s); 3486#endif /* CONFIG_P2P */ 3487 3488 wpa_s->conf->changed_parameters = 0; 3489} 3490 3491 3492static void add_freq(int *freqs, int *num_freqs, int freq) 3493{ 3494 int i; 3495 3496 for (i = 0; i < *num_freqs; i++) { 3497 if (freqs[i] == freq) 3498 return; 3499 } 3500 3501 freqs[*num_freqs] = freq; 3502 (*num_freqs)++; 3503} 3504 3505 3506static int * get_bss_freqs_in_ess(struct wpa_supplicant *wpa_s) 3507{ 3508 struct wpa_bss *bss, *cbss; 3509 const int max_freqs = 10; 3510 int *freqs; 3511 int num_freqs = 0; 3512 3513 freqs = os_zalloc(sizeof(int) * (max_freqs + 1)); 3514 if (freqs == NULL) 3515 return NULL; 3516 3517 cbss = wpa_s->current_bss; 3518 3519 dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) { 3520 if (bss == cbss) 3521 continue; 3522 if (bss->ssid_len == cbss->ssid_len && 3523 os_memcmp(bss->ssid, cbss->ssid, bss->ssid_len) == 0 && 3524 wpa_blacklist_get(wpa_s, bss->bssid) == NULL) { 3525 add_freq(freqs, &num_freqs, bss->freq); 3526 if (num_freqs == max_freqs) 3527 break; 3528 } 3529 } 3530 3531 if (num_freqs == 0) { 3532 os_free(freqs); 3533 freqs = NULL; 3534 } 3535 3536 return freqs; 3537} 3538 3539 3540void wpas_connection_failed(struct wpa_supplicant *wpa_s, const u8 *bssid) 3541{ 3542 int timeout; 3543 int count; 3544 int *freqs = NULL; 3545 3546 /* 3547 * Remove possible authentication timeout since the connection failed. 3548 */ 3549 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL); 3550 3551 /* 3552 * Add the failed BSSID into the blacklist and speed up next scan 3553 * attempt if there could be other APs that could accept association. 3554 * The current blacklist count indicates how many times we have tried 3555 * connecting to this AP and multiple attempts mean that other APs are 3556 * either not available or has already been tried, so that we can start 3557 * increasing the delay here to avoid constant scanning. 3558 */ 3559 count = wpa_blacklist_add(wpa_s, bssid); 3560 if (count == 1 && wpa_s->current_bss) { 3561 /* 3562 * This BSS was not in the blacklist before. If there is 3563 * another BSS available for the same ESS, we should try that 3564 * next. Otherwise, we may as well try this one once more 3565 * before allowing other, likely worse, ESSes to be considered. 3566 */ 3567 freqs = get_bss_freqs_in_ess(wpa_s); 3568 if (freqs) { 3569 wpa_dbg(wpa_s, MSG_DEBUG, "Another BSS in this ESS " 3570 "has been seen; try it next"); 3571 wpa_blacklist_add(wpa_s, bssid); 3572 /* 3573 * On the next scan, go through only the known channels 3574 * used in this ESS based on previous scans to speed up 3575 * common load balancing use case. 3576 */ 3577 os_free(wpa_s->next_scan_freqs); 3578 wpa_s->next_scan_freqs = freqs; 3579 } 3580 } 3581 3582 /* 3583 * Add previous failure count in case the temporary blacklist was 3584 * cleared due to no other BSSes being available. 3585 */ 3586 count += wpa_s->extra_blacklist_count; 3587 3588 switch (count) { 3589 case 1: 3590 timeout = 100; 3591 break; 3592 case 2: 3593 timeout = 500; 3594 break; 3595 case 3: 3596 timeout = 1000; 3597 break; 3598 case 4: 3599 timeout = 5000; 3600 break; 3601 default: 3602 timeout = 10000; 3603 break; 3604 } 3605 3606 wpa_dbg(wpa_s, MSG_DEBUG, "Blacklist count %d --> request scan in %d " 3607 "ms", count, timeout); 3608 3609 /* 3610 * TODO: if more than one possible AP is available in scan results, 3611 * could try the other ones before requesting a new scan. 3612 */ 3613 wpa_supplicant_req_scan(wpa_s, timeout / 1000, 3614 1000 * (timeout % 1000)); 3615 3616 wpas_p2p_continue_after_scan(wpa_s); 3617} 3618 3619 3620int wpas_driver_bss_selection(struct wpa_supplicant *wpa_s) 3621{ 3622 return wpa_s->conf->ap_scan == 2 || 3623 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_BSS_SELECTION); 3624} 3625 3626 3627#if defined(CONFIG_CTRL_IFACE) || defined(CONFIG_CTRL_IFACE_DBUS_NEW) 3628int wpa_supplicant_ctrl_iface_ctrl_rsp_handle(struct wpa_supplicant *wpa_s, 3629 struct wpa_ssid *ssid, 3630 const char *field, 3631 const char *value) 3632{ 3633#ifdef IEEE8021X_EAPOL 3634 struct eap_peer_config *eap = &ssid->eap; 3635 3636 wpa_printf(MSG_DEBUG, "CTRL_IFACE: response handle field=%s", field); 3637 wpa_hexdump_ascii_key(MSG_DEBUG, "CTRL_IFACE: response value", 3638 (const u8 *) value, os_strlen(value)); 3639 3640 switch (wpa_supplicant_ctrl_req_from_string(field)) { 3641 case WPA_CTRL_REQ_EAP_IDENTITY: 3642 os_free(eap->identity); 3643 eap->identity = (u8 *) os_strdup(value); 3644 eap->identity_len = os_strlen(value); 3645 eap->pending_req_identity = 0; 3646 if (ssid == wpa_s->current_ssid) 3647 wpa_s->reassociate = 1; 3648 break; 3649 case WPA_CTRL_REQ_EAP_PASSWORD: 3650 os_free(eap->password); 3651 eap->password = (u8 *) os_strdup(value); 3652 eap->password_len = os_strlen(value); 3653 eap->pending_req_password = 0; 3654 if (ssid == wpa_s->current_ssid) 3655 wpa_s->reassociate = 1; 3656 break; 3657 case WPA_CTRL_REQ_EAP_NEW_PASSWORD: 3658 os_free(eap->new_password); 3659 eap->new_password = (u8 *) os_strdup(value); 3660 eap->new_password_len = os_strlen(value); 3661 eap->pending_req_new_password = 0; 3662 if (ssid == wpa_s->current_ssid) 3663 wpa_s->reassociate = 1; 3664 break; 3665 case WPA_CTRL_REQ_EAP_PIN: 3666 os_free(eap->pin); 3667 eap->pin = os_strdup(value); 3668 eap->pending_req_pin = 0; 3669 if (ssid == wpa_s->current_ssid) 3670 wpa_s->reassociate = 1; 3671 break; 3672 case WPA_CTRL_REQ_EAP_OTP: 3673 os_free(eap->otp); 3674 eap->otp = (u8 *) os_strdup(value); 3675 eap->otp_len = os_strlen(value); 3676 os_free(eap->pending_req_otp); 3677 eap->pending_req_otp = NULL; 3678 eap->pending_req_otp_len = 0; 3679 break; 3680 case WPA_CTRL_REQ_EAP_PASSPHRASE: 3681 os_free(eap->private_key_passwd); 3682 eap->private_key_passwd = (u8 *) os_strdup(value); 3683 eap->pending_req_passphrase = 0; 3684 if (ssid == wpa_s->current_ssid) 3685 wpa_s->reassociate = 1; 3686 break; 3687 default: 3688 wpa_printf(MSG_DEBUG, "CTRL_IFACE: Unknown field '%s'", field); 3689 return -1; 3690 } 3691 3692 return 0; 3693#else /* IEEE8021X_EAPOL */ 3694 wpa_printf(MSG_DEBUG, "CTRL_IFACE: IEEE 802.1X not included"); 3695 return -1; 3696#endif /* IEEE8021X_EAPOL */ 3697} 3698#endif /* CONFIG_CTRL_IFACE || CONFIG_CTRL_IFACE_DBUS_NEW */ 3699 3700 3701int wpas_network_disabled(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid) 3702{ 3703 int i; 3704 unsigned int drv_enc; 3705 3706 if (ssid == NULL) 3707 return 1; 3708 3709 if (ssid->disabled) 3710 return 1; 3711 3712 if (wpa_s && wpa_s->drv_capa_known) 3713 drv_enc = wpa_s->drv_enc; 3714 else 3715 drv_enc = (unsigned int) -1; 3716 3717 for (i = 0; i < NUM_WEP_KEYS; i++) { 3718 size_t len = ssid->wep_key_len[i]; 3719 if (len == 0) 3720 continue; 3721 if (len == 5 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP40)) 3722 continue; 3723 if (len == 13 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP104)) 3724 continue; 3725 if (len == 16 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP128)) 3726 continue; 3727 return 1; /* invalid WEP key */ 3728 } 3729 3730 if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt) && !ssid->psk_set && 3731 !ssid->ext_psk) 3732 return 1; 3733 3734 return 0; 3735} 3736 3737 3738int wpas_is_p2p_prioritized(struct wpa_supplicant *wpa_s) 3739{ 3740 if (wpa_s->global->conc_pref == WPA_CONC_PREF_P2P) 3741 return 1; 3742 if (wpa_s->global->conc_pref == WPA_CONC_PREF_STA) 3743 return 0; 3744 return -1; 3745} 3746 3747 3748void wpas_auth_failed(struct wpa_supplicant *wpa_s) 3749{ 3750 struct wpa_ssid *ssid = wpa_s->current_ssid; 3751 int dur; 3752 struct os_time now; 3753 3754 if (ssid == NULL) { 3755 wpa_printf(MSG_DEBUG, "Authentication failure but no known " 3756 "SSID block"); 3757 return; 3758 } 3759 3760 if (ssid->key_mgmt == WPA_KEY_MGMT_WPS) 3761 return; 3762 3763 ssid->auth_failures++; 3764 if (ssid->auth_failures > 50) 3765 dur = 300; 3766 else if (ssid->auth_failures > 20) 3767 dur = 120; 3768 else if (ssid->auth_failures > 10) 3769 dur = 60; 3770 else if (ssid->auth_failures > 5) 3771 dur = 30; 3772 else if (ssid->auth_failures > 1) 3773 dur = 20; 3774 else 3775 dur = 10; 3776 3777 os_get_time(&now); 3778 if (now.sec + dur <= ssid->disabled_until.sec) 3779 return; 3780 3781 ssid->disabled_until.sec = now.sec + dur; 3782 3783 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TEMP_DISABLED 3784 "id=%d ssid=\"%s\" auth_failures=%u duration=%d", 3785 ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len), 3786 ssid->auth_failures, dur); 3787} 3788 3789 3790void wpas_clear_temp_disabled(struct wpa_supplicant *wpa_s, 3791 struct wpa_ssid *ssid, int clear_failures) 3792{ 3793 if (ssid == NULL) 3794 return; 3795 3796 if (ssid->disabled_until.sec) { 3797 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_REENABLED 3798 "id=%d ssid=\"%s\"", 3799 ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len)); 3800 } 3801 ssid->disabled_until.sec = 0; 3802 ssid->disabled_until.usec = 0; 3803 if (clear_failures) 3804 ssid->auth_failures = 0; 3805} 3806 3807 3808int disallowed_bssid(struct wpa_supplicant *wpa_s, const u8 *bssid) 3809{ 3810 size_t i; 3811 3812 if (wpa_s->disallow_aps_bssid == NULL) 3813 return 0; 3814 3815 for (i = 0; i < wpa_s->disallow_aps_bssid_count; i++) { 3816 if (os_memcmp(wpa_s->disallow_aps_bssid + i * ETH_ALEN, 3817 bssid, ETH_ALEN) == 0) 3818 return 1; 3819 } 3820 3821 return 0; 3822} 3823 3824 3825int disallowed_ssid(struct wpa_supplicant *wpa_s, const u8 *ssid, 3826 size_t ssid_len) 3827{ 3828 size_t i; 3829 3830 if (wpa_s->disallow_aps_ssid == NULL || ssid == NULL) 3831 return 0; 3832 3833 for (i = 0; i < wpa_s->disallow_aps_ssid_count; i++) { 3834 struct wpa_ssid_value *s = &wpa_s->disallow_aps_ssid[i]; 3835 if (ssid_len == s->ssid_len && 3836 os_memcmp(ssid, s->ssid, ssid_len) == 0) 3837 return 1; 3838 } 3839 3840 return 0; 3841} 3842 3843 3844/** 3845 * wpas_request_connection - Request a new connection 3846 * @wpa_s: Pointer to the network interface 3847 * 3848 * This function is used to request a new connection to be found. It will mark 3849 * the interface to allow reassociation and request a new scan to find a 3850 * suitable network to connect to. 3851 */ 3852void wpas_request_connection(struct wpa_supplicant *wpa_s) 3853{ 3854 wpa_s->normal_scans = 0; 3855 wpa_supplicant_reinit_autoscan(wpa_s); 3856 wpa_s->extra_blacklist_count = 0; 3857 wpa_s->disconnected = 0; 3858 wpa_s->reassociate = 1; 3859 3860 if (wpa_supplicant_fast_associate(wpa_s) != 1) 3861 wpa_supplicant_req_scan(wpa_s, 0, 0); 3862} 3863