Home | History | Annotate | Download | only in wpa_supplicant
      1 /*
      2  * WPA Supplicant
      3  * Copyright (c) 2003-2017, Jouni Malinen <j (at) 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/random.h"
     21 #include "crypto/sha1.h"
     22 #include "eapol_supp/eapol_supp_sm.h"
     23 #include "eap_peer/eap.h"
     24 #include "eap_peer/eap_proxy.h"
     25 #include "eap_server/eap_methods.h"
     26 #include "rsn_supp/wpa.h"
     27 #include "eloop.h"
     28 #include "config.h"
     29 #include "utils/ext_password.h"
     30 #include "l2_packet/l2_packet.h"
     31 #include "wpa_supplicant_i.h"
     32 #include "driver_i.h"
     33 #include "ctrl_iface.h"
     34 #include "pcsc_funcs.h"
     35 #include "common/version.h"
     36 #include "rsn_supp/preauth.h"
     37 #include "rsn_supp/pmksa_cache.h"
     38 #include "common/wpa_ctrl.h"
     39 #include "common/ieee802_11_defs.h"
     40 #include "common/hw_features_common.h"
     41 #include "common/gas_server.h"
     42 #include "p2p/p2p.h"
     43 #include "fst/fst.h"
     44 #include "blacklist.h"
     45 #include "wpas_glue.h"
     46 #include "wps_supplicant.h"
     47 #include "ibss_rsn.h"
     48 #include "sme.h"
     49 #include "gas_query.h"
     50 #include "ap.h"
     51 #include "p2p_supplicant.h"
     52 #include "wifi_display.h"
     53 #include "notify.h"
     54 #include "bgscan.h"
     55 #include "autoscan.h"
     56 #include "bss.h"
     57 #include "scan.h"
     58 #include "offchannel.h"
     59 #include "hs20_supplicant.h"
     60 #include "wnm_sta.h"
     61 #include "wpas_kay.h"
     62 #include "mesh.h"
     63 #include "dpp_supplicant.h"
     64 #ifdef CONFIG_MESH
     65 #include "ap/ap_config.h"
     66 #include "ap/hostapd.h"
     67 #endif /* CONFIG_MESH */
     68 
     69 const char *const wpa_supplicant_version =
     70 "wpa_supplicant v" VERSION_STR "\n"
     71 "Copyright (c) 2003-2017, Jouni Malinen <j (at) w1.fi> and contributors";
     72 
     73 const char *const wpa_supplicant_license =
     74 "This software may be distributed under the terms of the BSD license.\n"
     75 "See README for more details.\n"
     76 #ifdef EAP_TLS_OPENSSL
     77 "\nThis product includes software developed by the OpenSSL Project\n"
     78 "for use in the OpenSSL Toolkit (http://www.openssl.org/)\n"
     79 #endif /* EAP_TLS_OPENSSL */
     80 ;
     81 
     82 #ifndef CONFIG_NO_STDOUT_DEBUG
     83 /* Long text divided into parts in order to fit in C89 strings size limits. */
     84 const char *const wpa_supplicant_full_license1 =
     85 "";
     86 const char *const wpa_supplicant_full_license2 =
     87 "This software may be distributed under the terms of the BSD license.\n"
     88 "\n"
     89 "Redistribution and use in source and binary forms, with or without\n"
     90 "modification, are permitted provided that the following conditions are\n"
     91 "met:\n"
     92 "\n";
     93 const char *const wpa_supplicant_full_license3 =
     94 "1. Redistributions of source code must retain the above copyright\n"
     95 "   notice, this list of conditions and the following disclaimer.\n"
     96 "\n"
     97 "2. Redistributions in binary form must reproduce the above copyright\n"
     98 "   notice, this list of conditions and the following disclaimer in the\n"
     99 "   documentation and/or other materials provided with the distribution.\n"
    100 "\n";
    101 const char *const wpa_supplicant_full_license4 =
    102 "3. Neither the name(s) of the above-listed copyright holder(s) nor the\n"
    103 "   names of its contributors may be used to endorse or promote products\n"
    104 "   derived from this software without specific prior written permission.\n"
    105 "\n"
    106 "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
    107 "\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
    108 "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
    109 "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n";
    110 const char *const wpa_supplicant_full_license5 =
    111 "OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
    112 "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
    113 "LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
    114 "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
    115 "THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
    116 "(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
    117 "OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
    118 "\n";
    119 #endif /* CONFIG_NO_STDOUT_DEBUG */
    120 
    121 
    122 static void wpa_bss_tmp_disallow_timeout(void *eloop_ctx, void *timeout_ctx);
    123 #if defined(CONFIG_FILS) && defined(IEEE8021X_EAPOL)
    124 static void wpas_update_fils_connect_params(struct wpa_supplicant *wpa_s);
    125 #endif /* CONFIG_FILS && IEEE8021X_EAPOL */
    126 
    127 
    128 /* Configure default/group WEP keys for static WEP */
    129 int wpa_set_wep_keys(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
    130 {
    131 	int i, set = 0;
    132 
    133 	for (i = 0; i < NUM_WEP_KEYS; i++) {
    134 		if (ssid->wep_key_len[i] == 0)
    135 			continue;
    136 
    137 		set = 1;
    138 		wpa_drv_set_key(wpa_s, WPA_ALG_WEP, NULL,
    139 				i, i == ssid->wep_tx_keyidx, NULL, 0,
    140 				ssid->wep_key[i], ssid->wep_key_len[i]);
    141 	}
    142 
    143 	return set;
    144 }
    145 
    146 
    147 int wpa_supplicant_set_wpa_none_key(struct wpa_supplicant *wpa_s,
    148 				    struct wpa_ssid *ssid)
    149 {
    150 	u8 key[32];
    151 	size_t keylen;
    152 	enum wpa_alg alg;
    153 	u8 seq[6] = { 0 };
    154 	int ret;
    155 
    156 	/* IBSS/WPA-None uses only one key (Group) for both receiving and
    157 	 * sending unicast and multicast packets. */
    158 
    159 	if (ssid->mode != WPAS_MODE_IBSS) {
    160 		wpa_msg(wpa_s, MSG_INFO, "WPA: Invalid mode %d (not "
    161 			"IBSS/ad-hoc) for WPA-None", ssid->mode);
    162 		return -1;
    163 	}
    164 
    165 	if (!ssid->psk_set) {
    166 		wpa_msg(wpa_s, MSG_INFO, "WPA: No PSK configured for "
    167 			"WPA-None");
    168 		return -1;
    169 	}
    170 
    171 	switch (wpa_s->group_cipher) {
    172 	case WPA_CIPHER_CCMP:
    173 		os_memcpy(key, ssid->psk, 16);
    174 		keylen = 16;
    175 		alg = WPA_ALG_CCMP;
    176 		break;
    177 	case WPA_CIPHER_GCMP:
    178 		os_memcpy(key, ssid->psk, 16);
    179 		keylen = 16;
    180 		alg = WPA_ALG_GCMP;
    181 		break;
    182 	case WPA_CIPHER_TKIP:
    183 		/* WPA-None uses the same Michael MIC key for both TX and RX */
    184 		os_memcpy(key, ssid->psk, 16 + 8);
    185 		os_memcpy(key + 16 + 8, ssid->psk + 16, 8);
    186 		keylen = 32;
    187 		alg = WPA_ALG_TKIP;
    188 		break;
    189 	default:
    190 		wpa_msg(wpa_s, MSG_INFO, "WPA: Invalid group cipher %d for "
    191 			"WPA-None", wpa_s->group_cipher);
    192 		return -1;
    193 	}
    194 
    195 	/* TODO: should actually remember the previously used seq#, both for TX
    196 	 * and RX from each STA.. */
    197 
    198 	ret = wpa_drv_set_key(wpa_s, alg, NULL, 0, 1, seq, 6, key, keylen);
    199 	os_memset(key, 0, sizeof(key));
    200 	return ret;
    201 }
    202 
    203 
    204 static void wpa_supplicant_timeout(void *eloop_ctx, void *timeout_ctx)
    205 {
    206 	struct wpa_supplicant *wpa_s = eloop_ctx;
    207 	const u8 *bssid = wpa_s->bssid;
    208 	if (!is_zero_ether_addr(wpa_s->pending_bssid) &&
    209 	    (wpa_s->wpa_state == WPA_AUTHENTICATING ||
    210 	     wpa_s->wpa_state == WPA_ASSOCIATING))
    211 		bssid = wpa_s->pending_bssid;
    212 	wpa_msg(wpa_s, MSG_INFO, "Authentication with " MACSTR " timed out.",
    213 		MAC2STR(bssid));
    214 	wpa_blacklist_add(wpa_s, bssid);
    215 	wpa_sm_notify_disassoc(wpa_s->wpa);
    216 	wpa_supplicant_deauthenticate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
    217 	wpa_s->reassociate = 1;
    218 	wpas_notify_auth_timeout(wpa_s);
    219 
    220 	/*
    221 	 * If we timed out, the AP or the local radio may be busy.
    222 	 * So, wait a second until scanning again.
    223 	 */
    224 	wpa_supplicant_req_scan(wpa_s, 1, 0);
    225 }
    226 
    227 
    228 /**
    229  * wpa_supplicant_req_auth_timeout - Schedule a timeout for authentication
    230  * @wpa_s: Pointer to wpa_supplicant data
    231  * @sec: Number of seconds after which to time out authentication
    232  * @usec: Number of microseconds after which to time out authentication
    233  *
    234  * This function is used to schedule a timeout for the current authentication
    235  * attempt.
    236  */
    237 void wpa_supplicant_req_auth_timeout(struct wpa_supplicant *wpa_s,
    238 				     int sec, int usec)
    239 {
    240 	if (wpa_s->conf->ap_scan == 0 &&
    241 	    (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED))
    242 		return;
    243 
    244 	wpa_dbg(wpa_s, MSG_DEBUG, "Setting authentication timeout: %d sec "
    245 		"%d usec", sec, usec);
    246 	eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
    247 	eloop_register_timeout(sec, usec, wpa_supplicant_timeout, wpa_s, NULL);
    248 }
    249 
    250 
    251 /**
    252  * wpa_supplicant_cancel_auth_timeout - Cancel authentication timeout
    253  * @wpa_s: Pointer to wpa_supplicant data
    254  *
    255  * This function is used to cancel authentication timeout scheduled with
    256  * wpa_supplicant_req_auth_timeout() and it is called when authentication has
    257  * been completed.
    258  */
    259 void wpa_supplicant_cancel_auth_timeout(struct wpa_supplicant *wpa_s)
    260 {
    261 	wpa_dbg(wpa_s, MSG_DEBUG, "Cancelling authentication timeout");
    262 	eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
    263 	wpa_blacklist_del(wpa_s, wpa_s->bssid);
    264 }
    265 
    266 
    267 /**
    268  * wpa_supplicant_initiate_eapol - Configure EAPOL state machine
    269  * @wpa_s: Pointer to wpa_supplicant data
    270  *
    271  * This function is used to configure EAPOL state machine based on the selected
    272  * authentication mode.
    273  */
    274 void wpa_supplicant_initiate_eapol(struct wpa_supplicant *wpa_s)
    275 {
    276 #ifdef IEEE8021X_EAPOL
    277 	struct eapol_config eapol_conf;
    278 	struct wpa_ssid *ssid = wpa_s->current_ssid;
    279 
    280 #ifdef CONFIG_IBSS_RSN
    281 	if (ssid->mode == WPAS_MODE_IBSS &&
    282 	    wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
    283 	    wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
    284 		/*
    285 		 * RSN IBSS authentication is per-STA and we can disable the
    286 		 * per-BSSID EAPOL authentication.
    287 		 */
    288 		eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
    289 		eapol_sm_notify_eap_success(wpa_s->eapol, TRUE);
    290 		eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
    291 		return;
    292 	}
    293 #endif /* CONFIG_IBSS_RSN */
    294 
    295 	eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
    296 	eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
    297 
    298 	if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
    299 	    wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE)
    300 		eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
    301 	else
    302 		eapol_sm_notify_portControl(wpa_s->eapol, Auto);
    303 
    304 	os_memset(&eapol_conf, 0, sizeof(eapol_conf));
    305 	if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
    306 		eapol_conf.accept_802_1x_keys = 1;
    307 		eapol_conf.required_keys = 0;
    308 		if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_UNICAST) {
    309 			eapol_conf.required_keys |= EAPOL_REQUIRE_KEY_UNICAST;
    310 		}
    311 		if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_BROADCAST) {
    312 			eapol_conf.required_keys |=
    313 				EAPOL_REQUIRE_KEY_BROADCAST;
    314 		}
    315 
    316 		if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED)
    317 			eapol_conf.required_keys = 0;
    318 	}
    319 	eapol_conf.fast_reauth = wpa_s->conf->fast_reauth;
    320 	eapol_conf.workaround = ssid->eap_workaround;
    321 	eapol_conf.eap_disabled =
    322 		!wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) &&
    323 		wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA &&
    324 		wpa_s->key_mgmt != WPA_KEY_MGMT_WPS;
    325 	eapol_conf.external_sim = wpa_s->conf->external_sim;
    326 
    327 #ifdef CONFIG_WPS
    328 	if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) {
    329 		eapol_conf.wps |= EAPOL_LOCAL_WPS_IN_USE;
    330 		if (wpa_s->current_bss) {
    331 			struct wpabuf *ie;
    332 			ie = wpa_bss_get_vendor_ie_multi(wpa_s->current_bss,
    333 							 WPS_IE_VENDOR_TYPE);
    334 			if (ie) {
    335 				if (wps_is_20(ie))
    336 					eapol_conf.wps |=
    337 						EAPOL_PEER_IS_WPS20_AP;
    338 				wpabuf_free(ie);
    339 			}
    340 		}
    341 	}
    342 #endif /* CONFIG_WPS */
    343 
    344 	eapol_sm_notify_config(wpa_s->eapol, &ssid->eap, &eapol_conf);
    345 
    346 #ifdef CONFIG_MACSEC
    347 	if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE && ssid->mka_psk_set)
    348 		ieee802_1x_create_preshared_mka(wpa_s, ssid);
    349 	else
    350 		ieee802_1x_alloc_kay_sm(wpa_s, ssid);
    351 #endif /* CONFIG_MACSEC */
    352 #endif /* IEEE8021X_EAPOL */
    353 }
    354 
    355 
    356 /**
    357  * wpa_supplicant_set_non_wpa_policy - Set WPA parameters to non-WPA mode
    358  * @wpa_s: Pointer to wpa_supplicant data
    359  * @ssid: Configuration data for the network
    360  *
    361  * This function is used to configure WPA state machine and related parameters
    362  * to a mode where WPA is not enabled. This is called as part of the
    363  * authentication configuration when the selected network does not use WPA.
    364  */
    365 void wpa_supplicant_set_non_wpa_policy(struct wpa_supplicant *wpa_s,
    366 				       struct wpa_ssid *ssid)
    367 {
    368 	int i;
    369 
    370 	if (ssid->key_mgmt & WPA_KEY_MGMT_WPS)
    371 		wpa_s->key_mgmt = WPA_KEY_MGMT_WPS;
    372 	else if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA)
    373 		wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_NO_WPA;
    374 	else
    375 		wpa_s->key_mgmt = WPA_KEY_MGMT_NONE;
    376 	wpa_sm_set_ap_wpa_ie(wpa_s->wpa, NULL, 0);
    377 	wpa_sm_set_ap_rsn_ie(wpa_s->wpa, NULL, 0);
    378 	wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
    379 	wpa_s->pairwise_cipher = WPA_CIPHER_NONE;
    380 	wpa_s->group_cipher = WPA_CIPHER_NONE;
    381 	wpa_s->mgmt_group_cipher = 0;
    382 
    383 	for (i = 0; i < NUM_WEP_KEYS; i++) {
    384 		if (ssid->wep_key_len[i] > 5) {
    385 			wpa_s->pairwise_cipher = WPA_CIPHER_WEP104;
    386 			wpa_s->group_cipher = WPA_CIPHER_WEP104;
    387 			break;
    388 		} else if (ssid->wep_key_len[i] > 0) {
    389 			wpa_s->pairwise_cipher = WPA_CIPHER_WEP40;
    390 			wpa_s->group_cipher = WPA_CIPHER_WEP40;
    391 			break;
    392 		}
    393 	}
    394 
    395 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED, 0);
    396 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
    397 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
    398 			 wpa_s->pairwise_cipher);
    399 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
    400 #ifdef CONFIG_IEEE80211W
    401 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
    402 			 wpa_s->mgmt_group_cipher);
    403 #endif /* CONFIG_IEEE80211W */
    404 
    405 	pmksa_cache_clear_current(wpa_s->wpa);
    406 }
    407 
    408 
    409 void free_hw_features(struct wpa_supplicant *wpa_s)
    410 {
    411 	int i;
    412 	if (wpa_s->hw.modes == NULL)
    413 		return;
    414 
    415 	for (i = 0; i < wpa_s->hw.num_modes; i++) {
    416 		os_free(wpa_s->hw.modes[i].channels);
    417 		os_free(wpa_s->hw.modes[i].rates);
    418 	}
    419 
    420 	os_free(wpa_s->hw.modes);
    421 	wpa_s->hw.modes = NULL;
    422 }
    423 
    424 
    425 static void free_bss_tmp_disallowed(struct wpa_supplicant *wpa_s)
    426 {
    427 	struct wpa_bss_tmp_disallowed *bss, *prev;
    428 
    429 	dl_list_for_each_safe(bss, prev, &wpa_s->bss_tmp_disallowed,
    430 			      struct wpa_bss_tmp_disallowed, list) {
    431 		eloop_cancel_timeout(wpa_bss_tmp_disallow_timeout, wpa_s, bss);
    432 		dl_list_del(&bss->list);
    433 		os_free(bss);
    434 	}
    435 }
    436 
    437 
    438 void wpas_flush_fils_hlp_req(struct wpa_supplicant *wpa_s)
    439 {
    440 	struct fils_hlp_req *req;
    441 
    442 	while ((req = dl_list_first(&wpa_s->fils_hlp_req, struct fils_hlp_req,
    443 				    list)) != NULL) {
    444 		dl_list_del(&req->list);
    445 		wpabuf_free(req->pkt);
    446 		os_free(req);
    447 	}
    448 }
    449 
    450 
    451 static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s)
    452 {
    453 	int i;
    454 
    455 	bgscan_deinit(wpa_s);
    456 	autoscan_deinit(wpa_s);
    457 	scard_deinit(wpa_s->scard);
    458 	wpa_s->scard = NULL;
    459 	wpa_sm_set_scard_ctx(wpa_s->wpa, NULL);
    460 	eapol_sm_register_scard_ctx(wpa_s->eapol, NULL);
    461 	l2_packet_deinit(wpa_s->l2);
    462 	wpa_s->l2 = NULL;
    463 	if (wpa_s->l2_br) {
    464 		l2_packet_deinit(wpa_s->l2_br);
    465 		wpa_s->l2_br = NULL;
    466 	}
    467 #ifdef CONFIG_TESTING_OPTIONS
    468 	l2_packet_deinit(wpa_s->l2_test);
    469 	wpa_s->l2_test = NULL;
    470 	os_free(wpa_s->get_pref_freq_list_override);
    471 	wpa_s->get_pref_freq_list_override = NULL;
    472 	wpabuf_free(wpa_s->last_assoc_req_wpa_ie);
    473 	wpa_s->last_assoc_req_wpa_ie = NULL;
    474 #endif /* CONFIG_TESTING_OPTIONS */
    475 
    476 	if (wpa_s->conf != NULL) {
    477 		struct wpa_ssid *ssid;
    478 		for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
    479 			wpas_notify_network_removed(wpa_s, ssid);
    480 	}
    481 
    482 	os_free(wpa_s->confname);
    483 	wpa_s->confname = NULL;
    484 
    485 	os_free(wpa_s->confanother);
    486 	wpa_s->confanother = NULL;
    487 
    488 	wpa_sm_set_eapol(wpa_s->wpa, NULL);
    489 	eapol_sm_deinit(wpa_s->eapol);
    490 	wpa_s->eapol = NULL;
    491 
    492 	rsn_preauth_deinit(wpa_s->wpa);
    493 
    494 #ifdef CONFIG_TDLS
    495 	wpa_tdls_deinit(wpa_s->wpa);
    496 #endif /* CONFIG_TDLS */
    497 
    498 	wmm_ac_clear_saved_tspecs(wpa_s);
    499 	pmksa_candidate_free(wpa_s->wpa);
    500 	wpa_sm_deinit(wpa_s->wpa);
    501 	wpa_s->wpa = NULL;
    502 	wpa_blacklist_clear(wpa_s);
    503 
    504 	wpa_bss_deinit(wpa_s);
    505 
    506 	wpa_supplicant_cancel_delayed_sched_scan(wpa_s);
    507 	wpa_supplicant_cancel_scan(wpa_s);
    508 	wpa_supplicant_cancel_auth_timeout(wpa_s);
    509 	eloop_cancel_timeout(wpa_supplicant_stop_countermeasures, wpa_s, NULL);
    510 #ifdef CONFIG_DELAYED_MIC_ERROR_REPORT
    511 	eloop_cancel_timeout(wpa_supplicant_delayed_mic_error_report,
    512 			     wpa_s, NULL);
    513 #endif /* CONFIG_DELAYED_MIC_ERROR_REPORT */
    514 
    515 	eloop_cancel_timeout(wpas_network_reenabled, wpa_s, NULL);
    516 
    517 	wpas_wps_deinit(wpa_s);
    518 
    519 	wpabuf_free(wpa_s->pending_eapol_rx);
    520 	wpa_s->pending_eapol_rx = NULL;
    521 
    522 #ifdef CONFIG_IBSS_RSN
    523 	ibss_rsn_deinit(wpa_s->ibss_rsn);
    524 	wpa_s->ibss_rsn = NULL;
    525 #endif /* CONFIG_IBSS_RSN */
    526 
    527 	sme_deinit(wpa_s);
    528 
    529 #ifdef CONFIG_AP
    530 	wpa_supplicant_ap_deinit(wpa_s);
    531 #endif /* CONFIG_AP */
    532 
    533 	wpas_p2p_deinit(wpa_s);
    534 
    535 #ifdef CONFIG_OFFCHANNEL
    536 	offchannel_deinit(wpa_s);
    537 #endif /* CONFIG_OFFCHANNEL */
    538 
    539 	wpa_supplicant_cancel_sched_scan(wpa_s);
    540 
    541 	os_free(wpa_s->next_scan_freqs);
    542 	wpa_s->next_scan_freqs = NULL;
    543 
    544 	os_free(wpa_s->manual_scan_freqs);
    545 	wpa_s->manual_scan_freqs = NULL;
    546 	os_free(wpa_s->select_network_scan_freqs);
    547 	wpa_s->select_network_scan_freqs = NULL;
    548 
    549 	os_free(wpa_s->manual_sched_scan_freqs);
    550 	wpa_s->manual_sched_scan_freqs = NULL;
    551 
    552 	wpas_mac_addr_rand_scan_clear(wpa_s, MAC_ADDR_RAND_ALL);
    553 
    554 	/*
    555 	 * Need to remove any pending gas-query radio work before the
    556 	 * gas_query_deinit() call because gas_query::work has not yet been set
    557 	 * for works that have not been started. gas_query_free() will be unable
    558 	 * to cancel such pending radio works and once the pending gas-query
    559 	 * radio work eventually gets removed, the deinit notification call to
    560 	 * gas_query_start_cb() would result in dereferencing freed memory.
    561 	 */
    562 	if (wpa_s->radio)
    563 		radio_remove_works(wpa_s, "gas-query", 0);
    564 	gas_query_deinit(wpa_s->gas);
    565 	wpa_s->gas = NULL;
    566 	gas_server_deinit(wpa_s->gas_server);
    567 	wpa_s->gas_server = NULL;
    568 
    569 	free_hw_features(wpa_s);
    570 
    571 	ieee802_1x_dealloc_kay_sm(wpa_s);
    572 
    573 	os_free(wpa_s->bssid_filter);
    574 	wpa_s->bssid_filter = NULL;
    575 
    576 	os_free(wpa_s->disallow_aps_bssid);
    577 	wpa_s->disallow_aps_bssid = NULL;
    578 	os_free(wpa_s->disallow_aps_ssid);
    579 	wpa_s->disallow_aps_ssid = NULL;
    580 
    581 	wnm_bss_keep_alive_deinit(wpa_s);
    582 #ifdef CONFIG_WNM
    583 	wnm_deallocate_memory(wpa_s);
    584 #endif /* CONFIG_WNM */
    585 
    586 	ext_password_deinit(wpa_s->ext_pw);
    587 	wpa_s->ext_pw = NULL;
    588 
    589 	wpabuf_free(wpa_s->last_gas_resp);
    590 	wpa_s->last_gas_resp = NULL;
    591 	wpabuf_free(wpa_s->prev_gas_resp);
    592 	wpa_s->prev_gas_resp = NULL;
    593 
    594 	os_free(wpa_s->last_scan_res);
    595 	wpa_s->last_scan_res = NULL;
    596 
    597 #ifdef CONFIG_HS20
    598 	if (wpa_s->drv_priv)
    599 		wpa_drv_configure_frame_filters(wpa_s, 0);
    600 	hs20_deinit(wpa_s);
    601 #endif /* CONFIG_HS20 */
    602 
    603 	for (i = 0; i < NUM_VENDOR_ELEM_FRAMES; i++) {
    604 		wpabuf_free(wpa_s->vendor_elem[i]);
    605 		wpa_s->vendor_elem[i] = NULL;
    606 	}
    607 
    608 	wmm_ac_notify_disassoc(wpa_s);
    609 
    610 	wpa_s->sched_scan_plans_num = 0;
    611 	os_free(wpa_s->sched_scan_plans);
    612 	wpa_s->sched_scan_plans = NULL;
    613 
    614 #ifdef CONFIG_MBO
    615 	wpa_s->non_pref_chan_num = 0;
    616 	os_free(wpa_s->non_pref_chan);
    617 	wpa_s->non_pref_chan = NULL;
    618 #endif /* CONFIG_MBO */
    619 
    620 	free_bss_tmp_disallowed(wpa_s);
    621 
    622 	wpabuf_free(wpa_s->lci);
    623 	wpa_s->lci = NULL;
    624 	wpas_clear_beacon_rep_data(wpa_s);
    625 
    626 #ifdef CONFIG_PMKSA_CACHE_EXTERNAL
    627 #ifdef CONFIG_MESH
    628 	{
    629 		struct external_pmksa_cache *entry;
    630 
    631 		while ((entry = dl_list_last(&wpa_s->mesh_external_pmksa_cache,
    632 					     struct external_pmksa_cache,
    633 					     list)) != NULL) {
    634 			dl_list_del(&entry->list);
    635 			os_free(entry->pmksa_cache);
    636 			os_free(entry);
    637 		}
    638 	}
    639 #endif /* CONFIG_MESH */
    640 #endif /* CONFIG_PMKSA_CACHE_EXTERNAL */
    641 
    642 	wpas_flush_fils_hlp_req(wpa_s);
    643 
    644 	wpabuf_free(wpa_s->ric_ies);
    645 	wpa_s->ric_ies = NULL;
    646 
    647 #ifdef CONFIG_DPP
    648 	wpas_dpp_deinit(wpa_s);
    649 #endif /* CONFIG_DPP */
    650 }
    651 
    652 
    653 /**
    654  * wpa_clear_keys - Clear keys configured for the driver
    655  * @wpa_s: Pointer to wpa_supplicant data
    656  * @addr: Previously used BSSID or %NULL if not available
    657  *
    658  * This function clears the encryption keys that has been previously configured
    659  * for the driver.
    660  */
    661 void wpa_clear_keys(struct wpa_supplicant *wpa_s, const u8 *addr)
    662 {
    663 	int i, max;
    664 
    665 #ifdef CONFIG_IEEE80211W
    666 	max = 6;
    667 #else /* CONFIG_IEEE80211W */
    668 	max = 4;
    669 #endif /* CONFIG_IEEE80211W */
    670 
    671 	/* MLME-DELETEKEYS.request */
    672 	for (i = 0; i < max; i++) {
    673 		if (wpa_s->keys_cleared & BIT(i))
    674 			continue;
    675 		wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, i, 0, NULL, 0,
    676 				NULL, 0);
    677 	}
    678 	if (!(wpa_s->keys_cleared & BIT(0)) && addr &&
    679 	    !is_zero_ether_addr(addr)) {
    680 		wpa_drv_set_key(wpa_s, WPA_ALG_NONE, addr, 0, 0, NULL, 0, NULL,
    681 				0);
    682 		/* MLME-SETPROTECTION.request(None) */
    683 		wpa_drv_mlme_setprotection(
    684 			wpa_s, addr,
    685 			MLME_SETPROTECTION_PROTECT_TYPE_NONE,
    686 			MLME_SETPROTECTION_KEY_TYPE_PAIRWISE);
    687 	}
    688 	wpa_s->keys_cleared = (u32) -1;
    689 }
    690 
    691 
    692 /**
    693  * wpa_supplicant_state_txt - Get the connection state name as a text string
    694  * @state: State (wpa_state; WPA_*)
    695  * Returns: The state name as a printable text string
    696  */
    697 const char * wpa_supplicant_state_txt(enum wpa_states state)
    698 {
    699 	switch (state) {
    700 	case WPA_DISCONNECTED:
    701 		return "DISCONNECTED";
    702 	case WPA_INACTIVE:
    703 		return "INACTIVE";
    704 	case WPA_INTERFACE_DISABLED:
    705 		return "INTERFACE_DISABLED";
    706 	case WPA_SCANNING:
    707 		return "SCANNING";
    708 	case WPA_AUTHENTICATING:
    709 		return "AUTHENTICATING";
    710 	case WPA_ASSOCIATING:
    711 		return "ASSOCIATING";
    712 	case WPA_ASSOCIATED:
    713 		return "ASSOCIATED";
    714 	case WPA_4WAY_HANDSHAKE:
    715 		return "4WAY_HANDSHAKE";
    716 	case WPA_GROUP_HANDSHAKE:
    717 		return "GROUP_HANDSHAKE";
    718 	case WPA_COMPLETED:
    719 		return "COMPLETED";
    720 	default:
    721 		return "UNKNOWN";
    722 	}
    723 }
    724 
    725 
    726 #ifdef CONFIG_BGSCAN
    727 
    728 static void wpa_supplicant_start_bgscan(struct wpa_supplicant *wpa_s)
    729 {
    730 	const char *name;
    731 
    732 	if (wpa_s->current_ssid && wpa_s->current_ssid->bgscan)
    733 		name = wpa_s->current_ssid->bgscan;
    734 	else
    735 		name = wpa_s->conf->bgscan;
    736 	if (name == NULL || name[0] == '\0')
    737 		return;
    738 	if (wpas_driver_bss_selection(wpa_s))
    739 		return;
    740 	if (wpa_s->current_ssid == wpa_s->bgscan_ssid)
    741 		return;
    742 #ifdef CONFIG_P2P
    743 	if (wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE)
    744 		return;
    745 #endif /* CONFIG_P2P */
    746 
    747 	bgscan_deinit(wpa_s);
    748 	if (wpa_s->current_ssid) {
    749 		if (bgscan_init(wpa_s, wpa_s->current_ssid, name)) {
    750 			wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize "
    751 				"bgscan");
    752 			/*
    753 			 * Live without bgscan; it is only used as a roaming
    754 			 * optimization, so the initial connection is not
    755 			 * affected.
    756 			 */
    757 		} else {
    758 			struct wpa_scan_results *scan_res;
    759 			wpa_s->bgscan_ssid = wpa_s->current_ssid;
    760 			scan_res = wpa_supplicant_get_scan_results(wpa_s, NULL,
    761 								   0);
    762 			if (scan_res) {
    763 				bgscan_notify_scan(wpa_s, scan_res);
    764 				wpa_scan_results_free(scan_res);
    765 			}
    766 		}
    767 	} else
    768 		wpa_s->bgscan_ssid = NULL;
    769 }
    770 
    771 
    772 static void wpa_supplicant_stop_bgscan(struct wpa_supplicant *wpa_s)
    773 {
    774 	if (wpa_s->bgscan_ssid != NULL) {
    775 		bgscan_deinit(wpa_s);
    776 		wpa_s->bgscan_ssid = NULL;
    777 	}
    778 }
    779 
    780 #endif /* CONFIG_BGSCAN */
    781 
    782 
    783 static void wpa_supplicant_start_autoscan(struct wpa_supplicant *wpa_s)
    784 {
    785 	if (autoscan_init(wpa_s, 0))
    786 		wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize autoscan");
    787 }
    788 
    789 
    790 static void wpa_supplicant_stop_autoscan(struct wpa_supplicant *wpa_s)
    791 {
    792 	autoscan_deinit(wpa_s);
    793 }
    794 
    795 
    796 void wpa_supplicant_reinit_autoscan(struct wpa_supplicant *wpa_s)
    797 {
    798 	if (wpa_s->wpa_state == WPA_DISCONNECTED ||
    799 	    wpa_s->wpa_state == WPA_SCANNING) {
    800 		autoscan_deinit(wpa_s);
    801 		wpa_supplicant_start_autoscan(wpa_s);
    802 	}
    803 }
    804 
    805 
    806 /**
    807  * wpa_supplicant_set_state - Set current connection state
    808  * @wpa_s: Pointer to wpa_supplicant data
    809  * @state: The new connection state
    810  *
    811  * This function is called whenever the connection state changes, e.g.,
    812  * association is completed for WPA/WPA2 4-Way Handshake is started.
    813  */
    814 void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s,
    815 			      enum wpa_states state)
    816 {
    817 	enum wpa_states old_state = wpa_s->wpa_state;
    818 
    819 	wpa_dbg(wpa_s, MSG_DEBUG, "State: %s -> %s",
    820 		wpa_supplicant_state_txt(wpa_s->wpa_state),
    821 		wpa_supplicant_state_txt(state));
    822 
    823 	if (state == WPA_INTERFACE_DISABLED) {
    824 		/* Assure normal scan when interface is restored */
    825 		wpa_s->normal_scans = 0;
    826 	}
    827 
    828 	if (state == WPA_COMPLETED) {
    829 		wpas_connect_work_done(wpa_s);
    830 		/* Reinitialize normal_scan counter */
    831 		wpa_s->normal_scans = 0;
    832 	}
    833 
    834 #ifdef CONFIG_P2P
    835 	/*
    836 	 * P2PS client has to reply to Probe Request frames received on the
    837 	 * group operating channel. Enable Probe Request frame reporting for
    838 	 * P2P connected client in case p2p_cli_probe configuration property is
    839 	 * set to 1.
    840 	 */
    841 	if (wpa_s->conf->p2p_cli_probe && wpa_s->current_ssid &&
    842 	    wpa_s->current_ssid->mode == WPAS_MODE_INFRA &&
    843 	    wpa_s->current_ssid->p2p_group) {
    844 		if (state == WPA_COMPLETED && !wpa_s->p2p_cli_probe) {
    845 			wpa_dbg(wpa_s, MSG_DEBUG,
    846 				"P2P: Enable CLI Probe Request RX reporting");
    847 			wpa_s->p2p_cli_probe =
    848 				wpa_drv_probe_req_report(wpa_s, 1) >= 0;
    849 		} else if (state != WPA_COMPLETED && wpa_s->p2p_cli_probe) {
    850 			wpa_dbg(wpa_s, MSG_DEBUG,
    851 				"P2P: Disable CLI Probe Request RX reporting");
    852 			wpa_s->p2p_cli_probe = 0;
    853 			wpa_drv_probe_req_report(wpa_s, 0);
    854 		}
    855 	}
    856 #endif /* CONFIG_P2P */
    857 
    858 	if (state != WPA_SCANNING)
    859 		wpa_supplicant_notify_scanning(wpa_s, 0);
    860 
    861 	if (state == WPA_COMPLETED && wpa_s->new_connection) {
    862 		struct wpa_ssid *ssid = wpa_s->current_ssid;
    863 		int fils_hlp_sent = 0;
    864 
    865 #ifdef CONFIG_SME
    866 		if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) &&
    867 		    wpa_auth_alg_fils(wpa_s->sme.auth_alg))
    868 			fils_hlp_sent = 1;
    869 #endif /* CONFIG_SME */
    870 		if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) &&
    871 		    wpa_auth_alg_fils(wpa_s->auth_alg))
    872 			fils_hlp_sent = 1;
    873 
    874 #if defined(CONFIG_CTRL_IFACE) || !defined(CONFIG_NO_STDOUT_DEBUG)
    875 		wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_CONNECTED "- Connection to "
    876 			MACSTR " completed [id=%d id_str=%s%s]",
    877 			MAC2STR(wpa_s->bssid),
    878 			ssid ? ssid->id : -1,
    879 			ssid && ssid->id_str ? ssid->id_str : "",
    880 			fils_hlp_sent ? " FILS_HLP_SENT" : "");
    881 #endif /* CONFIG_CTRL_IFACE || !CONFIG_NO_STDOUT_DEBUG */
    882 		wpas_clear_temp_disabled(wpa_s, ssid, 1);
    883 		wpa_blacklist_clear(wpa_s);
    884 		wpa_s->extra_blacklist_count = 0;
    885 		wpa_s->new_connection = 0;
    886 		wpa_drv_set_operstate(wpa_s, 1);
    887 #ifndef IEEE8021X_EAPOL
    888 		wpa_drv_set_supp_port(wpa_s, 1);
    889 #endif /* IEEE8021X_EAPOL */
    890 		wpa_s->after_wps = 0;
    891 		wpa_s->known_wps_freq = 0;
    892 		wpas_p2p_completed(wpa_s);
    893 
    894 		sme_sched_obss_scan(wpa_s, 1);
    895 
    896 #if defined(CONFIG_FILS) && defined(IEEE8021X_EAPOL)
    897 		if (!fils_hlp_sent && ssid && ssid->eap.erp)
    898 			wpas_update_fils_connect_params(wpa_s);
    899 #endif /* CONFIG_FILS && IEEE8021X_EAPOL */
    900 	} else if (state == WPA_DISCONNECTED || state == WPA_ASSOCIATING ||
    901 		   state == WPA_ASSOCIATED) {
    902 		wpa_s->new_connection = 1;
    903 		wpa_drv_set_operstate(wpa_s, 0);
    904 #ifndef IEEE8021X_EAPOL
    905 		wpa_drv_set_supp_port(wpa_s, 0);
    906 #endif /* IEEE8021X_EAPOL */
    907 		sme_sched_obss_scan(wpa_s, 0);
    908 	}
    909 	wpa_s->wpa_state = state;
    910 
    911 #ifdef CONFIG_BGSCAN
    912 	if (state == WPA_COMPLETED)
    913 		wpa_supplicant_start_bgscan(wpa_s);
    914 	else if (state < WPA_ASSOCIATED)
    915 		wpa_supplicant_stop_bgscan(wpa_s);
    916 #endif /* CONFIG_BGSCAN */
    917 
    918 	if (state == WPA_AUTHENTICATING)
    919 		wpa_supplicant_stop_autoscan(wpa_s);
    920 
    921 	if (state == WPA_DISCONNECTED || state == WPA_INACTIVE)
    922 		wpa_supplicant_start_autoscan(wpa_s);
    923 
    924 	if (old_state >= WPA_ASSOCIATED && wpa_s->wpa_state < WPA_ASSOCIATED)
    925 		wmm_ac_notify_disassoc(wpa_s);
    926 
    927 	if (wpa_s->wpa_state != old_state) {
    928 		wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
    929 
    930 		/*
    931 		 * Notify the P2P Device interface about a state change in one
    932 		 * of the interfaces.
    933 		 */
    934 		wpas_p2p_indicate_state_change(wpa_s);
    935 
    936 		if (wpa_s->wpa_state == WPA_COMPLETED ||
    937 		    old_state == WPA_COMPLETED)
    938 			wpas_notify_auth_changed(wpa_s);
    939 	}
    940 }
    941 
    942 
    943 void wpa_supplicant_terminate_proc(struct wpa_global *global)
    944 {
    945 	int pending = 0;
    946 #ifdef CONFIG_WPS
    947 	struct wpa_supplicant *wpa_s = global->ifaces;
    948 	while (wpa_s) {
    949 		struct wpa_supplicant *next = wpa_s->next;
    950 		if (wpas_wps_terminate_pending(wpa_s) == 1)
    951 			pending = 1;
    952 #ifdef CONFIG_P2P
    953 		if (wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE ||
    954 		    (wpa_s->current_ssid && wpa_s->current_ssid->p2p_group))
    955 			wpas_p2p_disconnect(wpa_s);
    956 #endif /* CONFIG_P2P */
    957 		wpa_s = next;
    958 	}
    959 #endif /* CONFIG_WPS */
    960 	if (pending)
    961 		return;
    962 	eloop_terminate();
    963 }
    964 
    965 
    966 static void wpa_supplicant_terminate(int sig, void *signal_ctx)
    967 {
    968 	struct wpa_global *global = signal_ctx;
    969 	wpa_supplicant_terminate_proc(global);
    970 }
    971 
    972 
    973 void wpa_supplicant_clear_status(struct wpa_supplicant *wpa_s)
    974 {
    975 	enum wpa_states old_state = wpa_s->wpa_state;
    976 
    977 	wpa_s->pairwise_cipher = 0;
    978 	wpa_s->group_cipher = 0;
    979 	wpa_s->mgmt_group_cipher = 0;
    980 	wpa_s->key_mgmt = 0;
    981 	if (wpa_s->wpa_state != WPA_INTERFACE_DISABLED)
    982 		wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
    983 
    984 	if (wpa_s->wpa_state != old_state)
    985 		wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
    986 }
    987 
    988 
    989 /**
    990  * wpa_supplicant_reload_configuration - Reload configuration data
    991  * @wpa_s: Pointer to wpa_supplicant data
    992  * Returns: 0 on success or -1 if configuration parsing failed
    993  *
    994  * This function can be used to request that the configuration data is reloaded
    995  * (e.g., after configuration file change). This function is reloading
    996  * configuration only for one interface, so this may need to be called multiple
    997  * times if %wpa_supplicant is controlling multiple interfaces and all
    998  * interfaces need reconfiguration.
    999  */
   1000 int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s)
   1001 {
   1002 	struct wpa_config *conf;
   1003 	int reconf_ctrl;
   1004 	int old_ap_scan;
   1005 
   1006 	if (wpa_s->confname == NULL)
   1007 		return -1;
   1008 	conf = wpa_config_read(wpa_s->confname, NULL);
   1009 	if (conf == NULL) {
   1010 		wpa_msg(wpa_s, MSG_ERROR, "Failed to parse the configuration "
   1011 			"file '%s' - exiting", wpa_s->confname);
   1012 		return -1;
   1013 	}
   1014 	wpa_config_read(wpa_s->confanother, conf);
   1015 
   1016 	conf->changed_parameters = (unsigned int) -1;
   1017 
   1018 	reconf_ctrl = !!conf->ctrl_interface != !!wpa_s->conf->ctrl_interface
   1019 		|| (conf->ctrl_interface && wpa_s->conf->ctrl_interface &&
   1020 		    os_strcmp(conf->ctrl_interface,
   1021 			      wpa_s->conf->ctrl_interface) != 0);
   1022 
   1023 	if (reconf_ctrl && wpa_s->ctrl_iface) {
   1024 		wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
   1025 		wpa_s->ctrl_iface = NULL;
   1026 	}
   1027 
   1028 	eapol_sm_invalidate_cached_session(wpa_s->eapol);
   1029 	if (wpa_s->current_ssid) {
   1030 		if (wpa_s->wpa_state >= WPA_AUTHENTICATING)
   1031 			wpa_s->own_disconnect_req = 1;
   1032 		wpa_supplicant_deauthenticate(wpa_s,
   1033 					      WLAN_REASON_DEAUTH_LEAVING);
   1034 	}
   1035 
   1036 	/*
   1037 	 * TODO: should notify EAPOL SM about changes in opensc_engine_path,
   1038 	 * pkcs11_engine_path, pkcs11_module_path, openssl_ciphers.
   1039 	 */
   1040 	if (wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) ||
   1041 	    wpa_s->key_mgmt == WPA_KEY_MGMT_OWE ||
   1042 	    wpa_s->key_mgmt == WPA_KEY_MGMT_DPP) {
   1043 		/*
   1044 		 * Clear forced success to clear EAP state for next
   1045 		 * authentication.
   1046 		 */
   1047 		eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
   1048 	}
   1049 	eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
   1050 	wpa_sm_set_config(wpa_s->wpa, NULL);
   1051 	wpa_sm_pmksa_cache_flush(wpa_s->wpa, NULL);
   1052 	wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
   1053 	rsn_preauth_deinit(wpa_s->wpa);
   1054 
   1055 	old_ap_scan = wpa_s->conf->ap_scan;
   1056 	wpa_config_free(wpa_s->conf);
   1057 	wpa_s->conf = conf;
   1058 	if (old_ap_scan != wpa_s->conf->ap_scan)
   1059 		wpas_notify_ap_scan_changed(wpa_s);
   1060 
   1061 	if (reconf_ctrl)
   1062 		wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
   1063 
   1064 	wpa_supplicant_update_config(wpa_s);
   1065 
   1066 	wpa_supplicant_clear_status(wpa_s);
   1067 	if (wpa_supplicant_enabled_networks(wpa_s)) {
   1068 		wpa_s->reassociate = 1;
   1069 		wpa_supplicant_req_scan(wpa_s, 0, 0);
   1070 	}
   1071 	wpa_dbg(wpa_s, MSG_DEBUG, "Reconfiguration completed");
   1072 	return 0;
   1073 }
   1074 
   1075 
   1076 static void wpa_supplicant_reconfig(int sig, void *signal_ctx)
   1077 {
   1078 	struct wpa_global *global = signal_ctx;
   1079 	struct wpa_supplicant *wpa_s;
   1080 	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
   1081 		wpa_dbg(wpa_s, MSG_DEBUG, "Signal %d received - reconfiguring",
   1082 			sig);
   1083 		if (wpa_supplicant_reload_configuration(wpa_s) < 0) {
   1084 			wpa_supplicant_terminate_proc(global);
   1085 		}
   1086 	}
   1087 
   1088 	if (wpa_debug_reopen_file() < 0) {
   1089 		/* Ignore errors since we cannot really do much to fix this */
   1090 		wpa_printf(MSG_DEBUG, "Could not reopen debug log file");
   1091 	}
   1092 }
   1093 
   1094 
   1095 static int wpa_supplicant_suites_from_ai(struct wpa_supplicant *wpa_s,
   1096 					 struct wpa_ssid *ssid,
   1097 					 struct wpa_ie_data *ie)
   1098 {
   1099 	int ret = wpa_sm_parse_own_wpa_ie(wpa_s->wpa, ie);
   1100 	if (ret) {
   1101 		if (ret == -2) {
   1102 			wpa_msg(wpa_s, MSG_INFO, "WPA: Failed to parse WPA IE "
   1103 				"from association info");
   1104 		}
   1105 		return -1;
   1106 	}
   1107 
   1108 	wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Using WPA IE from AssocReq to set "
   1109 		"cipher suites");
   1110 	if (!(ie->group_cipher & ssid->group_cipher)) {
   1111 		wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled group "
   1112 			"cipher 0x%x (mask 0x%x) - reject",
   1113 			ie->group_cipher, ssid->group_cipher);
   1114 		return -1;
   1115 	}
   1116 	if (!(ie->pairwise_cipher & ssid->pairwise_cipher)) {
   1117 		wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled pairwise "
   1118 			"cipher 0x%x (mask 0x%x) - reject",
   1119 			ie->pairwise_cipher, ssid->pairwise_cipher);
   1120 		return -1;
   1121 	}
   1122 	if (!(ie->key_mgmt & ssid->key_mgmt)) {
   1123 		wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled key "
   1124 			"management 0x%x (mask 0x%x) - reject",
   1125 			ie->key_mgmt, ssid->key_mgmt);
   1126 		return -1;
   1127 	}
   1128 
   1129 #ifdef CONFIG_IEEE80211W
   1130 	if (!(ie->capabilities & WPA_CAPABILITY_MFPC) &&
   1131 	    wpas_get_ssid_pmf(wpa_s, ssid) == MGMT_FRAME_PROTECTION_REQUIRED) {
   1132 		wpa_msg(wpa_s, MSG_INFO, "WPA: Driver associated with an AP "
   1133 			"that does not support management frame protection - "
   1134 			"reject");
   1135 		return -1;
   1136 	}
   1137 #endif /* CONFIG_IEEE80211W */
   1138 
   1139 	return 0;
   1140 }
   1141 
   1142 
   1143 /**
   1144  * wpa_supplicant_set_suites - Set authentication and encryption parameters
   1145  * @wpa_s: Pointer to wpa_supplicant data
   1146  * @bss: Scan results for the selected BSS, or %NULL if not available
   1147  * @ssid: Configuration data for the selected network
   1148  * @wpa_ie: Buffer for the WPA/RSN IE
   1149  * @wpa_ie_len: Maximum wpa_ie buffer size on input. This is changed to be the
   1150  * used buffer length in case the functions returns success.
   1151  * Returns: 0 on success or -1 on failure
   1152  *
   1153  * This function is used to configure authentication and encryption parameters
   1154  * based on the network configuration and scan result for the selected BSS (if
   1155  * available).
   1156  */
   1157 int wpa_supplicant_set_suites(struct wpa_supplicant *wpa_s,
   1158 			      struct wpa_bss *bss, struct wpa_ssid *ssid,
   1159 			      u8 *wpa_ie, size_t *wpa_ie_len)
   1160 {
   1161 	struct wpa_ie_data ie;
   1162 	int sel, proto;
   1163 	const u8 *bss_wpa, *bss_rsn, *bss_osen;
   1164 
   1165 	if (bss) {
   1166 		bss_wpa = wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE);
   1167 		bss_rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
   1168 		bss_osen = wpa_bss_get_vendor_ie(bss, OSEN_IE_VENDOR_TYPE);
   1169 	} else
   1170 		bss_wpa = bss_rsn = bss_osen = NULL;
   1171 
   1172 	if (bss_rsn && (ssid->proto & WPA_PROTO_RSN) &&
   1173 	    wpa_parse_wpa_ie(bss_rsn, 2 + bss_rsn[1], &ie) == 0 &&
   1174 	    (ie.group_cipher & ssid->group_cipher) &&
   1175 	    (ie.pairwise_cipher & ssid->pairwise_cipher) &&
   1176 	    (ie.key_mgmt & ssid->key_mgmt)) {
   1177 		wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using IEEE 802.11i/D9.0");
   1178 		proto = WPA_PROTO_RSN;
   1179 	} else if (bss_wpa && (ssid->proto & WPA_PROTO_WPA) &&
   1180 		   wpa_parse_wpa_ie(bss_wpa, 2 + bss_wpa[1], &ie) == 0 &&
   1181 		   (ie.group_cipher & ssid->group_cipher) &&
   1182 		   (ie.pairwise_cipher & ssid->pairwise_cipher) &&
   1183 		   (ie.key_mgmt & ssid->key_mgmt)) {
   1184 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using IEEE 802.11i/D3.0");
   1185 		proto = WPA_PROTO_WPA;
   1186 #ifdef CONFIG_HS20
   1187 	} else if (bss_osen && (ssid->proto & WPA_PROTO_OSEN)) {
   1188 		wpa_dbg(wpa_s, MSG_DEBUG, "HS 2.0: using OSEN");
   1189 		/* TODO: parse OSEN element */
   1190 		os_memset(&ie, 0, sizeof(ie));
   1191 		ie.group_cipher = WPA_CIPHER_CCMP;
   1192 		ie.pairwise_cipher = WPA_CIPHER_CCMP;
   1193 		ie.key_mgmt = WPA_KEY_MGMT_OSEN;
   1194 		proto = WPA_PROTO_OSEN;
   1195 #endif /* CONFIG_HS20 */
   1196 	} else if (bss) {
   1197 		wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select WPA/RSN");
   1198 		wpa_dbg(wpa_s, MSG_DEBUG,
   1199 			"WPA: ssid proto=0x%x pairwise_cipher=0x%x group_cipher=0x%x key_mgmt=0x%x",
   1200 			ssid->proto, ssid->pairwise_cipher, ssid->group_cipher,
   1201 			ssid->key_mgmt);
   1202 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: BSS " MACSTR " ssid='%s'%s%s%s",
   1203 			MAC2STR(bss->bssid),
   1204 			wpa_ssid_txt(bss->ssid, bss->ssid_len),
   1205 			bss_wpa ? " WPA" : "",
   1206 			bss_rsn ? " RSN" : "",
   1207 			bss_osen ? " OSEN" : "");
   1208 		if (bss_rsn) {
   1209 			wpa_hexdump(MSG_DEBUG, "RSN", bss_rsn, 2 + bss_rsn[1]);
   1210 			if (wpa_parse_wpa_ie(bss_rsn, 2 + bss_rsn[1], &ie)) {
   1211 				wpa_dbg(wpa_s, MSG_DEBUG,
   1212 					"Could not parse RSN element");
   1213 			} else {
   1214 				wpa_dbg(wpa_s, MSG_DEBUG,
   1215 					"RSN: pairwise_cipher=0x%x group_cipher=0x%x key_mgmt=0x%x",
   1216 					ie.pairwise_cipher, ie.group_cipher,
   1217 					ie.key_mgmt);
   1218 			}
   1219 		}
   1220 		if (bss_wpa) {
   1221 			wpa_hexdump(MSG_DEBUG, "WPA", bss_wpa, 2 + bss_wpa[1]);
   1222 			if (wpa_parse_wpa_ie(bss_wpa, 2 + bss_wpa[1], &ie)) {
   1223 				wpa_dbg(wpa_s, MSG_DEBUG,
   1224 					"Could not parse WPA element");
   1225 			} else {
   1226 				wpa_dbg(wpa_s, MSG_DEBUG,
   1227 					"WPA: pairwise_cipher=0x%x group_cipher=0x%x key_mgmt=0x%x",
   1228 					ie.pairwise_cipher, ie.group_cipher,
   1229 					ie.key_mgmt);
   1230 			}
   1231 		}
   1232 		return -1;
   1233 	} else {
   1234 		if (ssid->proto & WPA_PROTO_OSEN)
   1235 			proto = WPA_PROTO_OSEN;
   1236 		else if (ssid->proto & WPA_PROTO_RSN)
   1237 			proto = WPA_PROTO_RSN;
   1238 		else
   1239 			proto = WPA_PROTO_WPA;
   1240 		if (wpa_supplicant_suites_from_ai(wpa_s, ssid, &ie) < 0) {
   1241 			os_memset(&ie, 0, sizeof(ie));
   1242 			ie.group_cipher = ssid->group_cipher;
   1243 			ie.pairwise_cipher = ssid->pairwise_cipher;
   1244 			ie.key_mgmt = ssid->key_mgmt;
   1245 #ifdef CONFIG_IEEE80211W
   1246 			ie.mgmt_group_cipher = 0;
   1247 			if (ssid->ieee80211w != NO_MGMT_FRAME_PROTECTION) {
   1248 				if (ssid->group_mgmt_cipher &
   1249 				    WPA_CIPHER_BIP_GMAC_256)
   1250 					ie.mgmt_group_cipher =
   1251 						WPA_CIPHER_BIP_GMAC_256;
   1252 				else if (ssid->group_mgmt_cipher &
   1253 					 WPA_CIPHER_BIP_CMAC_256)
   1254 					ie.mgmt_group_cipher =
   1255 						WPA_CIPHER_BIP_CMAC_256;
   1256 				else if (ssid->group_mgmt_cipher &
   1257 					 WPA_CIPHER_BIP_GMAC_128)
   1258 					ie.mgmt_group_cipher =
   1259 						WPA_CIPHER_BIP_GMAC_128;
   1260 				else
   1261 					ie.mgmt_group_cipher =
   1262 						WPA_CIPHER_AES_128_CMAC;
   1263 			}
   1264 #endif /* CONFIG_IEEE80211W */
   1265 			wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Set cipher suites "
   1266 				"based on configuration");
   1267 		} else
   1268 			proto = ie.proto;
   1269 	}
   1270 
   1271 	wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected cipher suites: group %d "
   1272 		"pairwise %d key_mgmt %d proto %d",
   1273 		ie.group_cipher, ie.pairwise_cipher, ie.key_mgmt, proto);
   1274 #ifdef CONFIG_IEEE80211W
   1275 	if (ssid->ieee80211w) {
   1276 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected mgmt group cipher %d",
   1277 			ie.mgmt_group_cipher);
   1278 	}
   1279 #endif /* CONFIG_IEEE80211W */
   1280 
   1281 	wpa_s->wpa_proto = proto;
   1282 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PROTO, proto);
   1283 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED,
   1284 			 !!(ssid->proto & (WPA_PROTO_RSN | WPA_PROTO_OSEN)));
   1285 
   1286 	if (bss || !wpa_s->ap_ies_from_associnfo) {
   1287 		if (wpa_sm_set_ap_wpa_ie(wpa_s->wpa, bss_wpa,
   1288 					 bss_wpa ? 2 + bss_wpa[1] : 0) ||
   1289 		    wpa_sm_set_ap_rsn_ie(wpa_s->wpa, bss_rsn,
   1290 					 bss_rsn ? 2 + bss_rsn[1] : 0))
   1291 			return -1;
   1292 	}
   1293 
   1294 #ifdef CONFIG_NO_WPA
   1295 	wpa_s->group_cipher = WPA_CIPHER_NONE;
   1296 	wpa_s->pairwise_cipher = WPA_CIPHER_NONE;
   1297 #else /* CONFIG_NO_WPA */
   1298 	sel = ie.group_cipher & ssid->group_cipher;
   1299 	wpa_s->group_cipher = wpa_pick_group_cipher(sel);
   1300 	if (wpa_s->group_cipher < 0) {
   1301 		wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select group "
   1302 			"cipher");
   1303 		return -1;
   1304 	}
   1305 	wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using GTK %s",
   1306 		wpa_cipher_txt(wpa_s->group_cipher));
   1307 
   1308 	sel = ie.pairwise_cipher & ssid->pairwise_cipher;
   1309 	wpa_s->pairwise_cipher = wpa_pick_pairwise_cipher(sel, 1);
   1310 	if (wpa_s->pairwise_cipher < 0) {
   1311 		wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select pairwise "
   1312 			"cipher");
   1313 		return -1;
   1314 	}
   1315 	wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using PTK %s",
   1316 		wpa_cipher_txt(wpa_s->pairwise_cipher));
   1317 #endif /* CONFIG_NO_WPA */
   1318 
   1319 	sel = ie.key_mgmt & ssid->key_mgmt;
   1320 #ifdef CONFIG_SAE
   1321 	if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SAE))
   1322 		sel &= ~(WPA_KEY_MGMT_SAE | WPA_KEY_MGMT_FT_SAE);
   1323 #endif /* CONFIG_SAE */
   1324 	if (0) {
   1325 #ifdef CONFIG_SUITEB192
   1326 	} else if (sel & WPA_KEY_MGMT_IEEE8021X_SUITE_B_192) {
   1327 		wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SUITE_B_192;
   1328 		wpa_dbg(wpa_s, MSG_DEBUG,
   1329 			"WPA: using KEY_MGMT 802.1X with Suite B (192-bit)");
   1330 #endif /* CONFIG_SUITEB192 */
   1331 #ifdef CONFIG_SUITEB
   1332 	} else if (sel & WPA_KEY_MGMT_IEEE8021X_SUITE_B) {
   1333 		wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SUITE_B;
   1334 		wpa_dbg(wpa_s, MSG_DEBUG,
   1335 			"WPA: using KEY_MGMT 802.1X with Suite B");
   1336 #endif /* CONFIG_SUITEB */
   1337 #ifdef CONFIG_FILS
   1338 #ifdef CONFIG_IEEE80211R
   1339 	} else if (sel & WPA_KEY_MGMT_FT_FILS_SHA384) {
   1340 		wpa_s->key_mgmt = WPA_KEY_MGMT_FT_FILS_SHA384;
   1341 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT-FILS-SHA384");
   1342 	} else if (sel & WPA_KEY_MGMT_FT_FILS_SHA256) {
   1343 		wpa_s->key_mgmt = WPA_KEY_MGMT_FT_FILS_SHA256;
   1344 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT-FILS-SHA256");
   1345 #endif /* CONFIG_IEEE80211R */
   1346 	} else if (sel & WPA_KEY_MGMT_FILS_SHA384) {
   1347 		wpa_s->key_mgmt = WPA_KEY_MGMT_FILS_SHA384;
   1348 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FILS-SHA384");
   1349 	} else if (sel & WPA_KEY_MGMT_FILS_SHA256) {
   1350 		wpa_s->key_mgmt = WPA_KEY_MGMT_FILS_SHA256;
   1351 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FILS-SHA256");
   1352 #endif /* CONFIG_FILS */
   1353 #ifdef CONFIG_IEEE80211R
   1354 	} else if (sel & WPA_KEY_MGMT_FT_IEEE8021X) {
   1355 		wpa_s->key_mgmt = WPA_KEY_MGMT_FT_IEEE8021X;
   1356 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/802.1X");
   1357 	} else if (sel & WPA_KEY_MGMT_FT_PSK) {
   1358 		wpa_s->key_mgmt = WPA_KEY_MGMT_FT_PSK;
   1359 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/PSK");
   1360 #endif /* CONFIG_IEEE80211R */
   1361 #ifdef CONFIG_SAE
   1362 	} else if (sel & WPA_KEY_MGMT_SAE) {
   1363 		wpa_s->key_mgmt = WPA_KEY_MGMT_SAE;
   1364 		wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT SAE");
   1365 	} else if (sel & WPA_KEY_MGMT_FT_SAE) {
   1366 		wpa_s->key_mgmt = WPA_KEY_MGMT_FT_SAE;
   1367 		wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT FT/SAE");
   1368 #endif /* CONFIG_SAE */
   1369 #ifdef CONFIG_IEEE80211W
   1370 	} else if (sel & WPA_KEY_MGMT_IEEE8021X_SHA256) {
   1371 		wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SHA256;
   1372 		wpa_dbg(wpa_s, MSG_DEBUG,
   1373 			"WPA: using KEY_MGMT 802.1X with SHA256");
   1374 	} else if (sel & WPA_KEY_MGMT_PSK_SHA256) {
   1375 		wpa_s->key_mgmt = WPA_KEY_MGMT_PSK_SHA256;
   1376 		wpa_dbg(wpa_s, MSG_DEBUG,
   1377 			"WPA: using KEY_MGMT PSK with SHA256");
   1378 #endif /* CONFIG_IEEE80211W */
   1379 	} else if (sel & WPA_KEY_MGMT_IEEE8021X) {
   1380 		wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X;
   1381 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT 802.1X");
   1382 	} else if (sel & WPA_KEY_MGMT_PSK) {
   1383 		wpa_s->key_mgmt = WPA_KEY_MGMT_PSK;
   1384 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-PSK");
   1385 	} else if (sel & WPA_KEY_MGMT_WPA_NONE) {
   1386 		wpa_s->key_mgmt = WPA_KEY_MGMT_WPA_NONE;
   1387 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-NONE");
   1388 #ifdef CONFIG_HS20
   1389 	} else if (sel & WPA_KEY_MGMT_OSEN) {
   1390 		wpa_s->key_mgmt = WPA_KEY_MGMT_OSEN;
   1391 		wpa_dbg(wpa_s, MSG_DEBUG, "HS 2.0: using KEY_MGMT OSEN");
   1392 #endif /* CONFIG_HS20 */
   1393 #ifdef CONFIG_OWE
   1394 	} else if (sel & WPA_KEY_MGMT_OWE) {
   1395 		wpa_s->key_mgmt = WPA_KEY_MGMT_OWE;
   1396 		wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT OWE");
   1397 #endif /* CONFIG_OWE */
   1398 #ifdef CONFIG_DPP
   1399 	} else if (sel & WPA_KEY_MGMT_DPP) {
   1400 		wpa_s->key_mgmt = WPA_KEY_MGMT_DPP;
   1401 		wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT DPP");
   1402 #endif /* CONFIG_DPP */
   1403 	} else {
   1404 		wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select "
   1405 			"authenticated key management type");
   1406 		return -1;
   1407 	}
   1408 
   1409 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
   1410 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
   1411 			 wpa_s->pairwise_cipher);
   1412 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
   1413 
   1414 #ifdef CONFIG_IEEE80211W
   1415 	sel = ie.mgmt_group_cipher;
   1416 	if (ssid->group_mgmt_cipher)
   1417 		sel &= ssid->group_mgmt_cipher;
   1418 	if (wpas_get_ssid_pmf(wpa_s, ssid) == NO_MGMT_FRAME_PROTECTION ||
   1419 	    !(ie.capabilities & WPA_CAPABILITY_MFPC))
   1420 		sel = 0;
   1421 	if (sel & WPA_CIPHER_AES_128_CMAC) {
   1422 		wpa_s->mgmt_group_cipher = WPA_CIPHER_AES_128_CMAC;
   1423 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
   1424 			"AES-128-CMAC");
   1425 	} else if (sel & WPA_CIPHER_BIP_GMAC_128) {
   1426 		wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_GMAC_128;
   1427 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
   1428 			"BIP-GMAC-128");
   1429 	} else if (sel & WPA_CIPHER_BIP_GMAC_256) {
   1430 		wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_GMAC_256;
   1431 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
   1432 			"BIP-GMAC-256");
   1433 	} else if (sel & WPA_CIPHER_BIP_CMAC_256) {
   1434 		wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_CMAC_256;
   1435 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
   1436 			"BIP-CMAC-256");
   1437 	} else {
   1438 		wpa_s->mgmt_group_cipher = 0;
   1439 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: not using MGMT group cipher");
   1440 	}
   1441 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
   1442 			 wpa_s->mgmt_group_cipher);
   1443 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MFP,
   1444 			 wpas_get_ssid_pmf(wpa_s, ssid));
   1445 #endif /* CONFIG_IEEE80211W */
   1446 
   1447 	if (wpa_sm_set_assoc_wpa_ie_default(wpa_s->wpa, wpa_ie, wpa_ie_len)) {
   1448 		wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to generate WPA IE");
   1449 		return -1;
   1450 	}
   1451 
   1452 	if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt)) {
   1453 		int psk_set = 0;
   1454 
   1455 		if (ssid->psk_set) {
   1456 			wpa_sm_set_pmk(wpa_s->wpa, ssid->psk, PMK_LEN, NULL,
   1457 				       NULL);
   1458 			psk_set = 1;
   1459 		}
   1460 
   1461 		if (wpa_key_mgmt_sae(ssid->key_mgmt) && ssid->sae_password)
   1462 			psk_set = 1;
   1463 
   1464 #ifndef CONFIG_NO_PBKDF2
   1465 		if (bss && ssid->bssid_set && ssid->ssid_len == 0 &&
   1466 		    ssid->passphrase) {
   1467 			u8 psk[PMK_LEN];
   1468 		        pbkdf2_sha1(ssid->passphrase, bss->ssid, bss->ssid_len,
   1469 				    4096, psk, PMK_LEN);
   1470 		        wpa_hexdump_key(MSG_MSGDUMP, "PSK (from passphrase)",
   1471 					psk, PMK_LEN);
   1472 			wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN, NULL, NULL);
   1473 			psk_set = 1;
   1474 			os_memset(psk, 0, sizeof(psk));
   1475 		}
   1476 #endif /* CONFIG_NO_PBKDF2 */
   1477 #ifdef CONFIG_EXT_PASSWORD
   1478 		if (ssid->ext_psk) {
   1479 			struct wpabuf *pw = ext_password_get(wpa_s->ext_pw,
   1480 							     ssid->ext_psk);
   1481 			char pw_str[64 + 1];
   1482 			u8 psk[PMK_LEN];
   1483 
   1484 			if (pw == NULL) {
   1485 				wpa_msg(wpa_s, MSG_INFO, "EXT PW: No PSK "
   1486 					"found from external storage");
   1487 				return -1;
   1488 			}
   1489 
   1490 			if (wpabuf_len(pw) < 8 || wpabuf_len(pw) > 64) {
   1491 				wpa_msg(wpa_s, MSG_INFO, "EXT PW: Unexpected "
   1492 					"PSK length %d in external storage",
   1493 					(int) wpabuf_len(pw));
   1494 				ext_password_free(pw);
   1495 				return -1;
   1496 			}
   1497 
   1498 			os_memcpy(pw_str, wpabuf_head(pw), wpabuf_len(pw));
   1499 			pw_str[wpabuf_len(pw)] = '\0';
   1500 
   1501 #ifndef CONFIG_NO_PBKDF2
   1502 			if (wpabuf_len(pw) >= 8 && wpabuf_len(pw) < 64 && bss)
   1503 			{
   1504 				pbkdf2_sha1(pw_str, bss->ssid, bss->ssid_len,
   1505 					    4096, psk, PMK_LEN);
   1506 				os_memset(pw_str, 0, sizeof(pw_str));
   1507 				wpa_hexdump_key(MSG_MSGDUMP, "PSK (from "
   1508 						"external passphrase)",
   1509 						psk, PMK_LEN);
   1510 				wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN, NULL,
   1511 					       NULL);
   1512 				psk_set = 1;
   1513 				os_memset(psk, 0, sizeof(psk));
   1514 			} else
   1515 #endif /* CONFIG_NO_PBKDF2 */
   1516 			if (wpabuf_len(pw) == 2 * PMK_LEN) {
   1517 				if (hexstr2bin(pw_str, psk, PMK_LEN) < 0) {
   1518 					wpa_msg(wpa_s, MSG_INFO, "EXT PW: "
   1519 						"Invalid PSK hex string");
   1520 					os_memset(pw_str, 0, sizeof(pw_str));
   1521 					ext_password_free(pw);
   1522 					return -1;
   1523 				}
   1524 				wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN, NULL,
   1525 					       NULL);
   1526 				psk_set = 1;
   1527 				os_memset(psk, 0, sizeof(psk));
   1528 			} else {
   1529 				wpa_msg(wpa_s, MSG_INFO, "EXT PW: No suitable "
   1530 					"PSK available");
   1531 				os_memset(pw_str, 0, sizeof(pw_str));
   1532 				ext_password_free(pw);
   1533 				return -1;
   1534 			}
   1535 
   1536 			os_memset(pw_str, 0, sizeof(pw_str));
   1537 			ext_password_free(pw);
   1538 		}
   1539 #endif /* CONFIG_EXT_PASSWORD */
   1540 
   1541 		if (!psk_set) {
   1542 			wpa_msg(wpa_s, MSG_INFO,
   1543 				"No PSK available for association");
   1544 			return -1;
   1545 		}
   1546 #ifdef CONFIG_OWE
   1547 	} else if (wpa_s->key_mgmt == WPA_KEY_MGMT_OWE) {
   1548 		/* OWE Diffie-Hellman exchange in (Re)Association
   1549 		 * Request/Response frames set the PMK, so do not override it
   1550 		 * here. */
   1551 #endif /* CONFIG_OWE */
   1552 	} else
   1553 		wpa_sm_set_pmk_from_pmksa(wpa_s->wpa);
   1554 
   1555 	return 0;
   1556 }
   1557 
   1558 
   1559 static void wpas_ext_capab_byte(struct wpa_supplicant *wpa_s, u8 *pos, int idx)
   1560 {
   1561 	*pos = 0x00;
   1562 
   1563 	switch (idx) {
   1564 	case 0: /* Bits 0-7 */
   1565 		break;
   1566 	case 1: /* Bits 8-15 */
   1567 		break;
   1568 	case 2: /* Bits 16-23 */
   1569 #ifdef CONFIG_WNM
   1570 		*pos |= 0x02; /* Bit 17 - WNM-Sleep Mode */
   1571 		*pos |= 0x08; /* Bit 19 - BSS Transition */
   1572 #endif /* CONFIG_WNM */
   1573 		break;
   1574 	case 3: /* Bits 24-31 */
   1575 #ifdef CONFIG_WNM
   1576 		*pos |= 0x02; /* Bit 25 - SSID List */
   1577 #endif /* CONFIG_WNM */
   1578 #ifdef CONFIG_INTERWORKING
   1579 		if (wpa_s->conf->interworking)
   1580 			*pos |= 0x80; /* Bit 31 - Interworking */
   1581 #endif /* CONFIG_INTERWORKING */
   1582 		break;
   1583 	case 4: /* Bits 32-39 */
   1584 #ifdef CONFIG_INTERWORKING
   1585 		if (wpa_s->drv_flags / WPA_DRIVER_FLAGS_QOS_MAPPING)
   1586 			*pos |= 0x01; /* Bit 32 - QoS Map */
   1587 #endif /* CONFIG_INTERWORKING */
   1588 		break;
   1589 	case 5: /* Bits 40-47 */
   1590 #ifdef CONFIG_HS20
   1591 		if (wpa_s->conf->hs20)
   1592 			*pos |= 0x40; /* Bit 46 - WNM-Notification */
   1593 #endif /* CONFIG_HS20 */
   1594 #ifdef CONFIG_MBO
   1595 		*pos |= 0x40; /* Bit 46 - WNM-Notification */
   1596 #endif /* CONFIG_MBO */
   1597 		break;
   1598 	case 6: /* Bits 48-55 */
   1599 		break;
   1600 	case 7: /* Bits 56-63 */
   1601 		break;
   1602 	case 8: /* Bits 64-71 */
   1603 		if (wpa_s->conf->ftm_responder)
   1604 			*pos |= 0x40; /* Bit 70 - FTM responder */
   1605 		if (wpa_s->conf->ftm_initiator)
   1606 			*pos |= 0x80; /* Bit 71 - FTM initiator */
   1607 		break;
   1608 	case 9: /* Bits 72-79 */
   1609 #ifdef CONFIG_FILS
   1610 		*pos |= 0x01;
   1611 #endif /* CONFIG_FILS */
   1612 		break;
   1613 	}
   1614 }
   1615 
   1616 
   1617 int wpas_build_ext_capab(struct wpa_supplicant *wpa_s, u8 *buf, size_t buflen)
   1618 {
   1619 	u8 *pos = buf;
   1620 	u8 len = 10, i;
   1621 
   1622 	if (len < wpa_s->extended_capa_len)
   1623 		len = wpa_s->extended_capa_len;
   1624 	if (buflen < (size_t) len + 2) {
   1625 		wpa_printf(MSG_INFO,
   1626 			   "Not enough room for building extended capabilities element");
   1627 		return -1;
   1628 	}
   1629 
   1630 	*pos++ = WLAN_EID_EXT_CAPAB;
   1631 	*pos++ = len;
   1632 	for (i = 0; i < len; i++, pos++) {
   1633 		wpas_ext_capab_byte(wpa_s, pos, i);
   1634 
   1635 		if (i < wpa_s->extended_capa_len) {
   1636 			*pos &= ~wpa_s->extended_capa_mask[i];
   1637 			*pos |= wpa_s->extended_capa[i];
   1638 		}
   1639 	}
   1640 
   1641 	while (len > 0 && buf[1 + len] == 0) {
   1642 		len--;
   1643 		buf[1] = len;
   1644 	}
   1645 	if (len == 0)
   1646 		return 0;
   1647 
   1648 	return 2 + len;
   1649 }
   1650 
   1651 
   1652 static int wpas_valid_bss(struct wpa_supplicant *wpa_s,
   1653 			  struct wpa_bss *test_bss)
   1654 {
   1655 	struct wpa_bss *bss;
   1656 
   1657 	dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
   1658 		if (bss == test_bss)
   1659 			return 1;
   1660 	}
   1661 
   1662 	return 0;
   1663 }
   1664 
   1665 
   1666 static int wpas_valid_ssid(struct wpa_supplicant *wpa_s,
   1667 			   struct wpa_ssid *test_ssid)
   1668 {
   1669 	struct wpa_ssid *ssid;
   1670 
   1671 	for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) {
   1672 		if (ssid == test_ssid)
   1673 			return 1;
   1674 	}
   1675 
   1676 	return 0;
   1677 }
   1678 
   1679 
   1680 int wpas_valid_bss_ssid(struct wpa_supplicant *wpa_s, struct wpa_bss *test_bss,
   1681 			struct wpa_ssid *test_ssid)
   1682 {
   1683 	if (test_bss && !wpas_valid_bss(wpa_s, test_bss))
   1684 		return 0;
   1685 
   1686 	return test_ssid == NULL || wpas_valid_ssid(wpa_s, test_ssid);
   1687 }
   1688 
   1689 
   1690 void wpas_connect_work_free(struct wpa_connect_work *cwork)
   1691 {
   1692 	if (cwork == NULL)
   1693 		return;
   1694 	os_free(cwork);
   1695 }
   1696 
   1697 
   1698 void wpas_connect_work_done(struct wpa_supplicant *wpa_s)
   1699 {
   1700 	struct wpa_connect_work *cwork;
   1701 	struct wpa_radio_work *work = wpa_s->connect_work;
   1702 
   1703 	if (!work)
   1704 		return;
   1705 
   1706 	wpa_s->connect_work = NULL;
   1707 	cwork = work->ctx;
   1708 	work->ctx = NULL;
   1709 	wpas_connect_work_free(cwork);
   1710 	radio_work_done(work);
   1711 }
   1712 
   1713 
   1714 int wpas_update_random_addr(struct wpa_supplicant *wpa_s, int style)
   1715 {
   1716 	struct os_reltime now;
   1717 	u8 addr[ETH_ALEN];
   1718 
   1719 	os_get_reltime(&now);
   1720 	if (wpa_s->last_mac_addr_style == style &&
   1721 	    wpa_s->last_mac_addr_change.sec != 0 &&
   1722 	    !os_reltime_expired(&now, &wpa_s->last_mac_addr_change,
   1723 				wpa_s->conf->rand_addr_lifetime)) {
   1724 		wpa_msg(wpa_s, MSG_DEBUG,
   1725 			"Previously selected random MAC address has not yet expired");
   1726 		return 0;
   1727 	}
   1728 
   1729 	switch (style) {
   1730 	case 1:
   1731 		if (random_mac_addr(addr) < 0)
   1732 			return -1;
   1733 		break;
   1734 	case 2:
   1735 		os_memcpy(addr, wpa_s->perm_addr, ETH_ALEN);
   1736 		if (random_mac_addr_keep_oui(addr) < 0)
   1737 			return -1;
   1738 		break;
   1739 	default:
   1740 		return -1;
   1741 	}
   1742 
   1743 	if (wpa_drv_set_mac_addr(wpa_s, addr) < 0) {
   1744 		wpa_msg(wpa_s, MSG_INFO,
   1745 			"Failed to set random MAC address");
   1746 		return -1;
   1747 	}
   1748 
   1749 	os_get_reltime(&wpa_s->last_mac_addr_change);
   1750 	wpa_s->mac_addr_changed = 1;
   1751 	wpa_s->last_mac_addr_style = style;
   1752 
   1753 	if (wpa_supplicant_update_mac_addr(wpa_s) < 0) {
   1754 		wpa_msg(wpa_s, MSG_INFO,
   1755 			"Could not update MAC address information");
   1756 		return -1;
   1757 	}
   1758 
   1759 	wpa_msg(wpa_s, MSG_DEBUG, "Using random MAC address " MACSTR,
   1760 		MAC2STR(addr));
   1761 
   1762 	return 0;
   1763 }
   1764 
   1765 
   1766 int wpas_update_random_addr_disassoc(struct wpa_supplicant *wpa_s)
   1767 {
   1768 	if (wpa_s->wpa_state >= WPA_AUTHENTICATING ||
   1769 	    !wpa_s->conf->preassoc_mac_addr)
   1770 		return 0;
   1771 
   1772 	return wpas_update_random_addr(wpa_s, wpa_s->conf->preassoc_mac_addr);
   1773 }
   1774 
   1775 
   1776 static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit);
   1777 
   1778 /**
   1779  * wpa_supplicant_associate - Request association
   1780  * @wpa_s: Pointer to wpa_supplicant data
   1781  * @bss: Scan results for the selected BSS, or %NULL if not available
   1782  * @ssid: Configuration data for the selected network
   1783  *
   1784  * This function is used to request %wpa_supplicant to associate with a BSS.
   1785  */
   1786 void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
   1787 			      struct wpa_bss *bss, struct wpa_ssid *ssid)
   1788 {
   1789 	struct wpa_connect_work *cwork;
   1790 	int rand_style;
   1791 
   1792 	wpa_s->own_disconnect_req = 0;
   1793 
   1794 	/*
   1795 	 * If we are starting a new connection, any previously pending EAPOL
   1796 	 * RX cannot be valid anymore.
   1797 	 */
   1798 	wpabuf_free(wpa_s->pending_eapol_rx);
   1799 	wpa_s->pending_eapol_rx = NULL;
   1800 
   1801 	if (ssid->mac_addr == -1)
   1802 		rand_style = wpa_s->conf->mac_addr;
   1803 	else
   1804 		rand_style = ssid->mac_addr;
   1805 
   1806 	wmm_ac_clear_saved_tspecs(wpa_s);
   1807 	wpa_s->reassoc_same_bss = 0;
   1808 	wpa_s->reassoc_same_ess = 0;
   1809 #ifdef CONFIG_TESTING_OPTIONS
   1810 	wpa_s->testing_resend_assoc = 0;
   1811 #endif /* CONFIG_TESTING_OPTIONS */
   1812 
   1813 	if (wpa_s->last_ssid == ssid) {
   1814 		wpa_dbg(wpa_s, MSG_DEBUG, "Re-association to the same ESS");
   1815 		wpa_s->reassoc_same_ess = 1;
   1816 		if (wpa_s->current_bss && wpa_s->current_bss == bss) {
   1817 			wmm_ac_save_tspecs(wpa_s);
   1818 			wpa_s->reassoc_same_bss = 1;
   1819 		}
   1820 	}
   1821 
   1822 	if (rand_style > 0 && !wpa_s->reassoc_same_ess) {
   1823 		if (wpas_update_random_addr(wpa_s, rand_style) < 0)
   1824 			return;
   1825 		wpa_sm_pmksa_cache_flush(wpa_s->wpa, ssid);
   1826 	} else if (rand_style == 0 && wpa_s->mac_addr_changed) {
   1827 		if (wpa_drv_set_mac_addr(wpa_s, NULL) < 0) {
   1828 			wpa_msg(wpa_s, MSG_INFO,
   1829 				"Could not restore permanent MAC address");
   1830 			return;
   1831 		}
   1832 		wpa_s->mac_addr_changed = 0;
   1833 		if (wpa_supplicant_update_mac_addr(wpa_s) < 0) {
   1834 			wpa_msg(wpa_s, MSG_INFO,
   1835 				"Could not update MAC address information");
   1836 			return;
   1837 		}
   1838 		wpa_msg(wpa_s, MSG_DEBUG, "Using permanent MAC address");
   1839 	}
   1840 	wpa_s->last_ssid = ssid;
   1841 
   1842 #ifdef CONFIG_IBSS_RSN
   1843 	ibss_rsn_deinit(wpa_s->ibss_rsn);
   1844 	wpa_s->ibss_rsn = NULL;
   1845 #else /* CONFIG_IBSS_RSN */
   1846 	if (ssid->mode == WPAS_MODE_IBSS &&
   1847 	    !(ssid->key_mgmt & (WPA_KEY_MGMT_NONE | WPA_KEY_MGMT_WPA_NONE))) {
   1848 		wpa_msg(wpa_s, MSG_INFO,
   1849 			"IBSS RSN not supported in the build");
   1850 		return;
   1851 	}
   1852 #endif /* CONFIG_IBSS_RSN */
   1853 
   1854 	if (ssid->mode == WPAS_MODE_AP || ssid->mode == WPAS_MODE_P2P_GO ||
   1855 	    ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) {
   1856 #ifdef CONFIG_AP
   1857 		if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_AP)) {
   1858 			wpa_msg(wpa_s, MSG_INFO, "Driver does not support AP "
   1859 				"mode");
   1860 			return;
   1861 		}
   1862 		if (wpa_supplicant_create_ap(wpa_s, ssid) < 0) {
   1863 			wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
   1864 			if (ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION)
   1865 				wpas_p2p_ap_setup_failed(wpa_s);
   1866 			return;
   1867 		}
   1868 		wpa_s->current_bss = bss;
   1869 #else /* CONFIG_AP */
   1870 		wpa_msg(wpa_s, MSG_ERROR, "AP mode support not included in "
   1871 			"the build");
   1872 #endif /* CONFIG_AP */
   1873 		return;
   1874 	}
   1875 
   1876 	if (ssid->mode == WPAS_MODE_MESH) {
   1877 #ifdef CONFIG_MESH
   1878 		if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_MESH)) {
   1879 			wpa_msg(wpa_s, MSG_INFO,
   1880 				"Driver does not support mesh mode");
   1881 			return;
   1882 		}
   1883 		if (bss)
   1884 			ssid->frequency = bss->freq;
   1885 		if (wpa_supplicant_join_mesh(wpa_s, ssid) < 0) {
   1886 			wpa_msg(wpa_s, MSG_ERROR, "Could not join mesh");
   1887 			return;
   1888 		}
   1889 		wpa_s->current_bss = bss;
   1890 		wpa_msg(wpa_s, MSG_INFO, MESH_GROUP_STARTED "ssid=\"%s\" id=%d",
   1891 			wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
   1892 			ssid->id);
   1893 		wpas_notify_mesh_group_started(wpa_s, ssid);
   1894 #else /* CONFIG_MESH */
   1895 		wpa_msg(wpa_s, MSG_ERROR,
   1896 			"mesh mode support not included in the build");
   1897 #endif /* CONFIG_MESH */
   1898 		return;
   1899 	}
   1900 
   1901 	/*
   1902 	 * Set WPA state machine configuration to match the selected network now
   1903 	 * so that the information is available before wpas_start_assoc_cb()
   1904 	 * gets called. This is needed at least for RSN pre-authentication where
   1905 	 * candidate APs are added to a list based on scan result processing
   1906 	 * before completion of the first association.
   1907 	 */
   1908 	wpa_supplicant_rsn_supp_set_config(wpa_s, ssid);
   1909 
   1910 #ifdef CONFIG_DPP
   1911 	if (wpas_dpp_check_connect(wpa_s, ssid, bss) != 0)
   1912 		return;
   1913 #endif /* CONFIG_DPP */
   1914 
   1915 #ifdef CONFIG_TDLS
   1916 	if (bss)
   1917 		wpa_tdls_ap_ies(wpa_s->wpa, (const u8 *) (bss + 1),
   1918 				bss->ie_len);
   1919 #endif /* CONFIG_TDLS */
   1920 
   1921 	if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) &&
   1922 	    ssid->mode == IEEE80211_MODE_INFRA) {
   1923 		sme_authenticate(wpa_s, bss, ssid);
   1924 		return;
   1925 	}
   1926 
   1927 	if (wpa_s->connect_work) {
   1928 		wpa_dbg(wpa_s, MSG_DEBUG, "Reject wpa_supplicant_associate() call since connect_work exist");
   1929 		return;
   1930 	}
   1931 
   1932 	if (radio_work_pending(wpa_s, "connect")) {
   1933 		wpa_dbg(wpa_s, MSG_DEBUG, "Reject wpa_supplicant_associate() call since pending work exist");
   1934 		return;
   1935 	}
   1936 
   1937 #ifdef CONFIG_SME
   1938 	if (ssid->mode == WPAS_MODE_IBSS || ssid->mode == WPAS_MODE_MESH) {
   1939 		/* Clear possibly set auth_alg, if any, from last attempt. */
   1940 		wpa_s->sme.auth_alg = WPA_AUTH_ALG_OPEN;
   1941 	}
   1942 #endif /* CONFIG_SME */
   1943 
   1944 	wpas_abort_ongoing_scan(wpa_s);
   1945 
   1946 	cwork = os_zalloc(sizeof(*cwork));
   1947 	if (cwork == NULL)
   1948 		return;
   1949 
   1950 	cwork->bss = bss;
   1951 	cwork->ssid = ssid;
   1952 
   1953 	if (radio_add_work(wpa_s, bss ? bss->freq : 0, "connect", 1,
   1954 			   wpas_start_assoc_cb, cwork) < 0) {
   1955 		os_free(cwork);
   1956 	}
   1957 }
   1958 
   1959 
   1960 static int bss_is_ibss(struct wpa_bss *bss)
   1961 {
   1962 	return (bss->caps & (IEEE80211_CAP_ESS | IEEE80211_CAP_IBSS)) ==
   1963 		IEEE80211_CAP_IBSS;
   1964 }
   1965 
   1966 
   1967 static int drv_supports_vht(struct wpa_supplicant *wpa_s,
   1968 			    const struct wpa_ssid *ssid)
   1969 {
   1970 	enum hostapd_hw_mode hw_mode;
   1971 	struct hostapd_hw_modes *mode = NULL;
   1972 	u8 channel;
   1973 	int i;
   1974 
   1975 	hw_mode = ieee80211_freq_to_chan(ssid->frequency, &channel);
   1976 	if (hw_mode == NUM_HOSTAPD_MODES)
   1977 		return 0;
   1978 	for (i = 0; wpa_s->hw.modes && i < wpa_s->hw.num_modes; i++) {
   1979 		if (wpa_s->hw.modes[i].mode == hw_mode) {
   1980 			mode = &wpa_s->hw.modes[i];
   1981 			break;
   1982 		}
   1983 	}
   1984 
   1985 	if (!mode)
   1986 		return 0;
   1987 
   1988 	return mode->vht_capab != 0;
   1989 }
   1990 
   1991 
   1992 void ibss_mesh_setup_freq(struct wpa_supplicant *wpa_s,
   1993 			  const struct wpa_ssid *ssid,
   1994 			  struct hostapd_freq_params *freq)
   1995 {
   1996 	enum hostapd_hw_mode hw_mode;
   1997 	struct hostapd_hw_modes *mode = NULL;
   1998 	int ht40plus[] = { 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157,
   1999 			   184, 192 };
   2000 	int vht80[] = { 36, 52, 100, 116, 132, 149 };
   2001 	struct hostapd_channel_data *pri_chan = NULL, *sec_chan = NULL;
   2002 	u8 channel;
   2003 	int i, chan_idx, ht40 = -1, res, obss_scan = 1;
   2004 	unsigned int j, k;
   2005 	struct hostapd_freq_params vht_freq;
   2006 	int chwidth, seg0, seg1;
   2007 	u32 vht_caps = 0;
   2008 
   2009 	freq->freq = ssid->frequency;
   2010 
   2011 	for (j = 0; j < wpa_s->last_scan_res_used; j++) {
   2012 		struct wpa_bss *bss = wpa_s->last_scan_res[j];
   2013 
   2014 		if (ssid->mode != WPAS_MODE_IBSS)
   2015 			break;
   2016 
   2017 		/* Don't adjust control freq in case of fixed_freq */
   2018 		if (ssid->fixed_freq)
   2019 			break;
   2020 
   2021 		if (!bss_is_ibss(bss))
   2022 			continue;
   2023 
   2024 		if (ssid->ssid_len == bss->ssid_len &&
   2025 		    os_memcmp(ssid->ssid, bss->ssid, bss->ssid_len) == 0) {
   2026 			wpa_printf(MSG_DEBUG,
   2027 				   "IBSS already found in scan results, adjust control freq: %d",
   2028 				   bss->freq);
   2029 			freq->freq = bss->freq;
   2030 			obss_scan = 0;
   2031 			break;
   2032 		}
   2033 	}
   2034 
   2035 	/* For IBSS check HT_IBSS flag */
   2036 	if (ssid->mode == WPAS_MODE_IBSS &&
   2037 	    !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_HT_IBSS))
   2038 		return;
   2039 
   2040 	if (wpa_s->group_cipher == WPA_CIPHER_WEP40 ||
   2041 	    wpa_s->group_cipher == WPA_CIPHER_WEP104 ||
   2042 	    wpa_s->pairwise_cipher == WPA_CIPHER_TKIP) {
   2043 		wpa_printf(MSG_DEBUG,
   2044 			   "IBSS: WEP/TKIP detected, do not try to enable HT");
   2045 		return;
   2046 	}
   2047 
   2048 	hw_mode = ieee80211_freq_to_chan(freq->freq, &channel);
   2049 	for (i = 0; wpa_s->hw.modes && i < wpa_s->hw.num_modes; i++) {
   2050 		if (wpa_s->hw.modes[i].mode == hw_mode) {
   2051 			mode = &wpa_s->hw.modes[i];
   2052 			break;
   2053 		}
   2054 	}
   2055 
   2056 	if (!mode)
   2057 		return;
   2058 
   2059 #ifdef CONFIG_HT_OVERRIDES
   2060 	if (ssid->disable_ht) {
   2061 		freq->ht_enabled = 0;
   2062 		return;
   2063 	}
   2064 #endif /* CONFIG_HT_OVERRIDES */
   2065 
   2066 	freq->ht_enabled = ht_supported(mode);
   2067 	if (!freq->ht_enabled)
   2068 		return;
   2069 
   2070 	/* Setup higher BW only for 5 GHz */
   2071 	if (mode->mode != HOSTAPD_MODE_IEEE80211A)
   2072 		return;
   2073 
   2074 	for (chan_idx = 0; chan_idx < mode->num_channels; chan_idx++) {
   2075 		pri_chan = &mode->channels[chan_idx];
   2076 		if (pri_chan->chan == channel)
   2077 			break;
   2078 		pri_chan = NULL;
   2079 	}
   2080 	if (!pri_chan)
   2081 		return;
   2082 
   2083 	/* Check primary channel flags */
   2084 	if (pri_chan->flag & (HOSTAPD_CHAN_DISABLED | HOSTAPD_CHAN_NO_IR))
   2085 		return;
   2086 
   2087 #ifdef CONFIG_HT_OVERRIDES
   2088 	if (ssid->disable_ht40)
   2089 		return;
   2090 #endif /* CONFIG_HT_OVERRIDES */
   2091 
   2092 	/* Check/setup HT40+/HT40- */
   2093 	for (j = 0; j < ARRAY_SIZE(ht40plus); j++) {
   2094 		if (ht40plus[j] == channel) {
   2095 			ht40 = 1;
   2096 			break;
   2097 		}
   2098 	}
   2099 
   2100 	/* Find secondary channel */
   2101 	for (i = 0; i < mode->num_channels; i++) {
   2102 		sec_chan = &mode->channels[i];
   2103 		if (sec_chan->chan == channel + ht40 * 4)
   2104 			break;
   2105 		sec_chan = NULL;
   2106 	}
   2107 	if (!sec_chan)
   2108 		return;
   2109 
   2110 	/* Check secondary channel flags */
   2111 	if (sec_chan->flag & (HOSTAPD_CHAN_DISABLED | HOSTAPD_CHAN_NO_IR))
   2112 		return;
   2113 
   2114 	freq->channel = pri_chan->chan;
   2115 
   2116 	if (ht40 == -1) {
   2117 		if (!(pri_chan->flag & HOSTAPD_CHAN_HT40MINUS))
   2118 			return;
   2119 	} else {
   2120 		if (!(pri_chan->flag & HOSTAPD_CHAN_HT40PLUS))
   2121 			return;
   2122 	}
   2123 	freq->sec_channel_offset = ht40;
   2124 
   2125 	if (obss_scan) {
   2126 		struct wpa_scan_results *scan_res;
   2127 
   2128 		scan_res = wpa_supplicant_get_scan_results(wpa_s, NULL, 0);
   2129 		if (scan_res == NULL) {
   2130 			/* Back to HT20 */
   2131 			freq->sec_channel_offset = 0;
   2132 			return;
   2133 		}
   2134 
   2135 		res = check_40mhz_5g(mode, scan_res, pri_chan->chan,
   2136 				     sec_chan->chan);
   2137 		switch (res) {
   2138 		case 0:
   2139 			/* Back to HT20 */
   2140 			freq->sec_channel_offset = 0;
   2141 			break;
   2142 		case 1:
   2143 			/* Configuration allowed */
   2144 			break;
   2145 		case 2:
   2146 			/* Switch pri/sec channels */
   2147 			freq->freq = hw_get_freq(mode, sec_chan->chan);
   2148 			freq->sec_channel_offset = -freq->sec_channel_offset;
   2149 			freq->channel = sec_chan->chan;
   2150 			break;
   2151 		default:
   2152 			freq->sec_channel_offset = 0;
   2153 			break;
   2154 		}
   2155 
   2156 		wpa_scan_results_free(scan_res);
   2157 	}
   2158 
   2159 	wpa_printf(MSG_DEBUG,
   2160 		   "IBSS/mesh: setup freq channel %d, sec_channel_offset %d",
   2161 		   freq->channel, freq->sec_channel_offset);
   2162 
   2163 	if (!drv_supports_vht(wpa_s, ssid))
   2164 		return;
   2165 
   2166 	/* For IBSS check VHT_IBSS flag */
   2167 	if (ssid->mode == WPAS_MODE_IBSS &&
   2168 	    !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_VHT_IBSS))
   2169 		return;
   2170 
   2171 	vht_freq = *freq;
   2172 
   2173 #ifdef CONFIG_VHT_OVERRIDES
   2174 	if (ssid->disable_vht) {
   2175 		freq->vht_enabled = 0;
   2176 		return;
   2177 	}
   2178 #endif /* CONFIG_VHT_OVERRIDES */
   2179 
   2180 	vht_freq.vht_enabled = vht_supported(mode);
   2181 	if (!vht_freq.vht_enabled)
   2182 		return;
   2183 
   2184 	/* setup center_freq1, bandwidth */
   2185 	for (j = 0; j < ARRAY_SIZE(vht80); j++) {
   2186 		if (freq->channel >= vht80[j] &&
   2187 		    freq->channel < vht80[j] + 16)
   2188 			break;
   2189 	}
   2190 
   2191 	if (j == ARRAY_SIZE(vht80))
   2192 		return;
   2193 
   2194 	for (i = vht80[j]; i < vht80[j] + 16; i += 4) {
   2195 		struct hostapd_channel_data *chan;
   2196 
   2197 		chan = hw_get_channel_chan(mode, i, NULL);
   2198 		if (!chan)
   2199 			return;
   2200 
   2201 		/* Back to HT configuration if channel not usable */
   2202 		if (chan->flag & (HOSTAPD_CHAN_DISABLED | HOSTAPD_CHAN_NO_IR))
   2203 			return;
   2204 	}
   2205 
   2206 	chwidth = VHT_CHANWIDTH_80MHZ;
   2207 	seg0 = vht80[j] + 6;
   2208 	seg1 = 0;
   2209 
   2210 	if (ssid->max_oper_chwidth == VHT_CHANWIDTH_80P80MHZ) {
   2211 		/* setup center_freq2, bandwidth */
   2212 		for (k = 0; k < ARRAY_SIZE(vht80); k++) {
   2213 			/* Only accept 80 MHz segments separated by a gap */
   2214 			if (j == k || abs(vht80[j] - vht80[k]) == 16)
   2215 				continue;
   2216 			for (i = vht80[k]; i < vht80[k] + 16; i += 4) {
   2217 				struct hostapd_channel_data *chan;
   2218 
   2219 				chan = hw_get_channel_chan(mode, i, NULL);
   2220 				if (!chan)
   2221 					continue;
   2222 
   2223 				if (chan->flag & (HOSTAPD_CHAN_DISABLED |
   2224 						  HOSTAPD_CHAN_NO_IR |
   2225 						  HOSTAPD_CHAN_RADAR))
   2226 					continue;
   2227 
   2228 				/* Found a suitable second segment for 80+80 */
   2229 				chwidth = VHT_CHANWIDTH_80P80MHZ;
   2230 				vht_caps |=
   2231 					VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ;
   2232 				seg1 = vht80[k] + 6;
   2233 			}
   2234 
   2235 			if (chwidth == VHT_CHANWIDTH_80P80MHZ)
   2236 				break;
   2237 		}
   2238 	} else if (ssid->max_oper_chwidth == VHT_CHANWIDTH_160MHZ) {
   2239 		if (freq->freq == 5180) {
   2240 			chwidth = VHT_CHANWIDTH_160MHZ;
   2241 			vht_caps |= VHT_CAP_SUPP_CHAN_WIDTH_160MHZ;
   2242 			seg0 = 50;
   2243 		} else if (freq->freq == 5520) {
   2244 			chwidth = VHT_CHANWIDTH_160MHZ;
   2245 			vht_caps |= VHT_CAP_SUPP_CHAN_WIDTH_160MHZ;
   2246 			seg0 = 114;
   2247 		}
   2248 	}
   2249 
   2250 	if (hostapd_set_freq_params(&vht_freq, mode->mode, freq->freq,
   2251 				    freq->channel, freq->ht_enabled,
   2252 				    vht_freq.vht_enabled,
   2253 				    freq->sec_channel_offset,
   2254 				    chwidth, seg0, seg1, vht_caps) != 0)
   2255 		return;
   2256 
   2257 	*freq = vht_freq;
   2258 
   2259 	wpa_printf(MSG_DEBUG, "IBSS: VHT setup freq cf1 %d, cf2 %d, bw %d",
   2260 		   freq->center_freq1, freq->center_freq2, freq->bandwidth);
   2261 }
   2262 
   2263 
   2264 #ifdef CONFIG_FILS
   2265 static size_t wpas_add_fils_hlp_req(struct wpa_supplicant *wpa_s, u8 *ie_buf,
   2266 				    size_t ie_buf_len)
   2267 {
   2268 	struct fils_hlp_req *req;
   2269 	size_t rem_len, hdr_len, hlp_len, len, ie_len = 0;
   2270 	const u8 *pos;
   2271 	u8 *buf = ie_buf;
   2272 
   2273 	dl_list_for_each(req, &wpa_s->fils_hlp_req, struct fils_hlp_req,
   2274 			 list) {
   2275 		rem_len = ie_buf_len - ie_len;
   2276 		pos = wpabuf_head(req->pkt);
   2277 		hdr_len = 1 + 2 * ETH_ALEN + 6;
   2278 		hlp_len = wpabuf_len(req->pkt);
   2279 
   2280 		if (rem_len < 2 + hdr_len + hlp_len) {
   2281 			wpa_printf(MSG_ERROR,
   2282 				   "FILS: Cannot fit HLP - rem_len=%lu to_fill=%lu",
   2283 				   (unsigned long) rem_len,
   2284 				   (unsigned long) (2 + hdr_len + hlp_len));
   2285 			break;
   2286 		}
   2287 
   2288 		len = (hdr_len + hlp_len) > 255 ? 255 : hdr_len + hlp_len;
   2289 		/* Element ID */
   2290 		*buf++ = WLAN_EID_EXTENSION;
   2291 		/* Length */
   2292 		*buf++ = len;
   2293 		/* Element ID Extension */
   2294 		*buf++ = WLAN_EID_EXT_FILS_HLP_CONTAINER;
   2295 		/* Destination MAC address */
   2296 		os_memcpy(buf, req->dst, ETH_ALEN);
   2297 		buf += ETH_ALEN;
   2298 		/* Source MAC address */
   2299 		os_memcpy(buf, wpa_s->own_addr, ETH_ALEN);
   2300 		buf += ETH_ALEN;
   2301 		/* LLC/SNAP Header */
   2302 		os_memcpy(buf, "\xaa\xaa\x03\x00\x00\x00", 6);
   2303 		buf += 6;
   2304 		/* HLP Packet */
   2305 		os_memcpy(buf, pos, len - hdr_len);
   2306 		buf += len - hdr_len;
   2307 		pos += len - hdr_len;
   2308 
   2309 		hlp_len -= len - hdr_len;
   2310 		ie_len += 2 + len;
   2311 		rem_len -= 2 + len;
   2312 
   2313 		while (hlp_len) {
   2314 			len = (hlp_len > 255) ? 255 : hlp_len;
   2315 			if (rem_len < 2 + len)
   2316 				break;
   2317 			*buf++ = WLAN_EID_FRAGMENT;
   2318 			*buf++ = len;
   2319 			os_memcpy(buf, pos, len);
   2320 			buf += len;
   2321 			pos += len;
   2322 
   2323 			hlp_len -= len;
   2324 			ie_len += 2 + len;
   2325 			rem_len -= 2 + len;
   2326 		}
   2327 	}
   2328 
   2329 	return ie_len;
   2330 }
   2331 #endif /* CONFIG_FILS */
   2332 
   2333 
   2334 static u8 * wpas_populate_assoc_ies(
   2335 	struct wpa_supplicant *wpa_s,
   2336 	struct wpa_bss *bss, struct wpa_ssid *ssid,
   2337 	struct wpa_driver_associate_params *params,
   2338 	enum wpa_drv_update_connect_params_mask *mask)
   2339 {
   2340 	u8 *wpa_ie;
   2341 	size_t max_wpa_ie_len = 500;
   2342 	size_t wpa_ie_len;
   2343 	int algs = WPA_AUTH_ALG_OPEN;
   2344 #ifdef CONFIG_FILS
   2345 	const u8 *realm, *username, *rrk;
   2346 	size_t realm_len, username_len, rrk_len;
   2347 	u16 next_seq_num;
   2348 	struct fils_hlp_req *req;
   2349 
   2350 	dl_list_for_each(req, &wpa_s->fils_hlp_req, struct fils_hlp_req,
   2351 			 list) {
   2352 		max_wpa_ie_len += 3 + 2 * ETH_ALEN + 6 + wpabuf_len(req->pkt) +
   2353 				  2 + 2 * wpabuf_len(req->pkt) / 255;
   2354 	}
   2355 #endif /* CONFIG_FILS */
   2356 
   2357 	wpa_ie = os_malloc(max_wpa_ie_len);
   2358 	if (!wpa_ie) {
   2359 		wpa_printf(MSG_ERROR,
   2360 			   "Failed to allocate connect IE buffer for %lu bytes",
   2361 			   (unsigned long) max_wpa_ie_len);
   2362 		return NULL;
   2363 	}
   2364 
   2365 	if (bss && (wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE) ||
   2366 		    wpa_bss_get_ie(bss, WLAN_EID_RSN)) &&
   2367 	    wpa_key_mgmt_wpa(ssid->key_mgmt)) {
   2368 		int try_opportunistic;
   2369 		const u8 *cache_id = NULL;
   2370 
   2371 		try_opportunistic = (ssid->proactive_key_caching < 0 ?
   2372 				     wpa_s->conf->okc :
   2373 				     ssid->proactive_key_caching) &&
   2374 			(ssid->proto & WPA_PROTO_RSN);
   2375 #ifdef CONFIG_FILS
   2376 		if (wpa_key_mgmt_fils(ssid->key_mgmt))
   2377 			cache_id = wpa_bss_get_fils_cache_id(bss);
   2378 #endif /* CONFIG_FILS */
   2379 		if (pmksa_cache_set_current(wpa_s->wpa, NULL, bss->bssid,
   2380 					    ssid, try_opportunistic,
   2381 					    cache_id) == 0)
   2382 			eapol_sm_notify_pmkid_attempt(wpa_s->eapol);
   2383 		wpa_ie_len = max_wpa_ie_len;
   2384 		if (wpa_supplicant_set_suites(wpa_s, bss, ssid,
   2385 					      wpa_ie, &wpa_ie_len)) {
   2386 			wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA "
   2387 				"key management and encryption suites");
   2388 			os_free(wpa_ie);
   2389 			return NULL;
   2390 		}
   2391 	} else if ((ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) && bss &&
   2392 		   wpa_key_mgmt_wpa_ieee8021x(ssid->key_mgmt)) {
   2393 		/*
   2394 		 * Both WPA and non-WPA IEEE 802.1X enabled in configuration -
   2395 		 * use non-WPA since the scan results did not indicate that the
   2396 		 * AP is using WPA or WPA2.
   2397 		 */
   2398 		wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
   2399 		wpa_ie_len = 0;
   2400 		wpa_s->wpa_proto = 0;
   2401 	} else if (wpa_key_mgmt_wpa_any(ssid->key_mgmt)) {
   2402 		wpa_ie_len = max_wpa_ie_len;
   2403 		if (wpa_supplicant_set_suites(wpa_s, NULL, ssid,
   2404 					      wpa_ie, &wpa_ie_len)) {
   2405 			wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA "
   2406 				"key management and encryption suites (no "
   2407 				"scan results)");
   2408 			os_free(wpa_ie);
   2409 			return NULL;
   2410 		}
   2411 #ifdef CONFIG_WPS
   2412 	} else if (ssid->key_mgmt & WPA_KEY_MGMT_WPS) {
   2413 		struct wpabuf *wps_ie;
   2414 		wps_ie = wps_build_assoc_req_ie(wpas_wps_get_req_type(ssid));
   2415 		if (wps_ie && wpabuf_len(wps_ie) <= max_wpa_ie_len) {
   2416 			wpa_ie_len = wpabuf_len(wps_ie);
   2417 			os_memcpy(wpa_ie, wpabuf_head(wps_ie), wpa_ie_len);
   2418 		} else
   2419 			wpa_ie_len = 0;
   2420 		wpabuf_free(wps_ie);
   2421 		wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
   2422 		if (!bss || (bss->caps & IEEE80211_CAP_PRIVACY))
   2423 			params->wps = WPS_MODE_PRIVACY;
   2424 		else
   2425 			params->wps = WPS_MODE_OPEN;
   2426 		wpa_s->wpa_proto = 0;
   2427 #endif /* CONFIG_WPS */
   2428 	} else {
   2429 		wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
   2430 		wpa_ie_len = 0;
   2431 		wpa_s->wpa_proto = 0;
   2432 	}
   2433 
   2434 #ifdef IEEE8021X_EAPOL
   2435 	if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
   2436 		if (ssid->leap) {
   2437 			if (ssid->non_leap == 0)
   2438 				algs = WPA_AUTH_ALG_LEAP;
   2439 			else
   2440 				algs |= WPA_AUTH_ALG_LEAP;
   2441 		}
   2442 	}
   2443 
   2444 #ifdef CONFIG_FILS
   2445 	/* Clear FILS association */
   2446 	wpa_sm_set_reset_fils_completed(wpa_s->wpa, 0);
   2447 
   2448 	if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_FILS_SK_OFFLOAD) &&
   2449 	    ssid->eap.erp && wpa_key_mgmt_fils(wpa_s->key_mgmt) &&
   2450 	    eapol_sm_get_erp_info(wpa_s->eapol, &ssid->eap, &username,
   2451 				  &username_len, &realm, &realm_len,
   2452 				  &next_seq_num, &rrk, &rrk_len) == 0) {
   2453 		algs = WPA_AUTH_ALG_FILS;
   2454 		params->fils_erp_username = username;
   2455 		params->fils_erp_username_len = username_len;
   2456 		params->fils_erp_realm = realm;
   2457 		params->fils_erp_realm_len = realm_len;
   2458 		params->fils_erp_next_seq_num = next_seq_num;
   2459 		params->fils_erp_rrk = rrk;
   2460 		params->fils_erp_rrk_len = rrk_len;
   2461 
   2462 		if (mask)
   2463 			*mask |= WPA_DRV_UPDATE_FILS_ERP_INFO;
   2464 	}
   2465 #endif /* CONFIG_FILS */
   2466 #endif /* IEEE8021X_EAPOL */
   2467 
   2468 	wpa_dbg(wpa_s, MSG_DEBUG, "Automatic auth_alg selection: 0x%x", algs);
   2469 	if (ssid->auth_alg) {
   2470 		algs = ssid->auth_alg;
   2471 		wpa_dbg(wpa_s, MSG_DEBUG,
   2472 			"Overriding auth_alg selection: 0x%x", algs);
   2473 	}
   2474 
   2475 #ifdef CONFIG_P2P
   2476 	if (wpa_s->global->p2p) {
   2477 		u8 *pos;
   2478 		size_t len;
   2479 		int res;
   2480 		pos = wpa_ie + wpa_ie_len;
   2481 		len = max_wpa_ie_len - wpa_ie_len;
   2482 		res = wpas_p2p_assoc_req_ie(wpa_s, bss, pos, len,
   2483 					    ssid->p2p_group);
   2484 		if (res >= 0)
   2485 			wpa_ie_len += res;
   2486 	}
   2487 
   2488 	wpa_s->cross_connect_disallowed = 0;
   2489 	if (bss) {
   2490 		struct wpabuf *p2p;
   2491 		p2p = wpa_bss_get_vendor_ie_multi(bss, P2P_IE_VENDOR_TYPE);
   2492 		if (p2p) {
   2493 			wpa_s->cross_connect_disallowed =
   2494 				p2p_get_cross_connect_disallowed(p2p);
   2495 			wpabuf_free(p2p);
   2496 			wpa_dbg(wpa_s, MSG_DEBUG, "P2P: WLAN AP %s cross "
   2497 				"connection",
   2498 				wpa_s->cross_connect_disallowed ?
   2499 				"disallows" : "allows");
   2500 		}
   2501 	}
   2502 
   2503 	os_memset(wpa_s->p2p_ip_addr_info, 0, sizeof(wpa_s->p2p_ip_addr_info));
   2504 #endif /* CONFIG_P2P */
   2505 
   2506 	if (bss) {
   2507 		wpa_ie_len += wpas_supp_op_class_ie(wpa_s, bss->freq,
   2508 						    wpa_ie + wpa_ie_len,
   2509 						    max_wpa_ie_len -
   2510 						    wpa_ie_len);
   2511 	}
   2512 
   2513 	/*
   2514 	 * Workaround: Add Extended Capabilities element only if the AP
   2515 	 * included this element in Beacon/Probe Response frames. Some older
   2516 	 * APs seem to have interoperability issues if this element is
   2517 	 * included, so while the standard may require us to include the
   2518 	 * element in all cases, it is justifiable to skip it to avoid
   2519 	 * interoperability issues.
   2520 	 */
   2521 	if (ssid->p2p_group)
   2522 		wpa_drv_get_ext_capa(wpa_s, WPA_IF_P2P_CLIENT);
   2523 	else
   2524 		wpa_drv_get_ext_capa(wpa_s, WPA_IF_STATION);
   2525 
   2526 	if (!bss || wpa_bss_get_ie(bss, WLAN_EID_EXT_CAPAB)) {
   2527 		u8 ext_capab[18];
   2528 		int ext_capab_len;
   2529 		ext_capab_len = wpas_build_ext_capab(wpa_s, ext_capab,
   2530 						     sizeof(ext_capab));
   2531 		if (ext_capab_len > 0 &&
   2532 		    wpa_ie_len + ext_capab_len <= max_wpa_ie_len) {
   2533 			u8 *pos = wpa_ie;
   2534 			if (wpa_ie_len > 0 && pos[0] == WLAN_EID_RSN)
   2535 				pos += 2 + pos[1];
   2536 			os_memmove(pos + ext_capab_len, pos,
   2537 				   wpa_ie_len - (pos - wpa_ie));
   2538 			wpa_ie_len += ext_capab_len;
   2539 			os_memcpy(pos, ext_capab, ext_capab_len);
   2540 		}
   2541 	}
   2542 
   2543 #ifdef CONFIG_HS20
   2544 	if (is_hs20_network(wpa_s, ssid, bss)) {
   2545 		struct wpabuf *hs20;
   2546 
   2547 		hs20 = wpabuf_alloc(20);
   2548 		if (hs20) {
   2549 			int pps_mo_id = hs20_get_pps_mo_id(wpa_s, ssid);
   2550 			size_t len;
   2551 
   2552 			wpas_hs20_add_indication(hs20, pps_mo_id);
   2553 			len = max_wpa_ie_len - wpa_ie_len;
   2554 			if (wpabuf_len(hs20) <= len) {
   2555 				os_memcpy(wpa_ie + wpa_ie_len,
   2556 					  wpabuf_head(hs20), wpabuf_len(hs20));
   2557 				wpa_ie_len += wpabuf_len(hs20);
   2558 			}
   2559 			wpabuf_free(hs20);
   2560 
   2561 			hs20_configure_frame_filters(wpa_s);
   2562 		}
   2563 	}
   2564 #endif /* CONFIG_HS20 */
   2565 
   2566 	if (wpa_s->vendor_elem[VENDOR_ELEM_ASSOC_REQ]) {
   2567 		struct wpabuf *buf = wpa_s->vendor_elem[VENDOR_ELEM_ASSOC_REQ];
   2568 		size_t len;
   2569 
   2570 		len = max_wpa_ie_len - wpa_ie_len;
   2571 		if (wpabuf_len(buf) <= len) {
   2572 			os_memcpy(wpa_ie + wpa_ie_len,
   2573 				  wpabuf_head(buf), wpabuf_len(buf));
   2574 			wpa_ie_len += wpabuf_len(buf);
   2575 		}
   2576 	}
   2577 
   2578 #ifdef CONFIG_FST
   2579 	if (wpa_s->fst_ies) {
   2580 		int fst_ies_len = wpabuf_len(wpa_s->fst_ies);
   2581 
   2582 		if (wpa_ie_len + fst_ies_len <= max_wpa_ie_len) {
   2583 			os_memcpy(wpa_ie + wpa_ie_len,
   2584 				  wpabuf_head(wpa_s->fst_ies), fst_ies_len);
   2585 			wpa_ie_len += fst_ies_len;
   2586 		}
   2587 	}
   2588 #endif /* CONFIG_FST */
   2589 
   2590 #ifdef CONFIG_MBO
   2591 	if (bss && wpa_bss_get_vendor_ie(bss, MBO_IE_VENDOR_TYPE)) {
   2592 		int len;
   2593 
   2594 		len = wpas_mbo_ie(wpa_s, wpa_ie + wpa_ie_len,
   2595 				  max_wpa_ie_len - wpa_ie_len);
   2596 		if (len >= 0)
   2597 			wpa_ie_len += len;
   2598 	}
   2599 #endif /* CONFIG_MBO */
   2600 
   2601 #ifdef CONFIG_FILS
   2602 	if (algs == WPA_AUTH_ALG_FILS) {
   2603 		size_t len;
   2604 
   2605 		len = wpas_add_fils_hlp_req(wpa_s, wpa_ie + wpa_ie_len,
   2606 					    max_wpa_ie_len - wpa_ie_len);
   2607 		wpa_ie_len += len;
   2608 	}
   2609 #endif /* CONFIG_FILS */
   2610 
   2611 #ifdef CONFIG_OWE
   2612 	if (algs == WPA_AUTH_ALG_OPEN &&
   2613 	    ssid->key_mgmt == WPA_KEY_MGMT_OWE) {
   2614 		struct wpabuf *owe_ie;
   2615 		u16 group = OWE_DH_GROUP;
   2616 
   2617 		if (ssid->owe_group)
   2618 			group = ssid->owe_group;
   2619 		owe_ie = owe_build_assoc_req(wpa_s->wpa, group);
   2620 		if (owe_ie &&
   2621 		    wpabuf_len(owe_ie) <= max_wpa_ie_len - wpa_ie_len) {
   2622 			os_memcpy(wpa_ie + wpa_ie_len,
   2623 				  wpabuf_head(owe_ie), wpabuf_len(owe_ie));
   2624 			wpa_ie_len += wpabuf_len(owe_ie);
   2625 			wpabuf_free(owe_ie);
   2626 		}
   2627 	}
   2628 #endif /* CONFIG_OWE */
   2629 
   2630 	params->wpa_ie = wpa_ie;
   2631 	params->wpa_ie_len = wpa_ie_len;
   2632 	params->auth_alg = algs;
   2633 	if (mask)
   2634 		*mask |= WPA_DRV_UPDATE_ASSOC_IES | WPA_DRV_UPDATE_AUTH_TYPE;
   2635 
   2636 	return wpa_ie;
   2637 }
   2638 
   2639 
   2640 #if defined(CONFIG_FILS) && defined(IEEE8021X_EAPOL)
   2641 static void wpas_update_fils_connect_params(struct wpa_supplicant *wpa_s)
   2642 {
   2643 	struct wpa_driver_associate_params params;
   2644 	enum wpa_drv_update_connect_params_mask mask = 0;
   2645 	u8 *wpa_ie;
   2646 
   2647 	if (wpa_s->auth_alg != WPA_AUTH_ALG_OPEN)
   2648 		return; /* nothing to do */
   2649 
   2650 	os_memset(&params, 0, sizeof(params));
   2651 	wpa_ie = wpas_populate_assoc_ies(wpa_s, wpa_s->current_bss,
   2652 					 wpa_s->current_ssid, &params, &mask);
   2653 	if (!wpa_ie)
   2654 		return;
   2655 
   2656 	if (params.auth_alg != WPA_AUTH_ALG_FILS) {
   2657 		os_free(wpa_ie);
   2658 		return;
   2659 	}
   2660 
   2661 	wpa_s->auth_alg = params.auth_alg;
   2662 	wpa_drv_update_connect_params(wpa_s, &params, mask);
   2663 	os_free(wpa_ie);
   2664 }
   2665 #endif /* CONFIG_FILS && IEEE8021X_EAPOL */
   2666 
   2667 
   2668 static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
   2669 {
   2670 	struct wpa_connect_work *cwork = work->ctx;
   2671 	struct wpa_bss *bss = cwork->bss;
   2672 	struct wpa_ssid *ssid = cwork->ssid;
   2673 	struct wpa_supplicant *wpa_s = work->wpa_s;
   2674 	u8 *wpa_ie;
   2675 	int use_crypt, ret, i, bssid_changed;
   2676 	unsigned int cipher_pairwise, cipher_group, cipher_group_mgmt;
   2677 	struct wpa_driver_associate_params params;
   2678 	int wep_keys_set = 0;
   2679 	int assoc_failed = 0;
   2680 	struct wpa_ssid *old_ssid;
   2681 	u8 prev_bssid[ETH_ALEN];
   2682 #ifdef CONFIG_HT_OVERRIDES
   2683 	struct ieee80211_ht_capabilities htcaps;
   2684 	struct ieee80211_ht_capabilities htcaps_mask;
   2685 #endif /* CONFIG_HT_OVERRIDES */
   2686 #ifdef CONFIG_VHT_OVERRIDES
   2687        struct ieee80211_vht_capabilities vhtcaps;
   2688        struct ieee80211_vht_capabilities vhtcaps_mask;
   2689 #endif /* CONFIG_VHT_OVERRIDES */
   2690 
   2691 	if (deinit) {
   2692 		if (work->started) {
   2693 			wpa_s->connect_work = NULL;
   2694 
   2695 			/* cancel possible auth. timeout */
   2696 			eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s,
   2697 					     NULL);
   2698 		}
   2699 		wpas_connect_work_free(cwork);
   2700 		return;
   2701 	}
   2702 
   2703 	wpa_s->connect_work = work;
   2704 
   2705 	if (cwork->bss_removed || !wpas_valid_bss_ssid(wpa_s, bss, ssid) ||
   2706 	    wpas_network_disabled(wpa_s, ssid)) {
   2707 		wpa_dbg(wpa_s, MSG_DEBUG, "BSS/SSID entry for association not valid anymore - drop connection attempt");
   2708 		wpas_connect_work_done(wpa_s);
   2709 		return;
   2710 	}
   2711 
   2712 	os_memcpy(prev_bssid, wpa_s->bssid, ETH_ALEN);
   2713 	os_memset(&params, 0, sizeof(params));
   2714 	wpa_s->reassociate = 0;
   2715 	wpa_s->eap_expected_failure = 0;
   2716 	if (bss &&
   2717 	    (!wpas_driver_bss_selection(wpa_s) || wpas_wps_searching(wpa_s))) {
   2718 #ifdef CONFIG_IEEE80211R
   2719 		const u8 *ie, *md = NULL;
   2720 #endif /* CONFIG_IEEE80211R */
   2721 		wpa_msg(wpa_s, MSG_INFO, "Trying to associate with " MACSTR
   2722 			" (SSID='%s' freq=%d MHz)", MAC2STR(bss->bssid),
   2723 			wpa_ssid_txt(bss->ssid, bss->ssid_len), bss->freq);
   2724 		bssid_changed = !is_zero_ether_addr(wpa_s->bssid);
   2725 		os_memset(wpa_s->bssid, 0, ETH_ALEN);
   2726 		os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN);
   2727 		if (bssid_changed)
   2728 			wpas_notify_bssid_changed(wpa_s);
   2729 #ifdef CONFIG_IEEE80211R
   2730 		ie = wpa_bss_get_ie(bss, WLAN_EID_MOBILITY_DOMAIN);
   2731 		if (ie && ie[1] >= MOBILITY_DOMAIN_ID_LEN)
   2732 			md = ie + 2;
   2733 		wpa_sm_set_ft_params(wpa_s->wpa, ie, ie ? 2 + ie[1] : 0);
   2734 		if (md) {
   2735 			/* Prepare for the next transition */
   2736 			wpa_ft_prepare_auth_request(wpa_s->wpa, ie);
   2737 		}
   2738 #endif /* CONFIG_IEEE80211R */
   2739 #ifdef CONFIG_WPS
   2740 	} else if ((ssid->ssid == NULL || ssid->ssid_len == 0) &&
   2741 		   wpa_s->conf->ap_scan == 2 &&
   2742 		   (ssid->key_mgmt & WPA_KEY_MGMT_WPS)) {
   2743 		/* Use ap_scan==1 style network selection to find the network
   2744 		 */
   2745 		wpas_connect_work_done(wpa_s);
   2746 		wpa_s->scan_req = MANUAL_SCAN_REQ;
   2747 		wpa_s->reassociate = 1;
   2748 		wpa_supplicant_req_scan(wpa_s, 0, 0);
   2749 		return;
   2750 #endif /* CONFIG_WPS */
   2751 	} else {
   2752 		wpa_msg(wpa_s, MSG_INFO, "Trying to associate with SSID '%s'",
   2753 			wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
   2754 		if (bss)
   2755 			os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN);
   2756 		else
   2757 			os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
   2758 	}
   2759 	if (!wpa_s->pno)
   2760 		wpa_supplicant_cancel_sched_scan(wpa_s);
   2761 
   2762 	wpa_supplicant_cancel_scan(wpa_s);
   2763 
   2764 	/* Starting new association, so clear the possibly used WPA IE from the
   2765 	 * previous association. */
   2766 	wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
   2767 
   2768 	wpa_ie = wpas_populate_assoc_ies(wpa_s, bss, ssid, &params, NULL);
   2769 	if (!wpa_ie) {
   2770 		wpas_connect_work_done(wpa_s);
   2771 		return;
   2772 	}
   2773 
   2774 	wpa_clear_keys(wpa_s, bss ? bss->bssid : NULL);
   2775 	use_crypt = 1;
   2776 	cipher_pairwise = wpa_s->pairwise_cipher;
   2777 	cipher_group = wpa_s->group_cipher;
   2778 	cipher_group_mgmt = wpa_s->mgmt_group_cipher;
   2779 	if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
   2780 	    wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
   2781 		if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE)
   2782 			use_crypt = 0;
   2783 		if (wpa_set_wep_keys(wpa_s, ssid)) {
   2784 			use_crypt = 1;
   2785 			wep_keys_set = 1;
   2786 		}
   2787 	}
   2788 	if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS)
   2789 		use_crypt = 0;
   2790 
   2791 #ifdef IEEE8021X_EAPOL
   2792 	if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
   2793 		if ((ssid->eapol_flags &
   2794 		     (EAPOL_FLAG_REQUIRE_KEY_UNICAST |
   2795 		      EAPOL_FLAG_REQUIRE_KEY_BROADCAST)) == 0 &&
   2796 		    !wep_keys_set) {
   2797 			use_crypt = 0;
   2798 		} else {
   2799 			/* Assume that dynamic WEP-104 keys will be used and
   2800 			 * set cipher suites in order for drivers to expect
   2801 			 * encryption. */
   2802 			cipher_pairwise = cipher_group = WPA_CIPHER_WEP104;
   2803 		}
   2804 	}
   2805 #endif /* IEEE8021X_EAPOL */
   2806 
   2807 	if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
   2808 		/* Set the key before (and later after) association */
   2809 		wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
   2810 	}
   2811 
   2812 	wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING);
   2813 	if (bss) {
   2814 		params.ssid = bss->ssid;
   2815 		params.ssid_len = bss->ssid_len;
   2816 		if (!wpas_driver_bss_selection(wpa_s) || ssid->bssid_set ||
   2817 		    wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) {
   2818 			wpa_printf(MSG_DEBUG, "Limit connection to BSSID "
   2819 				   MACSTR " freq=%u MHz based on scan results "
   2820 				   "(bssid_set=%d wps=%d)",
   2821 				   MAC2STR(bss->bssid), bss->freq,
   2822 				   ssid->bssid_set,
   2823 				   wpa_s->key_mgmt == WPA_KEY_MGMT_WPS);
   2824 			params.bssid = bss->bssid;
   2825 			params.freq.freq = bss->freq;
   2826 		}
   2827 		params.bssid_hint = bss->bssid;
   2828 		params.freq_hint = bss->freq;
   2829 		params.pbss = bss_is_pbss(bss);
   2830 	} else {
   2831 		if (ssid->bssid_hint_set)
   2832 			params.bssid_hint = ssid->bssid_hint;
   2833 
   2834 		params.ssid = ssid->ssid;
   2835 		params.ssid_len = ssid->ssid_len;
   2836 		params.pbss = (ssid->pbss != 2) ? ssid->pbss : 0;
   2837 	}
   2838 
   2839 	if (ssid->mode == WPAS_MODE_IBSS && ssid->bssid_set &&
   2840 	    wpa_s->conf->ap_scan == 2) {
   2841 		params.bssid = ssid->bssid;
   2842 		params.fixed_bssid = 1;
   2843 	}
   2844 
   2845 	/* Initial frequency for IBSS/mesh */
   2846 	if ((ssid->mode == WPAS_MODE_IBSS || ssid->mode == WPAS_MODE_MESH) &&
   2847 	    ssid->frequency > 0 && params.freq.freq == 0)
   2848 		ibss_mesh_setup_freq(wpa_s, ssid, &params.freq);
   2849 
   2850 	if (ssid->mode == WPAS_MODE_IBSS) {
   2851 		params.fixed_freq = ssid->fixed_freq;
   2852 		if (ssid->beacon_int)
   2853 			params.beacon_int = ssid->beacon_int;
   2854 		else
   2855 			params.beacon_int = wpa_s->conf->beacon_int;
   2856 	}
   2857 
   2858 	params.pairwise_suite = cipher_pairwise;
   2859 	params.group_suite = cipher_group;
   2860 	params.mgmt_group_suite = cipher_group_mgmt;
   2861 	params.key_mgmt_suite = wpa_s->key_mgmt;
   2862 	params.wpa_proto = wpa_s->wpa_proto;
   2863 	wpa_s->auth_alg = params.auth_alg;
   2864 	params.mode = ssid->mode;
   2865 	params.bg_scan_period = ssid->bg_scan_period;
   2866 	for (i = 0; i < NUM_WEP_KEYS; i++) {
   2867 		if (ssid->wep_key_len[i])
   2868 			params.wep_key[i] = ssid->wep_key[i];
   2869 		params.wep_key_len[i] = ssid->wep_key_len[i];
   2870 	}
   2871 	params.wep_tx_keyidx = ssid->wep_tx_keyidx;
   2872 
   2873 	if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) &&
   2874 	    (params.key_mgmt_suite == WPA_KEY_MGMT_PSK ||
   2875 	     params.key_mgmt_suite == WPA_KEY_MGMT_FT_PSK)) {
   2876 		params.passphrase = ssid->passphrase;
   2877 		if (ssid->psk_set)
   2878 			params.psk = ssid->psk;
   2879 	}
   2880 
   2881 	if (wpa_s->conf->key_mgmt_offload) {
   2882 		if (params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X ||
   2883 		    params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SHA256 ||
   2884 		    params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SUITE_B ||
   2885 		    params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SUITE_B_192)
   2886 			params.req_key_mgmt_offload =
   2887 				ssid->proactive_key_caching < 0 ?
   2888 				wpa_s->conf->okc : ssid->proactive_key_caching;
   2889 		else
   2890 			params.req_key_mgmt_offload = 1;
   2891 
   2892 		if ((params.key_mgmt_suite == WPA_KEY_MGMT_PSK ||
   2893 		     params.key_mgmt_suite == WPA_KEY_MGMT_PSK_SHA256 ||
   2894 		     params.key_mgmt_suite == WPA_KEY_MGMT_FT_PSK) &&
   2895 		    ssid->psk_set)
   2896 			params.psk = ssid->psk;
   2897 	}
   2898 
   2899 	params.drop_unencrypted = use_crypt;
   2900 
   2901 #ifdef CONFIG_IEEE80211W
   2902 	params.mgmt_frame_protection = wpas_get_ssid_pmf(wpa_s, ssid);
   2903 	if (params.mgmt_frame_protection != NO_MGMT_FRAME_PROTECTION && bss) {
   2904 		const u8 *rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
   2905 		struct wpa_ie_data ie;
   2906 		if (rsn && wpa_parse_wpa_ie(rsn, 2 + rsn[1], &ie) == 0 &&
   2907 		    ie.capabilities &
   2908 		    (WPA_CAPABILITY_MFPC | WPA_CAPABILITY_MFPR)) {
   2909 			wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected AP supports "
   2910 				"MFP: require MFP");
   2911 			params.mgmt_frame_protection =
   2912 				MGMT_FRAME_PROTECTION_REQUIRED;
   2913 		}
   2914 	}
   2915 #endif /* CONFIG_IEEE80211W */
   2916 
   2917 	params.p2p = ssid->p2p_group;
   2918 
   2919 	if (wpa_s->p2pdev->set_sta_uapsd)
   2920 		params.uapsd = wpa_s->p2pdev->sta_uapsd;
   2921 	else
   2922 		params.uapsd = -1;
   2923 
   2924 #ifdef CONFIG_HT_OVERRIDES
   2925 	os_memset(&htcaps, 0, sizeof(htcaps));
   2926 	os_memset(&htcaps_mask, 0, sizeof(htcaps_mask));
   2927 	params.htcaps = (u8 *) &htcaps;
   2928 	params.htcaps_mask = (u8 *) &htcaps_mask;
   2929 	wpa_supplicant_apply_ht_overrides(wpa_s, ssid, &params);
   2930 #endif /* CONFIG_HT_OVERRIDES */
   2931 #ifdef CONFIG_VHT_OVERRIDES
   2932 	os_memset(&vhtcaps, 0, sizeof(vhtcaps));
   2933 	os_memset(&vhtcaps_mask, 0, sizeof(vhtcaps_mask));
   2934 	params.vhtcaps = &vhtcaps;
   2935 	params.vhtcaps_mask = &vhtcaps_mask;
   2936 	wpa_supplicant_apply_vht_overrides(wpa_s, ssid, &params);
   2937 #endif /* CONFIG_VHT_OVERRIDES */
   2938 
   2939 #ifdef CONFIG_P2P
   2940 	/*
   2941 	 * If multi-channel concurrency is not supported, check for any
   2942 	 * frequency conflict. In case of any frequency conflict, remove the
   2943 	 * least prioritized connection.
   2944 	 */
   2945 	if (wpa_s->num_multichan_concurrent < 2) {
   2946 		int freq, num;
   2947 		num = get_shared_radio_freqs(wpa_s, &freq, 1);
   2948 		if (num > 0 && freq > 0 && freq != params.freq.freq) {
   2949 			wpa_printf(MSG_DEBUG,
   2950 				   "Assoc conflicting freq found (%d != %d)",
   2951 				   freq, params.freq.freq);
   2952 			if (wpas_p2p_handle_frequency_conflicts(
   2953 				    wpa_s, params.freq.freq, ssid) < 0) {
   2954 				wpas_connect_work_done(wpa_s);
   2955 				os_free(wpa_ie);
   2956 				return;
   2957 			}
   2958 		}
   2959 	}
   2960 #endif /* CONFIG_P2P */
   2961 
   2962 	if (wpa_s->reassoc_same_ess && !is_zero_ether_addr(prev_bssid) &&
   2963 	    wpa_s->current_ssid)
   2964 		params.prev_bssid = prev_bssid;
   2965 
   2966 	ret = wpa_drv_associate(wpa_s, &params);
   2967 	os_free(wpa_ie);
   2968 	if (ret < 0) {
   2969 		wpa_msg(wpa_s, MSG_INFO, "Association request to the driver "
   2970 			"failed");
   2971 		if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SANE_ERROR_CODES) {
   2972 			/*
   2973 			 * The driver is known to mean what is saying, so we
   2974 			 * can stop right here; the association will not
   2975 			 * succeed.
   2976 			 */
   2977 			wpas_connection_failed(wpa_s, wpa_s->pending_bssid);
   2978 			wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
   2979 			os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
   2980 			return;
   2981 		}
   2982 		/* try to continue anyway; new association will be tried again
   2983 		 * after timeout */
   2984 		assoc_failed = 1;
   2985 	}
   2986 
   2987 	if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
   2988 		/* Set the key after the association just in case association
   2989 		 * cleared the previously configured key. */
   2990 		wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
   2991 		/* No need to timeout authentication since there is no key
   2992 		 * management. */
   2993 		wpa_supplicant_cancel_auth_timeout(wpa_s);
   2994 		wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
   2995 #ifdef CONFIG_IBSS_RSN
   2996 	} else if (ssid->mode == WPAS_MODE_IBSS &&
   2997 		   wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
   2998 		   wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
   2999 		/*
   3000 		 * RSN IBSS authentication is per-STA and we can disable the
   3001 		 * per-BSSID authentication.
   3002 		 */
   3003 		wpa_supplicant_cancel_auth_timeout(wpa_s);
   3004 #endif /* CONFIG_IBSS_RSN */
   3005 	} else {
   3006 		/* Timeout for IEEE 802.11 authentication and association */
   3007 		int timeout = 60;
   3008 
   3009 		if (assoc_failed) {
   3010 			/* give IBSS a bit more time */
   3011 			timeout = ssid->mode == WPAS_MODE_IBSS ? 10 : 5;
   3012 		} else if (wpa_s->conf->ap_scan == 1) {
   3013 			/* give IBSS a bit more time */
   3014 			timeout = ssid->mode == WPAS_MODE_IBSS ? 20 : 10;
   3015 		}
   3016 		wpa_supplicant_req_auth_timeout(wpa_s, timeout, 0);
   3017 	}
   3018 
   3019 	if (wep_keys_set &&
   3020 	    (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC)) {
   3021 		/* Set static WEP keys again */
   3022 		wpa_set_wep_keys(wpa_s, ssid);
   3023 	}
   3024 
   3025 	if (wpa_s->current_ssid && wpa_s->current_ssid != ssid) {
   3026 		/*
   3027 		 * Do not allow EAP session resumption between different
   3028 		 * network configurations.
   3029 		 */
   3030 		eapol_sm_invalidate_cached_session(wpa_s->eapol);
   3031 	}
   3032 	old_ssid = wpa_s->current_ssid;
   3033 	wpa_s->current_ssid = ssid;
   3034 
   3035 	if (!wpas_driver_bss_selection(wpa_s) || ssid->bssid_set) {
   3036 		wpa_s->current_bss = bss;
   3037 #ifdef CONFIG_HS20
   3038 		hs20_configure_frame_filters(wpa_s);
   3039 #endif /* CONFIG_HS20 */
   3040 	}
   3041 
   3042 	wpa_supplicant_rsn_supp_set_config(wpa_s, wpa_s->current_ssid);
   3043 	wpa_supplicant_initiate_eapol(wpa_s);
   3044 	if (old_ssid != wpa_s->current_ssid)
   3045 		wpas_notify_network_changed(wpa_s);
   3046 }
   3047 
   3048 
   3049 static void wpa_supplicant_clear_connection(struct wpa_supplicant *wpa_s,
   3050 					    const u8 *addr)
   3051 {
   3052 	struct wpa_ssid *old_ssid;
   3053 
   3054 	wpas_connect_work_done(wpa_s);
   3055 	wpa_clear_keys(wpa_s, addr);
   3056 	old_ssid = wpa_s->current_ssid;
   3057 	wpa_supplicant_mark_disassoc(wpa_s);
   3058 	wpa_sm_set_config(wpa_s->wpa, NULL);
   3059 	eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
   3060 	if (old_ssid != wpa_s->current_ssid)
   3061 		wpas_notify_network_changed(wpa_s);
   3062 	eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
   3063 }
   3064 
   3065 
   3066 /**
   3067  * wpa_supplicant_deauthenticate - Deauthenticate the current connection
   3068  * @wpa_s: Pointer to wpa_supplicant data
   3069  * @reason_code: IEEE 802.11 reason code for the deauthenticate frame
   3070  *
   3071  * This function is used to request %wpa_supplicant to deauthenticate from the
   3072  * current AP.
   3073  */
   3074 void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
   3075 				   int reason_code)
   3076 {
   3077 	u8 *addr = NULL;
   3078 	union wpa_event_data event;
   3079 	int zero_addr = 0;
   3080 
   3081 	wpa_dbg(wpa_s, MSG_DEBUG, "Request to deauthenticate - bssid=" MACSTR
   3082 		" pending_bssid=" MACSTR " reason=%d state=%s",
   3083 		MAC2STR(wpa_s->bssid), MAC2STR(wpa_s->pending_bssid),
   3084 		reason_code, wpa_supplicant_state_txt(wpa_s->wpa_state));
   3085 
   3086 	if (!is_zero_ether_addr(wpa_s->pending_bssid) &&
   3087 	    (wpa_s->wpa_state == WPA_AUTHENTICATING ||
   3088 	     wpa_s->wpa_state == WPA_ASSOCIATING))
   3089 		addr = wpa_s->pending_bssid;
   3090 	else if (!is_zero_ether_addr(wpa_s->bssid))
   3091 		addr = wpa_s->bssid;
   3092 	else if (wpa_s->wpa_state == WPA_ASSOCIATING) {
   3093 		/*
   3094 		 * When using driver-based BSS selection, we may not know the
   3095 		 * BSSID with which we are currently trying to associate. We
   3096 		 * need to notify the driver of this disconnection even in such
   3097 		 * a case, so use the all zeros address here.
   3098 		 */
   3099 		addr = wpa_s->bssid;
   3100 		zero_addr = 1;
   3101 	}
   3102 
   3103 #ifdef CONFIG_TDLS
   3104 	wpa_tdls_teardown_peers(wpa_s->wpa);
   3105 #endif /* CONFIG_TDLS */
   3106 
   3107 #ifdef CONFIG_MESH
   3108 	if (wpa_s->ifmsh) {
   3109 		struct mesh_conf *mconf;
   3110 
   3111 		mconf = wpa_s->ifmsh->mconf;
   3112 		wpa_msg(wpa_s, MSG_INFO, MESH_GROUP_REMOVED "%s",
   3113 			wpa_s->ifname);
   3114 		wpas_notify_mesh_group_removed(wpa_s, mconf->meshid,
   3115 					       mconf->meshid_len, reason_code);
   3116 		wpa_supplicant_leave_mesh(wpa_s);
   3117 	}
   3118 #endif /* CONFIG_MESH */
   3119 
   3120 	if (addr) {
   3121 		wpa_drv_deauthenticate(wpa_s, addr, reason_code);
   3122 		os_memset(&event, 0, sizeof(event));
   3123 		event.deauth_info.reason_code = (u16) reason_code;
   3124 		event.deauth_info.locally_generated = 1;
   3125 		wpa_supplicant_event(wpa_s, EVENT_DEAUTH, &event);
   3126 		if (zero_addr)
   3127 			addr = NULL;
   3128 	}
   3129 
   3130 	wpa_supplicant_clear_connection(wpa_s, addr);
   3131 }
   3132 
   3133 static void wpa_supplicant_enable_one_network(struct wpa_supplicant *wpa_s,
   3134 					      struct wpa_ssid *ssid)
   3135 {
   3136 	if (!ssid || !ssid->disabled || ssid->disabled == 2)
   3137 		return;
   3138 
   3139 	ssid->disabled = 0;
   3140 	wpas_clear_temp_disabled(wpa_s, ssid, 1);
   3141 	wpas_notify_network_enabled_changed(wpa_s, ssid);
   3142 
   3143 	/*
   3144 	 * Try to reassociate since there is no current configuration and a new
   3145 	 * network was made available.
   3146 	 */
   3147 	if (!wpa_s->current_ssid && !wpa_s->disconnected)
   3148 		wpa_s->reassociate = 1;
   3149 }
   3150 
   3151 
   3152 /**
   3153  * wpa_supplicant_add_network - Add a new network
   3154  * @wpa_s: wpa_supplicant structure for a network interface
   3155  * Returns: The new network configuration or %NULL if operation failed
   3156  *
   3157  * This function performs the following operations:
   3158  * 1. Adds a new network.
   3159  * 2. Send network addition notification.
   3160  * 3. Marks the network disabled.
   3161  * 4. Set network default parameters.
   3162  */
   3163 struct wpa_ssid * wpa_supplicant_add_network(struct wpa_supplicant *wpa_s)
   3164 {
   3165 	struct wpa_ssid *ssid;
   3166 
   3167 	ssid = wpa_config_add_network(wpa_s->conf);
   3168 	if (!ssid)
   3169 		return NULL;
   3170 	wpas_notify_network_added(wpa_s, ssid);
   3171 	ssid->disabled = 1;
   3172 	wpa_config_set_network_defaults(ssid);
   3173 
   3174 	return ssid;
   3175 }
   3176 
   3177 
   3178 /**
   3179  * wpa_supplicant_remove_network - Remove a configured network based on id
   3180  * @wpa_s: wpa_supplicant structure for a network interface
   3181  * @id: Unique network id to search for
   3182  * Returns: 0 on success, or -1 if the network was not found, -2 if the network
   3183  * could not be removed
   3184  *
   3185  * This function performs the following operations:
   3186  * 1. Removes the network.
   3187  * 2. Send network removal notification.
   3188  * 3. Update internal state machines.
   3189  * 4. Stop any running sched scans.
   3190  */
   3191 int wpa_supplicant_remove_network(struct wpa_supplicant *wpa_s, int id)
   3192 {
   3193 	struct wpa_ssid *ssid;
   3194 	int was_disabled;
   3195 
   3196 	ssid = wpa_config_get_network(wpa_s->conf, id);
   3197 	if (!ssid)
   3198 		return -1;
   3199 	wpas_notify_network_removed(wpa_s, ssid);
   3200 
   3201 	if (wpa_s->last_ssid == ssid)
   3202 		wpa_s->last_ssid = NULL;
   3203 
   3204 	if (ssid == wpa_s->current_ssid || !wpa_s->current_ssid) {
   3205 #ifdef CONFIG_SME
   3206 		wpa_s->sme.prev_bssid_set = 0;
   3207 #endif /* CONFIG_SME */
   3208 		/*
   3209 		 * Invalidate the EAP session cache if the current or
   3210 		 * previously used network is removed.
   3211 		 */
   3212 		eapol_sm_invalidate_cached_session(wpa_s->eapol);
   3213 	}
   3214 
   3215 	if (ssid == wpa_s->current_ssid) {
   3216 		wpa_sm_set_config(wpa_s->wpa, NULL);
   3217 		eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
   3218 
   3219 		if (wpa_s->wpa_state >= WPA_AUTHENTICATING)
   3220 			wpa_s->own_disconnect_req = 1;
   3221 		wpa_supplicant_deauthenticate(wpa_s,
   3222 					      WLAN_REASON_DEAUTH_LEAVING);
   3223 	}
   3224 
   3225 	was_disabled = ssid->disabled;
   3226 
   3227 	if (wpa_config_remove_network(wpa_s->conf, id) < 0)
   3228 		return -2;
   3229 
   3230 	if (!was_disabled && wpa_s->sched_scanning) {
   3231 		wpa_printf(MSG_DEBUG,
   3232 			   "Stop ongoing sched_scan to remove network from filters");
   3233 		wpa_supplicant_cancel_sched_scan(wpa_s);
   3234 		wpa_supplicant_req_scan(wpa_s, 0, 0);
   3235 	}
   3236 
   3237 	return 0;
   3238 }
   3239 
   3240 
   3241 /**
   3242  * wpa_supplicant_enable_network - Mark a configured network as enabled
   3243  * @wpa_s: wpa_supplicant structure for a network interface
   3244  * @ssid: wpa_ssid structure for a configured network or %NULL
   3245  *
   3246  * Enables the specified network or all networks if no network specified.
   3247  */
   3248 void wpa_supplicant_enable_network(struct wpa_supplicant *wpa_s,
   3249 				   struct wpa_ssid *ssid)
   3250 {
   3251 	if (ssid == NULL) {
   3252 		for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
   3253 			wpa_supplicant_enable_one_network(wpa_s, ssid);
   3254 	} else
   3255 		wpa_supplicant_enable_one_network(wpa_s, ssid);
   3256 
   3257 	if (wpa_s->reassociate && !wpa_s->disconnected &&
   3258 	    (!wpa_s->current_ssid ||
   3259 	     wpa_s->wpa_state == WPA_DISCONNECTED ||
   3260 	     wpa_s->wpa_state == WPA_SCANNING)) {
   3261 		if (wpa_s->sched_scanning) {
   3262 			wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan to add "
   3263 				   "new network to scan filters");
   3264 			wpa_supplicant_cancel_sched_scan(wpa_s);
   3265 		}
   3266 
   3267 		if (wpa_supplicant_fast_associate(wpa_s) != 1) {
   3268 			wpa_s->scan_req = NORMAL_SCAN_REQ;
   3269 			wpa_supplicant_req_scan(wpa_s, 0, 0);
   3270 		}
   3271 	}
   3272 }
   3273 
   3274 
   3275 /**
   3276  * wpa_supplicant_disable_network - Mark a configured network as disabled
   3277  * @wpa_s: wpa_supplicant structure for a network interface
   3278  * @ssid: wpa_ssid structure for a configured network or %NULL
   3279  *
   3280  * Disables the specified network or all networks if no network specified.
   3281  */
   3282 void wpa_supplicant_disable_network(struct wpa_supplicant *wpa_s,
   3283 				    struct wpa_ssid *ssid)
   3284 {
   3285 	struct wpa_ssid *other_ssid;
   3286 	int was_disabled;
   3287 
   3288 	if (ssid == NULL) {
   3289 		if (wpa_s->sched_scanning)
   3290 			wpa_supplicant_cancel_sched_scan(wpa_s);
   3291 
   3292 		for (other_ssid = wpa_s->conf->ssid; other_ssid;
   3293 		     other_ssid = other_ssid->next) {
   3294 			was_disabled = other_ssid->disabled;
   3295 			if (was_disabled == 2)
   3296 				continue; /* do not change persistent P2P group
   3297 					   * data */
   3298 
   3299 			other_ssid->disabled = 1;
   3300 
   3301 			if (was_disabled != other_ssid->disabled)
   3302 				wpas_notify_network_enabled_changed(
   3303 					wpa_s, other_ssid);
   3304 		}
   3305 		if (wpa_s->current_ssid) {
   3306 			if (wpa_s->wpa_state >= WPA_AUTHENTICATING)
   3307 				wpa_s->own_disconnect_req = 1;
   3308 			wpa_supplicant_deauthenticate(
   3309 				wpa_s, WLAN_REASON_DEAUTH_LEAVING);
   3310 		}
   3311 	} else if (ssid->disabled != 2) {
   3312 		if (ssid == wpa_s->current_ssid) {
   3313 			if (wpa_s->wpa_state >= WPA_AUTHENTICATING)
   3314 				wpa_s->own_disconnect_req = 1;
   3315 			wpa_supplicant_deauthenticate(
   3316 				wpa_s, WLAN_REASON_DEAUTH_LEAVING);
   3317 		}
   3318 
   3319 		was_disabled = ssid->disabled;
   3320 
   3321 		ssid->disabled = 1;
   3322 
   3323 		if (was_disabled != ssid->disabled) {
   3324 			wpas_notify_network_enabled_changed(wpa_s, ssid);
   3325 			if (wpa_s->sched_scanning) {
   3326 				wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan "
   3327 					   "to remove network from filters");
   3328 				wpa_supplicant_cancel_sched_scan(wpa_s);
   3329 				wpa_supplicant_req_scan(wpa_s, 0, 0);
   3330 			}
   3331 		}
   3332 	}
   3333 }
   3334 
   3335 
   3336 /**
   3337  * wpa_supplicant_select_network - Attempt association with a network
   3338  * @wpa_s: wpa_supplicant structure for a network interface
   3339  * @ssid: wpa_ssid structure for a configured network or %NULL for any network
   3340  */
   3341 void wpa_supplicant_select_network(struct wpa_supplicant *wpa_s,
   3342 				   struct wpa_ssid *ssid)
   3343 {
   3344 
   3345 	struct wpa_ssid *other_ssid;
   3346 	int disconnected = 0;
   3347 
   3348 	if (ssid && ssid != wpa_s->current_ssid && wpa_s->current_ssid) {
   3349 		if (wpa_s->wpa_state >= WPA_AUTHENTICATING)
   3350 			wpa_s->own_disconnect_req = 1;
   3351 		wpa_supplicant_deauthenticate(
   3352 			wpa_s, WLAN_REASON_DEAUTH_LEAVING);
   3353 		disconnected = 1;
   3354 	}
   3355 
   3356 	if (ssid)
   3357 		wpas_clear_temp_disabled(wpa_s, ssid, 1);
   3358 
   3359 	/*
   3360 	 * Mark all other networks disabled or mark all networks enabled if no
   3361 	 * network specified.
   3362 	 */
   3363 	for (other_ssid = wpa_s->conf->ssid; other_ssid;
   3364 	     other_ssid = other_ssid->next) {
   3365 		int was_disabled = other_ssid->disabled;
   3366 		if (was_disabled == 2)
   3367 			continue; /* do not change persistent P2P group data */
   3368 
   3369 		other_ssid->disabled = ssid ? (ssid->id != other_ssid->id) : 0;
   3370 		if (was_disabled && !other_ssid->disabled)
   3371 			wpas_clear_temp_disabled(wpa_s, other_ssid, 0);
   3372 
   3373 		if (was_disabled != other_ssid->disabled)
   3374 			wpas_notify_network_enabled_changed(wpa_s, other_ssid);
   3375 	}
   3376 
   3377 	if (ssid && ssid == wpa_s->current_ssid && wpa_s->current_ssid &&
   3378 	    wpa_s->wpa_state >= WPA_AUTHENTICATING) {
   3379 		/* We are already associated with the selected network */
   3380 		wpa_printf(MSG_DEBUG, "Already associated with the "
   3381 			   "selected network - do nothing");
   3382 		return;
   3383 	}
   3384 
   3385 	if (ssid) {
   3386 		wpa_s->current_ssid = ssid;
   3387 		eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
   3388 		wpa_s->connect_without_scan =
   3389 			(ssid->mode == WPAS_MODE_MESH) ? ssid : NULL;
   3390 
   3391 		/*
   3392 		 * Don't optimize next scan freqs since a new ESS has been
   3393 		 * selected.
   3394 		 */
   3395 		os_free(wpa_s->next_scan_freqs);
   3396 		wpa_s->next_scan_freqs = NULL;
   3397 	} else {
   3398 		wpa_s->connect_without_scan = NULL;
   3399 	}
   3400 
   3401 	wpa_s->disconnected = 0;
   3402 	wpa_s->reassociate = 1;
   3403 
   3404 	if (wpa_s->connect_without_scan ||
   3405 	    wpa_supplicant_fast_associate(wpa_s) != 1) {
   3406 		wpa_s->scan_req = NORMAL_SCAN_REQ;
   3407 		wpas_scan_reset_sched_scan(wpa_s);
   3408 		wpa_supplicant_req_scan(wpa_s, 0, disconnected ? 100000 : 0);
   3409 	}
   3410 
   3411 	if (ssid)
   3412 		wpas_notify_network_selected(wpa_s, ssid);
   3413 }
   3414 
   3415 
   3416 /**
   3417  * wpas_set_pkcs11_engine_and_module_path - Set PKCS #11 engine and module path
   3418  * @wpa_s: wpa_supplicant structure for a network interface
   3419  * @pkcs11_engine_path: PKCS #11 engine path or NULL
   3420  * @pkcs11_module_path: PKCS #11 module path or NULL
   3421  * Returns: 0 on success; -1 on failure
   3422  *
   3423  * Sets the PKCS #11 engine and module path. Both have to be NULL or a valid
   3424  * path. If resetting the EAPOL state machine with the new PKCS #11 engine and
   3425  * module path fails the paths will be reset to the default value (NULL).
   3426  */
   3427 int wpas_set_pkcs11_engine_and_module_path(struct wpa_supplicant *wpa_s,
   3428 					   const char *pkcs11_engine_path,
   3429 					   const char *pkcs11_module_path)
   3430 {
   3431 	char *pkcs11_engine_path_copy = NULL;
   3432 	char *pkcs11_module_path_copy = NULL;
   3433 
   3434 	if (pkcs11_engine_path != NULL) {
   3435 		pkcs11_engine_path_copy = os_strdup(pkcs11_engine_path);
   3436 		if (pkcs11_engine_path_copy == NULL)
   3437 			return -1;
   3438 	}
   3439 	if (pkcs11_module_path != NULL) {
   3440 		pkcs11_module_path_copy = os_strdup(pkcs11_module_path);
   3441 		if (pkcs11_module_path_copy == NULL) {
   3442 			os_free(pkcs11_engine_path_copy);
   3443 			return -1;
   3444 		}
   3445 	}
   3446 
   3447 	os_free(wpa_s->conf->pkcs11_engine_path);
   3448 	os_free(wpa_s->conf->pkcs11_module_path);
   3449 	wpa_s->conf->pkcs11_engine_path = pkcs11_engine_path_copy;
   3450 	wpa_s->conf->pkcs11_module_path = pkcs11_module_path_copy;
   3451 
   3452 	wpa_sm_set_eapol(wpa_s->wpa, NULL);
   3453 	eapol_sm_deinit(wpa_s->eapol);
   3454 	wpa_s->eapol = NULL;
   3455 	if (wpa_supplicant_init_eapol(wpa_s)) {
   3456 		/* Error -> Reset paths to the default value (NULL) once. */
   3457 		if (pkcs11_engine_path != NULL && pkcs11_module_path != NULL)
   3458 			wpas_set_pkcs11_engine_and_module_path(wpa_s, NULL,
   3459 							       NULL);
   3460 
   3461 		return -1;
   3462 	}
   3463 	wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
   3464 
   3465 	return 0;
   3466 }
   3467 
   3468 
   3469 /**
   3470  * wpa_supplicant_set_ap_scan - Set AP scan mode for interface
   3471  * @wpa_s: wpa_supplicant structure for a network interface
   3472  * @ap_scan: AP scan mode
   3473  * Returns: 0 if succeed or -1 if ap_scan has an invalid value
   3474  *
   3475  */
   3476 int wpa_supplicant_set_ap_scan(struct wpa_supplicant *wpa_s, int ap_scan)
   3477 {
   3478 
   3479 	int old_ap_scan;
   3480 
   3481 	if (ap_scan < 0 || ap_scan > 2)
   3482 		return -1;
   3483 
   3484 	if (ap_scan == 2 && os_strcmp(wpa_s->driver->name, "nl80211") == 0) {
   3485 		wpa_printf(MSG_INFO,
   3486 			   "Note: nl80211 driver interface is not designed to be used with ap_scan=2; this can result in connection failures");
   3487 	}
   3488 
   3489 #ifdef ANDROID
   3490 	if (ap_scan == 2 && ap_scan != wpa_s->conf->ap_scan &&
   3491 	    wpa_s->wpa_state >= WPA_ASSOCIATING &&
   3492 	    wpa_s->wpa_state < WPA_COMPLETED) {
   3493 		wpa_printf(MSG_ERROR, "ap_scan = %d (%d) rejected while "
   3494 			   "associating", wpa_s->conf->ap_scan, ap_scan);
   3495 		return 0;
   3496 	}
   3497 #endif /* ANDROID */
   3498 
   3499 	old_ap_scan = wpa_s->conf->ap_scan;
   3500 	wpa_s->conf->ap_scan = ap_scan;
   3501 
   3502 	if (old_ap_scan != wpa_s->conf->ap_scan)
   3503 		wpas_notify_ap_scan_changed(wpa_s);
   3504 
   3505 	return 0;
   3506 }
   3507 
   3508 
   3509 /**
   3510  * wpa_supplicant_set_bss_expiration_age - Set BSS entry expiration age
   3511  * @wpa_s: wpa_supplicant structure for a network interface
   3512  * @expire_age: Expiration age in seconds
   3513  * Returns: 0 if succeed or -1 if expire_age has an invalid value
   3514  *
   3515  */
   3516 int wpa_supplicant_set_bss_expiration_age(struct wpa_supplicant *wpa_s,
   3517 					  unsigned int bss_expire_age)
   3518 {
   3519 	if (bss_expire_age < 10) {
   3520 		wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration age %u",
   3521 			bss_expire_age);
   3522 		return -1;
   3523 	}
   3524 	wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration age: %d sec",
   3525 		bss_expire_age);
   3526 	wpa_s->conf->bss_expiration_age = bss_expire_age;
   3527 
   3528 	return 0;
   3529 }
   3530 
   3531 
   3532 /**
   3533  * wpa_supplicant_set_bss_expiration_count - Set BSS entry expiration scan count
   3534  * @wpa_s: wpa_supplicant structure for a network interface
   3535  * @expire_count: number of scans after which an unseen BSS is reclaimed
   3536  * Returns: 0 if succeed or -1 if expire_count has an invalid value
   3537  *
   3538  */
   3539 int wpa_supplicant_set_bss_expiration_count(struct wpa_supplicant *wpa_s,
   3540 					    unsigned int bss_expire_count)
   3541 {
   3542 	if (bss_expire_count < 1) {
   3543 		wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration count %u",
   3544 			bss_expire_count);
   3545 		return -1;
   3546 	}
   3547 	wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration scan count: %u",
   3548 		bss_expire_count);
   3549 	wpa_s->conf->bss_expiration_scan_count = bss_expire_count;
   3550 
   3551 	return 0;
   3552 }
   3553 
   3554 
   3555 /**
   3556  * wpa_supplicant_set_scan_interval - Set scan interval
   3557  * @wpa_s: wpa_supplicant structure for a network interface
   3558  * @scan_interval: scan interval in seconds
   3559  * Returns: 0 if succeed or -1 if scan_interval has an invalid value
   3560  *
   3561  */
   3562 int wpa_supplicant_set_scan_interval(struct wpa_supplicant *wpa_s,
   3563 				     int scan_interval)
   3564 {
   3565 	if (scan_interval < 0) {
   3566 		wpa_msg(wpa_s, MSG_ERROR, "Invalid scan interval %d",
   3567 			scan_interval);
   3568 		return -1;
   3569 	}
   3570 	wpa_msg(wpa_s, MSG_DEBUG, "Setting scan interval: %d sec",
   3571 		scan_interval);
   3572 	wpa_supplicant_update_scan_int(wpa_s, scan_interval);
   3573 
   3574 	return 0;
   3575 }
   3576 
   3577 
   3578 /**
   3579  * wpa_supplicant_set_debug_params - Set global debug params
   3580  * @global: wpa_global structure
   3581  * @debug_level: debug level
   3582  * @debug_timestamp: determines if show timestamp in debug data
   3583  * @debug_show_keys: determines if show keys in debug data
   3584  * Returns: 0 if succeed or -1 if debug_level has wrong value
   3585  */
   3586 int wpa_supplicant_set_debug_params(struct wpa_global *global, int debug_level,
   3587 				    int debug_timestamp, int debug_show_keys)
   3588 {
   3589 
   3590 	int old_level, old_timestamp, old_show_keys;
   3591 
   3592 	/* check for allowed debuglevels */
   3593 	if (debug_level != MSG_EXCESSIVE &&
   3594 	    debug_level != MSG_MSGDUMP &&
   3595 	    debug_level != MSG_DEBUG &&
   3596 	    debug_level != MSG_INFO &&
   3597 	    debug_level != MSG_WARNING &&
   3598 	    debug_level != MSG_ERROR)
   3599 		return -1;
   3600 
   3601 	old_level = wpa_debug_level;
   3602 	old_timestamp = wpa_debug_timestamp;
   3603 	old_show_keys = wpa_debug_show_keys;
   3604 
   3605 	wpa_debug_level = debug_level;
   3606 	wpa_debug_timestamp = debug_timestamp ? 1 : 0;
   3607 	wpa_debug_show_keys = debug_show_keys ? 1 : 0;
   3608 
   3609 	if (wpa_debug_level != old_level)
   3610 		wpas_notify_debug_level_changed(global);
   3611 	if (wpa_debug_timestamp != old_timestamp)
   3612 		wpas_notify_debug_timestamp_changed(global);
   3613 	if (wpa_debug_show_keys != old_show_keys)
   3614 		wpas_notify_debug_show_keys_changed(global);
   3615 
   3616 	return 0;
   3617 }
   3618 
   3619 
   3620 #ifdef CONFIG_OWE
   3621 static int owe_trans_ssid_match(struct wpa_supplicant *wpa_s, const u8 *bssid,
   3622 				const u8 *entry_ssid, size_t entry_ssid_len)
   3623 {
   3624 	const u8 *owe, *pos, *end;
   3625 	u8 ssid_len;
   3626 	struct wpa_bss *bss;
   3627 
   3628 	/* Check network profile SSID aganst the SSID in the
   3629 	 * OWE Transition Mode element. */
   3630 
   3631 	bss = wpa_bss_get_bssid_latest(wpa_s, bssid);
   3632 	if (!bss)
   3633 		return 0;
   3634 
   3635 	owe = wpa_bss_get_vendor_ie(bss, OWE_IE_VENDOR_TYPE);
   3636 	if (!owe)
   3637 		return 0;
   3638 
   3639 	pos = owe + 6;
   3640 	end = owe + 2 + owe[1];
   3641 
   3642 	if (end - pos < ETH_ALEN + 1)
   3643 		return 0;
   3644 	pos += ETH_ALEN;
   3645 	ssid_len = *pos++;
   3646 	if (end - pos < ssid_len || ssid_len > SSID_MAX_LEN)
   3647 		return 0;
   3648 
   3649 	return entry_ssid_len == ssid_len &&
   3650 		os_memcmp(pos, entry_ssid, ssid_len) == 0;
   3651 }
   3652 #endif /* CONFIG_OWE */
   3653 
   3654 
   3655 /**
   3656  * wpa_supplicant_get_ssid - Get a pointer to the current network structure
   3657  * @wpa_s: Pointer to wpa_supplicant data
   3658  * Returns: A pointer to the current network structure or %NULL on failure
   3659  */
   3660 struct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s)
   3661 {
   3662 	struct wpa_ssid *entry;
   3663 	u8 ssid[SSID_MAX_LEN];
   3664 	int res;
   3665 	size_t ssid_len;
   3666 	u8 bssid[ETH_ALEN];
   3667 	int wired;
   3668 
   3669 	res = wpa_drv_get_ssid(wpa_s, ssid);
   3670 	if (res < 0) {
   3671 		wpa_msg(wpa_s, MSG_WARNING, "Could not read SSID from "
   3672 			"driver");
   3673 		return NULL;
   3674 	}
   3675 	ssid_len = res;
   3676 
   3677 	if (wpa_drv_get_bssid(wpa_s, bssid) < 0) {
   3678 		wpa_msg(wpa_s, MSG_WARNING, "Could not read BSSID from "
   3679 			"driver");
   3680 		return NULL;
   3681 	}
   3682 
   3683 	wired = wpa_s->conf->ap_scan == 0 &&
   3684 		(wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED);
   3685 
   3686 	entry = wpa_s->conf->ssid;
   3687 	while (entry) {
   3688 		if (!wpas_network_disabled(wpa_s, entry) &&
   3689 		    ((ssid_len == entry->ssid_len &&
   3690 		      os_memcmp(ssid, entry->ssid, ssid_len) == 0) || wired) &&
   3691 		    (!entry->bssid_set ||
   3692 		     os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
   3693 			return entry;
   3694 #ifdef CONFIG_WPS
   3695 		if (!wpas_network_disabled(wpa_s, entry) &&
   3696 		    (entry->key_mgmt & WPA_KEY_MGMT_WPS) &&
   3697 		    (entry->ssid == NULL || entry->ssid_len == 0) &&
   3698 		    (!entry->bssid_set ||
   3699 		     os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
   3700 			return entry;
   3701 #endif /* CONFIG_WPS */
   3702 
   3703 #ifdef CONFIG_OWE
   3704 		if (!wpas_network_disabled(wpa_s, entry) &&
   3705 		    owe_trans_ssid_match(wpa_s, bssid, entry->ssid,
   3706 		    entry->ssid_len) &&
   3707 		    (!entry->bssid_set ||
   3708 		     os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
   3709 			return entry;
   3710 #endif /* CONFIG_OWE */
   3711 
   3712 		if (!wpas_network_disabled(wpa_s, entry) && entry->bssid_set &&
   3713 		    entry->ssid_len == 0 &&
   3714 		    os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0)
   3715 			return entry;
   3716 
   3717 		entry = entry->next;
   3718 	}
   3719 
   3720 	return NULL;
   3721 }
   3722 
   3723 
   3724 static int select_driver(struct wpa_supplicant *wpa_s, int i)
   3725 {
   3726 	struct wpa_global *global = wpa_s->global;
   3727 
   3728 	if (wpa_drivers[i]->global_init && global->drv_priv[i] == NULL) {
   3729 		global->drv_priv[i] = wpa_drivers[i]->global_init(global);
   3730 		if (global->drv_priv[i] == NULL) {
   3731 			wpa_printf(MSG_ERROR, "Failed to initialize driver "
   3732 				   "'%s'", wpa_drivers[i]->name);
   3733 			return -1;
   3734 		}
   3735 	}
   3736 
   3737 	wpa_s->driver = wpa_drivers[i];
   3738 	wpa_s->global_drv_priv = global->drv_priv[i];
   3739 
   3740 	return 0;
   3741 }
   3742 
   3743 
   3744 static int wpa_supplicant_set_driver(struct wpa_supplicant *wpa_s,
   3745 				     const char *name)
   3746 {
   3747 	int i;
   3748 	size_t len;
   3749 	const char *pos, *driver = name;
   3750 
   3751 	if (wpa_s == NULL)
   3752 		return -1;
   3753 
   3754 	if (wpa_drivers[0] == NULL) {
   3755 		wpa_msg(wpa_s, MSG_ERROR, "No driver interfaces build into "
   3756 			"wpa_supplicant");
   3757 		return -1;
   3758 	}
   3759 
   3760 	if (name == NULL) {
   3761 		/* default to first driver in the list */
   3762 		return select_driver(wpa_s, 0);
   3763 	}
   3764 
   3765 	do {
   3766 		pos = os_strchr(driver, ',');
   3767 		if (pos)
   3768 			len = pos - driver;
   3769 		else
   3770 			len = os_strlen(driver);
   3771 
   3772 		for (i = 0; wpa_drivers[i]; i++) {
   3773 			if (os_strlen(wpa_drivers[i]->name) == len &&
   3774 			    os_strncmp(driver, wpa_drivers[i]->name, len) ==
   3775 			    0) {
   3776 				/* First driver that succeeds wins */
   3777 				if (select_driver(wpa_s, i) == 0)
   3778 					return 0;
   3779 			}
   3780 		}
   3781 
   3782 		driver = pos + 1;
   3783 	} while (pos);
   3784 
   3785 	wpa_msg(wpa_s, MSG_ERROR, "Unsupported driver '%s'", name);
   3786 	return -1;
   3787 }
   3788 
   3789 
   3790 /**
   3791  * wpa_supplicant_rx_eapol - Deliver a received EAPOL frame to wpa_supplicant
   3792  * @ctx: Context pointer (wpa_s); this is the ctx variable registered
   3793  *	with struct wpa_driver_ops::init()
   3794  * @src_addr: Source address of the EAPOL frame
   3795  * @buf: EAPOL data starting from the EAPOL header (i.e., no Ethernet header)
   3796  * @len: Length of the EAPOL data
   3797  *
   3798  * This function is called for each received EAPOL frame. Most driver
   3799  * interfaces rely on more generic OS mechanism for receiving frames through
   3800  * l2_packet, but if such a mechanism is not available, the driver wrapper may
   3801  * take care of received EAPOL frames and deliver them to the core supplicant
   3802  * code by calling this function.
   3803  */
   3804 void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr,
   3805 			     const u8 *buf, size_t len)
   3806 {
   3807 	struct wpa_supplicant *wpa_s = ctx;
   3808 
   3809 	wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR, MAC2STR(src_addr));
   3810 	wpa_hexdump(MSG_MSGDUMP, "RX EAPOL", buf, len);
   3811 
   3812 #ifdef CONFIG_TESTING_OPTIONS
   3813 	if (wpa_s->ignore_auth_resp) {
   3814 		wpa_printf(MSG_INFO, "RX EAPOL - ignore_auth_resp active!");
   3815 		return;
   3816 	}
   3817 #endif /* CONFIG_TESTING_OPTIONS */
   3818 
   3819 	if (wpa_s->wpa_state < WPA_ASSOCIATED ||
   3820 	    (wpa_s->last_eapol_matches_bssid &&
   3821 #ifdef CONFIG_AP
   3822 	     !wpa_s->ap_iface &&
   3823 #endif /* CONFIG_AP */
   3824 	     os_memcmp(src_addr, wpa_s->bssid, ETH_ALEN) != 0)) {
   3825 		/*
   3826 		 * There is possible race condition between receiving the
   3827 		 * association event and the EAPOL frame since they are coming
   3828 		 * through different paths from the driver. In order to avoid
   3829 		 * issues in trying to process the EAPOL frame before receiving
   3830 		 * association information, lets queue it for processing until
   3831 		 * the association event is received. This may also be needed in
   3832 		 * driver-based roaming case, so also use src_addr != BSSID as a
   3833 		 * trigger if we have previously confirmed that the
   3834 		 * Authenticator uses BSSID as the src_addr (which is not the
   3835 		 * case with wired IEEE 802.1X).
   3836 		 */
   3837 		wpa_dbg(wpa_s, MSG_DEBUG, "Not associated - Delay processing "
   3838 			"of received EAPOL frame (state=%s bssid=" MACSTR ")",
   3839 			wpa_supplicant_state_txt(wpa_s->wpa_state),
   3840 			MAC2STR(wpa_s->bssid));
   3841 		wpabuf_free(wpa_s->pending_eapol_rx);
   3842 		wpa_s->pending_eapol_rx = wpabuf_alloc_copy(buf, len);
   3843 		if (wpa_s->pending_eapol_rx) {
   3844 			os_get_reltime(&wpa_s->pending_eapol_rx_time);
   3845 			os_memcpy(wpa_s->pending_eapol_rx_src, src_addr,
   3846 				  ETH_ALEN);
   3847 		}
   3848 		return;
   3849 	}
   3850 
   3851 	wpa_s->last_eapol_matches_bssid =
   3852 		os_memcmp(src_addr, wpa_s->bssid, ETH_ALEN) == 0;
   3853 
   3854 #ifdef CONFIG_AP
   3855 	if (wpa_s->ap_iface) {
   3856 		wpa_supplicant_ap_rx_eapol(wpa_s, src_addr, buf, len);
   3857 		return;
   3858 	}
   3859 #endif /* CONFIG_AP */
   3860 
   3861 	if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE) {
   3862 		wpa_dbg(wpa_s, MSG_DEBUG, "Ignored received EAPOL frame since "
   3863 			"no key management is configured");
   3864 		return;
   3865 	}
   3866 
   3867 	if (wpa_s->eapol_received == 0 &&
   3868 	    (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) ||
   3869 	     !wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) ||
   3870 	     wpa_s->wpa_state != WPA_COMPLETED) &&
   3871 	    (wpa_s->current_ssid == NULL ||
   3872 	     wpa_s->current_ssid->mode != IEEE80211_MODE_IBSS)) {
   3873 		/* Timeout for completing IEEE 802.1X and WPA authentication */
   3874 		int timeout = 10;
   3875 
   3876 		if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) ||
   3877 		    wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA ||
   3878 		    wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) {
   3879 			/* Use longer timeout for IEEE 802.1X/EAP */
   3880 			timeout = 70;
   3881 		}
   3882 
   3883 #ifdef CONFIG_WPS
   3884 		if (wpa_s->current_ssid && wpa_s->current_bss &&
   3885 		    (wpa_s->current_ssid->key_mgmt & WPA_KEY_MGMT_WPS) &&
   3886 		    eap_is_wps_pin_enrollee(&wpa_s->current_ssid->eap)) {
   3887 			/*
   3888 			 * Use shorter timeout if going through WPS AP iteration
   3889 			 * for PIN config method with an AP that does not
   3890 			 * advertise Selected Registrar.
   3891 			 */
   3892 			struct wpabuf *wps_ie;
   3893 
   3894 			wps_ie = wpa_bss_get_vendor_ie_multi(
   3895 				wpa_s->current_bss, WPS_IE_VENDOR_TYPE);
   3896 			if (wps_ie &&
   3897 			    !wps_is_addr_authorized(wps_ie, wpa_s->own_addr, 1))
   3898 				timeout = 10;
   3899 			wpabuf_free(wps_ie);
   3900 		}
   3901 #endif /* CONFIG_WPS */
   3902 
   3903 		wpa_supplicant_req_auth_timeout(wpa_s, timeout, 0);
   3904 	}
   3905 	wpa_s->eapol_received++;
   3906 
   3907 	if (wpa_s->countermeasures) {
   3908 		wpa_msg(wpa_s, MSG_INFO, "WPA: Countermeasures - dropped "
   3909 			"EAPOL packet");
   3910 		return;
   3911 	}
   3912 
   3913 #ifdef CONFIG_IBSS_RSN
   3914 	if (wpa_s->current_ssid &&
   3915 	    wpa_s->current_ssid->mode == WPAS_MODE_IBSS) {
   3916 		ibss_rsn_rx_eapol(wpa_s->ibss_rsn, src_addr, buf, len);
   3917 		return;
   3918 	}
   3919 #endif /* CONFIG_IBSS_RSN */
   3920 
   3921 	/* Source address of the incoming EAPOL frame could be compared to the
   3922 	 * current BSSID. However, it is possible that a centralized
   3923 	 * Authenticator could be using another MAC address than the BSSID of
   3924 	 * an AP, so just allow any address to be used for now. The replies are
   3925 	 * still sent to the current BSSID (if available), though. */
   3926 
   3927 	os_memcpy(wpa_s->last_eapol_src, src_addr, ETH_ALEN);
   3928 	if (!wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) &&
   3929 	    wpa_s->key_mgmt != WPA_KEY_MGMT_OWE &&
   3930 	    wpa_s->key_mgmt != WPA_KEY_MGMT_DPP &&
   3931 	    eapol_sm_rx_eapol(wpa_s->eapol, src_addr, buf, len) > 0)
   3932 		return;
   3933 	wpa_drv_poll(wpa_s);
   3934 	if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE))
   3935 		wpa_sm_rx_eapol(wpa_s->wpa, src_addr, buf, len);
   3936 	else if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt)) {
   3937 		/*
   3938 		 * Set portValid = TRUE here since we are going to skip 4-way
   3939 		 * handshake processing which would normally set portValid. We
   3940 		 * need this to allow the EAPOL state machines to be completed
   3941 		 * without going through EAPOL-Key handshake.
   3942 		 */
   3943 		eapol_sm_notify_portValid(wpa_s->eapol, TRUE);
   3944 	}
   3945 }
   3946 
   3947 
   3948 int wpa_supplicant_update_mac_addr(struct wpa_supplicant *wpa_s)
   3949 {
   3950 	if ((!wpa_s->p2p_mgmt ||
   3951 	     !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)) &&
   3952 	    !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE)) {
   3953 		l2_packet_deinit(wpa_s->l2);
   3954 		wpa_s->l2 = l2_packet_init(wpa_s->ifname,
   3955 					   wpa_drv_get_mac_addr(wpa_s),
   3956 					   ETH_P_EAPOL,
   3957 					   wpa_supplicant_rx_eapol, wpa_s, 0);
   3958 		if (wpa_s->l2 == NULL)
   3959 			return -1;
   3960 	} else {
   3961 		const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
   3962 		if (addr)
   3963 			os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
   3964 	}
   3965 
   3966 	if (wpa_s->l2 && l2_packet_get_own_addr(wpa_s->l2, wpa_s->own_addr)) {
   3967 		wpa_msg(wpa_s, MSG_ERROR, "Failed to get own L2 address");
   3968 		return -1;
   3969 	}
   3970 
   3971 	wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
   3972 
   3973 	return 0;
   3974 }
   3975 
   3976 
   3977 static void wpa_supplicant_rx_eapol_bridge(void *ctx, const u8 *src_addr,
   3978 					   const u8 *buf, size_t len)
   3979 {
   3980 	struct wpa_supplicant *wpa_s = ctx;
   3981 	const struct l2_ethhdr *eth;
   3982 
   3983 	if (len < sizeof(*eth))
   3984 		return;
   3985 	eth = (const struct l2_ethhdr *) buf;
   3986 
   3987 	if (os_memcmp(eth->h_dest, wpa_s->own_addr, ETH_ALEN) != 0 &&
   3988 	    !(eth->h_dest[0] & 0x01)) {
   3989 		wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR " to " MACSTR
   3990 			" (bridge - not for this interface - ignore)",
   3991 			MAC2STR(src_addr), MAC2STR(eth->h_dest));
   3992 		return;
   3993 	}
   3994 
   3995 	wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR " to " MACSTR
   3996 		" (bridge)", MAC2STR(src_addr), MAC2STR(eth->h_dest));
   3997 	wpa_supplicant_rx_eapol(wpa_s, src_addr, buf + sizeof(*eth),
   3998 				len - sizeof(*eth));
   3999 }
   4000 
   4001 
   4002 /**
   4003  * wpa_supplicant_driver_init - Initialize driver interface parameters
   4004  * @wpa_s: Pointer to wpa_supplicant data
   4005  * Returns: 0 on success, -1 on failure
   4006  *
   4007  * This function is called to initialize driver interface parameters.
   4008  * wpa_drv_init() must have been called before this function to initialize the
   4009  * driver interface.
   4010  */
   4011 int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s)
   4012 {
   4013 	static int interface_count = 0;
   4014 
   4015 	if (wpa_supplicant_update_mac_addr(wpa_s) < 0)
   4016 		return -1;
   4017 
   4018 	wpa_dbg(wpa_s, MSG_DEBUG, "Own MAC address: " MACSTR,
   4019 		MAC2STR(wpa_s->own_addr));
   4020 	os_memcpy(wpa_s->perm_addr, wpa_s->own_addr, ETH_ALEN);
   4021 	wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
   4022 
   4023 	if (wpa_s->bridge_ifname[0]) {
   4024 		wpa_dbg(wpa_s, MSG_DEBUG, "Receiving packets from bridge "
   4025 			"interface '%s'", wpa_s->bridge_ifname);
   4026 		wpa_s->l2_br = l2_packet_init_bridge(
   4027 			wpa_s->bridge_ifname, wpa_s->ifname, wpa_s->own_addr,
   4028 			ETH_P_EAPOL, wpa_supplicant_rx_eapol_bridge, wpa_s, 1);
   4029 		if (wpa_s->l2_br == NULL) {
   4030 			wpa_msg(wpa_s, MSG_ERROR, "Failed to open l2_packet "
   4031 				"connection for the bridge interface '%s'",
   4032 				wpa_s->bridge_ifname);
   4033 			return -1;
   4034 		}
   4035 	}
   4036 
   4037 	if (wpa_s->conf->ap_scan == 2 &&
   4038 	    os_strcmp(wpa_s->driver->name, "nl80211") == 0) {
   4039 		wpa_printf(MSG_INFO,
   4040 			   "Note: nl80211 driver interface is not designed to be used with ap_scan=2; this can result in connection failures");
   4041 	}
   4042 
   4043 	wpa_clear_keys(wpa_s, NULL);
   4044 
   4045 	/* Make sure that TKIP countermeasures are not left enabled (could
   4046 	 * happen if wpa_supplicant is killed during countermeasures. */
   4047 	wpa_drv_set_countermeasures(wpa_s, 0);
   4048 
   4049 	wpa_dbg(wpa_s, MSG_DEBUG, "RSN: flushing PMKID list in the driver");
   4050 	wpa_drv_flush_pmkid(wpa_s);
   4051 
   4052 	wpa_s->prev_scan_ssid = WILDCARD_SSID_SCAN;
   4053 	wpa_s->prev_scan_wildcard = 0;
   4054 
   4055 	if (wpa_supplicant_enabled_networks(wpa_s)) {
   4056 		if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
   4057 			wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
   4058 			interface_count = 0;
   4059 		}
   4060 #ifndef ANDROID
   4061 		if (!wpa_s->p2p_mgmt &&
   4062 		    wpa_supplicant_delayed_sched_scan(wpa_s,
   4063 						      interface_count % 3,
   4064 						      100000))
   4065 			wpa_supplicant_req_scan(wpa_s, interface_count % 3,
   4066 						100000);
   4067 #endif /* ANDROID */
   4068 		interface_count++;
   4069 	} else
   4070 		wpa_supplicant_set_state(wpa_s, WPA_INACTIVE);
   4071 
   4072 	return 0;
   4073 }
   4074 
   4075 
   4076 static int wpa_supplicant_daemon(const char *pid_file)
   4077 {
   4078 	wpa_printf(MSG_DEBUG, "Daemonize..");
   4079 	return os_daemonize(pid_file);
   4080 }
   4081 
   4082 
   4083 static struct wpa_supplicant *
   4084 wpa_supplicant_alloc(struct wpa_supplicant *parent)
   4085 {
   4086 	struct wpa_supplicant *wpa_s;
   4087 
   4088 	wpa_s = os_zalloc(sizeof(*wpa_s));
   4089 	if (wpa_s == NULL)
   4090 		return NULL;
   4091 	wpa_s->scan_req = INITIAL_SCAN_REQ;
   4092 	wpa_s->scan_interval = 5;
   4093 	wpa_s->new_connection = 1;
   4094 	wpa_s->parent = parent ? parent : wpa_s;
   4095 	wpa_s->p2pdev = wpa_s->parent;
   4096 	wpa_s->sched_scanning = 0;
   4097 
   4098 	dl_list_init(&wpa_s->bss_tmp_disallowed);
   4099 	dl_list_init(&wpa_s->fils_hlp_req);
   4100 
   4101 	return wpa_s;
   4102 }
   4103 
   4104 
   4105 #ifdef CONFIG_HT_OVERRIDES
   4106 
   4107 static int wpa_set_htcap_mcs(struct wpa_supplicant *wpa_s,
   4108 			     struct ieee80211_ht_capabilities *htcaps,
   4109 			     struct ieee80211_ht_capabilities *htcaps_mask,
   4110 			     const char *ht_mcs)
   4111 {
   4112 	/* parse ht_mcs into hex array */
   4113 	int i;
   4114 	const char *tmp = ht_mcs;
   4115 	char *end = NULL;
   4116 
   4117 	/* If ht_mcs is null, do not set anything */
   4118 	if (!ht_mcs)
   4119 		return 0;
   4120 
   4121 	/* This is what we are setting in the kernel */
   4122 	os_memset(&htcaps->supported_mcs_set, 0, IEEE80211_HT_MCS_MASK_LEN);
   4123 
   4124 	wpa_msg(wpa_s, MSG_DEBUG, "set_htcap, ht_mcs -:%s:-", ht_mcs);
   4125 
   4126 	for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
   4127 		long v;
   4128 
   4129 		errno = 0;
   4130 		v = strtol(tmp, &end, 16);
   4131 
   4132 		if (errno == 0) {
   4133 			wpa_msg(wpa_s, MSG_DEBUG,
   4134 				"htcap value[%i]: %ld end: %p  tmp: %p",
   4135 				i, v, end, tmp);
   4136 			if (end == tmp)
   4137 				break;
   4138 
   4139 			htcaps->supported_mcs_set[i] = v;
   4140 			tmp = end;
   4141 		} else {
   4142 			wpa_msg(wpa_s, MSG_ERROR,
   4143 				"Failed to parse ht-mcs: %s, error: %s\n",
   4144 				ht_mcs, strerror(errno));
   4145 			return -1;
   4146 		}
   4147 	}
   4148 
   4149 	/*
   4150 	 * If we were able to parse any values, then set mask for the MCS set.
   4151 	 */
   4152 	if (i) {
   4153 		os_memset(&htcaps_mask->supported_mcs_set, 0xff,
   4154 			  IEEE80211_HT_MCS_MASK_LEN - 1);
   4155 		/* skip the 3 reserved bits */
   4156 		htcaps_mask->supported_mcs_set[IEEE80211_HT_MCS_MASK_LEN - 1] =
   4157 			0x1f;
   4158 	}
   4159 
   4160 	return 0;
   4161 }
   4162 
   4163 
   4164 static int wpa_disable_max_amsdu(struct wpa_supplicant *wpa_s,
   4165 				 struct ieee80211_ht_capabilities *htcaps,
   4166 				 struct ieee80211_ht_capabilities *htcaps_mask,
   4167 				 int disabled)
   4168 {
   4169 	le16 msk;
   4170 
   4171 	wpa_msg(wpa_s, MSG_DEBUG, "set_disable_max_amsdu: %d", disabled);
   4172 
   4173 	if (disabled == -1)
   4174 		return 0;
   4175 
   4176 	msk = host_to_le16(HT_CAP_INFO_MAX_AMSDU_SIZE);
   4177 	htcaps_mask->ht_capabilities_info |= msk;
   4178 	if (disabled)
   4179 		htcaps->ht_capabilities_info &= msk;
   4180 	else
   4181 		htcaps->ht_capabilities_info |= msk;
   4182 
   4183 	return 0;
   4184 }
   4185 
   4186 
   4187 static int wpa_set_ampdu_factor(struct wpa_supplicant *wpa_s,
   4188 				struct ieee80211_ht_capabilities *htcaps,
   4189 				struct ieee80211_ht_capabilities *htcaps_mask,
   4190 				int factor)
   4191 {
   4192 	wpa_msg(wpa_s, MSG_DEBUG, "set_ampdu_factor: %d", factor);
   4193 
   4194 	if (factor == -1)
   4195 		return 0;
   4196 
   4197 	if (factor < 0 || factor > 3) {
   4198 		wpa_msg(wpa_s, MSG_ERROR, "ampdu_factor: %d out of range. "
   4199 			"Must be 0-3 or -1", factor);
   4200 		return -EINVAL;
   4201 	}
   4202 
   4203 	htcaps_mask->a_mpdu_params |= 0x3; /* 2 bits for factor */
   4204 	htcaps->a_mpdu_params &= ~0x3;
   4205 	htcaps->a_mpdu_params |= factor & 0x3;
   4206 
   4207 	return 0;
   4208 }
   4209 
   4210 
   4211 static int wpa_set_ampdu_density(struct wpa_supplicant *wpa_s,
   4212 				 struct ieee80211_ht_capabilities *htcaps,
   4213 				 struct ieee80211_ht_capabilities *htcaps_mask,
   4214 				 int density)
   4215 {
   4216 	wpa_msg(wpa_s, MSG_DEBUG, "set_ampdu_density: %d", density);
   4217 
   4218 	if (density == -1)
   4219 		return 0;
   4220 
   4221 	if (density < 0 || density > 7) {
   4222 		wpa_msg(wpa_s, MSG_ERROR,
   4223 			"ampdu_density: %d out of range. Must be 0-7 or -1.",
   4224 			density);
   4225 		return -EINVAL;
   4226 	}
   4227 
   4228 	htcaps_mask->a_mpdu_params |= 0x1C;
   4229 	htcaps->a_mpdu_params &= ~(0x1C);
   4230 	htcaps->a_mpdu_params |= (density << 2) & 0x1C;
   4231 
   4232 	return 0;
   4233 }
   4234 
   4235 
   4236 static int wpa_set_disable_ht40(struct wpa_supplicant *wpa_s,
   4237 				struct ieee80211_ht_capabilities *htcaps,
   4238 				struct ieee80211_ht_capabilities *htcaps_mask,
   4239 				int disabled)
   4240 {
   4241 	wpa_msg(wpa_s, MSG_DEBUG, "set_disable_ht40: %d", disabled);
   4242 
   4243 	set_disable_ht40(htcaps, disabled);
   4244 	set_disable_ht40(htcaps_mask, 0);
   4245 
   4246 	return 0;
   4247 }
   4248 
   4249 
   4250 static int wpa_set_disable_sgi(struct wpa_supplicant *wpa_s,
   4251 			       struct ieee80211_ht_capabilities *htcaps,
   4252 			       struct ieee80211_ht_capabilities *htcaps_mask,
   4253 			       int disabled)
   4254 {
   4255 	/* Masking these out disables SGI */
   4256 	le16 msk = host_to_le16(HT_CAP_INFO_SHORT_GI20MHZ |
   4257 				HT_CAP_INFO_SHORT_GI40MHZ);
   4258 
   4259 	wpa_msg(wpa_s, MSG_DEBUG, "set_disable_sgi: %d", disabled);
   4260 
   4261 	if (disabled)
   4262 		htcaps->ht_capabilities_info &= ~msk;
   4263 	else
   4264 		htcaps->ht_capabilities_info |= msk;
   4265 
   4266 	htcaps_mask->ht_capabilities_info |= msk;
   4267 
   4268 	return 0;
   4269 }
   4270 
   4271 
   4272 static int wpa_set_disable_ldpc(struct wpa_supplicant *wpa_s,
   4273 			       struct ieee80211_ht_capabilities *htcaps,
   4274 			       struct ieee80211_ht_capabilities *htcaps_mask,
   4275 			       int disabled)
   4276 {
   4277 	/* Masking these out disables LDPC */
   4278 	le16 msk = host_to_le16(HT_CAP_INFO_LDPC_CODING_CAP);
   4279 
   4280 	wpa_msg(wpa_s, MSG_DEBUG, "set_disable_ldpc: %d", disabled);
   4281 
   4282 	if (disabled)
   4283 		htcaps->ht_capabilities_info &= ~msk;
   4284 	else
   4285 		htcaps->ht_capabilities_info |= msk;
   4286 
   4287 	htcaps_mask->ht_capabilities_info |= msk;
   4288 
   4289 	return 0;
   4290 }
   4291 
   4292 
   4293 void wpa_supplicant_apply_ht_overrides(
   4294 	struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
   4295 	struct wpa_driver_associate_params *params)
   4296 {
   4297 	struct ieee80211_ht_capabilities *htcaps;
   4298 	struct ieee80211_ht_capabilities *htcaps_mask;
   4299 
   4300 	if (!ssid)
   4301 		return;
   4302 
   4303 	params->disable_ht = ssid->disable_ht;
   4304 	if (!params->htcaps || !params->htcaps_mask)
   4305 		return;
   4306 
   4307 	htcaps = (struct ieee80211_ht_capabilities *) params->htcaps;
   4308 	htcaps_mask = (struct ieee80211_ht_capabilities *) params->htcaps_mask;
   4309 	wpa_set_htcap_mcs(wpa_s, htcaps, htcaps_mask, ssid->ht_mcs);
   4310 	wpa_disable_max_amsdu(wpa_s, htcaps, htcaps_mask,
   4311 			      ssid->disable_max_amsdu);
   4312 	wpa_set_ampdu_factor(wpa_s, htcaps, htcaps_mask, ssid->ampdu_factor);
   4313 	wpa_set_ampdu_density(wpa_s, htcaps, htcaps_mask, ssid->ampdu_density);
   4314 	wpa_set_disable_ht40(wpa_s, htcaps, htcaps_mask, ssid->disable_ht40);
   4315 	wpa_set_disable_sgi(wpa_s, htcaps, htcaps_mask, ssid->disable_sgi);
   4316 	wpa_set_disable_ldpc(wpa_s, htcaps, htcaps_mask, ssid->disable_ldpc);
   4317 
   4318 	if (ssid->ht40_intolerant) {
   4319 		le16 bit = host_to_le16(HT_CAP_INFO_40MHZ_INTOLERANT);
   4320 		htcaps->ht_capabilities_info |= bit;
   4321 		htcaps_mask->ht_capabilities_info |= bit;
   4322 	}
   4323 }
   4324 
   4325 #endif /* CONFIG_HT_OVERRIDES */
   4326 
   4327 
   4328 #ifdef CONFIG_VHT_OVERRIDES
   4329 void wpa_supplicant_apply_vht_overrides(
   4330 	struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
   4331 	struct wpa_driver_associate_params *params)
   4332 {
   4333 	struct ieee80211_vht_capabilities *vhtcaps;
   4334 	struct ieee80211_vht_capabilities *vhtcaps_mask;
   4335 
   4336 	if (!ssid)
   4337 		return;
   4338 
   4339 	params->disable_vht = ssid->disable_vht;
   4340 
   4341 	vhtcaps = (void *) params->vhtcaps;
   4342 	vhtcaps_mask = (void *) params->vhtcaps_mask;
   4343 
   4344 	if (!vhtcaps || !vhtcaps_mask)
   4345 		return;
   4346 
   4347 	vhtcaps->vht_capabilities_info = host_to_le32(ssid->vht_capa);
   4348 	vhtcaps_mask->vht_capabilities_info = host_to_le32(ssid->vht_capa_mask);
   4349 
   4350 #ifdef CONFIG_HT_OVERRIDES
   4351 	/* if max ampdu is <= 3, we have to make the HT cap the same */
   4352 	if (ssid->vht_capa_mask & VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX) {
   4353 		int max_ampdu;
   4354 
   4355 		max_ampdu = (ssid->vht_capa &
   4356 			     VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX) >>
   4357 			VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX_SHIFT;
   4358 
   4359 		max_ampdu = max_ampdu < 3 ? max_ampdu : 3;
   4360 		wpa_set_ampdu_factor(wpa_s,
   4361 				     (void *) params->htcaps,
   4362 				     (void *) params->htcaps_mask,
   4363 				     max_ampdu);
   4364 	}
   4365 #endif /* CONFIG_HT_OVERRIDES */
   4366 
   4367 #define OVERRIDE_MCS(i)							\
   4368 	if (ssid->vht_tx_mcs_nss_ ##i >= 0) {				\
   4369 		vhtcaps_mask->vht_supported_mcs_set.tx_map |=		\
   4370 			host_to_le16(3 << 2 * (i - 1));			\
   4371 		vhtcaps->vht_supported_mcs_set.tx_map |=		\
   4372 			host_to_le16(ssid->vht_tx_mcs_nss_ ##i <<	\
   4373 				     2 * (i - 1));			\
   4374 	}								\
   4375 	if (ssid->vht_rx_mcs_nss_ ##i >= 0) {				\
   4376 		vhtcaps_mask->vht_supported_mcs_set.rx_map |=		\
   4377 			host_to_le16(3 << 2 * (i - 1));			\
   4378 		vhtcaps->vht_supported_mcs_set.rx_map |=		\
   4379 			host_to_le16(ssid->vht_rx_mcs_nss_ ##i <<	\
   4380 				     2 * (i - 1));			\
   4381 	}
   4382 
   4383 	OVERRIDE_MCS(1);
   4384 	OVERRIDE_MCS(2);
   4385 	OVERRIDE_MCS(3);
   4386 	OVERRIDE_MCS(4);
   4387 	OVERRIDE_MCS(5);
   4388 	OVERRIDE_MCS(6);
   4389 	OVERRIDE_MCS(7);
   4390 	OVERRIDE_MCS(8);
   4391 }
   4392 #endif /* CONFIG_VHT_OVERRIDES */
   4393 
   4394 
   4395 static int pcsc_reader_init(struct wpa_supplicant *wpa_s)
   4396 {
   4397 #ifdef PCSC_FUNCS
   4398 	size_t len;
   4399 
   4400 	if (!wpa_s->conf->pcsc_reader)
   4401 		return 0;
   4402 
   4403 	wpa_s->scard = scard_init(wpa_s->conf->pcsc_reader);
   4404 	if (!wpa_s->scard)
   4405 		return 1;
   4406 
   4407 	if (wpa_s->conf->pcsc_pin &&
   4408 	    scard_set_pin(wpa_s->scard, wpa_s->conf->pcsc_pin) < 0) {
   4409 		scard_deinit(wpa_s->scard);
   4410 		wpa_s->scard = NULL;
   4411 		wpa_msg(wpa_s, MSG_ERROR, "PC/SC PIN validation failed");
   4412 		return -1;
   4413 	}
   4414 
   4415 	len = sizeof(wpa_s->imsi) - 1;
   4416 	if (scard_get_imsi(wpa_s->scard, wpa_s->imsi, &len)) {
   4417 		scard_deinit(wpa_s->scard);
   4418 		wpa_s->scard = NULL;
   4419 		wpa_msg(wpa_s, MSG_ERROR, "Could not read IMSI");
   4420 		return -1;
   4421 	}
   4422 	wpa_s->imsi[len] = '\0';
   4423 
   4424 	wpa_s->mnc_len = scard_get_mnc_len(wpa_s->scard);
   4425 
   4426 	wpa_printf(MSG_DEBUG, "SCARD: IMSI %s (MNC length %d)",
   4427 		   wpa_s->imsi, wpa_s->mnc_len);
   4428 
   4429 	wpa_sm_set_scard_ctx(wpa_s->wpa, wpa_s->scard);
   4430 	eapol_sm_register_scard_ctx(wpa_s->eapol, wpa_s->scard);
   4431 #endif /* PCSC_FUNCS */
   4432 
   4433 	return 0;
   4434 }
   4435 
   4436 
   4437 int wpas_init_ext_pw(struct wpa_supplicant *wpa_s)
   4438 {
   4439 	char *val, *pos;
   4440 
   4441 	ext_password_deinit(wpa_s->ext_pw);
   4442 	wpa_s->ext_pw = NULL;
   4443 	eapol_sm_set_ext_pw_ctx(wpa_s->eapol, NULL);
   4444 
   4445 	if (!wpa_s->conf->ext_password_backend)
   4446 		return 0;
   4447 
   4448 	val = os_strdup(wpa_s->conf->ext_password_backend);
   4449 	if (val == NULL)
   4450 		return -1;
   4451 	pos = os_strchr(val, ':');
   4452 	if (pos)
   4453 		*pos++ = '\0';
   4454 
   4455 	wpa_printf(MSG_DEBUG, "EXT PW: Initialize backend '%s'", val);
   4456 
   4457 	wpa_s->ext_pw = ext_password_init(val, pos);
   4458 	os_free(val);
   4459 	if (wpa_s->ext_pw == NULL) {
   4460 		wpa_printf(MSG_DEBUG, "EXT PW: Failed to initialize backend");
   4461 		return -1;
   4462 	}
   4463 	eapol_sm_set_ext_pw_ctx(wpa_s->eapol, wpa_s->ext_pw);
   4464 
   4465 	return 0;
   4466 }
   4467 
   4468 
   4469 #ifdef CONFIG_FST
   4470 
   4471 static const u8 * wpas_fst_get_bssid_cb(void *ctx)
   4472 {
   4473 	struct wpa_supplicant *wpa_s = ctx;
   4474 
   4475 	return (is_zero_ether_addr(wpa_s->bssid) ||
   4476 		wpa_s->wpa_state != WPA_COMPLETED) ? NULL : wpa_s->bssid;
   4477 }
   4478 
   4479 
   4480 static void wpas_fst_get_channel_info_cb(void *ctx,
   4481 					 enum hostapd_hw_mode *hw_mode,
   4482 					 u8 *channel)
   4483 {
   4484 	struct wpa_supplicant *wpa_s = ctx;
   4485 
   4486 	if (wpa_s->current_bss) {
   4487 		*hw_mode = ieee80211_freq_to_chan(wpa_s->current_bss->freq,
   4488 						  channel);
   4489 	} else if (wpa_s->hw.num_modes) {
   4490 		*hw_mode = wpa_s->hw.modes[0].mode;
   4491 	} else {
   4492 		WPA_ASSERT(0);
   4493 		*hw_mode = 0;
   4494 	}
   4495 }
   4496 
   4497 
   4498 static int wpas_fst_get_hw_modes(void *ctx, struct hostapd_hw_modes **modes)
   4499 {
   4500 	struct wpa_supplicant *wpa_s = ctx;
   4501 
   4502 	*modes = wpa_s->hw.modes;
   4503 	return wpa_s->hw.num_modes;
   4504 }
   4505 
   4506 
   4507 static void wpas_fst_set_ies_cb(void *ctx, const struct wpabuf *fst_ies)
   4508 {
   4509 	struct wpa_supplicant *wpa_s = ctx;
   4510 
   4511 	wpa_hexdump_buf(MSG_DEBUG, "FST: Set IEs", fst_ies);
   4512 	wpa_s->fst_ies = fst_ies;
   4513 }
   4514 
   4515 
   4516 static int wpas_fst_send_action_cb(void *ctx, const u8 *da, struct wpabuf *data)
   4517 {
   4518 	struct wpa_supplicant *wpa_s = ctx;
   4519 
   4520 	if (os_memcmp(wpa_s->bssid, da, ETH_ALEN) != 0) {
   4521 		wpa_printf(MSG_INFO, "FST:%s:bssid=" MACSTR " != da=" MACSTR,
   4522 			   __func__, MAC2STR(wpa_s->bssid), MAC2STR(da));
   4523 		return -1;
   4524 	}
   4525 	return wpa_drv_send_action(wpa_s, wpa_s->assoc_freq, 0, wpa_s->bssid,
   4526 				   wpa_s->own_addr, wpa_s->bssid,
   4527 				   wpabuf_head(data), wpabuf_len(data),
   4528 				   0);
   4529 }
   4530 
   4531 
   4532 static const struct wpabuf * wpas_fst_get_mb_ie_cb(void *ctx, const u8 *addr)
   4533 {
   4534 	struct wpa_supplicant *wpa_s = ctx;
   4535 
   4536 	WPA_ASSERT(os_memcmp(wpa_s->bssid, addr, ETH_ALEN) == 0);
   4537 	return wpa_s->received_mb_ies;
   4538 }
   4539 
   4540 
   4541 static void wpas_fst_update_mb_ie_cb(void *ctx, const u8 *addr,
   4542 				     const u8 *buf, size_t size)
   4543 {
   4544 	struct wpa_supplicant *wpa_s = ctx;
   4545 	struct mb_ies_info info;
   4546 
   4547 	WPA_ASSERT(os_memcmp(wpa_s->bssid, addr, ETH_ALEN) == 0);
   4548 
   4549 	if (!mb_ies_info_by_ies(&info, buf, size)) {
   4550 		wpabuf_free(wpa_s->received_mb_ies);
   4551 		wpa_s->received_mb_ies = mb_ies_by_info(&info);
   4552 	}
   4553 }
   4554 
   4555 
   4556 static const u8 * wpas_fst_get_peer_first(void *ctx,
   4557 					  struct fst_get_peer_ctx **get_ctx,
   4558 					  Boolean mb_only)
   4559 {
   4560 	struct wpa_supplicant *wpa_s = ctx;
   4561 
   4562 	*get_ctx = NULL;
   4563 	if (!is_zero_ether_addr(wpa_s->bssid))
   4564 		return (wpa_s->received_mb_ies || !mb_only) ?
   4565 			wpa_s->bssid : NULL;
   4566 	return NULL;
   4567 }
   4568 
   4569 
   4570 static const u8 * wpas_fst_get_peer_next(void *ctx,
   4571 					 struct fst_get_peer_ctx **get_ctx,
   4572 					 Boolean mb_only)
   4573 {
   4574 	return NULL;
   4575 }
   4576 
   4577 void fst_wpa_supplicant_fill_iface_obj(struct wpa_supplicant *wpa_s,
   4578 				       struct fst_wpa_obj *iface_obj)
   4579 {
   4580 	iface_obj->ctx              = wpa_s;
   4581 	iface_obj->get_bssid        = wpas_fst_get_bssid_cb;
   4582 	iface_obj->get_channel_info = wpas_fst_get_channel_info_cb;
   4583 	iface_obj->get_hw_modes     = wpas_fst_get_hw_modes;
   4584 	iface_obj->set_ies          = wpas_fst_set_ies_cb;
   4585 	iface_obj->send_action      = wpas_fst_send_action_cb;
   4586 	iface_obj->get_mb_ie        = wpas_fst_get_mb_ie_cb;
   4587 	iface_obj->update_mb_ie     = wpas_fst_update_mb_ie_cb;
   4588 	iface_obj->get_peer_first   = wpas_fst_get_peer_first;
   4589 	iface_obj->get_peer_next    = wpas_fst_get_peer_next;
   4590 }
   4591 #endif /* CONFIG_FST */
   4592 
   4593 static int wpas_set_wowlan_triggers(struct wpa_supplicant *wpa_s,
   4594 				    const struct wpa_driver_capa *capa)
   4595 {
   4596 	struct wowlan_triggers *triggers;
   4597 	int ret = 0;
   4598 
   4599 	if (!wpa_s->conf->wowlan_triggers)
   4600 		return 0;
   4601 
   4602 	triggers = wpa_get_wowlan_triggers(wpa_s->conf->wowlan_triggers, capa);
   4603 	if (triggers) {
   4604 		ret = wpa_drv_wowlan(wpa_s, triggers);
   4605 		os_free(triggers);
   4606 	}
   4607 	return ret;
   4608 }
   4609 
   4610 
   4611 enum wpa_radio_work_band wpas_freq_to_band(int freq)
   4612 {
   4613 	if (freq < 3000)
   4614 		return BAND_2_4_GHZ;
   4615 	if (freq > 50000)
   4616 		return BAND_60_GHZ;
   4617 	return BAND_5_GHZ;
   4618 }
   4619 
   4620 
   4621 unsigned int wpas_get_bands(struct wpa_supplicant *wpa_s, const int *freqs)
   4622 {
   4623 	int i;
   4624 	unsigned int band = 0;
   4625 
   4626 	if (freqs) {
   4627 		/* freqs are specified for the radio work */
   4628 		for (i = 0; freqs[i]; i++)
   4629 			band |= wpas_freq_to_band(freqs[i]);
   4630 	} else {
   4631 		/*
   4632 		 * freqs are not specified, implies all
   4633 		 * the supported freqs by HW
   4634 		 */
   4635 		for (i = 0; i < wpa_s->hw.num_modes; i++) {
   4636 			if (wpa_s->hw.modes[i].num_channels != 0) {
   4637 				if (wpa_s->hw.modes[i].mode ==
   4638 				    HOSTAPD_MODE_IEEE80211B ||
   4639 				    wpa_s->hw.modes[i].mode ==
   4640 				    HOSTAPD_MODE_IEEE80211G)
   4641 					band |= BAND_2_4_GHZ;
   4642 				else if (wpa_s->hw.modes[i].mode ==
   4643 					 HOSTAPD_MODE_IEEE80211A)
   4644 					band |= BAND_5_GHZ;
   4645 				else if (wpa_s->hw.modes[i].mode ==
   4646 					 HOSTAPD_MODE_IEEE80211AD)
   4647 					band |= BAND_60_GHZ;
   4648 				else if (wpa_s->hw.modes[i].mode ==
   4649 					 HOSTAPD_MODE_IEEE80211ANY)
   4650 					band = BAND_2_4_GHZ | BAND_5_GHZ |
   4651 						BAND_60_GHZ;
   4652 			}
   4653 		}
   4654 	}
   4655 
   4656 	return band;
   4657 }
   4658 
   4659 
   4660 static struct wpa_radio * radio_add_interface(struct wpa_supplicant *wpa_s,
   4661 					      const char *rn)
   4662 {
   4663 	struct wpa_supplicant *iface = wpa_s->global->ifaces;
   4664 	struct wpa_radio *radio;
   4665 
   4666 	while (rn && iface) {
   4667 		radio = iface->radio;
   4668 		if (radio && os_strcmp(rn, radio->name) == 0) {
   4669 			wpa_printf(MSG_DEBUG, "Add interface %s to existing radio %s",
   4670 				   wpa_s->ifname, rn);
   4671 			dl_list_add(&radio->ifaces, &wpa_s->radio_list);
   4672 			return radio;
   4673 		}
   4674 
   4675 		iface = iface->next;
   4676 	}
   4677 
   4678 	wpa_printf(MSG_DEBUG, "Add interface %s to a new radio %s",
   4679 		   wpa_s->ifname, rn ? rn : "N/A");
   4680 	radio = os_zalloc(sizeof(*radio));
   4681 	if (radio == NULL)
   4682 		return NULL;
   4683 
   4684 	if (rn)
   4685 		os_strlcpy(radio->name, rn, sizeof(radio->name));
   4686 	dl_list_init(&radio->ifaces);
   4687 	dl_list_init(&radio->work);
   4688 	dl_list_add(&radio->ifaces, &wpa_s->radio_list);
   4689 
   4690 	return radio;
   4691 }
   4692 
   4693 
   4694 static void radio_work_free(struct wpa_radio_work *work)
   4695 {
   4696 	if (work->wpa_s->scan_work == work) {
   4697 		/* This should not really happen. */
   4698 		wpa_dbg(work->wpa_s, MSG_INFO, "Freeing radio work '%s'@%p (started=%d) that is marked as scan_work",
   4699 			work->type, work, work->started);
   4700 		work->wpa_s->scan_work = NULL;
   4701 	}
   4702 
   4703 #ifdef CONFIG_P2P
   4704 	if (work->wpa_s->p2p_scan_work == work) {
   4705 		/* This should not really happen. */
   4706 		wpa_dbg(work->wpa_s, MSG_INFO, "Freeing radio work '%s'@%p (started=%d) that is marked as p2p_scan_work",
   4707 			work->type, work, work->started);
   4708 		work->wpa_s->p2p_scan_work = NULL;
   4709 	}
   4710 #endif /* CONFIG_P2P */
   4711 
   4712 	if (work->started) {
   4713 		work->wpa_s->radio->num_active_works--;
   4714 		wpa_dbg(work->wpa_s, MSG_DEBUG,
   4715 			"radio_work_free('%s'@%p: num_active_works --> %u",
   4716 			work->type, work,
   4717 			work->wpa_s->radio->num_active_works);
   4718 	}
   4719 
   4720 	dl_list_del(&work->list);
   4721 	os_free(work);
   4722 }
   4723 
   4724 
   4725 static int radio_work_is_connect(struct wpa_radio_work *work)
   4726 {
   4727 	return os_strcmp(work->type, "sme-connect") == 0 ||
   4728 		os_strcmp(work->type, "connect") == 0;
   4729 }
   4730 
   4731 
   4732 static int radio_work_is_scan(struct wpa_radio_work *work)
   4733 {
   4734 	return os_strcmp(work->type, "scan") == 0 ||
   4735 		os_strcmp(work->type, "p2p-scan") == 0;
   4736 }
   4737 
   4738 
   4739 static struct wpa_radio_work * radio_work_get_next_work(struct wpa_radio *radio)
   4740 {
   4741 	struct wpa_radio_work *active_work = NULL;
   4742 	struct wpa_radio_work *tmp;
   4743 
   4744 	/* Get the active work to know the type and band. */
   4745 	dl_list_for_each(tmp, &radio->work, struct wpa_radio_work, list) {
   4746 		if (tmp->started) {
   4747 			active_work = tmp;
   4748 			break;
   4749 		}
   4750 	}
   4751 
   4752 	if (!active_work) {
   4753 		/* No active work, start one */
   4754 		radio->num_active_works = 0;
   4755 		dl_list_for_each(tmp, &radio->work, struct wpa_radio_work,
   4756 				 list) {
   4757 			if (os_strcmp(tmp->type, "scan") == 0 &&
   4758 			    radio->external_scan_running &&
   4759 			    (((struct wpa_driver_scan_params *)
   4760 			      tmp->ctx)->only_new_results ||
   4761 			     tmp->wpa_s->clear_driver_scan_cache))
   4762 				continue;
   4763 			return tmp;
   4764 		}
   4765 		return NULL;
   4766 	}
   4767 
   4768 	if (radio_work_is_connect(active_work)) {
   4769 		/*
   4770 		 * If the active work is either connect or sme-connect,
   4771 		 * do not parallelize them with other radio works.
   4772 		 */
   4773 		wpa_dbg(active_work->wpa_s, MSG_DEBUG,
   4774 			"Do not parallelize radio work with %s",
   4775 			active_work->type);
   4776 		return NULL;
   4777 	}
   4778 
   4779 	dl_list_for_each(tmp, &radio->work, struct wpa_radio_work, list) {
   4780 		if (tmp->started)
   4781 			continue;
   4782 
   4783 		/*
   4784 		 * If connect or sme-connect are enqueued, parallelize only
   4785 		 * those operations ahead of them in the queue.
   4786 		 */
   4787 		if (radio_work_is_connect(tmp))
   4788 			break;
   4789 
   4790 		/* Serialize parallel scan and p2p_scan operations on the same
   4791 		 * interface since the driver_nl80211 mechanism for tracking
   4792 		 * scan cookies does not yet have support for this. */
   4793 		if (active_work->wpa_s == tmp->wpa_s &&
   4794 		    radio_work_is_scan(active_work) &&
   4795 		    radio_work_is_scan(tmp)) {
   4796 			wpa_dbg(active_work->wpa_s, MSG_DEBUG,
   4797 				"Do not start work '%s' when another work '%s' is already scheduled",
   4798 				tmp->type, active_work->type);
   4799 			continue;
   4800 		}
   4801 		/*
   4802 		 * Check that the radio works are distinct and
   4803 		 * on different bands.
   4804 		 */
   4805 		if (os_strcmp(active_work->type, tmp->type) != 0 &&
   4806 		    (active_work->bands != tmp->bands)) {
   4807 			/*
   4808 			 * If a scan has to be scheduled through nl80211 scan
   4809 			 * interface and if an external scan is already running,
   4810 			 * do not schedule the scan since it is likely to get
   4811 			 * rejected by kernel.
   4812 			 */
   4813 			if (os_strcmp(tmp->type, "scan") == 0 &&
   4814 			    radio->external_scan_running &&
   4815 			    (((struct wpa_driver_scan_params *)
   4816 			      tmp->ctx)->only_new_results ||
   4817 			     tmp->wpa_s->clear_driver_scan_cache))
   4818 				continue;
   4819 
   4820 			wpa_dbg(active_work->wpa_s, MSG_DEBUG,
   4821 				"active_work:%s new_work:%s",
   4822 				active_work->type, tmp->type);
   4823 			return tmp;
   4824 		}
   4825 	}
   4826 
   4827 	/* Did not find a radio work to schedule in parallel. */
   4828 	return NULL;
   4829 }
   4830 
   4831 
   4832 static void radio_start_next_work(void *eloop_ctx, void *timeout_ctx)
   4833 {
   4834 	struct wpa_radio *radio = eloop_ctx;
   4835 	struct wpa_radio_work *work;
   4836 	struct os_reltime now, diff;
   4837 	struct wpa_supplicant *wpa_s;
   4838 
   4839 	work = dl_list_first(&radio->work, struct wpa_radio_work, list);
   4840 	if (work == NULL) {
   4841 		radio->num_active_works = 0;
   4842 		return;
   4843 	}
   4844 
   4845 	wpa_s = dl_list_first(&radio->ifaces, struct wpa_supplicant,
   4846 			      radio_list);
   4847 
   4848 	if (!(wpa_s &&
   4849 	      wpa_s->drv_flags & WPA_DRIVER_FLAGS_OFFCHANNEL_SIMULTANEOUS)) {
   4850 		if (work->started)
   4851 			return; /* already started and still in progress */
   4852 
   4853 		if (wpa_s && wpa_s->radio->external_scan_running) {
   4854 			wpa_printf(MSG_DEBUG, "Delay radio work start until externally triggered scan completes");
   4855 			return;
   4856 		}
   4857 	} else {
   4858 		work = NULL;
   4859 		if (radio->num_active_works < MAX_ACTIVE_WORKS) {
   4860 			/* get the work to schedule next */
   4861 			work = radio_work_get_next_work(radio);
   4862 		}
   4863 		if (!work)
   4864 			return;
   4865 	}
   4866 
   4867 	wpa_s = work->wpa_s;
   4868 	os_get_reltime(&now);
   4869 	os_reltime_sub(&now, &work->time, &diff);
   4870 	wpa_dbg(wpa_s, MSG_DEBUG,
   4871 		"Starting radio work '%s'@%p after %ld.%06ld second wait",
   4872 		work->type, work, diff.sec, diff.usec);
   4873 	work->started = 1;
   4874 	work->time = now;
   4875 	radio->num_active_works++;
   4876 
   4877 	work->cb(work, 0);
   4878 
   4879 	if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_OFFCHANNEL_SIMULTANEOUS) &&
   4880 	    radio->num_active_works < MAX_ACTIVE_WORKS)
   4881 		radio_work_check_next(wpa_s);
   4882 }
   4883 
   4884 
   4885 /*
   4886  * This function removes both started and pending radio works running on
   4887  * the provided interface's radio.
   4888  * Prior to the removal of the radio work, its callback (cb) is called with
   4889  * deinit set to be 1. Each work's callback is responsible for clearing its
   4890  * internal data and restoring to a correct state.
   4891  * @wpa_s: wpa_supplicant data
   4892  * @type: type of works to be removed
   4893  * @remove_all: 1 to remove all the works on this radio, 0 to remove only
   4894  * this interface's works.
   4895  */
   4896 void radio_remove_works(struct wpa_supplicant *wpa_s,
   4897 			const char *type, int remove_all)
   4898 {
   4899 	struct wpa_radio_work *work, *tmp;
   4900 	struct wpa_radio *radio = wpa_s->radio;
   4901 
   4902 	dl_list_for_each_safe(work, tmp, &radio->work, struct wpa_radio_work,
   4903 			      list) {
   4904 		if (type && os_strcmp(type, work->type) != 0)
   4905 			continue;
   4906 
   4907 		/* skip other ifaces' works */
   4908 		if (!remove_all && work->wpa_s != wpa_s)
   4909 			continue;
   4910 
   4911 		wpa_dbg(wpa_s, MSG_DEBUG, "Remove radio work '%s'@%p%s",
   4912 			work->type, work, work->started ? " (started)" : "");
   4913 		work->cb(work, 1);
   4914 		radio_work_free(work);
   4915 	}
   4916 
   4917 	/* in case we removed the started work */
   4918 	radio_work_check_next(wpa_s);
   4919 }
   4920 
   4921 
   4922 static void radio_remove_interface(struct wpa_supplicant *wpa_s)
   4923 {
   4924 	struct wpa_radio *radio = wpa_s->radio;
   4925 
   4926 	if (!radio)
   4927 		return;
   4928 
   4929 	wpa_printf(MSG_DEBUG, "Remove interface %s from radio %s",
   4930 		   wpa_s->ifname, radio->name);
   4931 	dl_list_del(&wpa_s->radio_list);
   4932 	radio_remove_works(wpa_s, NULL, 0);
   4933 	wpa_s->radio = NULL;
   4934 	if (!dl_list_empty(&radio->ifaces))
   4935 		return; /* Interfaces remain for this radio */
   4936 
   4937 	wpa_printf(MSG_DEBUG, "Remove radio %s", radio->name);
   4938 	eloop_cancel_timeout(radio_start_next_work, radio, NULL);
   4939 	os_free(radio);
   4940 }
   4941 
   4942 
   4943 void radio_work_check_next(struct wpa_supplicant *wpa_s)
   4944 {
   4945 	struct wpa_radio *radio = wpa_s->radio;
   4946 
   4947 	if (dl_list_empty(&radio->work))
   4948 		return;
   4949 	if (wpa_s->ext_work_in_progress) {
   4950 		wpa_printf(MSG_DEBUG,
   4951 			   "External radio work in progress - delay start of pending item");
   4952 		return;
   4953 	}
   4954 	eloop_cancel_timeout(radio_start_next_work, radio, NULL);
   4955 	eloop_register_timeout(0, 0, radio_start_next_work, radio, NULL);
   4956 }
   4957 
   4958 
   4959 /**
   4960  * radio_add_work - Add a radio work item
   4961  * @wpa_s: Pointer to wpa_supplicant data
   4962  * @freq: Frequency of the offchannel operation in MHz or 0
   4963  * @type: Unique identifier for each type of work
   4964  * @next: Force as the next work to be executed
   4965  * @cb: Callback function for indicating when radio is available
   4966  * @ctx: Context pointer for the work (work->ctx in cb())
   4967  * Returns: 0 on success, -1 on failure
   4968  *
   4969  * This function is used to request time for an operation that requires
   4970  * exclusive radio control. Once the radio is available, the registered callback
   4971  * function will be called. radio_work_done() must be called once the exclusive
   4972  * radio operation has been completed, so that the radio is freed for other
   4973  * operations. The special case of deinit=1 is used to free the context data
   4974  * during interface removal. That does not allow the callback function to start
   4975  * the radio operation, i.e., it must free any resources allocated for the radio
   4976  * work and return.
   4977  *
   4978  * The @freq parameter can be used to indicate a single channel on which the
   4979  * offchannel operation will occur. This may allow multiple radio work
   4980  * operations to be performed in parallel if they apply for the same channel.
   4981  * Setting this to 0 indicates that the work item may use multiple channels or
   4982  * requires exclusive control of the radio.
   4983  */
   4984 int radio_add_work(struct wpa_supplicant *wpa_s, unsigned int freq,
   4985 		   const char *type, int next,
   4986 		   void (*cb)(struct wpa_radio_work *work, int deinit),
   4987 		   void *ctx)
   4988 {
   4989 	struct wpa_radio *radio = wpa_s->radio;
   4990 	struct wpa_radio_work *work;
   4991 	int was_empty;
   4992 
   4993 	work = os_zalloc(sizeof(*work));
   4994 	if (work == NULL)
   4995 		return -1;
   4996 	wpa_dbg(wpa_s, MSG_DEBUG, "Add radio work '%s'@%p", type, work);
   4997 	os_get_reltime(&work->time);
   4998 	work->freq = freq;
   4999 	work->type = type;
   5000 	work->wpa_s = wpa_s;
   5001 	work->cb = cb;
   5002 	work->ctx = ctx;
   5003 
   5004 	if (freq)
   5005 		work->bands = wpas_freq_to_band(freq);
   5006 	else if (os_strcmp(type, "scan") == 0 ||
   5007 		 os_strcmp(type, "p2p-scan") == 0)
   5008 		work->bands = wpas_get_bands(wpa_s,
   5009 					     ((struct wpa_driver_scan_params *)
   5010 					      ctx)->freqs);
   5011 	else
   5012 		work->bands = wpas_get_bands(wpa_s, NULL);
   5013 
   5014 	was_empty = dl_list_empty(&wpa_s->radio->work);
   5015 	if (next)
   5016 		dl_list_add(&wpa_s->radio->work, &work->list);
   5017 	else
   5018 		dl_list_add_tail(&wpa_s->radio->work, &work->list);
   5019 	if (was_empty) {
   5020 		wpa_dbg(wpa_s, MSG_DEBUG, "First radio work item in the queue - schedule start immediately");
   5021 		radio_work_check_next(wpa_s);
   5022 	} else if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_OFFCHANNEL_SIMULTANEOUS)
   5023 		   && radio->num_active_works < MAX_ACTIVE_WORKS) {
   5024 		wpa_dbg(wpa_s, MSG_DEBUG,
   5025 			"Try to schedule a radio work (num_active_works=%u)",
   5026 			radio->num_active_works);
   5027 		radio_work_check_next(wpa_s);
   5028 	}
   5029 
   5030 	return 0;
   5031 }
   5032 
   5033 
   5034 /**
   5035  * radio_work_done - Indicate that a radio work item has been completed
   5036  * @work: Completed work
   5037  *
   5038  * This function is called once the callback function registered with
   5039  * radio_add_work() has completed its work.
   5040  */
   5041 void radio_work_done(struct wpa_radio_work *work)
   5042 {
   5043 	struct wpa_supplicant *wpa_s = work->wpa_s;
   5044 	struct os_reltime now, diff;
   5045 	unsigned int started = work->started;
   5046 
   5047 	os_get_reltime(&now);
   5048 	os_reltime_sub(&now, &work->time, &diff);
   5049 	wpa_dbg(wpa_s, MSG_DEBUG, "Radio work '%s'@%p %s in %ld.%06ld seconds",
   5050 		work->type, work, started ? "done" : "canceled",
   5051 		diff.sec, diff.usec);
   5052 	radio_work_free(work);
   5053 	if (started)
   5054 		radio_work_check_next(wpa_s);
   5055 }
   5056 
   5057 
   5058 struct wpa_radio_work *
   5059 radio_work_pending(struct wpa_supplicant *wpa_s, const char *type)
   5060 {
   5061 	struct wpa_radio_work *work;
   5062 	struct wpa_radio *radio = wpa_s->radio;
   5063 
   5064 	dl_list_for_each(work, &radio->work, struct wpa_radio_work, list) {
   5065 		if (work->wpa_s == wpa_s && os_strcmp(work->type, type) == 0)
   5066 			return work;
   5067 	}
   5068 
   5069 	return NULL;
   5070 }
   5071 
   5072 
   5073 static int wpas_init_driver(struct wpa_supplicant *wpa_s,
   5074 			    struct wpa_interface *iface)
   5075 {
   5076 	const char *ifname, *driver, *rn;
   5077 
   5078 	driver = iface->driver;
   5079 next_driver:
   5080 	if (wpa_supplicant_set_driver(wpa_s, driver) < 0)
   5081 		return -1;
   5082 
   5083 	wpa_s->drv_priv = wpa_drv_init(wpa_s, wpa_s->ifname);
   5084 	if (wpa_s->drv_priv == NULL) {
   5085 		const char *pos;
   5086 		pos = driver ? os_strchr(driver, ',') : NULL;
   5087 		if (pos) {
   5088 			wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize "
   5089 				"driver interface - try next driver wrapper");
   5090 			driver = pos + 1;
   5091 			goto next_driver;
   5092 		}
   5093 		wpa_msg(wpa_s, MSG_ERROR, "Failed to initialize driver "
   5094 			"interface");
   5095 		return -1;
   5096 	}
   5097 	if (wpa_drv_set_param(wpa_s, wpa_s->conf->driver_param) < 0) {
   5098 		wpa_msg(wpa_s, MSG_ERROR, "Driver interface rejected "
   5099 			"driver_param '%s'", wpa_s->conf->driver_param);
   5100 		return -1;
   5101 	}
   5102 
   5103 	ifname = wpa_drv_get_ifname(wpa_s);
   5104 	if (ifname && os_strcmp(ifname, wpa_s->ifname) != 0) {
   5105 		wpa_dbg(wpa_s, MSG_DEBUG, "Driver interface replaced "
   5106 			"interface name with '%s'", ifname);
   5107 		os_strlcpy(wpa_s->ifname, ifname, sizeof(wpa_s->ifname));
   5108 	}
   5109 
   5110 	rn = wpa_driver_get_radio_name(wpa_s);
   5111 	if (rn && rn[0] == '\0')
   5112 		rn = NULL;
   5113 
   5114 	wpa_s->radio = radio_add_interface(wpa_s, rn);
   5115 	if (wpa_s->radio == NULL)
   5116 		return -1;
   5117 
   5118 	return 0;
   5119 }
   5120 
   5121 
   5122 #ifdef CONFIG_GAS_SERVER
   5123 
   5124 static void wpas_gas_server_tx_status(struct wpa_supplicant *wpa_s,
   5125 				      unsigned int freq, const u8 *dst,
   5126 				      const u8 *src, const u8 *bssid,
   5127 				      const u8 *data, size_t data_len,
   5128 				      enum offchannel_send_action_result result)
   5129 {
   5130 	wpa_printf(MSG_DEBUG, "GAS: TX status: freq=%u dst=" MACSTR
   5131 		   " result=%s",
   5132 		   freq, MAC2STR(dst),
   5133 		   result == OFFCHANNEL_SEND_ACTION_SUCCESS ? "SUCCESS" :
   5134 		   (result == OFFCHANNEL_SEND_ACTION_NO_ACK ? "no-ACK" :
   5135 		    "FAILED"));
   5136 	gas_server_tx_status(wpa_s->gas_server, dst, data, data_len,
   5137 			     result == OFFCHANNEL_SEND_ACTION_SUCCESS);
   5138 }
   5139 
   5140 
   5141 static void wpas_gas_server_tx(void *ctx, int freq, const u8 *da,
   5142 			       struct wpabuf *buf, unsigned int wait_time)
   5143 {
   5144 	struct wpa_supplicant *wpa_s = ctx;
   5145 	const u8 broadcast[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
   5146 
   5147 	if (wait_time > wpa_s->max_remain_on_chan)
   5148 		wait_time = wpa_s->max_remain_on_chan;
   5149 
   5150 	offchannel_send_action(wpa_s, freq, da, wpa_s->own_addr, broadcast,
   5151 			       wpabuf_head(buf), wpabuf_len(buf),
   5152 			       wait_time, wpas_gas_server_tx_status, 0);
   5153 }
   5154 
   5155 #endif /* CONFIG_GAS_SERVER */
   5156 
   5157 static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
   5158 				     struct wpa_interface *iface)
   5159 {
   5160 	struct wpa_driver_capa capa;
   5161 	int capa_res;
   5162 	u8 dfs_domain;
   5163 
   5164 	wpa_printf(MSG_DEBUG, "Initializing interface '%s' conf '%s' driver "
   5165 		   "'%s' ctrl_interface '%s' bridge '%s'", iface->ifname,
   5166 		   iface->confname ? iface->confname : "N/A",
   5167 		   iface->driver ? iface->driver : "default",
   5168 		   iface->ctrl_interface ? iface->ctrl_interface : "N/A",
   5169 		   iface->bridge_ifname ? iface->bridge_ifname : "N/A");
   5170 
   5171 	if (iface->confname) {
   5172 #ifdef CONFIG_BACKEND_FILE
   5173 		wpa_s->confname = os_rel2abs_path(iface->confname);
   5174 		if (wpa_s->confname == NULL) {
   5175 			wpa_printf(MSG_ERROR, "Failed to get absolute path "
   5176 				   "for configuration file '%s'.",
   5177 				   iface->confname);
   5178 			return -1;
   5179 		}
   5180 		wpa_printf(MSG_DEBUG, "Configuration file '%s' -> '%s'",
   5181 			   iface->confname, wpa_s->confname);
   5182 #else /* CONFIG_BACKEND_FILE */
   5183 		wpa_s->confname = os_strdup(iface->confname);
   5184 #endif /* CONFIG_BACKEND_FILE */
   5185 		wpa_s->conf = wpa_config_read(wpa_s->confname, NULL);
   5186 		if (wpa_s->conf == NULL) {
   5187 			wpa_printf(MSG_ERROR, "Failed to read or parse "
   5188 				   "configuration '%s'.", wpa_s->confname);
   5189 			return -1;
   5190 		}
   5191 		wpa_s->confanother = os_rel2abs_path(iface->confanother);
   5192 		wpa_config_read(wpa_s->confanother, wpa_s->conf);
   5193 
   5194 		/*
   5195 		 * Override ctrl_interface and driver_param if set on command
   5196 		 * line.
   5197 		 */
   5198 		if (iface->ctrl_interface) {
   5199 			os_free(wpa_s->conf->ctrl_interface);
   5200 			wpa_s->conf->ctrl_interface =
   5201 				os_strdup(iface->ctrl_interface);
   5202 		}
   5203 
   5204 		if (iface->driver_param) {
   5205 			os_free(wpa_s->conf->driver_param);
   5206 			wpa_s->conf->driver_param =
   5207 				os_strdup(iface->driver_param);
   5208 		}
   5209 
   5210 		if (iface->p2p_mgmt && !iface->ctrl_interface) {
   5211 			os_free(wpa_s->conf->ctrl_interface);
   5212 			wpa_s->conf->ctrl_interface = NULL;
   5213 		}
   5214 	} else
   5215 		wpa_s->conf = wpa_config_alloc_empty(iface->ctrl_interface,
   5216 						     iface->driver_param);
   5217 
   5218 	if (wpa_s->conf == NULL) {
   5219 		wpa_printf(MSG_ERROR, "\nNo configuration found.");
   5220 		return -1;
   5221 	}
   5222 
   5223 	if (iface->ifname == NULL) {
   5224 		wpa_printf(MSG_ERROR, "\nInterface name is required.");
   5225 		return -1;
   5226 	}
   5227 	if (os_strlen(iface->ifname) >= sizeof(wpa_s->ifname)) {
   5228 		wpa_printf(MSG_ERROR, "\nToo long interface name '%s'.",
   5229 			   iface->ifname);
   5230 		return -1;
   5231 	}
   5232 	os_strlcpy(wpa_s->ifname, iface->ifname, sizeof(wpa_s->ifname));
   5233 
   5234 	if (iface->bridge_ifname) {
   5235 		if (os_strlen(iface->bridge_ifname) >=
   5236 		    sizeof(wpa_s->bridge_ifname)) {
   5237 			wpa_printf(MSG_ERROR, "\nToo long bridge interface "
   5238 				   "name '%s'.", iface->bridge_ifname);
   5239 			return -1;
   5240 		}
   5241 		os_strlcpy(wpa_s->bridge_ifname, iface->bridge_ifname,
   5242 			   sizeof(wpa_s->bridge_ifname));
   5243 	}
   5244 
   5245 	/* RSNA Supplicant Key Management - INITIALIZE */
   5246 	eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
   5247 	eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
   5248 
   5249 	/* Initialize driver interface and register driver event handler before
   5250 	 * L2 receive handler so that association events are processed before
   5251 	 * EAPOL-Key packets if both become available for the same select()
   5252 	 * call. */
   5253 	if (wpas_init_driver(wpa_s, iface) < 0)
   5254 		return -1;
   5255 
   5256 	if (wpa_supplicant_init_wpa(wpa_s) < 0)
   5257 		return -1;
   5258 
   5259 	wpa_sm_set_ifname(wpa_s->wpa, wpa_s->ifname,
   5260 			  wpa_s->bridge_ifname[0] ? wpa_s->bridge_ifname :
   5261 			  NULL);
   5262 	wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
   5263 
   5264 	if (wpa_s->conf->dot11RSNAConfigPMKLifetime &&
   5265 	    wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_LIFETIME,
   5266 			     wpa_s->conf->dot11RSNAConfigPMKLifetime)) {
   5267 		wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
   5268 			"dot11RSNAConfigPMKLifetime");
   5269 		return -1;
   5270 	}
   5271 
   5272 	if (wpa_s->conf->dot11RSNAConfigPMKReauthThreshold &&
   5273 	    wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_REAUTH_THRESHOLD,
   5274 			     wpa_s->conf->dot11RSNAConfigPMKReauthThreshold)) {
   5275 		wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
   5276 			"dot11RSNAConfigPMKReauthThreshold");
   5277 		return -1;
   5278 	}
   5279 
   5280 	if (wpa_s->conf->dot11RSNAConfigSATimeout &&
   5281 	    wpa_sm_set_param(wpa_s->wpa, RSNA_SA_TIMEOUT,
   5282 			     wpa_s->conf->dot11RSNAConfigSATimeout)) {
   5283 		wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
   5284 			"dot11RSNAConfigSATimeout");
   5285 		return -1;
   5286 	}
   5287 
   5288 	wpa_s->hw.modes = wpa_drv_get_hw_feature_data(wpa_s,
   5289 						      &wpa_s->hw.num_modes,
   5290 						      &wpa_s->hw.flags,
   5291 						      &dfs_domain);
   5292 	if (wpa_s->hw.modes) {
   5293 		u16 i;
   5294 
   5295 		for (i = 0; i < wpa_s->hw.num_modes; i++) {
   5296 			if (wpa_s->hw.modes[i].vht_capab) {
   5297 				wpa_s->hw_capab = CAPAB_VHT;
   5298 				break;
   5299 			}
   5300 
   5301 			if (wpa_s->hw.modes[i].ht_capab &
   5302 			    HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET)
   5303 				wpa_s->hw_capab = CAPAB_HT40;
   5304 			else if (wpa_s->hw.modes[i].ht_capab &&
   5305 				 wpa_s->hw_capab == CAPAB_NO_HT_VHT)
   5306 				wpa_s->hw_capab = CAPAB_HT;
   5307 		}
   5308 	}
   5309 
   5310 	capa_res = wpa_drv_get_capa(wpa_s, &capa);
   5311 	if (capa_res == 0) {
   5312 		wpa_s->drv_capa_known = 1;
   5313 		wpa_s->drv_flags = capa.flags;
   5314 		wpa_s->drv_enc = capa.enc;
   5315 		wpa_s->drv_smps_modes = capa.smps_modes;
   5316 		wpa_s->drv_rrm_flags = capa.rrm_flags;
   5317 		wpa_s->probe_resp_offloads = capa.probe_resp_offloads;
   5318 		wpa_s->max_scan_ssids = capa.max_scan_ssids;
   5319 		wpa_s->max_sched_scan_ssids = capa.max_sched_scan_ssids;
   5320 		wpa_s->max_sched_scan_plans = capa.max_sched_scan_plans;
   5321 		wpa_s->max_sched_scan_plan_interval =
   5322 			capa.max_sched_scan_plan_interval;
   5323 		wpa_s->max_sched_scan_plan_iterations =
   5324 			capa.max_sched_scan_plan_iterations;
   5325 		wpa_s->sched_scan_supported = capa.sched_scan_supported;
   5326 		wpa_s->max_match_sets = capa.max_match_sets;
   5327 		wpa_s->max_remain_on_chan = capa.max_remain_on_chan;
   5328 		wpa_s->max_stations = capa.max_stations;
   5329 		wpa_s->extended_capa = capa.extended_capa;
   5330 		wpa_s->extended_capa_mask = capa.extended_capa_mask;
   5331 		wpa_s->extended_capa_len = capa.extended_capa_len;
   5332 		wpa_s->num_multichan_concurrent =
   5333 			capa.num_multichan_concurrent;
   5334 		wpa_s->wmm_ac_supported = capa.wmm_ac_supported;
   5335 
   5336 		if (capa.mac_addr_rand_scan_supported)
   5337 			wpa_s->mac_addr_rand_supported |= MAC_ADDR_RAND_SCAN;
   5338 		if (wpa_s->sched_scan_supported &&
   5339 		    capa.mac_addr_rand_sched_scan_supported)
   5340 			wpa_s->mac_addr_rand_supported |=
   5341 				(MAC_ADDR_RAND_SCHED_SCAN | MAC_ADDR_RAND_PNO);
   5342 	}
   5343 	if (wpa_s->max_remain_on_chan == 0)
   5344 		wpa_s->max_remain_on_chan = 1000;
   5345 
   5346 	/*
   5347 	 * Only take p2p_mgmt parameters when P2P Device is supported.
   5348 	 * Doing it here as it determines whether l2_packet_init() will be done
   5349 	 * during wpa_supplicant_driver_init().
   5350 	 */
   5351 	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)
   5352 		wpa_s->p2p_mgmt = iface->p2p_mgmt;
   5353 	else
   5354 		iface->p2p_mgmt = 1;
   5355 
   5356 	if (wpa_s->num_multichan_concurrent == 0)
   5357 		wpa_s->num_multichan_concurrent = 1;
   5358 
   5359 	if (wpa_supplicant_driver_init(wpa_s) < 0)
   5360 		return -1;
   5361 
   5362 #ifdef CONFIG_TDLS
   5363 	if ((!iface->p2p_mgmt ||
   5364 	     !(wpa_s->drv_flags &
   5365 	       WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)) &&
   5366 	    wpa_tdls_init(wpa_s->wpa))
   5367 		return -1;
   5368 #endif /* CONFIG_TDLS */
   5369 
   5370 	if (wpa_s->conf->country[0] && wpa_s->conf->country[1] &&
   5371 	    wpa_drv_set_country(wpa_s, wpa_s->conf->country)) {
   5372 		wpa_dbg(wpa_s, MSG_DEBUG, "Failed to set country");
   5373 		return -1;
   5374 	}
   5375 
   5376 #ifdef CONFIG_FST
   5377 	if (wpa_s->conf->fst_group_id) {
   5378 		struct fst_iface_cfg cfg;
   5379 		struct fst_wpa_obj iface_obj;
   5380 
   5381 		fst_wpa_supplicant_fill_iface_obj(wpa_s, &iface_obj);
   5382 		os_strlcpy(cfg.group_id, wpa_s->conf->fst_group_id,
   5383 			   sizeof(cfg.group_id));
   5384 		cfg.priority = wpa_s->conf->fst_priority;
   5385 		cfg.llt = wpa_s->conf->fst_llt;
   5386 
   5387 		wpa_s->fst = fst_attach(wpa_s->ifname, wpa_s->own_addr,
   5388 					&iface_obj, &cfg);
   5389 		if (!wpa_s->fst) {
   5390 			wpa_msg(wpa_s, MSG_ERROR,
   5391 				"FST: Cannot attach iface %s to group %s",
   5392 				wpa_s->ifname, cfg.group_id);
   5393 			return -1;
   5394 		}
   5395 	}
   5396 #endif /* CONFIG_FST */
   5397 
   5398 	if (wpas_wps_init(wpa_s))
   5399 		return -1;
   5400 
   5401 #ifdef CONFIG_GAS_SERVER
   5402 	wpa_s->gas_server = gas_server_init(wpa_s, wpas_gas_server_tx);
   5403 	if (!wpa_s->gas_server) {
   5404 		wpa_printf(MSG_ERROR, "Failed to initialize GAS server");
   5405 		return -1;
   5406 	}
   5407 #endif /* CONFIG_GAS_SERVER */
   5408 
   5409 #ifdef CONFIG_DPP
   5410 	if (wpas_dpp_init(wpa_s) < 0)
   5411 		return -1;
   5412 #endif /* CONFIG_DPP */
   5413 
   5414 	if (wpa_supplicant_init_eapol(wpa_s) < 0)
   5415 		return -1;
   5416 	wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
   5417 
   5418 	wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
   5419 	if (wpa_s->ctrl_iface == NULL) {
   5420 		wpa_printf(MSG_ERROR,
   5421 			   "Failed to initialize control interface '%s'.\n"
   5422 			   "You may have another wpa_supplicant process "
   5423 			   "already running or the file was\n"
   5424 			   "left by an unclean termination of wpa_supplicant "
   5425 			   "in which case you will need\n"
   5426 			   "to manually remove this file before starting "
   5427 			   "wpa_supplicant again.\n",
   5428 			   wpa_s->conf->ctrl_interface);
   5429 		return -1;
   5430 	}
   5431 
   5432 	wpa_s->gas = gas_query_init(wpa_s);
   5433 	if (wpa_s->gas == NULL) {
   5434 		wpa_printf(MSG_ERROR, "Failed to initialize GAS query");
   5435 		return -1;
   5436 	}
   5437 
   5438 	if (iface->p2p_mgmt && wpas_p2p_init(wpa_s->global, wpa_s) < 0) {
   5439 		wpa_msg(wpa_s, MSG_ERROR, "Failed to init P2P");
   5440 		return -1;
   5441 	}
   5442 
   5443 	if (wpa_bss_init(wpa_s) < 0)
   5444 		return -1;
   5445 
   5446 #ifdef CONFIG_PMKSA_CACHE_EXTERNAL
   5447 #ifdef CONFIG_MESH
   5448 	dl_list_init(&wpa_s->mesh_external_pmksa_cache);
   5449 #endif /* CONFIG_MESH */
   5450 #endif /* CONFIG_PMKSA_CACHE_EXTERNAL */
   5451 
   5452 	/*
   5453 	 * Set Wake-on-WLAN triggers, if configured.
   5454 	 * Note: We don't restore/remove the triggers on shutdown (it doesn't
   5455 	 * have effect anyway when the interface is down).
   5456 	 */
   5457 	if (capa_res == 0 && wpas_set_wowlan_triggers(wpa_s, &capa) < 0)
   5458 		return -1;
   5459 
   5460 #ifdef CONFIG_EAP_PROXY
   5461 {
   5462 	size_t len;
   5463 	wpa_s->mnc_len = eapol_sm_get_eap_proxy_imsi(wpa_s->eapol, -1,
   5464 						     wpa_s->imsi, &len);
   5465 	if (wpa_s->mnc_len > 0) {
   5466 		wpa_s->imsi[len] = '\0';
   5467 		wpa_printf(MSG_DEBUG, "eap_proxy: IMSI %s (MNC length %d)",
   5468 			   wpa_s->imsi, wpa_s->mnc_len);
   5469 	} else {
   5470 		wpa_printf(MSG_DEBUG, "eap_proxy: IMSI not available");
   5471 	}
   5472 }
   5473 #endif /* CONFIG_EAP_PROXY */
   5474 
   5475 	if (pcsc_reader_init(wpa_s) < 0)
   5476 		return -1;
   5477 
   5478 	if (wpas_init_ext_pw(wpa_s) < 0)
   5479 		return -1;
   5480 
   5481 	wpas_rrm_reset(wpa_s);
   5482 
   5483 	wpas_sched_scan_plans_set(wpa_s, wpa_s->conf->sched_scan_plans);
   5484 
   5485 #ifdef CONFIG_HS20
   5486 	hs20_init(wpa_s);
   5487 #endif /* CONFIG_HS20 */
   5488 #ifdef CONFIG_MBO
   5489 	if (wpa_s->conf->oce) {
   5490 		if ((wpa_s->conf->oce & OCE_STA) &&
   5491 		    (wpa_s->drv_flags & WPA_DRIVER_FLAGS_OCE_STA))
   5492 			wpa_s->enable_oce = OCE_STA;
   5493 		if ((wpa_s->conf->oce & OCE_STA_CFON) &&
   5494 		    (wpa_s->drv_flags & WPA_DRIVER_FLAGS_OCE_STA_CFON)) {
   5495 			/* TODO: Need to add STA-CFON support */
   5496 			wpa_printf(MSG_ERROR,
   5497 				   "OCE STA-CFON feature is not yet supported");
   5498 		}
   5499 	}
   5500 	wpas_mbo_update_non_pref_chan(wpa_s, wpa_s->conf->non_pref_chan);
   5501 #endif /* CONFIG_MBO */
   5502 
   5503 	wpa_supplicant_set_default_scan_ies(wpa_s);
   5504 
   5505 	return 0;
   5506 }
   5507 
   5508 
   5509 static void wpa_supplicant_deinit_iface(struct wpa_supplicant *wpa_s,
   5510 					int notify, int terminate)
   5511 {
   5512 	struct wpa_global *global = wpa_s->global;
   5513 	struct wpa_supplicant *iface, *prev;
   5514 
   5515 	if (wpa_s == wpa_s->parent)
   5516 		wpas_p2p_group_remove(wpa_s, "*");
   5517 
   5518 	iface = global->ifaces;
   5519 	while (iface) {
   5520 		if (iface->p2pdev == wpa_s)
   5521 			iface->p2pdev = iface->parent;
   5522 		if (iface == wpa_s || iface->parent != wpa_s) {
   5523 			iface = iface->next;
   5524 			continue;
   5525 		}
   5526 		wpa_printf(MSG_DEBUG,
   5527 			   "Remove remaining child interface %s from parent %s",
   5528 			   iface->ifname, wpa_s->ifname);
   5529 		prev = iface;
   5530 		iface = iface->next;
   5531 		wpa_supplicant_remove_iface(global, prev, terminate);
   5532 	}
   5533 
   5534 	wpa_s->disconnected = 1;
   5535 	if (wpa_s->drv_priv) {
   5536 		wpa_supplicant_deauthenticate(wpa_s,
   5537 					      WLAN_REASON_DEAUTH_LEAVING);
   5538 
   5539 		wpa_drv_set_countermeasures(wpa_s, 0);
   5540 		wpa_clear_keys(wpa_s, NULL);
   5541 	}
   5542 
   5543 	wpa_supplicant_cleanup(wpa_s);
   5544 	wpas_p2p_deinit_iface(wpa_s);
   5545 
   5546 	wpas_ctrl_radio_work_flush(wpa_s);
   5547 	radio_remove_interface(wpa_s);
   5548 
   5549 #ifdef CONFIG_FST
   5550 	if (wpa_s->fst) {
   5551 		fst_detach(wpa_s->fst);
   5552 		wpa_s->fst = NULL;
   5553 	}
   5554 	if (wpa_s->received_mb_ies) {
   5555 		wpabuf_free(wpa_s->received_mb_ies);
   5556 		wpa_s->received_mb_ies = NULL;
   5557 	}
   5558 #endif /* CONFIG_FST */
   5559 
   5560 	if (wpa_s->drv_priv)
   5561 		wpa_drv_deinit(wpa_s);
   5562 
   5563 	if (notify)
   5564 		wpas_notify_iface_removed(wpa_s);
   5565 
   5566 	if (terminate)
   5567 		wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TERMINATING);
   5568 
   5569 	if (wpa_s->ctrl_iface) {
   5570 		wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
   5571 		wpa_s->ctrl_iface = NULL;
   5572 	}
   5573 
   5574 #ifdef CONFIG_MESH
   5575 	if (wpa_s->ifmsh) {
   5576 		wpa_supplicant_mesh_iface_deinit(wpa_s, wpa_s->ifmsh);
   5577 		wpa_s->ifmsh = NULL;
   5578 	}
   5579 #endif /* CONFIG_MESH */
   5580 
   5581 	if (wpa_s->conf != NULL) {
   5582 		wpa_config_free(wpa_s->conf);
   5583 		wpa_s->conf = NULL;
   5584 	}
   5585 
   5586 	os_free(wpa_s->ssids_from_scan_req);
   5587 
   5588 	os_free(wpa_s);
   5589 }
   5590 
   5591 
   5592 #ifdef CONFIG_MATCH_IFACE
   5593 
   5594 /**
   5595  * wpa_supplicant_match_iface - Match an interface description to a name
   5596  * @global: Pointer to global data from wpa_supplicant_init()
   5597  * @ifname: Name of the interface to match
   5598  * Returns: Pointer to the created interface description or %NULL on failure
   5599  */
   5600 struct wpa_interface * wpa_supplicant_match_iface(struct wpa_global *global,
   5601 						  const char *ifname)
   5602 {
   5603 	int i;
   5604 	struct wpa_interface *iface, *miface;
   5605 
   5606 	for (i = 0; i < global->params.match_iface_count; i++) {
   5607 		miface = &global->params.match_ifaces[i];
   5608 		if (!miface->ifname ||
   5609 		    fnmatch(miface->ifname, ifname, 0) == 0) {
   5610 			iface = os_zalloc(sizeof(*iface));
   5611 			if (!iface)
   5612 				return NULL;
   5613 			*iface = *miface;
   5614 			iface->ifname = ifname;
   5615 			return iface;
   5616 		}
   5617 	}
   5618 
   5619 	return NULL;
   5620 }
   5621 
   5622 
   5623 /**
   5624  * wpa_supplicant_match_existing - Match existing interfaces
   5625  * @global: Pointer to global data from wpa_supplicant_init()
   5626  * Returns: 0 on success, -1 on failure
   5627  */
   5628 static int wpa_supplicant_match_existing(struct wpa_global *global)
   5629 {
   5630 	struct if_nameindex *ifi, *ifp;
   5631 	struct wpa_supplicant *wpa_s;
   5632 	struct wpa_interface *iface;
   5633 
   5634 	ifp = if_nameindex();
   5635 	if (!ifp) {
   5636 		wpa_printf(MSG_ERROR, "if_nameindex: %s", strerror(errno));
   5637 		return -1;
   5638 	}
   5639 
   5640 	for (ifi = ifp; ifi->if_name; ifi++) {
   5641 		wpa_s = wpa_supplicant_get_iface(global, ifi->if_name);
   5642 		if (wpa_s)
   5643 			continue;
   5644 		iface = wpa_supplicant_match_iface(global, ifi->if_name);
   5645 		if (iface) {
   5646 			wpa_s = wpa_supplicant_add_iface(global, iface, NULL);
   5647 			os_free(iface);
   5648 			if (wpa_s)
   5649 				wpa_s->matched = 1;
   5650 		}
   5651 	}
   5652 
   5653 	if_freenameindex(ifp);
   5654 	return 0;
   5655 }
   5656 
   5657 #endif /* CONFIG_MATCH_IFACE */
   5658 
   5659 
   5660 /**
   5661  * wpa_supplicant_add_iface - Add a new network interface
   5662  * @global: Pointer to global data from wpa_supplicant_init()
   5663  * @iface: Interface configuration options
   5664  * @parent: Parent interface or %NULL to assign new interface as parent
   5665  * Returns: Pointer to the created interface or %NULL on failure
   5666  *
   5667  * This function is used to add new network interfaces for %wpa_supplicant.
   5668  * This can be called before wpa_supplicant_run() to add interfaces before the
   5669  * main event loop has been started. In addition, new interfaces can be added
   5670  * dynamically while %wpa_supplicant is already running. This could happen,
   5671  * e.g., when a hotplug network adapter is inserted.
   5672  */
   5673 struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
   5674 						 struct wpa_interface *iface,
   5675 						 struct wpa_supplicant *parent)
   5676 {
   5677 	struct wpa_supplicant *wpa_s;
   5678 	struct wpa_interface t_iface;
   5679 	struct wpa_ssid *ssid;
   5680 
   5681 	if (global == NULL || iface == NULL)
   5682 		return NULL;
   5683 
   5684 	wpa_s = wpa_supplicant_alloc(parent);
   5685 	if (wpa_s == NULL)
   5686 		return NULL;
   5687 
   5688 	wpa_s->global = global;
   5689 
   5690 	t_iface = *iface;
   5691 	if (global->params.override_driver) {
   5692 		wpa_printf(MSG_DEBUG, "Override interface parameter: driver "
   5693 			   "('%s' -> '%s')",
   5694 			   iface->driver, global->params.override_driver);
   5695 		t_iface.driver = global->params.override_driver;
   5696 	}
   5697 	if (global->params.override_ctrl_interface) {
   5698 		wpa_printf(MSG_DEBUG, "Override interface parameter: "
   5699 			   "ctrl_interface ('%s' -> '%s')",
   5700 			   iface->ctrl_interface,
   5701 			   global->params.override_ctrl_interface);
   5702 		t_iface.ctrl_interface =
   5703 			global->params.override_ctrl_interface;
   5704 	}
   5705 	if (wpa_supplicant_init_iface(wpa_s, &t_iface)) {
   5706 		wpa_printf(MSG_DEBUG, "Failed to add interface %s",
   5707 			   iface->ifname);
   5708 		wpa_supplicant_deinit_iface(wpa_s, 0, 0);
   5709 		return NULL;
   5710 	}
   5711 
   5712 	/* Notify the control interfaces about new iface */
   5713 	if (wpas_notify_iface_added(wpa_s)) {
   5714 		wpa_supplicant_deinit_iface(wpa_s, 1, 0);
   5715 		return NULL;
   5716 	}
   5717 
   5718 	/* Notify the control interfaces about new networks for non p2p mgmt
   5719 	 * ifaces. */
   5720 	if (iface->p2p_mgmt == 0) {
   5721 		for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
   5722 			wpas_notify_network_added(wpa_s, ssid);
   5723 	}
   5724 
   5725 	wpa_s->next = global->ifaces;
   5726 	global->ifaces = wpa_s;
   5727 
   5728 	wpa_dbg(wpa_s, MSG_DEBUG, "Added interface %s", wpa_s->ifname);
   5729 	wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
   5730 
   5731 #ifdef CONFIG_P2P
   5732 	if (wpa_s->global->p2p == NULL &&
   5733 	    !wpa_s->global->p2p_disabled && !wpa_s->conf->p2p_disabled &&
   5734 	    (wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE) &&
   5735 	    wpas_p2p_add_p2pdev_interface(
   5736 		    wpa_s, wpa_s->global->params.conf_p2p_dev) < 0) {
   5737 		wpa_printf(MSG_INFO,
   5738 			   "P2P: Failed to enable P2P Device interface");
   5739 		/* Try to continue without. P2P will be disabled. */
   5740 	}
   5741 #endif /* CONFIG_P2P */
   5742 
   5743 	return wpa_s;
   5744 }
   5745 
   5746 
   5747 /**
   5748  * wpa_supplicant_remove_iface - Remove a network interface
   5749  * @global: Pointer to global data from wpa_supplicant_init()
   5750  * @wpa_s: Pointer to the network interface to be removed
   5751  * Returns: 0 if interface was removed, -1 if interface was not found
   5752  *
   5753  * This function can be used to dynamically remove network interfaces from
   5754  * %wpa_supplicant, e.g., when a hotplug network adapter is ejected. In
   5755  * addition, this function is used to remove all remaining interfaces when
   5756  * %wpa_supplicant is terminated.
   5757  */
   5758 int wpa_supplicant_remove_iface(struct wpa_global *global,
   5759 				struct wpa_supplicant *wpa_s,
   5760 				int terminate)
   5761 {
   5762 	struct wpa_supplicant *prev;
   5763 #ifdef CONFIG_MESH
   5764 	unsigned int mesh_if_created = wpa_s->mesh_if_created;
   5765 	char *ifname = NULL;
   5766 	struct wpa_supplicant *parent = wpa_s->parent;
   5767 #endif /* CONFIG_MESH */
   5768 
   5769 	/* Remove interface from the global list of interfaces */
   5770 	prev = global->ifaces;
   5771 	if (prev == wpa_s) {
   5772 		global->ifaces = wpa_s->next;
   5773 	} else {
   5774 		while (prev && prev->next != wpa_s)
   5775 			prev = prev->next;
   5776 		if (prev == NULL)
   5777 			return -1;
   5778 		prev->next = wpa_s->next;
   5779 	}
   5780 
   5781 	wpa_dbg(wpa_s, MSG_DEBUG, "Removing interface %s", wpa_s->ifname);
   5782 
   5783 #ifdef CONFIG_MESH
   5784 	if (mesh_if_created) {
   5785 		ifname = os_strdup(wpa_s->ifname);
   5786 		if (ifname == NULL) {
   5787 			wpa_dbg(wpa_s, MSG_ERROR,
   5788 				"mesh: Failed to malloc ifname");
   5789 			return -1;
   5790 		}
   5791 	}
   5792 #endif /* CONFIG_MESH */
   5793 
   5794 	if (global->p2p_group_formation == wpa_s)
   5795 		global->p2p_group_formation = NULL;
   5796 	if (global->p2p_invite_group == wpa_s)
   5797 		global->p2p_invite_group = NULL;
   5798 	wpa_supplicant_deinit_iface(wpa_s, 1, terminate);
   5799 
   5800 #ifdef CONFIG_MESH
   5801 	if (mesh_if_created) {
   5802 		wpa_drv_if_remove(parent, WPA_IF_MESH, ifname);
   5803 		os_free(ifname);
   5804 	}
   5805 #endif /* CONFIG_MESH */
   5806 
   5807 	return 0;
   5808 }
   5809 
   5810 
   5811 /**
   5812  * wpa_supplicant_get_eap_mode - Get the current EAP mode
   5813  * @wpa_s: Pointer to the network interface
   5814  * Returns: Pointer to the eap mode or the string "UNKNOWN" if not found
   5815  */
   5816 const char * wpa_supplicant_get_eap_mode(struct wpa_supplicant *wpa_s)
   5817 {
   5818 	const char *eapol_method;
   5819 
   5820         if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) == 0 &&
   5821             wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
   5822 		return "NO-EAP";
   5823 	}
   5824 
   5825 	eapol_method = eapol_sm_get_method_name(wpa_s->eapol);
   5826 	if (eapol_method == NULL)
   5827 		return "UNKNOWN-EAP";
   5828 
   5829 	return eapol_method;
   5830 }
   5831 
   5832 
   5833 /**
   5834  * wpa_supplicant_get_iface - Get a new network interface
   5835  * @global: Pointer to global data from wpa_supplicant_init()
   5836  * @ifname: Interface name
   5837  * Returns: Pointer to the interface or %NULL if not found
   5838  */
   5839 struct wpa_supplicant * wpa_supplicant_get_iface(struct wpa_global *global,
   5840 						 const char *ifname)
   5841 {
   5842 	struct wpa_supplicant *wpa_s;
   5843 
   5844 	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
   5845 		if (os_strcmp(wpa_s->ifname, ifname) == 0)
   5846 			return wpa_s;
   5847 	}
   5848 	return NULL;
   5849 }
   5850 
   5851 
   5852 #ifndef CONFIG_NO_WPA_MSG
   5853 static const char * wpa_supplicant_msg_ifname_cb(void *ctx)
   5854 {
   5855 	struct wpa_supplicant *wpa_s = ctx;
   5856 	if (wpa_s == NULL)
   5857 		return NULL;
   5858 	return wpa_s->ifname;
   5859 }
   5860 #endif /* CONFIG_NO_WPA_MSG */
   5861 
   5862 
   5863 #ifndef WPA_SUPPLICANT_CLEANUP_INTERVAL
   5864 #define WPA_SUPPLICANT_CLEANUP_INTERVAL 10
   5865 #endif /* WPA_SUPPLICANT_CLEANUP_INTERVAL */
   5866 
   5867 /* Periodic cleanup tasks */
   5868 static void wpas_periodic(void *eloop_ctx, void *timeout_ctx)
   5869 {
   5870 	struct wpa_global *global = eloop_ctx;
   5871 	struct wpa_supplicant *wpa_s;
   5872 
   5873 	eloop_register_timeout(WPA_SUPPLICANT_CLEANUP_INTERVAL, 0,
   5874 			       wpas_periodic, global, NULL);
   5875 
   5876 #ifdef CONFIG_P2P
   5877 	if (global->p2p)
   5878 		p2p_expire_peers(global->p2p);
   5879 #endif /* CONFIG_P2P */
   5880 
   5881 	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
   5882 		wpa_bss_flush_by_age(wpa_s, wpa_s->conf->bss_expiration_age);
   5883 #ifdef CONFIG_AP
   5884 		ap_periodic(wpa_s);
   5885 #endif /* CONFIG_AP */
   5886 	}
   5887 }
   5888 
   5889 
   5890 /**
   5891  * wpa_supplicant_init - Initialize %wpa_supplicant
   5892  * @params: Parameters for %wpa_supplicant
   5893  * Returns: Pointer to global %wpa_supplicant data, or %NULL on failure
   5894  *
   5895  * This function is used to initialize %wpa_supplicant. After successful
   5896  * initialization, the returned data pointer can be used to add and remove
   5897  * network interfaces, and eventually, to deinitialize %wpa_supplicant.
   5898  */
   5899 struct wpa_global * wpa_supplicant_init(struct wpa_params *params)
   5900 {
   5901 	struct wpa_global *global;
   5902 	int ret, i;
   5903 
   5904 	if (params == NULL)
   5905 		return NULL;
   5906 
   5907 #ifdef CONFIG_DRIVER_NDIS
   5908 	{
   5909 		void driver_ndis_init_ops(void);
   5910 		driver_ndis_init_ops();
   5911 	}
   5912 #endif /* CONFIG_DRIVER_NDIS */
   5913 
   5914 #ifndef CONFIG_NO_WPA_MSG
   5915 	wpa_msg_register_ifname_cb(wpa_supplicant_msg_ifname_cb);
   5916 #endif /* CONFIG_NO_WPA_MSG */
   5917 
   5918 	if (params->wpa_debug_file_path)
   5919 		wpa_debug_open_file(params->wpa_debug_file_path);
   5920 	else
   5921 		wpa_debug_setup_stdout();
   5922 	if (params->wpa_debug_syslog)
   5923 		wpa_debug_open_syslog();
   5924 	if (params->wpa_debug_tracing) {
   5925 		ret = wpa_debug_open_linux_tracing();
   5926 		if (ret) {
   5927 			wpa_printf(MSG_ERROR,
   5928 				   "Failed to enable trace logging");
   5929 			return NULL;
   5930 		}
   5931 	}
   5932 
   5933 	ret = eap_register_methods();
   5934 	if (ret) {
   5935 		wpa_printf(MSG_ERROR, "Failed to register EAP methods");
   5936 		if (ret == -2)
   5937 			wpa_printf(MSG_ERROR, "Two or more EAP methods used "
   5938 				   "the same EAP type.");
   5939 		return NULL;
   5940 	}
   5941 
   5942 	global = os_zalloc(sizeof(*global));
   5943 	if (global == NULL)
   5944 		return NULL;
   5945 	dl_list_init(&global->p2p_srv_bonjour);
   5946 	dl_list_init(&global->p2p_srv_upnp);
   5947 	global->params.daemonize = params->daemonize;
   5948 	global->params.wait_for_monitor = params->wait_for_monitor;
   5949 	global->params.dbus_ctrl_interface = params->dbus_ctrl_interface;
   5950 	if (params->pid_file)
   5951 		global->params.pid_file = os_strdup(params->pid_file);
   5952 	if (params->ctrl_interface)
   5953 		global->params.ctrl_interface =
   5954 			os_strdup(params->ctrl_interface);
   5955 	if (params->ctrl_interface_group)
   5956 		global->params.ctrl_interface_group =
   5957 			os_strdup(params->ctrl_interface_group);
   5958 	if (params->override_driver)
   5959 		global->params.override_driver =
   5960 			os_strdup(params->override_driver);
   5961 	if (params->override_ctrl_interface)
   5962 		global->params.override_ctrl_interface =
   5963 			os_strdup(params->override_ctrl_interface);
   5964 #ifdef CONFIG_MATCH_IFACE
   5965 	global->params.match_iface_count = params->match_iface_count;
   5966 	if (params->match_iface_count) {
   5967 		global->params.match_ifaces =
   5968 			os_calloc(params->match_iface_count,
   5969 				  sizeof(struct wpa_interface));
   5970 		os_memcpy(global->params.match_ifaces,
   5971 			  params->match_ifaces,
   5972 			  params->match_iface_count *
   5973 			  sizeof(struct wpa_interface));
   5974 	}
   5975 #endif /* CONFIG_MATCH_IFACE */
   5976 #ifdef CONFIG_P2P
   5977 	if (params->conf_p2p_dev)
   5978 		global->params.conf_p2p_dev =
   5979 			os_strdup(params->conf_p2p_dev);
   5980 #endif /* CONFIG_P2P */
   5981 	wpa_debug_level = global->params.wpa_debug_level =
   5982 		params->wpa_debug_level;
   5983 	wpa_debug_show_keys = global->params.wpa_debug_show_keys =
   5984 		params->wpa_debug_show_keys;
   5985 	wpa_debug_timestamp = global->params.wpa_debug_timestamp =
   5986 		params->wpa_debug_timestamp;
   5987 
   5988 	wpa_printf(MSG_DEBUG, "wpa_supplicant v" VERSION_STR);
   5989 
   5990 	if (eloop_init()) {
   5991 		wpa_printf(MSG_ERROR, "Failed to initialize event loop");
   5992 		wpa_supplicant_deinit(global);
   5993 		return NULL;
   5994 	}
   5995 
   5996 	random_init(params->entropy_file);
   5997 
   5998 	global->ctrl_iface = wpa_supplicant_global_ctrl_iface_init(global);
   5999 	if (global->ctrl_iface == NULL) {
   6000 		wpa_supplicant_deinit(global);
   6001 		return NULL;
   6002 	}
   6003 
   6004 	if (wpas_notify_supplicant_initialized(global)) {
   6005 		wpa_supplicant_deinit(global);
   6006 		return NULL;
   6007 	}
   6008 
   6009 	for (i = 0; wpa_drivers[i]; i++)
   6010 		global->drv_count++;
   6011 	if (global->drv_count == 0) {
   6012 		wpa_printf(MSG_ERROR, "No drivers enabled");
   6013 		wpa_supplicant_deinit(global);
   6014 		return NULL;
   6015 	}
   6016 	global->drv_priv = os_calloc(global->drv_count, sizeof(void *));
   6017 	if (global->drv_priv == NULL) {
   6018 		wpa_supplicant_deinit(global);
   6019 		return NULL;
   6020 	}
   6021 
   6022 #ifdef CONFIG_WIFI_DISPLAY
   6023 	if (wifi_display_init(global) < 0) {
   6024 		wpa_printf(MSG_ERROR, "Failed to initialize Wi-Fi Display");
   6025 		wpa_supplicant_deinit(global);
   6026 		return NULL;
   6027 	}
   6028 #endif /* CONFIG_WIFI_DISPLAY */
   6029 
   6030 	eloop_register_timeout(WPA_SUPPLICANT_CLEANUP_INTERVAL, 0,
   6031 			       wpas_periodic, global, NULL);
   6032 
   6033 	return global;
   6034 }
   6035 
   6036 
   6037 /**
   6038  * wpa_supplicant_run - Run the %wpa_supplicant main event loop
   6039  * @global: Pointer to global data from wpa_supplicant_init()
   6040  * Returns: 0 after successful event loop run, -1 on failure
   6041  *
   6042  * This function starts the main event loop and continues running as long as
   6043  * there are any remaining events. In most cases, this function is running as
   6044  * long as the %wpa_supplicant process in still in use.
   6045  */
   6046 int wpa_supplicant_run(struct wpa_global *global)
   6047 {
   6048 	struct wpa_supplicant *wpa_s;
   6049 
   6050 	if (global->params.daemonize &&
   6051 	    (wpa_supplicant_daemon(global->params.pid_file) ||
   6052 	     eloop_sock_requeue()))
   6053 		return -1;
   6054 
   6055 #ifdef CONFIG_MATCH_IFACE
   6056 	if (wpa_supplicant_match_existing(global))
   6057 		return -1;
   6058 #endif
   6059 
   6060 	if (global->params.wait_for_monitor) {
   6061 		for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
   6062 			if (wpa_s->ctrl_iface && !wpa_s->p2p_mgmt)
   6063 				wpa_supplicant_ctrl_iface_wait(
   6064 					wpa_s->ctrl_iface);
   6065 	}
   6066 
   6067 	eloop_register_signal_terminate(wpa_supplicant_terminate, global);
   6068 	eloop_register_signal_reconfig(wpa_supplicant_reconfig, global);
   6069 
   6070 	eloop_run();
   6071 
   6072 	return 0;
   6073 }
   6074 
   6075 
   6076 /**
   6077  * wpa_supplicant_deinit - Deinitialize %wpa_supplicant
   6078  * @global: Pointer to global data from wpa_supplicant_init()
   6079  *
   6080  * This function is called to deinitialize %wpa_supplicant and to free all
   6081  * allocated resources. Remaining network interfaces will also be removed.
   6082  */
   6083 void wpa_supplicant_deinit(struct wpa_global *global)
   6084 {
   6085 	int i;
   6086 
   6087 	if (global == NULL)
   6088 		return;
   6089 
   6090 	eloop_cancel_timeout(wpas_periodic, global, NULL);
   6091 
   6092 #ifdef CONFIG_WIFI_DISPLAY
   6093 	wifi_display_deinit(global);
   6094 #endif /* CONFIG_WIFI_DISPLAY */
   6095 
   6096 	while (global->ifaces)
   6097 		wpa_supplicant_remove_iface(global, global->ifaces, 1);
   6098 
   6099 	if (global->ctrl_iface)
   6100 		wpa_supplicant_global_ctrl_iface_deinit(global->ctrl_iface);
   6101 
   6102 	wpas_notify_supplicant_deinitialized(global);
   6103 
   6104 	eap_peer_unregister_methods();
   6105 #ifdef CONFIG_AP
   6106 	eap_server_unregister_methods();
   6107 #endif /* CONFIG_AP */
   6108 
   6109 	for (i = 0; wpa_drivers[i] && global->drv_priv; i++) {
   6110 		if (!global->drv_priv[i])
   6111 			continue;
   6112 		wpa_drivers[i]->global_deinit(global->drv_priv[i]);
   6113 	}
   6114 	os_free(global->drv_priv);
   6115 
   6116 	random_deinit();
   6117 
   6118 	eloop_destroy();
   6119 
   6120 	if (global->params.pid_file) {
   6121 		os_daemonize_terminate(global->params.pid_file);
   6122 		os_free(global->params.pid_file);
   6123 	}
   6124 	os_free(global->params.ctrl_interface);
   6125 	os_free(global->params.ctrl_interface_group);
   6126 	os_free(global->params.override_driver);
   6127 	os_free(global->params.override_ctrl_interface);
   6128 #ifdef CONFIG_MATCH_IFACE
   6129 	os_free(global->params.match_ifaces);
   6130 #endif /* CONFIG_MATCH_IFACE */
   6131 #ifdef CONFIG_P2P
   6132 	os_free(global->params.conf_p2p_dev);
   6133 #endif /* CONFIG_P2P */
   6134 
   6135 	os_free(global->p2p_disallow_freq.range);
   6136 	os_free(global->p2p_go_avoid_freq.range);
   6137 	os_free(global->add_psk);
   6138 
   6139 	os_free(global);
   6140 	wpa_debug_close_syslog();
   6141 	wpa_debug_close_file();
   6142 	wpa_debug_close_linux_tracing();
   6143 }
   6144 
   6145 
   6146 void wpa_supplicant_update_config(struct wpa_supplicant *wpa_s)
   6147 {
   6148 	if ((wpa_s->conf->changed_parameters & CFG_CHANGED_COUNTRY) &&
   6149 	    wpa_s->conf->country[0] && wpa_s->conf->country[1]) {
   6150 		char country[3];
   6151 		country[0] = wpa_s->conf->country[0];
   6152 		country[1] = wpa_s->conf->country[1];
   6153 		country[2] = '\0';
   6154 		if (wpa_drv_set_country(wpa_s, country) < 0) {
   6155 			wpa_printf(MSG_ERROR, "Failed to set country code "
   6156 				   "'%s'", country);
   6157 		}
   6158 	}
   6159 
   6160 	if (wpa_s->conf->changed_parameters & CFG_CHANGED_EXT_PW_BACKEND)
   6161 		wpas_init_ext_pw(wpa_s);
   6162 
   6163 	if (wpa_s->conf->changed_parameters & CFG_CHANGED_SCHED_SCAN_PLANS)
   6164 		wpas_sched_scan_plans_set(wpa_s, wpa_s->conf->sched_scan_plans);
   6165 
   6166 	if (wpa_s->conf->changed_parameters & CFG_CHANGED_WOWLAN_TRIGGERS) {
   6167 		struct wpa_driver_capa capa;
   6168 		int res = wpa_drv_get_capa(wpa_s, &capa);
   6169 
   6170 		if (res == 0 && wpas_set_wowlan_triggers(wpa_s, &capa) < 0)
   6171 			wpa_printf(MSG_ERROR,
   6172 				   "Failed to update wowlan_triggers to '%s'",
   6173 				   wpa_s->conf->wowlan_triggers);
   6174 	}
   6175 
   6176 #ifdef CONFIG_WPS
   6177 	wpas_wps_update_config(wpa_s);
   6178 #endif /* CONFIG_WPS */
   6179 	wpas_p2p_update_config(wpa_s);
   6180 	wpa_s->conf->changed_parameters = 0;
   6181 }
   6182 
   6183 
   6184 void add_freq(int *freqs, int *num_freqs, int freq)
   6185 {
   6186 	int i;
   6187 
   6188 	for (i = 0; i < *num_freqs; i++) {
   6189 		if (freqs[i] == freq)
   6190 			return;
   6191 	}
   6192 
   6193 	freqs[*num_freqs] = freq;
   6194 	(*num_freqs)++;
   6195 }
   6196 
   6197 
   6198 static int * get_bss_freqs_in_ess(struct wpa_supplicant *wpa_s)
   6199 {
   6200 	struct wpa_bss *bss, *cbss;
   6201 	const int max_freqs = 10;
   6202 	int *freqs;
   6203 	int num_freqs = 0;
   6204 
   6205 	freqs = os_calloc(max_freqs + 1, sizeof(int));
   6206 	if (freqs == NULL)
   6207 		return NULL;
   6208 
   6209 	cbss = wpa_s->current_bss;
   6210 
   6211 	dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
   6212 		if (bss == cbss)
   6213 			continue;
   6214 		if (bss->ssid_len == cbss->ssid_len &&
   6215 		    os_memcmp(bss->ssid, cbss->ssid, bss->ssid_len) == 0 &&
   6216 		    wpa_blacklist_get(wpa_s, bss->bssid) == NULL) {
   6217 			add_freq(freqs, &num_freqs, bss->freq);
   6218 			if (num_freqs == max_freqs)
   6219 				break;
   6220 		}
   6221 	}
   6222 
   6223 	if (num_freqs == 0) {
   6224 		os_free(freqs);
   6225 		freqs = NULL;
   6226 	}
   6227 
   6228 	return freqs;
   6229 }
   6230 
   6231 
   6232 void wpas_connection_failed(struct wpa_supplicant *wpa_s, const u8 *bssid)
   6233 {
   6234 	int timeout;
   6235 	int count;
   6236 	int *freqs = NULL;
   6237 
   6238 	wpas_connect_work_done(wpa_s);
   6239 
   6240 	/*
   6241 	 * Remove possible authentication timeout since the connection failed.
   6242 	 */
   6243 	eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
   6244 
   6245 	/*
   6246 	 * There is no point in blacklisting the AP if this event is
   6247 	 * generated based on local request to disconnect.
   6248 	 */
   6249 	if (wpa_s->own_disconnect_req) {
   6250 		wpa_s->own_disconnect_req = 0;
   6251 		wpa_dbg(wpa_s, MSG_DEBUG,
   6252 			"Ignore connection failure due to local request to disconnect");
   6253 		return;
   6254 	}
   6255 	if (wpa_s->disconnected) {
   6256 		wpa_dbg(wpa_s, MSG_DEBUG, "Ignore connection failure "
   6257 			"indication since interface has been put into "
   6258 			"disconnected state");
   6259 		return;
   6260 	}
   6261 
   6262 	/*
   6263 	 * Add the failed BSSID into the blacklist and speed up next scan
   6264 	 * attempt if there could be other APs that could accept association.
   6265 	 * The current blacklist count indicates how many times we have tried
   6266 	 * connecting to this AP and multiple attempts mean that other APs are
   6267 	 * either not available or has already been tried, so that we can start
   6268 	 * increasing the delay here to avoid constant scanning.
   6269 	 */
   6270 	count = wpa_blacklist_add(wpa_s, bssid);
   6271 	if (count == 1 && wpa_s->current_bss) {
   6272 		/*
   6273 		 * This BSS was not in the blacklist before. If there is
   6274 		 * another BSS available for the same ESS, we should try that
   6275 		 * next. Otherwise, we may as well try this one once more
   6276 		 * before allowing other, likely worse, ESSes to be considered.
   6277 		 */
   6278 		freqs = get_bss_freqs_in_ess(wpa_s);
   6279 		if (freqs) {
   6280 			wpa_dbg(wpa_s, MSG_DEBUG, "Another BSS in this ESS "
   6281 				"has been seen; try it next");
   6282 			wpa_blacklist_add(wpa_s, bssid);
   6283 			/*
   6284 			 * On the next scan, go through only the known channels
   6285 			 * used in this ESS based on previous scans to speed up
   6286 			 * common load balancing use case.
   6287 			 */
   6288 			os_free(wpa_s->next_scan_freqs);
   6289 			wpa_s->next_scan_freqs = freqs;
   6290 		}
   6291 	}
   6292 
   6293 	/*
   6294 	 * Add previous failure count in case the temporary blacklist was
   6295 	 * cleared due to no other BSSes being available.
   6296 	 */
   6297 	count += wpa_s->extra_blacklist_count;
   6298 
   6299 	if (count > 3 && wpa_s->current_ssid) {
   6300 		wpa_printf(MSG_DEBUG, "Continuous association failures - "
   6301 			   "consider temporary network disabling");
   6302 		wpas_auth_failed(wpa_s, "CONN_FAILED");
   6303 	}
   6304 
   6305 	switch (count) {
   6306 	case 1:
   6307 		timeout = 100;
   6308 		break;
   6309 	case 2:
   6310 		timeout = 500;
   6311 		break;
   6312 	case 3:
   6313 		timeout = 1000;
   6314 		break;
   6315 	case 4:
   6316 		timeout = 5000;
   6317 		break;
   6318 	default:
   6319 		timeout = 10000;
   6320 		break;
   6321 	}
   6322 
   6323 	wpa_dbg(wpa_s, MSG_DEBUG, "Blacklist count %d --> request scan in %d "
   6324 		"ms", count, timeout);
   6325 
   6326 	/*
   6327 	 * TODO: if more than one possible AP is available in scan results,
   6328 	 * could try the other ones before requesting a new scan.
   6329 	 */
   6330 	wpa_supplicant_req_scan(wpa_s, timeout / 1000,
   6331 				1000 * (timeout % 1000));
   6332 }
   6333 
   6334 
   6335 int wpas_driver_bss_selection(struct wpa_supplicant *wpa_s)
   6336 {
   6337 	return wpa_s->conf->ap_scan == 2 ||
   6338 		(wpa_s->drv_flags & WPA_DRIVER_FLAGS_BSS_SELECTION);
   6339 }
   6340 
   6341 
   6342 #if defined(CONFIG_CTRL_IFACE) || defined(CONFIG_CTRL_IFACE_DBUS_NEW) || defined (CONFIG_CTRL_IFACE_HIDL)
   6343 int wpa_supplicant_ctrl_iface_ctrl_rsp_handle(struct wpa_supplicant *wpa_s,
   6344 					      struct wpa_ssid *ssid,
   6345 					      const char *field,
   6346 					      const char *value)
   6347 {
   6348 #ifdef IEEE8021X_EAPOL
   6349 	enum wpa_ctrl_req_type rtype;
   6350 
   6351 	wpa_printf(MSG_DEBUG, "CTRL_IFACE: response handle field=%s", field);
   6352 	wpa_hexdump_ascii_key(MSG_DEBUG, "CTRL_IFACE: response value",
   6353 			      (const u8 *) value, os_strlen(value));
   6354 
   6355 	rtype = wpa_supplicant_ctrl_req_from_string(field);
   6356 	return wpa_supplicant_ctrl_rsp_handle(wpa_s, ssid, rtype, value, strlen(value));
   6357 #else /* IEEE8021X_EAPOL */
   6358 	wpa_printf(MSG_DEBUG, "CTRL_IFACE: IEEE 802.1X not included");
   6359 	return -1;
   6360 #endif /* IEEE8021X_EAPOL */
   6361 }
   6362 
   6363 int wpa_supplicant_ctrl_rsp_handle(struct wpa_supplicant *wpa_s,
   6364 				   struct wpa_ssid *ssid,
   6365 				   enum wpa_ctrl_req_type rtype,
   6366 				   const char *value, int value_len)
   6367 {
   6368 #ifdef IEEE8021X_EAPOL
   6369 	struct eap_peer_config *eap = &ssid->eap;
   6370 	char *identity, *imsi_identity;
   6371 
   6372 	switch (rtype) {
   6373 	case WPA_CTRL_REQ_EAP_IDENTITY:
   6374 		os_free(eap->identity);
   6375 		os_free(eap->imsi_identity);
   6376 		if (value == NULL)
   6377 			return -1;
   6378 		identity = os_strchr(value, ':');
   6379 		if (identity == NULL) {
   6380 			/* plain identity */
   6381 			eap->identity = (u8 *)os_strdup(value);
   6382 			eap->identity_len = os_strlen(value);
   6383 		} else {
   6384 			/* have both plain identity and encrypted identity */
   6385 			imsi_identity = value;
   6386 			*identity++ = '\0';
   6387 			/* plain identity */
   6388 			eap->imsi_identity = (u8 *)dup_binstr(imsi_identity, strlen(imsi_identity));
   6389 			eap->imsi_identity_len = strlen(imsi_identity);
   6390 			/* encrypted identity */
   6391 			eap->identity = (u8 *)dup_binstr(identity,
   6392 							 value_len - strlen(imsi_identity) - 1);
   6393 			eap->identity_len = value_len - strlen(imsi_identity) - 1;
   6394 		}
   6395 		eap->pending_req_identity = 0;
   6396 		if (ssid == wpa_s->current_ssid)
   6397 			wpa_s->reassociate = 1;
   6398 		break;
   6399 	case WPA_CTRL_REQ_EAP_PASSWORD:
   6400 		bin_clear_free(eap->password, eap->password_len);
   6401 		eap->password = (u8 *) os_strdup(value);
   6402 		eap->password_len = value_len;
   6403 		eap->pending_req_password = 0;
   6404 		if (ssid == wpa_s->current_ssid)
   6405 			wpa_s->reassociate = 1;
   6406 		break;
   6407 	case WPA_CTRL_REQ_EAP_NEW_PASSWORD:
   6408 		bin_clear_free(eap->new_password, eap->new_password_len);
   6409 		eap->new_password = (u8 *) os_strdup(value);
   6410 		eap->new_password_len = value_len;
   6411 		eap->pending_req_new_password = 0;
   6412 		if (ssid == wpa_s->current_ssid)
   6413 			wpa_s->reassociate = 1;
   6414 		break;
   6415 	case WPA_CTRL_REQ_EAP_PIN:
   6416 		str_clear_free(eap->pin);
   6417 		eap->pin = os_strdup(value);
   6418 		eap->pending_req_pin = 0;
   6419 		if (ssid == wpa_s->current_ssid)
   6420 			wpa_s->reassociate = 1;
   6421 		break;
   6422 	case WPA_CTRL_REQ_EAP_OTP:
   6423 		bin_clear_free(eap->otp, eap->otp_len);
   6424 		eap->otp = (u8 *) os_strdup(value);
   6425 		eap->otp_len = value_len;
   6426 		os_free(eap->pending_req_otp);
   6427 		eap->pending_req_otp = NULL;
   6428 		eap->pending_req_otp_len = 0;
   6429 		break;
   6430 	case WPA_CTRL_REQ_EAP_PASSPHRASE:
   6431 		str_clear_free(eap->private_key_passwd);
   6432 		eap->private_key_passwd = os_strdup(value);
   6433 		eap->pending_req_passphrase = 0;
   6434 		if (ssid == wpa_s->current_ssid)
   6435 			wpa_s->reassociate = 1;
   6436 		break;
   6437 	case WPA_CTRL_REQ_SIM:
   6438 		str_clear_free(eap->external_sim_resp);
   6439 		eap->external_sim_resp = os_strdup(value);
   6440 		eap->pending_req_sim = 0;
   6441 		break;
   6442 	case WPA_CTRL_REQ_PSK_PASSPHRASE:
   6443 		if (wpa_config_set(ssid, "psk", value, 0) < 0)
   6444 			return -1;
   6445 		ssid->mem_only_psk = 1;
   6446 		if (ssid->passphrase)
   6447 			wpa_config_update_psk(ssid);
   6448 		if (wpa_s->wpa_state == WPA_SCANNING && !wpa_s->scanning)
   6449 			wpa_supplicant_req_scan(wpa_s, 0, 0);
   6450 		break;
   6451 	case WPA_CTRL_REQ_EXT_CERT_CHECK:
   6452 		if (eap->pending_ext_cert_check != PENDING_CHECK)
   6453 			return -1;
   6454 		if (os_strcmp(value, "good") == 0)
   6455 			eap->pending_ext_cert_check = EXT_CERT_CHECK_GOOD;
   6456 		else if (os_strcmp(value, "bad") == 0)
   6457 			eap->pending_ext_cert_check = EXT_CERT_CHECK_BAD;
   6458 		else
   6459 			return -1;
   6460 		break;
   6461 	default:
   6462 		wpa_printf(MSG_DEBUG, "CTRL_IFACE: Unknown type %d", rtype);
   6463 		return -1;
   6464 	}
   6465 
   6466 	return 0;
   6467 #else /* IEEE8021X_EAPOL */
   6468 	wpa_printf(MSG_DEBUG, "CTRL_IFACE: IEEE 802.1X not included");
   6469 	return -1;
   6470 #endif /* IEEE8021X_EAPOL */
   6471 }
   6472 #endif /* CONFIG_CTRL_IFACE || CONFIG_CTRL_IFACE_DBUS_NEW || CONFIG_CTRL_IFACE_HIDL */
   6473 
   6474 
   6475 int wpas_network_disabled(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
   6476 {
   6477 	int i;
   6478 	unsigned int drv_enc;
   6479 
   6480 	if (wpa_s->p2p_mgmt)
   6481 		return 1; /* no normal network profiles on p2p_mgmt interface */
   6482 
   6483 	if (ssid == NULL)
   6484 		return 1;
   6485 
   6486 	if (ssid->disabled)
   6487 		return 1;
   6488 
   6489 	if (wpa_s->drv_capa_known)
   6490 		drv_enc = wpa_s->drv_enc;
   6491 	else
   6492 		drv_enc = (unsigned int) -1;
   6493 
   6494 	for (i = 0; i < NUM_WEP_KEYS; i++) {
   6495 		size_t len = ssid->wep_key_len[i];
   6496 		if (len == 0)
   6497 			continue;
   6498 		if (len == 5 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP40))
   6499 			continue;
   6500 		if (len == 13 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP104))
   6501 			continue;
   6502 		if (len == 16 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP128))
   6503 			continue;
   6504 		return 1; /* invalid WEP key */
   6505 	}
   6506 
   6507 	if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt) && !ssid->psk_set &&
   6508 	    (!ssid->passphrase || ssid->ssid_len != 0) && !ssid->ext_psk &&
   6509 	    !(wpa_key_mgmt_sae(ssid->key_mgmt) && ssid->sae_password) &&
   6510 	    !ssid->mem_only_psk)
   6511 		return 1;
   6512 
   6513 	return 0;
   6514 }
   6515 
   6516 
   6517 int wpas_get_ssid_pmf(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
   6518 {
   6519 #ifdef CONFIG_IEEE80211W
   6520 	if (ssid == NULL || ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT) {
   6521 		if (wpa_s->conf->pmf == MGMT_FRAME_PROTECTION_OPTIONAL &&
   6522 		    !(wpa_s->drv_enc & WPA_DRIVER_CAPA_ENC_BIP)) {
   6523 			/*
   6524 			 * Driver does not support BIP -- ignore pmf=1 default
   6525 			 * since the connection with PMF would fail and the
   6526 			 * configuration does not require PMF to be enabled.
   6527 			 */
   6528 			return NO_MGMT_FRAME_PROTECTION;
   6529 		}
   6530 
   6531 		if (ssid &&
   6532 		    (ssid->key_mgmt &
   6533 		     ~(WPA_KEY_MGMT_NONE | WPA_KEY_MGMT_WPS |
   6534 		       WPA_KEY_MGMT_IEEE8021X_NO_WPA)) == 0) {
   6535 			/*
   6536 			 * Do not use the default PMF value for non-RSN networks
   6537 			 * since PMF is available only with RSN and pmf=2
   6538 			 * configuration would otherwise prevent connections to
   6539 			 * all open networks.
   6540 			 */
   6541 			return NO_MGMT_FRAME_PROTECTION;
   6542 		}
   6543 
   6544 		return wpa_s->conf->pmf;
   6545 	}
   6546 
   6547 	return ssid->ieee80211w;
   6548 #else /* CONFIG_IEEE80211W */
   6549 	return NO_MGMT_FRAME_PROTECTION;
   6550 #endif /* CONFIG_IEEE80211W */
   6551 }
   6552 
   6553 
   6554 int wpas_is_p2p_prioritized(struct wpa_supplicant *wpa_s)
   6555 {
   6556 	if (wpa_s->global->conc_pref == WPA_CONC_PREF_P2P)
   6557 		return 1;
   6558 	if (wpa_s->global->conc_pref == WPA_CONC_PREF_STA)
   6559 		return 0;
   6560 	return -1;
   6561 }
   6562 
   6563 
   6564 void wpas_auth_failed(struct wpa_supplicant *wpa_s, char *reason)
   6565 {
   6566 	struct wpa_ssid *ssid = wpa_s->current_ssid;
   6567 	int dur;
   6568 	struct os_reltime now;
   6569 
   6570 	if (ssid == NULL) {
   6571 		wpa_printf(MSG_DEBUG, "Authentication failure but no known "
   6572 			   "SSID block");
   6573 		return;
   6574 	}
   6575 
   6576 	if (ssid->key_mgmt == WPA_KEY_MGMT_WPS)
   6577 		return;
   6578 
   6579 	ssid->auth_failures++;
   6580 
   6581 #ifdef CONFIG_P2P
   6582 	if (ssid->p2p_group &&
   6583 	    (wpa_s->p2p_in_provisioning || wpa_s->show_group_started)) {
   6584 		/*
   6585 		 * Skip the wait time since there is a short timeout on the
   6586 		 * connection to a P2P group.
   6587 		 */
   6588 		return;
   6589 	}
   6590 #endif /* CONFIG_P2P */
   6591 
   6592 	if (ssid->auth_failures > 50)
   6593 		dur = 300;
   6594 	else if (ssid->auth_failures > 10)
   6595 		dur = 120;
   6596 	else if (ssid->auth_failures > 5)
   6597 		dur = 90;
   6598 	else if (ssid->auth_failures > 3)
   6599 		dur = 60;
   6600 	else if (ssid->auth_failures > 2)
   6601 		dur = 30;
   6602 	else if (ssid->auth_failures > 1)
   6603 		dur = 20;
   6604 	else
   6605 		dur = 10;
   6606 
   6607 	if (ssid->auth_failures > 1 &&
   6608 	    wpa_key_mgmt_wpa_ieee8021x(ssid->key_mgmt))
   6609 		dur += os_random() % (ssid->auth_failures * 10);
   6610 
   6611 	os_get_reltime(&now);
   6612 	if (now.sec + dur <= ssid->disabled_until.sec)
   6613 		return;
   6614 
   6615 	ssid->disabled_until.sec = now.sec + dur;
   6616 
   6617 	wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TEMP_DISABLED
   6618 		"id=%d ssid=\"%s\" auth_failures=%u duration=%d reason=%s",
   6619 		ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
   6620 		ssid->auth_failures, dur, reason);
   6621 }
   6622 
   6623 
   6624 void wpas_clear_temp_disabled(struct wpa_supplicant *wpa_s,
   6625 			      struct wpa_ssid *ssid, int clear_failures)
   6626 {
   6627 	if (ssid == NULL)
   6628 		return;
   6629 
   6630 	if (ssid->disabled_until.sec) {
   6631 		wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_REENABLED
   6632 			"id=%d ssid=\"%s\"",
   6633 			ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
   6634 	}
   6635 	ssid->disabled_until.sec = 0;
   6636 	ssid->disabled_until.usec = 0;
   6637 	if (clear_failures)
   6638 		ssid->auth_failures = 0;
   6639 }
   6640 
   6641 
   6642 int disallowed_bssid(struct wpa_supplicant *wpa_s, const u8 *bssid)
   6643 {
   6644 	size_t i;
   6645 
   6646 	if (wpa_s->disallow_aps_bssid == NULL)
   6647 		return 0;
   6648 
   6649 	for (i = 0; i < wpa_s->disallow_aps_bssid_count; i++) {
   6650 		if (os_memcmp(wpa_s->disallow_aps_bssid + i * ETH_ALEN,
   6651 			      bssid, ETH_ALEN) == 0)
   6652 			return 1;
   6653 	}
   6654 
   6655 	return 0;
   6656 }
   6657 
   6658 
   6659 int disallowed_ssid(struct wpa_supplicant *wpa_s, const u8 *ssid,
   6660 		    size_t ssid_len)
   6661 {
   6662 	size_t i;
   6663 
   6664 	if (wpa_s->disallow_aps_ssid == NULL || ssid == NULL)
   6665 		return 0;
   6666 
   6667 	for (i = 0; i < wpa_s->disallow_aps_ssid_count; i++) {
   6668 		struct wpa_ssid_value *s = &wpa_s->disallow_aps_ssid[i];
   6669 		if (ssid_len == s->ssid_len &&
   6670 		    os_memcmp(ssid, s->ssid, ssid_len) == 0)
   6671 			return 1;
   6672 	}
   6673 
   6674 	return 0;
   6675 }
   6676 
   6677 
   6678 /**
   6679  * wpas_request_connection - Request a new connection
   6680  * @wpa_s: Pointer to the network interface
   6681  *
   6682  * This function is used to request a new connection to be found. It will mark
   6683  * the interface to allow reassociation and request a new scan to find a
   6684  * suitable network to connect to.
   6685  */
   6686 void wpas_request_connection(struct wpa_supplicant *wpa_s)
   6687 {
   6688 	wpa_s->normal_scans = 0;
   6689 	wpa_s->scan_req = NORMAL_SCAN_REQ;
   6690 	wpa_supplicant_reinit_autoscan(wpa_s);
   6691 	wpa_s->extra_blacklist_count = 0;
   6692 	wpa_s->disconnected = 0;
   6693 	wpa_s->reassociate = 1;
   6694 
   6695 	if (wpa_supplicant_fast_associate(wpa_s) != 1)
   6696 		wpa_supplicant_req_scan(wpa_s, 0, 0);
   6697 	else
   6698 		wpa_s->reattach = 0;
   6699 }
   6700 
   6701 
   6702 /**
   6703  * wpas_request_disconnection - Request disconnection
   6704  * @wpa_s: Pointer to the network interface
   6705  *
   6706  * This function is used to request disconnection from the currently connected
   6707  * network. This will stop any ongoing scans and initiate deauthentication.
   6708  */
   6709 void wpas_request_disconnection(struct wpa_supplicant *wpa_s)
   6710 {
   6711 #ifdef CONFIG_SME
   6712 	wpa_s->sme.prev_bssid_set = 0;
   6713 #endif /* CONFIG_SME */
   6714 	wpa_s->reassociate = 0;
   6715 	wpa_s->disconnected = 1;
   6716 	wpa_supplicant_cancel_sched_scan(wpa_s);
   6717 	wpa_supplicant_cancel_scan(wpa_s);
   6718 	wpa_supplicant_deauthenticate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
   6719 	eloop_cancel_timeout(wpas_network_reenabled, wpa_s, NULL);
   6720 }
   6721 
   6722 
   6723 void dump_freq_data(struct wpa_supplicant *wpa_s, const char *title,
   6724 		    struct wpa_used_freq_data *freqs_data,
   6725 		    unsigned int len)
   6726 {
   6727 	unsigned int i;
   6728 
   6729 	wpa_dbg(wpa_s, MSG_DEBUG, "Shared frequencies (len=%u): %s",
   6730 		len, title);
   6731 	for (i = 0; i < len; i++) {
   6732 		struct wpa_used_freq_data *cur = &freqs_data[i];
   6733 		wpa_dbg(wpa_s, MSG_DEBUG, "freq[%u]: %d, flags=0x%X",
   6734 			i, cur->freq, cur->flags);
   6735 	}
   6736 }
   6737 
   6738 
   6739 /*
   6740  * Find the operating frequencies of any of the virtual interfaces that
   6741  * are using the same radio as the current interface, and in addition, get
   6742  * information about the interface types that are using the frequency.
   6743  */
   6744 int get_shared_radio_freqs_data(struct wpa_supplicant *wpa_s,
   6745 				struct wpa_used_freq_data *freqs_data,
   6746 				unsigned int len)
   6747 {
   6748 	struct wpa_supplicant *ifs;
   6749 	u8 bssid[ETH_ALEN];
   6750 	int freq;
   6751 	unsigned int idx = 0, i;
   6752 
   6753 	wpa_dbg(wpa_s, MSG_DEBUG,
   6754 		"Determining shared radio frequencies (max len %u)", len);
   6755 	os_memset(freqs_data, 0, sizeof(struct wpa_used_freq_data) * len);
   6756 
   6757 	dl_list_for_each(ifs, &wpa_s->radio->ifaces, struct wpa_supplicant,
   6758 			 radio_list) {
   6759 		if (idx == len)
   6760 			break;
   6761 
   6762 		if (ifs->current_ssid == NULL || ifs->assoc_freq == 0)
   6763 			continue;
   6764 
   6765 		if (ifs->current_ssid->mode == WPAS_MODE_AP ||
   6766 		    ifs->current_ssid->mode == WPAS_MODE_P2P_GO ||
   6767 		    ifs->current_ssid->mode == WPAS_MODE_MESH)
   6768 			freq = ifs->current_ssid->frequency;
   6769 		else if (wpa_drv_get_bssid(ifs, bssid) == 0)
   6770 			freq = ifs->assoc_freq;
   6771 		else
   6772 			continue;
   6773 
   6774 		/* Hold only distinct freqs */
   6775 		for (i = 0; i < idx; i++)
   6776 			if (freqs_data[i].freq == freq)
   6777 				break;
   6778 
   6779 		if (i == idx)
   6780 			freqs_data[idx++].freq = freq;
   6781 
   6782 		if (ifs->current_ssid->mode == WPAS_MODE_INFRA) {
   6783 			freqs_data[i].flags |= ifs->current_ssid->p2p_group ?
   6784 				WPA_FREQ_USED_BY_P2P_CLIENT :
   6785 				WPA_FREQ_USED_BY_INFRA_STATION;
   6786 		}
   6787 	}
   6788 
   6789 	dump_freq_data(wpa_s, "completed iteration", freqs_data, idx);
   6790 	return idx;
   6791 }
   6792 
   6793 
   6794 /*
   6795  * Find the operating frequencies of any of the virtual interfaces that
   6796  * are using the same radio as the current interface.
   6797  */
   6798 int get_shared_radio_freqs(struct wpa_supplicant *wpa_s,
   6799 			   int *freq_array, unsigned int len)
   6800 {
   6801 	struct wpa_used_freq_data *freqs_data;
   6802 	int num, i;
   6803 
   6804 	os_memset(freq_array, 0, sizeof(int) * len);
   6805 
   6806 	freqs_data = os_calloc(len, sizeof(struct wpa_used_freq_data));
   6807 	if (!freqs_data)
   6808 		return -1;
   6809 
   6810 	num = get_shared_radio_freqs_data(wpa_s, freqs_data, len);
   6811 	for (i = 0; i < num; i++)
   6812 		freq_array[i] = freqs_data[i].freq;
   6813 
   6814 	os_free(freqs_data);
   6815 
   6816 	return num;
   6817 }
   6818 
   6819 
   6820 struct wpa_supplicant *
   6821 wpas_vendor_elem(struct wpa_supplicant *wpa_s, enum wpa_vendor_elem_frame frame)
   6822 {
   6823 	switch (frame) {
   6824 #ifdef CONFIG_P2P
   6825 	case VENDOR_ELEM_PROBE_REQ_P2P:
   6826 	case VENDOR_ELEM_PROBE_RESP_P2P:
   6827 	case VENDOR_ELEM_PROBE_RESP_P2P_GO:
   6828 	case VENDOR_ELEM_BEACON_P2P_GO:
   6829 	case VENDOR_ELEM_P2P_PD_REQ:
   6830 	case VENDOR_ELEM_P2P_PD_RESP:
   6831 	case VENDOR_ELEM_P2P_GO_NEG_REQ:
   6832 	case VENDOR_ELEM_P2P_GO_NEG_RESP:
   6833 	case VENDOR_ELEM_P2P_GO_NEG_CONF:
   6834 	case VENDOR_ELEM_P2P_INV_REQ:
   6835 	case VENDOR_ELEM_P2P_INV_RESP:
   6836 	case VENDOR_ELEM_P2P_ASSOC_REQ:
   6837 	case VENDOR_ELEM_P2P_ASSOC_RESP:
   6838 		return wpa_s->p2pdev;
   6839 #endif /* CONFIG_P2P */
   6840 	default:
   6841 		return wpa_s;
   6842 	}
   6843 }
   6844 
   6845 
   6846 void wpas_vendor_elem_update(struct wpa_supplicant *wpa_s)
   6847 {
   6848 	unsigned int i;
   6849 	char buf[30];
   6850 
   6851 	wpa_printf(MSG_DEBUG, "Update vendor elements");
   6852 
   6853 	for (i = 0; i < NUM_VENDOR_ELEM_FRAMES; i++) {
   6854 		if (wpa_s->vendor_elem[i]) {
   6855 			int res;
   6856 
   6857 			res = os_snprintf(buf, sizeof(buf), "frame[%u]", i);
   6858 			if (!os_snprintf_error(sizeof(buf), res)) {
   6859 				wpa_hexdump_buf(MSG_DEBUG, buf,
   6860 						wpa_s->vendor_elem[i]);
   6861 			}
   6862 		}
   6863 	}
   6864 
   6865 #ifdef CONFIG_P2P
   6866 	if (wpa_s->parent == wpa_s &&
   6867 	    wpa_s->global->p2p &&
   6868 	    !wpa_s->global->p2p_disabled)
   6869 		p2p_set_vendor_elems(wpa_s->global->p2p, wpa_s->vendor_elem);
   6870 #endif /* CONFIG_P2P */
   6871 }
   6872 
   6873 
   6874 int wpas_vendor_elem_remove(struct wpa_supplicant *wpa_s, int frame,
   6875 			    const u8 *elem, size_t len)
   6876 {
   6877 	u8 *ie, *end;
   6878 
   6879 	ie = wpabuf_mhead_u8(wpa_s->vendor_elem[frame]);
   6880 	end = ie + wpabuf_len(wpa_s->vendor_elem[frame]);
   6881 
   6882 	for (; ie + 1 < end; ie += 2 + ie[1]) {
   6883 		if (ie + len > end)
   6884 			break;
   6885 		if (os_memcmp(ie, elem, len) != 0)
   6886 			continue;
   6887 
   6888 		if (wpabuf_len(wpa_s->vendor_elem[frame]) == len) {
   6889 			wpabuf_free(wpa_s->vendor_elem[frame]);
   6890 			wpa_s->vendor_elem[frame] = NULL;
   6891 		} else {
   6892 			os_memmove(ie, ie + len, end - (ie + len));
   6893 			wpa_s->vendor_elem[frame]->used -= len;
   6894 		}
   6895 		wpas_vendor_elem_update(wpa_s);
   6896 		return 0;
   6897 	}
   6898 
   6899 	return -1;
   6900 }
   6901 
   6902 
   6903 struct hostapd_hw_modes * get_mode(struct hostapd_hw_modes *modes,
   6904 				   u16 num_modes, enum hostapd_hw_mode mode)
   6905 {
   6906 	u16 i;
   6907 
   6908 	for (i = 0; i < num_modes; i++) {
   6909 		if (modes[i].mode == mode)
   6910 			return &modes[i];
   6911 	}
   6912 
   6913 	return NULL;
   6914 }
   6915 
   6916 
   6917 static struct
   6918 wpa_bss_tmp_disallowed * wpas_get_disallowed_bss(struct wpa_supplicant *wpa_s,
   6919 						 const u8 *bssid)
   6920 {
   6921 	struct wpa_bss_tmp_disallowed *bss;
   6922 
   6923 	dl_list_for_each(bss, &wpa_s->bss_tmp_disallowed,
   6924 			 struct wpa_bss_tmp_disallowed, list) {
   6925 		if (os_memcmp(bssid, bss->bssid, ETH_ALEN) == 0)
   6926 			return bss;
   6927 	}
   6928 
   6929 	return NULL;
   6930 }
   6931 
   6932 
   6933 static int wpa_set_driver_tmp_disallow_list(struct wpa_supplicant *wpa_s)
   6934 {
   6935 	struct wpa_bss_tmp_disallowed *tmp;
   6936 	unsigned int num_bssid = 0;
   6937 	u8 *bssids;
   6938 	int ret;
   6939 
   6940 	bssids = os_malloc(dl_list_len(&wpa_s->bss_tmp_disallowed) * ETH_ALEN);
   6941 	if (!bssids)
   6942 		return -1;
   6943 	dl_list_for_each(tmp, &wpa_s->bss_tmp_disallowed,
   6944 			 struct wpa_bss_tmp_disallowed, list) {
   6945 		os_memcpy(&bssids[num_bssid * ETH_ALEN], tmp->bssid,
   6946 			  ETH_ALEN);
   6947 		num_bssid++;
   6948 	}
   6949 	ret = wpa_drv_set_bssid_blacklist(wpa_s, num_bssid, bssids);
   6950 	os_free(bssids);
   6951 	return ret;
   6952 }
   6953 
   6954 
   6955 static void wpa_bss_tmp_disallow_timeout(void *eloop_ctx, void *timeout_ctx)
   6956 {
   6957 	struct wpa_supplicant *wpa_s = eloop_ctx;
   6958 	struct wpa_bss_tmp_disallowed *tmp, *bss = timeout_ctx;
   6959 
   6960 	/* Make sure the bss is not already freed */
   6961 	dl_list_for_each(tmp, &wpa_s->bss_tmp_disallowed,
   6962 			 struct wpa_bss_tmp_disallowed, list) {
   6963 		if (bss == tmp) {
   6964 			dl_list_del(&tmp->list);
   6965 			os_free(tmp);
   6966 			wpa_set_driver_tmp_disallow_list(wpa_s);
   6967 			break;
   6968 		}
   6969 	}
   6970 }
   6971 
   6972 
   6973 void wpa_bss_tmp_disallow(struct wpa_supplicant *wpa_s, const u8 *bssid,
   6974 			  unsigned int sec)
   6975 {
   6976 	struct wpa_bss_tmp_disallowed *bss;
   6977 
   6978 	bss = wpas_get_disallowed_bss(wpa_s, bssid);
   6979 	if (bss) {
   6980 		eloop_cancel_timeout(wpa_bss_tmp_disallow_timeout, wpa_s, bss);
   6981 		eloop_register_timeout(sec, 0, wpa_bss_tmp_disallow_timeout,
   6982 				       wpa_s, bss);
   6983 		return;
   6984 	}
   6985 
   6986 	bss = os_malloc(sizeof(*bss));
   6987 	if (!bss) {
   6988 		wpa_printf(MSG_DEBUG,
   6989 			   "Failed to allocate memory for temp disallow BSS");
   6990 		return;
   6991 	}
   6992 
   6993 	os_memcpy(bss->bssid, bssid, ETH_ALEN);
   6994 	dl_list_add(&wpa_s->bss_tmp_disallowed, &bss->list);
   6995 	wpa_set_driver_tmp_disallow_list(wpa_s);
   6996 	eloop_register_timeout(sec, 0, wpa_bss_tmp_disallow_timeout,
   6997 			       wpa_s, bss);
   6998 }
   6999 
   7000 
   7001 int wpa_is_bss_tmp_disallowed(struct wpa_supplicant *wpa_s, const u8 *bssid)
   7002 {
   7003 	struct wpa_bss_tmp_disallowed *bss = NULL, *tmp, *prev;
   7004 
   7005 	dl_list_for_each_safe(tmp, prev, &wpa_s->bss_tmp_disallowed,
   7006 			 struct wpa_bss_tmp_disallowed, list) {
   7007 		if (os_memcmp(bssid, tmp->bssid, ETH_ALEN) == 0) {
   7008 			bss = tmp;
   7009 			break;
   7010 		}
   7011 	}
   7012 	if (!bss)
   7013 		return 0;
   7014 
   7015 	return 1;
   7016 }
   7017