1 /* 2 * WPA Supplicant 3 * Copyright (c) 2003-2024, 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 #ifdef CONFIG_MATCH_IFACE 15 #include <net/if.h> 16 #include <fnmatch.h> 17 #endif /* CONFIG_MATCH_IFACE */ 18 19 #include "common.h" 20 #include "crypto/crypto.h" 21 #include "crypto/random.h" 22 #include "crypto/sha1.h" 23 #include "eapol_supp/eapol_supp_sm.h" 24 #include "eap_peer/eap.h" 25 #include "eap_peer/eap_proxy.h" 26 #include "eap_server/eap_methods.h" 27 #include "rsn_supp/wpa.h" 28 #include "eloop.h" 29 #include "config.h" 30 #include "utils/ext_password.h" 31 #include "l2_packet/l2_packet.h" 32 #include "wpa_supplicant_i.h" 33 #include "driver_i.h" 34 #include "ctrl_iface.h" 35 #include "pcsc_funcs.h" 36 #include "common/version.h" 37 #include "rsn_supp/preauth.h" 38 #include "rsn_supp/pmksa_cache.h" 39 #include "common/wpa_ctrl.h" 40 #include "common/ieee802_11_common.h" 41 #include "common/ieee802_11_defs.h" 42 #include "common/hw_features_common.h" 43 #include "common/gas_server.h" 44 #include "common/dpp.h" 45 #include "common/ptksa_cache.h" 46 #include "p2p/p2p.h" 47 #include "fst/fst.h" 48 #include "bssid_ignore.h" 49 #include "wpas_glue.h" 50 #include "wps_supplicant.h" 51 #include "ibss_rsn.h" 52 #include "sme.h" 53 #include "gas_query.h" 54 #include "ap.h" 55 #include "p2p_supplicant.h" 56 #include "wifi_display.h" 57 #include "notify.h" 58 #include "bgscan.h" 59 #include "autoscan.h" 60 #include "bss.h" 61 #include "scan.h" 62 #include "offchannel.h" 63 #include "hs20_supplicant.h" 64 #include "wnm_sta.h" 65 #include "wpas_kay.h" 66 #include "mesh.h" 67 #include "dpp_supplicant.h" 68 #include "nan_usd.h" 69 #ifdef CONFIG_MESH 70 #include "ap/ap_config.h" 71 #include "ap/hostapd.h" 72 #endif /* CONFIG_MESH */ 73 74 const char *const wpa_supplicant_version = 75 "wpa_supplicant v" VERSION_STR "\n" 76 "Copyright (c) 2003-2024, Jouni Malinen <j@w1.fi> and contributors"; 77 78 const char *const wpa_supplicant_license = 79 "This software may be distributed under the terms of the BSD license.\n" 80 "See README for more details.\n" 81 #ifdef EAP_TLS_OPENSSL 82 "\nThis product includes software developed by the OpenSSL Project\n" 83 "for use in the OpenSSL Toolkit (http://www.openssl.org/)\n" 84 #endif /* EAP_TLS_OPENSSL */ 85 ; 86 87 #ifndef CONFIG_NO_STDOUT_DEBUG 88 /* Long text divided into parts in order to fit in C89 strings size limits. */ 89 const char *const wpa_supplicant_full_license1 = 90 ""; 91 const char *const wpa_supplicant_full_license2 = 92 "This software may be distributed under the terms of the BSD license.\n" 93 "\n" 94 "Redistribution and use in source and binary forms, with or without\n" 95 "modification, are permitted provided that the following conditions are\n" 96 "met:\n" 97 "\n"; 98 const char *const wpa_supplicant_full_license3 = 99 "1. Redistributions of source code must retain the above copyright\n" 100 " notice, this list of conditions and the following disclaimer.\n" 101 "\n" 102 "2. Redistributions in binary form must reproduce the above copyright\n" 103 " notice, this list of conditions and the following disclaimer in the\n" 104 " documentation and/or other materials provided with the distribution.\n" 105 "\n"; 106 const char *const wpa_supplicant_full_license4 = 107 "3. Neither the name(s) of the above-listed copyright holder(s) nor the\n" 108 " names of its contributors may be used to endorse or promote products\n" 109 " derived from this software without specific prior written permission.\n" 110 "\n" 111 "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n" 112 "\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n" 113 "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n" 114 "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n"; 115 const char *const wpa_supplicant_full_license5 = 116 "OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n" 117 "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n" 118 "LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n" 119 "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n" 120 "THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n" 121 "(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n" 122 "OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" 123 "\n"; 124 #endif /* CONFIG_NO_STDOUT_DEBUG */ 125 126 127 static void wpa_bss_tmp_disallow_timeout(void *eloop_ctx, void *timeout_ctx); 128 static void wpas_verify_ssid_beacon(void *eloop_ctx, void *timeout_ctx); 129 #if defined(CONFIG_FILS) && defined(IEEE8021X_EAPOL) 130 static void wpas_update_fils_connect_params(struct wpa_supplicant *wpa_s); 131 #endif /* CONFIG_FILS && IEEE8021X_EAPOL */ 132 #ifdef CONFIG_OWE 133 static void wpas_update_owe_connect_params(struct wpa_supplicant *wpa_s); 134 #endif /* CONFIG_OWE */ 135 136 137 #ifdef CONFIG_WEP 138 /* Configure default/group WEP keys for static WEP */ 139 int wpa_set_wep_keys(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid) 140 { 141 int i, set = 0; 142 143 for (i = 0; i < NUM_WEP_KEYS; i++) { 144 if (ssid->wep_key_len[i] == 0) 145 continue; 146 147 set = 1; 148 wpa_drv_set_key(wpa_s, -1, WPA_ALG_WEP, NULL, 149 i, i == ssid->wep_tx_keyidx, NULL, 0, 150 ssid->wep_key[i], ssid->wep_key_len[i], 151 i == ssid->wep_tx_keyidx ? 152 KEY_FLAG_GROUP_RX_TX_DEFAULT : 153 KEY_FLAG_GROUP_RX_TX); 154 } 155 156 return set; 157 } 158 #endif /* CONFIG_WEP */ 159 160 161 int wpa_supplicant_set_wpa_none_key(struct wpa_supplicant *wpa_s, 162 struct wpa_ssid *ssid) 163 { 164 u8 key[32]; 165 size_t keylen; 166 enum wpa_alg alg; 167 u8 seq[6] = { 0 }; 168 int ret; 169 170 /* IBSS/WPA-None uses only one key (Group) for both receiving and 171 * sending unicast and multicast packets. */ 172 173 if (ssid->mode != WPAS_MODE_IBSS) { 174 wpa_msg(wpa_s, MSG_INFO, "WPA: Invalid mode %d (not " 175 "IBSS/ad-hoc) for WPA-None", ssid->mode); 176 return -1; 177 } 178 179 if (!ssid->psk_set) { 180 wpa_msg(wpa_s, MSG_INFO, "WPA: No PSK configured for " 181 "WPA-None"); 182 return -1; 183 } 184 185 switch (wpa_s->group_cipher) { 186 case WPA_CIPHER_CCMP: 187 os_memcpy(key, ssid->psk, 16); 188 keylen = 16; 189 alg = WPA_ALG_CCMP; 190 break; 191 case WPA_CIPHER_GCMP: 192 os_memcpy(key, ssid->psk, 16); 193 keylen = 16; 194 alg = WPA_ALG_GCMP; 195 break; 196 case WPA_CIPHER_TKIP: 197 /* WPA-None uses the same Michael MIC key for both TX and RX */ 198 os_memcpy(key, ssid->psk, 16 + 8); 199 os_memcpy(key + 16 + 8, ssid->psk + 16, 8); 200 keylen = 32; 201 alg = WPA_ALG_TKIP; 202 break; 203 default: 204 wpa_msg(wpa_s, MSG_INFO, "WPA: Invalid group cipher %d for " 205 "WPA-None", wpa_s->group_cipher); 206 return -1; 207 } 208 209 /* TODO: should actually remember the previously used seq#, both for TX 210 * and RX from each STA.. */ 211 212 ret = wpa_drv_set_key(wpa_s, -1, alg, NULL, 0, 1, seq, 6, key, keylen, 213 KEY_FLAG_GROUP_RX_TX_DEFAULT); 214 os_memset(key, 0, sizeof(key)); 215 return ret; 216 } 217 218 219 static void wpa_supplicant_timeout(void *eloop_ctx, void *timeout_ctx) 220 { 221 struct wpa_supplicant *wpa_s = eloop_ctx; 222 const u8 *bssid = wpa_s->bssid; 223 if (!is_zero_ether_addr(wpa_s->pending_bssid) && 224 (wpa_s->wpa_state == WPA_AUTHENTICATING || 225 wpa_s->wpa_state == WPA_ASSOCIATING)) 226 bssid = wpa_s->pending_bssid; 227 wpa_msg(wpa_s, MSG_INFO, "Authentication with " MACSTR " timed out.", 228 MAC2STR(bssid)); 229 wpa_bssid_ignore_add(wpa_s, bssid); 230 wpa_sm_notify_disassoc(wpa_s->wpa); 231 wpa_supplicant_deauthenticate(wpa_s, WLAN_REASON_DEAUTH_LEAVING); 232 wpa_s->reassociate = 1; 233 234 /* 235 * If we timed out, the AP or the local radio may be busy. 236 * So, wait a second until scanning again. 237 */ 238 wpa_supplicant_req_scan(wpa_s, 1, 0); 239 } 240 241 242 /** 243 * wpa_supplicant_req_auth_timeout - Schedule a timeout for authentication 244 * @wpa_s: Pointer to wpa_supplicant data 245 * @sec: Number of seconds after which to time out authentication 246 * @usec: Number of microseconds after which to time out authentication 247 * 248 * This function is used to schedule a timeout for the current authentication 249 * attempt. 250 */ 251 void wpa_supplicant_req_auth_timeout(struct wpa_supplicant *wpa_s, 252 int sec, int usec) 253 { 254 if (wpa_s->conf->ap_scan == 0 && 255 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED)) 256 return; 257 258 wpa_dbg(wpa_s, MSG_DEBUG, "Setting authentication timeout: %d sec " 259 "%d usec", sec, usec); 260 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL); 261 wpa_s->last_auth_timeout_sec = sec; 262 eloop_register_timeout(sec, usec, wpa_supplicant_timeout, wpa_s, NULL); 263 } 264 265 266 /* 267 * wpas_auth_timeout_restart - Restart and change timeout for authentication 268 * @wpa_s: Pointer to wpa_supplicant data 269 * @sec_diff: difference in seconds applied to original timeout value 270 */ 271 void wpas_auth_timeout_restart(struct wpa_supplicant *wpa_s, int sec_diff) 272 { 273 int new_sec = wpa_s->last_auth_timeout_sec + sec_diff; 274 275 if (eloop_is_timeout_registered(wpa_supplicant_timeout, wpa_s, NULL)) { 276 wpa_dbg(wpa_s, MSG_DEBUG, 277 "Authentication timeout restart: %d sec", new_sec); 278 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL); 279 eloop_register_timeout(new_sec, 0, wpa_supplicant_timeout, 280 wpa_s, NULL); 281 } 282 } 283 284 285 /** 286 * wpa_supplicant_cancel_auth_timeout - Cancel authentication timeout 287 * @wpa_s: Pointer to wpa_supplicant data 288 * 289 * This function is used to cancel authentication timeout scheduled with 290 * wpa_supplicant_req_auth_timeout() and it is called when authentication has 291 * been completed. 292 */ 293 void wpa_supplicant_cancel_auth_timeout(struct wpa_supplicant *wpa_s) 294 { 295 wpa_dbg(wpa_s, MSG_DEBUG, "Cancelling authentication timeout"); 296 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL); 297 wpa_bssid_ignore_del(wpa_s, wpa_s->bssid); 298 os_free(wpa_s->last_con_fail_realm); 299 wpa_s->last_con_fail_realm = NULL; 300 wpa_s->last_con_fail_realm_len = 0; 301 } 302 303 304 /** 305 * wpa_supplicant_initiate_eapol - Configure EAPOL state machine 306 * @wpa_s: Pointer to wpa_supplicant data 307 * 308 * This function is used to configure EAPOL state machine based on the selected 309 * authentication mode. 310 */ 311 void wpa_supplicant_initiate_eapol(struct wpa_supplicant *wpa_s) 312 { 313 #ifdef IEEE8021X_EAPOL 314 struct eapol_config eapol_conf; 315 struct wpa_ssid *ssid = wpa_s->current_ssid; 316 317 #ifdef CONFIG_IBSS_RSN 318 if (ssid->mode == WPAS_MODE_IBSS && 319 wpa_s->key_mgmt != WPA_KEY_MGMT_NONE && 320 wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) { 321 /* 322 * RSN IBSS authentication is per-STA and we can disable the 323 * per-BSSID EAPOL authentication. 324 */ 325 eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized); 326 eapol_sm_notify_eap_success(wpa_s->eapol, true); 327 eapol_sm_notify_eap_fail(wpa_s->eapol, false); 328 return; 329 } 330 #endif /* CONFIG_IBSS_RSN */ 331 332 eapol_sm_notify_eap_success(wpa_s->eapol, false); 333 eapol_sm_notify_eap_fail(wpa_s->eapol, false); 334 335 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE || 336 wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) 337 eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized); 338 else 339 eapol_sm_notify_portControl(wpa_s->eapol, Auto); 340 341 os_memset(&eapol_conf, 0, sizeof(eapol_conf)); 342 if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) { 343 eapol_conf.accept_802_1x_keys = 1; 344 eapol_conf.required_keys = 0; 345 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_UNICAST) { 346 eapol_conf.required_keys |= EAPOL_REQUIRE_KEY_UNICAST; 347 } 348 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_BROADCAST) { 349 eapol_conf.required_keys |= 350 EAPOL_REQUIRE_KEY_BROADCAST; 351 } 352 353 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED) 354 eapol_conf.required_keys = 0; 355 } 356 eapol_conf.fast_reauth = wpa_s->conf->fast_reauth; 357 eapol_conf.workaround = ssid->eap_workaround; 358 eapol_conf.eap_disabled = 359 !wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) && 360 wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA && 361 wpa_s->key_mgmt != WPA_KEY_MGMT_WPS; 362 eapol_conf.external_sim = wpa_s->conf->external_sim; 363 364 #ifdef CONFIG_WPS 365 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) { 366 eapol_conf.wps |= EAPOL_LOCAL_WPS_IN_USE; 367 if (wpa_s->current_bss) { 368 struct wpabuf *ie; 369 ie = wpa_bss_get_vendor_ie_multi(wpa_s->current_bss, 370 WPS_IE_VENDOR_TYPE); 371 if (ie) { 372 if (wps_is_20(ie)) 373 eapol_conf.wps |= 374 EAPOL_PEER_IS_WPS20_AP; 375 wpabuf_free(ie); 376 } 377 } 378 } 379 #endif /* CONFIG_WPS */ 380 381 eapol_sm_notify_config(wpa_s->eapol, &ssid->eap, &eapol_conf); 382 383 #ifdef CONFIG_MACSEC 384 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE && ssid->mka_psk_set) 385 ieee802_1x_create_preshared_mka(wpa_s, ssid); 386 else 387 ieee802_1x_alloc_kay_sm(wpa_s, ssid); 388 #endif /* CONFIG_MACSEC */ 389 #endif /* IEEE8021X_EAPOL */ 390 } 391 392 393 /** 394 * wpa_supplicant_set_non_wpa_policy - Set WPA parameters to non-WPA mode 395 * @wpa_s: Pointer to wpa_supplicant data 396 * @ssid: Configuration data for the network 397 * 398 * This function is used to configure WPA state machine and related parameters 399 * to a mode where WPA is not enabled. This is called as part of the 400 * authentication configuration when the selected network does not use WPA. 401 */ 402 void wpa_supplicant_set_non_wpa_policy(struct wpa_supplicant *wpa_s, 403 struct wpa_ssid *ssid) 404 { 405 #ifdef CONFIG_WEP 406 int i; 407 #endif /* CONFIG_WEP */ 408 struct wpa_sm_mlo mlo; 409 410 if (ssid->key_mgmt & WPA_KEY_MGMT_WPS) 411 wpa_s->key_mgmt = WPA_KEY_MGMT_WPS; 412 else if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) 413 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_NO_WPA; 414 else 415 wpa_s->key_mgmt = WPA_KEY_MGMT_NONE; 416 wpa_sm_set_ap_wpa_ie(wpa_s->wpa, NULL, 0); 417 wpa_sm_set_ap_rsn_ie(wpa_s->wpa, NULL, 0); 418 wpa_sm_set_ap_rsnxe(wpa_s->wpa, NULL, 0); 419 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0); 420 wpa_sm_set_assoc_rsnxe(wpa_s->wpa, NULL, 0); 421 wpa_s->rsnxe_len = 0; 422 wpa_s->pairwise_cipher = WPA_CIPHER_NONE; 423 wpa_s->group_cipher = WPA_CIPHER_NONE; 424 wpa_s->mgmt_group_cipher = 0; 425 426 #ifdef CONFIG_WEP 427 for (i = 0; i < NUM_WEP_KEYS; i++) { 428 if (ssid->wep_key_len[i] > 5) { 429 wpa_s->pairwise_cipher = WPA_CIPHER_WEP104; 430 wpa_s->group_cipher = WPA_CIPHER_WEP104; 431 break; 432 } else if (ssid->wep_key_len[i] > 0) { 433 wpa_s->pairwise_cipher = WPA_CIPHER_WEP40; 434 wpa_s->group_cipher = WPA_CIPHER_WEP40; 435 break; 436 } 437 } 438 #endif /* CONFIG_WEP */ 439 440 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED, 0); 441 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt); 442 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE, 443 wpa_s->pairwise_cipher); 444 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher); 445 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP, 446 wpa_s->mgmt_group_cipher); 447 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_SSID_PROTECTION, 0); 448 449 pmksa_cache_clear_current(wpa_s->wpa); 450 os_memset(&mlo, 0, sizeof(mlo)); 451 wpa_sm_set_mlo_params(wpa_s->wpa, &mlo); 452 } 453 454 455 void free_hw_features(struct wpa_supplicant *wpa_s) 456 { 457 int i; 458 if (wpa_s->hw.modes == NULL) 459 return; 460 461 for (i = 0; i < wpa_s->hw.num_modes; i++) { 462 os_free(wpa_s->hw.modes[i].channels); 463 os_free(wpa_s->hw.modes[i].rates); 464 } 465 466 os_free(wpa_s->hw.modes); 467 wpa_s->hw.modes = NULL; 468 } 469 470 471 static void remove_bss_tmp_disallowed_entry(struct wpa_supplicant *wpa_s, 472 struct wpa_bss_tmp_disallowed *bss) 473 { 474 eloop_cancel_timeout(wpa_bss_tmp_disallow_timeout, wpa_s, bss); 475 dl_list_del(&bss->list); 476 os_free(bss); 477 } 478 479 480 void free_bss_tmp_disallowed(struct wpa_supplicant *wpa_s) 481 { 482 struct wpa_bss_tmp_disallowed *bss, *prev; 483 484 dl_list_for_each_safe(bss, prev, &wpa_s->bss_tmp_disallowed, 485 struct wpa_bss_tmp_disallowed, list) 486 remove_bss_tmp_disallowed_entry(wpa_s, bss); 487 } 488 489 490 void wpas_flush_fils_hlp_req(struct wpa_supplicant *wpa_s) 491 { 492 struct fils_hlp_req *req; 493 494 while ((req = dl_list_first(&wpa_s->fils_hlp_req, struct fils_hlp_req, 495 list)) != NULL) { 496 dl_list_del(&req->list); 497 wpabuf_free(req->pkt); 498 os_free(req); 499 } 500 } 501 502 503 void wpas_clear_disabled_interface(void *eloop_ctx, void *timeout_ctx) 504 { 505 struct wpa_supplicant *wpa_s = eloop_ctx; 506 507 if (wpa_s->wpa_state != WPA_INTERFACE_DISABLED) 508 return; 509 wpa_dbg(wpa_s, MSG_DEBUG, "Clear cached state on disabled interface"); 510 wpa_bss_flush(wpa_s); 511 } 512 513 514 #ifdef CONFIG_TESTING_OPTIONS 515 void wpas_clear_driver_signal_override(struct wpa_supplicant *wpa_s) 516 { 517 struct driver_signal_override *dso; 518 519 while ((dso = dl_list_first(&wpa_s->drv_signal_override, 520 struct driver_signal_override, list))) { 521 dl_list_del(&dso->list); 522 os_free(dso); 523 } 524 } 525 #endif /* CONFIG_TESTING_OPTIONS */ 526 527 528 static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s) 529 { 530 int i; 531 532 bgscan_deinit(wpa_s); 533 autoscan_deinit(wpa_s); 534 scard_deinit(wpa_s->scard); 535 wpa_s->scard = NULL; 536 wpa_sm_set_scard_ctx(wpa_s->wpa, NULL); 537 eapol_sm_register_scard_ctx(wpa_s->eapol, NULL); 538 l2_packet_deinit(wpa_s->l2); 539 wpa_s->l2 = NULL; 540 if (wpa_s->l2_br) { 541 l2_packet_deinit(wpa_s->l2_br); 542 wpa_s->l2_br = NULL; 543 } 544 #ifdef CONFIG_TESTING_OPTIONS 545 l2_packet_deinit(wpa_s->l2_test); 546 wpa_s->l2_test = NULL; 547 os_free(wpa_s->get_pref_freq_list_override); 548 wpa_s->get_pref_freq_list_override = NULL; 549 wpabuf_free(wpa_s->last_assoc_req_wpa_ie); 550 wpa_s->last_assoc_req_wpa_ie = NULL; 551 os_free(wpa_s->extra_sae_rejected_groups); 552 wpa_s->extra_sae_rejected_groups = NULL; 553 wpabuf_free(wpa_s->rsne_override_eapol); 554 wpa_s->rsne_override_eapol = NULL; 555 wpabuf_free(wpa_s->rsnxe_override_assoc); 556 wpa_s->rsnxe_override_assoc = NULL; 557 wpabuf_free(wpa_s->rsnxe_override_eapol); 558 wpa_s->rsnxe_override_eapol = NULL; 559 wpas_clear_driver_signal_override(wpa_s); 560 #endif /* CONFIG_TESTING_OPTIONS */ 561 562 if (wpa_s->conf != NULL) { 563 struct wpa_ssid *ssid; 564 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) 565 wpas_notify_network_removed(wpa_s, ssid); 566 } 567 568 os_free(wpa_s->confname); 569 wpa_s->confname = NULL; 570 571 os_free(wpa_s->confanother); 572 wpa_s->confanother = NULL; 573 574 os_free(wpa_s->last_con_fail_realm); 575 wpa_s->last_con_fail_realm = NULL; 576 wpa_s->last_con_fail_realm_len = 0; 577 578 wpa_sm_set_eapol(wpa_s->wpa, NULL); 579 eapol_sm_deinit(wpa_s->eapol); 580 wpa_s->eapol = NULL; 581 582 rsn_preauth_deinit(wpa_s->wpa); 583 584 #ifdef CONFIG_TDLS 585 wpa_tdls_deinit(wpa_s->wpa); 586 #endif /* CONFIG_TDLS */ 587 588 #ifndef CONFIG_NO_WMM_AC 589 wmm_ac_clear_saved_tspecs(wpa_s); 590 #endif /* CONFIG_NO_WMM_AC */ 591 pmksa_candidate_free(wpa_s->wpa); 592 ptksa_cache_deinit(wpa_s->ptksa); 593 wpa_s->ptksa = NULL; 594 wpa_sm_deinit(wpa_s->wpa); 595 wpa_s->wpa = NULL; 596 wpa_bssid_ignore_clear(wpa_s); 597 598 #ifdef CONFIG_PASN 599 wpas_pasn_auth_stop(wpa_s); 600 #endif /* CONFIG_PASN */ 601 602 wpa_bss_deinit(wpa_s); 603 604 wpa_supplicant_cancel_delayed_sched_scan(wpa_s); 605 wpa_supplicant_cancel_scan(wpa_s); 606 wpa_supplicant_cancel_auth_timeout(wpa_s); 607 eloop_cancel_timeout(wpa_supplicant_stop_countermeasures, wpa_s, NULL); 608 #ifdef CONFIG_DELAYED_MIC_ERROR_REPORT 609 eloop_cancel_timeout(wpa_supplicant_delayed_mic_error_report, 610 wpa_s, NULL); 611 #endif /* CONFIG_DELAYED_MIC_ERROR_REPORT */ 612 613 eloop_cancel_timeout(wpas_network_reenabled, wpa_s, NULL); 614 eloop_cancel_timeout(wpas_clear_disabled_interface, wpa_s, NULL); 615 eloop_cancel_timeout(wpas_verify_ssid_beacon, wpa_s, NULL); 616 617 wpas_wps_deinit(wpa_s); 618 619 wpabuf_free(wpa_s->pending_eapol_rx); 620 wpa_s->pending_eapol_rx = NULL; 621 622 #ifdef CONFIG_IBSS_RSN 623 ibss_rsn_deinit(wpa_s->ibss_rsn); 624 wpa_s->ibss_rsn = NULL; 625 #endif /* CONFIG_IBSS_RSN */ 626 627 sme_deinit(wpa_s); 628 629 #ifdef CONFIG_AP 630 wpa_supplicant_ap_deinit(wpa_s); 631 #endif /* CONFIG_AP */ 632 633 wpas_p2p_deinit(wpa_s); 634 635 #ifdef CONFIG_OFFCHANNEL 636 offchannel_deinit(wpa_s); 637 #endif /* CONFIG_OFFCHANNEL */ 638 639 wpa_supplicant_cancel_sched_scan(wpa_s); 640 641 os_free(wpa_s->next_scan_freqs); 642 wpa_s->next_scan_freqs = NULL; 643 644 os_free(wpa_s->manual_scan_freqs); 645 wpa_s->manual_scan_freqs = NULL; 646 os_free(wpa_s->select_network_scan_freqs); 647 wpa_s->select_network_scan_freqs = NULL; 648 649 os_free(wpa_s->manual_sched_scan_freqs); 650 wpa_s->manual_sched_scan_freqs = NULL; 651 652 wpas_mac_addr_rand_scan_clear(wpa_s, MAC_ADDR_RAND_ALL); 653 654 /* 655 * Need to remove any pending gas-query radio work before the 656 * gas_query_deinit() call because gas_query::work has not yet been set 657 * for works that have not been started. gas_query_free() will be unable 658 * to cancel such pending radio works and once the pending gas-query 659 * radio work eventually gets removed, the deinit notification call to 660 * gas_query_start_cb() would result in dereferencing freed memory. 661 */ 662 if (wpa_s->radio) 663 radio_remove_works(wpa_s, "gas-query", 0); 664 gas_query_deinit(wpa_s->gas); 665 wpa_s->gas = NULL; 666 gas_server_deinit(wpa_s->gas_server); 667 wpa_s->gas_server = NULL; 668 669 free_hw_features(wpa_s); 670 671 ieee802_1x_dealloc_kay_sm(wpa_s); 672 673 os_free(wpa_s->bssid_filter); 674 wpa_s->bssid_filter = NULL; 675 676 os_free(wpa_s->disallow_aps_bssid); 677 wpa_s->disallow_aps_bssid = NULL; 678 os_free(wpa_s->disallow_aps_ssid); 679 wpa_s->disallow_aps_ssid = NULL; 680 681 wnm_bss_keep_alive_deinit(wpa_s); 682 wnm_btm_reset(wpa_s); 683 684 ext_password_deinit(wpa_s->ext_pw); 685 wpa_s->ext_pw = NULL; 686 687 wpabuf_free(wpa_s->last_gas_resp); 688 wpa_s->last_gas_resp = NULL; 689 wpabuf_free(wpa_s->prev_gas_resp); 690 wpa_s->prev_gas_resp = NULL; 691 692 os_free(wpa_s->last_scan_res); 693 wpa_s->last_scan_res = NULL; 694 695 #ifdef CONFIG_HS20 696 if (wpa_s->drv_priv) 697 wpa_drv_configure_frame_filters(wpa_s, 0); 698 hs20_deinit(wpa_s); 699 #endif /* CONFIG_HS20 */ 700 701 for (i = 0; i < NUM_VENDOR_ELEM_FRAMES; i++) { 702 wpabuf_free(wpa_s->vendor_elem[i]); 703 wpa_s->vendor_elem[i] = NULL; 704 } 705 706 #ifndef CONFIG_NO_WMM_AC 707 wmm_ac_notify_disassoc(wpa_s); 708 #endif /* CONFIG_NO_WMM_AC */ 709 710 wpa_s->sched_scan_plans_num = 0; 711 os_free(wpa_s->sched_scan_plans); 712 wpa_s->sched_scan_plans = NULL; 713 714 #ifdef CONFIG_MBO 715 wpa_s->non_pref_chan_num = 0; 716 os_free(wpa_s->non_pref_chan); 717 wpa_s->non_pref_chan = NULL; 718 #endif /* CONFIG_MBO */ 719 720 free_bss_tmp_disallowed(wpa_s); 721 722 wpabuf_free(wpa_s->lci); 723 wpa_s->lci = NULL; 724 #ifndef CONFIG_NO_RRM 725 wpas_clear_beacon_rep_data(wpa_s); 726 #endif /* CONFIG_NO_RRM */ 727 728 #ifdef CONFIG_PMKSA_CACHE_EXTERNAL 729 #ifdef CONFIG_MESH 730 { 731 struct external_pmksa_cache *entry; 732 733 while ((entry = dl_list_last(&wpa_s->mesh_external_pmksa_cache, 734 struct external_pmksa_cache, 735 list)) != NULL) { 736 dl_list_del(&entry->list); 737 os_free(entry->pmksa_cache); 738 os_free(entry); 739 } 740 } 741 #endif /* CONFIG_MESH */ 742 #endif /* CONFIG_PMKSA_CACHE_EXTERNAL */ 743 744 wpas_flush_fils_hlp_req(wpa_s); 745 746 wpabuf_free(wpa_s->ric_ies); 747 wpa_s->ric_ies = NULL; 748 749 #ifdef CONFIG_DPP 750 wpas_dpp_deinit(wpa_s); 751 dpp_global_deinit(wpa_s->dpp); 752 wpa_s->dpp = NULL; 753 #endif /* CONFIG_DPP */ 754 755 #ifdef CONFIG_NAN_USD 756 wpas_nan_usd_deinit(wpa_s); 757 #endif /* CONFIG_NAN_USD */ 758 759 #ifdef CONFIG_PASN 760 wpas_pasn_auth_stop(wpa_s); 761 #endif /* CONFIG_PASN */ 762 #ifndef CONFIG_NO_ROBUST_AV 763 wpas_scs_deinit(wpa_s); 764 wpas_dscp_deinit(wpa_s); 765 #endif /* CONFIG_NO_ROBUST_AV */ 766 767 #ifdef CONFIG_OWE 768 os_free(wpa_s->owe_trans_scan_freq); 769 wpa_s->owe_trans_scan_freq = NULL; 770 #endif /* CONFIG_OWE */ 771 } 772 773 774 /** 775 * wpa_clear_keys - Clear keys configured for the driver 776 * @wpa_s: Pointer to wpa_supplicant data 777 * @addr: Previously used BSSID or %NULL if not available 778 * 779 * This function clears the encryption keys that has been previously configured 780 * for the driver. 781 */ 782 void wpa_clear_keys(struct wpa_supplicant *wpa_s, const u8 *addr) 783 { 784 int i, max = 6; 785 786 /* MLME-DELETEKEYS.request */ 787 for (i = 0; i < max; i++) { 788 if (wpa_s->keys_cleared & BIT(i)) 789 continue; 790 wpa_drv_set_key(wpa_s, -1, WPA_ALG_NONE, NULL, i, 0, NULL, 0, 791 NULL, 0, KEY_FLAG_GROUP); 792 } 793 /* Pairwise Key ID 1 for Extended Key ID is tracked in bit 15 */ 794 if (~wpa_s->keys_cleared & (BIT(0) | BIT(15)) && addr && 795 !is_zero_ether_addr(addr)) { 796 if (!(wpa_s->keys_cleared & BIT(0))) 797 wpa_drv_set_key(wpa_s, -1, WPA_ALG_NONE, addr, 0, 0, 798 NULL, 0, NULL, 0, KEY_FLAG_PAIRWISE); 799 if (!(wpa_s->keys_cleared & BIT(15))) 800 wpa_drv_set_key(wpa_s, -1, WPA_ALG_NONE, addr, 1, 0, 801 NULL, 0, NULL, 0, KEY_FLAG_PAIRWISE); 802 /* MLME-SETPROTECTION.request(None) */ 803 wpa_drv_mlme_setprotection( 804 wpa_s, addr, 805 MLME_SETPROTECTION_PROTECT_TYPE_NONE, 806 MLME_SETPROTECTION_KEY_TYPE_PAIRWISE); 807 } 808 wpa_s->keys_cleared = (u32) -1; 809 } 810 811 812 /** 813 * wpa_supplicant_state_txt - Get the connection state name as a text string 814 * @state: State (wpa_state; WPA_*) 815 * Returns: The state name as a printable text string 816 */ 817 const char * wpa_supplicant_state_txt(enum wpa_states state) 818 { 819 switch (state) { 820 case WPA_DISCONNECTED: 821 return "DISCONNECTED"; 822 case WPA_INACTIVE: 823 return "INACTIVE"; 824 case WPA_INTERFACE_DISABLED: 825 return "INTERFACE_DISABLED"; 826 case WPA_SCANNING: 827 return "SCANNING"; 828 case WPA_AUTHENTICATING: 829 return "AUTHENTICATING"; 830 case WPA_ASSOCIATING: 831 return "ASSOCIATING"; 832 case WPA_ASSOCIATED: 833 return "ASSOCIATED"; 834 case WPA_4WAY_HANDSHAKE: 835 return "4WAY_HANDSHAKE"; 836 case WPA_GROUP_HANDSHAKE: 837 return "GROUP_HANDSHAKE"; 838 case WPA_COMPLETED: 839 return "COMPLETED"; 840 default: 841 return "UNKNOWN"; 842 } 843 } 844 845 846 #ifdef CONFIG_BGSCAN 847 848 static void wpa_supplicant_stop_bgscan(struct wpa_supplicant *wpa_s) 849 { 850 if (wpa_s->bgscan_ssid) { 851 bgscan_deinit(wpa_s); 852 wpa_s->bgscan_ssid = NULL; 853 } 854 } 855 856 857 /** 858 * wpa_supplicant_reset_bgscan - Reset the bgscan for the current SSID. 859 * @wpa_s: Pointer to the wpa_supplicant data 860 * 861 * Stop, start, or reconfigure the scan parameters depending on the method. 862 */ 863 void wpa_supplicant_reset_bgscan(struct wpa_supplicant *wpa_s) 864 { 865 const char *name; 866 867 if (wpa_s->current_ssid && wpa_s->current_ssid->bgscan) 868 name = wpa_s->current_ssid->bgscan; 869 else 870 name = wpa_s->conf->bgscan; 871 if (!name || name[0] == '\0') { 872 wpa_supplicant_stop_bgscan(wpa_s); 873 return; 874 } 875 if (wpas_driver_bss_selection(wpa_s)) 876 return; 877 #ifdef CONFIG_P2P 878 if (wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE) 879 return; 880 #endif /* CONFIG_P2P */ 881 882 bgscan_deinit(wpa_s); 883 if (wpa_s->current_ssid) { 884 if (bgscan_init(wpa_s, wpa_s->current_ssid, name)) { 885 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize " 886 "bgscan"); 887 /* 888 * Live without bgscan; it is only used as a roaming 889 * optimization, so the initial connection is not 890 * affected. 891 */ 892 } else { 893 struct wpa_scan_results *scan_res; 894 wpa_s->bgscan_ssid = wpa_s->current_ssid; 895 scan_res = wpa_supplicant_get_scan_results(wpa_s, NULL, 896 0, NULL); 897 if (scan_res) { 898 bgscan_notify_scan(wpa_s, scan_res); 899 wpa_scan_results_free(scan_res); 900 } 901 } 902 } else 903 wpa_s->bgscan_ssid = NULL; 904 } 905 906 #endif /* CONFIG_BGSCAN */ 907 908 909 static void wpa_supplicant_start_autoscan(struct wpa_supplicant *wpa_s) 910 { 911 if (autoscan_init(wpa_s, 0)) 912 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize autoscan"); 913 } 914 915 916 static void wpa_supplicant_stop_autoscan(struct wpa_supplicant *wpa_s) 917 { 918 autoscan_deinit(wpa_s); 919 } 920 921 922 void wpa_supplicant_reinit_autoscan(struct wpa_supplicant *wpa_s) 923 { 924 if (wpa_s->wpa_state == WPA_DISCONNECTED || 925 wpa_s->wpa_state == WPA_SCANNING) { 926 autoscan_deinit(wpa_s); 927 wpa_supplicant_start_autoscan(wpa_s); 928 } 929 } 930 931 932 static void wpas_verify_ssid_beacon(void *eloop_ctx, void *timeout_ctx) 933 { 934 struct wpa_supplicant *wpa_s = eloop_ctx; 935 struct wpa_bss *bss; 936 const u8 *ssid; 937 size_t ssid_len; 938 939 if (!wpa_s->current_ssid || !wpa_s->current_bss) 940 return; 941 942 ssid = wpa_s->current_bss->ssid; 943 ssid_len = wpa_s->current_bss->ssid_len; 944 945 if (wpa_s->current_ssid->ssid_len && 946 (wpa_s->current_ssid->ssid_len != ssid_len || 947 os_memcmp(wpa_s->current_ssid->ssid, ssid, ssid_len) != 0)) 948 return; 949 950 if (wpa_s->wpa_state < WPA_4WAY_HANDSHAKE || 951 !wpa_s->bigtk_set || wpa_s->ssid_verified) 952 return; 953 954 wpa_printf(MSG_DEBUG, 955 "SSID not yet verified; check if the driver has received a verified Beacon frame"); 956 if (wpa_supplicant_update_scan_results(wpa_s, wpa_s->bssid) < 0) 957 return; 958 959 bss = wpa_bss_get_bssid_latest(wpa_s, wpa_s->bssid); 960 if (!bss) 961 return; 962 wpa_printf(MSG_DEBUG, "The current beacon time stamp: 0x%llx", 963 (long long unsigned int) bss->tsf); 964 if (bss->tsf > wpa_s->first_beacon_tsf) { 965 const u8 *ie; 966 967 wpa_printf(MSG_DEBUG, 968 "Verified Beacon frame has been received"); 969 wpa_s->beacons_checked++; 970 971 ie = wpa_bss_get_ie_beacon(bss, WLAN_EID_SSID); 972 if (ie && ie[1] == ssid_len && 973 os_memcmp(&ie[2], ssid, ssid_len) == 0) { 974 wpa_printf(MSG_DEBUG, 975 "SSID verified based on a Beacon frame and beacon protection"); 976 wpa_s->ssid_verified = true; 977 return; 978 } 979 980 /* TODO: Multiple BSSID element */ 981 } 982 983 if (wpa_s->beacons_checked < 16) { 984 eloop_register_timeout(wpa_s->next_beacon_check, 0, 985 wpas_verify_ssid_beacon, wpa_s, NULL); 986 wpa_s->next_beacon_check++; 987 } 988 } 989 990 991 static void wpas_verify_ssid_beacon_prot(struct wpa_supplicant *wpa_s) 992 { 993 struct wpa_bss *bss; 994 995 wpa_printf(MSG_DEBUG, 996 "SSID not yet verified; try to verify using beacon protection"); 997 /* Fetch the current scan result which is likely based on not yet 998 * verified payload since the current BIGTK was just received. Any 999 * newer update in the future with a larger timestamp value is an 1000 * indication that a verified Beacon frame has been received. */ 1001 if (wpa_supplicant_update_scan_results(wpa_s, wpa_s->bssid) < 0) 1002 return; 1003 1004 bss = wpa_bss_get_bssid_latest(wpa_s, wpa_s->bssid); 1005 if (!bss) 1006 return; 1007 wpa_printf(MSG_DEBUG, "The initial beacon time stamp: 0x%llx", 1008 (long long unsigned int) bss->tsf); 1009 wpa_s->first_beacon_tsf = bss->tsf; 1010 wpa_s->beacons_checked = 0; 1011 wpa_s->next_beacon_check = 1; 1012 eloop_cancel_timeout(wpas_verify_ssid_beacon, wpa_s, NULL); 1013 eloop_register_timeout(1, 0, wpas_verify_ssid_beacon, wpa_s, NULL); 1014 } 1015 1016 1017 /** 1018 * wpa_supplicant_set_state - Set current connection state 1019 * @wpa_s: Pointer to wpa_supplicant data 1020 * @state: The new connection state 1021 * 1022 * This function is called whenever the connection state changes, e.g., 1023 * association is completed for WPA/WPA2 4-Way Handshake is started. 1024 */ 1025 void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s, 1026 enum wpa_states state) 1027 { 1028 enum wpa_states old_state = wpa_s->wpa_state; 1029 #if defined(CONFIG_FILS) && defined(IEEE8021X_EAPOL) 1030 bool update_fils_connect_params = false; 1031 #endif /* CONFIG_FILS && IEEE8021X_EAPOL */ 1032 1033 wpa_dbg(wpa_s, MSG_DEBUG, "State: %s -> %s", 1034 wpa_supplicant_state_txt(wpa_s->wpa_state), 1035 wpa_supplicant_state_txt(state)); 1036 1037 if (state == WPA_COMPLETED && 1038 os_reltime_initialized(&wpa_s->roam_start)) { 1039 os_reltime_age(&wpa_s->roam_start, &wpa_s->roam_time); 1040 wpa_s->roam_start.sec = 0; 1041 wpa_s->roam_start.usec = 0; 1042 wpas_notify_auth_changed(wpa_s); 1043 wpas_notify_roam_time(wpa_s); 1044 wpas_notify_roam_complete(wpa_s); 1045 } else if (state == WPA_DISCONNECTED && 1046 os_reltime_initialized(&wpa_s->roam_start)) { 1047 wpa_s->roam_start.sec = 0; 1048 wpa_s->roam_start.usec = 0; 1049 wpa_s->roam_time.sec = 0; 1050 wpa_s->roam_time.usec = 0; 1051 wpas_notify_roam_complete(wpa_s); 1052 } 1053 1054 if (state == WPA_INTERFACE_DISABLED) { 1055 /* Assure normal scan when interface is restored */ 1056 wpa_s->normal_scans = 0; 1057 } 1058 1059 if (state == WPA_COMPLETED) { 1060 wpas_connect_work_done(wpa_s); 1061 /* Reinitialize normal_scan counter */ 1062 wpa_s->normal_scans = 0; 1063 } 1064 1065 #ifdef CONFIG_P2P 1066 /* 1067 * P2PS client has to reply to Probe Request frames received on the 1068 * group operating channel. Enable Probe Request frame reporting for 1069 * P2P connected client in case p2p_cli_probe configuration property is 1070 * set to 1. 1071 */ 1072 if (wpa_s->conf->p2p_cli_probe && wpa_s->current_ssid && 1073 wpa_s->current_ssid->mode == WPAS_MODE_INFRA && 1074 wpa_s->current_ssid->p2p_group) { 1075 if (state == WPA_COMPLETED && !wpa_s->p2p_cli_probe) { 1076 wpa_dbg(wpa_s, MSG_DEBUG, 1077 "P2P: Enable CLI Probe Request RX reporting"); 1078 wpa_s->p2p_cli_probe = 1079 wpa_drv_probe_req_report(wpa_s, 1) >= 0; 1080 } else if (state != WPA_COMPLETED && wpa_s->p2p_cli_probe) { 1081 wpa_dbg(wpa_s, MSG_DEBUG, 1082 "P2P: Disable CLI Probe Request RX reporting"); 1083 wpa_s->p2p_cli_probe = 0; 1084 wpa_drv_probe_req_report(wpa_s, 0); 1085 } 1086 } 1087 #endif /* CONFIG_P2P */ 1088 1089 if (state != WPA_SCANNING) 1090 wpa_supplicant_notify_scanning(wpa_s, 0); 1091 1092 if (state == WPA_COMPLETED && wpa_s->new_connection) { 1093 struct wpa_ssid *ssid = wpa_s->current_ssid; 1094 int fils_hlp_sent = 0; 1095 char mld_addr[50]; 1096 1097 mld_addr[0] = '\0'; 1098 if (wpa_s->valid_links) 1099 os_snprintf(mld_addr, sizeof(mld_addr), 1100 " ap_mld_addr=" MACSTR, 1101 MAC2STR(wpa_s->ap_mld_addr)); 1102 1103 #ifdef CONFIG_SME 1104 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) && 1105 wpa_auth_alg_fils(wpa_s->sme.auth_alg)) 1106 fils_hlp_sent = 1; 1107 #endif /* CONFIG_SME */ 1108 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) && 1109 wpa_auth_alg_fils(wpa_s->auth_alg)) 1110 fils_hlp_sent = 1; 1111 1112 #if defined(CONFIG_CTRL_IFACE) || !defined(CONFIG_NO_STDOUT_DEBUG) 1113 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_CONNECTED "- Connection to " 1114 MACSTR " completed [id=%d id_str=%s%s]%s", 1115 MAC2STR(wpa_s->bssid), 1116 ssid ? ssid->id : -1, 1117 ssid && ssid->id_str ? ssid->id_str : "", 1118 fils_hlp_sent ? " FILS_HLP_SENT" : "", mld_addr); 1119 #endif /* CONFIG_CTRL_IFACE || !CONFIG_NO_STDOUT_DEBUG */ 1120 wpas_clear_temp_disabled(wpa_s, ssid, 1); 1121 wpa_s->consecutive_conn_failures = 0; 1122 wpa_s->new_connection = 0; 1123 wpa_drv_set_operstate(wpa_s, 1); 1124 #ifndef IEEE8021X_EAPOL 1125 wpa_drv_set_supp_port(wpa_s, 1); 1126 #endif /* IEEE8021X_EAPOL */ 1127 wpa_s->after_wps = 0; 1128 wpa_s->known_wps_freq = 0; 1129 wpas_p2p_completed(wpa_s); 1130 1131 sme_sched_obss_scan(wpa_s, 1); 1132 1133 #if defined(CONFIG_FILS) && defined(IEEE8021X_EAPOL) 1134 if (!fils_hlp_sent && ssid && ssid->eap.erp) 1135 update_fils_connect_params = true; 1136 #endif /* CONFIG_FILS && IEEE8021X_EAPOL */ 1137 #ifdef CONFIG_OWE 1138 if (ssid && (ssid->key_mgmt & WPA_KEY_MGMT_OWE)) 1139 wpas_update_owe_connect_params(wpa_s); 1140 #endif /* CONFIG_OWE */ 1141 } else if (state == WPA_DISCONNECTED || state == WPA_ASSOCIATING || 1142 state == WPA_ASSOCIATED) { 1143 wpa_s->new_connection = 1; 1144 wpa_drv_set_operstate(wpa_s, 0); 1145 #ifndef IEEE8021X_EAPOL 1146 wpa_drv_set_supp_port(wpa_s, 0); 1147 #endif /* IEEE8021X_EAPOL */ 1148 sme_sched_obss_scan(wpa_s, 0); 1149 } 1150 wpa_s->wpa_state = state; 1151 1152 #ifdef CONFIG_BGSCAN 1153 if (state == WPA_COMPLETED && wpa_s->current_ssid != wpa_s->bgscan_ssid) 1154 wpa_supplicant_reset_bgscan(wpa_s); 1155 else if (state < WPA_ASSOCIATED) 1156 wpa_supplicant_stop_bgscan(wpa_s); 1157 #endif /* CONFIG_BGSCAN */ 1158 1159 if (state > WPA_SCANNING) 1160 wpa_supplicant_stop_autoscan(wpa_s); 1161 1162 if (state == WPA_DISCONNECTED || state == WPA_INACTIVE) 1163 wpa_supplicant_start_autoscan(wpa_s); 1164 1165 if (state == WPA_COMPLETED || state == WPA_INTERFACE_DISABLED || 1166 state == WPA_INACTIVE) 1167 wnm_btm_reset(wpa_s); 1168 1169 #ifndef CONFIG_NO_WMM_AC 1170 if (old_state >= WPA_ASSOCIATED && wpa_s->wpa_state < WPA_ASSOCIATED) 1171 wmm_ac_notify_disassoc(wpa_s); 1172 #endif /* CONFIG_NO_WMM_AC */ 1173 1174 if (wpa_s->wpa_state != old_state) { 1175 wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state); 1176 1177 /* 1178 * Notify the P2P Device interface about a state change in one 1179 * of the interfaces. 1180 */ 1181 wpas_p2p_indicate_state_change(wpa_s); 1182 1183 if (wpa_s->wpa_state == WPA_COMPLETED || 1184 old_state == WPA_COMPLETED) 1185 wpas_notify_auth_changed(wpa_s); 1186 #ifdef CONFIG_DPP2 1187 if (wpa_s->wpa_state == WPA_COMPLETED) 1188 wpas_dpp_connected(wpa_s); 1189 #endif /* CONFIG_DPP2 */ 1190 1191 if (wpa_s->wpa_state == WPA_COMPLETED && 1192 wpa_s->bigtk_set && !wpa_s->ssid_verified) 1193 wpas_verify_ssid_beacon_prot(wpa_s); 1194 } 1195 #if defined(CONFIG_FILS) && defined(IEEE8021X_EAPOL) 1196 if (update_fils_connect_params) 1197 wpas_update_fils_connect_params(wpa_s); 1198 #endif /* CONFIG_FILS && IEEE8021X_EAPOL */ 1199 } 1200 1201 1202 void wpa_supplicant_terminate_proc(struct wpa_global *global) 1203 { 1204 int pending = 0; 1205 #ifdef CONFIG_WPS 1206 struct wpa_supplicant *wpa_s = global->ifaces; 1207 while (wpa_s) { 1208 struct wpa_supplicant *next = wpa_s->next; 1209 if (wpas_wps_terminate_pending(wpa_s) == 1) 1210 pending = 1; 1211 #ifdef CONFIG_P2P 1212 if (wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE || 1213 (wpa_s->current_ssid && wpa_s->current_ssid->p2p_group)) 1214 wpas_p2p_disconnect(wpa_s); 1215 #endif /* CONFIG_P2P */ 1216 wpa_s = next; 1217 } 1218 #endif /* CONFIG_WPS */ 1219 if (pending) 1220 return; 1221 eloop_terminate(); 1222 } 1223 1224 1225 static void wpa_supplicant_terminate(int sig, void *signal_ctx) 1226 { 1227 struct wpa_global *global = signal_ctx; 1228 wpa_supplicant_terminate_proc(global); 1229 } 1230 1231 1232 void wpa_supplicant_clear_status(struct wpa_supplicant *wpa_s) 1233 { 1234 enum wpa_states old_state = wpa_s->wpa_state; 1235 enum wpa_states new_state; 1236 1237 if (old_state == WPA_SCANNING) 1238 new_state = WPA_SCANNING; 1239 else 1240 new_state = WPA_DISCONNECTED; 1241 1242 wpa_s->pairwise_cipher = 0; 1243 wpa_s->group_cipher = 0; 1244 wpa_s->mgmt_group_cipher = 0; 1245 wpa_s->key_mgmt = 0; 1246 wpa_s->allowed_key_mgmts = 0; 1247 if (wpa_s->wpa_state != WPA_INTERFACE_DISABLED) 1248 wpa_supplicant_set_state(wpa_s, new_state); 1249 1250 if (wpa_s->wpa_state != old_state) 1251 wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state); 1252 } 1253 1254 1255 /** 1256 * wpa_supplicant_reload_configuration - Reload configuration data 1257 * @wpa_s: Pointer to wpa_supplicant data 1258 * Returns: 0 on success or -1 if configuration parsing failed 1259 * 1260 * This function can be used to request that the configuration data is reloaded 1261 * (e.g., after configuration file change). This function is reloading 1262 * configuration only for one interface, so this may need to be called multiple 1263 * times if %wpa_supplicant is controlling multiple interfaces and all 1264 * interfaces need reconfiguration. 1265 */ 1266 int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s) 1267 { 1268 struct wpa_config *conf; 1269 int reconf_ctrl; 1270 int old_ap_scan; 1271 1272 if (wpa_s->confname == NULL) 1273 return -1; 1274 conf = wpa_config_read(wpa_s->confname, NULL, false); 1275 if (conf == NULL) { 1276 wpa_msg(wpa_s, MSG_ERROR, "Failed to parse the configuration " 1277 "file '%s' - exiting", wpa_s->confname); 1278 return -1; 1279 } 1280 if (wpa_s->confanother && 1281 !wpa_config_read(wpa_s->confanother, conf, true)) { 1282 wpa_msg(wpa_s, MSG_ERROR, 1283 "Failed to parse the configuration file '%s' - exiting", 1284 wpa_s->confanother); 1285 return -1; 1286 } 1287 1288 conf->changed_parameters = (unsigned int) -1; 1289 1290 reconf_ctrl = !!conf->ctrl_interface != !!wpa_s->conf->ctrl_interface 1291 || (conf->ctrl_interface && wpa_s->conf->ctrl_interface && 1292 os_strcmp(conf->ctrl_interface, 1293 wpa_s->conf->ctrl_interface) != 0); 1294 1295 if (reconf_ctrl) { 1296 wpa_supplicant_ctrl_iface_deinit(wpa_s, wpa_s->ctrl_iface); 1297 wpa_s->ctrl_iface = NULL; 1298 } 1299 1300 eapol_sm_invalidate_cached_session(wpa_s->eapol); 1301 if (wpa_s->current_ssid) { 1302 if (wpa_s->wpa_state >= WPA_AUTHENTICATING) 1303 wpa_s->own_disconnect_req = 1; 1304 wpa_supplicant_deauthenticate(wpa_s, 1305 WLAN_REASON_DEAUTH_LEAVING); 1306 } 1307 1308 /* 1309 * TODO: should notify EAPOL SM about changes in opensc_engine_path, 1310 * pkcs11_engine_path, pkcs11_module_path, openssl_ciphers. 1311 */ 1312 if (wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) || 1313 wpa_s->key_mgmt == WPA_KEY_MGMT_OWE || 1314 wpa_s->key_mgmt == WPA_KEY_MGMT_DPP) { 1315 /* 1316 * Clear forced success to clear EAP state for next 1317 * authentication. 1318 */ 1319 eapol_sm_notify_eap_success(wpa_s->eapol, false); 1320 } 1321 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL); 1322 wpa_sm_set_config(wpa_s->wpa, NULL); 1323 wpa_sm_pmksa_cache_flush(wpa_s->wpa, NULL); 1324 wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth); 1325 rsn_preauth_deinit(wpa_s->wpa); 1326 1327 old_ap_scan = wpa_s->conf->ap_scan; 1328 wpa_config_free(wpa_s->conf); 1329 wpa_s->conf = conf; 1330 if (old_ap_scan != wpa_s->conf->ap_scan) 1331 wpas_notify_ap_scan_changed(wpa_s); 1332 1333 if (reconf_ctrl) 1334 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s); 1335 1336 wpa_supplicant_update_config(wpa_s); 1337 1338 wpa_supplicant_clear_status(wpa_s); 1339 if (wpa_supplicant_enabled_networks(wpa_s)) { 1340 wpa_s->reassociate = 1; 1341 wpa_supplicant_req_scan(wpa_s, 0, 0); 1342 } 1343 wpa_bssid_ignore_clear(wpa_s); 1344 wpa_dbg(wpa_s, MSG_DEBUG, "Reconfiguration completed"); 1345 return 0; 1346 } 1347 1348 1349 static void wpa_supplicant_reconfig(int sig, void *signal_ctx) 1350 { 1351 struct wpa_global *global = signal_ctx; 1352 struct wpa_supplicant *wpa_s; 1353 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { 1354 wpa_dbg(wpa_s, MSG_DEBUG, "Signal %d received - reconfiguring", 1355 sig); 1356 if (wpa_supplicant_reload_configuration(wpa_s) < 0) { 1357 wpa_supplicant_terminate_proc(global); 1358 } 1359 } 1360 1361 if (wpa_debug_reopen_file() < 0) { 1362 /* Ignore errors since we cannot really do much to fix this */ 1363 wpa_printf(MSG_DEBUG, "Could not reopen debug log file"); 1364 } 1365 } 1366 1367 1368 static int wpa_supplicant_suites_from_ai(struct wpa_supplicant *wpa_s, 1369 struct wpa_ssid *ssid, 1370 struct wpa_ie_data *ie) 1371 { 1372 int ret = wpa_sm_parse_own_wpa_ie(wpa_s->wpa, ie); 1373 if (ret) { 1374 if (ret == -2) { 1375 wpa_msg(wpa_s, MSG_INFO, "WPA: Failed to parse WPA IE " 1376 "from association info"); 1377 } 1378 return -1; 1379 } 1380 1381 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Using WPA IE from AssocReq to set " 1382 "cipher suites"); 1383 if (!(ie->group_cipher & ssid->group_cipher)) { 1384 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled group " 1385 "cipher 0x%x (mask 0x%x) - reject", 1386 ie->group_cipher, ssid->group_cipher); 1387 return -1; 1388 } 1389 if (!(ie->pairwise_cipher & ssid->pairwise_cipher)) { 1390 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled pairwise " 1391 "cipher 0x%x (mask 0x%x) - reject", 1392 ie->pairwise_cipher, ssid->pairwise_cipher); 1393 return -1; 1394 } 1395 if (!(ie->key_mgmt & ssid->key_mgmt)) { 1396 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled key " 1397 "management 0x%x (mask 0x%x) - reject", 1398 ie->key_mgmt, ssid->key_mgmt); 1399 return -1; 1400 } 1401 1402 if (!(ie->capabilities & WPA_CAPABILITY_MFPC) && 1403 wpas_get_ssid_pmf(wpa_s, ssid) == MGMT_FRAME_PROTECTION_REQUIRED) { 1404 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver associated with an AP " 1405 "that does not support management frame protection - " 1406 "reject"); 1407 return -1; 1408 } 1409 1410 return 0; 1411 } 1412 1413 1414 static int matching_ciphers(struct wpa_ssid *ssid, struct wpa_ie_data *ie, 1415 int freq) 1416 { 1417 if (!ie->has_group) 1418 ie->group_cipher = wpa_default_rsn_cipher(freq); 1419 if (!ie->has_pairwise) 1420 ie->pairwise_cipher = wpa_default_rsn_cipher(freq); 1421 return (ie->group_cipher & ssid->group_cipher) && 1422 (ie->pairwise_cipher & ssid->pairwise_cipher); 1423 } 1424 1425 1426 void wpas_set_mgmt_group_cipher(struct wpa_supplicant *wpa_s, 1427 struct wpa_ssid *ssid, struct wpa_ie_data *ie) 1428 { 1429 int sel; 1430 1431 sel = ie->mgmt_group_cipher; 1432 if (ssid->group_mgmt_cipher) 1433 sel &= ssid->group_mgmt_cipher; 1434 if (wpas_get_ssid_pmf(wpa_s, ssid) == NO_MGMT_FRAME_PROTECTION || 1435 !(ie->capabilities & WPA_CAPABILITY_MFPC)) 1436 sel = 0; 1437 wpa_dbg(wpa_s, MSG_DEBUG, 1438 "WPA: AP mgmt_group_cipher 0x%x network profile mgmt_group_cipher 0x%x; available mgmt_group_cipher 0x%x", 1439 ie->mgmt_group_cipher, ssid->group_mgmt_cipher, sel); 1440 if (sel & WPA_CIPHER_AES_128_CMAC) { 1441 wpa_s->mgmt_group_cipher = WPA_CIPHER_AES_128_CMAC; 1442 wpa_dbg(wpa_s, MSG_DEBUG, 1443 "WPA: using MGMT group cipher AES-128-CMAC"); 1444 } else if (sel & WPA_CIPHER_BIP_GMAC_128) { 1445 wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_GMAC_128; 1446 wpa_dbg(wpa_s, MSG_DEBUG, 1447 "WPA: using MGMT group cipher BIP-GMAC-128"); 1448 } else if (sel & WPA_CIPHER_BIP_GMAC_256) { 1449 wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_GMAC_256; 1450 wpa_dbg(wpa_s, MSG_DEBUG, 1451 "WPA: using MGMT group cipher BIP-GMAC-256"); 1452 } else if (sel & WPA_CIPHER_BIP_CMAC_256) { 1453 wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_CMAC_256; 1454 wpa_dbg(wpa_s, MSG_DEBUG, 1455 "WPA: using MGMT group cipher BIP-CMAC-256"); 1456 } else { 1457 wpa_s->mgmt_group_cipher = 0; 1458 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: not using MGMT group cipher"); 1459 } 1460 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP, 1461 wpa_s->mgmt_group_cipher); 1462 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MFP, 1463 wpas_get_ssid_pmf(wpa_s, ssid)); 1464 } 1465 1466 /** 1467 * wpa_supplicant_get_psk - Get PSK from config or external database 1468 * @wpa_s: Pointer to wpa_supplicant data 1469 * @bss: Scan results for the selected BSS, or %NULL if not available 1470 * @ssid: Configuration data for the selected network 1471 * @psk: Buffer for the PSK 1472 * Returns: 0 on success or -1 if configuration parsing failed 1473 * 1474 * This function obtains the PSK for a network, either included inline in the 1475 * config or retrieved from an external database. 1476 */ 1477 static int wpa_supplicant_get_psk(struct wpa_supplicant *wpa_s, 1478 struct wpa_bss *bss, struct wpa_ssid *ssid, 1479 u8 *psk) 1480 { 1481 if (ssid->psk_set) { 1482 wpa_hexdump_key(MSG_MSGDUMP, "PSK (set in config)", 1483 ssid->psk, PMK_LEN); 1484 os_memcpy(psk, ssid->psk, PMK_LEN); 1485 return 0; 1486 } 1487 1488 #ifndef CONFIG_NO_PBKDF2 1489 if (bss && ssid->bssid_set && ssid->ssid_len == 0 && ssid->passphrase) { 1490 if (pbkdf2_sha1(ssid->passphrase, bss->ssid, bss->ssid_len, 1491 4096, psk, PMK_LEN) != 0) { 1492 wpa_msg(wpa_s, MSG_WARNING, "Error in pbkdf2_sha1()"); 1493 return -1; 1494 } 1495 wpa_hexdump_key(MSG_MSGDUMP, "PSK (from passphrase)", 1496 psk, PMK_LEN); 1497 return 0; 1498 } 1499 #endif /* CONFIG_NO_PBKDF2 */ 1500 1501 #ifdef CONFIG_EXT_PASSWORD 1502 if (ssid->ext_psk) { 1503 struct wpabuf *pw = ext_password_get(wpa_s->ext_pw, 1504 ssid->ext_psk); 1505 char pw_str[64 + 1]; 1506 1507 if (!pw) { 1508 wpa_msg(wpa_s, MSG_INFO, 1509 "EXT PW: No PSK found from external storage"); 1510 return -1; 1511 } 1512 1513 if (wpabuf_len(pw) < 8 || wpabuf_len(pw) > 64) { 1514 wpa_msg(wpa_s, MSG_INFO, 1515 "EXT PW: Unexpected PSK length %d in external storage", 1516 (int) wpabuf_len(pw)); 1517 ext_password_free(pw); 1518 return -1; 1519 } 1520 1521 os_memcpy(pw_str, wpabuf_head(pw), wpabuf_len(pw)); 1522 pw_str[wpabuf_len(pw)] = '\0'; 1523 1524 #ifndef CONFIG_NO_PBKDF2 1525 if (wpabuf_len(pw) >= 8 && wpabuf_len(pw) < 64 && bss) 1526 { 1527 if (pbkdf2_sha1(pw_str, bss->ssid, bss->ssid_len, 1528 4096, psk, PMK_LEN) != 0) { 1529 wpa_msg(wpa_s, MSG_WARNING, 1530 "Error in pbkdf2_sha1()"); 1531 forced_memzero(pw_str, sizeof(pw_str)); 1532 ext_password_free(pw); 1533 return -1; 1534 } 1535 wpa_hexdump_key(MSG_MSGDUMP, 1536 "PSK (from external passphrase)", 1537 psk, PMK_LEN); 1538 } else 1539 #endif /* CONFIG_NO_PBKDF2 */ 1540 if (wpabuf_len(pw) == 2 * PMK_LEN) { 1541 if (hexstr2bin(pw_str, psk, PMK_LEN) < 0) { 1542 wpa_msg(wpa_s, MSG_INFO, 1543 "EXT PW: Invalid PSK hex string"); 1544 forced_memzero(pw_str, sizeof(pw_str)); 1545 ext_password_free(pw); 1546 return -1; 1547 } 1548 wpa_hexdump_key(MSG_MSGDUMP, "PSK (from external PSK)", 1549 psk, PMK_LEN); 1550 } else { 1551 wpa_msg(wpa_s, MSG_INFO, 1552 "EXT PW: No suitable PSK available"); 1553 forced_memzero(pw_str, sizeof(pw_str)); 1554 ext_password_free(pw); 1555 return -1; 1556 } 1557 1558 forced_memzero(pw_str, sizeof(pw_str)); 1559 ext_password_free(pw); 1560 1561 return 0; 1562 } 1563 #endif /* CONFIG_EXT_PASSWORD */ 1564 1565 return -1; 1566 } 1567 1568 1569 static void wpas_update_allowed_key_mgmt(struct wpa_supplicant *wpa_s, 1570 struct wpa_ssid *ssid) 1571 { 1572 int akm_count = wpa_s->max_num_akms; 1573 u8 capab = 0; 1574 1575 if (akm_count < 2) 1576 return; 1577 1578 akm_count--; 1579 wpa_s->allowed_key_mgmts = 0; 1580 switch (wpa_s->key_mgmt) { 1581 case WPA_KEY_MGMT_PSK: 1582 if (ssid->key_mgmt & WPA_KEY_MGMT_SAE) { 1583 akm_count--; 1584 wpa_s->allowed_key_mgmts |= WPA_KEY_MGMT_SAE; 1585 } 1586 if (!akm_count) 1587 break; 1588 if (ssid->key_mgmt & WPA_KEY_MGMT_SAE_EXT_KEY) { 1589 akm_count--; 1590 wpa_s->allowed_key_mgmts |= WPA_KEY_MGMT_SAE_EXT_KEY; 1591 } 1592 if (!akm_count) 1593 break; 1594 if (ssid->key_mgmt & WPA_KEY_MGMT_PSK_SHA256) 1595 wpa_s->allowed_key_mgmts |= 1596 WPA_KEY_MGMT_PSK_SHA256; 1597 break; 1598 case WPA_KEY_MGMT_PSK_SHA256: 1599 if (ssid->key_mgmt & WPA_KEY_MGMT_SAE) { 1600 akm_count--; 1601 wpa_s->allowed_key_mgmts |= WPA_KEY_MGMT_SAE; 1602 } 1603 if (!akm_count) 1604 break; 1605 if (ssid->key_mgmt & WPA_KEY_MGMT_SAE_EXT_KEY) { 1606 akm_count--; 1607 wpa_s->allowed_key_mgmts |= WPA_KEY_MGMT_SAE_EXT_KEY; 1608 } 1609 if (!akm_count) 1610 break; 1611 if (ssid->key_mgmt & WPA_KEY_MGMT_PSK) 1612 wpa_s->allowed_key_mgmts |= WPA_KEY_MGMT_PSK; 1613 break; 1614 case WPA_KEY_MGMT_SAE: 1615 if (ssid->key_mgmt & WPA_KEY_MGMT_PSK) { 1616 akm_count--; 1617 wpa_s->allowed_key_mgmts |= WPA_KEY_MGMT_PSK; 1618 } 1619 if (!akm_count) 1620 break; 1621 if (ssid->key_mgmt & WPA_KEY_MGMT_SAE_EXT_KEY) { 1622 akm_count--; 1623 wpa_s->allowed_key_mgmts |= WPA_KEY_MGMT_SAE_EXT_KEY; 1624 } 1625 if (!akm_count) 1626 break; 1627 if (ssid->key_mgmt & WPA_KEY_MGMT_PSK_SHA256) 1628 wpa_s->allowed_key_mgmts |= 1629 WPA_KEY_MGMT_PSK_SHA256; 1630 break; 1631 case WPA_KEY_MGMT_SAE_EXT_KEY: 1632 if (ssid->key_mgmt & WPA_KEY_MGMT_SAE) { 1633 akm_count--; 1634 wpa_s->allowed_key_mgmts |= WPA_KEY_MGMT_SAE; 1635 } 1636 if (!akm_count) 1637 break; 1638 if (ssid->key_mgmt & WPA_KEY_MGMT_PSK) { 1639 akm_count--; 1640 wpa_s->allowed_key_mgmts |= WPA_KEY_MGMT_PSK; 1641 } 1642 if (!akm_count) 1643 break; 1644 if (ssid->key_mgmt & WPA_KEY_MGMT_PSK_SHA256) 1645 wpa_s->allowed_key_mgmts |= 1646 WPA_KEY_MGMT_PSK_SHA256; 1647 break; 1648 default: 1649 return; 1650 } 1651 1652 if (wpa_s->conf->sae_pwe != SAE_PWE_HUNT_AND_PECK && 1653 wpa_s->conf->sae_pwe != SAE_PWE_FORCE_HUNT_AND_PECK) 1654 capab |= BIT(WLAN_RSNX_CAPAB_SAE_H2E); 1655 #ifdef CONFIG_SAE_PK 1656 if (ssid->sae_pk) 1657 capab |= BIT(WLAN_RSNX_CAPAB_SAE_PK); 1658 #endif /* CONFIG_SAE_PK */ 1659 1660 if (!((wpa_s->allowed_key_mgmts & 1661 (WPA_KEY_MGMT_SAE | WPA_KEY_MGMT_SAE_EXT_KEY)) && capab)) 1662 return; 1663 1664 if (!wpa_s->rsnxe_len) { 1665 wpa_s->rsnxe_len = 3; 1666 wpa_s->rsnxe[0] = WLAN_EID_RSNX; 1667 wpa_s->rsnxe[1] = 1; 1668 wpa_s->rsnxe[2] = 0; 1669 } 1670 1671 wpa_s->rsnxe[2] |= capab; 1672 } 1673 1674 1675 /** 1676 * wpa_supplicant_set_suites - Set authentication and encryption parameters 1677 * @wpa_s: Pointer to wpa_supplicant data 1678 * @bss: Scan results for the selected BSS, or %NULL if not available 1679 * @ssid: Configuration data for the selected network 1680 * @wpa_ie: Buffer for the WPA/RSN IE 1681 * @wpa_ie_len: Maximum wpa_ie buffer size on input. This is changed to be the 1682 * used buffer length in case the functions returns success. 1683 * @skip_default_rsne: Whether to skip setting of the default RSNE/RSNXE 1684 * Returns: 0 on success or -1 on failure 1685 * 1686 * This function is used to configure authentication and encryption parameters 1687 * based on the network configuration and scan result for the selected BSS (if 1688 * available). 1689 */ 1690 int wpa_supplicant_set_suites(struct wpa_supplicant *wpa_s, 1691 struct wpa_bss *bss, struct wpa_ssid *ssid, 1692 u8 *wpa_ie, size_t *wpa_ie_len, 1693 bool skip_default_rsne) 1694 { 1695 struct wpa_ie_data ie; 1696 int sel, proto; 1697 enum sae_pwe sae_pwe; 1698 const u8 *bss_wpa, *bss_rsn, *bss_rsnx, *bss_osen; 1699 bool wmm; 1700 1701 if (bss) { 1702 bss_wpa = wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE); 1703 bss_rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN); 1704 bss_rsnx = wpa_bss_get_ie(bss, WLAN_EID_RSNX); 1705 bss_osen = wpa_bss_get_vendor_ie(bss, OSEN_IE_VENDOR_TYPE); 1706 } else { 1707 bss_wpa = bss_rsn = bss_rsnx = bss_osen = NULL; 1708 } 1709 1710 if (bss_rsn && (ssid->proto & WPA_PROTO_RSN) && 1711 wpa_parse_wpa_ie(bss_rsn, 2 + bss_rsn[1], &ie) == 0 && 1712 matching_ciphers(ssid, &ie, bss->freq) && 1713 (ie.key_mgmt & ssid->key_mgmt)) { 1714 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using IEEE 802.11i/D9.0"); 1715 proto = WPA_PROTO_RSN; 1716 } else if (bss_wpa && (ssid->proto & WPA_PROTO_WPA) && 1717 wpa_parse_wpa_ie(bss_wpa, 2 + bss_wpa[1], &ie) == 0 && 1718 (ie.group_cipher & ssid->group_cipher) && 1719 (ie.pairwise_cipher & ssid->pairwise_cipher) && 1720 (ie.key_mgmt & ssid->key_mgmt)) { 1721 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using IEEE 802.11i/D3.0"); 1722 proto = WPA_PROTO_WPA; 1723 #ifdef CONFIG_HS20 1724 } else if (bss_osen && (ssid->proto & WPA_PROTO_OSEN) && 1725 wpa_parse_wpa_ie(bss_osen, 2 + bss_osen[1], &ie) == 0 && 1726 (ie.group_cipher & ssid->group_cipher) && 1727 (ie.pairwise_cipher & ssid->pairwise_cipher) && 1728 (ie.key_mgmt & ssid->key_mgmt)) { 1729 wpa_dbg(wpa_s, MSG_DEBUG, "HS 2.0: using OSEN"); 1730 proto = WPA_PROTO_OSEN; 1731 } else if (bss_rsn && (ssid->proto & WPA_PROTO_OSEN) && 1732 wpa_parse_wpa_ie(bss_rsn, 2 + bss_rsn[1], &ie) == 0 && 1733 (ie.group_cipher & ssid->group_cipher) && 1734 (ie.pairwise_cipher & ssid->pairwise_cipher) && 1735 (ie.key_mgmt & ssid->key_mgmt)) { 1736 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using OSEN (within RSN)"); 1737 proto = WPA_PROTO_RSN; 1738 #endif /* CONFIG_HS20 */ 1739 } else if (bss) { 1740 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select WPA/RSN"); 1741 wpa_dbg(wpa_s, MSG_DEBUG, 1742 "WPA: ssid proto=0x%x pairwise_cipher=0x%x group_cipher=0x%x key_mgmt=0x%x", 1743 ssid->proto, ssid->pairwise_cipher, ssid->group_cipher, 1744 ssid->key_mgmt); 1745 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: BSS " MACSTR " ssid='%s'%s%s%s", 1746 MAC2STR(bss->bssid), 1747 wpa_ssid_txt(bss->ssid, bss->ssid_len), 1748 bss_wpa ? " WPA" : "", 1749 bss_rsn ? " RSN" : "", 1750 bss_osen ? " OSEN" : ""); 1751 if (bss_rsn) { 1752 wpa_hexdump(MSG_DEBUG, "RSN", bss_rsn, 2 + bss_rsn[1]); 1753 if (wpa_parse_wpa_ie(bss_rsn, 2 + bss_rsn[1], &ie)) { 1754 wpa_dbg(wpa_s, MSG_DEBUG, 1755 "Could not parse RSN element"); 1756 } else { 1757 wpa_dbg(wpa_s, MSG_DEBUG, 1758 "RSN: pairwise_cipher=0x%x group_cipher=0x%x key_mgmt=0x%x", 1759 ie.pairwise_cipher, ie.group_cipher, 1760 ie.key_mgmt); 1761 } 1762 } 1763 if (bss_wpa) { 1764 wpa_hexdump(MSG_DEBUG, "WPA", bss_wpa, 2 + bss_wpa[1]); 1765 if (wpa_parse_wpa_ie(bss_wpa, 2 + bss_wpa[1], &ie)) { 1766 wpa_dbg(wpa_s, MSG_DEBUG, 1767 "Could not parse WPA element"); 1768 } else { 1769 wpa_dbg(wpa_s, MSG_DEBUG, 1770 "WPA: pairwise_cipher=0x%x group_cipher=0x%x key_mgmt=0x%x", 1771 ie.pairwise_cipher, ie.group_cipher, 1772 ie.key_mgmt); 1773 } 1774 } 1775 return -1; 1776 } else { 1777 if (ssid->proto & WPA_PROTO_OSEN) 1778 proto = WPA_PROTO_OSEN; 1779 else if (ssid->proto & WPA_PROTO_RSN) 1780 proto = WPA_PROTO_RSN; 1781 else 1782 proto = WPA_PROTO_WPA; 1783 if (wpa_supplicant_suites_from_ai(wpa_s, ssid, &ie) < 0) { 1784 os_memset(&ie, 0, sizeof(ie)); 1785 ie.group_cipher = ssid->group_cipher; 1786 ie.pairwise_cipher = ssid->pairwise_cipher; 1787 ie.key_mgmt = ssid->key_mgmt; 1788 ie.mgmt_group_cipher = 0; 1789 if (ssid->ieee80211w != NO_MGMT_FRAME_PROTECTION) { 1790 if (ssid->group_mgmt_cipher & 1791 WPA_CIPHER_BIP_GMAC_256) 1792 ie.mgmt_group_cipher = 1793 WPA_CIPHER_BIP_GMAC_256; 1794 else if (ssid->group_mgmt_cipher & 1795 WPA_CIPHER_BIP_CMAC_256) 1796 ie.mgmt_group_cipher = 1797 WPA_CIPHER_BIP_CMAC_256; 1798 else if (ssid->group_mgmt_cipher & 1799 WPA_CIPHER_BIP_GMAC_128) 1800 ie.mgmt_group_cipher = 1801 WPA_CIPHER_BIP_GMAC_128; 1802 else 1803 ie.mgmt_group_cipher = 1804 WPA_CIPHER_AES_128_CMAC; 1805 } 1806 #ifdef CONFIG_OWE 1807 if ((ssid->key_mgmt & WPA_KEY_MGMT_OWE) && 1808 !ssid->owe_only && 1809 !bss_wpa && !bss_rsn && !bss_osen) { 1810 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid); 1811 wpa_s->wpa_proto = 0; 1812 *wpa_ie_len = 0; 1813 return 0; 1814 } 1815 #endif /* CONFIG_OWE */ 1816 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Set cipher suites " 1817 "based on configuration"); 1818 } else 1819 proto = ie.proto; 1820 } 1821 1822 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected cipher suites: group %d " 1823 "pairwise %d key_mgmt %d proto %d", 1824 ie.group_cipher, ie.pairwise_cipher, ie.key_mgmt, proto); 1825 if (ssid->ieee80211w) { 1826 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected mgmt group cipher %d", 1827 ie.mgmt_group_cipher); 1828 } 1829 1830 wpa_s->wpa_proto = proto; 1831 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PROTO, proto); 1832 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED, 1833 !!(ssid->proto & (WPA_PROTO_RSN | WPA_PROTO_OSEN))); 1834 1835 if (bss || !wpa_s->ap_ies_from_associnfo) { 1836 if (wpa_sm_set_ap_wpa_ie(wpa_s->wpa, bss_wpa, 1837 bss_wpa ? 2 + bss_wpa[1] : 0) || 1838 wpa_sm_set_ap_rsn_ie(wpa_s->wpa, bss_rsn, 1839 bss_rsn ? 2 + bss_rsn[1] : 0) || 1840 wpa_sm_set_ap_rsnxe(wpa_s->wpa, bss_rsnx, 1841 bss_rsnx ? 2 + bss_rsnx[1] : 0)) 1842 return -1; 1843 } 1844 1845 #ifdef CONFIG_NO_WPA 1846 wpa_s->group_cipher = WPA_CIPHER_NONE; 1847 wpa_s->pairwise_cipher = WPA_CIPHER_NONE; 1848 #else /* CONFIG_NO_WPA */ 1849 sel = ie.group_cipher & ssid->group_cipher; 1850 wpa_dbg(wpa_s, MSG_DEBUG, 1851 "WPA: AP group 0x%x network profile group 0x%x; available group 0x%x", 1852 ie.group_cipher, ssid->group_cipher, sel); 1853 wpa_s->group_cipher = wpa_pick_group_cipher(sel); 1854 if (wpa_s->group_cipher < 0) { 1855 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select group " 1856 "cipher"); 1857 return -1; 1858 } 1859 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using GTK %s", 1860 wpa_cipher_txt(wpa_s->group_cipher)); 1861 1862 sel = ie.pairwise_cipher & ssid->pairwise_cipher; 1863 wpa_dbg(wpa_s, MSG_DEBUG, 1864 "WPA: AP pairwise 0x%x network profile pairwise 0x%x; available pairwise 0x%x", 1865 ie.pairwise_cipher, ssid->pairwise_cipher, sel); 1866 wpa_s->pairwise_cipher = wpa_pick_pairwise_cipher(sel, 1); 1867 if (wpa_s->pairwise_cipher < 0) { 1868 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select pairwise " 1869 "cipher"); 1870 return -1; 1871 } 1872 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using PTK %s", 1873 wpa_cipher_txt(wpa_s->pairwise_cipher)); 1874 #endif /* CONFIG_NO_WPA */ 1875 1876 sel = ie.key_mgmt & ssid->key_mgmt; 1877 #ifdef CONFIG_SAE 1878 if ((!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SAE) && 1879 !(wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_SAE_OFFLOAD_STA)) || 1880 wpas_is_sae_avoided(wpa_s, ssid, &ie)) 1881 sel &= ~(WPA_KEY_MGMT_SAE | WPA_KEY_MGMT_SAE_EXT_KEY | 1882 WPA_KEY_MGMT_FT_SAE | WPA_KEY_MGMT_FT_SAE_EXT_KEY); 1883 #endif /* CONFIG_SAE */ 1884 #ifdef CONFIG_IEEE80211R 1885 if (!(wpa_s->drv_flags & (WPA_DRIVER_FLAGS_SME | 1886 WPA_DRIVER_FLAGS_UPDATE_FT_IES))) 1887 sel &= ~WPA_KEY_MGMT_FT; 1888 #endif /* CONFIG_IEEE80211R */ 1889 wpa_dbg(wpa_s, MSG_DEBUG, 1890 "WPA: AP key_mgmt 0x%x network profile key_mgmt 0x%x; available key_mgmt 0x%x", 1891 ie.key_mgmt, ssid->key_mgmt, sel); 1892 if (0) { 1893 #ifdef CONFIG_IEEE80211R 1894 #ifdef CONFIG_SHA384 1895 } else if ((sel & WPA_KEY_MGMT_FT_IEEE8021X_SHA384) && 1896 os_strcmp(wpa_supplicant_get_eap_mode(wpa_s), "LEAP") != 0) { 1897 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_IEEE8021X_SHA384; 1898 wpa_dbg(wpa_s, MSG_DEBUG, 1899 "WPA: using KEY_MGMT FT/802.1X-SHA384"); 1900 if (!ssid->ft_eap_pmksa_caching && 1901 pmksa_cache_get_current(wpa_s->wpa)) { 1902 /* PMKSA caching with FT may have interoperability 1903 * issues, so disable that case by default for now. */ 1904 wpa_dbg(wpa_s, MSG_DEBUG, 1905 "WPA: Disable PMKSA caching for FT/802.1X connection"); 1906 pmksa_cache_clear_current(wpa_s->wpa); 1907 } 1908 #endif /* CONFIG_SHA384 */ 1909 #endif /* CONFIG_IEEE80211R */ 1910 #ifdef CONFIG_SUITEB192 1911 } else if (sel & WPA_KEY_MGMT_IEEE8021X_SUITE_B_192) { 1912 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SUITE_B_192; 1913 wpa_dbg(wpa_s, MSG_DEBUG, 1914 "WPA: using KEY_MGMT 802.1X with Suite B (192-bit)"); 1915 #endif /* CONFIG_SUITEB192 */ 1916 #ifdef CONFIG_SUITEB 1917 } else if (sel & WPA_KEY_MGMT_IEEE8021X_SUITE_B) { 1918 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SUITE_B; 1919 wpa_dbg(wpa_s, MSG_DEBUG, 1920 "WPA: using KEY_MGMT 802.1X with Suite B"); 1921 #endif /* CONFIG_SUITEB */ 1922 #ifdef CONFIG_SHA384 1923 } else if (sel & WPA_KEY_MGMT_IEEE8021X_SHA384) { 1924 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SHA384; 1925 wpa_dbg(wpa_s, MSG_DEBUG, 1926 "WPA: using KEY_MGMT 802.1X with SHA384"); 1927 #endif /* CONFIG_SHA384 */ 1928 #ifdef CONFIG_FILS 1929 #ifdef CONFIG_IEEE80211R 1930 } else if (sel & WPA_KEY_MGMT_FT_FILS_SHA384) { 1931 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_FILS_SHA384; 1932 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT-FILS-SHA384"); 1933 #endif /* CONFIG_IEEE80211R */ 1934 } else if (sel & WPA_KEY_MGMT_FILS_SHA384) { 1935 wpa_s->key_mgmt = WPA_KEY_MGMT_FILS_SHA384; 1936 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FILS-SHA384"); 1937 #ifdef CONFIG_IEEE80211R 1938 } else if (sel & WPA_KEY_MGMT_FT_FILS_SHA256) { 1939 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_FILS_SHA256; 1940 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT-FILS-SHA256"); 1941 #endif /* CONFIG_IEEE80211R */ 1942 } else if (sel & WPA_KEY_MGMT_FILS_SHA256) { 1943 wpa_s->key_mgmt = WPA_KEY_MGMT_FILS_SHA256; 1944 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FILS-SHA256"); 1945 #endif /* CONFIG_FILS */ 1946 #ifdef CONFIG_IEEE80211R 1947 } else if ((sel & WPA_KEY_MGMT_FT_IEEE8021X) && 1948 os_strcmp(wpa_supplicant_get_eap_mode(wpa_s), "LEAP") != 0) { 1949 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_IEEE8021X; 1950 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/802.1X"); 1951 if (!ssid->ft_eap_pmksa_caching && 1952 pmksa_cache_get_current(wpa_s->wpa)) { 1953 /* PMKSA caching with FT may have interoperability 1954 * issues, so disable that case by default for now. */ 1955 wpa_dbg(wpa_s, MSG_DEBUG, 1956 "WPA: Disable PMKSA caching for FT/802.1X connection"); 1957 pmksa_cache_clear_current(wpa_s->wpa); 1958 } 1959 #endif /* CONFIG_IEEE80211R */ 1960 #ifdef CONFIG_DPP 1961 } else if (sel & WPA_KEY_MGMT_DPP) { 1962 wpa_s->key_mgmt = WPA_KEY_MGMT_DPP; 1963 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT DPP"); 1964 #endif /* CONFIG_DPP */ 1965 #ifdef CONFIG_SAE 1966 } else if (sel & WPA_KEY_MGMT_FT_SAE_EXT_KEY) { 1967 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_SAE_EXT_KEY; 1968 wpa_dbg(wpa_s, MSG_DEBUG, 1969 "RSN: using KEY_MGMT FT/SAE (ext key)"); 1970 } else if (sel & WPA_KEY_MGMT_SAE_EXT_KEY) { 1971 wpa_s->key_mgmt = WPA_KEY_MGMT_SAE_EXT_KEY; 1972 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT SAE (ext key)"); 1973 } else if (sel & WPA_KEY_MGMT_FT_SAE) { 1974 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_SAE; 1975 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT FT/SAE"); 1976 } else if (sel & WPA_KEY_MGMT_SAE) { 1977 wpa_s->key_mgmt = WPA_KEY_MGMT_SAE; 1978 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT SAE"); 1979 #endif /* CONFIG_SAE */ 1980 #ifdef CONFIG_IEEE80211R 1981 } else if (sel & WPA_KEY_MGMT_FT_PSK) { 1982 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_PSK; 1983 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/PSK"); 1984 #endif /* CONFIG_IEEE80211R */ 1985 } else if (sel & WPA_KEY_MGMT_IEEE8021X_SHA256) { 1986 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SHA256; 1987 wpa_dbg(wpa_s, MSG_DEBUG, 1988 "WPA: using KEY_MGMT 802.1X with SHA256"); 1989 } else if (sel & WPA_KEY_MGMT_PSK_SHA256) { 1990 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK_SHA256; 1991 wpa_dbg(wpa_s, MSG_DEBUG, 1992 "WPA: using KEY_MGMT PSK with SHA256"); 1993 } else if (sel & WPA_KEY_MGMT_IEEE8021X) { 1994 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X; 1995 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT 802.1X"); 1996 } else if (sel & WPA_KEY_MGMT_PSK) { 1997 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK; 1998 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-PSK"); 1999 } else if (sel & WPA_KEY_MGMT_WPA_NONE) { 2000 wpa_s->key_mgmt = WPA_KEY_MGMT_WPA_NONE; 2001 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-NONE"); 2002 #ifdef CONFIG_HS20 2003 } else if (sel & WPA_KEY_MGMT_OSEN) { 2004 wpa_s->key_mgmt = WPA_KEY_MGMT_OSEN; 2005 wpa_dbg(wpa_s, MSG_DEBUG, "HS 2.0: using KEY_MGMT OSEN"); 2006 #endif /* CONFIG_HS20 */ 2007 #ifdef CONFIG_OWE 2008 } else if (sel & WPA_KEY_MGMT_OWE) { 2009 wpa_s->key_mgmt = WPA_KEY_MGMT_OWE; 2010 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT OWE"); 2011 #endif /* CONFIG_OWE */ 2012 } else { 2013 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select " 2014 "authenticated key management type"); 2015 return -1; 2016 } 2017 2018 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt); 2019 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE, 2020 wpa_s->pairwise_cipher); 2021 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher); 2022 2023 if (!(ie.capabilities & WPA_CAPABILITY_MFPC) && 2024 (wpas_get_ssid_pmf(wpa_s, ssid) == MGMT_FRAME_PROTECTION_REQUIRED || 2025 (bss && is_6ghz_freq(bss->freq)))) { 2026 wpa_msg(wpa_s, MSG_INFO, 2027 "RSN: Management frame protection required but the selected AP does not enable it"); 2028 return -1; 2029 } 2030 2031 wpas_set_mgmt_group_cipher(wpa_s, ssid, &ie); 2032 #ifdef CONFIG_OCV 2033 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) || 2034 (wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_OCV)) 2035 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_OCV, ssid->ocv); 2036 #endif /* CONFIG_OCV */ 2037 sae_pwe = wpa_s->conf->sae_pwe; 2038 if ((ssid->sae_password_id || 2039 wpa_key_mgmt_sae_ext_key(wpa_s->key_mgmt)) && 2040 sae_pwe != SAE_PWE_FORCE_HUNT_AND_PECK) 2041 sae_pwe = SAE_PWE_HASH_TO_ELEMENT; 2042 if (bss && is_6ghz_freq(bss->freq) && 2043 sae_pwe == SAE_PWE_HUNT_AND_PECK) { 2044 wpa_dbg(wpa_s, MSG_DEBUG, 2045 "RSN: Enable SAE hash-to-element mode for 6 GHz BSS"); 2046 sae_pwe = SAE_PWE_BOTH; 2047 } 2048 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_SAE_PWE, sae_pwe); 2049 #ifdef CONFIG_SAE_PK 2050 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_SAE_PK, 2051 wpa_key_mgmt_sae(ssid->key_mgmt) && 2052 ssid->sae_pk != SAE_PK_MODE_DISABLED && 2053 ((ssid->sae_password && 2054 sae_pk_valid_password(ssid->sae_password)) || 2055 (!ssid->sae_password && ssid->passphrase && 2056 sae_pk_valid_password(ssid->passphrase)))); 2057 #endif /* CONFIG_SAE_PK */ 2058 if (bss && is_6ghz_freq(bss->freq) && 2059 wpas_get_ssid_pmf(wpa_s, ssid) != MGMT_FRAME_PROTECTION_REQUIRED) { 2060 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: Force MFPR=1 on 6 GHz"); 2061 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MFP, 2062 MGMT_FRAME_PROTECTION_REQUIRED); 2063 } 2064 #ifdef CONFIG_TESTING_OPTIONS 2065 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_FT_RSNXE_USED, 2066 wpa_s->ft_rsnxe_used); 2067 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_OCI_FREQ_EAPOL, 2068 wpa_s->oci_freq_override_eapol); 2069 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_OCI_FREQ_EAPOL_G2, 2070 wpa_s->oci_freq_override_eapol_g2); 2071 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_OCI_FREQ_FT_ASSOC, 2072 wpa_s->oci_freq_override_ft_assoc); 2073 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_OCI_FREQ_FILS_ASSOC, 2074 wpa_s->oci_freq_override_fils_assoc); 2075 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_DISABLE_EAPOL_G2_TX, 2076 wpa_s->disable_eapol_g2_tx); 2077 #endif /* CONFIG_TESTING_OPTIONS */ 2078 2079 /* Extended Key ID is only supported in infrastructure BSS so far */ 2080 if (ssid->mode == WPAS_MODE_INFRA && wpa_s->conf->extended_key_id && 2081 (ssid->proto & WPA_PROTO_RSN) && 2082 ssid->pairwise_cipher & (WPA_CIPHER_CCMP | WPA_CIPHER_CCMP_256 | 2083 WPA_CIPHER_GCMP | WPA_CIPHER_GCMP_256) && 2084 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_EXTENDED_KEY_ID)) { 2085 int use_ext_key_id = 0; 2086 2087 wpa_msg(wpa_s, MSG_DEBUG, 2088 "WPA: Enable Extended Key ID support"); 2089 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_EXT_KEY_ID, 2090 wpa_s->conf->extended_key_id); 2091 if (bss_rsn && 2092 wpa_s->conf->extended_key_id && 2093 wpa_s->pairwise_cipher != WPA_CIPHER_TKIP && 2094 (ie.capabilities & WPA_CAPABILITY_EXT_KEY_ID_FOR_UNICAST)) 2095 use_ext_key_id = 1; 2096 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_USE_EXT_KEY_ID, 2097 use_ext_key_id); 2098 } else { 2099 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_EXT_KEY_ID, 0); 2100 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_USE_EXT_KEY_ID, 0); 2101 } 2102 2103 /* Mark WMM enabled for any HT/VHT/HE/EHT association to get more 2104 * appropriate advertisement of the supported number of PTKSA receive 2105 * counters. In theory, this could be based on a driver capability, but 2106 * in practice all cases using WMM support at least eight replay 2107 * counters, so use a hardcoded value for now since there is no explicit 2108 * driver capability indication for this. 2109 * 2110 * In addition, claim WMM to be enabled if the AP supports it since it 2111 * is far more likely for any current device to support WMM. */ 2112 wmm = wpa_s->connection_set && 2113 (wpa_s->connection_ht || wpa_s->connection_vht || 2114 wpa_s->connection_he || wpa_s->connection_eht); 2115 if (!wmm && bss) 2116 wmm = !!wpa_bss_get_vendor_ie(bss, WMM_IE_VENDOR_TYPE); 2117 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_WMM_ENABLED, wmm); 2118 2119 if (ssid->ssid_protection && proto == WPA_PROTO_RSN) { 2120 bool ssid_prot; 2121 2122 /* Enable SSID protection based on the AP advertising support 2123 * for it to avoid potential interoperability issues with 2124 * incorrect AP behavior if we were to send an "unexpected" 2125 * RSNXE with multiple octets of payload. */ 2126 ssid_prot = ieee802_11_rsnx_capab( 2127 bss_rsnx, WLAN_RSNX_CAPAB_SSID_PROTECTION); 2128 if (!skip_default_rsne) 2129 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_SSID_PROTECTION, 2130 proto == WPA_PROTO_RSN && ssid_prot); 2131 } else { 2132 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_SSID_PROTECTION, false); 2133 } 2134 2135 if (!skip_default_rsne) { 2136 if (wpa_sm_set_assoc_wpa_ie_default(wpa_s->wpa, wpa_ie, 2137 wpa_ie_len)) { 2138 wpa_msg(wpa_s, MSG_WARNING, 2139 "RSN: Failed to generate RSNE/WPA IE"); 2140 return -1; 2141 } 2142 2143 wpa_s->rsnxe_len = sizeof(wpa_s->rsnxe); 2144 if (wpa_sm_set_assoc_rsnxe_default(wpa_s->wpa, wpa_s->rsnxe, 2145 &wpa_s->rsnxe_len)) { 2146 wpa_msg(wpa_s, MSG_WARNING, 2147 "RSN: Failed to generate RSNXE"); 2148 return -1; 2149 } 2150 } 2151 2152 if (0) { 2153 #ifdef CONFIG_DPP 2154 } else if (wpa_s->key_mgmt == WPA_KEY_MGMT_DPP) { 2155 /* Use PMK from DPP network introduction (PMKSA entry) */ 2156 wpa_sm_set_pmk_from_pmksa(wpa_s->wpa); 2157 #ifdef CONFIG_DPP2 2158 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_DPP_PFS, ssid->dpp_pfs); 2159 #endif /* CONFIG_DPP2 */ 2160 #endif /* CONFIG_DPP */ 2161 } else if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt)) { 2162 int psk_set = 0; 2163 2164 if (wpa_key_mgmt_wpa_psk_no_sae(ssid->key_mgmt)) { 2165 u8 psk[PMK_LEN]; 2166 2167 if (wpa_supplicant_get_psk(wpa_s, bss, ssid, 2168 psk) == 0) { 2169 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN, NULL, 2170 NULL); 2171 psk_set = 1; 2172 } 2173 forced_memzero(psk, sizeof(psk)); 2174 } 2175 2176 if (wpa_key_mgmt_sae(ssid->key_mgmt) && 2177 (ssid->sae_password || ssid->passphrase || ssid->ext_psk)) 2178 psk_set = 1; 2179 2180 if (!psk_set) { 2181 wpa_msg(wpa_s, MSG_INFO, 2182 "No PSK available for association"); 2183 wpas_auth_failed(wpa_s, "NO_PSK_AVAILABLE", NULL); 2184 return -1; 2185 } 2186 #ifdef CONFIG_OWE 2187 } else if (wpa_s->key_mgmt == WPA_KEY_MGMT_OWE) { 2188 /* OWE Diffie-Hellman exchange in (Re)Association 2189 * Request/Response frames set the PMK, so do not override it 2190 * here. */ 2191 #endif /* CONFIG_OWE */ 2192 } else 2193 wpa_sm_set_pmk_from_pmksa(wpa_s->wpa); 2194 2195 if (ssid->mode != WPAS_MODE_IBSS && 2196 !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED) && 2197 (ssid->wpa_deny_ptk0_rekey == PTK0_REKEY_ALLOW_NEVER || 2198 (ssid->wpa_deny_ptk0_rekey == PTK0_REKEY_ALLOW_LOCAL_OK && 2199 !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SAFE_PTK0_REKEYS)))) { 2200 wpa_msg(wpa_s, MSG_INFO, 2201 "Disable PTK0 rekey support - replaced with reconnect"); 2202 wpa_s->deny_ptk0_rekey = 1; 2203 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_DENY_PTK0_REKEY, 1); 2204 } else { 2205 wpa_s->deny_ptk0_rekey = 0; 2206 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_DENY_PTK0_REKEY, 0); 2207 } 2208 2209 if (wpa_key_mgmt_cross_akm(wpa_s->key_mgmt) && 2210 !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME)) 2211 wpas_update_allowed_key_mgmt(wpa_s, ssid); 2212 2213 return 0; 2214 } 2215 2216 2217 static void wpas_ext_capab_byte(struct wpa_supplicant *wpa_s, u8 *pos, int idx, 2218 struct wpa_bss *bss) 2219 { 2220 #ifndef CONFIG_NO_ROBUST_AV 2221 bool scs = true, mscs = true; 2222 #endif /* CONFIG_NO_ROBUST_AV */ 2223 2224 *pos = 0x00; 2225 2226 switch (idx) { 2227 case 0: /* Bits 0-7 */ 2228 break; 2229 case 1: /* Bits 8-15 */ 2230 if (wpa_s->conf->coloc_intf_reporting) { 2231 /* Bit 13 - Collocated Interference Reporting */ 2232 *pos |= 0x20; 2233 } 2234 break; 2235 case 2: /* Bits 16-23 */ 2236 #ifdef CONFIG_WNM 2237 *pos |= 0x02; /* Bit 17 - WNM-Sleep Mode */ 2238 if ((wpas_driver_bss_selection(wpa_s) || 2239 !wpa_s->disable_mbo_oce) && 2240 !wpa_s->conf->disable_btm) 2241 *pos |= 0x08; /* Bit 19 - BSS Transition */ 2242 #endif /* CONFIG_WNM */ 2243 break; 2244 case 3: /* Bits 24-31 */ 2245 #ifdef CONFIG_WNM 2246 *pos |= 0x02; /* Bit 25 - SSID List */ 2247 #endif /* CONFIG_WNM */ 2248 #ifdef CONFIG_INTERWORKING 2249 if (wpa_s->conf->interworking) 2250 *pos |= 0x80; /* Bit 31 - Interworking */ 2251 #endif /* CONFIG_INTERWORKING */ 2252 break; 2253 case 4: /* Bits 32-39 */ 2254 #ifdef CONFIG_INTERWORKING 2255 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_QOS_MAPPING) 2256 *pos |= 0x01; /* Bit 32 - QoS Map */ 2257 #endif /* CONFIG_INTERWORKING */ 2258 break; 2259 case 5: /* Bits 40-47 */ 2260 #ifdef CONFIG_HS20 2261 if (wpa_s->conf->hs20) 2262 *pos |= 0x40; /* Bit 46 - WNM-Notification */ 2263 #endif /* CONFIG_HS20 */ 2264 #ifdef CONFIG_MBO 2265 *pos |= 0x40; /* Bit 46 - WNM-Notification */ 2266 #endif /* CONFIG_MBO */ 2267 break; 2268 case 6: /* Bits 48-55 */ 2269 #ifndef CONFIG_NO_ROBUST_AV 2270 #ifdef CONFIG_TESTING_OPTIONS 2271 if (wpa_s->disable_scs_support) 2272 scs = false; 2273 #endif /* CONFIG_TESTING_OPTIONS */ 2274 if (bss && !wpa_bss_ext_capab(bss, WLAN_EXT_CAPAB_SCS)) { 2275 /* Drop own SCS capability indication since the AP does 2276 * not support it. This is needed to avoid 2277 * interoperability issues with APs that get confused 2278 * with Extended Capabilities element. */ 2279 scs = false; 2280 } 2281 if (scs) 2282 *pos |= 0x40; /* Bit 54 - SCS */ 2283 #endif /* CONFIG_NO_ROBUST_AV */ 2284 break; 2285 case 7: /* Bits 56-63 */ 2286 break; 2287 case 8: /* Bits 64-71 */ 2288 if (wpa_s->conf->ftm_responder) 2289 *pos |= 0x40; /* Bit 70 - FTM responder */ 2290 if (wpa_s->conf->ftm_initiator) 2291 *pos |= 0x80; /* Bit 71 - FTM initiator */ 2292 break; 2293 case 9: /* Bits 72-79 */ 2294 #ifdef CONFIG_FILS 2295 if (!wpa_s->disable_fils) 2296 *pos |= 0x01; 2297 #endif /* CONFIG_FILS */ 2298 break; 2299 case 10: /* Bits 80-87 */ 2300 #ifndef CONFIG_NO_ROBUST_AV 2301 #ifdef CONFIG_TESTING_OPTIONS 2302 if (wpa_s->disable_mscs_support) 2303 mscs = false; 2304 #endif /* CONFIG_TESTING_OPTIONS */ 2305 if (bss && !wpa_bss_ext_capab(bss, WLAN_EXT_CAPAB_MSCS)) { 2306 /* Drop own MSCS capability indication since the AP does 2307 * not support it. This is needed to avoid 2308 * interoperability issues with APs that get confused 2309 * with Extended Capabilities element. */ 2310 mscs = false; 2311 } 2312 if (mscs) 2313 *pos |= 0x20; /* Bit 85 - Mirrored SCS */ 2314 #endif /* CONFIG_NO_ROBUST_AV */ 2315 break; 2316 } 2317 } 2318 2319 2320 int wpas_build_ext_capab(struct wpa_supplicant *wpa_s, u8 *buf, 2321 size_t buflen, struct wpa_bss *bss) 2322 { 2323 u8 *pos = buf; 2324 u8 len = 11, i; 2325 2326 if (len < wpa_s->extended_capa_len) 2327 len = wpa_s->extended_capa_len; 2328 if (buflen < (size_t) len + 2) { 2329 wpa_printf(MSG_INFO, 2330 "Not enough room for building extended capabilities element"); 2331 return -1; 2332 } 2333 2334 *pos++ = WLAN_EID_EXT_CAPAB; 2335 *pos++ = len; 2336 for (i = 0; i < len; i++, pos++) { 2337 wpas_ext_capab_byte(wpa_s, pos, i, bss); 2338 2339 if (i < wpa_s->extended_capa_len) { 2340 *pos &= ~wpa_s->extended_capa_mask[i]; 2341 *pos |= wpa_s->extended_capa[i]; 2342 } 2343 } 2344 2345 while (len > 0 && buf[1 + len] == 0) { 2346 len--; 2347 buf[1] = len; 2348 } 2349 if (len == 0) 2350 return 0; 2351 2352 return 2 + len; 2353 } 2354 2355 2356 static int wpas_valid_bss(struct wpa_supplicant *wpa_s, 2357 struct wpa_bss *test_bss) 2358 { 2359 struct wpa_bss *bss; 2360 2361 dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) { 2362 if (bss == test_bss) 2363 return 1; 2364 } 2365 2366 return 0; 2367 } 2368 2369 2370 static int wpas_valid_ssid(struct wpa_supplicant *wpa_s, 2371 struct wpa_ssid *test_ssid) 2372 { 2373 struct wpa_ssid *ssid; 2374 2375 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) { 2376 if (ssid == test_ssid) 2377 return 1; 2378 } 2379 2380 return 0; 2381 } 2382 2383 2384 int wpas_valid_bss_ssid(struct wpa_supplicant *wpa_s, struct wpa_bss *test_bss, 2385 struct wpa_ssid *test_ssid) 2386 { 2387 if (test_bss && !wpas_valid_bss(wpa_s, test_bss)) 2388 return 0; 2389 2390 return test_ssid == NULL || wpas_valid_ssid(wpa_s, test_ssid); 2391 } 2392 2393 2394 void wpas_connect_work_free(struct wpa_connect_work *cwork) 2395 { 2396 if (cwork == NULL) 2397 return; 2398 os_free(cwork); 2399 } 2400 2401 2402 void wpas_connect_work_done(struct wpa_supplicant *wpa_s) 2403 { 2404 struct wpa_connect_work *cwork; 2405 struct wpa_radio_work *work = wpa_s->connect_work; 2406 2407 if (!work) 2408 return; 2409 2410 wpa_s->connect_work = NULL; 2411 cwork = work->ctx; 2412 work->ctx = NULL; 2413 wpas_connect_work_free(cwork); 2414 radio_work_done(work); 2415 } 2416 2417 2418 int wpas_update_random_addr(struct wpa_supplicant *wpa_s, 2419 enum wpas_mac_addr_style style, 2420 struct wpa_ssid *ssid) 2421 { 2422 struct os_reltime now; 2423 u8 addr[ETH_ALEN]; 2424 2425 os_get_reltime(&now); 2426 /* Random addresses are valid within a given ESS so check 2427 * expiration/value only when continuing to use the same ESS. */ 2428 if (wpa_s->last_mac_addr_style == style && wpa_s->reassoc_same_ess) { 2429 if (style == WPAS_MAC_ADDR_STYLE_DEDICATED_PER_ESS) { 2430 /* Pregenerated addresses do not expire but their value 2431 * might have changed, so let's check that. */ 2432 if (ether_addr_equal(wpa_s->own_addr, ssid->mac_value)) 2433 return 0; 2434 } else if ((wpa_s->last_mac_addr_change.sec != 0 || 2435 wpa_s->last_mac_addr_change.usec != 0) && 2436 !os_reltime_expired( 2437 &now, 2438 &wpa_s->last_mac_addr_change, 2439 wpa_s->conf->rand_addr_lifetime)) { 2440 wpa_msg(wpa_s, MSG_DEBUG, 2441 "Previously selected random MAC address has not yet expired"); 2442 return 0; 2443 } 2444 } 2445 2446 switch (style) { 2447 case WPAS_MAC_ADDR_STYLE_RANDOM: 2448 if (random_mac_addr(addr) < 0) 2449 return -1; 2450 break; 2451 case WPAS_MAC_ADDR_STYLE_RANDOM_SAME_OUI: 2452 os_memcpy(addr, wpa_s->perm_addr, ETH_ALEN); 2453 if (random_mac_addr_keep_oui(addr) < 0) 2454 return -1; 2455 break; 2456 case WPAS_MAC_ADDR_STYLE_DEDICATED_PER_ESS: 2457 if (!ssid) { 2458 wpa_msg(wpa_s, MSG_INFO, 2459 "Invalid 'ssid' for address policy 3"); 2460 return -1; 2461 } 2462 os_memcpy(addr, ssid->mac_value, ETH_ALEN); 2463 break; 2464 default: 2465 return -1; 2466 } 2467 2468 if (wpa_drv_set_mac_addr(wpa_s, addr) < 0) { 2469 wpa_msg(wpa_s, MSG_INFO, 2470 "Failed to set random MAC address"); 2471 return -1; 2472 } 2473 2474 os_get_reltime(&wpa_s->last_mac_addr_change); 2475 wpa_s->mac_addr_changed = 1; 2476 wpa_s->last_mac_addr_style = style; 2477 2478 if (wpa_supplicant_update_mac_addr(wpa_s) < 0) { 2479 wpa_msg(wpa_s, MSG_INFO, 2480 "Could not update MAC address information"); 2481 return -1; 2482 } 2483 2484 wpa_msg(wpa_s, MSG_DEBUG, "Using random MAC address " MACSTR, 2485 MAC2STR(addr)); 2486 2487 return 1; 2488 } 2489 2490 2491 int wpas_update_random_addr_disassoc(struct wpa_supplicant *wpa_s) 2492 { 2493 if (wpa_s->wpa_state >= WPA_AUTHENTICATING || 2494 !wpa_s->conf->preassoc_mac_addr) 2495 return 0; 2496 2497 return wpas_update_random_addr(wpa_s, wpa_s->conf->preassoc_mac_addr, 2498 NULL); 2499 } 2500 2501 2502 void wpa_s_setup_sae_pt(struct wpa_config *conf, struct wpa_ssid *ssid, 2503 bool force) 2504 { 2505 #ifdef CONFIG_SAE 2506 int *groups = conf->sae_groups; 2507 int default_groups[] = { 19, 20, 21, 0 }; 2508 const char *password; 2509 2510 if (!groups || groups[0] <= 0) 2511 groups = default_groups; 2512 2513 password = ssid->sae_password; 2514 if (!password) 2515 password = ssid->passphrase; 2516 2517 if (!password || 2518 !wpa_key_mgmt_sae(ssid->key_mgmt) || 2519 (conf->sae_pwe == SAE_PWE_HUNT_AND_PECK && !ssid->sae_password_id && 2520 !wpa_key_mgmt_sae_ext_key(ssid->key_mgmt) && 2521 !force && 2522 !sae_pk_valid_password(password)) || 2523 conf->sae_pwe == SAE_PWE_FORCE_HUNT_AND_PECK) { 2524 /* PT derivation not needed */ 2525 sae_deinit_pt(ssid->pt); 2526 ssid->pt = NULL; 2527 return; 2528 } 2529 2530 if (ssid->pt) 2531 return; /* PT already derived */ 2532 ssid->pt = sae_derive_pt(groups, ssid->ssid, ssid->ssid_len, 2533 (const u8 *) password, os_strlen(password), 2534 ssid->sae_password_id); 2535 #endif /* CONFIG_SAE */ 2536 } 2537 2538 2539 void wpa_s_clear_sae_rejected(struct wpa_supplicant *wpa_s) 2540 { 2541 #if defined(CONFIG_SAE) && defined(CONFIG_SME) 2542 os_free(wpa_s->sme.sae_rejected_groups); 2543 wpa_s->sme.sae_rejected_groups = NULL; 2544 #ifdef CONFIG_TESTING_OPTIONS 2545 if (wpa_s->extra_sae_rejected_groups) { 2546 int i, *groups = wpa_s->extra_sae_rejected_groups; 2547 2548 for (i = 0; groups[i]; i++) { 2549 wpa_printf(MSG_DEBUG, 2550 "TESTING: Indicate rejection of an extra SAE group %d", 2551 groups[i]); 2552 int_array_add_unique(&wpa_s->sme.sae_rejected_groups, 2553 groups[i]); 2554 } 2555 } 2556 #endif /* CONFIG_TESTING_OPTIONS */ 2557 #endif /* CONFIG_SAE && CONFIG_SME */ 2558 } 2559 2560 2561 int wpas_restore_permanent_mac_addr(struct wpa_supplicant *wpa_s) 2562 { 2563 if (wpa_drv_set_mac_addr(wpa_s, NULL) < 0) { 2564 wpa_msg(wpa_s, MSG_INFO, 2565 "Could not restore permanent MAC address"); 2566 return -1; 2567 } 2568 wpa_s->mac_addr_changed = 0; 2569 if (wpa_supplicant_update_mac_addr(wpa_s) < 0) { 2570 wpa_msg(wpa_s, MSG_INFO, 2571 "Could not update MAC address information"); 2572 return -1; 2573 } 2574 wpa_msg(wpa_s, MSG_DEBUG, "Using permanent MAC address"); 2575 return 0; 2576 } 2577 2578 2579 static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit); 2580 2581 /** 2582 * wpa_supplicant_associate - Request association 2583 * @wpa_s: Pointer to wpa_supplicant data 2584 * @bss: Scan results for the selected BSS, or %NULL if not available 2585 * @ssid: Configuration data for the selected network 2586 * 2587 * This function is used to request %wpa_supplicant to associate with a BSS. 2588 */ 2589 void wpa_supplicant_associate(struct wpa_supplicant *wpa_s, 2590 struct wpa_bss *bss, struct wpa_ssid *ssid) 2591 { 2592 bool clear_rejected = true; 2593 struct wpa_connect_work *cwork; 2594 enum wpas_mac_addr_style rand_style; 2595 2596 wpa_s->own_disconnect_req = 0; 2597 wpa_s->own_reconnect_req = 0; 2598 2599 /* 2600 * If we are starting a new connection, any previously pending EAPOL 2601 * RX cannot be valid anymore. 2602 */ 2603 wpabuf_free(wpa_s->pending_eapol_rx); 2604 wpa_s->pending_eapol_rx = NULL; 2605 2606 if (ssid->mac_addr == WPAS_MAC_ADDR_STYLE_NOT_SET) 2607 rand_style = wpa_s->conf->mac_addr; 2608 else 2609 rand_style = ssid->mac_addr; 2610 2611 wpa_s->eapol_failed = 0; 2612 wpa_s->multi_ap_ie = 0; 2613 #ifndef CONFIG_NO_WMM_AC 2614 wmm_ac_clear_saved_tspecs(wpa_s); 2615 #endif /* CONFIG_NO_WMM_AC */ 2616 #ifdef CONFIG_WNM 2617 wpa_s->wnm_mode = 0; 2618 wpa_s->wnm_target_bss = NULL; 2619 #endif /* CONFIG_WNM */ 2620 wpa_s->reassoc_same_bss = 0; 2621 wpa_s->reassoc_same_ess = 0; 2622 #ifdef CONFIG_TESTING_OPTIONS 2623 wpa_s->testing_resend_assoc = 0; 2624 #endif /* CONFIG_TESTING_OPTIONS */ 2625 2626 if (wpa_s->last_ssid == ssid) { 2627 wpa_dbg(wpa_s, MSG_DEBUG, "Re-association to the same ESS"); 2628 wpa_s->reassoc_same_ess = 1; 2629 if (wpa_s->current_bss && wpa_s->current_bss == bss) { 2630 #ifndef CONFIG_NO_WMM_AC 2631 wmm_ac_save_tspecs(wpa_s); 2632 #endif /* CONFIG_NO_WMM_AC */ 2633 wpa_s->reassoc_same_bss = 1; 2634 clear_rejected = false; 2635 } else if (wpa_s->current_bss && wpa_s->current_bss != bss) { 2636 os_get_reltime(&wpa_s->roam_start); 2637 } 2638 } 2639 2640 if (clear_rejected) 2641 wpa_s_clear_sae_rejected(wpa_s); 2642 2643 #ifdef CONFIG_SAE 2644 wpa_s_setup_sae_pt(wpa_s->conf, ssid, false); 2645 #endif /* CONFIG_SAE */ 2646 2647 if (rand_style > WPAS_MAC_ADDR_STYLE_PERMANENT) { 2648 int status = wpas_update_random_addr(wpa_s, rand_style, ssid); 2649 2650 if (status < 0) 2651 return; 2652 if (rand_style != WPAS_MAC_ADDR_STYLE_DEDICATED_PER_ESS && 2653 status > 0) /* MAC changed */ 2654 wpa_sm_pmksa_cache_flush(wpa_s->wpa, ssid); 2655 } else if (rand_style == WPAS_MAC_ADDR_STYLE_PERMANENT && 2656 wpa_s->mac_addr_changed) { 2657 if (wpas_restore_permanent_mac_addr(wpa_s) < 0) 2658 return; 2659 } 2660 wpa_s->last_ssid = ssid; 2661 2662 #ifdef CONFIG_IBSS_RSN 2663 ibss_rsn_deinit(wpa_s->ibss_rsn); 2664 wpa_s->ibss_rsn = NULL; 2665 #else /* CONFIG_IBSS_RSN */ 2666 if (ssid->mode == WPAS_MODE_IBSS && 2667 !(ssid->key_mgmt & (WPA_KEY_MGMT_NONE | WPA_KEY_MGMT_WPA_NONE))) { 2668 wpa_msg(wpa_s, MSG_INFO, 2669 "IBSS RSN not supported in the build"); 2670 return; 2671 } 2672 #endif /* CONFIG_IBSS_RSN */ 2673 2674 if (ssid->mode == WPAS_MODE_AP || ssid->mode == WPAS_MODE_P2P_GO || 2675 ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) { 2676 #ifdef CONFIG_AP 2677 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_AP)) { 2678 wpa_msg(wpa_s, MSG_INFO, "Driver does not support AP " 2679 "mode"); 2680 return; 2681 } 2682 if (wpa_supplicant_create_ap(wpa_s, ssid) < 0) { 2683 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED); 2684 if (ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) 2685 wpas_p2p_ap_setup_failed(wpa_s); 2686 return; 2687 } 2688 wpa_s->current_bss = bss; 2689 #else /* CONFIG_AP */ 2690 wpa_msg(wpa_s, MSG_ERROR, "AP mode support not included in " 2691 "the build"); 2692 #endif /* CONFIG_AP */ 2693 return; 2694 } 2695 2696 if (ssid->mode == WPAS_MODE_MESH) { 2697 #ifdef CONFIG_MESH 2698 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_MESH)) { 2699 wpa_msg(wpa_s, MSG_INFO, 2700 "Driver does not support mesh mode"); 2701 return; 2702 } 2703 if (bss) 2704 ssid->frequency = bss->freq; 2705 if (wpa_supplicant_join_mesh(wpa_s, ssid) < 0) { 2706 wpa_supplicant_set_state(wpa_s, WPA_INACTIVE); 2707 wpa_msg(wpa_s, MSG_ERROR, "Could not join mesh"); 2708 return; 2709 } 2710 wpa_s->current_bss = bss; 2711 #else /* CONFIG_MESH */ 2712 wpa_msg(wpa_s, MSG_ERROR, 2713 "mesh mode support not included in the build"); 2714 #endif /* CONFIG_MESH */ 2715 return; 2716 } 2717 2718 /* 2719 * Set WPA state machine configuration to match the selected network now 2720 * so that the information is available before wpas_start_assoc_cb() 2721 * gets called. This is needed at least for RSN pre-authentication where 2722 * candidate APs are added to a list based on scan result processing 2723 * before completion of the first association. 2724 */ 2725 wpa_supplicant_rsn_supp_set_config(wpa_s, ssid); 2726 2727 #ifdef CONFIG_DPP 2728 if (wpas_dpp_check_connect(wpa_s, ssid, bss) != 0) 2729 return; 2730 #endif /* CONFIG_DPP */ 2731 2732 #ifdef CONFIG_TDLS 2733 if (bss) 2734 wpa_tdls_ap_ies(wpa_s->wpa, wpa_bss_ie_ptr(bss), bss->ie_len); 2735 #endif /* CONFIG_TDLS */ 2736 2737 #ifdef CONFIG_MBO 2738 wpas_mbo_check_pmf(wpa_s, bss, ssid); 2739 #endif /* CONFIG_MBO */ 2740 2741 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) && 2742 ssid->mode == WPAS_MODE_INFRA) { 2743 sme_authenticate(wpa_s, bss, ssid); 2744 return; 2745 } 2746 2747 if (wpa_s->connect_work) { 2748 wpa_dbg(wpa_s, MSG_DEBUG, "Reject wpa_supplicant_associate() call since connect_work exist"); 2749 return; 2750 } 2751 2752 if (radio_work_pending(wpa_s, "connect")) { 2753 wpa_dbg(wpa_s, MSG_DEBUG, "Reject wpa_supplicant_associate() call since pending work exist"); 2754 return; 2755 } 2756 2757 #ifdef CONFIG_SME 2758 if (ssid->mode == WPAS_MODE_IBSS || ssid->mode == WPAS_MODE_MESH) { 2759 /* Clear possibly set auth_alg, if any, from last attempt. */ 2760 wpa_s->sme.auth_alg = WPA_AUTH_ALG_OPEN; 2761 } 2762 #endif /* CONFIG_SME */ 2763 2764 wpas_abort_ongoing_scan(wpa_s); 2765 2766 cwork = os_zalloc(sizeof(*cwork)); 2767 if (cwork == NULL) 2768 return; 2769 2770 cwork->bss = bss; 2771 cwork->ssid = ssid; 2772 2773 if (radio_add_work(wpa_s, bss ? bss->freq : 0, "connect", 1, 2774 wpas_start_assoc_cb, cwork) < 0) { 2775 os_free(cwork); 2776 } 2777 } 2778 2779 2780 static int bss_is_ibss(struct wpa_bss *bss) 2781 { 2782 return (bss->caps & (IEEE80211_CAP_ESS | IEEE80211_CAP_IBSS)) == 2783 IEEE80211_CAP_IBSS; 2784 } 2785 2786 2787 static int drv_supports_vht(struct wpa_supplicant *wpa_s, 2788 const struct wpa_ssid *ssid) 2789 { 2790 enum hostapd_hw_mode hw_mode; 2791 struct hostapd_hw_modes *mode = NULL; 2792 u8 channel; 2793 int i; 2794 2795 hw_mode = ieee80211_freq_to_chan(ssid->frequency, &channel); 2796 if (hw_mode == NUM_HOSTAPD_MODES) 2797 return 0; 2798 for (i = 0; wpa_s->hw.modes && i < wpa_s->hw.num_modes; i++) { 2799 if (wpa_s->hw.modes[i].mode == hw_mode) { 2800 mode = &wpa_s->hw.modes[i]; 2801 break; 2802 } 2803 } 2804 2805 if (!mode) 2806 return 0; 2807 2808 return mode->vht_capab != 0; 2809 } 2810 2811 2812 static bool ibss_mesh_is_80mhz_avail(int channel, struct hostapd_hw_modes *mode) 2813 { 2814 int i; 2815 2816 for (i = channel; i < channel + 16; i += 4) { 2817 struct hostapd_channel_data *chan; 2818 2819 chan = hw_get_channel_chan(mode, i, NULL); 2820 if (!chan || 2821 chan->flag & (HOSTAPD_CHAN_DISABLED | HOSTAPD_CHAN_NO_IR)) 2822 return false; 2823 } 2824 2825 return true; 2826 } 2827 2828 2829 static struct wpa_bss * ibss_find_existing_bss(struct wpa_supplicant *wpa_s, 2830 const struct wpa_ssid *ssid) 2831 { 2832 unsigned int j; 2833 2834 for (j = 0; j < wpa_s->last_scan_res_used; j++) { 2835 struct wpa_bss *bss = wpa_s->last_scan_res[j]; 2836 2837 if (!bss_is_ibss(bss)) 2838 continue; 2839 2840 if (ssid->ssid_len == bss->ssid_len && 2841 os_memcmp(ssid->ssid, bss->ssid, bss->ssid_len) == 0) 2842 return bss; 2843 } 2844 return NULL; 2845 } 2846 2847 2848 static bool ibss_mesh_can_use_ht(struct wpa_supplicant *wpa_s, 2849 const struct wpa_ssid *ssid, 2850 struct hostapd_hw_modes *mode) 2851 { 2852 /* For IBSS check HT_IBSS flag */ 2853 if (ssid->mode == WPAS_MODE_IBSS && 2854 !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_HT_IBSS)) 2855 return false; 2856 2857 if (wpa_s->group_cipher == WPA_CIPHER_WEP40 || 2858 wpa_s->group_cipher == WPA_CIPHER_WEP104 || 2859 wpa_s->pairwise_cipher == WPA_CIPHER_TKIP) { 2860 wpa_printf(MSG_DEBUG, 2861 "IBSS: WEP/TKIP detected, do not try to enable HT"); 2862 return false; 2863 } 2864 2865 if (!ht_supported(mode)) 2866 return false; 2867 2868 #ifdef CONFIG_HT_OVERRIDES 2869 if (ssid->disable_ht) 2870 return false; 2871 #endif /* CONFIG_HT_OVERRIDES */ 2872 2873 return true; 2874 } 2875 2876 2877 static bool ibss_mesh_can_use_vht(struct wpa_supplicant *wpa_s, 2878 const struct wpa_ssid *ssid, 2879 struct hostapd_hw_modes *mode) 2880 { 2881 if (mode->mode != HOSTAPD_MODE_IEEE80211A) 2882 return false; 2883 2884 if (!drv_supports_vht(wpa_s, ssid)) 2885 return false; 2886 2887 /* For IBSS check VHT_IBSS flag */ 2888 if (ssid->mode == WPAS_MODE_IBSS && 2889 !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_VHT_IBSS)) 2890 return false; 2891 2892 if (!vht_supported(mode)) 2893 return false; 2894 2895 #ifdef CONFIG_VHT_OVERRIDES 2896 if (ssid->disable_vht) 2897 return false; 2898 #endif /* CONFIG_VHT_OVERRIDES */ 2899 2900 return true; 2901 } 2902 2903 2904 static bool ibss_mesh_can_use_he(struct wpa_supplicant *wpa_s, 2905 const struct wpa_ssid *ssid, 2906 const struct hostapd_hw_modes *mode, 2907 int ieee80211_mode) 2908 { 2909 #ifdef CONFIG_HE_OVERRIDES 2910 if (ssid->disable_he) 2911 return false; 2912 #endif /* CONFIG_HE_OVERRIDES */ 2913 2914 switch (mode->mode) { 2915 case HOSTAPD_MODE_IEEE80211G: 2916 case HOSTAPD_MODE_IEEE80211B: 2917 case HOSTAPD_MODE_IEEE80211A: 2918 return mode->he_capab[ieee80211_mode].he_supported; 2919 default: 2920 return false; 2921 } 2922 } 2923 2924 2925 static bool ibss_mesh_can_use_eht(struct wpa_supplicant *wpa_s, 2926 const struct wpa_ssid *ssid, 2927 const struct hostapd_hw_modes *mode, 2928 int ieee80211_mode) 2929 { 2930 if (ssid->disable_eht) 2931 return false; 2932 2933 switch(mode->mode) { 2934 case HOSTAPD_MODE_IEEE80211G: 2935 case HOSTAPD_MODE_IEEE80211B: 2936 case HOSTAPD_MODE_IEEE80211A: 2937 return mode->eht_capab[ieee80211_mode].eht_supported; 2938 default: 2939 return false; 2940 } 2941 } 2942 2943 2944 static void ibss_mesh_select_40mhz(struct wpa_supplicant *wpa_s, 2945 const struct wpa_ssid *ssid, 2946 struct hostapd_hw_modes *mode, 2947 struct hostapd_freq_params *freq, 2948 int obss_scan) { 2949 int chan_idx; 2950 struct hostapd_channel_data *pri_chan = NULL, *sec_chan = NULL; 2951 int i, res; 2952 unsigned int j; 2953 static const int ht40plus[] = { 2954 36, 44, 52, 60, 100, 108, 116, 124, 132, 140, 2955 149, 157, 165, 173, 184, 192 2956 }; 2957 int ht40 = -1; 2958 2959 if (!freq->ht_enabled) 2960 return; 2961 2962 for (chan_idx = 0; chan_idx < mode->num_channels; chan_idx++) { 2963 pri_chan = &mode->channels[chan_idx]; 2964 if (pri_chan->chan == freq->channel) 2965 break; 2966 pri_chan = NULL; 2967 } 2968 if (!pri_chan) 2969 return; 2970 2971 /* Check primary channel flags */ 2972 if (pri_chan->flag & (HOSTAPD_CHAN_DISABLED | HOSTAPD_CHAN_NO_IR)) 2973 return; 2974 2975 #ifdef CONFIG_HT_OVERRIDES 2976 if (ssid->disable_ht40) 2977 return; 2978 #endif 2979 2980 /* Check/setup HT40+/HT40- */ 2981 for (j = 0; j < ARRAY_SIZE(ht40plus); j++) { 2982 if (ht40plus[j] == freq->channel) { 2983 ht40 = 1; 2984 break; 2985 } 2986 } 2987 2988 /* Find secondary channel */ 2989 for (i = 0; i < mode->num_channels; i++) { 2990 sec_chan = &mode->channels[i]; 2991 if (sec_chan->chan == freq->channel + ht40 * 4) 2992 break; 2993 sec_chan = NULL; 2994 } 2995 if (!sec_chan) 2996 return; 2997 2998 /* Check secondary channel flags */ 2999 if (sec_chan->flag & (HOSTAPD_CHAN_DISABLED | HOSTAPD_CHAN_NO_IR)) 3000 return; 3001 3002 if (ht40 == -1) { 3003 if (!(pri_chan->flag & HOSTAPD_CHAN_HT40MINUS)) 3004 return; 3005 } else { 3006 if (!(pri_chan->flag & HOSTAPD_CHAN_HT40PLUS)) 3007 return; 3008 } 3009 freq->sec_channel_offset = ht40; 3010 3011 if (obss_scan) { 3012 struct wpa_scan_results *scan_res; 3013 3014 scan_res = wpa_supplicant_get_scan_results(wpa_s, NULL, 0, 3015 NULL); 3016 if (scan_res == NULL) { 3017 /* Back to HT20 */ 3018 freq->sec_channel_offset = 0; 3019 return; 3020 } 3021 3022 res = check_40mhz_5g(scan_res, pri_chan, sec_chan); 3023 switch (res) { 3024 case 0: 3025 /* Back to HT20 */ 3026 freq->sec_channel_offset = 0; 3027 break; 3028 case 1: 3029 /* Configuration allowed */ 3030 break; 3031 case 2: 3032 /* Switch pri/sec channels */ 3033 freq->freq = hw_get_freq(mode, sec_chan->chan); 3034 freq->sec_channel_offset = -freq->sec_channel_offset; 3035 freq->channel = sec_chan->chan; 3036 break; 3037 default: 3038 freq->sec_channel_offset = 0; 3039 break; 3040 } 3041 3042 wpa_scan_results_free(scan_res); 3043 } 3044 3045 wpa_printf(MSG_DEBUG, 3046 "IBSS/mesh: setup freq channel %d, sec_channel_offset %d", 3047 freq->channel, freq->sec_channel_offset); 3048 } 3049 3050 3051 static bool ibss_mesh_select_80_160mhz(struct wpa_supplicant *wpa_s, 3052 const struct wpa_ssid *ssid, 3053 struct hostapd_hw_modes *mode, 3054 struct hostapd_freq_params *freq, 3055 int ieee80211_mode, bool is_6ghz) { 3056 static const int bw80[] = { 3057 5180, 5260, 5500, 5580, 5660, 5745, 5825, 3058 5955, 6035, 6115, 6195, 6275, 6355, 6435, 3059 6515, 6595, 6675, 6755, 6835, 6915, 6995 3060 }; 3061 static const int bw160[] = { 3062 5955, 6115, 6275, 6435, 6595, 6755, 6915 3063 }; 3064 struct hostapd_freq_params vht_freq; 3065 int i; 3066 unsigned int j, k; 3067 int chwidth, seg0, seg1; 3068 u32 vht_caps = 0; 3069 u8 channel = freq->channel; 3070 3071 if (!freq->vht_enabled && !freq->he_enabled) 3072 return true; 3073 3074 vht_freq = *freq; 3075 3076 chwidth = CONF_OPER_CHWIDTH_USE_HT; 3077 seg0 = freq->channel + 2 * freq->sec_channel_offset; 3078 seg1 = 0; 3079 if (freq->sec_channel_offset == 0) { 3080 seg0 = 0; 3081 /* Don't try 80 MHz if 40 MHz failed, except in 6 GHz */ 3082 if (freq->ht_enabled && !is_6ghz) 3083 goto skip_80mhz; 3084 } 3085 if (ssid->max_oper_chwidth == CONF_OPER_CHWIDTH_USE_HT) 3086 goto skip_80mhz; 3087 3088 /* setup center_freq1, bandwidth */ 3089 for (j = 0; j < ARRAY_SIZE(bw80); j++) { 3090 if (freq->freq >= bw80[j] && 3091 freq->freq < bw80[j] + 80) 3092 break; 3093 } 3094 3095 if (j == ARRAY_SIZE(bw80) || 3096 ieee80211_freq_to_chan(bw80[j], &channel) == NUM_HOSTAPD_MODES) 3097 goto skip_80mhz; 3098 3099 /* Use 40 MHz if channel not usable */ 3100 if (!ibss_mesh_is_80mhz_avail(channel, mode)) 3101 goto skip_80mhz; 3102 3103 chwidth = CONF_OPER_CHWIDTH_80MHZ; 3104 seg0 = channel + 6; 3105 seg1 = 0; 3106 3107 /* In 160 MHz, the initial four 20 MHz channels were validated 3108 * above. If 160 MHz is supported, check the remaining four 20 MHz 3109 * channels for the total of 160 MHz bandwidth for 6 GHz. 3110 */ 3111 if ((mode->he_capab[ieee80211_mode].phy_cap[ 3112 HE_PHYCAP_CHANNEL_WIDTH_SET_IDX] & 3113 HE_PHYCAP_CHANNEL_WIDTH_SET_160MHZ_IN_5G) && is_6ghz && 3114 ibss_mesh_is_80mhz_avail(channel + 16, mode)) { 3115 for (j = 0; j < ARRAY_SIZE(bw160); j++) { 3116 if (freq->freq == bw160[j]) { 3117 chwidth = CONF_OPER_CHWIDTH_160MHZ; 3118 seg0 = channel + 14; 3119 break; 3120 } 3121 } 3122 } 3123 3124 if (ssid->max_oper_chwidth == CONF_OPER_CHWIDTH_80P80MHZ) { 3125 /* setup center_freq2, bandwidth */ 3126 for (k = 0; k < ARRAY_SIZE(bw80); k++) { 3127 /* Only accept 80 MHz segments separated by a gap */ 3128 if (j == k || abs(bw80[j] - bw80[k]) == 80) 3129 continue; 3130 3131 if (ieee80211_freq_to_chan(bw80[k], &channel) == 3132 NUM_HOSTAPD_MODES) 3133 break; 3134 3135 for (i = channel; i < channel + 16; i += 4) { 3136 struct hostapd_channel_data *chan; 3137 3138 chan = hw_get_channel_chan(mode, i, NULL); 3139 if (!chan) 3140 continue; 3141 3142 if (chan->flag & (HOSTAPD_CHAN_DISABLED | 3143 HOSTAPD_CHAN_NO_IR | 3144 HOSTAPD_CHAN_RADAR)) 3145 continue; 3146 3147 /* Found a suitable second segment for 80+80 */ 3148 chwidth = CONF_OPER_CHWIDTH_80P80MHZ; 3149 if (!is_6ghz) 3150 vht_caps |= 3151 VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ; 3152 seg1 = channel + 6; 3153 } 3154 3155 if (chwidth == CONF_OPER_CHWIDTH_80P80MHZ) 3156 break; 3157 } 3158 } else if (ssid->max_oper_chwidth == CONF_OPER_CHWIDTH_160MHZ) { 3159 if (freq->freq == 5180) { 3160 chwidth = CONF_OPER_CHWIDTH_160MHZ; 3161 vht_caps |= VHT_CAP_SUPP_CHAN_WIDTH_160MHZ; 3162 seg0 = 50; 3163 } else if (freq->freq == 5520) { 3164 chwidth = CONF_OPER_CHWIDTH_160MHZ; 3165 vht_caps |= VHT_CAP_SUPP_CHAN_WIDTH_160MHZ; 3166 seg0 = 114; 3167 } 3168 } 3169 3170 skip_80mhz: 3171 if (hostapd_set_freq_params(&vht_freq, mode->mode, freq->freq, 3172 freq->channel, ssid->enable_edmg, 3173 ssid->edmg_channel, freq->ht_enabled, 3174 freq->vht_enabled, freq->he_enabled, 3175 freq->eht_enabled, 3176 freq->sec_channel_offset, 3177 chwidth, seg0, seg1, vht_caps, 3178 &mode->he_capab[ieee80211_mode], 3179 &mode->eht_capab[ieee80211_mode], 0) != 0) 3180 return false; 3181 3182 *freq = vht_freq; 3183 3184 wpa_printf(MSG_DEBUG, "IBSS: VHT setup freq cf1 %d, cf2 %d, bw %d", 3185 freq->center_freq1, freq->center_freq2, freq->bandwidth); 3186 return true; 3187 } 3188 3189 3190 void ibss_mesh_setup_freq(struct wpa_supplicant *wpa_s, 3191 const struct wpa_ssid *ssid, 3192 struct hostapd_freq_params *freq) 3193 { 3194 int ieee80211_mode = wpas_mode_to_ieee80211_mode(ssid->mode); 3195 enum hostapd_hw_mode hw_mode; 3196 struct hostapd_hw_modes *mode = NULL; 3197 int obss_scan = 1; 3198 u8 channel; 3199 bool is_6ghz, is_24ghz; 3200 3201 freq->freq = ssid->frequency; 3202 3203 if (ssid->mode == WPAS_MODE_IBSS && !ssid->fixed_freq) { 3204 struct wpa_bss *bss = ibss_find_existing_bss(wpa_s, ssid); 3205 3206 if (bss) { 3207 wpa_printf(MSG_DEBUG, 3208 "IBSS already found in scan results, adjust control freq: %d", 3209 bss->freq); 3210 freq->freq = bss->freq; 3211 obss_scan = 0; 3212 } 3213 } 3214 3215 hw_mode = ieee80211_freq_to_chan(freq->freq, &channel); 3216 mode = get_mode(wpa_s->hw.modes, wpa_s->hw.num_modes, 3217 hw_mode, is_6ghz_freq(ssid->frequency)); 3218 3219 if (!mode) 3220 return; 3221 3222 is_24ghz = hw_mode == HOSTAPD_MODE_IEEE80211G || 3223 hw_mode == HOSTAPD_MODE_IEEE80211B; 3224 3225 is_6ghz = is_6ghz_freq(freq->freq); 3226 3227 freq->ht_enabled = 0; 3228 freq->vht_enabled = 0; 3229 freq->he_enabled = 0; 3230 freq->eht_enabled = 0; 3231 3232 if (!is_6ghz) 3233 freq->ht_enabled = ibss_mesh_can_use_ht(wpa_s, ssid, mode); 3234 if (freq->ht_enabled) 3235 freq->vht_enabled = ibss_mesh_can_use_vht(wpa_s, ssid, mode); 3236 if (freq->vht_enabled || (freq->ht_enabled && is_24ghz) || is_6ghz) 3237 freq->he_enabled = ibss_mesh_can_use_he(wpa_s, ssid, mode, 3238 ieee80211_mode); 3239 freq->channel = channel; 3240 /* Setup higher BW only for 5 GHz */ 3241 if (mode->mode == HOSTAPD_MODE_IEEE80211A) { 3242 ibss_mesh_select_40mhz(wpa_s, ssid, mode, freq, obss_scan); 3243 if (!ibss_mesh_select_80_160mhz(wpa_s, ssid, mode, freq, 3244 ieee80211_mode, is_6ghz)) 3245 freq->he_enabled = freq->vht_enabled = false; 3246 } 3247 3248 if (freq->he_enabled) 3249 freq->eht_enabled = ibss_mesh_can_use_eht(wpa_s, ssid, mode, 3250 ieee80211_mode); 3251 } 3252 3253 3254 #ifdef CONFIG_FILS 3255 static size_t wpas_add_fils_hlp_req(struct wpa_supplicant *wpa_s, u8 *ie_buf, 3256 size_t ie_buf_len) 3257 { 3258 struct fils_hlp_req *req; 3259 size_t rem_len, hdr_len, hlp_len, len, ie_len = 0; 3260 const u8 *pos; 3261 u8 *buf = ie_buf; 3262 3263 dl_list_for_each(req, &wpa_s->fils_hlp_req, struct fils_hlp_req, 3264 list) { 3265 rem_len = ie_buf_len - ie_len; 3266 pos = wpabuf_head(req->pkt); 3267 hdr_len = 1 + 2 * ETH_ALEN + 6; 3268 hlp_len = wpabuf_len(req->pkt); 3269 3270 if (rem_len < 2 + hdr_len + hlp_len) { 3271 wpa_printf(MSG_ERROR, 3272 "FILS: Cannot fit HLP - rem_len=%lu to_fill=%lu", 3273 (unsigned long) rem_len, 3274 (unsigned long) (2 + hdr_len + hlp_len)); 3275 break; 3276 } 3277 3278 len = (hdr_len + hlp_len) > 255 ? 255 : hdr_len + hlp_len; 3279 /* Element ID */ 3280 *buf++ = WLAN_EID_EXTENSION; 3281 /* Length */ 3282 *buf++ = len; 3283 /* Element ID Extension */ 3284 *buf++ = WLAN_EID_EXT_FILS_HLP_CONTAINER; 3285 /* Destination MAC address */ 3286 os_memcpy(buf, req->dst, ETH_ALEN); 3287 buf += ETH_ALEN; 3288 /* Source MAC address */ 3289 os_memcpy(buf, wpa_s->own_addr, ETH_ALEN); 3290 buf += ETH_ALEN; 3291 /* LLC/SNAP Header */ 3292 os_memcpy(buf, "\xaa\xaa\x03\x00\x00\x00", 6); 3293 buf += 6; 3294 /* HLP Packet */ 3295 os_memcpy(buf, pos, len - hdr_len); 3296 buf += len - hdr_len; 3297 pos += len - hdr_len; 3298 3299 hlp_len -= len - hdr_len; 3300 ie_len += 2 + len; 3301 rem_len -= 2 + len; 3302 3303 while (hlp_len) { 3304 len = (hlp_len > 255) ? 255 : hlp_len; 3305 if (rem_len < 2 + len) 3306 break; 3307 *buf++ = WLAN_EID_FRAGMENT; 3308 *buf++ = len; 3309 os_memcpy(buf, pos, len); 3310 buf += len; 3311 pos += len; 3312 3313 hlp_len -= len; 3314 ie_len += 2 + len; 3315 rem_len -= 2 + len; 3316 } 3317 } 3318 3319 return ie_len; 3320 } 3321 3322 3323 int wpa_is_fils_supported(struct wpa_supplicant *wpa_s) 3324 { 3325 return (((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) && 3326 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SUPPORT_FILS)) || 3327 (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) && 3328 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_FILS_SK_OFFLOAD))); 3329 } 3330 3331 3332 int wpa_is_fils_sk_pfs_supported(struct wpa_supplicant *wpa_s) 3333 { 3334 #ifdef CONFIG_FILS_SK_PFS 3335 return (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) && 3336 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SUPPORT_FILS); 3337 #else /* CONFIG_FILS_SK_PFS */ 3338 return 0; 3339 #endif /* CONFIG_FILS_SK_PFS */ 3340 } 3341 3342 #endif /* CONFIG_FILS */ 3343 3344 3345 bool wpa_is_non_eht_scs_traffic_desc_supported(struct wpa_bss *bss) 3346 { 3347 const u8 *wfa_capa; 3348 3349 if (!bss) 3350 return false; 3351 3352 /* Get WFA capability from Beacon or Probe Response frame elements */ 3353 wfa_capa = wpa_bss_get_vendor_ie(bss, WFA_CAPA_IE_VENDOR_TYPE); 3354 if (!wfa_capa) 3355 wfa_capa = wpa_bss_get_vendor_ie_beacon( 3356 bss, WFA_CAPA_IE_VENDOR_TYPE); 3357 3358 if (!wfa_capa || wfa_capa[1] < 6 || wfa_capa[6] < 1 || 3359 !(wfa_capa[7] & WFA_CAPA_QM_NON_EHT_SCS_TRAFFIC_DESC)) { 3360 /* AP does not enable QM non EHT traffic description policy */ 3361 return false; 3362 } 3363 3364 return true; 3365 } 3366 3367 3368 static int wpas_populate_wfa_capa(struct wpa_supplicant *wpa_s, 3369 struct wpa_bss *bss, 3370 u8 *wpa_ie, size_t wpa_ie_len, 3371 size_t max_wpa_ie_len) 3372 { 3373 struct wpabuf *wfa_ie = NULL; 3374 u8 wfa_capa[1]; 3375 size_t wfa_ie_len, buf_len; 3376 3377 os_memset(wfa_capa, 0, sizeof(wfa_capa)); 3378 #ifndef CONFIG_NO_ROBUST_AV 3379 if (wpa_s->enable_dscp_policy_capa) 3380 wfa_capa[0] |= WFA_CAPA_QM_DSCP_POLICY; 3381 #endif /* CONFIG_NO_ROBUST_AV */ 3382 3383 if (wpa_is_non_eht_scs_traffic_desc_supported(bss)) 3384 wfa_capa[0] |= WFA_CAPA_QM_NON_EHT_SCS_TRAFFIC_DESC; 3385 3386 if (!wfa_capa[0]) 3387 return wpa_ie_len; 3388 3389 /* Wi-Fi Alliance element */ 3390 buf_len = 1 + /* Element ID */ 3391 1 + /* Length */ 3392 3 + /* OUI */ 3393 1 + /* OUI Type */ 3394 1 + /* Capabilities Length */ 3395 sizeof(wfa_capa); /* Capabilities */ 3396 wfa_ie = wpabuf_alloc(buf_len); 3397 if (!wfa_ie) 3398 return wpa_ie_len; 3399 3400 wpabuf_put_u8(wfa_ie, WLAN_EID_VENDOR_SPECIFIC); 3401 wpabuf_put_u8(wfa_ie, buf_len - 2); 3402 wpabuf_put_be24(wfa_ie, OUI_WFA); 3403 wpabuf_put_u8(wfa_ie, WFA_CAPA_OUI_TYPE); 3404 wpabuf_put_u8(wfa_ie, sizeof(wfa_capa)); 3405 wpabuf_put_data(wfa_ie, wfa_capa, sizeof(wfa_capa)); 3406 3407 wfa_ie_len = wpabuf_len(wfa_ie); 3408 if (wpa_ie_len + wfa_ie_len <= max_wpa_ie_len) { 3409 wpa_hexdump_buf(MSG_MSGDUMP, "WFA Capabilities element", 3410 wfa_ie); 3411 os_memcpy(wpa_ie + wpa_ie_len, wpabuf_head(wfa_ie), 3412 wfa_ie_len); 3413 wpa_ie_len += wfa_ie_len; 3414 } 3415 3416 wpabuf_free(wfa_ie); 3417 return wpa_ie_len; 3418 } 3419 3420 3421 static u8 * wpas_populate_assoc_ies( 3422 struct wpa_supplicant *wpa_s, 3423 struct wpa_bss *bss, struct wpa_ssid *ssid, 3424 struct wpa_driver_associate_params *params, 3425 enum wpa_drv_update_connect_params_mask *mask) 3426 { 3427 u8 *wpa_ie; 3428 size_t max_wpa_ie_len = 500; 3429 size_t wpa_ie_len; 3430 int algs = WPA_AUTH_ALG_OPEN; 3431 #ifdef CONFIG_MBO 3432 const u8 *mbo_ie; 3433 #endif 3434 #if defined(CONFIG_SAE) || defined(CONFIG_FILS) 3435 int pmksa_cached = 0; 3436 #endif /* CONFIG_SAE || CONFIG_FILS */ 3437 #ifdef CONFIG_FILS 3438 const u8 *realm, *username, *rrk; 3439 size_t realm_len, username_len, rrk_len; 3440 u16 next_seq_num; 3441 struct fils_hlp_req *req; 3442 3443 dl_list_for_each(req, &wpa_s->fils_hlp_req, struct fils_hlp_req, 3444 list) { 3445 max_wpa_ie_len += 3 + 2 * ETH_ALEN + 6 + wpabuf_len(req->pkt) + 3446 2 + 2 * wpabuf_len(req->pkt) / 255; 3447 } 3448 #endif /* CONFIG_FILS */ 3449 3450 wpa_ie = os_malloc(max_wpa_ie_len); 3451 if (!wpa_ie) { 3452 wpa_printf(MSG_ERROR, 3453 "Failed to allocate connect IE buffer for %lu bytes", 3454 (unsigned long) max_wpa_ie_len); 3455 return NULL; 3456 } 3457 3458 if (bss && (wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE) || 3459 wpa_bss_get_ie(bss, WLAN_EID_RSN)) && 3460 wpa_key_mgmt_wpa(ssid->key_mgmt)) { 3461 int try_opportunistic; 3462 const u8 *cache_id = NULL; 3463 const u8 *addr = bss->bssid; 3464 3465 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) && 3466 (wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_MLO) && 3467 !is_zero_ether_addr(bss->mld_addr)) 3468 addr = bss->mld_addr; 3469 3470 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) && 3471 wpa_s->valid_links) 3472 addr = wpa_s->ap_mld_addr; 3473 3474 try_opportunistic = (ssid->proactive_key_caching < 0 ? 3475 wpa_s->conf->okc : 3476 ssid->proactive_key_caching) && 3477 (ssid->proto & WPA_PROTO_RSN); 3478 #ifdef CONFIG_FILS 3479 if (wpa_key_mgmt_fils(ssid->key_mgmt)) 3480 cache_id = wpa_bss_get_fils_cache_id(bss); 3481 #endif /* CONFIG_FILS */ 3482 if (pmksa_cache_set_current(wpa_s->wpa, NULL, addr, 3483 ssid, try_opportunistic, 3484 cache_id, 0, false) == 0) { 3485 eapol_sm_notify_pmkid_attempt(wpa_s->eapol); 3486 #if defined(CONFIG_SAE) || defined(CONFIG_FILS) 3487 pmksa_cached = 1; 3488 #endif /* CONFIG_SAE || CONFIG_FILS */ 3489 } 3490 wpa_ie_len = max_wpa_ie_len; 3491 if (wpa_supplicant_set_suites(wpa_s, bss, ssid, 3492 wpa_ie, &wpa_ie_len, false)) { 3493 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA " 3494 "key management and encryption suites"); 3495 os_free(wpa_ie); 3496 return NULL; 3497 } 3498 #ifdef CONFIG_HS20 3499 } else if (bss && wpa_bss_get_vendor_ie(bss, OSEN_IE_VENDOR_TYPE) && 3500 (ssid->key_mgmt & WPA_KEY_MGMT_OSEN)) { 3501 /* No PMKSA caching, but otherwise similar to RSN/WPA */ 3502 wpa_ie_len = max_wpa_ie_len; 3503 if (wpa_supplicant_set_suites(wpa_s, bss, ssid, 3504 wpa_ie, &wpa_ie_len, false)) { 3505 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA " 3506 "key management and encryption suites"); 3507 os_free(wpa_ie); 3508 return NULL; 3509 } 3510 #endif /* CONFIG_HS20 */ 3511 } else if ((ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) && bss && 3512 wpa_key_mgmt_wpa_ieee8021x(ssid->key_mgmt)) { 3513 /* 3514 * Both WPA and non-WPA IEEE 802.1X enabled in configuration - 3515 * use non-WPA since the scan results did not indicate that the 3516 * AP is using WPA or WPA2. 3517 */ 3518 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid); 3519 wpa_ie_len = 0; 3520 wpa_s->wpa_proto = 0; 3521 } else if (wpa_key_mgmt_wpa_any(ssid->key_mgmt)) { 3522 wpa_ie_len = max_wpa_ie_len; 3523 if (wpa_supplicant_set_suites(wpa_s, NULL, ssid, 3524 wpa_ie, &wpa_ie_len, false)) { 3525 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA " 3526 "key management and encryption suites (no " 3527 "scan results)"); 3528 os_free(wpa_ie); 3529 return NULL; 3530 } 3531 #ifdef CONFIG_WPS 3532 } else if (ssid->key_mgmt & WPA_KEY_MGMT_WPS) { 3533 struct wpabuf *wps_ie; 3534 wps_ie = wps_build_assoc_req_ie(wpas_wps_get_req_type(ssid)); 3535 if (wps_ie && wpabuf_len(wps_ie) <= max_wpa_ie_len) { 3536 wpa_ie_len = wpabuf_len(wps_ie); 3537 os_memcpy(wpa_ie, wpabuf_head(wps_ie), wpa_ie_len); 3538 } else 3539 wpa_ie_len = 0; 3540 wpabuf_free(wps_ie); 3541 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid); 3542 if (!bss || (bss->caps & IEEE80211_CAP_PRIVACY)) 3543 params->wps = WPS_MODE_PRIVACY; 3544 else 3545 params->wps = WPS_MODE_OPEN; 3546 wpa_s->wpa_proto = 0; 3547 #endif /* CONFIG_WPS */ 3548 } else { 3549 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid); 3550 wpa_ie_len = 0; 3551 wpa_s->wpa_proto = 0; 3552 } 3553 3554 #ifdef IEEE8021X_EAPOL 3555 if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) { 3556 if (ssid->leap) { 3557 if (ssid->non_leap == 0) 3558 algs = WPA_AUTH_ALG_LEAP; 3559 else 3560 algs |= WPA_AUTH_ALG_LEAP; 3561 } 3562 } 3563 3564 #ifdef CONFIG_FILS 3565 /* Clear FILS association */ 3566 wpa_sm_set_reset_fils_completed(wpa_s->wpa, 0); 3567 3568 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_FILS_SK_OFFLOAD) && 3569 ssid->eap.erp && wpa_key_mgmt_fils(wpa_s->key_mgmt) && 3570 eapol_sm_get_erp_info(wpa_s->eapol, &ssid->eap, &username, 3571 &username_len, &realm, &realm_len, 3572 &next_seq_num, &rrk, &rrk_len) == 0 && 3573 (!wpa_s->last_con_fail_realm || 3574 wpa_s->last_con_fail_realm_len != realm_len || 3575 os_memcmp(wpa_s->last_con_fail_realm, realm, realm_len) != 0)) { 3576 algs = WPA_AUTH_ALG_FILS; 3577 params->fils_erp_username = username; 3578 params->fils_erp_username_len = username_len; 3579 params->fils_erp_realm = realm; 3580 params->fils_erp_realm_len = realm_len; 3581 params->fils_erp_next_seq_num = next_seq_num; 3582 params->fils_erp_rrk = rrk; 3583 params->fils_erp_rrk_len = rrk_len; 3584 3585 if (mask) 3586 *mask |= WPA_DRV_UPDATE_FILS_ERP_INFO; 3587 } else if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_FILS_SK_OFFLOAD) && 3588 ssid->eap.erp && wpa_key_mgmt_fils(wpa_s->key_mgmt) && 3589 pmksa_cached) { 3590 algs = WPA_AUTH_ALG_FILS; 3591 } 3592 #endif /* CONFIG_FILS */ 3593 #endif /* IEEE8021X_EAPOL */ 3594 #ifdef CONFIG_SAE 3595 if (wpa_key_mgmt_sae(wpa_s->key_mgmt)) 3596 algs = WPA_AUTH_ALG_SAE; 3597 #endif /* CONFIG_SAE */ 3598 3599 wpa_dbg(wpa_s, MSG_DEBUG, "Automatic auth_alg selection: 0x%x", algs); 3600 if (ssid->auth_alg) { 3601 algs = ssid->auth_alg; 3602 wpa_dbg(wpa_s, MSG_DEBUG, 3603 "Overriding auth_alg selection: 0x%x", algs); 3604 } 3605 3606 #ifdef CONFIG_SAE 3607 if (pmksa_cached && algs == WPA_AUTH_ALG_SAE) { 3608 wpa_dbg(wpa_s, MSG_DEBUG, 3609 "SAE: Use WPA_AUTH_ALG_OPEN for PMKSA caching attempt"); 3610 algs = WPA_AUTH_ALG_OPEN; 3611 } 3612 #endif /* CONFIG_SAE */ 3613 3614 #ifdef CONFIG_P2P 3615 if (wpa_s->global->p2p) { 3616 u8 *pos; 3617 size_t len; 3618 int res; 3619 pos = wpa_ie + wpa_ie_len; 3620 len = max_wpa_ie_len - wpa_ie_len; 3621 res = wpas_p2p_assoc_req_ie(wpa_s, bss, pos, len, 3622 ssid->p2p_group); 3623 if (res >= 0) 3624 wpa_ie_len += res; 3625 } 3626 3627 wpa_s->cross_connect_disallowed = 0; 3628 if (bss) { 3629 struct wpabuf *p2p; 3630 p2p = wpa_bss_get_vendor_ie_multi(bss, P2P_IE_VENDOR_TYPE); 3631 if (p2p) { 3632 wpa_s->cross_connect_disallowed = 3633 p2p_get_cross_connect_disallowed(p2p); 3634 wpabuf_free(p2p); 3635 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: WLAN AP %s cross " 3636 "connection", 3637 wpa_s->cross_connect_disallowed ? 3638 "disallows" : "allows"); 3639 } 3640 } 3641 3642 os_memset(wpa_s->p2p_ip_addr_info, 0, sizeof(wpa_s->p2p_ip_addr_info)); 3643 #endif /* CONFIG_P2P */ 3644 3645 #ifndef CONFIG_NO_RRM 3646 if (bss) { 3647 wpa_ie_len += wpas_supp_op_class_ie(wpa_s, ssid, bss, 3648 wpa_ie + wpa_ie_len, 3649 max_wpa_ie_len - 3650 wpa_ie_len); 3651 } 3652 #endif /* CONFIG_NO_RRM */ 3653 3654 /* 3655 * Workaround: Add Extended Capabilities element only if the AP 3656 * included this element in Beacon/Probe Response frames. Some older 3657 * APs seem to have interoperability issues if this element is 3658 * included, so while the standard may require us to include the 3659 * element in all cases, it is justifiable to skip it to avoid 3660 * interoperability issues. 3661 */ 3662 if (ssid->p2p_group) 3663 wpa_drv_get_ext_capa(wpa_s, WPA_IF_P2P_CLIENT); 3664 else 3665 wpa_drv_get_ext_capa(wpa_s, WPA_IF_STATION); 3666 3667 if (!bss || wpa_bss_get_ie(bss, WLAN_EID_EXT_CAPAB)) { 3668 u8 ext_capab[18]; 3669 int ext_capab_len; 3670 ext_capab_len = wpas_build_ext_capab(wpa_s, ext_capab, 3671 sizeof(ext_capab), bss); 3672 if (ext_capab_len > 0 && 3673 wpa_ie_len + ext_capab_len <= max_wpa_ie_len) { 3674 u8 *pos = wpa_ie; 3675 if (wpa_ie_len > 0 && pos[0] == WLAN_EID_RSN) 3676 pos += 2 + pos[1]; 3677 os_memmove(pos + ext_capab_len, pos, 3678 wpa_ie_len - (pos - wpa_ie)); 3679 wpa_ie_len += ext_capab_len; 3680 os_memcpy(pos, ext_capab, ext_capab_len); 3681 } 3682 } 3683 3684 if (ssid->max_idle && wpa_ie_len + 5 <= max_wpa_ie_len) { 3685 u8 *pos = wpa_ie; 3686 3687 *pos++ = WLAN_EID_BSS_MAX_IDLE_PERIOD; 3688 *pos++ = 3; 3689 WPA_PUT_LE16(pos, ssid->max_idle); 3690 pos += 2; 3691 *pos = 0; /* Idle Options */ 3692 wpa_ie_len += 5; 3693 } 3694 3695 #ifdef CONFIG_HS20 3696 if (is_hs20_network(wpa_s, ssid, bss)) { 3697 struct wpabuf *hs20; 3698 3699 hs20 = wpabuf_alloc(20 + MAX_ROAMING_CONS_OI_LEN); 3700 if (hs20) { 3701 int pps_mo_id = hs20_get_pps_mo_id(wpa_s, ssid); 3702 size_t len; 3703 3704 wpas_hs20_add_indication(hs20, pps_mo_id, 3705 get_hs20_version(bss)); 3706 wpas_hs20_add_roam_cons_sel(hs20, ssid); 3707 len = max_wpa_ie_len - wpa_ie_len; 3708 if (wpabuf_len(hs20) <= len) { 3709 os_memcpy(wpa_ie + wpa_ie_len, 3710 wpabuf_head(hs20), wpabuf_len(hs20)); 3711 wpa_ie_len += wpabuf_len(hs20); 3712 } 3713 wpabuf_free(hs20); 3714 3715 hs20_configure_frame_filters(wpa_s); 3716 } 3717 } 3718 #endif /* CONFIG_HS20 */ 3719 3720 if (wpa_s->vendor_elem[VENDOR_ELEM_ASSOC_REQ]) { 3721 struct wpabuf *buf = wpa_s->vendor_elem[VENDOR_ELEM_ASSOC_REQ]; 3722 size_t len; 3723 3724 len = max_wpa_ie_len - wpa_ie_len; 3725 if (wpabuf_len(buf) <= len) { 3726 os_memcpy(wpa_ie + wpa_ie_len, 3727 wpabuf_head(buf), wpabuf_len(buf)); 3728 wpa_ie_len += wpabuf_len(buf); 3729 } 3730 } 3731 3732 #ifdef CONFIG_FST 3733 if (wpa_s->fst_ies) { 3734 int fst_ies_len = wpabuf_len(wpa_s->fst_ies); 3735 3736 if (wpa_ie_len + fst_ies_len <= max_wpa_ie_len) { 3737 os_memcpy(wpa_ie + wpa_ie_len, 3738 wpabuf_head(wpa_s->fst_ies), fst_ies_len); 3739 wpa_ie_len += fst_ies_len; 3740 } 3741 } 3742 #endif /* CONFIG_FST */ 3743 3744 #ifdef CONFIG_MBO 3745 mbo_ie = bss ? wpa_bss_get_vendor_ie(bss, MBO_IE_VENDOR_TYPE) : NULL; 3746 if (!wpa_s->disable_mbo_oce && mbo_ie) { 3747 int len; 3748 3749 len = wpas_mbo_ie(wpa_s, wpa_ie + wpa_ie_len, 3750 max_wpa_ie_len - wpa_ie_len, 3751 !!mbo_attr_from_mbo_ie(mbo_ie, 3752 OCE_ATTR_ID_CAPA_IND)); 3753 if (len >= 0) 3754 wpa_ie_len += len; 3755 } 3756 #endif /* CONFIG_MBO */ 3757 3758 #ifdef CONFIG_FILS 3759 if (algs == WPA_AUTH_ALG_FILS) { 3760 size_t len; 3761 3762 len = wpas_add_fils_hlp_req(wpa_s, wpa_ie + wpa_ie_len, 3763 max_wpa_ie_len - wpa_ie_len); 3764 wpa_ie_len += len; 3765 } 3766 #endif /* CONFIG_FILS */ 3767 3768 #ifdef CONFIG_OWE 3769 #ifdef CONFIG_TESTING_OPTIONS 3770 if (get_ie_ext(wpa_ie, wpa_ie_len, WLAN_EID_EXT_OWE_DH_PARAM)) { 3771 wpa_printf(MSG_INFO, "TESTING: Override OWE DH element"); 3772 } else 3773 #endif /* CONFIG_TESTING_OPTIONS */ 3774 if (algs == WPA_AUTH_ALG_OPEN && 3775 ssid->key_mgmt == WPA_KEY_MGMT_OWE && 3776 !(wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_OWE_OFFLOAD_STA)) { 3777 struct wpabuf *owe_ie; 3778 u16 group; 3779 3780 if (ssid->owe_group) { 3781 group = ssid->owe_group; 3782 } else if (wpa_s->assoc_status_code == 3783 WLAN_STATUS_FINITE_CYCLIC_GROUP_NOT_SUPPORTED) { 3784 if (wpa_s->last_owe_group == 19) 3785 group = 20; 3786 else if (wpa_s->last_owe_group == 20) 3787 group = 21; 3788 else 3789 group = OWE_DH_GROUP; 3790 } else { 3791 group = OWE_DH_GROUP; 3792 } 3793 3794 wpa_s->last_owe_group = group; 3795 wpa_printf(MSG_DEBUG, "OWE: Try to use group %u", group); 3796 owe_ie = owe_build_assoc_req(wpa_s->wpa, group); 3797 if (owe_ie && 3798 wpabuf_len(owe_ie) <= max_wpa_ie_len - wpa_ie_len) { 3799 os_memcpy(wpa_ie + wpa_ie_len, 3800 wpabuf_head(owe_ie), wpabuf_len(owe_ie)); 3801 wpa_ie_len += wpabuf_len(owe_ie); 3802 } 3803 wpabuf_free(owe_ie); 3804 } 3805 #endif /* CONFIG_OWE */ 3806 3807 #ifdef CONFIG_DPP2 3808 if (DPP_VERSION > 1 && 3809 wpa_sm_get_key_mgmt(wpa_s->wpa) == WPA_KEY_MGMT_DPP && 3810 ssid->dpp_netaccesskey && 3811 ssid->dpp_pfs != 2 && !ssid->dpp_pfs_fallback) { 3812 struct rsn_pmksa_cache_entry *pmksa; 3813 3814 pmksa = pmksa_cache_get_current(wpa_s->wpa); 3815 if (!pmksa || !pmksa->dpp_pfs) 3816 goto pfs_fail; 3817 3818 dpp_pfs_free(wpa_s->dpp_pfs); 3819 wpa_s->dpp_pfs = dpp_pfs_init(ssid->dpp_netaccesskey, 3820 ssid->dpp_netaccesskey_len); 3821 if (!wpa_s->dpp_pfs) { 3822 wpa_printf(MSG_DEBUG, "DPP: Could not initialize PFS"); 3823 /* Try to continue without PFS */ 3824 goto pfs_fail; 3825 } 3826 if (wpabuf_len(wpa_s->dpp_pfs->ie) <= 3827 max_wpa_ie_len - wpa_ie_len) { 3828 os_memcpy(wpa_ie + wpa_ie_len, 3829 wpabuf_head(wpa_s->dpp_pfs->ie), 3830 wpabuf_len(wpa_s->dpp_pfs->ie)); 3831 wpa_ie_len += wpabuf_len(wpa_s->dpp_pfs->ie); 3832 } 3833 } 3834 pfs_fail: 3835 #endif /* CONFIG_DPP2 */ 3836 3837 #ifdef CONFIG_IEEE80211R 3838 /* 3839 * Add MDIE under these conditions: the network profile allows FT, 3840 * the AP supports FT, and the mobility domain ID matches. 3841 */ 3842 if (bss && wpa_key_mgmt_ft(wpa_sm_get_key_mgmt(wpa_s->wpa))) { 3843 const u8 *mdie = wpa_bss_get_ie(bss, WLAN_EID_MOBILITY_DOMAIN); 3844 3845 if (mdie && mdie[1] >= MOBILITY_DOMAIN_ID_LEN) { 3846 size_t len = 0; 3847 const u8 *md = mdie + 2; 3848 const u8 *wpa_md = wpa_sm_get_ft_md(wpa_s->wpa); 3849 3850 if (os_memcmp(md, wpa_md, 3851 MOBILITY_DOMAIN_ID_LEN) == 0) { 3852 /* Add mobility domain IE */ 3853 len = wpa_ft_add_mdie( 3854 wpa_s->wpa, wpa_ie + wpa_ie_len, 3855 max_wpa_ie_len - wpa_ie_len, mdie); 3856 wpa_ie_len += len; 3857 } 3858 #ifdef CONFIG_SME 3859 if (len > 0 && wpa_s->sme.ft_used && 3860 wpa_sm_has_ft_keys(wpa_s->wpa, md)) { 3861 wpa_dbg(wpa_s, MSG_DEBUG, 3862 "SME: Trying to use FT over-the-air"); 3863 algs |= WPA_AUTH_ALG_FT; 3864 } 3865 #endif /* CONFIG_SME */ 3866 } 3867 } 3868 #endif /* CONFIG_IEEE80211R */ 3869 3870 #ifdef CONFIG_TESTING_OPTIONS 3871 if (wpa_s->rsnxe_override_assoc && 3872 wpabuf_len(wpa_s->rsnxe_override_assoc) <= 3873 max_wpa_ie_len - wpa_ie_len) { 3874 wpa_printf(MSG_DEBUG, "TESTING: RSNXE AssocReq override"); 3875 os_memcpy(wpa_ie + wpa_ie_len, 3876 wpabuf_head(wpa_s->rsnxe_override_assoc), 3877 wpabuf_len(wpa_s->rsnxe_override_assoc)); 3878 wpa_ie_len += wpabuf_len(wpa_s->rsnxe_override_assoc); 3879 } else 3880 #endif /* CONFIG_TESTING_OPTIONS */ 3881 if (wpa_s->rsnxe_len > 0 && 3882 wpa_s->rsnxe_len <= max_wpa_ie_len - wpa_ie_len) { 3883 os_memcpy(wpa_ie + wpa_ie_len, wpa_s->rsnxe, wpa_s->rsnxe_len); 3884 wpa_ie_len += wpa_s->rsnxe_len; 3885 } 3886 3887 #ifndef CONFIG_NO_ROBUST_AV 3888 #ifdef CONFIG_TESTING_OPTIONS 3889 if (wpa_s->disable_mscs_support) 3890 goto mscs_end; 3891 #endif /* CONFIG_TESTING_OPTIONS */ 3892 if (wpa_bss_ext_capab(bss, WLAN_EXT_CAPAB_MSCS) && 3893 wpa_s->robust_av.valid_config) { 3894 struct wpabuf *mscs_ie; 3895 size_t mscs_ie_len, buf_len; 3896 3897 buf_len = 3 + /* MSCS descriptor IE header */ 3898 1 + /* Request type */ 3899 2 + /* User priority control */ 3900 4 + /* Stream timeout */ 3901 3 + /* TCLAS Mask IE header */ 3902 wpa_s->robust_av.frame_classifier_len; 3903 mscs_ie = wpabuf_alloc(buf_len); 3904 if (!mscs_ie) { 3905 wpa_printf(MSG_INFO, 3906 "MSCS: Failed to allocate MSCS IE"); 3907 goto mscs_end; 3908 } 3909 3910 wpas_populate_mscs_descriptor_ie(&wpa_s->robust_av, mscs_ie); 3911 if ((wpa_ie_len + wpabuf_len(mscs_ie)) <= max_wpa_ie_len) { 3912 wpa_hexdump_buf(MSG_MSGDUMP, "MSCS IE", mscs_ie); 3913 mscs_ie_len = wpabuf_len(mscs_ie); 3914 os_memcpy(wpa_ie + wpa_ie_len, wpabuf_head(mscs_ie), 3915 mscs_ie_len); 3916 wpa_ie_len += mscs_ie_len; 3917 } 3918 3919 wpabuf_free(mscs_ie); 3920 } 3921 mscs_end: 3922 #endif /* CONFIG_NO_ROBUST_AV */ 3923 3924 wpa_ie_len = wpas_populate_wfa_capa(wpa_s, bss, wpa_ie, wpa_ie_len, 3925 max_wpa_ie_len); 3926 3927 if (ssid->multi_ap_backhaul_sta) { 3928 size_t multi_ap_ie_len; 3929 struct multi_ap_params multi_ap = { 0 }; 3930 3931 multi_ap.capability = MULTI_AP_BACKHAUL_STA; 3932 multi_ap.profile = ssid->multi_ap_profile; 3933 3934 multi_ap_ie_len = add_multi_ap_ie(wpa_ie + wpa_ie_len, 3935 max_wpa_ie_len - wpa_ie_len, 3936 &multi_ap); 3937 if (multi_ap_ie_len == 0) { 3938 wpa_printf(MSG_ERROR, 3939 "Multi-AP: Failed to build Multi-AP IE"); 3940 os_free(wpa_ie); 3941 return NULL; 3942 } 3943 wpa_ie_len += multi_ap_ie_len; 3944 } 3945 3946 params->wpa_ie = wpa_ie; 3947 params->wpa_ie_len = wpa_ie_len; 3948 params->auth_alg = algs; 3949 if (mask) 3950 *mask |= WPA_DRV_UPDATE_ASSOC_IES | WPA_DRV_UPDATE_AUTH_TYPE; 3951 3952 return wpa_ie; 3953 } 3954 3955 3956 #ifdef CONFIG_OWE 3957 static void wpas_update_owe_connect_params(struct wpa_supplicant *wpa_s) 3958 { 3959 struct wpa_driver_associate_params params; 3960 u8 *wpa_ie; 3961 3962 os_memset(¶ms, 0, sizeof(params)); 3963 wpa_ie = wpas_populate_assoc_ies(wpa_s, wpa_s->current_bss, 3964 wpa_s->current_ssid, ¶ms, NULL); 3965 if (!wpa_ie) 3966 return; 3967 3968 wpa_drv_update_connect_params(wpa_s, ¶ms, WPA_DRV_UPDATE_ASSOC_IES); 3969 os_free(wpa_ie); 3970 } 3971 #endif /* CONFIG_OWE */ 3972 3973 3974 #if defined(CONFIG_FILS) && defined(IEEE8021X_EAPOL) 3975 static void wpas_update_fils_connect_params(struct wpa_supplicant *wpa_s) 3976 { 3977 struct wpa_driver_associate_params params; 3978 enum wpa_drv_update_connect_params_mask mask = 0; 3979 u8 *wpa_ie; 3980 3981 if (wpa_s->auth_alg != WPA_AUTH_ALG_OPEN) 3982 return; /* nothing to do */ 3983 3984 os_memset(¶ms, 0, sizeof(params)); 3985 wpa_ie = wpas_populate_assoc_ies(wpa_s, wpa_s->current_bss, 3986 wpa_s->current_ssid, ¶ms, &mask); 3987 if (!wpa_ie) 3988 return; 3989 3990 if (params.auth_alg == WPA_AUTH_ALG_FILS) { 3991 wpa_s->auth_alg = params.auth_alg; 3992 wpa_drv_update_connect_params(wpa_s, ¶ms, mask); 3993 } 3994 3995 os_free(wpa_ie); 3996 } 3997 #endif /* CONFIG_FILS && IEEE8021X_EAPOL */ 3998 3999 4000 static u8 wpa_ie_get_edmg_oper_chans(const u8 *edmg_ie) 4001 { 4002 if (!edmg_ie || edmg_ie[1] < 6) 4003 return 0; 4004 return edmg_ie[EDMG_BSS_OPERATING_CHANNELS_OFFSET]; 4005 } 4006 4007 4008 static u8 wpa_ie_get_edmg_oper_chan_width(const u8 *edmg_ie) 4009 { 4010 if (!edmg_ie || edmg_ie[1] < 6) 4011 return 0; 4012 return edmg_ie[EDMG_OPERATING_CHANNEL_WIDTH_OFFSET]; 4013 } 4014 4015 4016 /* Returns the intersection of two EDMG configurations. 4017 * Note: The current implementation is limited to CB2 only (CB1 included), 4018 * i.e., the implementation supports up to 2 contiguous channels. 4019 * For supporting non-contiguous (aggregated) channels and for supporting 4020 * CB3 and above, this function will need to be extended. 4021 */ 4022 static struct ieee80211_edmg_config 4023 get_edmg_intersection(struct ieee80211_edmg_config a, 4024 struct ieee80211_edmg_config b, 4025 u8 primary_channel) 4026 { 4027 struct ieee80211_edmg_config result; 4028 int i, contiguous = 0; 4029 int max_contiguous = 0; 4030 4031 result.channels = b.channels & a.channels; 4032 if (!result.channels) { 4033 wpa_printf(MSG_DEBUG, 4034 "EDMG not possible: cannot intersect channels 0x%x and 0x%x", 4035 a.channels, b.channels); 4036 goto fail; 4037 } 4038 4039 if (!(result.channels & BIT(primary_channel - 1))) { 4040 wpa_printf(MSG_DEBUG, 4041 "EDMG not possible: the primary channel %d is not one of the intersected channels 0x%x", 4042 primary_channel, result.channels); 4043 goto fail; 4044 } 4045 4046 /* Find max contiguous channels */ 4047 for (i = 0; i < 6; i++) { 4048 if (result.channels & BIT(i)) 4049 contiguous++; 4050 else 4051 contiguous = 0; 4052 4053 if (contiguous > max_contiguous) 4054 max_contiguous = contiguous; 4055 } 4056 4057 /* Assuming AP and STA supports ONLY contiguous channels, 4058 * bw configuration can have value between 4-7. 4059 */ 4060 if ((b.bw_config < a.bw_config)) 4061 result.bw_config = b.bw_config; 4062 else 4063 result.bw_config = a.bw_config; 4064 4065 if ((max_contiguous >= 2 && result.bw_config < EDMG_BW_CONFIG_5) || 4066 (max_contiguous >= 1 && result.bw_config < EDMG_BW_CONFIG_4)) { 4067 wpa_printf(MSG_DEBUG, 4068 "EDMG not possible: not enough contiguous channels %d for supporting CB1 or CB2", 4069 max_contiguous); 4070 goto fail; 4071 } 4072 4073 return result; 4074 4075 fail: 4076 result.channels = 0; 4077 result.bw_config = 0; 4078 return result; 4079 } 4080 4081 4082 static struct ieee80211_edmg_config 4083 get_supported_edmg(struct wpa_supplicant *wpa_s, 4084 struct hostapd_freq_params *freq, 4085 struct ieee80211_edmg_config request_edmg) 4086 { 4087 enum hostapd_hw_mode hw_mode; 4088 struct hostapd_hw_modes *mode = NULL; 4089 u8 primary_channel; 4090 4091 if (!wpa_s->hw.modes) 4092 goto fail; 4093 4094 hw_mode = ieee80211_freq_to_chan(freq->freq, &primary_channel); 4095 if (hw_mode == NUM_HOSTAPD_MODES) 4096 goto fail; 4097 4098 mode = get_mode(wpa_s->hw.modes, wpa_s->hw.num_modes, hw_mode, false); 4099 if (!mode) 4100 goto fail; 4101 4102 return get_edmg_intersection(mode->edmg, request_edmg, primary_channel); 4103 4104 fail: 4105 request_edmg.channels = 0; 4106 request_edmg.bw_config = 0; 4107 return request_edmg; 4108 } 4109 4110 4111 #ifdef CONFIG_MBO 4112 void wpas_update_mbo_connect_params(struct wpa_supplicant *wpa_s) 4113 { 4114 struct wpa_driver_associate_params params; 4115 u8 *wpa_ie; 4116 4117 /* 4118 * Update MBO connect params only in case of change of MBO attributes 4119 * when connected, if the AP support MBO. 4120 */ 4121 4122 if (wpa_s->wpa_state != WPA_COMPLETED || !wpa_s->current_ssid || 4123 !wpa_s->current_bss || 4124 !wpa_bss_get_vendor_ie(wpa_s->current_bss, MBO_IE_VENDOR_TYPE)) 4125 return; 4126 4127 os_memset(¶ms, 0, sizeof(params)); 4128 wpa_ie = wpas_populate_assoc_ies(wpa_s, wpa_s->current_bss, 4129 wpa_s->current_ssid, ¶ms, NULL); 4130 if (!wpa_ie) 4131 return; 4132 4133 wpa_drv_update_connect_params(wpa_s, ¶ms, WPA_DRV_UPDATE_ASSOC_IES); 4134 os_free(wpa_ie); 4135 } 4136 #endif /* CONFIG_MBO */ 4137 4138 4139 static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit) 4140 { 4141 struct wpa_connect_work *cwork = work->ctx; 4142 struct wpa_bss *bss = cwork->bss; 4143 struct wpa_ssid *ssid = cwork->ssid; 4144 struct wpa_supplicant *wpa_s = work->wpa_s; 4145 u8 *wpa_ie; 4146 const u8 *edmg_ie_oper; 4147 int use_crypt, ret, bssid_changed; 4148 unsigned int cipher_pairwise, cipher_group, cipher_group_mgmt; 4149 struct wpa_driver_associate_params params; 4150 u8 psk[PMK_LEN]; 4151 #if defined(CONFIG_WEP) || defined(IEEE8021X_EAPOL) 4152 int wep_keys_set = 0; 4153 #endif /* CONFIG_WEP || IEEE8021X_EAPOL */ 4154 int assoc_failed = 0; 4155 struct wpa_ssid *old_ssid; 4156 u8 prev_bssid[ETH_ALEN]; 4157 #ifdef CONFIG_HT_OVERRIDES 4158 struct ieee80211_ht_capabilities htcaps; 4159 struct ieee80211_ht_capabilities htcaps_mask; 4160 #endif /* CONFIG_HT_OVERRIDES */ 4161 #ifdef CONFIG_VHT_OVERRIDES 4162 struct ieee80211_vht_capabilities vhtcaps; 4163 struct ieee80211_vht_capabilities vhtcaps_mask; 4164 #endif /* CONFIG_VHT_OVERRIDES */ 4165 4166 wpa_s->roam_in_progress = false; 4167 #ifdef CONFIG_WNM 4168 wpa_s->bss_trans_mgmt_in_progress = false; 4169 #endif /* CONFIG_WNM */ 4170 4171 if (deinit) { 4172 if (work->started) { 4173 wpa_s->connect_work = NULL; 4174 4175 /* cancel possible auth. timeout */ 4176 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, 4177 NULL); 4178 } 4179 wpas_connect_work_free(cwork); 4180 return; 4181 } 4182 4183 wpa_s->connect_work = work; 4184 4185 if (cwork->bss_removed || !wpas_valid_bss_ssid(wpa_s, bss, ssid) || 4186 wpas_network_disabled(wpa_s, ssid)) { 4187 wpa_dbg(wpa_s, MSG_DEBUG, "BSS/SSID entry for association not valid anymore - drop connection attempt"); 4188 wpas_connect_work_done(wpa_s); 4189 return; 4190 } 4191 4192 /* 4193 * Set the current AP's BSSID (for non-MLO connection) or MLD address 4194 * (for MLO connection) as the previous BSSID for reassociation requests 4195 * handled by SME-in-driver. If wpa_supplicant is in disconnected state, 4196 * prev_bssid will be zero as both wpa_s->valid_links and wpa_s->bssid 4197 * will be zero. 4198 */ 4199 os_memcpy(prev_bssid, 4200 wpa_s->valid_links ? wpa_s->ap_mld_addr : wpa_s->bssid, 4201 ETH_ALEN); 4202 os_memset(¶ms, 0, sizeof(params)); 4203 wpa_s->reassociate = 0; 4204 wpa_s->eap_expected_failure = 0; 4205 4206 /* Starting new association, so clear the possibly used WPA IE from the 4207 * previous association. */ 4208 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0); 4209 wpa_sm_set_assoc_rsnxe(wpa_s->wpa, NULL, 0); 4210 wpa_s->rsnxe_len = 0; 4211 #ifndef CONFIG_NO_ROBUST_AV 4212 wpa_s->mscs_setup_done = false; 4213 #endif /* CONFIG_NO_ROBUST_AV */ 4214 4215 wpa_ie = wpas_populate_assoc_ies(wpa_s, bss, ssid, ¶ms, NULL); 4216 if (!wpa_ie) { 4217 wpas_connect_work_done(wpa_s); 4218 return; 4219 } 4220 4221 if (bss && 4222 (!wpas_driver_bss_selection(wpa_s) || wpas_wps_searching(wpa_s))) { 4223 #ifdef CONFIG_IEEE80211R 4224 const u8 *ie, *md = NULL; 4225 #endif /* CONFIG_IEEE80211R */ 4226 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with " MACSTR 4227 " (SSID='%s' freq=%d MHz)", MAC2STR(bss->bssid), 4228 wpa_ssid_txt(bss->ssid, bss->ssid_len), bss->freq); 4229 bssid_changed = !is_zero_ether_addr(wpa_s->bssid); 4230 os_memset(wpa_s->bssid, 0, ETH_ALEN); 4231 os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN); 4232 if (bssid_changed) 4233 wpas_notify_bssid_changed(wpa_s); 4234 #ifdef CONFIG_IEEE80211R 4235 ie = wpa_bss_get_ie(bss, WLAN_EID_MOBILITY_DOMAIN); 4236 if (ie && ie[1] >= MOBILITY_DOMAIN_ID_LEN) 4237 md = ie + 2; 4238 wpa_sm_set_ft_params(wpa_s->wpa, ie, ie ? 2 + ie[1] : 0); 4239 if (md) { 4240 /* Prepare for the next transition */ 4241 wpa_ft_prepare_auth_request(wpa_s->wpa, ie); 4242 } 4243 #endif /* CONFIG_IEEE80211R */ 4244 #ifdef CONFIG_WPS 4245 } else if ((ssid->ssid == NULL || ssid->ssid_len == 0) && 4246 wpa_s->conf->ap_scan == 2 && 4247 (ssid->key_mgmt & WPA_KEY_MGMT_WPS)) { 4248 /* Use ap_scan==1 style network selection to find the network 4249 */ 4250 wpas_connect_work_done(wpa_s); 4251 wpa_s->scan_req = MANUAL_SCAN_REQ; 4252 wpa_s->reassociate = 1; 4253 wpa_supplicant_req_scan(wpa_s, 0, 0); 4254 os_free(wpa_ie); 4255 return; 4256 #endif /* CONFIG_WPS */ 4257 } else { 4258 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with SSID '%s'", 4259 wpa_ssid_txt(ssid->ssid, ssid->ssid_len)); 4260 if (bss) 4261 os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN); 4262 else 4263 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN); 4264 } 4265 if (!wpa_s->pno) 4266 wpa_supplicant_cancel_sched_scan(wpa_s); 4267 4268 wpa_supplicant_cancel_scan(wpa_s); 4269 4270 wpa_clear_keys(wpa_s, bss ? bss->bssid : NULL); 4271 use_crypt = 1; 4272 cipher_pairwise = wpa_s->pairwise_cipher; 4273 cipher_group = wpa_s->group_cipher; 4274 cipher_group_mgmt = wpa_s->mgmt_group_cipher; 4275 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE || 4276 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) { 4277 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE) 4278 use_crypt = 0; 4279 #ifdef CONFIG_WEP 4280 if (wpa_set_wep_keys(wpa_s, ssid)) { 4281 use_crypt = 1; 4282 wep_keys_set = 1; 4283 } 4284 #endif /* CONFIG_WEP */ 4285 } 4286 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) 4287 use_crypt = 0; 4288 4289 #ifdef IEEE8021X_EAPOL 4290 if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) { 4291 if ((ssid->eapol_flags & 4292 (EAPOL_FLAG_REQUIRE_KEY_UNICAST | 4293 EAPOL_FLAG_REQUIRE_KEY_BROADCAST)) == 0 && 4294 !wep_keys_set) { 4295 use_crypt = 0; 4296 } else { 4297 /* Assume that dynamic WEP-104 keys will be used and 4298 * set cipher suites in order for drivers to expect 4299 * encryption. */ 4300 cipher_pairwise = cipher_group = WPA_CIPHER_WEP104; 4301 } 4302 } 4303 #endif /* IEEE8021X_EAPOL */ 4304 4305 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) { 4306 /* Set the key before (and later after) association */ 4307 wpa_supplicant_set_wpa_none_key(wpa_s, ssid); 4308 } 4309 4310 /* Set current_ssid before changing state to ASSOCIATING, so that the 4311 * selected SSID is available to wpas_notify_state_changed(). */ 4312 old_ssid = wpa_s->current_ssid; 4313 wpa_s->current_ssid = ssid; 4314 4315 wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING); 4316 if (bss) { 4317 params.ssid = bss->ssid; 4318 params.ssid_len = bss->ssid_len; 4319 if (!wpas_driver_bss_selection(wpa_s) || ssid->bssid_set || 4320 wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) { 4321 wpa_printf(MSG_DEBUG, "Limit connection to BSSID " 4322 MACSTR " freq=%u MHz based on scan results " 4323 "(bssid_set=%d wps=%d)", 4324 MAC2STR(bss->bssid), bss->freq, 4325 ssid->bssid_set, 4326 wpa_s->key_mgmt == WPA_KEY_MGMT_WPS); 4327 params.bssid = bss->bssid; 4328 params.freq.freq = bss->freq; 4329 } 4330 params.bssid_hint = bss->bssid; 4331 params.freq_hint = bss->freq; 4332 params.pbss = bss_is_pbss(bss); 4333 } else { 4334 if (ssid->bssid_hint_set) 4335 params.bssid_hint = ssid->bssid_hint; 4336 4337 params.ssid = ssid->ssid; 4338 params.ssid_len = ssid->ssid_len; 4339 params.pbss = (ssid->pbss != 2) ? ssid->pbss : 0; 4340 } 4341 4342 if (ssid->mode == WPAS_MODE_IBSS && ssid->bssid_set && 4343 wpa_s->conf->ap_scan == 2) { 4344 params.bssid = ssid->bssid; 4345 params.fixed_bssid = 1; 4346 } 4347 4348 /* Initial frequency for IBSS/mesh */ 4349 if ((ssid->mode == WPAS_MODE_IBSS || ssid->mode == WPAS_MODE_MESH) && 4350 ssid->frequency > 0 && params.freq.freq == 0) 4351 ibss_mesh_setup_freq(wpa_s, ssid, ¶ms.freq); 4352 4353 if (ssid->mode == WPAS_MODE_IBSS) { 4354 params.fixed_freq = ssid->fixed_freq; 4355 if (ssid->beacon_int) 4356 params.beacon_int = ssid->beacon_int; 4357 else 4358 params.beacon_int = wpa_s->conf->beacon_int; 4359 } 4360 4361 if (bss && ssid->enable_edmg) 4362 edmg_ie_oper = wpa_bss_get_ie_ext(bss, 4363 WLAN_EID_EXT_EDMG_OPERATION); 4364 else 4365 edmg_ie_oper = NULL; 4366 4367 if (edmg_ie_oper) { 4368 params.freq.edmg.channels = 4369 wpa_ie_get_edmg_oper_chans(edmg_ie_oper); 4370 params.freq.edmg.bw_config = 4371 wpa_ie_get_edmg_oper_chan_width(edmg_ie_oper); 4372 wpa_printf(MSG_DEBUG, 4373 "AP supports EDMG channels 0x%x, bw_config %d", 4374 params.freq.edmg.channels, 4375 params.freq.edmg.bw_config); 4376 4377 /* User may ask for specific EDMG channel for EDMG connection 4378 * (must be supported by AP) 4379 */ 4380 if (ssid->edmg_channel) { 4381 struct ieee80211_edmg_config configured_edmg; 4382 enum hostapd_hw_mode hw_mode; 4383 u8 primary_channel; 4384 4385 hw_mode = ieee80211_freq_to_chan(bss->freq, 4386 &primary_channel); 4387 if (hw_mode == NUM_HOSTAPD_MODES) 4388 goto edmg_fail; 4389 4390 hostapd_encode_edmg_chan(ssid->enable_edmg, 4391 ssid->edmg_channel, 4392 primary_channel, 4393 &configured_edmg); 4394 4395 if (ieee802_edmg_is_allowed(params.freq.edmg, 4396 configured_edmg)) { 4397 params.freq.edmg = configured_edmg; 4398 wpa_printf(MSG_DEBUG, 4399 "Use EDMG channel %d for connection", 4400 ssid->edmg_channel); 4401 } else { 4402 edmg_fail: 4403 params.freq.edmg.channels = 0; 4404 params.freq.edmg.bw_config = 0; 4405 wpa_printf(MSG_WARNING, 4406 "EDMG channel %d not supported by AP, fallback to DMG", 4407 ssid->edmg_channel); 4408 } 4409 } 4410 4411 if (params.freq.edmg.channels) { 4412 wpa_printf(MSG_DEBUG, 4413 "EDMG before: channels 0x%x, bw_config %d", 4414 params.freq.edmg.channels, 4415 params.freq.edmg.bw_config); 4416 params.freq.edmg = get_supported_edmg(wpa_s, 4417 ¶ms.freq, 4418 params.freq.edmg); 4419 wpa_printf(MSG_DEBUG, 4420 "EDMG after: channels 0x%x, bw_config %d", 4421 params.freq.edmg.channels, 4422 params.freq.edmg.bw_config); 4423 } 4424 } 4425 4426 params.pairwise_suite = cipher_pairwise; 4427 params.group_suite = cipher_group; 4428 params.mgmt_group_suite = cipher_group_mgmt; 4429 params.key_mgmt_suite = wpa_s->key_mgmt; 4430 params.allowed_key_mgmts = wpa_s->allowed_key_mgmts; 4431 params.wpa_proto = wpa_s->wpa_proto; 4432 wpa_s->auth_alg = params.auth_alg; 4433 params.mode = ssid->mode; 4434 params.bg_scan_period = ssid->bg_scan_period; 4435 #ifdef CONFIG_WEP 4436 { 4437 int i; 4438 4439 for (i = 0; i < NUM_WEP_KEYS; i++) { 4440 if (ssid->wep_key_len[i]) 4441 params.wep_key[i] = ssid->wep_key[i]; 4442 params.wep_key_len[i] = ssid->wep_key_len[i]; 4443 } 4444 params.wep_tx_keyidx = ssid->wep_tx_keyidx; 4445 } 4446 #endif /* CONFIG_WEP */ 4447 4448 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_PSK) && 4449 (params.key_mgmt_suite == WPA_KEY_MGMT_PSK || 4450 params.key_mgmt_suite == WPA_KEY_MGMT_FT_PSK || 4451 (params.allowed_key_mgmts & 4452 (WPA_KEY_MGMT_PSK | WPA_KEY_MGMT_FT_PSK)))) { 4453 params.passphrase = ssid->passphrase; 4454 if (wpa_supplicant_get_psk(wpa_s, bss, ssid, psk) == 0) 4455 params.psk = psk; 4456 } 4457 4458 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_8021X) && 4459 (params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X || 4460 params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SHA256 || 4461 params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SUITE_B || 4462 params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SUITE_B_192 || 4463 params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SHA384)) 4464 params.req_handshake_offload = 1; 4465 4466 if (wpa_s->conf->key_mgmt_offload) { 4467 if (params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X || 4468 params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SHA256 || 4469 params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SUITE_B || 4470 params.key_mgmt_suite == 4471 WPA_KEY_MGMT_IEEE8021X_SUITE_B_192 || 4472 params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SHA384) 4473 params.req_key_mgmt_offload = 4474 ssid->proactive_key_caching < 0 ? 4475 wpa_s->conf->okc : ssid->proactive_key_caching; 4476 else 4477 params.req_key_mgmt_offload = 1; 4478 4479 if ((wpa_key_mgmt_wpa_psk_no_sae(params.key_mgmt_suite) || 4480 wpa_key_mgmt_wpa_psk_no_sae(params.allowed_key_mgmts)) && 4481 wpa_supplicant_get_psk(wpa_s, bss, ssid, psk) == 0) 4482 params.psk = psk; 4483 } 4484 4485 if ((wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_SAE_OFFLOAD_STA) && 4486 wpa_key_mgmt_sae(params.key_mgmt_suite)) { 4487 params.auth_alg = WPA_AUTH_ALG_SAE; 4488 if (ssid->sae_password) { 4489 params.sae_password = ssid->sae_password; 4490 params.sae_password_id = ssid->sae_password_id; 4491 } else if (ssid->passphrase) { 4492 params.passphrase = ssid->passphrase; 4493 } 4494 } 4495 4496 params.drop_unencrypted = use_crypt; 4497 4498 params.mgmt_frame_protection = wpas_get_ssid_pmf(wpa_s, ssid); 4499 if (params.mgmt_frame_protection != NO_MGMT_FRAME_PROTECTION && bss) { 4500 const u8 *rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN); 4501 struct wpa_ie_data ie; 4502 if (!wpas_driver_bss_selection(wpa_s) && rsn && 4503 wpa_parse_wpa_ie(rsn, 2 + rsn[1], &ie) == 0 && 4504 ie.capabilities & 4505 (WPA_CAPABILITY_MFPC | WPA_CAPABILITY_MFPR)) { 4506 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected AP supports " 4507 "MFP: require MFP"); 4508 params.mgmt_frame_protection = 4509 MGMT_FRAME_PROTECTION_REQUIRED; 4510 #ifdef CONFIG_OWE 4511 } else if (!rsn && (ssid->key_mgmt & WPA_KEY_MGMT_OWE) && 4512 !ssid->owe_only) { 4513 params.mgmt_frame_protection = NO_MGMT_FRAME_PROTECTION; 4514 #endif /* CONFIG_OWE */ 4515 } 4516 } 4517 4518 params.p2p = ssid->p2p_group; 4519 4520 if (wpa_s->p2pdev->set_sta_uapsd) 4521 params.uapsd = wpa_s->p2pdev->sta_uapsd; 4522 else 4523 params.uapsd = -1; 4524 4525 #ifdef CONFIG_HT_OVERRIDES 4526 os_memset(&htcaps, 0, sizeof(htcaps)); 4527 os_memset(&htcaps_mask, 0, sizeof(htcaps_mask)); 4528 params.htcaps = (u8 *) &htcaps; 4529 params.htcaps_mask = (u8 *) &htcaps_mask; 4530 wpa_supplicant_apply_ht_overrides(wpa_s, ssid, ¶ms); 4531 #endif /* CONFIG_HT_OVERRIDES */ 4532 #ifdef CONFIG_VHT_OVERRIDES 4533 os_memset(&vhtcaps, 0, sizeof(vhtcaps)); 4534 os_memset(&vhtcaps_mask, 0, sizeof(vhtcaps_mask)); 4535 params.vhtcaps = &vhtcaps; 4536 params.vhtcaps_mask = &vhtcaps_mask; 4537 wpa_supplicant_apply_vht_overrides(wpa_s, ssid, ¶ms); 4538 #endif /* CONFIG_VHT_OVERRIDES */ 4539 #ifdef CONFIG_HE_OVERRIDES 4540 wpa_supplicant_apply_he_overrides(wpa_s, ssid, ¶ms); 4541 #endif /* CONFIG_HE_OVERRIDES */ 4542 wpa_supplicant_apply_eht_overrides(wpa_s, ssid, ¶ms); 4543 4544 #ifdef CONFIG_P2P 4545 /* 4546 * If multi-channel concurrency is not supported, check for any 4547 * frequency conflict. In case of any frequency conflict, remove the 4548 * least prioritized connection. 4549 */ 4550 if (wpa_s->num_multichan_concurrent < 2) { 4551 int freq, num; 4552 num = get_shared_radio_freqs(wpa_s, &freq, 1, false); 4553 if (num > 0 && freq > 0 && freq != params.freq.freq) { 4554 wpa_printf(MSG_DEBUG, 4555 "Assoc conflicting freq found (%d != %d)", 4556 freq, params.freq.freq); 4557 if (wpas_p2p_handle_frequency_conflicts( 4558 wpa_s, params.freq.freq, ssid) < 0) { 4559 wpas_connect_work_done(wpa_s); 4560 os_free(wpa_ie); 4561 return; 4562 } 4563 } 4564 } 4565 #endif /* CONFIG_P2P */ 4566 4567 if (wpa_s->reassoc_same_ess && !is_zero_ether_addr(prev_bssid) && 4568 old_ssid) 4569 params.prev_bssid = prev_bssid; 4570 4571 #ifdef CONFIG_SAE 4572 params.sae_pwe = wpa_s->conf->sae_pwe; 4573 #endif /* CONFIG_SAE */ 4574 4575 ret = wpa_drv_associate(wpa_s, ¶ms); 4576 forced_memzero(psk, sizeof(psk)); 4577 os_free(wpa_ie); 4578 if (ret < 0) { 4579 wpa_msg(wpa_s, MSG_INFO, "Association request to the driver " 4580 "failed"); 4581 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_VALID_ERROR_CODES) { 4582 /* 4583 * The driver is known to mean what is saying, so we 4584 * can stop right here; the association will not 4585 * succeed. 4586 */ 4587 wpas_connection_failed(wpa_s, wpa_s->pending_bssid, 4588 NULL); 4589 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED); 4590 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN); 4591 return; 4592 } 4593 /* try to continue anyway; new association will be tried again 4594 * after timeout */ 4595 assoc_failed = 1; 4596 } 4597 4598 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) { 4599 /* Set the key after the association just in case association 4600 * cleared the previously configured key. */ 4601 wpa_supplicant_set_wpa_none_key(wpa_s, ssid); 4602 /* No need to timeout authentication since there is no key 4603 * management. */ 4604 wpa_supplicant_cancel_auth_timeout(wpa_s); 4605 wpa_supplicant_set_state(wpa_s, WPA_COMPLETED); 4606 #ifdef CONFIG_IBSS_RSN 4607 } else if (ssid->mode == WPAS_MODE_IBSS && 4608 wpa_s->key_mgmt != WPA_KEY_MGMT_NONE && 4609 wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) { 4610 /* 4611 * RSN IBSS authentication is per-STA and we can disable the 4612 * per-BSSID authentication. 4613 */ 4614 wpa_supplicant_cancel_auth_timeout(wpa_s); 4615 #endif /* CONFIG_IBSS_RSN */ 4616 } else { 4617 /* Timeout for IEEE 802.11 authentication and association */ 4618 int timeout = 60; 4619 4620 if (assoc_failed) { 4621 /* give IBSS a bit more time */ 4622 timeout = ssid->mode == WPAS_MODE_IBSS ? 10 : 5; 4623 } else if (wpa_s->conf->ap_scan == 1) { 4624 /* give IBSS a bit more time */ 4625 timeout = ssid->mode == WPAS_MODE_IBSS ? 20 : 10; 4626 } 4627 wpa_supplicant_req_auth_timeout(wpa_s, timeout, 0); 4628 } 4629 4630 #ifdef CONFIG_WEP 4631 if (wep_keys_set && 4632 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC)) { 4633 /* Set static WEP keys again */ 4634 wpa_set_wep_keys(wpa_s, ssid); 4635 } 4636 #endif /* CONFIG_WEP */ 4637 4638 if (old_ssid && old_ssid != ssid) { 4639 /* 4640 * Do not allow EAP session resumption between different 4641 * network configurations. 4642 */ 4643 eapol_sm_invalidate_cached_session(wpa_s->eapol); 4644 } 4645 4646 if (!wpas_driver_bss_selection(wpa_s) || 4647 #ifdef CONFIG_P2P 4648 wpa_s->p2p_in_invitation || 4649 #endif /* CONFIG_P2P */ 4650 ssid->bssid_set) { 4651 wpa_s->current_bss = bss; 4652 #ifdef CONFIG_HS20 4653 hs20_configure_frame_filters(wpa_s); 4654 #endif /* CONFIG_HS20 */ 4655 } 4656 4657 wpa_supplicant_rsn_supp_set_config(wpa_s, wpa_s->current_ssid); 4658 if (bss) 4659 wpa_sm_set_ssid(wpa_s->wpa, bss->ssid, bss->ssid_len); 4660 wpa_supplicant_initiate_eapol(wpa_s); 4661 if (old_ssid != wpa_s->current_ssid) 4662 wpas_notify_network_changed(wpa_s); 4663 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME)) 4664 wpas_notify_auth_changed(wpa_s); 4665 } 4666 4667 4668 static void wpa_supplicant_clear_connection(struct wpa_supplicant *wpa_s, 4669 const u8 *addr) 4670 { 4671 struct wpa_ssid *old_ssid; 4672 4673 wpa_s->ml_connect_probe_ssid = NULL; 4674 wpa_s->ml_connect_probe_bss = NULL; 4675 wpas_connect_work_done(wpa_s); 4676 wpa_clear_keys(wpa_s, addr); 4677 old_ssid = wpa_s->current_ssid; 4678 wpa_supplicant_mark_disassoc(wpa_s); 4679 wpa_sm_set_config(wpa_s->wpa, NULL); 4680 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL); 4681 if (old_ssid != wpa_s->current_ssid) 4682 wpas_notify_network_changed(wpa_s); 4683 4684 #ifndef CONFIG_NO_ROBUST_AV 4685 wpas_scs_deinit(wpa_s); 4686 wpas_dscp_deinit(wpa_s); 4687 #endif /* CONFIG_NO_ROBUST_AV */ 4688 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL); 4689 } 4690 4691 4692 /** 4693 * wpa_supplicant_deauthenticate - Deauthenticate the current connection 4694 * @wpa_s: Pointer to wpa_supplicant data 4695 * @reason_code: IEEE 802.11 reason code for the deauthenticate frame 4696 * 4697 * This function is used to request %wpa_supplicant to deauthenticate from the 4698 * current AP. 4699 */ 4700 void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s, 4701 u16 reason_code) 4702 { 4703 u8 *addr = NULL; 4704 union wpa_event_data event; 4705 int zero_addr = 0; 4706 4707 wpa_dbg(wpa_s, MSG_DEBUG, "Request to deauthenticate - bssid=" MACSTR 4708 " pending_bssid=" MACSTR 4709 " reason=%d (%s) state=%s valid_links=0x%x ap_mld_addr=" MACSTR, 4710 MAC2STR(wpa_s->bssid), MAC2STR(wpa_s->pending_bssid), 4711 reason_code, reason2str(reason_code), 4712 wpa_supplicant_state_txt(wpa_s->wpa_state), wpa_s->valid_links, 4713 MAC2STR(wpa_s->ap_mld_addr)); 4714 4715 if (wpa_s->valid_links && !is_zero_ether_addr(wpa_s->ap_mld_addr)) 4716 addr = wpa_s->ap_mld_addr; 4717 else if (!is_zero_ether_addr(wpa_s->pending_bssid) && 4718 (wpa_s->wpa_state == WPA_AUTHENTICATING || 4719 wpa_s->wpa_state == WPA_ASSOCIATING)) 4720 addr = wpa_s->pending_bssid; 4721 else if (!is_zero_ether_addr(wpa_s->bssid)) 4722 addr = wpa_s->bssid; 4723 else if (wpa_s->wpa_state == WPA_ASSOCIATING) { 4724 /* 4725 * When using driver-based BSS selection, we may not know the 4726 * BSSID with which we are currently trying to associate. We 4727 * need to notify the driver of this disconnection even in such 4728 * a case, so use the all zeros address here. 4729 */ 4730 addr = wpa_s->bssid; 4731 zero_addr = 1; 4732 } 4733 4734 if (wpa_s->enabled_4addr_mode && wpa_drv_set_4addr_mode(wpa_s, 0) == 0) 4735 wpa_s->enabled_4addr_mode = 0; 4736 4737 #ifdef CONFIG_TDLS 4738 wpa_tdls_teardown_peers(wpa_s->wpa); 4739 #endif /* CONFIG_TDLS */ 4740 4741 #ifdef CONFIG_MESH 4742 if (wpa_s->ifmsh) { 4743 struct mesh_conf *mconf; 4744 4745 mconf = wpa_s->ifmsh->mconf; 4746 wpa_msg(wpa_s, MSG_INFO, MESH_GROUP_REMOVED "%s", 4747 wpa_s->ifname); 4748 wpas_notify_mesh_group_removed(wpa_s, mconf->meshid, 4749 mconf->meshid_len, reason_code); 4750 wpa_supplicant_leave_mesh(wpa_s, true); 4751 } 4752 #endif /* CONFIG_MESH */ 4753 4754 if (addr) { 4755 wpa_drv_deauthenticate(wpa_s, addr, reason_code); 4756 os_memset(&event, 0, sizeof(event)); 4757 event.deauth_info.reason_code = reason_code; 4758 event.deauth_info.locally_generated = 1; 4759 wpa_supplicant_event(wpa_s, EVENT_DEAUTH, &event); 4760 if (zero_addr) 4761 addr = NULL; 4762 } 4763 4764 wpa_supplicant_clear_connection(wpa_s, addr); 4765 } 4766 4767 4768 void wpa_supplicant_reconnect(struct wpa_supplicant *wpa_s) 4769 { 4770 wpa_s->own_reconnect_req = 1; 4771 wpa_supplicant_deauthenticate(wpa_s, WLAN_REASON_UNSPECIFIED); 4772 4773 } 4774 4775 4776 static void wpa_supplicant_enable_one_network(struct wpa_supplicant *wpa_s, 4777 struct wpa_ssid *ssid) 4778 { 4779 if (!ssid || !ssid->disabled || ssid->disabled == 2) 4780 return; 4781 4782 ssid->disabled = 0; 4783 ssid->owe_transition_bss_select_count = 0; 4784 wpas_clear_temp_disabled(wpa_s, ssid, 1); 4785 wpas_notify_network_enabled_changed(wpa_s, ssid); 4786 4787 /* 4788 * Try to reassociate since there is no current configuration and a new 4789 * network was made available. 4790 */ 4791 if (!wpa_s->current_ssid && !wpa_s->disconnected) 4792 wpa_s->reassociate = 1; 4793 } 4794 4795 4796 /** 4797 * wpa_supplicant_add_network - Add a new network 4798 * @wpa_s: wpa_supplicant structure for a network interface 4799 * Returns: The new network configuration or %NULL if operation failed 4800 * 4801 * This function performs the following operations: 4802 * 1. Adds a new network. 4803 * 2. Send network addition notification. 4804 * 3. Marks the network disabled. 4805 * 4. Set network default parameters. 4806 */ 4807 struct wpa_ssid * wpa_supplicant_add_network(struct wpa_supplicant *wpa_s) 4808 { 4809 struct wpa_ssid *ssid; 4810 4811 ssid = wpa_config_add_network(wpa_s->conf); 4812 if (!ssid) 4813 return NULL; 4814 wpas_notify_network_added(wpa_s, ssid); 4815 ssid->disabled = 1; 4816 wpa_config_set_network_defaults(ssid); 4817 4818 return ssid; 4819 } 4820 4821 4822 /** 4823 * wpa_supplicant_remove_network - Remove a configured network based on id 4824 * @wpa_s: wpa_supplicant structure for a network interface 4825 * @id: Unique network id to search for 4826 * Returns: 0 on success, or -1 if the network was not found, -2 if the network 4827 * could not be removed 4828 * 4829 * This function performs the following operations: 4830 * 1. Removes the network. 4831 * 2. Send network removal notification. 4832 * 3. Update internal state machines. 4833 * 4. Stop any running sched scans. 4834 */ 4835 int wpa_supplicant_remove_network(struct wpa_supplicant *wpa_s, int id) 4836 { 4837 struct wpa_ssid *ssid, *prev = wpa_s->current_ssid; 4838 int was_disabled; 4839 4840 ssid = wpa_config_get_network(wpa_s->conf, id); 4841 if (!ssid) 4842 return -1; 4843 wpas_notify_network_removed(wpa_s, ssid); 4844 4845 if (ssid == prev || !prev) { 4846 #ifdef CONFIG_SME 4847 wpa_s->sme.prev_bssid_set = 0; 4848 #endif /* CONFIG_SME */ 4849 /* 4850 * Invalidate the EAP session cache if the current or 4851 * previously used network is removed. 4852 */ 4853 eapol_sm_invalidate_cached_session(wpa_s->eapol); 4854 } 4855 4856 if (ssid == prev) { 4857 wpa_sm_set_config(wpa_s->wpa, NULL); 4858 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL); 4859 4860 if (wpa_s->wpa_state >= WPA_AUTHENTICATING) 4861 wpa_s->own_disconnect_req = 1; 4862 wpa_supplicant_deauthenticate(wpa_s, 4863 WLAN_REASON_DEAUTH_LEAVING); 4864 } 4865 4866 was_disabled = ssid->disabled; 4867 4868 if (wpa_config_remove_network(wpa_s->conf, id) < 0) 4869 return -2; 4870 4871 if (!was_disabled && wpa_s->sched_scanning) { 4872 wpa_printf(MSG_DEBUG, 4873 "Stop ongoing sched_scan to remove network from filters"); 4874 wpa_supplicant_cancel_sched_scan(wpa_s); 4875 wpa_supplicant_req_scan(wpa_s, 0, 0); 4876 } 4877 4878 return 0; 4879 } 4880 4881 4882 /** 4883 * wpa_supplicant_remove_all_networks - Remove all configured networks 4884 * @wpa_s: wpa_supplicant structure for a network interface 4885 * Returns: 0 on success (errors are currently ignored) 4886 * 4887 * This function performs the following operations: 4888 * 1. Remove all networks. 4889 * 2. Send network removal notifications. 4890 * 3. Update internal state machines. 4891 * 4. Stop any running sched scans. 4892 */ 4893 int wpa_supplicant_remove_all_networks(struct wpa_supplicant *wpa_s) 4894 { 4895 struct wpa_ssid *ssid; 4896 4897 if (wpa_s->drv_flags2 & 4898 (WPA_DRIVER_FLAGS2_SAE_OFFLOAD_STA | 4899 WPA_DRIVER_FLAGS2_OWE_OFFLOAD_STA)) 4900 wpa_drv_flush_pmkid(wpa_s); 4901 4902 if (wpa_s->sched_scanning) 4903 wpa_supplicant_cancel_sched_scan(wpa_s); 4904 4905 eapol_sm_invalidate_cached_session(wpa_s->eapol); 4906 if (wpa_s->current_ssid) { 4907 #ifdef CONFIG_SME 4908 wpa_s->sme.prev_bssid_set = 0; 4909 #endif /* CONFIG_SME */ 4910 wpa_sm_set_config(wpa_s->wpa, NULL); 4911 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL); 4912 if (wpa_s->wpa_state >= WPA_AUTHENTICATING) 4913 wpa_s->own_disconnect_req = 1; 4914 wpa_supplicant_deauthenticate( 4915 wpa_s, WLAN_REASON_DEAUTH_LEAVING); 4916 } 4917 ssid = wpa_s->conf->ssid; 4918 while (ssid) { 4919 struct wpa_ssid *remove_ssid = ssid; 4920 int id; 4921 4922 id = ssid->id; 4923 ssid = ssid->next; 4924 wpas_notify_network_removed(wpa_s, remove_ssid); 4925 wpa_config_remove_network(wpa_s->conf, id); 4926 } 4927 return 0; 4928 } 4929 4930 4931 /** 4932 * wpa_supplicant_enable_network - Mark a configured network as enabled 4933 * @wpa_s: wpa_supplicant structure for a network interface 4934 * @ssid: wpa_ssid structure for a configured network or %NULL 4935 * 4936 * Enables the specified network or all networks if no network specified. 4937 */ 4938 void wpa_supplicant_enable_network(struct wpa_supplicant *wpa_s, 4939 struct wpa_ssid *ssid) 4940 { 4941 if (ssid == NULL) { 4942 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) 4943 wpa_supplicant_enable_one_network(wpa_s, ssid); 4944 } else 4945 wpa_supplicant_enable_one_network(wpa_s, ssid); 4946 4947 if (wpa_s->reassociate && !wpa_s->disconnected && 4948 (!wpa_s->current_ssid || 4949 wpa_s->wpa_state == WPA_DISCONNECTED || 4950 wpa_s->wpa_state == WPA_SCANNING)) { 4951 if (wpa_s->sched_scanning) { 4952 wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan to add " 4953 "new network to scan filters"); 4954 wpa_supplicant_cancel_sched_scan(wpa_s); 4955 } 4956 4957 if (wpa_supplicant_fast_associate(wpa_s) != 1) { 4958 wpa_s->scan_req = NORMAL_SCAN_REQ; 4959 wpa_supplicant_req_scan(wpa_s, 0, 0); 4960 } 4961 } 4962 } 4963 4964 4965 /** 4966 * wpa_supplicant_disable_network - Mark a configured network as disabled 4967 * @wpa_s: wpa_supplicant structure for a network interface 4968 * @ssid: wpa_ssid structure for a configured network or %NULL 4969 * 4970 * Disables the specified network or all networks if no network specified. 4971 */ 4972 void wpa_supplicant_disable_network(struct wpa_supplicant *wpa_s, 4973 struct wpa_ssid *ssid) 4974 { 4975 struct wpa_ssid *other_ssid; 4976 int was_disabled; 4977 4978 if (ssid == NULL) { 4979 if (wpa_s->sched_scanning) 4980 wpa_supplicant_cancel_sched_scan(wpa_s); 4981 4982 for (other_ssid = wpa_s->conf->ssid; other_ssid; 4983 other_ssid = other_ssid->next) { 4984 was_disabled = other_ssid->disabled; 4985 if (was_disabled == 2) 4986 continue; /* do not change persistent P2P group 4987 * data */ 4988 4989 other_ssid->disabled = 1; 4990 4991 if (was_disabled != other_ssid->disabled) 4992 wpas_notify_network_enabled_changed( 4993 wpa_s, other_ssid); 4994 } 4995 if (wpa_s->current_ssid) { 4996 if (wpa_s->wpa_state >= WPA_AUTHENTICATING) 4997 wpa_s->own_disconnect_req = 1; 4998 wpa_supplicant_deauthenticate( 4999 wpa_s, WLAN_REASON_DEAUTH_LEAVING); 5000 } 5001 } else if (ssid->disabled != 2) { 5002 if (ssid == wpa_s->current_ssid) { 5003 if (wpa_s->wpa_state >= WPA_AUTHENTICATING) 5004 wpa_s->own_disconnect_req = 1; 5005 wpa_supplicant_deauthenticate( 5006 wpa_s, WLAN_REASON_DEAUTH_LEAVING); 5007 } 5008 5009 was_disabled = ssid->disabled; 5010 5011 ssid->disabled = 1; 5012 5013 if (was_disabled != ssid->disabled) { 5014 wpas_notify_network_enabled_changed(wpa_s, ssid); 5015 if (wpa_s->sched_scanning) { 5016 wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan " 5017 "to remove network from filters"); 5018 wpa_supplicant_cancel_sched_scan(wpa_s); 5019 wpa_supplicant_req_scan(wpa_s, 0, 0); 5020 } 5021 } 5022 } 5023 } 5024 5025 5026 /** 5027 * wpa_supplicant_select_network - Attempt association with a network 5028 * @wpa_s: wpa_supplicant structure for a network interface 5029 * @ssid: wpa_ssid structure for a configured network or %NULL for any network 5030 */ 5031 void wpa_supplicant_select_network(struct wpa_supplicant *wpa_s, 5032 struct wpa_ssid *ssid) 5033 { 5034 5035 struct wpa_ssid *other_ssid; 5036 int disconnected = 0; 5037 5038 if (ssid && ssid != wpa_s->current_ssid && wpa_s->current_ssid) { 5039 if (wpa_s->wpa_state >= WPA_AUTHENTICATING) 5040 wpa_s->own_disconnect_req = 1; 5041 wpa_supplicant_deauthenticate( 5042 wpa_s, WLAN_REASON_DEAUTH_LEAVING); 5043 disconnected = 1; 5044 } 5045 5046 if (ssid) 5047 wpas_clear_temp_disabled(wpa_s, ssid, 1); 5048 5049 /* 5050 * Mark all other networks disabled or mark all networks enabled if no 5051 * network specified. 5052 */ 5053 for (other_ssid = wpa_s->conf->ssid; other_ssid; 5054 other_ssid = other_ssid->next) { 5055 int was_disabled = other_ssid->disabled; 5056 if (was_disabled == 2) 5057 continue; /* do not change persistent P2P group data */ 5058 5059 other_ssid->disabled = ssid ? (ssid->id != other_ssid->id) : 0; 5060 if (was_disabled && !other_ssid->disabled) 5061 wpas_clear_temp_disabled(wpa_s, other_ssid, 0); 5062 5063 if (was_disabled != other_ssid->disabled) 5064 wpas_notify_network_enabled_changed(wpa_s, other_ssid); 5065 } 5066 5067 if (ssid && ssid == wpa_s->current_ssid && wpa_s->current_ssid && 5068 wpa_s->wpa_state >= WPA_AUTHENTICATING) { 5069 /* We are already associated with the selected network */ 5070 wpa_printf(MSG_DEBUG, "Already associated with the " 5071 "selected network - do nothing"); 5072 return; 5073 } 5074 5075 if (ssid) { 5076 wpa_s->current_ssid = ssid; 5077 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL); 5078 wpa_s->connect_without_scan = 5079 (ssid->mode == WPAS_MODE_MESH || 5080 ssid->mode == WPAS_MODE_AP) ? ssid : NULL; 5081 5082 /* 5083 * Don't optimize next scan freqs since a new ESS has been 5084 * selected. 5085 */ 5086 os_free(wpa_s->next_scan_freqs); 5087 wpa_s->next_scan_freqs = NULL; 5088 } else { 5089 wpa_s->connect_without_scan = NULL; 5090 } 5091 5092 wpa_s->disconnected = 0; 5093 wpa_s->reassociate = 1; 5094 wpa_s_clear_sae_rejected(wpa_s); 5095 wpa_s->last_owe_group = 0; 5096 if (ssid) { 5097 ssid->owe_transition_bss_select_count = 0; 5098 wpa_s_setup_sae_pt(wpa_s->conf, ssid, false); 5099 } 5100 5101 if (wpa_s->connect_without_scan || 5102 wpa_supplicant_fast_associate(wpa_s) != 1) { 5103 wpa_s->scan_req = NORMAL_SCAN_REQ; 5104 wpas_scan_reset_sched_scan(wpa_s); 5105 wpa_supplicant_req_scan(wpa_s, 0, disconnected ? 100000 : 0); 5106 } 5107 5108 if (ssid) 5109 wpas_notify_network_selected(wpa_s, ssid); 5110 } 5111 5112 5113 /** 5114 * wpas_remove_cred - Remove the specified credential and all the network 5115 * entries created based on the removed credential 5116 * @wpa_s: wpa_supplicant structure for a network interface 5117 * @cred: The credential to remove 5118 * Returns: 0 on success, -1 on failure 5119 */ 5120 int wpas_remove_cred(struct wpa_supplicant *wpa_s, struct wpa_cred *cred) 5121 { 5122 struct wpa_ssid *ssid, *next; 5123 int id; 5124 5125 if (!cred) { 5126 wpa_printf(MSG_DEBUG, "Could not find cred"); 5127 return -1; 5128 } 5129 5130 id = cred->id; 5131 if (wpa_config_remove_cred(wpa_s->conf, id) < 0) { 5132 wpa_printf(MSG_DEBUG, "Could not find cred %d", id); 5133 return -1; 5134 } 5135 5136 wpa_msg(wpa_s, MSG_INFO, CRED_REMOVED "%d", id); 5137 5138 /* Remove any network entry created based on the removed credential */ 5139 ssid = wpa_s->conf->ssid; 5140 while (ssid) { 5141 next = ssid->next; 5142 5143 if (ssid->parent_cred == cred) { 5144 wpa_printf(MSG_DEBUG, 5145 "Remove network id %d since it used the removed credential", 5146 ssid->id); 5147 if (wpa_supplicant_remove_network(wpa_s, ssid->id) == 5148 -1) { 5149 wpa_printf(MSG_DEBUG, 5150 "Could not find network id=%d", 5151 ssid->id); 5152 } 5153 } 5154 5155 ssid = next; 5156 } 5157 5158 return 0; 5159 } 5160 5161 5162 /** 5163 * wpas_remove_cred - Remove all the Interworking credentials 5164 * @wpa_s: wpa_supplicant structure for a network interface 5165 * Returns: 0 on success, -1 on failure 5166 */ 5167 int wpas_remove_all_creds(struct wpa_supplicant *wpa_s) 5168 { 5169 int res, ret = 0; 5170 struct wpa_cred *cred, *prev; 5171 5172 cred = wpa_s->conf->cred; 5173 while (cred) { 5174 prev = cred; 5175 cred = cred->next; 5176 res = wpas_remove_cred(wpa_s, prev); 5177 if (res < 0) { 5178 wpa_printf(MSG_DEBUG, 5179 "Removal of all credentials failed - failed to remove credential id=%d", 5180 prev->id); 5181 ret = -1; 5182 } 5183 } 5184 5185 return ret; 5186 } 5187 5188 5189 /** 5190 * wpas_set_pkcs11_engine_and_module_path - Set PKCS #11 engine and module path 5191 * @wpa_s: wpa_supplicant structure for a network interface 5192 * @pkcs11_engine_path: PKCS #11 engine path or NULL 5193 * @pkcs11_module_path: PKCS #11 module path or NULL 5194 * Returns: 0 on success; -1 on failure 5195 * 5196 * Sets the PKCS #11 engine and module path. Both have to be NULL or a valid 5197 * path. If resetting the EAPOL state machine with the new PKCS #11 engine and 5198 * module path fails the paths will be reset to the default value (NULL). 5199 */ 5200 int wpas_set_pkcs11_engine_and_module_path(struct wpa_supplicant *wpa_s, 5201 const char *pkcs11_engine_path, 5202 const char *pkcs11_module_path) 5203 { 5204 char *pkcs11_engine_path_copy = NULL; 5205 char *pkcs11_module_path_copy = NULL; 5206 5207 if (pkcs11_engine_path != NULL) { 5208 pkcs11_engine_path_copy = os_strdup(pkcs11_engine_path); 5209 if (pkcs11_engine_path_copy == NULL) 5210 return -1; 5211 } 5212 if (pkcs11_module_path != NULL) { 5213 pkcs11_module_path_copy = os_strdup(pkcs11_module_path); 5214 if (pkcs11_module_path_copy == NULL) { 5215 os_free(pkcs11_engine_path_copy); 5216 return -1; 5217 } 5218 } 5219 5220 #ifndef CONFIG_PKCS11_ENGINE_PATH 5221 os_free(wpa_s->conf->pkcs11_engine_path); 5222 wpa_s->conf->pkcs11_engine_path = pkcs11_engine_path_copy; 5223 #endif /* CONFIG_PKCS11_ENGINE_PATH */ 5224 #ifndef CONFIG_PKCS11_MODULE_PATH 5225 os_free(wpa_s->conf->pkcs11_module_path); 5226 wpa_s->conf->pkcs11_module_path = pkcs11_module_path_copy; 5227 #endif /* CONFIG_PKCS11_MODULE_PATH */ 5228 5229 wpa_sm_set_eapol(wpa_s->wpa, NULL); 5230 eapol_sm_deinit(wpa_s->eapol); 5231 wpa_s->eapol = NULL; 5232 if (wpa_supplicant_init_eapol(wpa_s)) { 5233 /* Error -> Reset paths to the default value (NULL) once. */ 5234 if (pkcs11_engine_path != NULL && pkcs11_module_path != NULL) 5235 wpas_set_pkcs11_engine_and_module_path(wpa_s, NULL, 5236 NULL); 5237 5238 return -1; 5239 } 5240 wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol); 5241 5242 return 0; 5243 } 5244 5245 5246 /** 5247 * wpa_supplicant_set_ap_scan - Set AP scan mode for interface 5248 * @wpa_s: wpa_supplicant structure for a network interface 5249 * @ap_scan: AP scan mode 5250 * Returns: 0 if succeed or -1 if ap_scan has an invalid value 5251 * 5252 */ 5253 int wpa_supplicant_set_ap_scan(struct wpa_supplicant *wpa_s, int ap_scan) 5254 { 5255 5256 int old_ap_scan; 5257 5258 if (ap_scan < 0 || ap_scan > 2) 5259 return -1; 5260 5261 if (ap_scan == 2 && os_strcmp(wpa_s->driver->name, "nl80211") == 0) { 5262 wpa_printf(MSG_INFO, 5263 "Note: nl80211 driver interface is not designed to be used with ap_scan=2; this can result in connection failures"); 5264 } 5265 5266 #ifdef ANDROID 5267 if (ap_scan == 2 && ap_scan != wpa_s->conf->ap_scan && 5268 wpa_s->wpa_state >= WPA_ASSOCIATING && 5269 wpa_s->wpa_state < WPA_COMPLETED) { 5270 wpa_printf(MSG_ERROR, "ap_scan = %d (%d) rejected while " 5271 "associating", wpa_s->conf->ap_scan, ap_scan); 5272 return 0; 5273 } 5274 #endif /* ANDROID */ 5275 5276 old_ap_scan = wpa_s->conf->ap_scan; 5277 wpa_s->conf->ap_scan = ap_scan; 5278 5279 if (old_ap_scan != wpa_s->conf->ap_scan) 5280 wpas_notify_ap_scan_changed(wpa_s); 5281 5282 return 0; 5283 } 5284 5285 5286 /** 5287 * wpa_supplicant_set_bss_expiration_age - Set BSS entry expiration age 5288 * @wpa_s: wpa_supplicant structure for a network interface 5289 * @expire_age: Expiration age in seconds 5290 * Returns: 0 if succeed or -1 if expire_age has an invalid value 5291 * 5292 */ 5293 int wpa_supplicant_set_bss_expiration_age(struct wpa_supplicant *wpa_s, 5294 unsigned int bss_expire_age) 5295 { 5296 if (bss_expire_age < 10) { 5297 wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration age %u", 5298 bss_expire_age); 5299 return -1; 5300 } 5301 wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration age: %d sec", 5302 bss_expire_age); 5303 wpa_s->conf->bss_expiration_age = bss_expire_age; 5304 5305 return 0; 5306 } 5307 5308 5309 /** 5310 * wpa_supplicant_set_bss_expiration_count - Set BSS entry expiration scan count 5311 * @wpa_s: wpa_supplicant structure for a network interface 5312 * @expire_count: number of scans after which an unseen BSS is reclaimed 5313 * Returns: 0 if succeed or -1 if expire_count has an invalid value 5314 * 5315 */ 5316 int wpa_supplicant_set_bss_expiration_count(struct wpa_supplicant *wpa_s, 5317 unsigned int bss_expire_count) 5318 { 5319 if (bss_expire_count < 1) { 5320 wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration count %u", 5321 bss_expire_count); 5322 return -1; 5323 } 5324 wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration scan count: %u", 5325 bss_expire_count); 5326 wpa_s->conf->bss_expiration_scan_count = bss_expire_count; 5327 5328 return 0; 5329 } 5330 5331 5332 /** 5333 * wpa_supplicant_set_scan_interval - Set scan interval 5334 * @wpa_s: wpa_supplicant structure for a network interface 5335 * @scan_interval: scan interval in seconds 5336 * Returns: 0 if succeed or -1 if scan_interval has an invalid value 5337 * 5338 */ 5339 int wpa_supplicant_set_scan_interval(struct wpa_supplicant *wpa_s, 5340 int scan_interval) 5341 { 5342 if (scan_interval < 0) { 5343 wpa_msg(wpa_s, MSG_ERROR, "Invalid scan interval %d", 5344 scan_interval); 5345 return -1; 5346 } 5347 wpa_msg(wpa_s, MSG_DEBUG, "Setting scan interval: %d sec", 5348 scan_interval); 5349 wpa_supplicant_update_scan_int(wpa_s, scan_interval); 5350 5351 return 0; 5352 } 5353 5354 5355 /** 5356 * wpa_supplicant_set_debug_params - Set global debug params 5357 * @global: wpa_global structure 5358 * @debug_level: debug level 5359 * @debug_timestamp: determines if show timestamp in debug data 5360 * @debug_show_keys: determines if show keys in debug data 5361 * Returns: 0 if succeed or -1 if debug_level has wrong value 5362 */ 5363 int wpa_supplicant_set_debug_params(struct wpa_global *global, int debug_level, 5364 int debug_timestamp, int debug_show_keys) 5365 { 5366 5367 int old_level, old_timestamp, old_show_keys; 5368 5369 /* check for allowed debuglevels */ 5370 if (debug_level != MSG_EXCESSIVE && 5371 debug_level != MSG_MSGDUMP && 5372 debug_level != MSG_DEBUG && 5373 debug_level != MSG_INFO && 5374 debug_level != MSG_WARNING && 5375 debug_level != MSG_ERROR) 5376 return -1; 5377 5378 old_level = wpa_debug_level; 5379 old_timestamp = wpa_debug_timestamp; 5380 old_show_keys = wpa_debug_show_keys; 5381 5382 wpa_debug_level = debug_level; 5383 wpa_debug_timestamp = debug_timestamp ? 1 : 0; 5384 wpa_debug_show_keys = debug_show_keys ? 1 : 0; 5385 5386 if (wpa_debug_level != old_level) 5387 wpas_notify_debug_level_changed(global); 5388 if (wpa_debug_timestamp != old_timestamp) 5389 wpas_notify_debug_timestamp_changed(global); 5390 if (wpa_debug_show_keys != old_show_keys) 5391 wpas_notify_debug_show_keys_changed(global); 5392 5393 return 0; 5394 } 5395 5396 5397 #ifdef CONFIG_OWE 5398 static int owe_trans_ssid_match(struct wpa_supplicant *wpa_s, const u8 *bssid, 5399 const u8 *entry_ssid, size_t entry_ssid_len) 5400 { 5401 const u8 *owe, *pos, *end; 5402 u8 ssid_len; 5403 struct wpa_bss *bss; 5404 5405 /* Check network profile SSID aganst the SSID in the 5406 * OWE Transition Mode element. */ 5407 5408 bss = wpa_bss_get_bssid_latest(wpa_s, bssid); 5409 if (!bss) 5410 return 0; 5411 5412 owe = wpa_bss_get_vendor_ie(bss, OWE_IE_VENDOR_TYPE); 5413 if (!owe) 5414 return 0; 5415 5416 pos = owe + 6; 5417 end = owe + 2 + owe[1]; 5418 5419 if (end - pos < ETH_ALEN + 1) 5420 return 0; 5421 pos += ETH_ALEN; 5422 ssid_len = *pos++; 5423 if (end - pos < ssid_len || ssid_len > SSID_MAX_LEN) 5424 return 0; 5425 5426 return entry_ssid_len == ssid_len && 5427 os_memcmp(pos, entry_ssid, ssid_len) == 0; 5428 } 5429 #endif /* CONFIG_OWE */ 5430 5431 5432 /** 5433 * wpa_supplicant_get_ssid - Get a pointer to the current network structure 5434 * @wpa_s: Pointer to wpa_supplicant data 5435 * Returns: A pointer to the current network structure or %NULL on failure 5436 */ 5437 struct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s) 5438 { 5439 struct wpa_ssid *entry; 5440 u8 ssid[SSID_MAX_LEN]; 5441 int res; 5442 size_t ssid_len; 5443 u8 bssid[ETH_ALEN]; 5444 int wired; 5445 5446 res = wpa_drv_get_ssid(wpa_s, ssid); 5447 if (res < 0) { 5448 wpa_msg(wpa_s, MSG_WARNING, "Could not read SSID from " 5449 "driver"); 5450 return NULL; 5451 } 5452 ssid_len = res; 5453 5454 if (wpa_drv_get_bssid(wpa_s, bssid) < 0) { 5455 wpa_msg(wpa_s, MSG_WARNING, "Could not read BSSID from " 5456 "driver"); 5457 return NULL; 5458 } 5459 5460 wired = wpa_s->conf->ap_scan == 0 && 5461 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED); 5462 5463 entry = wpa_s->conf->ssid; 5464 while (entry) { 5465 if (!wpas_network_disabled(wpa_s, entry) && 5466 ((ssid_len == entry->ssid_len && 5467 (!entry->ssid || 5468 os_memcmp(ssid, entry->ssid, ssid_len) == 0)) || 5469 wired) && 5470 (!entry->bssid_set || 5471 ether_addr_equal(bssid, entry->bssid))) 5472 return entry; 5473 #ifdef CONFIG_WPS 5474 if (!wpas_network_disabled(wpa_s, entry) && 5475 (entry->key_mgmt & WPA_KEY_MGMT_WPS) && 5476 (entry->ssid == NULL || entry->ssid_len == 0) && 5477 (!entry->bssid_set || 5478 ether_addr_equal(bssid, entry->bssid))) 5479 return entry; 5480 #endif /* CONFIG_WPS */ 5481 5482 #ifdef CONFIG_OWE 5483 if (!wpas_network_disabled(wpa_s, entry) && 5484 (entry->ssid && 5485 owe_trans_ssid_match(wpa_s, bssid, entry->ssid, 5486 entry->ssid_len)) && 5487 (!entry->bssid_set || 5488 ether_addr_equal(bssid, entry->bssid))) 5489 return entry; 5490 #endif /* CONFIG_OWE */ 5491 5492 if (!wpas_network_disabled(wpa_s, entry) && entry->bssid_set && 5493 entry->ssid_len == 0 && 5494 ether_addr_equal(bssid, entry->bssid)) 5495 return entry; 5496 5497 entry = entry->next; 5498 } 5499 5500 return NULL; 5501 } 5502 5503 5504 static int select_driver(struct wpa_supplicant *wpa_s, int i) 5505 { 5506 struct wpa_global *global = wpa_s->global; 5507 5508 if (wpa_drivers[i]->global_init && global->drv_priv[i] == NULL) { 5509 global->drv_priv[i] = wpa_drivers[i]->global_init(global); 5510 if (global->drv_priv[i] == NULL) { 5511 wpa_printf(MSG_ERROR, "Failed to initialize driver " 5512 "'%s'", wpa_drivers[i]->name); 5513 return -1; 5514 } 5515 } 5516 5517 wpa_s->driver = wpa_drivers[i]; 5518 wpa_s->global_drv_priv = global->drv_priv[i]; 5519 5520 return 0; 5521 } 5522 5523 5524 static int wpa_supplicant_set_driver(struct wpa_supplicant *wpa_s, 5525 const char *name) 5526 { 5527 int i; 5528 size_t len; 5529 const char *pos, *driver = name; 5530 5531 if (wpa_s == NULL) 5532 return -1; 5533 5534 if (wpa_drivers[0] == NULL) { 5535 wpa_msg(wpa_s, MSG_ERROR, "No driver interfaces build into " 5536 "wpa_supplicant"); 5537 return -1; 5538 } 5539 5540 if (name == NULL) { 5541 /* Default to first successful driver in the list */ 5542 for (i = 0; wpa_drivers[i]; i++) { 5543 if (select_driver(wpa_s, i) == 0) 5544 return 0; 5545 } 5546 /* Drivers have each reported failure, so no wpa_msg() here. */ 5547 return -1; 5548 } 5549 5550 do { 5551 pos = os_strchr(driver, ','); 5552 if (pos) 5553 len = pos - driver; 5554 else 5555 len = os_strlen(driver); 5556 5557 for (i = 0; wpa_drivers[i]; i++) { 5558 if (os_strlen(wpa_drivers[i]->name) == len && 5559 os_strncmp(driver, wpa_drivers[i]->name, len) == 5560 0) { 5561 /* First driver that succeeds wins */ 5562 if (select_driver(wpa_s, i) == 0) 5563 return 0; 5564 } 5565 } 5566 5567 driver = pos + 1; 5568 } while (pos); 5569 5570 wpa_msg(wpa_s, MSG_ERROR, "Unsupported driver '%s'", name); 5571 return -1; 5572 } 5573 5574 5575 /** 5576 * wpa_supplicant_rx_eapol - Deliver a received EAPOL frame to wpa_supplicant 5577 * @ctx: Context pointer (wpa_s); this is the ctx variable registered 5578 * with struct wpa_driver_ops::init() 5579 * @src_addr: Source address of the EAPOL frame 5580 * @buf: EAPOL data starting from the EAPOL header (i.e., no Ethernet header) 5581 * @len: Length of the EAPOL data 5582 * @encrypted: Whether the frame was encrypted 5583 * 5584 * This function is called for each received EAPOL frame. Most driver 5585 * interfaces rely on more generic OS mechanism for receiving frames through 5586 * l2_packet, but if such a mechanism is not available, the driver wrapper may 5587 * take care of received EAPOL frames and deliver them to the core supplicant 5588 * code by calling this function. 5589 */ 5590 void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr, 5591 const u8 *buf, size_t len, 5592 enum frame_encryption encrypted) 5593 { 5594 struct wpa_supplicant *wpa_s = ctx; 5595 const u8 *connected_addr = wpa_s->valid_links ? 5596 wpa_s->ap_mld_addr : wpa_s->bssid; 5597 5598 wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR " (encrypted=%d)", 5599 MAC2STR(src_addr), encrypted); 5600 wpa_hexdump(MSG_MSGDUMP, "RX EAPOL", buf, len); 5601 5602 if (wpa_s->own_disconnect_req) { 5603 wpa_printf(MSG_DEBUG, 5604 "Drop received EAPOL frame as we are disconnecting"); 5605 return; 5606 } 5607 5608 #ifdef CONFIG_TESTING_OPTIONS 5609 wpa_msg_ctrl(wpa_s, MSG_INFO, "EAPOL-RX " MACSTR " %zu", 5610 MAC2STR(src_addr), len); 5611 if (wpa_s->ignore_auth_resp) { 5612 wpa_printf(MSG_INFO, "RX EAPOL - ignore_auth_resp active!"); 5613 return; 5614 } 5615 #endif /* CONFIG_TESTING_OPTIONS */ 5616 5617 if (wpa_s->wpa_state < WPA_ASSOCIATED || 5618 (wpa_s->last_eapol_matches_bssid && 5619 #ifdef CONFIG_AP 5620 !wpa_s->ap_iface && 5621 #endif /* CONFIG_AP */ 5622 !ether_addr_equal(src_addr, connected_addr))) { 5623 /* 5624 * There is possible race condition between receiving the 5625 * association event and the EAPOL frame since they are coming 5626 * through different paths from the driver. In order to avoid 5627 * issues in trying to process the EAPOL frame before receiving 5628 * association information, lets queue it for processing until 5629 * the association event is received. This may also be needed in 5630 * driver-based roaming case, so also use src_addr != BSSID as a 5631 * trigger if we have previously confirmed that the 5632 * Authenticator uses BSSID as the src_addr (which is not the 5633 * case with wired IEEE 802.1X). 5634 */ 5635 wpa_dbg(wpa_s, MSG_DEBUG, 5636 "Not associated - Delay processing of received EAPOL frame (state=%s connected_addr=" 5637 MACSTR ")", 5638 wpa_supplicant_state_txt(wpa_s->wpa_state), 5639 MAC2STR(connected_addr)); 5640 wpabuf_free(wpa_s->pending_eapol_rx); 5641 wpa_s->pending_eapol_rx = wpabuf_alloc_copy(buf, len); 5642 if (wpa_s->pending_eapol_rx) { 5643 os_get_reltime(&wpa_s->pending_eapol_rx_time); 5644 os_memcpy(wpa_s->pending_eapol_rx_src, src_addr, 5645 ETH_ALEN); 5646 wpa_s->pending_eapol_encrypted = encrypted; 5647 } 5648 return; 5649 } 5650 5651 wpa_s->last_eapol_matches_bssid = 5652 ether_addr_equal(src_addr, connected_addr); 5653 5654 #ifdef CONFIG_AP 5655 if (wpa_s->ap_iface) { 5656 wpa_supplicant_ap_rx_eapol(wpa_s, src_addr, buf, len, 5657 encrypted); 5658 return; 5659 } 5660 #endif /* CONFIG_AP */ 5661 5662 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE) { 5663 wpa_dbg(wpa_s, MSG_DEBUG, "Ignored received EAPOL frame since " 5664 "no key management is configured"); 5665 return; 5666 } 5667 5668 if (wpa_s->eapol_received == 0 && 5669 (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_PSK) || 5670 !wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) || 5671 wpa_s->wpa_state != WPA_COMPLETED) && 5672 (wpa_s->current_ssid == NULL || 5673 wpa_s->current_ssid->mode != WPAS_MODE_IBSS)) { 5674 /* Timeout for completing IEEE 802.1X and WPA authentication */ 5675 int timeout = 10; 5676 5677 if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) || 5678 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA || 5679 wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) { 5680 /* Use longer timeout for IEEE 802.1X/EAP */ 5681 timeout = 70; 5682 } 5683 5684 #ifdef CONFIG_WPS 5685 if (wpa_s->current_ssid && wpa_s->current_bss && 5686 (wpa_s->current_ssid->key_mgmt & WPA_KEY_MGMT_WPS) && 5687 eap_is_wps_pin_enrollee(&wpa_s->current_ssid->eap)) { 5688 /* 5689 * Use shorter timeout if going through WPS AP iteration 5690 * for PIN config method with an AP that does not 5691 * advertise Selected Registrar. 5692 */ 5693 struct wpabuf *wps_ie; 5694 5695 wps_ie = wpa_bss_get_vendor_ie_multi( 5696 wpa_s->current_bss, WPS_IE_VENDOR_TYPE); 5697 if (wps_ie && 5698 !wps_is_addr_authorized(wps_ie, wpa_s->own_addr, 1)) 5699 timeout = 10; 5700 wpabuf_free(wps_ie); 5701 } 5702 #endif /* CONFIG_WPS */ 5703 5704 wpa_supplicant_req_auth_timeout(wpa_s, timeout, 0); 5705 } 5706 wpa_s->eapol_received++; 5707 5708 if (wpa_s->countermeasures) { 5709 wpa_msg(wpa_s, MSG_INFO, "WPA: Countermeasures - dropped " 5710 "EAPOL packet"); 5711 return; 5712 } 5713 5714 #ifdef CONFIG_IBSS_RSN 5715 if (wpa_s->current_ssid && 5716 wpa_s->current_ssid->mode == WPAS_MODE_IBSS) { 5717 ibss_rsn_rx_eapol(wpa_s->ibss_rsn, src_addr, buf, len, 5718 encrypted); 5719 return; 5720 } 5721 #endif /* CONFIG_IBSS_RSN */ 5722 5723 /* Source address of the incoming EAPOL frame could be compared to the 5724 * current BSSID. However, it is possible that a centralized 5725 * Authenticator could be using another MAC address than the BSSID of 5726 * an AP, so just allow any address to be used for now. The replies are 5727 * still sent to the current BSSID (if available), though. */ 5728 5729 os_memcpy(wpa_s->last_eapol_src, src_addr, ETH_ALEN); 5730 if (!wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) && 5731 wpa_s->key_mgmt != WPA_KEY_MGMT_OWE && 5732 wpa_s->key_mgmt != WPA_KEY_MGMT_DPP && 5733 eapol_sm_rx_eapol(wpa_s->eapol, src_addr, buf, len, 5734 encrypted) > 0) 5735 return; 5736 wpa_drv_poll(wpa_s); 5737 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_PSK)) 5738 wpa_sm_rx_eapol(wpa_s->wpa, src_addr, buf, len, encrypted); 5739 else if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt)) { 5740 /* 5741 * Set portValid = true here since we are going to skip 4-way 5742 * handshake processing which would normally set portValid. We 5743 * need this to allow the EAPOL state machines to be completed 5744 * without going through EAPOL-Key handshake. 5745 */ 5746 eapol_sm_notify_portValid(wpa_s->eapol, true); 5747 } 5748 } 5749 5750 5751 static void wpa_supplicant_rx_eapol_cb(void *ctx, const u8 *src_addr, 5752 const u8 *buf, size_t len) 5753 { 5754 wpa_supplicant_rx_eapol(ctx, src_addr, buf, len, 5755 FRAME_ENCRYPTION_UNKNOWN); 5756 } 5757 5758 5759 static int wpas_eapol_needs_l2_packet(struct wpa_supplicant *wpa_s) 5760 { 5761 return !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_CONTROL_PORT) || 5762 !(wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_CONTROL_PORT_RX); 5763 } 5764 5765 5766 int wpa_supplicant_update_mac_addr(struct wpa_supplicant *wpa_s) 5767 { 5768 u8 prev_mac_addr[ETH_ALEN]; 5769 5770 os_memcpy(prev_mac_addr, wpa_s->own_addr, ETH_ALEN); 5771 5772 if ((!wpa_s->p2p_mgmt || 5773 !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)) && 5774 !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE)) { 5775 l2_packet_deinit(wpa_s->l2); 5776 wpa_s->l2 = l2_packet_init(wpa_s->ifname, 5777 wpa_drv_get_mac_addr(wpa_s), 5778 ETH_P_EAPOL, 5779 wpas_eapol_needs_l2_packet(wpa_s) ? 5780 wpa_supplicant_rx_eapol_cb : NULL, 5781 wpa_s, 0); 5782 if (wpa_s->l2 == NULL) 5783 return -1; 5784 5785 if (l2_packet_set_packet_filter(wpa_s->l2, 5786 L2_PACKET_FILTER_PKTTYPE)) 5787 wpa_dbg(wpa_s, MSG_DEBUG, 5788 "Failed to attach pkt_type filter"); 5789 5790 if (l2_packet_get_own_addr(wpa_s->l2, wpa_s->own_addr)) { 5791 wpa_msg(wpa_s, MSG_ERROR, 5792 "Failed to get own L2 address"); 5793 return -1; 5794 } 5795 } else { 5796 const u8 *addr = wpa_drv_get_mac_addr(wpa_s); 5797 if (addr) 5798 os_memcpy(wpa_s->own_addr, addr, ETH_ALEN); 5799 } 5800 5801 wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr); 5802 wpas_wps_update_mac_addr(wpa_s); 5803 5804 #ifdef CONFIG_FST 5805 if (wpa_s->fst) 5806 fst_update_mac_addr(wpa_s->fst, wpa_s->own_addr); 5807 #endif /* CONFIG_FST */ 5808 5809 if (!ether_addr_equal(prev_mac_addr, wpa_s->own_addr)) 5810 wpas_notify_mac_address_changed(wpa_s); 5811 5812 return 0; 5813 } 5814 5815 5816 static void wpa_supplicant_rx_eapol_bridge(void *ctx, const u8 *src_addr, 5817 const u8 *buf, size_t len) 5818 { 5819 struct wpa_supplicant *wpa_s = ctx; 5820 const struct l2_ethhdr *eth; 5821 5822 if (len < sizeof(*eth)) 5823 return; 5824 eth = (const struct l2_ethhdr *) buf; 5825 5826 if (!ether_addr_equal(eth->h_dest, wpa_s->own_addr) && 5827 !(eth->h_dest[0] & 0x01)) { 5828 wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR " to " MACSTR 5829 " (bridge - not for this interface - ignore)", 5830 MAC2STR(src_addr), MAC2STR(eth->h_dest)); 5831 return; 5832 } 5833 5834 wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR " to " MACSTR 5835 " (bridge)", MAC2STR(src_addr), MAC2STR(eth->h_dest)); 5836 wpa_supplicant_rx_eapol(wpa_s, src_addr, buf + sizeof(*eth), 5837 len - sizeof(*eth), FRAME_ENCRYPTION_UNKNOWN); 5838 } 5839 5840 5841 int wpa_supplicant_update_bridge_ifname(struct wpa_supplicant *wpa_s, 5842 const char *bridge_ifname) 5843 { 5844 if (wpa_s->wpa_state > WPA_SCANNING) 5845 return -EBUSY; 5846 5847 if (bridge_ifname && 5848 os_strlen(bridge_ifname) >= sizeof(wpa_s->bridge_ifname)) 5849 return -EINVAL; 5850 5851 if (!bridge_ifname) 5852 bridge_ifname = ""; 5853 5854 if (os_strcmp(wpa_s->bridge_ifname, bridge_ifname) == 0) 5855 return 0; 5856 5857 if (wpa_s->l2_br) { 5858 l2_packet_deinit(wpa_s->l2_br); 5859 wpa_s->l2_br = NULL; 5860 } 5861 5862 os_strlcpy(wpa_s->bridge_ifname, bridge_ifname, 5863 sizeof(wpa_s->bridge_ifname)); 5864 5865 if (wpa_s->bridge_ifname[0]) { 5866 wpa_dbg(wpa_s, MSG_DEBUG, 5867 "Receiving packets from bridge interface '%s'", 5868 wpa_s->bridge_ifname); 5869 wpa_s->l2_br = l2_packet_init_bridge( 5870 wpa_s->bridge_ifname, wpa_s->ifname, wpa_s->own_addr, 5871 ETH_P_EAPOL, wpa_supplicant_rx_eapol_bridge, wpa_s, 1); 5872 if (!wpa_s->l2_br) { 5873 wpa_msg(wpa_s, MSG_ERROR, 5874 "Failed to open l2_packet connection for the bridge interface '%s'", 5875 wpa_s->bridge_ifname); 5876 goto fail; 5877 } 5878 } 5879 5880 #ifdef CONFIG_TDLS 5881 if (!wpa_s->p2p_mgmt && wpa_tdls_init(wpa_s->wpa)) 5882 goto fail; 5883 #endif /* CONFIG_TDLS */ 5884 5885 return 0; 5886 fail: 5887 wpa_s->bridge_ifname[0] = 0; 5888 if (wpa_s->l2_br) { 5889 l2_packet_deinit(wpa_s->l2_br); 5890 wpa_s->l2_br = NULL; 5891 } 5892 #ifdef CONFIG_TDLS 5893 if (!wpa_s->p2p_mgmt) 5894 wpa_tdls_init(wpa_s->wpa); 5895 #endif /* CONFIG_TDLS */ 5896 return -EIO; 5897 } 5898 5899 5900 /** 5901 * wpa_supplicant_driver_init - Initialize driver interface parameters 5902 * @wpa_s: Pointer to wpa_supplicant data 5903 * Returns: 0 on success, -1 on failure 5904 * 5905 * This function is called to initialize driver interface parameters. 5906 * wpa_drv_init() must have been called before this function to initialize the 5907 * driver interface. 5908 */ 5909 int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s) 5910 { 5911 static int interface_count = 0; 5912 5913 if (wpa_supplicant_update_mac_addr(wpa_s) < 0) 5914 return -1; 5915 5916 wpa_dbg(wpa_s, MSG_DEBUG, "Own MAC address: " MACSTR, 5917 MAC2STR(wpa_s->own_addr)); 5918 os_memcpy(wpa_s->perm_addr, wpa_s->own_addr, ETH_ALEN); 5919 wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr); 5920 5921 if (wpa_s->bridge_ifname[0] && wpas_eapol_needs_l2_packet(wpa_s)) { 5922 wpa_dbg(wpa_s, MSG_DEBUG, "Receiving packets from bridge " 5923 "interface '%s'", wpa_s->bridge_ifname); 5924 wpa_s->l2_br = l2_packet_init_bridge( 5925 wpa_s->bridge_ifname, wpa_s->ifname, wpa_s->own_addr, 5926 ETH_P_EAPOL, wpa_supplicant_rx_eapol_bridge, wpa_s, 1); 5927 if (wpa_s->l2_br == NULL) { 5928 wpa_msg(wpa_s, MSG_ERROR, "Failed to open l2_packet " 5929 "connection for the bridge interface '%s'", 5930 wpa_s->bridge_ifname); 5931 return -1; 5932 } 5933 } 5934 5935 if (wpa_s->conf->ap_scan == 2 && 5936 os_strcmp(wpa_s->driver->name, "nl80211") == 0) { 5937 wpa_printf(MSG_INFO, 5938 "Note: nl80211 driver interface is not designed to be used with ap_scan=2; this can result in connection failures"); 5939 } 5940 5941 wpa_clear_keys(wpa_s, NULL); 5942 5943 /* Make sure that TKIP countermeasures are not left enabled (could 5944 * happen if wpa_supplicant is killed during countermeasures. */ 5945 wpa_drv_set_countermeasures(wpa_s, 0); 5946 5947 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: flushing PMKID list in the driver"); 5948 wpa_drv_flush_pmkid(wpa_s); 5949 5950 wpa_s->prev_scan_ssid = WILDCARD_SSID_SCAN; 5951 wpa_s->prev_scan_wildcard = 0; 5952 5953 if (wpa_supplicant_enabled_networks(wpa_s)) { 5954 if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) { 5955 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED); 5956 interface_count = 0; 5957 } 5958 #ifndef ANDROID 5959 if (!wpa_s->p2p_mgmt && 5960 wpa_supplicant_delayed_sched_scan(wpa_s, 5961 interface_count % 3, 5962 100000)) 5963 wpa_supplicant_req_scan(wpa_s, interface_count % 3, 5964 100000); 5965 #endif /* ANDROID */ 5966 interface_count++; 5967 } else 5968 wpa_supplicant_set_state(wpa_s, WPA_INACTIVE); 5969 5970 return 0; 5971 } 5972 5973 5974 static int wpa_supplicant_daemon(const char *pid_file) 5975 { 5976 wpa_printf(MSG_DEBUG, "Daemonize.."); 5977 return os_daemonize(pid_file); 5978 } 5979 5980 5981 static struct wpa_supplicant * 5982 wpa_supplicant_alloc(struct wpa_supplicant *parent) 5983 { 5984 struct wpa_supplicant *wpa_s; 5985 5986 wpa_s = os_zalloc(sizeof(*wpa_s)); 5987 if (wpa_s == NULL) 5988 return NULL; 5989 wpa_s->scan_req = INITIAL_SCAN_REQ; 5990 wpa_s->scan_interval = 5; 5991 wpa_s->new_connection = 1; 5992 wpa_s->parent = parent ? parent : wpa_s; 5993 wpa_s->p2pdev = wpa_s->parent; 5994 wpa_s->sched_scanning = 0; 5995 wpa_s->setband_mask = WPA_SETBAND_AUTO; 5996 5997 dl_list_init(&wpa_s->bss_tmp_disallowed); 5998 dl_list_init(&wpa_s->fils_hlp_req); 5999 #ifdef CONFIG_TESTING_OPTIONS 6000 dl_list_init(&wpa_s->drv_signal_override); 6001 wpa_s->test_assoc_comeback_type = -1; 6002 #endif /* CONFIG_TESTING_OPTIONS */ 6003 #ifndef CONFIG_NO_ROBUST_AV 6004 dl_list_init(&wpa_s->active_scs_ids); 6005 #endif /* CONFIG_NO_ROBUST_AV */ 6006 wpa_s->ml_probe_mld_id = -1; 6007 6008 return wpa_s; 6009 } 6010 6011 6012 #ifdef CONFIG_HT_OVERRIDES 6013 6014 static int wpa_set_htcap_mcs(struct wpa_supplicant *wpa_s, 6015 struct ieee80211_ht_capabilities *htcaps, 6016 struct ieee80211_ht_capabilities *htcaps_mask, 6017 const char *ht_mcs) 6018 { 6019 /* parse ht_mcs into hex array */ 6020 int i; 6021 const char *tmp = ht_mcs; 6022 char *end = NULL; 6023 6024 /* If ht_mcs is null, do not set anything */ 6025 if (!ht_mcs) 6026 return 0; 6027 6028 /* This is what we are setting in the kernel */ 6029 os_memset(&htcaps->supported_mcs_set, 0, IEEE80211_HT_MCS_MASK_LEN); 6030 6031 wpa_msg(wpa_s, MSG_DEBUG, "set_htcap, ht_mcs -:%s:-", ht_mcs); 6032 6033 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) { 6034 long v; 6035 6036 errno = 0; 6037 v = strtol(tmp, &end, 16); 6038 6039 if (errno == 0) { 6040 wpa_msg(wpa_s, MSG_DEBUG, 6041 "htcap value[%i]: %ld end: %p tmp: %p", 6042 i, v, end, tmp); 6043 if (end == tmp) 6044 break; 6045 6046 htcaps->supported_mcs_set[i] = v; 6047 tmp = end; 6048 } else { 6049 wpa_msg(wpa_s, MSG_ERROR, 6050 "Failed to parse ht-mcs: %s, error: %s\n", 6051 ht_mcs, strerror(errno)); 6052 return -1; 6053 } 6054 } 6055 6056 /* 6057 * If we were able to parse any values, then set mask for the MCS set. 6058 */ 6059 if (i) { 6060 os_memset(&htcaps_mask->supported_mcs_set, 0xff, 6061 IEEE80211_HT_MCS_MASK_LEN - 1); 6062 /* skip the 3 reserved bits */ 6063 htcaps_mask->supported_mcs_set[IEEE80211_HT_MCS_MASK_LEN - 1] = 6064 0x1f; 6065 } 6066 6067 return 0; 6068 } 6069 6070 6071 static int wpa_disable_max_amsdu(struct wpa_supplicant *wpa_s, 6072 struct ieee80211_ht_capabilities *htcaps, 6073 struct ieee80211_ht_capabilities *htcaps_mask, 6074 int disabled) 6075 { 6076 le16 msk; 6077 6078 if (disabled == -1) 6079 return 0; 6080 6081 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_max_amsdu: %d", disabled); 6082 6083 msk = host_to_le16(HT_CAP_INFO_MAX_AMSDU_SIZE); 6084 htcaps_mask->ht_capabilities_info |= msk; 6085 if (disabled) 6086 htcaps->ht_capabilities_info &= msk; 6087 else 6088 htcaps->ht_capabilities_info |= msk; 6089 6090 return 0; 6091 } 6092 6093 6094 static int wpa_set_ampdu_factor(struct wpa_supplicant *wpa_s, 6095 struct ieee80211_ht_capabilities *htcaps, 6096 struct ieee80211_ht_capabilities *htcaps_mask, 6097 int factor) 6098 { 6099 if (factor == -1) 6100 return 0; 6101 6102 wpa_msg(wpa_s, MSG_DEBUG, "set_ampdu_factor: %d", factor); 6103 6104 if (factor < 0 || factor > 3) { 6105 wpa_msg(wpa_s, MSG_ERROR, "ampdu_factor: %d out of range. " 6106 "Must be 0-3 or -1", factor); 6107 return -EINVAL; 6108 } 6109 6110 htcaps_mask->a_mpdu_params |= 0x3; /* 2 bits for factor */ 6111 htcaps->a_mpdu_params &= ~0x3; 6112 htcaps->a_mpdu_params |= factor & 0x3; 6113 6114 return 0; 6115 } 6116 6117 6118 static int wpa_set_ampdu_density(struct wpa_supplicant *wpa_s, 6119 struct ieee80211_ht_capabilities *htcaps, 6120 struct ieee80211_ht_capabilities *htcaps_mask, 6121 int density) 6122 { 6123 if (density == -1) 6124 return 0; 6125 6126 wpa_msg(wpa_s, MSG_DEBUG, "set_ampdu_density: %d", density); 6127 6128 if (density < 0 || density > 7) { 6129 wpa_msg(wpa_s, MSG_ERROR, 6130 "ampdu_density: %d out of range. Must be 0-7 or -1.", 6131 density); 6132 return -EINVAL; 6133 } 6134 6135 htcaps_mask->a_mpdu_params |= 0x1C; 6136 htcaps->a_mpdu_params &= ~(0x1C); 6137 htcaps->a_mpdu_params |= (density << 2) & 0x1C; 6138 6139 return 0; 6140 } 6141 6142 6143 static int wpa_set_disable_ht40(struct wpa_supplicant *wpa_s, 6144 struct ieee80211_ht_capabilities *htcaps, 6145 struct ieee80211_ht_capabilities *htcaps_mask, 6146 int disabled) 6147 { 6148 if (disabled) 6149 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_ht40: %d", disabled); 6150 6151 set_disable_ht40(htcaps, disabled); 6152 set_disable_ht40(htcaps_mask, 0); 6153 6154 return 0; 6155 } 6156 6157 6158 static int wpa_set_disable_sgi(struct wpa_supplicant *wpa_s, 6159 struct ieee80211_ht_capabilities *htcaps, 6160 struct ieee80211_ht_capabilities *htcaps_mask, 6161 int disabled) 6162 { 6163 /* Masking these out disables SGI */ 6164 le16 msk = host_to_le16(HT_CAP_INFO_SHORT_GI20MHZ | 6165 HT_CAP_INFO_SHORT_GI40MHZ); 6166 6167 if (disabled) 6168 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_sgi: %d", disabled); 6169 6170 if (disabled) 6171 htcaps->ht_capabilities_info &= ~msk; 6172 else 6173 htcaps->ht_capabilities_info |= msk; 6174 6175 htcaps_mask->ht_capabilities_info |= msk; 6176 6177 return 0; 6178 } 6179 6180 6181 static int wpa_set_disable_ldpc(struct wpa_supplicant *wpa_s, 6182 struct ieee80211_ht_capabilities *htcaps, 6183 struct ieee80211_ht_capabilities *htcaps_mask, 6184 int disabled) 6185 { 6186 /* Masking these out disables LDPC */ 6187 le16 msk = host_to_le16(HT_CAP_INFO_LDPC_CODING_CAP); 6188 6189 if (disabled) 6190 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_ldpc: %d", disabled); 6191 6192 if (disabled) 6193 htcaps->ht_capabilities_info &= ~msk; 6194 else 6195 htcaps->ht_capabilities_info |= msk; 6196 6197 htcaps_mask->ht_capabilities_info |= msk; 6198 6199 return 0; 6200 } 6201 6202 6203 static int wpa_set_tx_stbc(struct wpa_supplicant *wpa_s, 6204 struct ieee80211_ht_capabilities *htcaps, 6205 struct ieee80211_ht_capabilities *htcaps_mask, 6206 int tx_stbc) 6207 { 6208 le16 msk = host_to_le16(HT_CAP_INFO_TX_STBC); 6209 6210 if (tx_stbc == -1) 6211 return 0; 6212 6213 wpa_msg(wpa_s, MSG_DEBUG, "set_tx_stbc: %d", tx_stbc); 6214 6215 if (tx_stbc < 0 || tx_stbc > 1) { 6216 wpa_msg(wpa_s, MSG_ERROR, 6217 "tx_stbc: %d out of range. Must be 0-1 or -1", tx_stbc); 6218 return -EINVAL; 6219 } 6220 6221 htcaps_mask->ht_capabilities_info |= msk; 6222 htcaps->ht_capabilities_info &= ~msk; 6223 htcaps->ht_capabilities_info |= (tx_stbc << 7) & msk; 6224 6225 return 0; 6226 } 6227 6228 6229 static int wpa_set_rx_stbc(struct wpa_supplicant *wpa_s, 6230 struct ieee80211_ht_capabilities *htcaps, 6231 struct ieee80211_ht_capabilities *htcaps_mask, 6232 int rx_stbc) 6233 { 6234 le16 msk = host_to_le16(HT_CAP_INFO_RX_STBC_MASK); 6235 6236 if (rx_stbc == -1) 6237 return 0; 6238 6239 wpa_msg(wpa_s, MSG_DEBUG, "set_rx_stbc: %d", rx_stbc); 6240 6241 if (rx_stbc < 0 || rx_stbc > 3) { 6242 wpa_msg(wpa_s, MSG_ERROR, 6243 "rx_stbc: %d out of range. Must be 0-3 or -1", rx_stbc); 6244 return -EINVAL; 6245 } 6246 6247 htcaps_mask->ht_capabilities_info |= msk; 6248 htcaps->ht_capabilities_info &= ~msk; 6249 htcaps->ht_capabilities_info |= (rx_stbc << 8) & msk; 6250 6251 return 0; 6252 } 6253 6254 6255 void wpa_supplicant_apply_ht_overrides( 6256 struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid, 6257 struct wpa_driver_associate_params *params) 6258 { 6259 struct ieee80211_ht_capabilities *htcaps; 6260 struct ieee80211_ht_capabilities *htcaps_mask; 6261 6262 if (!ssid) 6263 return; 6264 6265 params->disable_ht = ssid->disable_ht; 6266 if (!params->htcaps || !params->htcaps_mask) 6267 return; 6268 6269 htcaps = (struct ieee80211_ht_capabilities *) params->htcaps; 6270 htcaps_mask = (struct ieee80211_ht_capabilities *) params->htcaps_mask; 6271 wpa_set_htcap_mcs(wpa_s, htcaps, htcaps_mask, ssid->ht_mcs); 6272 wpa_disable_max_amsdu(wpa_s, htcaps, htcaps_mask, 6273 ssid->disable_max_amsdu); 6274 wpa_set_ampdu_factor(wpa_s, htcaps, htcaps_mask, ssid->ampdu_factor); 6275 wpa_set_ampdu_density(wpa_s, htcaps, htcaps_mask, ssid->ampdu_density); 6276 wpa_set_disable_ht40(wpa_s, htcaps, htcaps_mask, ssid->disable_ht40); 6277 wpa_set_disable_sgi(wpa_s, htcaps, htcaps_mask, ssid->disable_sgi); 6278 wpa_set_disable_ldpc(wpa_s, htcaps, htcaps_mask, ssid->disable_ldpc); 6279 wpa_set_rx_stbc(wpa_s, htcaps, htcaps_mask, ssid->rx_stbc); 6280 wpa_set_tx_stbc(wpa_s, htcaps, htcaps_mask, ssid->tx_stbc); 6281 6282 if (ssid->ht40_intolerant) { 6283 le16 bit = host_to_le16(HT_CAP_INFO_40MHZ_INTOLERANT); 6284 htcaps->ht_capabilities_info |= bit; 6285 htcaps_mask->ht_capabilities_info |= bit; 6286 } 6287 } 6288 6289 #endif /* CONFIG_HT_OVERRIDES */ 6290 6291 6292 #ifdef CONFIG_VHT_OVERRIDES 6293 void wpa_supplicant_apply_vht_overrides( 6294 struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid, 6295 struct wpa_driver_associate_params *params) 6296 { 6297 struct ieee80211_vht_capabilities *vhtcaps; 6298 struct ieee80211_vht_capabilities *vhtcaps_mask; 6299 6300 if (!ssid) 6301 return; 6302 6303 params->disable_vht = ssid->disable_vht; 6304 6305 vhtcaps = (void *) params->vhtcaps; 6306 vhtcaps_mask = (void *) params->vhtcaps_mask; 6307 6308 if (!vhtcaps || !vhtcaps_mask) 6309 return; 6310 6311 vhtcaps->vht_capabilities_info = host_to_le32(ssid->vht_capa); 6312 vhtcaps_mask->vht_capabilities_info = host_to_le32(ssid->vht_capa_mask); 6313 6314 #ifdef CONFIG_HT_OVERRIDES 6315 if (ssid->disable_sgi) { 6316 vhtcaps_mask->vht_capabilities_info |= (VHT_CAP_SHORT_GI_80 | 6317 VHT_CAP_SHORT_GI_160); 6318 vhtcaps->vht_capabilities_info &= ~(VHT_CAP_SHORT_GI_80 | 6319 VHT_CAP_SHORT_GI_160); 6320 wpa_msg(wpa_s, MSG_DEBUG, 6321 "disable-sgi override specified, vht-caps: 0x%x", 6322 vhtcaps->vht_capabilities_info); 6323 } 6324 6325 /* if max ampdu is <= 3, we have to make the HT cap the same */ 6326 if (ssid->vht_capa_mask & VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX) { 6327 int max_ampdu; 6328 6329 max_ampdu = (ssid->vht_capa & 6330 VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX) >> 6331 VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX_SHIFT; 6332 6333 max_ampdu = max_ampdu < 3 ? max_ampdu : 3; 6334 wpa_set_ampdu_factor(wpa_s, 6335 (void *) params->htcaps, 6336 (void *) params->htcaps_mask, 6337 max_ampdu); 6338 } 6339 #endif /* CONFIG_HT_OVERRIDES */ 6340 6341 #define OVERRIDE_MCS(i) \ 6342 if (ssid->vht_tx_mcs_nss_ ##i >= 0) { \ 6343 vhtcaps_mask->vht_supported_mcs_set.tx_map |= \ 6344 host_to_le16(3 << 2 * (i - 1)); \ 6345 vhtcaps->vht_supported_mcs_set.tx_map |= \ 6346 host_to_le16(ssid->vht_tx_mcs_nss_ ##i << \ 6347 2 * (i - 1)); \ 6348 } \ 6349 if (ssid->vht_rx_mcs_nss_ ##i >= 0) { \ 6350 vhtcaps_mask->vht_supported_mcs_set.rx_map |= \ 6351 host_to_le16(3 << 2 * (i - 1)); \ 6352 vhtcaps->vht_supported_mcs_set.rx_map |= \ 6353 host_to_le16(ssid->vht_rx_mcs_nss_ ##i << \ 6354 2 * (i - 1)); \ 6355 } 6356 6357 OVERRIDE_MCS(1); 6358 OVERRIDE_MCS(2); 6359 OVERRIDE_MCS(3); 6360 OVERRIDE_MCS(4); 6361 OVERRIDE_MCS(5); 6362 OVERRIDE_MCS(6); 6363 OVERRIDE_MCS(7); 6364 OVERRIDE_MCS(8); 6365 } 6366 #endif /* CONFIG_VHT_OVERRIDES */ 6367 6368 6369 #ifdef CONFIG_HE_OVERRIDES 6370 void wpa_supplicant_apply_he_overrides( 6371 struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid, 6372 struct wpa_driver_associate_params *params) 6373 { 6374 if (!ssid) 6375 return; 6376 6377 params->disable_he = ssid->disable_he; 6378 } 6379 #endif /* CONFIG_HE_OVERRIDES */ 6380 6381 6382 void wpa_supplicant_apply_eht_overrides( 6383 struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid, 6384 struct wpa_driver_associate_params *params) 6385 { 6386 if (!ssid) 6387 return; 6388 6389 params->disable_eht = ssid->disable_eht; 6390 } 6391 6392 6393 static int pcsc_reader_init(struct wpa_supplicant *wpa_s) 6394 { 6395 #ifdef PCSC_FUNCS 6396 size_t len; 6397 6398 if (!wpa_s->conf->pcsc_reader) 6399 return 0; 6400 6401 wpa_s->scard = scard_init(wpa_s->conf->pcsc_reader); 6402 if (!wpa_s->scard) 6403 return 1; 6404 6405 if (wpa_s->conf->pcsc_pin && 6406 scard_set_pin(wpa_s->scard, wpa_s->conf->pcsc_pin) < 0) { 6407 scard_deinit(wpa_s->scard); 6408 wpa_s->scard = NULL; 6409 wpa_msg(wpa_s, MSG_ERROR, "PC/SC PIN validation failed"); 6410 return -1; 6411 } 6412 6413 len = sizeof(wpa_s->imsi) - 1; 6414 if (scard_get_imsi(wpa_s->scard, wpa_s->imsi, &len)) { 6415 scard_deinit(wpa_s->scard); 6416 wpa_s->scard = NULL; 6417 wpa_msg(wpa_s, MSG_ERROR, "Could not read IMSI"); 6418 return -1; 6419 } 6420 wpa_s->imsi[len] = '\0'; 6421 6422 wpa_s->mnc_len = scard_get_mnc_len(wpa_s->scard); 6423 6424 wpa_printf(MSG_DEBUG, "SCARD: IMSI %s (MNC length %d)", 6425 wpa_s->imsi, wpa_s->mnc_len); 6426 6427 wpa_sm_set_scard_ctx(wpa_s->wpa, wpa_s->scard); 6428 eapol_sm_register_scard_ctx(wpa_s->eapol, wpa_s->scard); 6429 #endif /* PCSC_FUNCS */ 6430 6431 return 0; 6432 } 6433 6434 6435 int wpas_init_ext_pw(struct wpa_supplicant *wpa_s) 6436 { 6437 char *val, *pos; 6438 6439 ext_password_deinit(wpa_s->ext_pw); 6440 wpa_s->ext_pw = NULL; 6441 eapol_sm_set_ext_pw_ctx(wpa_s->eapol, NULL); 6442 6443 if (!wpa_s->conf->ext_password_backend) 6444 return 0; 6445 6446 val = os_strdup(wpa_s->conf->ext_password_backend); 6447 if (val == NULL) 6448 return -1; 6449 pos = os_strchr(val, ':'); 6450 if (pos) 6451 *pos++ = '\0'; 6452 6453 wpa_printf(MSG_DEBUG, "EXT PW: Initialize backend '%s'", val); 6454 6455 wpa_s->ext_pw = ext_password_init(val, pos); 6456 os_free(val); 6457 if (wpa_s->ext_pw == NULL) { 6458 wpa_printf(MSG_DEBUG, "EXT PW: Failed to initialize backend"); 6459 return -1; 6460 } 6461 eapol_sm_set_ext_pw_ctx(wpa_s->eapol, wpa_s->ext_pw); 6462 6463 return 0; 6464 } 6465 6466 6467 #ifdef CONFIG_FST 6468 6469 static const u8 * wpas_fst_get_bssid_cb(void *ctx) 6470 { 6471 struct wpa_supplicant *wpa_s = ctx; 6472 6473 return (is_zero_ether_addr(wpa_s->bssid) || 6474 wpa_s->wpa_state != WPA_COMPLETED) ? NULL : wpa_s->bssid; 6475 } 6476 6477 6478 static void wpas_fst_get_channel_info_cb(void *ctx, 6479 enum hostapd_hw_mode *hw_mode, 6480 u8 *channel) 6481 { 6482 struct wpa_supplicant *wpa_s = ctx; 6483 6484 if (wpa_s->current_bss) { 6485 *hw_mode = ieee80211_freq_to_chan(wpa_s->current_bss->freq, 6486 channel); 6487 } else if (wpa_s->hw.num_modes) { 6488 *hw_mode = wpa_s->hw.modes[0].mode; 6489 } else { 6490 WPA_ASSERT(0); 6491 *hw_mode = 0; 6492 } 6493 } 6494 6495 6496 static int wpas_fst_get_hw_modes(void *ctx, struct hostapd_hw_modes **modes) 6497 { 6498 struct wpa_supplicant *wpa_s = ctx; 6499 6500 *modes = wpa_s->hw.modes; 6501 return wpa_s->hw.num_modes; 6502 } 6503 6504 6505 static void wpas_fst_set_ies_cb(void *ctx, const struct wpabuf *fst_ies) 6506 { 6507 struct wpa_supplicant *wpa_s = ctx; 6508 6509 wpa_hexdump_buf(MSG_DEBUG, "FST: Set IEs", fst_ies); 6510 wpa_s->fst_ies = fst_ies; 6511 } 6512 6513 6514 static int wpas_fst_send_action_cb(void *ctx, const u8 *da, struct wpabuf *data) 6515 { 6516 struct wpa_supplicant *wpa_s = ctx; 6517 6518 if (!ether_addr_equal(wpa_s->bssid, da)) { 6519 wpa_printf(MSG_INFO, "FST:%s:bssid=" MACSTR " != da=" MACSTR, 6520 __func__, MAC2STR(wpa_s->bssid), MAC2STR(da)); 6521 return -1; 6522 } 6523 return wpa_drv_send_action(wpa_s, wpa_s->assoc_freq, 0, wpa_s->bssid, 6524 wpa_s->own_addr, wpa_s->bssid, 6525 wpabuf_head(data), wpabuf_len(data), 6526 0); 6527 } 6528 6529 6530 static const struct wpabuf * wpas_fst_get_mb_ie_cb(void *ctx, const u8 *addr) 6531 { 6532 struct wpa_supplicant *wpa_s = ctx; 6533 6534 WPA_ASSERT(ether_addr_equal(wpa_s->bssid, addr)); 6535 return wpa_s->received_mb_ies; 6536 } 6537 6538 6539 static void wpas_fst_update_mb_ie_cb(void *ctx, const u8 *addr, 6540 const u8 *buf, size_t size) 6541 { 6542 struct wpa_supplicant *wpa_s = ctx; 6543 struct mb_ies_info info; 6544 6545 WPA_ASSERT(ether_addr_equal(wpa_s->bssid, addr)); 6546 6547 if (!mb_ies_info_by_ies(&info, buf, size)) { 6548 wpabuf_free(wpa_s->received_mb_ies); 6549 wpa_s->received_mb_ies = mb_ies_by_info(&info); 6550 } 6551 } 6552 6553 6554 static const u8 * wpas_fst_get_peer_first(void *ctx, 6555 struct fst_get_peer_ctx **get_ctx, 6556 bool mb_only) 6557 { 6558 struct wpa_supplicant *wpa_s = ctx; 6559 6560 *get_ctx = NULL; 6561 if (!is_zero_ether_addr(wpa_s->bssid)) 6562 return (wpa_s->received_mb_ies || !mb_only) ? 6563 wpa_s->bssid : NULL; 6564 return NULL; 6565 } 6566 6567 6568 static const u8 * wpas_fst_get_peer_next(void *ctx, 6569 struct fst_get_peer_ctx **get_ctx, 6570 bool mb_only) 6571 { 6572 return NULL; 6573 } 6574 6575 void fst_wpa_supplicant_fill_iface_obj(struct wpa_supplicant *wpa_s, 6576 struct fst_wpa_obj *iface_obj) 6577 { 6578 os_memset(iface_obj, 0, sizeof(*iface_obj)); 6579 iface_obj->ctx = wpa_s; 6580 iface_obj->get_bssid = wpas_fst_get_bssid_cb; 6581 iface_obj->get_channel_info = wpas_fst_get_channel_info_cb; 6582 iface_obj->get_hw_modes = wpas_fst_get_hw_modes; 6583 iface_obj->set_ies = wpas_fst_set_ies_cb; 6584 iface_obj->send_action = wpas_fst_send_action_cb; 6585 iface_obj->get_mb_ie = wpas_fst_get_mb_ie_cb; 6586 iface_obj->update_mb_ie = wpas_fst_update_mb_ie_cb; 6587 iface_obj->get_peer_first = wpas_fst_get_peer_first; 6588 iface_obj->get_peer_next = wpas_fst_get_peer_next; 6589 } 6590 #endif /* CONFIG_FST */ 6591 6592 static int wpas_set_wowlan_triggers(struct wpa_supplicant *wpa_s, 6593 const struct wpa_driver_capa *capa) 6594 { 6595 struct wowlan_triggers *triggers; 6596 int ret = 0; 6597 6598 if (!wpa_s->conf->wowlan_triggers) 6599 return 0; 6600 6601 triggers = wpa_get_wowlan_triggers(wpa_s->conf->wowlan_triggers, capa); 6602 if (triggers) { 6603 ret = wpa_drv_wowlan(wpa_s, triggers); 6604 os_free(triggers); 6605 } 6606 return ret; 6607 } 6608 6609 6610 enum wpa_radio_work_band wpas_freq_to_band(int freq) 6611 { 6612 if (freq < 3000) 6613 return BAND_2_4_GHZ; 6614 if (freq > 50000) 6615 return BAND_60_GHZ; 6616 return BAND_5_GHZ; 6617 } 6618 6619 6620 unsigned int wpas_get_bands(struct wpa_supplicant *wpa_s, const int *freqs) 6621 { 6622 int i; 6623 unsigned int band = 0; 6624 6625 if (freqs) { 6626 /* freqs are specified for the radio work */ 6627 for (i = 0; freqs[i]; i++) 6628 band |= wpas_freq_to_band(freqs[i]); 6629 } else { 6630 /* 6631 * freqs are not specified, implies all 6632 * the supported freqs by HW 6633 */ 6634 for (i = 0; i < wpa_s->hw.num_modes; i++) { 6635 if (wpa_s->hw.modes[i].num_channels != 0) { 6636 if (wpa_s->hw.modes[i].mode == 6637 HOSTAPD_MODE_IEEE80211B || 6638 wpa_s->hw.modes[i].mode == 6639 HOSTAPD_MODE_IEEE80211G) 6640 band |= BAND_2_4_GHZ; 6641 else if (wpa_s->hw.modes[i].mode == 6642 HOSTAPD_MODE_IEEE80211A) 6643 band |= BAND_5_GHZ; 6644 else if (wpa_s->hw.modes[i].mode == 6645 HOSTAPD_MODE_IEEE80211AD) 6646 band |= BAND_60_GHZ; 6647 else if (wpa_s->hw.modes[i].mode == 6648 HOSTAPD_MODE_IEEE80211ANY) 6649 band = BAND_2_4_GHZ | BAND_5_GHZ | 6650 BAND_60_GHZ; 6651 } 6652 } 6653 } 6654 6655 return band; 6656 } 6657 6658 6659 static struct wpa_radio * radio_add_interface(struct wpa_supplicant *wpa_s, 6660 const char *rn) 6661 { 6662 struct wpa_supplicant *iface = wpa_s->global->ifaces; 6663 struct wpa_radio *radio; 6664 6665 while (rn && iface) { 6666 radio = iface->radio; 6667 if (radio && os_strcmp(rn, radio->name) == 0) { 6668 wpa_printf(MSG_DEBUG, "Add interface %s to existing radio %s", 6669 wpa_s->ifname, rn); 6670 dl_list_add(&radio->ifaces, &wpa_s->radio_list); 6671 return radio; 6672 } 6673 6674 iface = iface->next; 6675 } 6676 6677 wpa_printf(MSG_DEBUG, "Add interface %s to a new radio %s", 6678 wpa_s->ifname, rn ? rn : "N/A"); 6679 radio = os_zalloc(sizeof(*radio)); 6680 if (radio == NULL) 6681 return NULL; 6682 6683 if (rn) 6684 os_strlcpy(radio->name, rn, sizeof(radio->name)); 6685 dl_list_init(&radio->ifaces); 6686 dl_list_init(&radio->work); 6687 dl_list_add(&radio->ifaces, &wpa_s->radio_list); 6688 6689 return radio; 6690 } 6691 6692 6693 static void radio_work_free(struct wpa_radio_work *work) 6694 { 6695 if (work->wpa_s->scan_work == work) { 6696 /* This should not really happen. */ 6697 wpa_dbg(work->wpa_s, MSG_INFO, "Freeing radio work '%s'@%p (started=%d) that is marked as scan_work", 6698 work->type, work, work->started); 6699 work->wpa_s->scan_work = NULL; 6700 } 6701 6702 #ifdef CONFIG_P2P 6703 if (work->wpa_s->p2p_scan_work == work) { 6704 /* This should not really happen. */ 6705 wpa_dbg(work->wpa_s, MSG_INFO, "Freeing radio work '%s'@%p (started=%d) that is marked as p2p_scan_work", 6706 work->type, work, work->started); 6707 work->wpa_s->p2p_scan_work = NULL; 6708 } 6709 #endif /* CONFIG_P2P */ 6710 6711 if (work->started) { 6712 work->wpa_s->radio->num_active_works--; 6713 wpa_dbg(work->wpa_s, MSG_DEBUG, 6714 "radio_work_free('%s'@%p): num_active_works --> %u", 6715 work->type, work, 6716 work->wpa_s->radio->num_active_works); 6717 } 6718 6719 dl_list_del(&work->list); 6720 os_free(work); 6721 } 6722 6723 6724 static int radio_work_is_connect(struct wpa_radio_work *work) 6725 { 6726 return os_strcmp(work->type, "sme-connect") == 0 || 6727 os_strcmp(work->type, "connect") == 0; 6728 } 6729 6730 6731 static int radio_work_is_scan(struct wpa_radio_work *work) 6732 { 6733 return os_strcmp(work->type, "scan") == 0 || 6734 os_strcmp(work->type, "p2p-scan") == 0; 6735 } 6736 6737 6738 static struct wpa_radio_work * radio_work_get_next_work(struct wpa_radio *radio) 6739 { 6740 struct wpa_radio_work *active_work = NULL; 6741 struct wpa_radio_work *tmp; 6742 6743 /* Get the active work to know the type and band. */ 6744 dl_list_for_each(tmp, &radio->work, struct wpa_radio_work, list) { 6745 if (tmp->started) { 6746 active_work = tmp; 6747 break; 6748 } 6749 } 6750 6751 if (!active_work) { 6752 /* No active work, start one */ 6753 radio->num_active_works = 0; 6754 dl_list_for_each(tmp, &radio->work, struct wpa_radio_work, 6755 list) { 6756 if (os_strcmp(tmp->type, "scan") == 0 && 6757 external_scan_running(radio) && 6758 (((struct wpa_driver_scan_params *) 6759 tmp->ctx)->only_new_results || 6760 tmp->wpa_s->clear_driver_scan_cache)) 6761 continue; 6762 return tmp; 6763 } 6764 return NULL; 6765 } 6766 6767 if (radio_work_is_connect(active_work)) { 6768 /* 6769 * If the active work is either connect or sme-connect, 6770 * do not parallelize them with other radio works. 6771 */ 6772 wpa_dbg(active_work->wpa_s, MSG_DEBUG, 6773 "Do not parallelize radio work with %s", 6774 active_work->type); 6775 return NULL; 6776 } 6777 6778 dl_list_for_each(tmp, &radio->work, struct wpa_radio_work, list) { 6779 if (tmp->started) 6780 continue; 6781 6782 /* 6783 * If connect or sme-connect are enqueued, parallelize only 6784 * those operations ahead of them in the queue. 6785 */ 6786 if (radio_work_is_connect(tmp)) 6787 break; 6788 6789 /* Serialize parallel scan and p2p_scan operations on the same 6790 * interface since the driver_nl80211 mechanism for tracking 6791 * scan cookies does not yet have support for this. */ 6792 if (active_work->wpa_s == tmp->wpa_s && 6793 radio_work_is_scan(active_work) && 6794 radio_work_is_scan(tmp)) { 6795 wpa_dbg(active_work->wpa_s, MSG_DEBUG, 6796 "Do not start work '%s' when another work '%s' is already scheduled", 6797 tmp->type, active_work->type); 6798 continue; 6799 } 6800 /* 6801 * Check that the radio works are distinct and 6802 * on different bands. 6803 */ 6804 if (os_strcmp(active_work->type, tmp->type) != 0 && 6805 (active_work->bands != tmp->bands)) { 6806 /* 6807 * If a scan has to be scheduled through nl80211 scan 6808 * interface and if an external scan is already running, 6809 * do not schedule the scan since it is likely to get 6810 * rejected by kernel. 6811 */ 6812 if (os_strcmp(tmp->type, "scan") == 0 && 6813 external_scan_running(radio) && 6814 (((struct wpa_driver_scan_params *) 6815 tmp->ctx)->only_new_results || 6816 tmp->wpa_s->clear_driver_scan_cache)) 6817 continue; 6818 6819 wpa_dbg(active_work->wpa_s, MSG_DEBUG, 6820 "active_work:%s new_work:%s", 6821 active_work->type, tmp->type); 6822 return tmp; 6823 } 6824 } 6825 6826 /* Did not find a radio work to schedule in parallel. */ 6827 return NULL; 6828 } 6829 6830 6831 static void radio_start_next_work(void *eloop_ctx, void *timeout_ctx) 6832 { 6833 struct wpa_radio *radio = eloop_ctx; 6834 struct wpa_radio_work *work; 6835 struct os_reltime now, diff; 6836 struct wpa_supplicant *wpa_s; 6837 6838 work = dl_list_first(&radio->work, struct wpa_radio_work, list); 6839 if (work == NULL) { 6840 radio->num_active_works = 0; 6841 return; 6842 } 6843 6844 wpa_s = dl_list_first(&radio->ifaces, struct wpa_supplicant, 6845 radio_list); 6846 6847 if (!(wpa_s && 6848 wpa_s->drv_flags & WPA_DRIVER_FLAGS_OFFCHANNEL_SIMULTANEOUS)) { 6849 if (work->started) 6850 return; /* already started and still in progress */ 6851 6852 if (wpa_s && external_scan_running(wpa_s->radio)) { 6853 wpa_printf(MSG_DEBUG, "Delay radio work start until externally triggered scan completes"); 6854 return; 6855 } 6856 } else { 6857 work = NULL; 6858 if (radio->num_active_works < MAX_ACTIVE_WORKS) { 6859 /* get the work to schedule next */ 6860 work = radio_work_get_next_work(radio); 6861 } 6862 if (!work) 6863 return; 6864 } 6865 6866 wpa_s = work->wpa_s; 6867 os_get_reltime(&now); 6868 os_reltime_sub(&now, &work->time, &diff); 6869 wpa_dbg(wpa_s, MSG_DEBUG, 6870 "Starting radio work '%s'@%p after %ld.%06ld second wait", 6871 work->type, work, diff.sec, diff.usec); 6872 work->started = 1; 6873 work->time = now; 6874 radio->num_active_works++; 6875 6876 work->cb(work, 0); 6877 6878 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_OFFCHANNEL_SIMULTANEOUS) && 6879 radio->num_active_works < MAX_ACTIVE_WORKS) 6880 radio_work_check_next(wpa_s); 6881 } 6882 6883 6884 /* 6885 * This function removes both started and pending radio works running on 6886 * the provided interface's radio. 6887 * Prior to the removal of the radio work, its callback (cb) is called with 6888 * deinit set to be 1. Each work's callback is responsible for clearing its 6889 * internal data and restoring to a correct state. 6890 * @wpa_s: wpa_supplicant data 6891 * @type: type of works to be removed 6892 * @remove_all: 1 to remove all the works on this radio, 0 to remove only 6893 * this interface's works. 6894 */ 6895 void radio_remove_works(struct wpa_supplicant *wpa_s, 6896 const char *type, int remove_all) 6897 { 6898 struct wpa_radio_work *work, *tmp; 6899 struct wpa_radio *radio = wpa_s->radio; 6900 6901 dl_list_for_each_safe(work, tmp, &radio->work, struct wpa_radio_work, 6902 list) { 6903 if (type && os_strcmp(type, work->type) != 0) 6904 continue; 6905 6906 /* skip other ifaces' works */ 6907 if (!remove_all && work->wpa_s != wpa_s) 6908 continue; 6909 6910 wpa_dbg(wpa_s, MSG_DEBUG, "Remove radio work '%s'@%p%s", 6911 work->type, work, work->started ? " (started)" : ""); 6912 work->cb(work, 1); 6913 radio_work_free(work); 6914 } 6915 6916 /* in case we removed the started work */ 6917 radio_work_check_next(wpa_s); 6918 } 6919 6920 6921 void radio_remove_pending_work(struct wpa_supplicant *wpa_s, void *ctx) 6922 { 6923 struct wpa_radio_work *work; 6924 struct wpa_radio *radio = wpa_s->radio; 6925 6926 dl_list_for_each(work, &radio->work, struct wpa_radio_work, list) { 6927 if (work->ctx != ctx) 6928 continue; 6929 wpa_dbg(wpa_s, MSG_DEBUG, "Free pending radio work '%s'@%p%s", 6930 work->type, work, work->started ? " (started)" : ""); 6931 radio_work_free(work); 6932 break; 6933 } 6934 } 6935 6936 6937 static void radio_remove_interface(struct wpa_supplicant *wpa_s) 6938 { 6939 struct wpa_radio *radio = wpa_s->radio; 6940 6941 if (!radio) 6942 return; 6943 6944 wpa_printf(MSG_DEBUG, "Remove interface %s from radio %s", 6945 wpa_s->ifname, radio->name); 6946 dl_list_del(&wpa_s->radio_list); 6947 radio_remove_works(wpa_s, NULL, 0); 6948 /* If the interface that triggered the external scan was removed, the 6949 * external scan is no longer running. */ 6950 if (wpa_s == radio->external_scan_req_interface) 6951 radio->external_scan_req_interface = NULL; 6952 wpa_s->radio = NULL; 6953 if (!dl_list_empty(&radio->ifaces)) 6954 return; /* Interfaces remain for this radio */ 6955 6956 wpa_printf(MSG_DEBUG, "Remove radio %s", radio->name); 6957 eloop_cancel_timeout(radio_start_next_work, radio, NULL); 6958 os_free(radio); 6959 } 6960 6961 6962 void radio_work_check_next(struct wpa_supplicant *wpa_s) 6963 { 6964 struct wpa_radio *radio = wpa_s->radio; 6965 6966 if (dl_list_empty(&radio->work)) 6967 return; 6968 if (wpa_s->ext_work_in_progress) { 6969 wpa_printf(MSG_DEBUG, 6970 "External radio work in progress - delay start of pending item"); 6971 return; 6972 } 6973 eloop_cancel_timeout(radio_start_next_work, radio, NULL); 6974 eloop_register_timeout(0, 0, radio_start_next_work, radio, NULL); 6975 } 6976 6977 6978 /** 6979 * radio_add_work - Add a radio work item 6980 * @wpa_s: Pointer to wpa_supplicant data 6981 * @freq: Frequency of the offchannel operation in MHz or 0 6982 * @type: Unique identifier for each type of work 6983 * @next: Force as the next work to be executed 6984 * @cb: Callback function for indicating when radio is available 6985 * @ctx: Context pointer for the work (work->ctx in cb()) 6986 * Returns: 0 on success, -1 on failure 6987 * 6988 * This function is used to request time for an operation that requires 6989 * exclusive radio control. Once the radio is available, the registered callback 6990 * function will be called. radio_work_done() must be called once the exclusive 6991 * radio operation has been completed, so that the radio is freed for other 6992 * operations. The special case of deinit=1 is used to free the context data 6993 * during interface removal. That does not allow the callback function to start 6994 * the radio operation, i.e., it must free any resources allocated for the radio 6995 * work and return. 6996 * 6997 * The @freq parameter can be used to indicate a single channel on which the 6998 * offchannel operation will occur. This may allow multiple radio work 6999 * operations to be performed in parallel if they apply for the same channel. 7000 * Setting this to 0 indicates that the work item may use multiple channels or 7001 * requires exclusive control of the radio. 7002 */ 7003 int radio_add_work(struct wpa_supplicant *wpa_s, unsigned int freq, 7004 const char *type, int next, 7005 void (*cb)(struct wpa_radio_work *work, int deinit), 7006 void *ctx) 7007 { 7008 struct wpa_radio *radio = wpa_s->radio; 7009 struct wpa_radio_work *work; 7010 int was_empty; 7011 7012 work = os_zalloc(sizeof(*work)); 7013 if (work == NULL) 7014 return -1; 7015 wpa_dbg(wpa_s, MSG_DEBUG, "Add radio work '%s'@%p", type, work); 7016 os_get_reltime(&work->time); 7017 work->freq = freq; 7018 work->type = type; 7019 work->wpa_s = wpa_s; 7020 work->cb = cb; 7021 work->ctx = ctx; 7022 7023 if (freq) 7024 work->bands = wpas_freq_to_band(freq); 7025 else if (os_strcmp(type, "scan") == 0 || 7026 os_strcmp(type, "p2p-scan") == 0) 7027 work->bands = wpas_get_bands(wpa_s, 7028 ((struct wpa_driver_scan_params *) 7029 ctx)->freqs); 7030 else 7031 work->bands = wpas_get_bands(wpa_s, NULL); 7032 7033 was_empty = dl_list_empty(&wpa_s->radio->work); 7034 if (next) 7035 dl_list_add(&wpa_s->radio->work, &work->list); 7036 else 7037 dl_list_add_tail(&wpa_s->radio->work, &work->list); 7038 if (was_empty) { 7039 wpa_dbg(wpa_s, MSG_DEBUG, "First radio work item in the queue - schedule start immediately"); 7040 radio_work_check_next(wpa_s); 7041 } else if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_OFFCHANNEL_SIMULTANEOUS) 7042 && radio->num_active_works < MAX_ACTIVE_WORKS) { 7043 wpa_dbg(wpa_s, MSG_DEBUG, 7044 "Try to schedule a radio work (num_active_works=%u)", 7045 radio->num_active_works); 7046 radio_work_check_next(wpa_s); 7047 } 7048 7049 return 0; 7050 } 7051 7052 7053 /** 7054 * radio_work_done - Indicate that a radio work item has been completed 7055 * @work: Completed work 7056 * 7057 * This function is called once the callback function registered with 7058 * radio_add_work() has completed its work. 7059 */ 7060 void radio_work_done(struct wpa_radio_work *work) 7061 { 7062 struct wpa_supplicant *wpa_s = work->wpa_s; 7063 struct os_reltime now, diff; 7064 unsigned int started = work->started; 7065 7066 os_get_reltime(&now); 7067 os_reltime_sub(&now, &work->time, &diff); 7068 wpa_dbg(wpa_s, MSG_DEBUG, "Radio work '%s'@%p %s in %ld.%06ld seconds", 7069 work->type, work, started ? "done" : "canceled", 7070 diff.sec, diff.usec); 7071 radio_work_free(work); 7072 if (started) 7073 radio_work_check_next(wpa_s); 7074 } 7075 7076 7077 struct wpa_radio_work * 7078 radio_work_pending(struct wpa_supplicant *wpa_s, const char *type) 7079 { 7080 struct wpa_radio_work *work; 7081 struct wpa_radio *radio = wpa_s->radio; 7082 7083 dl_list_for_each(work, &radio->work, struct wpa_radio_work, list) { 7084 if (work->wpa_s == wpa_s && os_strcmp(work->type, type) == 0) 7085 return work; 7086 } 7087 7088 return NULL; 7089 } 7090 7091 7092 static int wpas_init_driver(struct wpa_supplicant *wpa_s, 7093 const struct wpa_interface *iface) 7094 { 7095 const char *ifname, *driver, *rn; 7096 7097 driver = iface->driver; 7098 next_driver: 7099 if (wpa_supplicant_set_driver(wpa_s, driver) < 0) 7100 return -1; 7101 7102 wpa_s->drv_priv = wpa_drv_init(wpa_s, wpa_s->ifname); 7103 if (wpa_s->drv_priv == NULL) { 7104 const char *pos; 7105 int level = MSG_ERROR; 7106 7107 pos = driver ? os_strchr(driver, ',') : NULL; 7108 if (pos) { 7109 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize " 7110 "driver interface - try next driver wrapper"); 7111 driver = pos + 1; 7112 goto next_driver; 7113 } 7114 7115 #ifdef CONFIG_MATCH_IFACE 7116 if (wpa_s->matched == WPA_IFACE_MATCHED_NULL) 7117 level = MSG_DEBUG; 7118 #endif /* CONFIG_MATCH_IFACE */ 7119 wpa_msg(wpa_s, level, "Failed to initialize driver interface"); 7120 return -1; 7121 } 7122 if (wpa_drv_set_param(wpa_s, wpa_s->conf->driver_param) < 0) { 7123 wpa_msg(wpa_s, MSG_ERROR, "Driver interface rejected " 7124 "driver_param '%s'", wpa_s->conf->driver_param); 7125 return -1; 7126 } 7127 7128 ifname = wpa_drv_get_ifname(wpa_s); 7129 if (ifname && os_strcmp(ifname, wpa_s->ifname) != 0) { 7130 wpa_dbg(wpa_s, MSG_DEBUG, "Driver interface replaced " 7131 "interface name with '%s'", ifname); 7132 os_strlcpy(wpa_s->ifname, ifname, sizeof(wpa_s->ifname)); 7133 } 7134 7135 rn = wpa_driver_get_radio_name(wpa_s); 7136 if (rn && rn[0] == '\0') 7137 rn = NULL; 7138 7139 wpa_s->radio = radio_add_interface(wpa_s, rn); 7140 if (wpa_s->radio == NULL) 7141 return -1; 7142 7143 return 0; 7144 } 7145 7146 7147 #ifdef CONFIG_GAS_SERVER 7148 7149 static void wpas_gas_server_tx_status(struct wpa_supplicant *wpa_s, 7150 unsigned int freq, const u8 *dst, 7151 const u8 *src, const u8 *bssid, 7152 const u8 *data, size_t data_len, 7153 enum offchannel_send_action_result result) 7154 { 7155 wpa_printf(MSG_DEBUG, "GAS: TX status: freq=%u dst=" MACSTR 7156 " result=%s", 7157 freq, MAC2STR(dst), 7158 result == OFFCHANNEL_SEND_ACTION_SUCCESS ? "SUCCESS" : 7159 (result == OFFCHANNEL_SEND_ACTION_NO_ACK ? "no-ACK" : 7160 "FAILED")); 7161 gas_server_tx_status(wpa_s->gas_server, dst, data, data_len, 7162 result == OFFCHANNEL_SEND_ACTION_SUCCESS); 7163 } 7164 7165 7166 static void wpas_gas_server_tx(void *ctx, int freq, const u8 *da, 7167 struct wpabuf *buf, unsigned int wait_time) 7168 { 7169 struct wpa_supplicant *wpa_s = ctx; 7170 const u8 broadcast[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; 7171 7172 if (wait_time > wpa_s->max_remain_on_chan) 7173 wait_time = wpa_s->max_remain_on_chan; 7174 7175 offchannel_send_action(wpa_s, freq, da, wpa_s->own_addr, broadcast, 7176 wpabuf_head(buf), wpabuf_len(buf), 7177 wait_time, wpas_gas_server_tx_status, 0); 7178 } 7179 7180 #endif /* CONFIG_GAS_SERVER */ 7181 7182 static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s, 7183 const struct wpa_interface *iface) 7184 { 7185 struct wpa_driver_capa capa; 7186 int capa_res; 7187 u8 dfs_domain; 7188 7189 wpa_printf(MSG_DEBUG, "Initializing interface '%s' conf '%s' driver " 7190 "'%s' ctrl_interface '%s' bridge '%s'", iface->ifname, 7191 iface->confname ? iface->confname : "N/A", 7192 iface->driver ? iface->driver : "default", 7193 iface->ctrl_interface ? iface->ctrl_interface : "N/A", 7194 iface->bridge_ifname ? iface->bridge_ifname : "N/A"); 7195 7196 if (iface->confname) { 7197 #ifdef CONFIG_BACKEND_FILE 7198 wpa_s->confname = os_rel2abs_path(iface->confname); 7199 if (wpa_s->confname == NULL) { 7200 wpa_printf(MSG_ERROR, "Failed to get absolute path " 7201 "for configuration file '%s'.", 7202 iface->confname); 7203 return -1; 7204 } 7205 wpa_printf(MSG_DEBUG, "Configuration file '%s' -> '%s'", 7206 iface->confname, wpa_s->confname); 7207 #else /* CONFIG_BACKEND_FILE */ 7208 wpa_s->confname = os_strdup(iface->confname); 7209 #endif /* CONFIG_BACKEND_FILE */ 7210 wpa_s->conf = wpa_config_read(wpa_s->confname, NULL, false); 7211 if (wpa_s->conf == NULL) { 7212 wpa_printf(MSG_ERROR, "Failed to read or parse " 7213 "configuration '%s'.", wpa_s->confname); 7214 return -1; 7215 } 7216 wpa_s->confanother = os_rel2abs_path(iface->confanother); 7217 if (wpa_s->confanother && 7218 !wpa_config_read(wpa_s->confanother, wpa_s->conf, true)) { 7219 wpa_printf(MSG_ERROR, 7220 "Failed to read or parse configuration '%s'.", 7221 wpa_s->confanother); 7222 return -1; 7223 } 7224 7225 /* 7226 * Override ctrl_interface and driver_param if set on command 7227 * line. 7228 */ 7229 if (iface->ctrl_interface) { 7230 os_free(wpa_s->conf->ctrl_interface); 7231 wpa_s->conf->ctrl_interface = 7232 os_strdup(iface->ctrl_interface); 7233 if (!wpa_s->conf->ctrl_interface) { 7234 wpa_printf(MSG_ERROR, 7235 "Failed to duplicate control interface '%s'.", 7236 iface->ctrl_interface); 7237 return -1; 7238 } 7239 } 7240 7241 if (iface->driver_param) { 7242 os_free(wpa_s->conf->driver_param); 7243 wpa_s->conf->driver_param = 7244 os_strdup(iface->driver_param); 7245 if (!wpa_s->conf->driver_param) { 7246 wpa_printf(MSG_ERROR, 7247 "Failed to duplicate driver param '%s'.", 7248 iface->driver_param); 7249 return -1; 7250 } 7251 } 7252 7253 if (iface->p2p_mgmt && !iface->ctrl_interface) { 7254 os_free(wpa_s->conf->ctrl_interface); 7255 wpa_s->conf->ctrl_interface = NULL; 7256 } 7257 } else 7258 wpa_s->conf = wpa_config_alloc_empty(iface->ctrl_interface, 7259 iface->driver_param); 7260 7261 if (wpa_s->conf == NULL) { 7262 wpa_printf(MSG_ERROR, "\nNo configuration found."); 7263 return -1; 7264 } 7265 7266 if (iface->ifname == NULL) { 7267 wpa_printf(MSG_ERROR, "\nInterface name is required."); 7268 return -1; 7269 } 7270 if (os_strlen(iface->ifname) >= sizeof(wpa_s->ifname)) { 7271 wpa_printf(MSG_ERROR, "\nToo long interface name '%s'.", 7272 iface->ifname); 7273 return -1; 7274 } 7275 os_strlcpy(wpa_s->ifname, iface->ifname, sizeof(wpa_s->ifname)); 7276 #ifdef CONFIG_MATCH_IFACE 7277 wpa_s->matched = iface->matched; 7278 #endif /* CONFIG_MATCH_IFACE */ 7279 7280 if (iface->bridge_ifname) { 7281 if (os_strlen(iface->bridge_ifname) >= 7282 sizeof(wpa_s->bridge_ifname)) { 7283 wpa_printf(MSG_ERROR, "\nToo long bridge interface " 7284 "name '%s'.", iface->bridge_ifname); 7285 return -1; 7286 } 7287 os_strlcpy(wpa_s->bridge_ifname, iface->bridge_ifname, 7288 sizeof(wpa_s->bridge_ifname)); 7289 } 7290 7291 /* RSNA Supplicant Key Management - INITIALIZE */ 7292 eapol_sm_notify_portEnabled(wpa_s->eapol, false); 7293 eapol_sm_notify_portValid(wpa_s->eapol, false); 7294 7295 /* Initialize driver interface and register driver event handler before 7296 * L2 receive handler so that association events are processed before 7297 * EAPOL-Key packets if both become available for the same select() 7298 * call. */ 7299 if (wpas_init_driver(wpa_s, iface) < 0) 7300 return -1; 7301 7302 if (wpa_supplicant_init_wpa(wpa_s) < 0) 7303 return -1; 7304 7305 wpa_sm_set_ifname(wpa_s->wpa, wpa_s->ifname, 7306 wpa_s->bridge_ifname[0] ? wpa_s->bridge_ifname : 7307 NULL); 7308 wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth); 7309 7310 if (wpa_s->conf->dot11RSNAConfigPMKLifetime && 7311 wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_LIFETIME, 7312 wpa_s->conf->dot11RSNAConfigPMKLifetime)) { 7313 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for " 7314 "dot11RSNAConfigPMKLifetime"); 7315 return -1; 7316 } 7317 7318 if (wpa_s->conf->dot11RSNAConfigPMKReauthThreshold && 7319 wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_REAUTH_THRESHOLD, 7320 wpa_s->conf->dot11RSNAConfigPMKReauthThreshold)) { 7321 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for " 7322 "dot11RSNAConfigPMKReauthThreshold"); 7323 return -1; 7324 } 7325 7326 if (wpa_s->conf->dot11RSNAConfigSATimeout && 7327 wpa_sm_set_param(wpa_s->wpa, RSNA_SA_TIMEOUT, 7328 wpa_s->conf->dot11RSNAConfigSATimeout)) { 7329 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for " 7330 "dot11RSNAConfigSATimeout"); 7331 return -1; 7332 } 7333 7334 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_FT_PREPEND_PMKID, 7335 wpa_s->conf->ft_prepend_pmkid); 7336 7337 wpa_s->hw.modes = wpa_drv_get_hw_feature_data(wpa_s, 7338 &wpa_s->hw.num_modes, 7339 &wpa_s->hw.flags, 7340 &dfs_domain); 7341 if (wpa_s->hw.modes) { 7342 u16 i; 7343 7344 for (i = 0; i < wpa_s->hw.num_modes; i++) { 7345 if (wpa_s->hw.modes[i].vht_capab) { 7346 wpa_s->hw_capab = CAPAB_VHT; 7347 break; 7348 } 7349 7350 if (wpa_s->hw.modes[i].ht_capab & 7351 HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET) 7352 wpa_s->hw_capab = CAPAB_HT40; 7353 else if (wpa_s->hw.modes[i].ht_capab && 7354 wpa_s->hw_capab == CAPAB_NO_HT_VHT) 7355 wpa_s->hw_capab = CAPAB_HT; 7356 } 7357 wpa_s->support_6ghz = wpas_is_6ghz_supported(wpa_s, false); 7358 } 7359 7360 capa_res = wpa_drv_get_capa(wpa_s, &capa); 7361 if (capa_res == 0) { 7362 wpa_s->drv_capa_known = 1; 7363 wpa_s->drv_flags = capa.flags; 7364 wpa_s->drv_flags2 = capa.flags2; 7365 wpa_s->drv_enc = capa.enc; 7366 wpa_s->drv_rrm_flags = capa.rrm_flags; 7367 wpa_s->drv_max_acl_mac_addrs = capa.max_acl_mac_addrs; 7368 wpa_s->probe_resp_offloads = capa.probe_resp_offloads; 7369 wpa_s->max_scan_ssids = capa.max_scan_ssids; 7370 wpa_s->max_sched_scan_ssids = capa.max_sched_scan_ssids; 7371 wpa_s->max_sched_scan_plans = capa.max_sched_scan_plans; 7372 wpa_s->max_sched_scan_plan_interval = 7373 capa.max_sched_scan_plan_interval; 7374 wpa_s->max_sched_scan_plan_iterations = 7375 capa.max_sched_scan_plan_iterations; 7376 wpa_s->sched_scan_supported = capa.sched_scan_supported; 7377 wpa_s->max_match_sets = capa.max_match_sets; 7378 wpa_s->max_remain_on_chan = capa.max_remain_on_chan; 7379 wpa_s->max_stations = capa.max_stations; 7380 wpa_s->extended_capa = capa.extended_capa; 7381 wpa_s->extended_capa_mask = capa.extended_capa_mask; 7382 wpa_s->extended_capa_len = capa.extended_capa_len; 7383 wpa_s->num_multichan_concurrent = 7384 capa.num_multichan_concurrent; 7385 #ifndef CONFIG_NO_WMM_AC 7386 wpa_s->wmm_ac_supported = capa.wmm_ac_supported; 7387 #endif /* CONFIG_NO_WMM_AC */ 7388 wpa_s->max_num_akms = capa.max_num_akms; 7389 7390 if (capa.mac_addr_rand_scan_supported) 7391 wpa_s->mac_addr_rand_supported |= MAC_ADDR_RAND_SCAN; 7392 if (wpa_s->sched_scan_supported && 7393 capa.mac_addr_rand_sched_scan_supported) 7394 wpa_s->mac_addr_rand_supported |= 7395 (MAC_ADDR_RAND_SCHED_SCAN | MAC_ADDR_RAND_PNO); 7396 7397 wpa_drv_get_ext_capa(wpa_s, WPA_IF_STATION); 7398 if (wpa_s->extended_capa && 7399 wpa_s->extended_capa_len >= 3 && 7400 wpa_s->extended_capa[2] & 0x40) 7401 wpa_s->multi_bss_support = 1; 7402 } 7403 #ifdef CONFIG_PASN 7404 wpa_pasn_sm_set_caps(wpa_s->wpa, wpa_s->drv_flags2); 7405 #endif /* CONFIG_PASN */ 7406 wpa_sm_set_driver_bss_selection(wpa_s->wpa, 7407 !!(wpa_s->drv_flags & 7408 WPA_DRIVER_FLAGS_BSS_SELECTION)); 7409 if (wpa_s->max_remain_on_chan == 0) 7410 wpa_s->max_remain_on_chan = 1000; 7411 7412 /* 7413 * Only take p2p_mgmt parameters when P2P Device is supported. 7414 * Doing it here as it determines whether l2_packet_init() will be done 7415 * during wpa_supplicant_driver_init(). 7416 */ 7417 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE) 7418 wpa_s->p2p_mgmt = iface->p2p_mgmt; 7419 7420 if (wpa_s->num_multichan_concurrent == 0) 7421 wpa_s->num_multichan_concurrent = 1; 7422 7423 if (wpa_supplicant_driver_init(wpa_s) < 0) 7424 return -1; 7425 7426 #ifdef CONFIG_TDLS 7427 if (!iface->p2p_mgmt && wpa_tdls_init(wpa_s->wpa)) 7428 return -1; 7429 #endif /* CONFIG_TDLS */ 7430 7431 if (wpa_s->conf->country[0] && wpa_s->conf->country[1] && 7432 wpa_drv_set_country(wpa_s, wpa_s->conf->country)) { 7433 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to set country"); 7434 return -1; 7435 } 7436 7437 #ifdef CONFIG_FST 7438 if (wpa_s->conf->fst_group_id) { 7439 struct fst_iface_cfg cfg; 7440 struct fst_wpa_obj iface_obj; 7441 7442 fst_wpa_supplicant_fill_iface_obj(wpa_s, &iface_obj); 7443 os_strlcpy(cfg.group_id, wpa_s->conf->fst_group_id, 7444 sizeof(cfg.group_id)); 7445 cfg.priority = wpa_s->conf->fst_priority; 7446 cfg.llt = wpa_s->conf->fst_llt; 7447 7448 wpa_s->fst = fst_attach(wpa_s->ifname, wpa_s->own_addr, 7449 &iface_obj, &cfg); 7450 if (!wpa_s->fst) { 7451 wpa_msg(wpa_s, MSG_ERROR, 7452 "FST: Cannot attach iface %s to group %s", 7453 wpa_s->ifname, cfg.group_id); 7454 return -1; 7455 } 7456 } 7457 #endif /* CONFIG_FST */ 7458 7459 if (wpas_wps_init(wpa_s)) 7460 return -1; 7461 7462 #ifdef CONFIG_GAS_SERVER 7463 wpa_s->gas_server = gas_server_init(wpa_s, wpas_gas_server_tx); 7464 if (!wpa_s->gas_server) { 7465 wpa_printf(MSG_ERROR, "Failed to initialize GAS server"); 7466 return -1; 7467 } 7468 #endif /* CONFIG_GAS_SERVER */ 7469 7470 #ifdef CONFIG_DPP 7471 if (wpas_dpp_init(wpa_s) < 0) 7472 return -1; 7473 #endif /* CONFIG_DPP */ 7474 7475 #ifdef CONFIG_NAN_USD 7476 if (wpas_nan_usd_init(wpa_s) < 0) 7477 return -1; 7478 #endif /* CONFIG_NAN_USD */ 7479 7480 if (wpa_supplicant_init_eapol(wpa_s) < 0) 7481 return -1; 7482 wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol); 7483 7484 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s); 7485 if (wpa_s->ctrl_iface == NULL) { 7486 wpa_printf(MSG_ERROR, 7487 "Failed to initialize control interface '%s'.\n" 7488 "You may have another wpa_supplicant process " 7489 "already running or the file was\n" 7490 "left by an unclean termination of wpa_supplicant " 7491 "in which case you will need\n" 7492 "to manually remove this file before starting " 7493 "wpa_supplicant again.\n", 7494 wpa_s->conf->ctrl_interface); 7495 return -1; 7496 } 7497 7498 wpa_s->gas = gas_query_init(wpa_s); 7499 if (wpa_s->gas == NULL) { 7500 wpa_printf(MSG_ERROR, "Failed to initialize GAS query"); 7501 return -1; 7502 } 7503 7504 if ((!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE) || 7505 wpa_s->p2p_mgmt) && 7506 wpas_p2p_init(wpa_s->global, wpa_s) < 0) { 7507 wpa_msg(wpa_s, MSG_ERROR, "Failed to init P2P"); 7508 return -1; 7509 } 7510 7511 if (wpa_bss_init(wpa_s) < 0) 7512 return -1; 7513 7514 #ifdef CONFIG_PMKSA_CACHE_EXTERNAL 7515 #ifdef CONFIG_MESH 7516 dl_list_init(&wpa_s->mesh_external_pmksa_cache); 7517 #endif /* CONFIG_MESH */ 7518 #endif /* CONFIG_PMKSA_CACHE_EXTERNAL */ 7519 7520 /* 7521 * Set Wake-on-WLAN triggers, if configured. 7522 * Note: We don't restore/remove the triggers on shutdown (it doesn't 7523 * have effect anyway when the interface is down). 7524 */ 7525 if (capa_res == 0 && wpas_set_wowlan_triggers(wpa_s, &capa) < 0) 7526 return -1; 7527 7528 #ifdef CONFIG_EAP_PROXY 7529 { 7530 size_t len; 7531 wpa_s->mnc_len = eapol_sm_get_eap_proxy_imsi(wpa_s->eapol, -1, 7532 wpa_s->imsi, &len); 7533 if (wpa_s->mnc_len > 0) { 7534 wpa_s->imsi[len] = '\0'; 7535 wpa_printf(MSG_DEBUG, "eap_proxy: IMSI %s (MNC length %d)", 7536 wpa_s->imsi, wpa_s->mnc_len); 7537 } else { 7538 wpa_printf(MSG_DEBUG, "eap_proxy: IMSI not available"); 7539 } 7540 } 7541 #endif /* CONFIG_EAP_PROXY */ 7542 7543 if (pcsc_reader_init(wpa_s) < 0) 7544 return -1; 7545 7546 if (wpas_init_ext_pw(wpa_s) < 0) 7547 return -1; 7548 7549 #ifndef CONFIG_NO_RRM 7550 wpas_rrm_reset(wpa_s); 7551 #endif /* CONFIG_NO_RRM */ 7552 7553 wpas_sched_scan_plans_set(wpa_s, wpa_s->conf->sched_scan_plans); 7554 7555 #ifdef CONFIG_HS20 7556 hs20_init(wpa_s); 7557 #endif /* CONFIG_HS20 */ 7558 #ifdef CONFIG_MBO 7559 if (!wpa_s->disable_mbo_oce && wpa_s->conf->oce) { 7560 if ((wpa_s->conf->oce & OCE_STA) && 7561 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_OCE_STA)) 7562 wpa_s->enable_oce = OCE_STA; 7563 if ((wpa_s->conf->oce & OCE_STA_CFON) && 7564 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_OCE_STA_CFON)) { 7565 /* TODO: Need to add STA-CFON support */ 7566 wpa_printf(MSG_ERROR, 7567 "OCE STA-CFON feature is not yet supported"); 7568 } 7569 } 7570 wpas_mbo_update_non_pref_chan(wpa_s, wpa_s->conf->non_pref_chan); 7571 #endif /* CONFIG_MBO */ 7572 7573 wpa_supplicant_set_default_scan_ies(wpa_s); 7574 7575 return 0; 7576 } 7577 7578 7579 static void wpa_supplicant_deinit_iface(struct wpa_supplicant *wpa_s, 7580 int notify, int terminate) 7581 { 7582 struct wpa_global *global = wpa_s->global; 7583 struct wpa_supplicant *iface, *prev; 7584 7585 if (wpa_s == wpa_s->parent) 7586 wpas_p2p_group_remove(wpa_s, "*"); 7587 7588 iface = global->ifaces; 7589 while (iface) { 7590 if (iface->p2pdev == wpa_s) 7591 iface->p2pdev = iface->parent; 7592 if (iface == wpa_s || iface->parent != wpa_s) { 7593 iface = iface->next; 7594 continue; 7595 } 7596 wpa_printf(MSG_DEBUG, 7597 "Remove remaining child interface %s from parent %s", 7598 iface->ifname, wpa_s->ifname); 7599 prev = iface; 7600 iface = iface->next; 7601 wpa_supplicant_remove_iface(global, prev, terminate); 7602 } 7603 7604 wpa_s->disconnected = 1; 7605 if (wpa_s->drv_priv) { 7606 /* 7607 * Don't deauthenticate if WoWLAN is enable and not explicitly 7608 * been configured to disconnect. 7609 */ 7610 if (!wpa_drv_get_wowlan(wpa_s) || 7611 wpa_s->conf->wowlan_disconnect_on_deinit) { 7612 wpa_supplicant_deauthenticate( 7613 wpa_s, WLAN_REASON_DEAUTH_LEAVING); 7614 7615 wpa_drv_set_countermeasures(wpa_s, 0); 7616 wpa_clear_keys(wpa_s, NULL); 7617 } else { 7618 wpa_msg(wpa_s, MSG_INFO, 7619 "Do not deauthenticate as part of interface deinit since WoWLAN is enabled"); 7620 } 7621 } 7622 7623 wpa_supplicant_cleanup(wpa_s); 7624 wpas_p2p_deinit_iface(wpa_s); 7625 7626 wpas_ctrl_radio_work_flush(wpa_s); 7627 radio_remove_interface(wpa_s); 7628 7629 #ifdef CONFIG_FST 7630 if (wpa_s->fst) { 7631 fst_detach(wpa_s->fst); 7632 wpa_s->fst = NULL; 7633 } 7634 if (wpa_s->received_mb_ies) { 7635 wpabuf_free(wpa_s->received_mb_ies); 7636 wpa_s->received_mb_ies = NULL; 7637 } 7638 #endif /* CONFIG_FST */ 7639 7640 if (wpa_s->drv_priv) 7641 wpa_drv_deinit(wpa_s); 7642 7643 if (notify) 7644 wpas_notify_iface_removed(wpa_s); 7645 7646 if (terminate) 7647 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TERMINATING); 7648 7649 wpa_supplicant_ctrl_iface_deinit(wpa_s, wpa_s->ctrl_iface); 7650 wpa_s->ctrl_iface = NULL; 7651 7652 #ifdef CONFIG_MESH 7653 if (wpa_s->ifmsh) { 7654 wpa_supplicant_mesh_iface_deinit(wpa_s, wpa_s->ifmsh, true); 7655 wpa_s->ifmsh = NULL; 7656 } 7657 #endif /* CONFIG_MESH */ 7658 7659 if (wpa_s->conf != NULL) { 7660 wpa_config_free(wpa_s->conf); 7661 wpa_s->conf = NULL; 7662 } 7663 7664 os_free(wpa_s->ssids_from_scan_req); 7665 os_free(wpa_s->last_scan_freqs); 7666 7667 os_free(wpa_s); 7668 } 7669 7670 7671 #ifdef CONFIG_MATCH_IFACE 7672 7673 /** 7674 * wpa_supplicant_match_iface - Match an interface description to a name 7675 * @global: Pointer to global data from wpa_supplicant_init() 7676 * @ifname: Name of the interface to match 7677 * Returns: Pointer to the created interface description or %NULL on failure 7678 */ 7679 struct wpa_interface * wpa_supplicant_match_iface(struct wpa_global *global, 7680 const char *ifname) 7681 { 7682 int i; 7683 struct wpa_interface *iface, *miface; 7684 7685 for (i = 0; i < global->params.match_iface_count; i++) { 7686 miface = &global->params.match_ifaces[i]; 7687 if (!miface->ifname || 7688 fnmatch(miface->ifname, ifname, 0) == 0) { 7689 iface = os_zalloc(sizeof(*iface)); 7690 if (!iface) 7691 return NULL; 7692 *iface = *miface; 7693 if (!miface->ifname) 7694 iface->matched = WPA_IFACE_MATCHED_NULL; 7695 else 7696 iface->matched = WPA_IFACE_MATCHED; 7697 iface->ifname = ifname; 7698 return iface; 7699 } 7700 } 7701 7702 return NULL; 7703 } 7704 7705 7706 /** 7707 * wpa_supplicant_match_existing - Match existing interfaces 7708 * @global: Pointer to global data from wpa_supplicant_init() 7709 * Returns: 0 on success, -1 on failure 7710 */ 7711 static int wpa_supplicant_match_existing(struct wpa_global *global) 7712 { 7713 struct if_nameindex *ifi, *ifp; 7714 struct wpa_supplicant *wpa_s; 7715 struct wpa_interface *iface; 7716 7717 ifp = if_nameindex(); 7718 if (!ifp) { 7719 wpa_printf(MSG_ERROR, "if_nameindex: %s", strerror(errno)); 7720 return -1; 7721 } 7722 7723 for (ifi = ifp; ifi->if_name; ifi++) { 7724 wpa_s = wpa_supplicant_get_iface(global, ifi->if_name); 7725 if (wpa_s) 7726 continue; 7727 iface = wpa_supplicant_match_iface(global, ifi->if_name); 7728 if (iface) { 7729 wpa_supplicant_add_iface(global, iface, NULL); 7730 os_free(iface); 7731 } 7732 } 7733 7734 if_freenameindex(ifp); 7735 return 0; 7736 } 7737 7738 #endif /* CONFIG_MATCH_IFACE */ 7739 7740 7741 /** 7742 * wpa_supplicant_add_iface - Add a new network interface 7743 * @global: Pointer to global data from wpa_supplicant_init() 7744 * @iface: Interface configuration options 7745 * @parent: Parent interface or %NULL to assign new interface as parent 7746 * Returns: Pointer to the created interface or %NULL on failure 7747 * 7748 * This function is used to add new network interfaces for %wpa_supplicant. 7749 * This can be called before wpa_supplicant_run() to add interfaces before the 7750 * main event loop has been started. In addition, new interfaces can be added 7751 * dynamically while %wpa_supplicant is already running. This could happen, 7752 * e.g., when a hotplug network adapter is inserted. 7753 */ 7754 struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global, 7755 struct wpa_interface *iface, 7756 struct wpa_supplicant *parent) 7757 { 7758 struct wpa_supplicant *wpa_s; 7759 struct wpa_interface t_iface; 7760 struct wpa_ssid *ssid; 7761 7762 if (global == NULL || iface == NULL) 7763 return NULL; 7764 7765 wpa_s = wpa_supplicant_alloc(parent); 7766 if (wpa_s == NULL) 7767 return NULL; 7768 7769 wpa_s->global = global; 7770 7771 t_iface = *iface; 7772 if (global->params.override_driver) { 7773 wpa_printf(MSG_DEBUG, "Override interface parameter: driver " 7774 "('%s' -> '%s')", 7775 iface->driver, global->params.override_driver); 7776 t_iface.driver = global->params.override_driver; 7777 } 7778 if (global->params.override_ctrl_interface) { 7779 wpa_printf(MSG_DEBUG, "Override interface parameter: " 7780 "ctrl_interface ('%s' -> '%s')", 7781 iface->ctrl_interface, 7782 global->params.override_ctrl_interface); 7783 t_iface.ctrl_interface = 7784 global->params.override_ctrl_interface; 7785 } 7786 if (wpa_supplicant_init_iface(wpa_s, &t_iface)) { 7787 wpa_printf(MSG_DEBUG, "Failed to add interface %s", 7788 iface->ifname); 7789 wpa_supplicant_deinit_iface(wpa_s, 0, 0); 7790 return NULL; 7791 } 7792 7793 if (iface->p2p_mgmt == 0) { 7794 /* Notify the control interfaces about new iface */ 7795 if (wpas_notify_iface_added(wpa_s)) { 7796 wpa_supplicant_deinit_iface(wpa_s, 1, 0); 7797 return NULL; 7798 } 7799 7800 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) 7801 wpas_notify_network_added(wpa_s, ssid); 7802 } 7803 7804 wpa_s->next = global->ifaces; 7805 global->ifaces = wpa_s; 7806 7807 wpa_dbg(wpa_s, MSG_DEBUG, "Added interface %s", wpa_s->ifname); 7808 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED); 7809 7810 #ifdef CONFIG_P2P 7811 if (wpa_s->global->p2p == NULL && 7812 !wpa_s->global->p2p_disabled && !wpa_s->conf->p2p_disabled && 7813 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE) && 7814 wpas_p2p_add_p2pdev_interface( 7815 wpa_s, wpa_s->global->params.conf_p2p_dev) < 0) { 7816 wpa_printf(MSG_INFO, 7817 "P2P: Failed to enable P2P Device interface"); 7818 /* Try to continue without. P2P will be disabled. */ 7819 } 7820 #endif /* CONFIG_P2P */ 7821 7822 return wpa_s; 7823 } 7824 7825 7826 /** 7827 * wpa_supplicant_remove_iface - Remove a network interface 7828 * @global: Pointer to global data from wpa_supplicant_init() 7829 * @wpa_s: Pointer to the network interface to be removed 7830 * Returns: 0 if interface was removed, -1 if interface was not found 7831 * 7832 * This function can be used to dynamically remove network interfaces from 7833 * %wpa_supplicant, e.g., when a hotplug network adapter is ejected. In 7834 * addition, this function is used to remove all remaining interfaces when 7835 * %wpa_supplicant is terminated. 7836 */ 7837 int wpa_supplicant_remove_iface(struct wpa_global *global, 7838 struct wpa_supplicant *wpa_s, 7839 int terminate) 7840 { 7841 struct wpa_supplicant *prev; 7842 #ifdef CONFIG_MESH 7843 unsigned int mesh_if_created = wpa_s->mesh_if_created; 7844 char *ifname = NULL; 7845 struct wpa_supplicant *parent = wpa_s->parent; 7846 #endif /* CONFIG_MESH */ 7847 7848 /* Remove interface from the global list of interfaces */ 7849 prev = global->ifaces; 7850 if (prev == wpa_s) { 7851 global->ifaces = wpa_s->next; 7852 } else { 7853 while (prev && prev->next != wpa_s) 7854 prev = prev->next; 7855 if (prev == NULL) 7856 return -1; 7857 prev->next = wpa_s->next; 7858 } 7859 7860 wpa_dbg(wpa_s, MSG_DEBUG, "Removing interface %s", wpa_s->ifname); 7861 7862 #ifdef CONFIG_MESH 7863 if (mesh_if_created) { 7864 ifname = os_strdup(wpa_s->ifname); 7865 if (ifname == NULL) { 7866 wpa_dbg(wpa_s, MSG_ERROR, 7867 "mesh: Failed to malloc ifname"); 7868 return -1; 7869 } 7870 } 7871 #endif /* CONFIG_MESH */ 7872 7873 if (global->p2p_group_formation == wpa_s) 7874 global->p2p_group_formation = NULL; 7875 if (global->p2p_invite_group == wpa_s) 7876 global->p2p_invite_group = NULL; 7877 wpa_supplicant_deinit_iface(wpa_s, 1, terminate); 7878 7879 #ifdef CONFIG_MESH 7880 if (mesh_if_created) { 7881 wpa_drv_if_remove(parent, WPA_IF_MESH, ifname); 7882 os_free(ifname); 7883 } 7884 #endif /* CONFIG_MESH */ 7885 7886 return 0; 7887 } 7888 7889 7890 /** 7891 * wpa_supplicant_get_eap_mode - Get the current EAP mode 7892 * @wpa_s: Pointer to the network interface 7893 * Returns: Pointer to the eap mode or the string "UNKNOWN" if not found 7894 */ 7895 const char * wpa_supplicant_get_eap_mode(struct wpa_supplicant *wpa_s) 7896 { 7897 const char *eapol_method; 7898 7899 if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) == 0 && 7900 wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA) { 7901 return "NO-EAP"; 7902 } 7903 7904 eapol_method = eapol_sm_get_method_name(wpa_s->eapol); 7905 if (eapol_method == NULL) 7906 return "UNKNOWN-EAP"; 7907 7908 return eapol_method; 7909 } 7910 7911 7912 /** 7913 * wpa_supplicant_get_iface - Get a new network interface 7914 * @global: Pointer to global data from wpa_supplicant_init() 7915 * @ifname: Interface name 7916 * Returns: Pointer to the interface or %NULL if not found 7917 */ 7918 struct wpa_supplicant * wpa_supplicant_get_iface(struct wpa_global *global, 7919 const char *ifname) 7920 { 7921 struct wpa_supplicant *wpa_s; 7922 7923 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { 7924 if (os_strcmp(wpa_s->ifname, ifname) == 0) 7925 return wpa_s; 7926 } 7927 return NULL; 7928 } 7929 7930 7931 #ifndef CONFIG_NO_WPA_MSG 7932 static const char * wpa_supplicant_msg_ifname_cb(void *ctx) 7933 { 7934 struct wpa_supplicant *wpa_s = ctx; 7935 if (wpa_s == NULL) 7936 return NULL; 7937 return wpa_s->ifname; 7938 } 7939 #endif /* CONFIG_NO_WPA_MSG */ 7940 7941 7942 #ifndef WPA_SUPPLICANT_CLEANUP_INTERVAL 7943 #define WPA_SUPPLICANT_CLEANUP_INTERVAL 10 7944 #endif /* WPA_SUPPLICANT_CLEANUP_INTERVAL */ 7945 7946 /* Periodic cleanup tasks */ 7947 static void wpas_periodic(void *eloop_ctx, void *timeout_ctx) 7948 { 7949 struct wpa_global *global = eloop_ctx; 7950 struct wpa_supplicant *wpa_s; 7951 7952 eloop_register_timeout(WPA_SUPPLICANT_CLEANUP_INTERVAL, 0, 7953 wpas_periodic, global, NULL); 7954 7955 #ifdef CONFIG_P2P 7956 if (global->p2p) 7957 p2p_expire_peers(global->p2p); 7958 #endif /* CONFIG_P2P */ 7959 7960 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { 7961 wpa_bss_flush_by_age(wpa_s, wpa_s->conf->bss_expiration_age); 7962 #ifdef CONFIG_AP 7963 ap_periodic(wpa_s); 7964 #endif /* CONFIG_AP */ 7965 } 7966 } 7967 7968 7969 /** 7970 * wpa_supplicant_init - Initialize %wpa_supplicant 7971 * @params: Parameters for %wpa_supplicant 7972 * Returns: Pointer to global %wpa_supplicant data, or %NULL on failure 7973 * 7974 * This function is used to initialize %wpa_supplicant. After successful 7975 * initialization, the returned data pointer can be used to add and remove 7976 * network interfaces, and eventually, to deinitialize %wpa_supplicant. 7977 */ 7978 struct wpa_global * wpa_supplicant_init(struct wpa_params *params) 7979 { 7980 struct wpa_global *global; 7981 int ret, i; 7982 7983 if (params == NULL) 7984 return NULL; 7985 7986 #ifndef CONFIG_NO_WPA_MSG 7987 wpa_msg_register_ifname_cb(wpa_supplicant_msg_ifname_cb); 7988 #endif /* CONFIG_NO_WPA_MSG */ 7989 7990 if (params->wpa_debug_file_path) 7991 wpa_debug_open_file(params->wpa_debug_file_path); 7992 if (!params->wpa_debug_file_path && !params->wpa_debug_syslog) 7993 wpa_debug_setup_stdout(); 7994 if (params->wpa_debug_syslog) 7995 wpa_debug_open_syslog(); 7996 if (params->wpa_debug_tracing) { 7997 ret = wpa_debug_open_linux_tracing(); 7998 if (ret) { 7999 wpa_printf(MSG_ERROR, 8000 "Failed to enable trace logging"); 8001 return NULL; 8002 } 8003 } 8004 8005 ret = eap_register_methods(); 8006 if (ret) { 8007 wpa_printf(MSG_ERROR, "Failed to register EAP methods"); 8008 if (ret == -2) 8009 wpa_printf(MSG_ERROR, "Two or more EAP methods used " 8010 "the same EAP type."); 8011 return NULL; 8012 } 8013 8014 global = os_zalloc(sizeof(*global)); 8015 if (global == NULL) 8016 return NULL; 8017 dl_list_init(&global->p2p_srv_bonjour); 8018 dl_list_init(&global->p2p_srv_upnp); 8019 global->params.daemonize = params->daemonize; 8020 global->params.wait_for_monitor = params->wait_for_monitor; 8021 global->params.dbus_ctrl_interface = params->dbus_ctrl_interface; 8022 8023 if (params->pid_file) { 8024 global->params.pid_file = os_strdup(params->pid_file); 8025 if (!global->params.pid_file) { 8026 wpa_supplicant_deinit(global); 8027 return NULL; 8028 } 8029 } 8030 8031 if (params->ctrl_interface) { 8032 global->params.ctrl_interface = 8033 os_strdup(params->ctrl_interface); 8034 if (!global->params.ctrl_interface) { 8035 wpa_supplicant_deinit(global); 8036 return NULL; 8037 } 8038 } 8039 8040 if (params->ctrl_interface_group) { 8041 global->params.ctrl_interface_group = 8042 os_strdup(params->ctrl_interface_group); 8043 if (!global->params.ctrl_interface_group) { 8044 wpa_supplicant_deinit(global); 8045 return NULL; 8046 } 8047 } 8048 8049 if (params->override_driver) { 8050 global->params.override_driver = 8051 os_strdup(params->override_driver); 8052 if (!global->params.override_driver) { 8053 wpa_supplicant_deinit(global); 8054 return NULL; 8055 } 8056 } 8057 8058 if (params->override_ctrl_interface) { 8059 global->params.override_ctrl_interface = 8060 os_strdup(params->override_ctrl_interface); 8061 if (!global->params.override_ctrl_interface) { 8062 wpa_supplicant_deinit(global); 8063 return NULL; 8064 } 8065 } 8066 8067 #ifdef CONFIG_MATCH_IFACE 8068 global->params.match_iface_count = params->match_iface_count; 8069 if (params->match_iface_count) { 8070 global->params.match_ifaces = 8071 os_calloc(params->match_iface_count, 8072 sizeof(struct wpa_interface)); 8073 if (!global->params.match_ifaces) { 8074 wpa_printf(MSG_ERROR, 8075 "Failed to allocate match interfaces"); 8076 wpa_supplicant_deinit(global); 8077 return NULL; 8078 } 8079 os_memcpy(global->params.match_ifaces, 8080 params->match_ifaces, 8081 params->match_iface_count * 8082 sizeof(struct wpa_interface)); 8083 } 8084 #endif /* CONFIG_MATCH_IFACE */ 8085 #ifdef CONFIG_P2P 8086 if (params->conf_p2p_dev) { 8087 global->params.conf_p2p_dev = 8088 os_strdup(params->conf_p2p_dev); 8089 if (!global->params.conf_p2p_dev) { 8090 wpa_printf(MSG_ERROR, "Failed to allocate conf p2p"); 8091 wpa_supplicant_deinit(global); 8092 return NULL; 8093 } 8094 } 8095 #endif /* CONFIG_P2P */ 8096 wpa_debug_level = global->params.wpa_debug_level = 8097 params->wpa_debug_level; 8098 wpa_debug_show_keys = global->params.wpa_debug_show_keys = 8099 params->wpa_debug_show_keys; 8100 wpa_debug_timestamp = global->params.wpa_debug_timestamp = 8101 params->wpa_debug_timestamp; 8102 8103 wpa_printf(MSG_DEBUG, "wpa_supplicant v%s", VERSION_STR); 8104 8105 if (eloop_init()) { 8106 wpa_printf(MSG_ERROR, "Failed to initialize event loop"); 8107 wpa_supplicant_deinit(global); 8108 return NULL; 8109 } 8110 8111 random_init(params->entropy_file); 8112 8113 global->ctrl_iface = wpa_supplicant_global_ctrl_iface_init(global); 8114 if (global->ctrl_iface == NULL) { 8115 wpa_supplicant_deinit(global); 8116 return NULL; 8117 } 8118 8119 if (wpas_notify_supplicant_initialized(global)) { 8120 wpa_supplicant_deinit(global); 8121 return NULL; 8122 } 8123 8124 for (i = 0; wpa_drivers[i]; i++) 8125 global->drv_count++; 8126 if (global->drv_count == 0) { 8127 wpa_printf(MSG_ERROR, "No drivers enabled"); 8128 wpa_supplicant_deinit(global); 8129 return NULL; 8130 } 8131 global->drv_priv = os_calloc(global->drv_count, sizeof(void *)); 8132 if (global->drv_priv == NULL) { 8133 wpa_supplicant_deinit(global); 8134 return NULL; 8135 } 8136 8137 #ifdef CONFIG_WIFI_DISPLAY 8138 if (wifi_display_init(global) < 0) { 8139 wpa_printf(MSG_ERROR, "Failed to initialize Wi-Fi Display"); 8140 wpa_supplicant_deinit(global); 8141 return NULL; 8142 } 8143 #endif /* CONFIG_WIFI_DISPLAY */ 8144 8145 eloop_register_timeout(WPA_SUPPLICANT_CLEANUP_INTERVAL, 0, 8146 wpas_periodic, global, NULL); 8147 8148 return global; 8149 } 8150 8151 8152 /** 8153 * wpa_supplicant_run - Run the %wpa_supplicant main event loop 8154 * @global: Pointer to global data from wpa_supplicant_init() 8155 * Returns: 0 after successful event loop run, -1 on failure 8156 * 8157 * This function starts the main event loop and continues running as long as 8158 * there are any remaining events. In most cases, this function is running as 8159 * long as the %wpa_supplicant process in still in use. 8160 */ 8161 int wpa_supplicant_run(struct wpa_global *global) 8162 { 8163 struct wpa_supplicant *wpa_s; 8164 8165 if (global->params.daemonize && 8166 (wpa_supplicant_daemon(global->params.pid_file) || 8167 eloop_sock_requeue())) 8168 return -1; 8169 8170 #ifdef CONFIG_MATCH_IFACE 8171 if (wpa_supplicant_match_existing(global)) 8172 return -1; 8173 #endif 8174 8175 if (global->params.wait_for_monitor) { 8176 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) 8177 if (wpa_s->ctrl_iface && !wpa_s->p2p_mgmt) 8178 wpa_supplicant_ctrl_iface_wait( 8179 wpa_s->ctrl_iface); 8180 } 8181 8182 eloop_register_signal_terminate(wpa_supplicant_terminate, global); 8183 eloop_register_signal_reconfig(wpa_supplicant_reconfig, global); 8184 8185 eloop_run(); 8186 8187 return 0; 8188 } 8189 8190 8191 /** 8192 * wpa_supplicant_deinit - Deinitialize %wpa_supplicant 8193 * @global: Pointer to global data from wpa_supplicant_init() 8194 * 8195 * This function is called to deinitialize %wpa_supplicant and to free all 8196 * allocated resources. Remaining network interfaces will also be removed. 8197 */ 8198 void wpa_supplicant_deinit(struct wpa_global *global) 8199 { 8200 int i; 8201 8202 if (global == NULL) 8203 return; 8204 8205 eloop_cancel_timeout(wpas_periodic, global, NULL); 8206 8207 #ifdef CONFIG_WIFI_DISPLAY 8208 wifi_display_deinit(global); 8209 #endif /* CONFIG_WIFI_DISPLAY */ 8210 8211 while (global->ifaces) 8212 wpa_supplicant_remove_iface(global, global->ifaces, 1); 8213 8214 if (global->ctrl_iface) 8215 wpa_supplicant_global_ctrl_iface_deinit(global->ctrl_iface); 8216 8217 wpas_notify_supplicant_deinitialized(global); 8218 8219 eap_peer_unregister_methods(); 8220 #ifdef CONFIG_AP 8221 eap_server_unregister_methods(); 8222 #endif /* CONFIG_AP */ 8223 8224 for (i = 0; wpa_drivers[i] && global->drv_priv; i++) { 8225 if (!global->drv_priv[i]) 8226 continue; 8227 wpa_drivers[i]->global_deinit(global->drv_priv[i]); 8228 } 8229 os_free(global->drv_priv); 8230 8231 random_deinit(); 8232 8233 eloop_destroy(); 8234 8235 if (global->params.pid_file) { 8236 os_daemonize_terminate(global->params.pid_file); 8237 os_free(global->params.pid_file); 8238 } 8239 os_free(global->params.ctrl_interface); 8240 os_free(global->params.ctrl_interface_group); 8241 os_free(global->params.override_driver); 8242 os_free(global->params.override_ctrl_interface); 8243 #ifdef CONFIG_MATCH_IFACE 8244 os_free(global->params.match_ifaces); 8245 #endif /* CONFIG_MATCH_IFACE */ 8246 #ifdef CONFIG_P2P 8247 os_free(global->params.conf_p2p_dev); 8248 #endif /* CONFIG_P2P */ 8249 8250 os_free(global->p2p_disallow_freq.range); 8251 os_free(global->p2p_go_avoid_freq.range); 8252 os_free(global->add_psk); 8253 8254 os_free(global); 8255 wpa_debug_close_syslog(); 8256 wpa_debug_close_file(); 8257 wpa_debug_close_linux_tracing(); 8258 } 8259 8260 8261 void wpa_supplicant_update_config(struct wpa_supplicant *wpa_s) 8262 { 8263 if ((wpa_s->conf->changed_parameters & CFG_CHANGED_COUNTRY) && 8264 wpa_s->conf->country[0] && wpa_s->conf->country[1]) { 8265 char country[3]; 8266 country[0] = wpa_s->conf->country[0]; 8267 country[1] = wpa_s->conf->country[1]; 8268 country[2] = '\0'; 8269 if (wpa_drv_set_country(wpa_s, country) < 0) { 8270 wpa_printf(MSG_ERROR, "Failed to set country code " 8271 "'%s'", country); 8272 } 8273 } 8274 8275 if (wpa_s->conf->changed_parameters & CFG_CHANGED_EXT_PW_BACKEND) 8276 wpas_init_ext_pw(wpa_s); 8277 8278 if (wpa_s->conf->changed_parameters & CFG_CHANGED_SCHED_SCAN_PLANS) 8279 wpas_sched_scan_plans_set(wpa_s, wpa_s->conf->sched_scan_plans); 8280 8281 if (wpa_s->conf->changed_parameters & CFG_CHANGED_WOWLAN_TRIGGERS) { 8282 struct wpa_driver_capa capa; 8283 int res = wpa_drv_get_capa(wpa_s, &capa); 8284 8285 if (res == 0 && wpas_set_wowlan_triggers(wpa_s, &capa) < 0) 8286 wpa_printf(MSG_ERROR, 8287 "Failed to update wowlan_triggers to '%s'", 8288 wpa_s->conf->wowlan_triggers); 8289 } 8290 8291 if (wpa_s->conf->changed_parameters & CFG_CHANGED_DISABLE_BTM) 8292 wpa_supplicant_set_default_scan_ies(wpa_s); 8293 8294 if (wpa_s->conf->changed_parameters & CFG_CHANGED_FT_PREPEND_PMKID) 8295 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_FT_PREPEND_PMKID, 8296 wpa_s->conf->ft_prepend_pmkid); 8297 8298 #ifdef CONFIG_BGSCAN 8299 /* 8300 * We default to global bgscan parameters only when per-network bgscan 8301 * parameters aren't set. Only bother resetting bgscan parameters if 8302 * this is the case. 8303 */ 8304 if ((wpa_s->conf->changed_parameters & CFG_CHANGED_BGSCAN) && 8305 wpa_s->current_ssid && !wpa_s->current_ssid->bgscan && 8306 wpa_s->wpa_state == WPA_COMPLETED) 8307 wpa_supplicant_reset_bgscan(wpa_s); 8308 #endif /* CONFIG_BGSCAN */ 8309 8310 #ifdef CONFIG_WPS 8311 wpas_wps_update_config(wpa_s); 8312 #endif /* CONFIG_WPS */ 8313 wpas_p2p_update_config(wpa_s); 8314 wpa_s->conf->changed_parameters = 0; 8315 } 8316 8317 8318 void add_freq(int *freqs, int *num_freqs, int freq) 8319 { 8320 int i; 8321 8322 for (i = 0; i < *num_freqs; i++) { 8323 if (freqs[i] == freq) 8324 return; 8325 } 8326 8327 freqs[*num_freqs] = freq; 8328 (*num_freqs)++; 8329 } 8330 8331 8332 static int * get_bss_freqs_in_ess(struct wpa_supplicant *wpa_s) 8333 { 8334 struct wpa_bss *bss, *cbss; 8335 const int max_freqs = 10; 8336 int *freqs; 8337 int num_freqs = 0; 8338 8339 freqs = os_calloc(max_freqs + 1, sizeof(int)); 8340 if (freqs == NULL) 8341 return NULL; 8342 8343 cbss = wpa_s->current_bss; 8344 8345 dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) { 8346 if (bss == cbss) 8347 continue; 8348 if (bss->ssid_len == cbss->ssid_len && 8349 os_memcmp(bss->ssid, cbss->ssid, bss->ssid_len) == 0 && 8350 !wpa_bssid_ignore_is_listed(wpa_s, bss->bssid)) { 8351 add_freq(freqs, &num_freqs, bss->freq); 8352 if (num_freqs == max_freqs) 8353 break; 8354 } 8355 } 8356 8357 if (num_freqs == 0) { 8358 os_free(freqs); 8359 freqs = NULL; 8360 } 8361 8362 return freqs; 8363 } 8364 8365 8366 void wpas_connection_failed(struct wpa_supplicant *wpa_s, const u8 *bssid, 8367 const u8 **link_bssids) 8368 { 8369 int timeout; 8370 int count; 8371 int *freqs = NULL; 8372 8373 wpas_connect_work_done(wpa_s); 8374 8375 /* 8376 * Remove possible authentication timeout since the connection failed. 8377 */ 8378 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL); 8379 8380 /* 8381 * There is no point in ignoring the AP temporarily if this event is 8382 * generated based on local request to disconnect. 8383 */ 8384 if (wpa_s->own_disconnect_req || wpa_s->own_reconnect_req) { 8385 wpa_s->own_disconnect_req = 0; 8386 wpa_dbg(wpa_s, MSG_DEBUG, 8387 "Ignore connection failure due to local request to disconnect"); 8388 return; 8389 } 8390 if (wpa_s->disconnected) { 8391 wpa_dbg(wpa_s, MSG_DEBUG, "Ignore connection failure " 8392 "indication since interface has been put into " 8393 "disconnected state"); 8394 return; 8395 } 8396 8397 /* Also mark links as failed */ 8398 while (link_bssids && *link_bssids) { 8399 wpa_bssid_ignore_add(wpa_s, *link_bssids); 8400 link_bssids++; 8401 } 8402 8403 /* 8404 * Add the failed BSSID into the ignore list and speed up next scan 8405 * attempt if there could be other APs that could accept association. 8406 */ 8407 count = wpa_bssid_ignore_add(wpa_s, bssid); 8408 if (count == 1 && wpa_s->current_bss) { 8409 /* 8410 * This BSS was not in the ignore list before. If there is 8411 * another BSS available for the same ESS, we should try that 8412 * next. Otherwise, we may as well try this one once more 8413 * before allowing other, likely worse, ESSes to be considered. 8414 */ 8415 freqs = get_bss_freqs_in_ess(wpa_s); 8416 if (freqs) { 8417 wpa_dbg(wpa_s, MSG_DEBUG, "Another BSS in this ESS " 8418 "has been seen; try it next"); 8419 wpa_bssid_ignore_add(wpa_s, bssid); 8420 /* 8421 * On the next scan, go through only the known channels 8422 * used in this ESS based on previous scans to speed up 8423 * common load balancing use case. 8424 */ 8425 os_free(wpa_s->next_scan_freqs); 8426 wpa_s->next_scan_freqs = freqs; 8427 } 8428 } 8429 8430 wpa_s->consecutive_conn_failures++; 8431 8432 if (wpa_s->consecutive_conn_failures > 3 && wpa_s->current_ssid) { 8433 wpa_printf(MSG_DEBUG, "Continuous association failures - " 8434 "consider temporary network disabling"); 8435 wpas_auth_failed(wpa_s, "CONN_FAILED", bssid); 8436 } 8437 /* 8438 * Multiple consecutive connection failures mean that other APs are 8439 * either not available or have already been tried, so we can start 8440 * increasing the delay here to avoid constant scanning. 8441 */ 8442 switch (wpa_s->consecutive_conn_failures) { 8443 case 1: 8444 timeout = 100; 8445 break; 8446 case 2: 8447 timeout = 500; 8448 break; 8449 case 3: 8450 timeout = 1000; 8451 break; 8452 case 4: 8453 timeout = 5000; 8454 break; 8455 default: 8456 timeout = 10000; 8457 break; 8458 } 8459 8460 wpa_dbg(wpa_s, MSG_DEBUG, 8461 "Consecutive connection failures: %d --> request scan in %d ms", 8462 wpa_s->consecutive_conn_failures, timeout); 8463 8464 /* 8465 * TODO: if more than one possible AP is available in scan results, 8466 * could try the other ones before requesting a new scan. 8467 */ 8468 8469 /* speed up the connection attempt with normal scan */ 8470 wpa_s->normal_scans = 0; 8471 wpa_supplicant_req_scan(wpa_s, timeout / 1000, 8472 1000 * (timeout % 1000)); 8473 } 8474 8475 8476 #ifdef CONFIG_FILS 8477 8478 void fils_pmksa_cache_flush(struct wpa_supplicant *wpa_s) 8479 { 8480 struct wpa_ssid *ssid = wpa_s->current_ssid; 8481 const u8 *realm, *username, *rrk; 8482 size_t realm_len, username_len, rrk_len; 8483 u16 next_seq_num; 8484 8485 /* Clear the PMKSA cache entry if FILS authentication was rejected. 8486 * Check for ERP keys existing to limit when this can be done since 8487 * the rejection response is not protected and such triggers should 8488 * really not allow internal state to be modified unless required to 8489 * avoid significant issues in functionality. In addition, drop 8490 * externally configure PMKSA entries even without ERP keys since it 8491 * is possible for an external component to add PMKSA entries for FILS 8492 * authentication without restoring previously generated ERP keys. 8493 * 8494 * In this case, this is needed to allow recovery from cases where the 8495 * AP or authentication server has dropped PMKSAs and ERP keys. */ 8496 if (!ssid || !ssid->eap.erp || !wpa_key_mgmt_fils(ssid->key_mgmt)) 8497 return; 8498 8499 if (eapol_sm_get_erp_info(wpa_s->eapol, &ssid->eap, 8500 &username, &username_len, 8501 &realm, &realm_len, &next_seq_num, 8502 &rrk, &rrk_len) != 0 || 8503 !realm) { 8504 wpa_dbg(wpa_s, MSG_DEBUG, 8505 "FILS: Drop external PMKSA cache entry"); 8506 wpa_sm_aborted_external_cached(wpa_s->wpa); 8507 wpa_sm_external_pmksa_cache_flush(wpa_s->wpa, ssid); 8508 return; 8509 } 8510 8511 wpa_dbg(wpa_s, MSG_DEBUG, "FILS: Drop PMKSA cache entry"); 8512 wpa_sm_aborted_cached(wpa_s->wpa); 8513 wpa_sm_pmksa_cache_flush(wpa_s->wpa, ssid); 8514 } 8515 8516 8517 void fils_connection_failure(struct wpa_supplicant *wpa_s) 8518 { 8519 struct wpa_ssid *ssid = wpa_s->current_ssid; 8520 const u8 *realm, *username, *rrk; 8521 size_t realm_len, username_len, rrk_len; 8522 u16 next_seq_num; 8523 8524 if (!ssid || !ssid->eap.erp || !wpa_key_mgmt_fils(ssid->key_mgmt) || 8525 eapol_sm_get_erp_info(wpa_s->eapol, &ssid->eap, 8526 &username, &username_len, 8527 &realm, &realm_len, &next_seq_num, 8528 &rrk, &rrk_len) != 0 || 8529 !realm) 8530 return; 8531 8532 wpa_hexdump_ascii(MSG_DEBUG, 8533 "FILS: Store last connection failure realm", 8534 realm, realm_len); 8535 os_free(wpa_s->last_con_fail_realm); 8536 wpa_s->last_con_fail_realm = os_malloc(realm_len); 8537 if (wpa_s->last_con_fail_realm) { 8538 wpa_s->last_con_fail_realm_len = realm_len; 8539 os_memcpy(wpa_s->last_con_fail_realm, realm, realm_len); 8540 } 8541 } 8542 #endif /* CONFIG_FILS */ 8543 8544 8545 int wpas_driver_bss_selection(struct wpa_supplicant *wpa_s) 8546 { 8547 return wpa_s->conf->ap_scan == 2 || 8548 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_BSS_SELECTION); 8549 } 8550 8551 8552 #if defined(CONFIG_CTRL_IFACE) || defined(CONFIG_CTRL_IFACE_DBUS_NEW) 8553 int wpa_supplicant_ctrl_iface_ctrl_rsp_handle(struct wpa_supplicant *wpa_s, 8554 struct wpa_ssid *ssid, 8555 const char *field, 8556 const char *value) 8557 { 8558 #ifdef IEEE8021X_EAPOL 8559 struct eap_peer_config *eap = &ssid->eap; 8560 8561 wpa_printf(MSG_DEBUG, "CTRL_IFACE: response handle field=%s", field); 8562 wpa_hexdump_ascii_key(MSG_DEBUG, "CTRL_IFACE: response value", 8563 (const u8 *) value, os_strlen(value)); 8564 8565 switch (wpa_supplicant_ctrl_req_from_string(field)) { 8566 case WPA_CTRL_REQ_EAP_IDENTITY: 8567 os_free(eap->identity); 8568 eap->identity = (u8 *) os_strdup(value); 8569 if (!eap->identity) 8570 return -1; 8571 eap->identity_len = os_strlen(value); 8572 eap->pending_req_identity = 0; 8573 if (ssid == wpa_s->current_ssid) 8574 wpa_s->reassociate = 1; 8575 break; 8576 case WPA_CTRL_REQ_EAP_PASSWORD: 8577 bin_clear_free(eap->password, eap->password_len); 8578 eap->password = (u8 *) os_strdup(value); 8579 if (!eap->password) 8580 return -1; 8581 eap->password_len = os_strlen(value); 8582 eap->pending_req_password = 0; 8583 if (ssid == wpa_s->current_ssid) 8584 wpa_s->reassociate = 1; 8585 break; 8586 case WPA_CTRL_REQ_EAP_NEW_PASSWORD: 8587 bin_clear_free(eap->new_password, eap->new_password_len); 8588 eap->new_password = (u8 *) os_strdup(value); 8589 if (!eap->new_password) 8590 return -1; 8591 eap->new_password_len = os_strlen(value); 8592 eap->pending_req_new_password = 0; 8593 if (ssid == wpa_s->current_ssid) 8594 wpa_s->reassociate = 1; 8595 break; 8596 case WPA_CTRL_REQ_EAP_PIN: 8597 str_clear_free(eap->cert.pin); 8598 eap->cert.pin = os_strdup(value); 8599 if (!eap->cert.pin) 8600 return -1; 8601 eap->pending_req_pin = 0; 8602 if (ssid == wpa_s->current_ssid) 8603 wpa_s->reassociate = 1; 8604 break; 8605 case WPA_CTRL_REQ_EAP_OTP: 8606 bin_clear_free(eap->otp, eap->otp_len); 8607 eap->otp = (u8 *) os_strdup(value); 8608 if (!eap->otp) 8609 return -1; 8610 eap->otp_len = os_strlen(value); 8611 os_free(eap->pending_req_otp); 8612 eap->pending_req_otp = NULL; 8613 eap->pending_req_otp_len = 0; 8614 break; 8615 case WPA_CTRL_REQ_EAP_PASSPHRASE: 8616 str_clear_free(eap->cert.private_key_passwd); 8617 eap->cert.private_key_passwd = os_strdup(value); 8618 if (!eap->cert.private_key_passwd) 8619 return -1; 8620 eap->pending_req_passphrase = 0; 8621 if (ssid == wpa_s->current_ssid) 8622 wpa_s->reassociate = 1; 8623 break; 8624 case WPA_CTRL_REQ_SIM: 8625 str_clear_free(eap->external_sim_resp); 8626 eap->external_sim_resp = os_strdup(value); 8627 if (!eap->external_sim_resp) 8628 return -1; 8629 eap->pending_req_sim = 0; 8630 break; 8631 case WPA_CTRL_REQ_PSK_PASSPHRASE: 8632 if (wpa_config_set(ssid, "psk", value, 0) < 0) 8633 return -1; 8634 ssid->mem_only_psk = 1; 8635 if (ssid->passphrase) 8636 wpa_config_update_psk(ssid); 8637 if (wpa_s->wpa_state == WPA_SCANNING && !wpa_s->scanning) 8638 wpa_supplicant_req_scan(wpa_s, 0, 0); 8639 break; 8640 case WPA_CTRL_REQ_EXT_CERT_CHECK: 8641 if (eap->pending_ext_cert_check != PENDING_CHECK) 8642 return -1; 8643 if (os_strcmp(value, "good") == 0) 8644 eap->pending_ext_cert_check = EXT_CERT_CHECK_GOOD; 8645 else if (os_strcmp(value, "bad") == 0) 8646 eap->pending_ext_cert_check = EXT_CERT_CHECK_BAD; 8647 else 8648 return -1; 8649 break; 8650 default: 8651 wpa_printf(MSG_DEBUG, "CTRL_IFACE: Unknown field '%s'", field); 8652 return -1; 8653 } 8654 8655 return 0; 8656 #else /* IEEE8021X_EAPOL */ 8657 wpa_printf(MSG_DEBUG, "CTRL_IFACE: IEEE 802.1X not included"); 8658 return -1; 8659 #endif /* IEEE8021X_EAPOL */ 8660 } 8661 #endif /* CONFIG_CTRL_IFACE || CONFIG_CTRL_IFACE_DBUS_NEW */ 8662 8663 8664 int wpas_network_disabled(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid) 8665 { 8666 #ifdef CONFIG_WEP 8667 int i; 8668 unsigned int drv_enc; 8669 #endif /* CONFIG_WEP */ 8670 8671 if (wpa_s->p2p_mgmt) 8672 return 1; /* no normal network profiles on p2p_mgmt interface */ 8673 8674 if (ssid == NULL) 8675 return 1; 8676 8677 if (ssid->disabled) 8678 return 1; 8679 8680 #ifdef CONFIG_WEP 8681 if (wpa_s->drv_capa_known) 8682 drv_enc = wpa_s->drv_enc; 8683 else 8684 drv_enc = (unsigned int) -1; 8685 8686 for (i = 0; i < NUM_WEP_KEYS; i++) { 8687 size_t len = ssid->wep_key_len[i]; 8688 if (len == 0) 8689 continue; 8690 if (len == 5 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP40)) 8691 continue; 8692 if (len == 13 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP104)) 8693 continue; 8694 if (len == 16 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP128)) 8695 continue; 8696 return 1; /* invalid WEP key */ 8697 } 8698 #endif /* CONFIG_WEP */ 8699 8700 if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt) && !ssid->psk_set && 8701 (!ssid->passphrase || ssid->ssid_len != 0) && !ssid->ext_psk && 8702 !(wpa_key_mgmt_sae(ssid->key_mgmt) && ssid->sae_password) && 8703 !ssid->mem_only_psk) 8704 return 1; 8705 8706 #ifdef IEEE8021X_EAPOL 8707 #ifdef CRYPTO_RSA_OAEP_SHA256 8708 if (ssid->eap.imsi_privacy_cert) { 8709 struct crypto_rsa_key *key; 8710 bool failed = false; 8711 8712 key = crypto_rsa_key_read(ssid->eap.imsi_privacy_cert, false); 8713 if (!key) 8714 failed = true; 8715 crypto_rsa_key_free(key); 8716 if (failed) { 8717 wpa_printf(MSG_DEBUG, 8718 "Invalid imsi_privacy_cert (%s) - disable network", 8719 ssid->eap.imsi_privacy_cert); 8720 return 1; 8721 } 8722 } 8723 #endif /* CRYPTO_RSA_OAEP_SHA256 */ 8724 #endif /* IEEE8021X_EAPOL */ 8725 8726 return 0; 8727 } 8728 8729 8730 int wpas_get_ssid_pmf(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid) 8731 { 8732 if (ssid == NULL || ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT) { 8733 if (wpa_s->conf->pmf == MGMT_FRAME_PROTECTION_OPTIONAL && 8734 !(wpa_s->drv_enc & WPA_DRIVER_CAPA_ENC_BIP)) { 8735 /* 8736 * Driver does not support BIP -- ignore pmf=1 default 8737 * since the connection with PMF would fail and the 8738 * configuration does not require PMF to be enabled. 8739 */ 8740 return NO_MGMT_FRAME_PROTECTION; 8741 } 8742 8743 if (ssid && 8744 (ssid->key_mgmt & 8745 ~(WPA_KEY_MGMT_NONE | WPA_KEY_MGMT_WPS | 8746 WPA_KEY_MGMT_IEEE8021X_NO_WPA)) == 0) { 8747 /* 8748 * Do not use the default PMF value for non-RSN networks 8749 * since PMF is available only with RSN and pmf=2 8750 * configuration would otherwise prevent connections to 8751 * all open networks. 8752 */ 8753 return NO_MGMT_FRAME_PROTECTION; 8754 } 8755 8756 #ifdef CONFIG_OCV 8757 /* Enable PMF if OCV is being enabled */ 8758 if (wpa_s->conf->pmf == NO_MGMT_FRAME_PROTECTION && 8759 ssid && ssid->ocv) 8760 return MGMT_FRAME_PROTECTION_OPTIONAL; 8761 #endif /* CONFIG_OCV */ 8762 8763 return wpa_s->conf->pmf; 8764 } 8765 8766 return ssid->ieee80211w; 8767 } 8768 8769 8770 #ifdef CONFIG_SAE 8771 bool wpas_is_sae_avoided(struct wpa_supplicant *wpa_s, 8772 struct wpa_ssid *ssid, 8773 const struct wpa_ie_data *ie) 8774 { 8775 return wpa_s->conf->sae_check_mfp && 8776 (!(ie->capabilities & 8777 (WPA_CAPABILITY_MFPC | WPA_CAPABILITY_MFPR)) || 8778 wpas_get_ssid_pmf(wpa_s, ssid) == NO_MGMT_FRAME_PROTECTION); 8779 } 8780 #endif /* CONFIG_SAE */ 8781 8782 8783 int pmf_in_use(struct wpa_supplicant *wpa_s, const u8 *addr) 8784 { 8785 if (wpa_s->current_ssid == NULL || 8786 wpa_s->wpa_state < WPA_4WAY_HANDSHAKE) 8787 return 0; 8788 if (wpa_s->valid_links) { 8789 if (!ether_addr_equal(addr, wpa_s->ap_mld_addr) && 8790 !wpas_ap_link_address(wpa_s, addr)) 8791 return 0; 8792 } else { 8793 if (!ether_addr_equal(addr, wpa_s->bssid)) 8794 return 0; 8795 } 8796 return wpa_sm_pmf_enabled(wpa_s->wpa); 8797 } 8798 8799 8800 int wpas_is_p2p_prioritized(struct wpa_supplicant *wpa_s) 8801 { 8802 if (wpa_s->global->conc_pref == WPA_CONC_PREF_P2P) 8803 return 1; 8804 if (wpa_s->global->conc_pref == WPA_CONC_PREF_STA) 8805 return 0; 8806 return -1; 8807 } 8808 8809 8810 void wpas_auth_failed(struct wpa_supplicant *wpa_s, const char *reason, 8811 const u8 *bssid) 8812 { 8813 struct wpa_ssid *ssid = wpa_s->current_ssid; 8814 int dur; 8815 struct os_reltime now; 8816 8817 if (ssid == NULL) { 8818 wpa_printf(MSG_DEBUG, "Authentication failure but no known " 8819 "SSID block"); 8820 return; 8821 } 8822 8823 if (ssid->key_mgmt == WPA_KEY_MGMT_WPS) 8824 return; 8825 8826 ssid->auth_failures++; 8827 8828 #ifdef CONFIG_P2P 8829 if (ssid->p2p_group && 8830 (wpa_s->p2p_in_provisioning || wpa_s->show_group_started)) { 8831 /* 8832 * Skip the wait time since there is a short timeout on the 8833 * connection to a P2P group. 8834 */ 8835 return; 8836 } 8837 #endif /* CONFIG_P2P */ 8838 8839 if (ssid->auth_failures > 50) 8840 dur = 300; 8841 else if (ssid->auth_failures > 10) 8842 dur = 120; 8843 else if (ssid->auth_failures > 5) 8844 dur = 90; 8845 else if (ssid->auth_failures > 3) 8846 dur = 60; 8847 else if (ssid->auth_failures > 2) 8848 dur = 30; 8849 else if (ssid->auth_failures > 1) 8850 dur = 20; 8851 else 8852 dur = 10; 8853 8854 if (ssid->auth_failures > 1 && 8855 wpa_key_mgmt_wpa_ieee8021x(ssid->key_mgmt)) 8856 dur += os_random() % (ssid->auth_failures * 10); 8857 8858 os_get_reltime(&now); 8859 if (now.sec + dur <= ssid->disabled_until.sec) 8860 return; 8861 8862 ssid->disabled_until.sec = now.sec + dur; 8863 8864 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TEMP_DISABLED 8865 "id=%d ssid=\"%s\" auth_failures=%u duration=%d reason=%s", 8866 ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len), 8867 ssid->auth_failures, dur, reason); 8868 8869 if (bssid) 8870 os_memcpy(ssid->disabled_due_to, bssid, ETH_ALEN); 8871 } 8872 8873 8874 void wpas_clear_temp_disabled(struct wpa_supplicant *wpa_s, 8875 struct wpa_ssid *ssid, int clear_failures) 8876 { 8877 if (ssid == NULL) 8878 return; 8879 8880 if (ssid->disabled_until.sec) { 8881 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_REENABLED 8882 "id=%d ssid=\"%s\"", 8883 ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len)); 8884 } 8885 ssid->disabled_until.sec = 0; 8886 ssid->disabled_until.usec = 0; 8887 if (clear_failures) { 8888 ssid->auth_failures = 0; 8889 } else if (!is_zero_ether_addr(ssid->disabled_due_to)) { 8890 wpa_printf(MSG_DEBUG, "Mark BSSID " MACSTR 8891 " ignored to allow a lower priority BSS, if any, to be tried next", 8892 MAC2STR(ssid->disabled_due_to)); 8893 wpa_bssid_ignore_add(wpa_s, ssid->disabled_due_to); 8894 os_memset(ssid->disabled_due_to, 0, ETH_ALEN); 8895 } 8896 } 8897 8898 8899 int disallowed_bssid(struct wpa_supplicant *wpa_s, const u8 *bssid) 8900 { 8901 size_t i; 8902 8903 if (wpa_s->disallow_aps_bssid == NULL) 8904 return 0; 8905 8906 for (i = 0; i < wpa_s->disallow_aps_bssid_count; i++) { 8907 if (ether_addr_equal(wpa_s->disallow_aps_bssid + i * ETH_ALEN, 8908 bssid)) 8909 return 1; 8910 } 8911 8912 return 0; 8913 } 8914 8915 8916 int disallowed_ssid(struct wpa_supplicant *wpa_s, const u8 *ssid, 8917 size_t ssid_len) 8918 { 8919 size_t i; 8920 8921 if (wpa_s->disallow_aps_ssid == NULL || ssid == NULL) 8922 return 0; 8923 8924 for (i = 0; i < wpa_s->disallow_aps_ssid_count; i++) { 8925 struct wpa_ssid_value *s = &wpa_s->disallow_aps_ssid[i]; 8926 if (ssid_len == s->ssid_len && 8927 os_memcmp(ssid, s->ssid, ssid_len) == 0) 8928 return 1; 8929 } 8930 8931 return 0; 8932 } 8933 8934 8935 /** 8936 * wpas_request_connection - Request a new connection 8937 * @wpa_s: Pointer to the network interface 8938 * 8939 * This function is used to request a new connection to be found. It will mark 8940 * the interface to allow reassociation and request a new scan to find a 8941 * suitable network to connect to. 8942 */ 8943 void wpas_request_connection(struct wpa_supplicant *wpa_s) 8944 { 8945 wpa_s->normal_scans = 0; 8946 wpa_s->scan_req = NORMAL_SCAN_REQ; 8947 wpa_supplicant_reinit_autoscan(wpa_s); 8948 wpa_s->disconnected = 0; 8949 wpa_s->reassociate = 1; 8950 wpa_s->last_owe_group = 0; 8951 8952 if (wpa_supplicant_fast_associate(wpa_s) != 1) 8953 wpa_supplicant_req_scan(wpa_s, 0, 0); 8954 else 8955 wpa_s->reattach = 0; 8956 } 8957 8958 8959 /** 8960 * wpas_request_disconnection - Request disconnection 8961 * @wpa_s: Pointer to the network interface 8962 * 8963 * This function is used to request disconnection from the currently connected 8964 * network. This will stop any ongoing scans and initiate deauthentication. 8965 */ 8966 void wpas_request_disconnection(struct wpa_supplicant *wpa_s) 8967 { 8968 #ifdef CONFIG_SME 8969 wpa_s->sme.prev_bssid_set = 0; 8970 #endif /* CONFIG_SME */ 8971 wpa_s->reassociate = 0; 8972 wpa_s->disconnected = 1; 8973 wpa_supplicant_cancel_sched_scan(wpa_s); 8974 wpa_supplicant_cancel_scan(wpa_s); 8975 wpas_abort_ongoing_scan(wpa_s); 8976 wpa_supplicant_deauthenticate(wpa_s, WLAN_REASON_DEAUTH_LEAVING); 8977 eloop_cancel_timeout(wpas_network_reenabled, wpa_s, NULL); 8978 radio_remove_works(wpa_s, "connect", 0); 8979 radio_remove_works(wpa_s, "sme-connect", 0); 8980 wpa_s->roam_in_progress = false; 8981 #ifdef CONFIG_WNM 8982 wpa_s->bss_trans_mgmt_in_progress = false; 8983 #endif /* CONFIG_WNM */ 8984 } 8985 8986 8987 void dump_freq_data(struct wpa_supplicant *wpa_s, const char *title, 8988 struct wpa_used_freq_data *freqs_data, 8989 unsigned int len) 8990 { 8991 unsigned int i; 8992 8993 wpa_dbg(wpa_s, MSG_DEBUG, "Shared frequencies (len=%u): %s", 8994 len, title); 8995 for (i = 0; i < len; i++) { 8996 struct wpa_used_freq_data *cur = &freqs_data[i]; 8997 wpa_dbg(wpa_s, MSG_DEBUG, "freq[%u]: %d, flags=0x%X", 8998 i, cur->freq, cur->flags); 8999 } 9000 } 9001 9002 9003 /* 9004 * Find the operating frequencies of any of the virtual interfaces that 9005 * are using the same radio as the current interface, and in addition, get 9006 * information about the interface types that are using the frequency. 9007 */ 9008 int get_shared_radio_freqs_data(struct wpa_supplicant *wpa_s, 9009 struct wpa_used_freq_data *freqs_data, 9010 unsigned int len, bool exclude_current) 9011 { 9012 struct wpa_supplicant *ifs; 9013 u8 bssid[ETH_ALEN]; 9014 int freq; 9015 unsigned int idx = 0, i; 9016 9017 wpa_dbg(wpa_s, MSG_DEBUG, 9018 "Determining shared radio frequencies (max len %u)", len); 9019 os_memset(freqs_data, 0, sizeof(struct wpa_used_freq_data) * len); 9020 9021 dl_list_for_each(ifs, &wpa_s->radio->ifaces, struct wpa_supplicant, 9022 radio_list) { 9023 if (idx == len) 9024 break; 9025 9026 if (exclude_current && ifs == wpa_s) 9027 continue; 9028 9029 if (ifs->current_ssid == NULL || ifs->assoc_freq == 0) 9030 continue; 9031 9032 if (ifs->current_ssid->mode == WPAS_MODE_AP || 9033 ifs->current_ssid->mode == WPAS_MODE_P2P_GO || 9034 ifs->current_ssid->mode == WPAS_MODE_MESH) 9035 freq = ifs->current_ssid->frequency; 9036 else if (wpa_drv_get_bssid(ifs, bssid) == 0) 9037 freq = ifs->assoc_freq; 9038 else 9039 continue; 9040 9041 /* Hold only distinct freqs */ 9042 for (i = 0; i < idx; i++) 9043 if (freqs_data[i].freq == freq) 9044 break; 9045 9046 if (i == idx) 9047 freqs_data[idx++].freq = freq; 9048 9049 if (ifs->current_ssid->mode == WPAS_MODE_INFRA) { 9050 freqs_data[i].flags |= ifs->current_ssid->p2p_group ? 9051 WPA_FREQ_USED_BY_P2P_CLIENT : 9052 WPA_FREQ_USED_BY_INFRA_STATION; 9053 } 9054 } 9055 9056 dump_freq_data(wpa_s, "completed iteration", freqs_data, idx); 9057 return idx; 9058 } 9059 9060 9061 /* 9062 * Find the operating frequencies of any of the virtual interfaces that 9063 * are using the same radio as the current interface. 9064 */ 9065 int get_shared_radio_freqs(struct wpa_supplicant *wpa_s, 9066 int *freq_array, unsigned int len, 9067 bool exclude_current) 9068 { 9069 struct wpa_used_freq_data *freqs_data; 9070 int num, i; 9071 9072 os_memset(freq_array, 0, sizeof(int) * len); 9073 9074 freqs_data = os_calloc(len, sizeof(struct wpa_used_freq_data)); 9075 if (!freqs_data) 9076 return -1; 9077 9078 num = get_shared_radio_freqs_data(wpa_s, freqs_data, len, 9079 exclude_current); 9080 for (i = 0; i < num; i++) 9081 freq_array[i] = freqs_data[i].freq; 9082 9083 os_free(freqs_data); 9084 9085 return num; 9086 } 9087 9088 9089 struct wpa_supplicant * 9090 wpas_vendor_elem(struct wpa_supplicant *wpa_s, enum wpa_vendor_elem_frame frame) 9091 { 9092 switch (frame) { 9093 #ifdef CONFIG_P2P 9094 case VENDOR_ELEM_PROBE_REQ_P2P: 9095 case VENDOR_ELEM_PROBE_RESP_P2P: 9096 case VENDOR_ELEM_PROBE_RESP_P2P_GO: 9097 case VENDOR_ELEM_BEACON_P2P_GO: 9098 case VENDOR_ELEM_P2P_PD_REQ: 9099 case VENDOR_ELEM_P2P_PD_RESP: 9100 case VENDOR_ELEM_P2P_GO_NEG_REQ: 9101 case VENDOR_ELEM_P2P_GO_NEG_RESP: 9102 case VENDOR_ELEM_P2P_GO_NEG_CONF: 9103 case VENDOR_ELEM_P2P_INV_REQ: 9104 case VENDOR_ELEM_P2P_INV_RESP: 9105 case VENDOR_ELEM_P2P_ASSOC_REQ: 9106 case VENDOR_ELEM_P2P_ASSOC_RESP: 9107 return wpa_s->p2pdev; 9108 #endif /* CONFIG_P2P */ 9109 default: 9110 return wpa_s; 9111 } 9112 } 9113 9114 9115 void wpas_vendor_elem_update(struct wpa_supplicant *wpa_s) 9116 { 9117 unsigned int i; 9118 char buf[30]; 9119 9120 wpa_printf(MSG_DEBUG, "Update vendor elements"); 9121 9122 for (i = 0; i < NUM_VENDOR_ELEM_FRAMES; i++) { 9123 if (wpa_s->vendor_elem[i]) { 9124 int res; 9125 9126 res = os_snprintf(buf, sizeof(buf), "frame[%u]", i); 9127 if (!os_snprintf_error(sizeof(buf), res)) { 9128 wpa_hexdump_buf(MSG_DEBUG, buf, 9129 wpa_s->vendor_elem[i]); 9130 } 9131 } 9132 } 9133 9134 #ifdef CONFIG_P2P 9135 if (wpa_s->parent == wpa_s && 9136 wpa_s->global->p2p && 9137 !wpa_s->global->p2p_disabled) 9138 p2p_set_vendor_elems(wpa_s->global->p2p, wpa_s->vendor_elem); 9139 #endif /* CONFIG_P2P */ 9140 } 9141 9142 9143 int wpas_vendor_elem_remove(struct wpa_supplicant *wpa_s, int frame, 9144 const u8 *elem, size_t len) 9145 { 9146 u8 *ie, *end; 9147 9148 ie = wpabuf_mhead_u8(wpa_s->vendor_elem[frame]); 9149 end = ie + wpabuf_len(wpa_s->vendor_elem[frame]); 9150 9151 for (; ie + 1 < end; ie += 2 + ie[1]) { 9152 if (ie + len > end) 9153 break; 9154 if (os_memcmp(ie, elem, len) != 0) 9155 continue; 9156 9157 if (wpabuf_len(wpa_s->vendor_elem[frame]) == len) { 9158 wpabuf_free(wpa_s->vendor_elem[frame]); 9159 wpa_s->vendor_elem[frame] = NULL; 9160 } else { 9161 os_memmove(ie, ie + len, end - (ie + len)); 9162 wpa_s->vendor_elem[frame]->used -= len; 9163 } 9164 wpas_vendor_elem_update(wpa_s); 9165 return 0; 9166 } 9167 9168 return -1; 9169 } 9170 9171 9172 struct hostapd_hw_modes * get_mode(struct hostapd_hw_modes *modes, 9173 u16 num_modes, enum hostapd_hw_mode mode, 9174 bool is_6ghz) 9175 { 9176 u16 i; 9177 9178 if (!modes) 9179 return NULL; 9180 9181 for (i = 0; i < num_modes; i++) { 9182 if (modes[i].mode != mode || 9183 !modes[i].num_channels || !modes[i].channels) 9184 continue; 9185 if (is_6ghz == modes[i].is_6ghz) 9186 return &modes[i]; 9187 } 9188 9189 return NULL; 9190 } 9191 9192 9193 struct hostapd_hw_modes * get_mode_with_freq(struct hostapd_hw_modes *modes, 9194 u16 num_modes, int freq) 9195 { 9196 int i, j; 9197 9198 for (i = 0; i < num_modes; i++) { 9199 for (j = 0; j < modes[i].num_channels; j++) { 9200 if (freq == modes[i].channels[j].freq) 9201 return &modes[i]; 9202 } 9203 } 9204 9205 return NULL; 9206 } 9207 9208 9209 static struct 9210 wpa_bss_tmp_disallowed * wpas_get_disallowed_bss(struct wpa_supplicant *wpa_s, 9211 const u8 *bssid) 9212 { 9213 struct wpa_bss_tmp_disallowed *bss; 9214 9215 dl_list_for_each(bss, &wpa_s->bss_tmp_disallowed, 9216 struct wpa_bss_tmp_disallowed, list) { 9217 if (ether_addr_equal(bssid, bss->bssid)) 9218 return bss; 9219 } 9220 9221 return NULL; 9222 } 9223 9224 9225 static int wpa_set_driver_tmp_disallow_list(struct wpa_supplicant *wpa_s) 9226 { 9227 struct wpa_bss_tmp_disallowed *tmp; 9228 unsigned int num_bssid = 0; 9229 u8 *bssids; 9230 int ret; 9231 9232 bssids = os_malloc(dl_list_len(&wpa_s->bss_tmp_disallowed) * ETH_ALEN); 9233 if (!bssids) 9234 return -1; 9235 dl_list_for_each(tmp, &wpa_s->bss_tmp_disallowed, 9236 struct wpa_bss_tmp_disallowed, list) { 9237 os_memcpy(&bssids[num_bssid * ETH_ALEN], tmp->bssid, 9238 ETH_ALEN); 9239 num_bssid++; 9240 } 9241 ret = wpa_drv_set_bssid_tmp_disallow(wpa_s, num_bssid, bssids); 9242 os_free(bssids); 9243 return ret; 9244 } 9245 9246 9247 static void wpa_bss_tmp_disallow_timeout(void *eloop_ctx, void *timeout_ctx) 9248 { 9249 struct wpa_supplicant *wpa_s = eloop_ctx; 9250 struct wpa_bss_tmp_disallowed *tmp, *bss = timeout_ctx; 9251 9252 /* Make sure the bss is not already freed */ 9253 dl_list_for_each(tmp, &wpa_s->bss_tmp_disallowed, 9254 struct wpa_bss_tmp_disallowed, list) { 9255 if (bss == tmp) { 9256 remove_bss_tmp_disallowed_entry(wpa_s, tmp); 9257 wpa_set_driver_tmp_disallow_list(wpa_s); 9258 break; 9259 } 9260 } 9261 } 9262 9263 9264 void wpa_bss_tmp_disallow(struct wpa_supplicant *wpa_s, const u8 *bssid, 9265 unsigned int sec, int rssi_threshold) 9266 { 9267 struct wpa_bss_tmp_disallowed *bss; 9268 9269 bss = wpas_get_disallowed_bss(wpa_s, bssid); 9270 if (bss) { 9271 eloop_cancel_timeout(wpa_bss_tmp_disallow_timeout, wpa_s, bss); 9272 goto finish; 9273 } 9274 9275 bss = os_malloc(sizeof(*bss)); 9276 if (!bss) { 9277 wpa_printf(MSG_DEBUG, 9278 "Failed to allocate memory for temp disallow BSS"); 9279 return; 9280 } 9281 9282 os_memcpy(bss->bssid, bssid, ETH_ALEN); 9283 dl_list_add(&wpa_s->bss_tmp_disallowed, &bss->list); 9284 wpa_set_driver_tmp_disallow_list(wpa_s); 9285 9286 finish: 9287 bss->rssi_threshold = rssi_threshold; 9288 eloop_register_timeout(sec, 0, wpa_bss_tmp_disallow_timeout, 9289 wpa_s, bss); 9290 } 9291 9292 9293 int wpa_is_bss_tmp_disallowed(struct wpa_supplicant *wpa_s, 9294 struct wpa_bss *bss) 9295 { 9296 struct wpa_bss_tmp_disallowed *disallowed = NULL, *tmp, *prev; 9297 9298 dl_list_for_each_safe(tmp, prev, &wpa_s->bss_tmp_disallowed, 9299 struct wpa_bss_tmp_disallowed, list) { 9300 if (ether_addr_equal(bss->bssid, tmp->bssid)) { 9301 disallowed = tmp; 9302 break; 9303 } 9304 } 9305 if (!disallowed) 9306 return 0; 9307 9308 if (disallowed->rssi_threshold != 0 && 9309 bss->level > disallowed->rssi_threshold) { 9310 remove_bss_tmp_disallowed_entry(wpa_s, disallowed); 9311 wpa_set_driver_tmp_disallow_list(wpa_s); 9312 return 0; 9313 } 9314 9315 return 1; 9316 } 9317 9318 9319 int wpas_enable_mac_addr_randomization(struct wpa_supplicant *wpa_s, 9320 unsigned int type, const u8 *addr, 9321 const u8 *mask) 9322 { 9323 if ((addr && !mask) || (!addr && mask)) { 9324 wpa_printf(MSG_INFO, 9325 "MAC_ADDR_RAND_SCAN invalid addr/mask combination"); 9326 return -1; 9327 } 9328 9329 if (addr && mask && (!(mask[0] & 0x01) || (addr[0] & 0x01))) { 9330 wpa_printf(MSG_INFO, 9331 "MAC_ADDR_RAND_SCAN cannot allow multicast address"); 9332 return -1; 9333 } 9334 9335 if (type & MAC_ADDR_RAND_SCAN) { 9336 if (wpas_mac_addr_rand_scan_set(wpa_s, MAC_ADDR_RAND_SCAN, 9337 addr, mask)) 9338 return -1; 9339 } 9340 9341 if (type & MAC_ADDR_RAND_SCHED_SCAN) { 9342 if (wpas_mac_addr_rand_scan_set(wpa_s, MAC_ADDR_RAND_SCHED_SCAN, 9343 addr, mask)) 9344 return -1; 9345 9346 if (wpa_s->sched_scanning && !wpa_s->pno) 9347 wpas_scan_restart_sched_scan(wpa_s); 9348 } 9349 9350 if (type & MAC_ADDR_RAND_PNO) { 9351 if (wpas_mac_addr_rand_scan_set(wpa_s, MAC_ADDR_RAND_PNO, 9352 addr, mask)) 9353 return -1; 9354 9355 if (wpa_s->pno) { 9356 wpas_stop_pno(wpa_s); 9357 wpas_start_pno(wpa_s); 9358 } 9359 } 9360 9361 return 0; 9362 } 9363 9364 9365 int wpas_disable_mac_addr_randomization(struct wpa_supplicant *wpa_s, 9366 unsigned int type) 9367 { 9368 wpas_mac_addr_rand_scan_clear(wpa_s, type); 9369 if (wpa_s->pno) { 9370 if (type & MAC_ADDR_RAND_PNO) { 9371 wpas_stop_pno(wpa_s); 9372 wpas_start_pno(wpa_s); 9373 } 9374 } else if (wpa_s->sched_scanning && (type & MAC_ADDR_RAND_SCHED_SCAN)) { 9375 wpas_scan_restart_sched_scan(wpa_s); 9376 } 9377 9378 return 0; 9379 } 9380 9381 9382 int wpa_drv_signal_poll(struct wpa_supplicant *wpa_s, 9383 struct wpa_signal_info *si) 9384 { 9385 int res; 9386 9387 if (!wpa_s->driver->signal_poll) 9388 return -1; 9389 9390 res = wpa_s->driver->signal_poll(wpa_s->drv_priv, si); 9391 9392 #ifdef CONFIG_TESTING_OPTIONS 9393 if (res == 0) { 9394 struct driver_signal_override *dso; 9395 9396 dl_list_for_each(dso, &wpa_s->drv_signal_override, 9397 struct driver_signal_override, list) { 9398 if (!ether_addr_equal(wpa_s->bssid, dso->bssid)) 9399 continue; 9400 wpa_printf(MSG_DEBUG, 9401 "Override driver signal_poll information: current_signal: %d->%d avg_signal: %d->%d avg_beacon_signal: %d->%d current_noise: %d->%d", 9402 si->data.signal, 9403 dso->si_current_signal, 9404 si->data.avg_signal, 9405 dso->si_avg_signal, 9406 si->data.avg_beacon_signal, 9407 dso->si_avg_beacon_signal, 9408 si->current_noise, 9409 dso->si_current_noise); 9410 si->data.signal = dso->si_current_signal; 9411 si->data.avg_signal = dso->si_avg_signal; 9412 si->data.avg_beacon_signal = dso->si_avg_beacon_signal; 9413 si->current_noise = dso->si_current_noise; 9414 break; 9415 } 9416 } 9417 #endif /* CONFIG_TESTING_OPTIONS */ 9418 9419 return res; 9420 } 9421 9422 9423 struct wpa_scan_results * 9424 wpa_drv_get_scan_results(struct wpa_supplicant *wpa_s, const u8 *bssid) 9425 { 9426 struct wpa_scan_results *scan_res; 9427 #ifdef CONFIG_TESTING_OPTIONS 9428 size_t idx; 9429 #endif /* CONFIG_TESTING_OPTIONS */ 9430 9431 if (wpa_s->driver->get_scan_results) 9432 scan_res = wpa_s->driver->get_scan_results(wpa_s->drv_priv, 9433 bssid); 9434 else if (wpa_s->driver->get_scan_results2) 9435 scan_res = wpa_s->driver->get_scan_results2(wpa_s->drv_priv); 9436 else 9437 return NULL; 9438 9439 9440 #ifdef CONFIG_TESTING_OPTIONS 9441 for (idx = 0; scan_res && idx < scan_res->num; idx++) { 9442 struct driver_signal_override *dso; 9443 struct wpa_scan_res *res = scan_res->res[idx]; 9444 9445 dl_list_for_each(dso, &wpa_s->drv_signal_override, 9446 struct driver_signal_override, list) { 9447 if (!ether_addr_equal(res->bssid, dso->bssid)) 9448 continue; 9449 wpa_printf(MSG_DEBUG, 9450 "Override driver scan signal level %d->%d for " 9451 MACSTR, 9452 res->level, dso->scan_level, 9453 MAC2STR(res->bssid)); 9454 res->flags |= WPA_SCAN_QUAL_INVALID; 9455 if (dso->scan_level < 0) 9456 res->flags |= WPA_SCAN_LEVEL_DBM; 9457 else 9458 res->flags &= ~WPA_SCAN_LEVEL_DBM; 9459 res->level = dso->scan_level; 9460 break; 9461 } 9462 } 9463 #endif /* CONFIG_TESTING_OPTIONS */ 9464 9465 return scan_res; 9466 } 9467 9468 9469 bool wpas_ap_link_address(struct wpa_supplicant *wpa_s, const u8 *addr) 9470 { 9471 int i; 9472 9473 if (!wpa_s->valid_links) 9474 return false; 9475 9476 for_each_link(wpa_s->valid_links, i) { 9477 if (ether_addr_equal(wpa_s->links[i].bssid, addr)) 9478 return true; 9479 } 9480 9481 return false; 9482 } 9483 9484 9485 int wpa_drv_send_action(struct wpa_supplicant *wpa_s, unsigned int freq, 9486 unsigned int wait, const u8 *dst, const u8 *src, 9487 const u8 *bssid, const u8 *data, size_t data_len, 9488 int no_cck) 9489 { 9490 if (!wpa_s->driver->send_action) 9491 return -1; 9492 9493 if (data_len > 0 && data[0] != WLAN_ACTION_PUBLIC) { 9494 if (wpas_ap_link_address(wpa_s, dst)) 9495 dst = wpa_s->ap_mld_addr; 9496 9497 if (wpas_ap_link_address(wpa_s, bssid)) 9498 bssid = wpa_s->ap_mld_addr; 9499 } 9500 9501 return wpa_s->driver->send_action(wpa_s->drv_priv, freq, wait, dst, src, 9502 bssid, data, data_len, no_cck); 9503 } 9504 9505 9506 bool wpas_is_6ghz_supported(struct wpa_supplicant *wpa_s, bool only_enabled) 9507 { 9508 struct hostapd_channel_data *chnl; 9509 int i, j; 9510 9511 for (i = 0; i < wpa_s->hw.num_modes; i++) { 9512 if (wpa_s->hw.modes[i].mode == HOSTAPD_MODE_IEEE80211A) { 9513 chnl = wpa_s->hw.modes[i].channels; 9514 for (j = 0; j < wpa_s->hw.modes[i].num_channels; j++) { 9515 if (only_enabled && 9516 (chnl[j].flag & HOSTAPD_CHAN_DISABLED)) 9517 continue; 9518 if (is_6ghz_freq(chnl[j].freq)) 9519 return true; 9520 } 9521 } 9522 } 9523 9524 return false; 9525 } 9526