Home | History | Annotate | Download | only in wpa_supplicant
      1 /*
      2  * WPA Supplicant
      3  * Copyright (c) 2003-2014, 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 
     15 #include "common.h"
     16 #include "crypto/random.h"
     17 #include "crypto/sha1.h"
     18 #include "eapol_supp/eapol_supp_sm.h"
     19 #include "eap_peer/eap.h"
     20 #include "eap_peer/eap_proxy.h"
     21 #include "eap_server/eap_methods.h"
     22 #include "rsn_supp/wpa.h"
     23 #include "eloop.h"
     24 #include "config.h"
     25 #include "utils/ext_password.h"
     26 #include "l2_packet/l2_packet.h"
     27 #include "wpa_supplicant_i.h"
     28 #include "driver_i.h"
     29 #include "ctrl_iface.h"
     30 #include "pcsc_funcs.h"
     31 #include "common/version.h"
     32 #include "rsn_supp/preauth.h"
     33 #include "rsn_supp/pmksa_cache.h"
     34 #include "common/wpa_ctrl.h"
     35 #include "common/ieee802_11_defs.h"
     36 #include "p2p/p2p.h"
     37 #include "blacklist.h"
     38 #include "wpas_glue.h"
     39 #include "wps_supplicant.h"
     40 #include "ibss_rsn.h"
     41 #include "sme.h"
     42 #include "gas_query.h"
     43 #include "ap.h"
     44 #include "p2p_supplicant.h"
     45 #include "wifi_display.h"
     46 #include "notify.h"
     47 #include "bgscan.h"
     48 #include "autoscan.h"
     49 #include "bss.h"
     50 #include "scan.h"
     51 #include "offchannel.h"
     52 #include "hs20_supplicant.h"
     53 #include "wnm_sta.h"
     54 #include "wpas_kay.h"
     55 
     56 const char *wpa_supplicant_version =
     57 "wpa_supplicant v" VERSION_STR "\n"
     58 "Copyright (c) 2003-2014, Jouni Malinen <j (at) w1.fi> and contributors";
     59 
     60 const char *wpa_supplicant_license =
     61 "This software may be distributed under the terms of the BSD license.\n"
     62 "See README for more details.\n"
     63 #ifdef EAP_TLS_OPENSSL
     64 "\nThis product includes software developed by the OpenSSL Project\n"
     65 "for use in the OpenSSL Toolkit (http://www.openssl.org/)\n"
     66 #endif /* EAP_TLS_OPENSSL */
     67 ;
     68 
     69 #ifndef CONFIG_NO_STDOUT_DEBUG
     70 /* Long text divided into parts in order to fit in C89 strings size limits. */
     71 const char *wpa_supplicant_full_license1 =
     72 "";
     73 const char *wpa_supplicant_full_license2 =
     74 "This software may be distributed under the terms of the BSD license.\n"
     75 "\n"
     76 "Redistribution and use in source and binary forms, with or without\n"
     77 "modification, are permitted provided that the following conditions are\n"
     78 "met:\n"
     79 "\n";
     80 const char *wpa_supplicant_full_license3 =
     81 "1. Redistributions of source code must retain the above copyright\n"
     82 "   notice, this list of conditions and the following disclaimer.\n"
     83 "\n"
     84 "2. Redistributions in binary form must reproduce the above copyright\n"
     85 "   notice, this list of conditions and the following disclaimer in the\n"
     86 "   documentation and/or other materials provided with the distribution.\n"
     87 "\n";
     88 const char *wpa_supplicant_full_license4 =
     89 "3. Neither the name(s) of the above-listed copyright holder(s) nor the\n"
     90 "   names of its contributors may be used to endorse or promote products\n"
     91 "   derived from this software without specific prior written permission.\n"
     92 "\n"
     93 "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
     94 "\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
     95 "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
     96 "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n";
     97 const char *wpa_supplicant_full_license5 =
     98 "OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
     99 "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
    100 "LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
    101 "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
    102 "THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
    103 "(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
    104 "OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
    105 "\n";
    106 #endif /* CONFIG_NO_STDOUT_DEBUG */
    107 
    108 struct wowlan_triggers *wpa_get_wowlan_triggers(const char *wowlan_triggers,
    109 						struct wpa_driver_capa *capa);
    110 
    111 /* Configure default/group WEP keys for static WEP */
    112 int wpa_set_wep_keys(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
    113 {
    114 	int i, set = 0;
    115 
    116 	for (i = 0; i < NUM_WEP_KEYS; i++) {
    117 		if (ssid->wep_key_len[i] == 0)
    118 			continue;
    119 
    120 		set = 1;
    121 		wpa_drv_set_key(wpa_s, WPA_ALG_WEP, NULL,
    122 				i, i == ssid->wep_tx_keyidx, NULL, 0,
    123 				ssid->wep_key[i], ssid->wep_key_len[i]);
    124 	}
    125 
    126 	return set;
    127 }
    128 
    129 
    130 int wpa_supplicant_set_wpa_none_key(struct wpa_supplicant *wpa_s,
    131 				    struct wpa_ssid *ssid)
    132 {
    133 	u8 key[32];
    134 	size_t keylen;
    135 	enum wpa_alg alg;
    136 	u8 seq[6] = { 0 };
    137 
    138 	/* IBSS/WPA-None uses only one key (Group) for both receiving and
    139 	 * sending unicast and multicast packets. */
    140 
    141 	if (ssid->mode != WPAS_MODE_IBSS) {
    142 		wpa_msg(wpa_s, MSG_INFO, "WPA: Invalid mode %d (not "
    143 			"IBSS/ad-hoc) for WPA-None", ssid->mode);
    144 		return -1;
    145 	}
    146 
    147 	if (!ssid->psk_set) {
    148 		wpa_msg(wpa_s, MSG_INFO, "WPA: No PSK configured for "
    149 			"WPA-None");
    150 		return -1;
    151 	}
    152 
    153 	switch (wpa_s->group_cipher) {
    154 	case WPA_CIPHER_CCMP:
    155 		os_memcpy(key, ssid->psk, 16);
    156 		keylen = 16;
    157 		alg = WPA_ALG_CCMP;
    158 		break;
    159 	case WPA_CIPHER_GCMP:
    160 		os_memcpy(key, ssid->psk, 16);
    161 		keylen = 16;
    162 		alg = WPA_ALG_GCMP;
    163 		break;
    164 	case WPA_CIPHER_TKIP:
    165 		/* WPA-None uses the same Michael MIC key for both TX and RX */
    166 		os_memcpy(key, ssid->psk, 16 + 8);
    167 		os_memcpy(key + 16 + 8, ssid->psk + 16, 8);
    168 		keylen = 32;
    169 		alg = WPA_ALG_TKIP;
    170 		break;
    171 	default:
    172 		wpa_msg(wpa_s, MSG_INFO, "WPA: Invalid group cipher %d for "
    173 			"WPA-None", wpa_s->group_cipher);
    174 		return -1;
    175 	}
    176 
    177 	/* TODO: should actually remember the previously used seq#, both for TX
    178 	 * and RX from each STA.. */
    179 
    180 	return wpa_drv_set_key(wpa_s, alg, NULL, 0, 1, seq, 6, key, keylen);
    181 }
    182 
    183 
    184 static void wpa_supplicant_timeout(void *eloop_ctx, void *timeout_ctx)
    185 {
    186 	struct wpa_supplicant *wpa_s = eloop_ctx;
    187 	const u8 *bssid = wpa_s->bssid;
    188 	if (is_zero_ether_addr(bssid))
    189 		bssid = wpa_s->pending_bssid;
    190 	wpa_msg(wpa_s, MSG_INFO, "Authentication with " MACSTR " timed out.",
    191 		MAC2STR(bssid));
    192 	wpa_blacklist_add(wpa_s, bssid);
    193 	wpa_sm_notify_disassoc(wpa_s->wpa);
    194 	wpa_supplicant_deauthenticate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
    195 	wpa_s->reassociate = 1;
    196 
    197 	/*
    198 	 * If we timed out, the AP or the local radio may be busy.
    199 	 * So, wait a second until scanning again.
    200 	 */
    201 	wpa_supplicant_req_scan(wpa_s, 1, 0);
    202 }
    203 
    204 
    205 /**
    206  * wpa_supplicant_req_auth_timeout - Schedule a timeout for authentication
    207  * @wpa_s: Pointer to wpa_supplicant data
    208  * @sec: Number of seconds after which to time out authentication
    209  * @usec: Number of microseconds after which to time out authentication
    210  *
    211  * This function is used to schedule a timeout for the current authentication
    212  * attempt.
    213  */
    214 void wpa_supplicant_req_auth_timeout(struct wpa_supplicant *wpa_s,
    215 				     int sec, int usec)
    216 {
    217 	if (wpa_s->conf->ap_scan == 0 &&
    218 	    (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED))
    219 		return;
    220 
    221 	wpa_dbg(wpa_s, MSG_DEBUG, "Setting authentication timeout: %d sec "
    222 		"%d usec", sec, usec);
    223 	eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
    224 	eloop_register_timeout(sec, usec, wpa_supplicant_timeout, wpa_s, NULL);
    225 }
    226 
    227 
    228 /**
    229  * wpa_supplicant_cancel_auth_timeout - Cancel authentication timeout
    230  * @wpa_s: Pointer to wpa_supplicant data
    231  *
    232  * This function is used to cancel authentication timeout scheduled with
    233  * wpa_supplicant_req_auth_timeout() and it is called when authentication has
    234  * been completed.
    235  */
    236 void wpa_supplicant_cancel_auth_timeout(struct wpa_supplicant *wpa_s)
    237 {
    238 	wpa_dbg(wpa_s, MSG_DEBUG, "Cancelling authentication timeout");
    239 	eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
    240 	wpa_blacklist_del(wpa_s, wpa_s->bssid);
    241 }
    242 
    243 
    244 /**
    245  * wpa_supplicant_initiate_eapol - Configure EAPOL state machine
    246  * @wpa_s: Pointer to wpa_supplicant data
    247  *
    248  * This function is used to configure EAPOL state machine based on the selected
    249  * authentication mode.
    250  */
    251 void wpa_supplicant_initiate_eapol(struct wpa_supplicant *wpa_s)
    252 {
    253 #ifdef IEEE8021X_EAPOL
    254 	struct eapol_config eapol_conf;
    255 	struct wpa_ssid *ssid = wpa_s->current_ssid;
    256 
    257 #ifdef CONFIG_IBSS_RSN
    258 	if (ssid->mode == WPAS_MODE_IBSS &&
    259 	    wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
    260 	    wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
    261 		/*
    262 		 * RSN IBSS authentication is per-STA and we can disable the
    263 		 * per-BSSID EAPOL authentication.
    264 		 */
    265 		eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
    266 		eapol_sm_notify_eap_success(wpa_s->eapol, TRUE);
    267 		eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
    268 		return;
    269 	}
    270 #endif /* CONFIG_IBSS_RSN */
    271 
    272 	eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
    273 	eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
    274 
    275 	if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
    276 	    wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE)
    277 		eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
    278 	else
    279 		eapol_sm_notify_portControl(wpa_s->eapol, Auto);
    280 
    281 	os_memset(&eapol_conf, 0, sizeof(eapol_conf));
    282 	if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
    283 		eapol_conf.accept_802_1x_keys = 1;
    284 		eapol_conf.required_keys = 0;
    285 		if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_UNICAST) {
    286 			eapol_conf.required_keys |= EAPOL_REQUIRE_KEY_UNICAST;
    287 		}
    288 		if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_BROADCAST) {
    289 			eapol_conf.required_keys |=
    290 				EAPOL_REQUIRE_KEY_BROADCAST;
    291 		}
    292 
    293 		if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED)
    294 			eapol_conf.required_keys = 0;
    295 	}
    296 	eapol_conf.fast_reauth = wpa_s->conf->fast_reauth;
    297 	eapol_conf.workaround = ssid->eap_workaround;
    298 	eapol_conf.eap_disabled =
    299 		!wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) &&
    300 		wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA &&
    301 		wpa_s->key_mgmt != WPA_KEY_MGMT_WPS;
    302 	eapol_conf.external_sim = wpa_s->conf->external_sim;
    303 	eapol_conf.wps = wpa_s->key_mgmt == WPA_KEY_MGMT_WPS;
    304 	eapol_sm_notify_config(wpa_s->eapol, &ssid->eap, &eapol_conf);
    305 #endif /* IEEE8021X_EAPOL */
    306 
    307 	ieee802_1x_alloc_kay_sm(wpa_s, ssid);
    308 }
    309 
    310 
    311 /**
    312  * wpa_supplicant_set_non_wpa_policy - Set WPA parameters to non-WPA mode
    313  * @wpa_s: Pointer to wpa_supplicant data
    314  * @ssid: Configuration data for the network
    315  *
    316  * This function is used to configure WPA state machine and related parameters
    317  * to a mode where WPA is not enabled. This is called as part of the
    318  * authentication configuration when the selected network does not use WPA.
    319  */
    320 void wpa_supplicant_set_non_wpa_policy(struct wpa_supplicant *wpa_s,
    321 				       struct wpa_ssid *ssid)
    322 {
    323 	int i;
    324 
    325 	if (ssid->key_mgmt & WPA_KEY_MGMT_WPS)
    326 		wpa_s->key_mgmt = WPA_KEY_MGMT_WPS;
    327 	else if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA)
    328 		wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_NO_WPA;
    329 	else
    330 		wpa_s->key_mgmt = WPA_KEY_MGMT_NONE;
    331 	wpa_sm_set_ap_wpa_ie(wpa_s->wpa, NULL, 0);
    332 	wpa_sm_set_ap_rsn_ie(wpa_s->wpa, NULL, 0);
    333 	wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
    334 	wpa_s->pairwise_cipher = WPA_CIPHER_NONE;
    335 	wpa_s->group_cipher = WPA_CIPHER_NONE;
    336 	wpa_s->mgmt_group_cipher = 0;
    337 
    338 	for (i = 0; i < NUM_WEP_KEYS; i++) {
    339 		if (ssid->wep_key_len[i] > 5) {
    340 			wpa_s->pairwise_cipher = WPA_CIPHER_WEP104;
    341 			wpa_s->group_cipher = WPA_CIPHER_WEP104;
    342 			break;
    343 		} else if (ssid->wep_key_len[i] > 0) {
    344 			wpa_s->pairwise_cipher = WPA_CIPHER_WEP40;
    345 			wpa_s->group_cipher = WPA_CIPHER_WEP40;
    346 			break;
    347 		}
    348 	}
    349 
    350 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED, 0);
    351 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
    352 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
    353 			 wpa_s->pairwise_cipher);
    354 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
    355 #ifdef CONFIG_IEEE80211W
    356 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
    357 			 wpa_s->mgmt_group_cipher);
    358 #endif /* CONFIG_IEEE80211W */
    359 
    360 	pmksa_cache_clear_current(wpa_s->wpa);
    361 }
    362 
    363 
    364 void free_hw_features(struct wpa_supplicant *wpa_s)
    365 {
    366 	int i;
    367 	if (wpa_s->hw.modes == NULL)
    368 		return;
    369 
    370 	for (i = 0; i < wpa_s->hw.num_modes; i++) {
    371 		os_free(wpa_s->hw.modes[i].channels);
    372 		os_free(wpa_s->hw.modes[i].rates);
    373 	}
    374 
    375 	os_free(wpa_s->hw.modes);
    376 	wpa_s->hw.modes = NULL;
    377 }
    378 
    379 
    380 static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s)
    381 {
    382 	int i;
    383 
    384 	bgscan_deinit(wpa_s);
    385 	autoscan_deinit(wpa_s);
    386 	scard_deinit(wpa_s->scard);
    387 	wpa_s->scard = NULL;
    388 	wpa_sm_set_scard_ctx(wpa_s->wpa, NULL);
    389 	eapol_sm_register_scard_ctx(wpa_s->eapol, NULL);
    390 	l2_packet_deinit(wpa_s->l2);
    391 	wpa_s->l2 = NULL;
    392 	if (wpa_s->l2_br) {
    393 		l2_packet_deinit(wpa_s->l2_br);
    394 		wpa_s->l2_br = NULL;
    395 	}
    396 
    397 	if (wpa_s->conf != NULL) {
    398 		struct wpa_ssid *ssid;
    399 		for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
    400 			wpas_notify_network_removed(wpa_s, ssid);
    401 	}
    402 
    403 	os_free(wpa_s->confname);
    404 	wpa_s->confname = NULL;
    405 
    406 	os_free(wpa_s->confanother);
    407 	wpa_s->confanother = NULL;
    408 
    409 	wpa_sm_set_eapol(wpa_s->wpa, NULL);
    410 	eapol_sm_deinit(wpa_s->eapol);
    411 	wpa_s->eapol = NULL;
    412 
    413 	rsn_preauth_deinit(wpa_s->wpa);
    414 
    415 #ifdef CONFIG_TDLS
    416 	wpa_tdls_deinit(wpa_s->wpa);
    417 #endif /* CONFIG_TDLS */
    418 
    419 	pmksa_candidate_free(wpa_s->wpa);
    420 	wpa_sm_deinit(wpa_s->wpa);
    421 	wpa_s->wpa = NULL;
    422 	wpa_blacklist_clear(wpa_s);
    423 
    424 	wpa_bss_deinit(wpa_s);
    425 
    426 	wpa_supplicant_cancel_delayed_sched_scan(wpa_s);
    427 	wpa_supplicant_cancel_scan(wpa_s);
    428 	wpa_supplicant_cancel_auth_timeout(wpa_s);
    429 	eloop_cancel_timeout(wpa_supplicant_stop_countermeasures, wpa_s, NULL);
    430 #ifdef CONFIG_DELAYED_MIC_ERROR_REPORT
    431 	eloop_cancel_timeout(wpa_supplicant_delayed_mic_error_report,
    432 			     wpa_s, NULL);
    433 #endif /* CONFIG_DELAYED_MIC_ERROR_REPORT */
    434 
    435 	wpas_wps_deinit(wpa_s);
    436 
    437 	wpabuf_free(wpa_s->pending_eapol_rx);
    438 	wpa_s->pending_eapol_rx = NULL;
    439 
    440 #ifdef CONFIG_IBSS_RSN
    441 	ibss_rsn_deinit(wpa_s->ibss_rsn);
    442 	wpa_s->ibss_rsn = NULL;
    443 #endif /* CONFIG_IBSS_RSN */
    444 
    445 	sme_deinit(wpa_s);
    446 
    447 #ifdef CONFIG_AP
    448 	wpa_supplicant_ap_deinit(wpa_s);
    449 #endif /* CONFIG_AP */
    450 
    451 	wpas_p2p_deinit(wpa_s);
    452 
    453 #ifdef CONFIG_OFFCHANNEL
    454 	offchannel_deinit(wpa_s);
    455 #endif /* CONFIG_OFFCHANNEL */
    456 
    457 	wpa_supplicant_cancel_sched_scan(wpa_s);
    458 
    459 	os_free(wpa_s->next_scan_freqs);
    460 	wpa_s->next_scan_freqs = NULL;
    461 
    462 	os_free(wpa_s->manual_scan_freqs);
    463 	wpa_s->manual_scan_freqs = NULL;
    464 
    465 	os_free(wpa_s->manual_sched_scan_freqs);
    466 	wpa_s->manual_sched_scan_freqs = NULL;
    467 
    468 	gas_query_deinit(wpa_s->gas);
    469 	wpa_s->gas = NULL;
    470 
    471 	free_hw_features(wpa_s);
    472 
    473 	ieee802_1x_dealloc_kay_sm(wpa_s);
    474 
    475 	os_free(wpa_s->bssid_filter);
    476 	wpa_s->bssid_filter = NULL;
    477 
    478 	os_free(wpa_s->disallow_aps_bssid);
    479 	wpa_s->disallow_aps_bssid = NULL;
    480 	os_free(wpa_s->disallow_aps_ssid);
    481 	wpa_s->disallow_aps_ssid = NULL;
    482 
    483 	wnm_bss_keep_alive_deinit(wpa_s);
    484 #ifdef CONFIG_WNM
    485 	wnm_deallocate_memory(wpa_s);
    486 #endif /* CONFIG_WNM */
    487 
    488 	ext_password_deinit(wpa_s->ext_pw);
    489 	wpa_s->ext_pw = NULL;
    490 
    491 	wpabuf_free(wpa_s->last_gas_resp);
    492 	wpa_s->last_gas_resp = NULL;
    493 	wpabuf_free(wpa_s->prev_gas_resp);
    494 	wpa_s->prev_gas_resp = NULL;
    495 
    496 	os_free(wpa_s->last_scan_res);
    497 	wpa_s->last_scan_res = NULL;
    498 
    499 #ifdef CONFIG_HS20
    500 	hs20_deinit(wpa_s);
    501 #endif /* CONFIG_HS20 */
    502 
    503 	for (i = 0; i < NUM_VENDOR_ELEM_FRAMES; i++) {
    504 		wpabuf_free(wpa_s->vendor_elem[i]);
    505 		wpa_s->vendor_elem[i] = NULL;
    506 	}
    507 }
    508 
    509 
    510 /**
    511  * wpa_clear_keys - Clear keys configured for the driver
    512  * @wpa_s: Pointer to wpa_supplicant data
    513  * @addr: Previously used BSSID or %NULL if not available
    514  *
    515  * This function clears the encryption keys that has been previously configured
    516  * for the driver.
    517  */
    518 void wpa_clear_keys(struct wpa_supplicant *wpa_s, const u8 *addr)
    519 {
    520 	int i, max;
    521 
    522 #ifdef CONFIG_IEEE80211W
    523 	max = 6;
    524 #else /* CONFIG_IEEE80211W */
    525 	max = 4;
    526 #endif /* CONFIG_IEEE80211W */
    527 
    528 	/* MLME-DELETEKEYS.request */
    529 	for (i = 0; i < max; i++) {
    530 		if (wpa_s->keys_cleared & BIT(i))
    531 			continue;
    532 		wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, i, 0, NULL, 0,
    533 				NULL, 0);
    534 	}
    535 	if (!(wpa_s->keys_cleared & BIT(0)) && addr &&
    536 	    !is_zero_ether_addr(addr)) {
    537 		wpa_drv_set_key(wpa_s, WPA_ALG_NONE, addr, 0, 0, NULL, 0, NULL,
    538 				0);
    539 		/* MLME-SETPROTECTION.request(None) */
    540 		wpa_drv_mlme_setprotection(
    541 			wpa_s, addr,
    542 			MLME_SETPROTECTION_PROTECT_TYPE_NONE,
    543 			MLME_SETPROTECTION_KEY_TYPE_PAIRWISE);
    544 	}
    545 	wpa_s->keys_cleared = (u32) -1;
    546 }
    547 
    548 
    549 /**
    550  * wpa_supplicant_state_txt - Get the connection state name as a text string
    551  * @state: State (wpa_state; WPA_*)
    552  * Returns: The state name as a printable text string
    553  */
    554 const char * wpa_supplicant_state_txt(enum wpa_states state)
    555 {
    556 	switch (state) {
    557 	case WPA_DISCONNECTED:
    558 		return "DISCONNECTED";
    559 	case WPA_INACTIVE:
    560 		return "INACTIVE";
    561 	case WPA_INTERFACE_DISABLED:
    562 		return "INTERFACE_DISABLED";
    563 	case WPA_SCANNING:
    564 		return "SCANNING";
    565 	case WPA_AUTHENTICATING:
    566 		return "AUTHENTICATING";
    567 	case WPA_ASSOCIATING:
    568 		return "ASSOCIATING";
    569 	case WPA_ASSOCIATED:
    570 		return "ASSOCIATED";
    571 	case WPA_4WAY_HANDSHAKE:
    572 		return "4WAY_HANDSHAKE";
    573 	case WPA_GROUP_HANDSHAKE:
    574 		return "GROUP_HANDSHAKE";
    575 	case WPA_COMPLETED:
    576 		return "COMPLETED";
    577 	default:
    578 		return "UNKNOWN";
    579 	}
    580 }
    581 
    582 
    583 #ifdef CONFIG_BGSCAN
    584 
    585 static void wpa_supplicant_start_bgscan(struct wpa_supplicant *wpa_s)
    586 {
    587 	const char *name;
    588 
    589 	if (wpa_s->current_ssid && wpa_s->current_ssid->bgscan)
    590 		name = wpa_s->current_ssid->bgscan;
    591 	else
    592 		name = wpa_s->conf->bgscan;
    593 	if (name == NULL || name[0] == '\0')
    594 		return;
    595 	if (wpas_driver_bss_selection(wpa_s))
    596 		return;
    597 	if (wpa_s->current_ssid == wpa_s->bgscan_ssid)
    598 		return;
    599 #ifdef CONFIG_P2P
    600 	if (wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE)
    601 		return;
    602 #endif /* CONFIG_P2P */
    603 
    604 	bgscan_deinit(wpa_s);
    605 	if (wpa_s->current_ssid) {
    606 		if (bgscan_init(wpa_s, wpa_s->current_ssid, name)) {
    607 			wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize "
    608 				"bgscan");
    609 			/*
    610 			 * Live without bgscan; it is only used as a roaming
    611 			 * optimization, so the initial connection is not
    612 			 * affected.
    613 			 */
    614 		} else {
    615 			struct wpa_scan_results *scan_res;
    616 			wpa_s->bgscan_ssid = wpa_s->current_ssid;
    617 			scan_res = wpa_supplicant_get_scan_results(wpa_s, NULL,
    618 								   0);
    619 			if (scan_res) {
    620 				bgscan_notify_scan(wpa_s, scan_res);
    621 				wpa_scan_results_free(scan_res);
    622 			}
    623 		}
    624 	} else
    625 		wpa_s->bgscan_ssid = NULL;
    626 }
    627 
    628 
    629 static void wpa_supplicant_stop_bgscan(struct wpa_supplicant *wpa_s)
    630 {
    631 	if (wpa_s->bgscan_ssid != NULL) {
    632 		bgscan_deinit(wpa_s);
    633 		wpa_s->bgscan_ssid = NULL;
    634 	}
    635 }
    636 
    637 #endif /* CONFIG_BGSCAN */
    638 
    639 
    640 static void wpa_supplicant_start_autoscan(struct wpa_supplicant *wpa_s)
    641 {
    642 	if (autoscan_init(wpa_s, 0))
    643 		wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize autoscan");
    644 }
    645 
    646 
    647 static void wpa_supplicant_stop_autoscan(struct wpa_supplicant *wpa_s)
    648 {
    649 	autoscan_deinit(wpa_s);
    650 }
    651 
    652 
    653 void wpa_supplicant_reinit_autoscan(struct wpa_supplicant *wpa_s)
    654 {
    655 	if (wpa_s->wpa_state == WPA_DISCONNECTED ||
    656 	    wpa_s->wpa_state == WPA_SCANNING) {
    657 		autoscan_deinit(wpa_s);
    658 		wpa_supplicant_start_autoscan(wpa_s);
    659 	}
    660 }
    661 
    662 
    663 /**
    664  * wpa_supplicant_set_state - Set current connection state
    665  * @wpa_s: Pointer to wpa_supplicant data
    666  * @state: The new connection state
    667  *
    668  * This function is called whenever the connection state changes, e.g.,
    669  * association is completed for WPA/WPA2 4-Way Handshake is started.
    670  */
    671 void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s,
    672 			      enum wpa_states state)
    673 {
    674 	enum wpa_states old_state = wpa_s->wpa_state;
    675 
    676 	wpa_dbg(wpa_s, MSG_DEBUG, "State: %s -> %s",
    677 		wpa_supplicant_state_txt(wpa_s->wpa_state),
    678 		wpa_supplicant_state_txt(state));
    679 
    680 	if (state == WPA_INTERFACE_DISABLED) {
    681 		/* Assure normal scan when interface is restored */
    682 		wpa_s->normal_scans = 0;
    683 	}
    684 
    685 	if (state == WPA_COMPLETED) {
    686 		wpas_connect_work_done(wpa_s);
    687 		/* Reinitialize normal_scan counter */
    688 		wpa_s->normal_scans = 0;
    689 	}
    690 
    691 	if (state != WPA_SCANNING)
    692 		wpa_supplicant_notify_scanning(wpa_s, 0);
    693 
    694 	if (state == WPA_COMPLETED && wpa_s->new_connection) {
    695 		struct wpa_ssid *ssid = wpa_s->current_ssid;
    696 #if defined(CONFIG_CTRL_IFACE) || !defined(CONFIG_NO_STDOUT_DEBUG)
    697 		wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_CONNECTED "- Connection to "
    698 			MACSTR " completed [id=%d id_str=%s]",
    699 			MAC2STR(wpa_s->bssid),
    700 			ssid ? ssid->id : -1,
    701 			ssid && ssid->id_str ? ssid->id_str : "");
    702 #endif /* CONFIG_CTRL_IFACE || !CONFIG_NO_STDOUT_DEBUG */
    703 		wpas_clear_temp_disabled(wpa_s, ssid, 1);
    704 		wpa_s->extra_blacklist_count = 0;
    705 		wpa_s->new_connection = 0;
    706 		wpa_drv_set_operstate(wpa_s, 1);
    707 #ifndef IEEE8021X_EAPOL
    708 		wpa_drv_set_supp_port(wpa_s, 1);
    709 #endif /* IEEE8021X_EAPOL */
    710 		wpa_s->after_wps = 0;
    711 		wpa_s->known_wps_freq = 0;
    712 		wpas_p2p_completed(wpa_s);
    713 
    714 		sme_sched_obss_scan(wpa_s, 1);
    715 	} else if (state == WPA_DISCONNECTED || state == WPA_ASSOCIATING ||
    716 		   state == WPA_ASSOCIATED) {
    717 		wpa_s->new_connection = 1;
    718 		wpa_drv_set_operstate(wpa_s, 0);
    719 #ifndef IEEE8021X_EAPOL
    720 		wpa_drv_set_supp_port(wpa_s, 0);
    721 #endif /* IEEE8021X_EAPOL */
    722 		sme_sched_obss_scan(wpa_s, 0);
    723 	}
    724 	wpa_s->wpa_state = state;
    725 
    726 #ifdef CONFIG_BGSCAN
    727 	if (state == WPA_COMPLETED)
    728 		wpa_supplicant_start_bgscan(wpa_s);
    729 	else if (state < WPA_ASSOCIATED)
    730 		wpa_supplicant_stop_bgscan(wpa_s);
    731 #endif /* CONFIG_BGSCAN */
    732 
    733 	if (state == WPA_AUTHENTICATING)
    734 		wpa_supplicant_stop_autoscan(wpa_s);
    735 
    736 	if (state == WPA_DISCONNECTED || state == WPA_INACTIVE)
    737 		wpa_supplicant_start_autoscan(wpa_s);
    738 
    739 	if (wpa_s->wpa_state != old_state) {
    740 		wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
    741 
    742 		/*
    743 		 * Notify the P2P Device interface about a state change in one
    744 		 * of the interfaces.
    745 		 */
    746 		wpas_p2p_indicate_state_change(wpa_s);
    747 
    748 		if (wpa_s->wpa_state == WPA_COMPLETED ||
    749 		    old_state == WPA_COMPLETED)
    750 			wpas_notify_auth_changed(wpa_s);
    751 	}
    752 }
    753 
    754 
    755 void wpa_supplicant_terminate_proc(struct wpa_global *global)
    756 {
    757 	int pending = 0;
    758 #ifdef CONFIG_WPS
    759 	struct wpa_supplicant *wpa_s = global->ifaces;
    760 	while (wpa_s) {
    761 		struct wpa_supplicant *next = wpa_s->next;
    762 		if (wpas_wps_terminate_pending(wpa_s) == 1)
    763 			pending = 1;
    764 #ifdef CONFIG_P2P
    765 		if (wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE ||
    766 		    (wpa_s->current_ssid && wpa_s->current_ssid->p2p_group))
    767 			wpas_p2p_disconnect(wpa_s);
    768 #endif /* CONFIG_P2P */
    769 		wpa_s = next;
    770 	}
    771 #endif /* CONFIG_WPS */
    772 	if (pending)
    773 		return;
    774 	eloop_terminate();
    775 }
    776 
    777 
    778 static void wpa_supplicant_terminate(int sig, void *signal_ctx)
    779 {
    780 	struct wpa_global *global = signal_ctx;
    781 	wpa_supplicant_terminate_proc(global);
    782 }
    783 
    784 
    785 void wpa_supplicant_clear_status(struct wpa_supplicant *wpa_s)
    786 {
    787 	enum wpa_states old_state = wpa_s->wpa_state;
    788 
    789 	wpa_s->pairwise_cipher = 0;
    790 	wpa_s->group_cipher = 0;
    791 	wpa_s->mgmt_group_cipher = 0;
    792 	wpa_s->key_mgmt = 0;
    793 	if (wpa_s->wpa_state != WPA_INTERFACE_DISABLED)
    794 		wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
    795 
    796 	if (wpa_s->wpa_state != old_state)
    797 		wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
    798 }
    799 
    800 
    801 /**
    802  * wpa_supplicant_reload_configuration - Reload configuration data
    803  * @wpa_s: Pointer to wpa_supplicant data
    804  * Returns: 0 on success or -1 if configuration parsing failed
    805  *
    806  * This function can be used to request that the configuration data is reloaded
    807  * (e.g., after configuration file change). This function is reloading
    808  * configuration only for one interface, so this may need to be called multiple
    809  * times if %wpa_supplicant is controlling multiple interfaces and all
    810  * interfaces need reconfiguration.
    811  */
    812 int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s)
    813 {
    814 	struct wpa_config *conf;
    815 	int reconf_ctrl;
    816 	int old_ap_scan;
    817 
    818 	if (wpa_s->confname == NULL)
    819 		return -1;
    820 	conf = wpa_config_read(wpa_s->confname, NULL);
    821 	if (conf == NULL) {
    822 		wpa_msg(wpa_s, MSG_ERROR, "Failed to parse the configuration "
    823 			"file '%s' - exiting", wpa_s->confname);
    824 		return -1;
    825 	}
    826 	wpa_config_read(wpa_s->confanother, conf);
    827 
    828 	conf->changed_parameters = (unsigned int) -1;
    829 
    830 	reconf_ctrl = !!conf->ctrl_interface != !!wpa_s->conf->ctrl_interface
    831 		|| (conf->ctrl_interface && wpa_s->conf->ctrl_interface &&
    832 		    os_strcmp(conf->ctrl_interface,
    833 			      wpa_s->conf->ctrl_interface) != 0);
    834 
    835 	if (reconf_ctrl && wpa_s->ctrl_iface) {
    836 		wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
    837 		wpa_s->ctrl_iface = NULL;
    838 	}
    839 
    840 	eapol_sm_invalidate_cached_session(wpa_s->eapol);
    841 	if (wpa_s->current_ssid) {
    842 		wpa_supplicant_deauthenticate(wpa_s,
    843 					      WLAN_REASON_DEAUTH_LEAVING);
    844 	}
    845 
    846 	/*
    847 	 * TODO: should notify EAPOL SM about changes in opensc_engine_path,
    848 	 * pkcs11_engine_path, pkcs11_module_path.
    849 	 */
    850 	if (wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt)) {
    851 		/*
    852 		 * Clear forced success to clear EAP state for next
    853 		 * authentication.
    854 		 */
    855 		eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
    856 	}
    857 	eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
    858 	wpa_sm_set_config(wpa_s->wpa, NULL);
    859 	wpa_sm_pmksa_cache_flush(wpa_s->wpa, NULL);
    860 	wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
    861 	rsn_preauth_deinit(wpa_s->wpa);
    862 
    863 	old_ap_scan = wpa_s->conf->ap_scan;
    864 	wpa_config_free(wpa_s->conf);
    865 	wpa_s->conf = conf;
    866 	if (old_ap_scan != wpa_s->conf->ap_scan)
    867 		wpas_notify_ap_scan_changed(wpa_s);
    868 
    869 	if (reconf_ctrl)
    870 		wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
    871 
    872 	wpa_supplicant_update_config(wpa_s);
    873 
    874 	wpa_supplicant_clear_status(wpa_s);
    875 	if (wpa_supplicant_enabled_networks(wpa_s)) {
    876 		wpa_s->reassociate = 1;
    877 		wpa_supplicant_req_scan(wpa_s, 0, 0);
    878 	}
    879 	wpa_dbg(wpa_s, MSG_DEBUG, "Reconfiguration completed");
    880 	return 0;
    881 }
    882 
    883 
    884 static void wpa_supplicant_reconfig(int sig, void *signal_ctx)
    885 {
    886 	struct wpa_global *global = signal_ctx;
    887 	struct wpa_supplicant *wpa_s;
    888 	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
    889 		wpa_dbg(wpa_s, MSG_DEBUG, "Signal %d received - reconfiguring",
    890 			sig);
    891 		if (wpa_supplicant_reload_configuration(wpa_s) < 0) {
    892 			wpa_supplicant_terminate_proc(global);
    893 		}
    894 	}
    895 }
    896 
    897 
    898 static int wpa_supplicant_suites_from_ai(struct wpa_supplicant *wpa_s,
    899 					 struct wpa_ssid *ssid,
    900 					 struct wpa_ie_data *ie)
    901 {
    902 	int ret = wpa_sm_parse_own_wpa_ie(wpa_s->wpa, ie);
    903 	if (ret) {
    904 		if (ret == -2) {
    905 			wpa_msg(wpa_s, MSG_INFO, "WPA: Failed to parse WPA IE "
    906 				"from association info");
    907 		}
    908 		return -1;
    909 	}
    910 
    911 	wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Using WPA IE from AssocReq to set "
    912 		"cipher suites");
    913 	if (!(ie->group_cipher & ssid->group_cipher)) {
    914 		wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled group "
    915 			"cipher 0x%x (mask 0x%x) - reject",
    916 			ie->group_cipher, ssid->group_cipher);
    917 		return -1;
    918 	}
    919 	if (!(ie->pairwise_cipher & ssid->pairwise_cipher)) {
    920 		wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled pairwise "
    921 			"cipher 0x%x (mask 0x%x) - reject",
    922 			ie->pairwise_cipher, ssid->pairwise_cipher);
    923 		return -1;
    924 	}
    925 	if (!(ie->key_mgmt & ssid->key_mgmt)) {
    926 		wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled key "
    927 			"management 0x%x (mask 0x%x) - reject",
    928 			ie->key_mgmt, ssid->key_mgmt);
    929 		return -1;
    930 	}
    931 
    932 #ifdef CONFIG_IEEE80211W
    933 	if (!(ie->capabilities & WPA_CAPABILITY_MFPC) &&
    934 	    (ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT ?
    935 	     wpa_s->conf->pmf : ssid->ieee80211w) ==
    936 	    MGMT_FRAME_PROTECTION_REQUIRED) {
    937 		wpa_msg(wpa_s, MSG_INFO, "WPA: Driver associated with an AP "
    938 			"that does not support management frame protection - "
    939 			"reject");
    940 		return -1;
    941 	}
    942 #endif /* CONFIG_IEEE80211W */
    943 
    944 	return 0;
    945 }
    946 
    947 
    948 /**
    949  * wpa_supplicant_set_suites - Set authentication and encryption parameters
    950  * @wpa_s: Pointer to wpa_supplicant data
    951  * @bss: Scan results for the selected BSS, or %NULL if not available
    952  * @ssid: Configuration data for the selected network
    953  * @wpa_ie: Buffer for the WPA/RSN IE
    954  * @wpa_ie_len: Maximum wpa_ie buffer size on input. This is changed to be the
    955  * used buffer length in case the functions returns success.
    956  * Returns: 0 on success or -1 on failure
    957  *
    958  * This function is used to configure authentication and encryption parameters
    959  * based on the network configuration and scan result for the selected BSS (if
    960  * available).
    961  */
    962 int wpa_supplicant_set_suites(struct wpa_supplicant *wpa_s,
    963 			      struct wpa_bss *bss, struct wpa_ssid *ssid,
    964 			      u8 *wpa_ie, size_t *wpa_ie_len)
    965 {
    966 	struct wpa_ie_data ie;
    967 	int sel, proto;
    968 	const u8 *bss_wpa, *bss_rsn, *bss_osen;
    969 
    970 	if (bss) {
    971 		bss_wpa = wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE);
    972 		bss_rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
    973 		bss_osen = wpa_bss_get_vendor_ie(bss, OSEN_IE_VENDOR_TYPE);
    974 	} else
    975 		bss_wpa = bss_rsn = bss_osen = NULL;
    976 
    977 	if (bss_rsn && (ssid->proto & WPA_PROTO_RSN) &&
    978 	    wpa_parse_wpa_ie(bss_rsn, 2 + bss_rsn[1], &ie) == 0 &&
    979 	    (ie.group_cipher & ssid->group_cipher) &&
    980 	    (ie.pairwise_cipher & ssid->pairwise_cipher) &&
    981 	    (ie.key_mgmt & ssid->key_mgmt)) {
    982 		wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using IEEE 802.11i/D9.0");
    983 		proto = WPA_PROTO_RSN;
    984 	} else if (bss_wpa && (ssid->proto & WPA_PROTO_WPA) &&
    985 		   wpa_parse_wpa_ie(bss_wpa, 2 +bss_wpa[1], &ie) == 0 &&
    986 		   (ie.group_cipher & ssid->group_cipher) &&
    987 		   (ie.pairwise_cipher & ssid->pairwise_cipher) &&
    988 		   (ie.key_mgmt & ssid->key_mgmt)) {
    989 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using IEEE 802.11i/D3.0");
    990 		proto = WPA_PROTO_WPA;
    991 #ifdef CONFIG_HS20
    992 	} else if (bss_osen && (ssid->proto & WPA_PROTO_OSEN)) {
    993 		wpa_dbg(wpa_s, MSG_DEBUG, "HS 2.0: using OSEN");
    994 		/* TODO: parse OSEN element */
    995 		os_memset(&ie, 0, sizeof(ie));
    996 		ie.group_cipher = WPA_CIPHER_CCMP;
    997 		ie.pairwise_cipher = WPA_CIPHER_CCMP;
    998 		ie.key_mgmt = WPA_KEY_MGMT_OSEN;
    999 		proto = WPA_PROTO_OSEN;
   1000 #endif /* CONFIG_HS20 */
   1001 	} else if (bss) {
   1002 		wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select WPA/RSN");
   1003 		return -1;
   1004 	} else {
   1005 		if (ssid->proto & WPA_PROTO_OSEN)
   1006 			proto = WPA_PROTO_OSEN;
   1007 		else if (ssid->proto & WPA_PROTO_RSN)
   1008 			proto = WPA_PROTO_RSN;
   1009 		else
   1010 			proto = WPA_PROTO_WPA;
   1011 		if (wpa_supplicant_suites_from_ai(wpa_s, ssid, &ie) < 0) {
   1012 			os_memset(&ie, 0, sizeof(ie));
   1013 			ie.group_cipher = ssid->group_cipher;
   1014 			ie.pairwise_cipher = ssid->pairwise_cipher;
   1015 			ie.key_mgmt = ssid->key_mgmt;
   1016 #ifdef CONFIG_IEEE80211W
   1017 			ie.mgmt_group_cipher =
   1018 				ssid->ieee80211w != NO_MGMT_FRAME_PROTECTION ?
   1019 				WPA_CIPHER_AES_128_CMAC : 0;
   1020 #endif /* CONFIG_IEEE80211W */
   1021 			wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Set cipher suites "
   1022 				"based on configuration");
   1023 		} else
   1024 			proto = ie.proto;
   1025 	}
   1026 
   1027 	wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected cipher suites: group %d "
   1028 		"pairwise %d key_mgmt %d proto %d",
   1029 		ie.group_cipher, ie.pairwise_cipher, ie.key_mgmt, proto);
   1030 #ifdef CONFIG_IEEE80211W
   1031 	if (ssid->ieee80211w) {
   1032 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected mgmt group cipher %d",
   1033 			ie.mgmt_group_cipher);
   1034 	}
   1035 #endif /* CONFIG_IEEE80211W */
   1036 
   1037 	wpa_s->wpa_proto = proto;
   1038 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PROTO, proto);
   1039 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED,
   1040 			 !!(ssid->proto & (WPA_PROTO_RSN | WPA_PROTO_OSEN)));
   1041 
   1042 	if (bss || !wpa_s->ap_ies_from_associnfo) {
   1043 		if (wpa_sm_set_ap_wpa_ie(wpa_s->wpa, bss_wpa,
   1044 					 bss_wpa ? 2 + bss_wpa[1] : 0) ||
   1045 		    wpa_sm_set_ap_rsn_ie(wpa_s->wpa, bss_rsn,
   1046 					 bss_rsn ? 2 + bss_rsn[1] : 0))
   1047 			return -1;
   1048 	}
   1049 
   1050 	sel = ie.group_cipher & ssid->group_cipher;
   1051 	wpa_s->group_cipher = wpa_pick_group_cipher(sel);
   1052 	if (wpa_s->group_cipher < 0) {
   1053 		wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select group "
   1054 			"cipher");
   1055 		return -1;
   1056 	}
   1057 	wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using GTK %s",
   1058 		wpa_cipher_txt(wpa_s->group_cipher));
   1059 
   1060 	sel = ie.pairwise_cipher & ssid->pairwise_cipher;
   1061 	wpa_s->pairwise_cipher = wpa_pick_pairwise_cipher(sel, 1);
   1062 	if (wpa_s->pairwise_cipher < 0) {
   1063 		wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select pairwise "
   1064 			"cipher");
   1065 		return -1;
   1066 	}
   1067 	wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using PTK %s",
   1068 		wpa_cipher_txt(wpa_s->pairwise_cipher));
   1069 
   1070 	sel = ie.key_mgmt & ssid->key_mgmt;
   1071 #ifdef CONFIG_SAE
   1072 	if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SAE))
   1073 		sel &= ~(WPA_KEY_MGMT_SAE | WPA_KEY_MGMT_FT_SAE);
   1074 #endif /* CONFIG_SAE */
   1075 	if (0) {
   1076 #ifdef CONFIG_IEEE80211R
   1077 	} else if (sel & WPA_KEY_MGMT_FT_IEEE8021X) {
   1078 		wpa_s->key_mgmt = WPA_KEY_MGMT_FT_IEEE8021X;
   1079 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/802.1X");
   1080 	} else if (sel & WPA_KEY_MGMT_FT_PSK) {
   1081 		wpa_s->key_mgmt = WPA_KEY_MGMT_FT_PSK;
   1082 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/PSK");
   1083 #endif /* CONFIG_IEEE80211R */
   1084 #ifdef CONFIG_SAE
   1085 	} else if (sel & WPA_KEY_MGMT_SAE) {
   1086 		wpa_s->key_mgmt = WPA_KEY_MGMT_SAE;
   1087 		wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT SAE");
   1088 	} else if (sel & WPA_KEY_MGMT_FT_SAE) {
   1089 		wpa_s->key_mgmt = WPA_KEY_MGMT_FT_SAE;
   1090 		wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT FT/SAE");
   1091 #endif /* CONFIG_SAE */
   1092 #ifdef CONFIG_IEEE80211W
   1093 	} else if (sel & WPA_KEY_MGMT_IEEE8021X_SHA256) {
   1094 		wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SHA256;
   1095 		wpa_dbg(wpa_s, MSG_DEBUG,
   1096 			"WPA: using KEY_MGMT 802.1X with SHA256");
   1097 	} else if (sel & WPA_KEY_MGMT_PSK_SHA256) {
   1098 		wpa_s->key_mgmt = WPA_KEY_MGMT_PSK_SHA256;
   1099 		wpa_dbg(wpa_s, MSG_DEBUG,
   1100 			"WPA: using KEY_MGMT PSK with SHA256");
   1101 #endif /* CONFIG_IEEE80211W */
   1102 	} else if (sel & WPA_KEY_MGMT_IEEE8021X) {
   1103 		wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X;
   1104 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT 802.1X");
   1105 	} else if (sel & WPA_KEY_MGMT_PSK) {
   1106 		wpa_s->key_mgmt = WPA_KEY_MGMT_PSK;
   1107 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-PSK");
   1108 	} else if (sel & WPA_KEY_MGMT_WPA_NONE) {
   1109 		wpa_s->key_mgmt = WPA_KEY_MGMT_WPA_NONE;
   1110 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-NONE");
   1111 #ifdef CONFIG_HS20
   1112 	} else if (sel & WPA_KEY_MGMT_OSEN) {
   1113 		wpa_s->key_mgmt = WPA_KEY_MGMT_OSEN;
   1114 		wpa_dbg(wpa_s, MSG_DEBUG, "HS 2.0: using KEY_MGMT OSEN");
   1115 #endif /* CONFIG_HS20 */
   1116 	} else {
   1117 		wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select "
   1118 			"authenticated key management type");
   1119 		return -1;
   1120 	}
   1121 
   1122 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
   1123 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
   1124 			 wpa_s->pairwise_cipher);
   1125 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
   1126 
   1127 #ifdef CONFIG_IEEE80211W
   1128 	sel = ie.mgmt_group_cipher;
   1129 	if ((ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT ?
   1130 	     wpa_s->conf->pmf : ssid->ieee80211w) == NO_MGMT_FRAME_PROTECTION ||
   1131 	    !(ie.capabilities & WPA_CAPABILITY_MFPC))
   1132 		sel = 0;
   1133 	if (sel & WPA_CIPHER_AES_128_CMAC) {
   1134 		wpa_s->mgmt_group_cipher = WPA_CIPHER_AES_128_CMAC;
   1135 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
   1136 			"AES-128-CMAC");
   1137 	} else if (sel & WPA_CIPHER_BIP_GMAC_128) {
   1138 		wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_GMAC_128;
   1139 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
   1140 			"BIP-GMAC-128");
   1141 	} else if (sel & WPA_CIPHER_BIP_GMAC_256) {
   1142 		wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_GMAC_256;
   1143 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
   1144 			"BIP-GMAC-256");
   1145 	} else if (sel & WPA_CIPHER_BIP_CMAC_256) {
   1146 		wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_CMAC_256;
   1147 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
   1148 			"BIP-CMAC-256");
   1149 	} else {
   1150 		wpa_s->mgmt_group_cipher = 0;
   1151 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: not using MGMT group cipher");
   1152 	}
   1153 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
   1154 			 wpa_s->mgmt_group_cipher);
   1155 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MFP,
   1156 			 (ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT ?
   1157 			  wpa_s->conf->pmf : ssid->ieee80211w));
   1158 #endif /* CONFIG_IEEE80211W */
   1159 
   1160 	if (wpa_sm_set_assoc_wpa_ie_default(wpa_s->wpa, wpa_ie, wpa_ie_len)) {
   1161 		wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to generate WPA IE");
   1162 		return -1;
   1163 	}
   1164 
   1165 	if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt)) {
   1166 		wpa_sm_set_pmk(wpa_s->wpa, ssid->psk, PMK_LEN);
   1167 #ifndef CONFIG_NO_PBKDF2
   1168 		if (bss && ssid->bssid_set && ssid->ssid_len == 0 &&
   1169 		    ssid->passphrase) {
   1170 			u8 psk[PMK_LEN];
   1171 		        pbkdf2_sha1(ssid->passphrase, bss->ssid, bss->ssid_len,
   1172 				    4096, psk, PMK_LEN);
   1173 		        wpa_hexdump_key(MSG_MSGDUMP, "PSK (from passphrase)",
   1174 					psk, PMK_LEN);
   1175 			wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN);
   1176 		}
   1177 #endif /* CONFIG_NO_PBKDF2 */
   1178 #ifdef CONFIG_EXT_PASSWORD
   1179 		if (ssid->ext_psk) {
   1180 			struct wpabuf *pw = ext_password_get(wpa_s->ext_pw,
   1181 							     ssid->ext_psk);
   1182 			char pw_str[64 + 1];
   1183 			u8 psk[PMK_LEN];
   1184 
   1185 			if (pw == NULL) {
   1186 				wpa_msg(wpa_s, MSG_INFO, "EXT PW: No PSK "
   1187 					"found from external storage");
   1188 				return -1;
   1189 			}
   1190 
   1191 			if (wpabuf_len(pw) < 8 || wpabuf_len(pw) > 64) {
   1192 				wpa_msg(wpa_s, MSG_INFO, "EXT PW: Unexpected "
   1193 					"PSK length %d in external storage",
   1194 					(int) wpabuf_len(pw));
   1195 				ext_password_free(pw);
   1196 				return -1;
   1197 			}
   1198 
   1199 			os_memcpy(pw_str, wpabuf_head(pw), wpabuf_len(pw));
   1200 			pw_str[wpabuf_len(pw)] = '\0';
   1201 
   1202 #ifndef CONFIG_NO_PBKDF2
   1203 			if (wpabuf_len(pw) >= 8 && wpabuf_len(pw) < 64 && bss)
   1204 			{
   1205 				pbkdf2_sha1(pw_str, bss->ssid, bss->ssid_len,
   1206 					    4096, psk, PMK_LEN);
   1207 				os_memset(pw_str, 0, sizeof(pw_str));
   1208 				wpa_hexdump_key(MSG_MSGDUMP, "PSK (from "
   1209 						"external passphrase)",
   1210 						psk, PMK_LEN);
   1211 				wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN);
   1212 			} else
   1213 #endif /* CONFIG_NO_PBKDF2 */
   1214 			if (wpabuf_len(pw) == 2 * PMK_LEN) {
   1215 				if (hexstr2bin(pw_str, psk, PMK_LEN) < 0) {
   1216 					wpa_msg(wpa_s, MSG_INFO, "EXT PW: "
   1217 						"Invalid PSK hex string");
   1218 					os_memset(pw_str, 0, sizeof(pw_str));
   1219 					ext_password_free(pw);
   1220 					return -1;
   1221 				}
   1222 				wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN);
   1223 			} else {
   1224 				wpa_msg(wpa_s, MSG_INFO, "EXT PW: No suitable "
   1225 					"PSK available");
   1226 				os_memset(pw_str, 0, sizeof(pw_str));
   1227 				ext_password_free(pw);
   1228 				return -1;
   1229 			}
   1230 
   1231 			os_memset(pw_str, 0, sizeof(pw_str));
   1232 			ext_password_free(pw);
   1233 		}
   1234 #endif /* CONFIG_EXT_PASSWORD */
   1235 	} else
   1236 		wpa_sm_set_pmk_from_pmksa(wpa_s->wpa);
   1237 
   1238 	return 0;
   1239 }
   1240 
   1241 
   1242 static void wpas_ext_capab_byte(struct wpa_supplicant *wpa_s, u8 *pos, int idx)
   1243 {
   1244 	*pos = 0x00;
   1245 
   1246 	switch (idx) {
   1247 	case 0: /* Bits 0-7 */
   1248 		break;
   1249 	case 1: /* Bits 8-15 */
   1250 		break;
   1251 	case 2: /* Bits 16-23 */
   1252 #ifdef CONFIG_WNM
   1253 		*pos |= 0x02; /* Bit 17 - WNM-Sleep Mode */
   1254 		*pos |= 0x08; /* Bit 19 - BSS Transition */
   1255 #endif /* CONFIG_WNM */
   1256 		break;
   1257 	case 3: /* Bits 24-31 */
   1258 #ifdef CONFIG_WNM
   1259 		*pos |= 0x02; /* Bit 25 - SSID List */
   1260 #endif /* CONFIG_WNM */
   1261 #ifdef CONFIG_INTERWORKING
   1262 		if (wpa_s->conf->interworking)
   1263 			*pos |= 0x80; /* Bit 31 - Interworking */
   1264 #endif /* CONFIG_INTERWORKING */
   1265 		break;
   1266 	case 4: /* Bits 32-39 */
   1267 #ifdef CONFIG_INTERWORKING
   1268 		if (wpa_s->drv_flags / WPA_DRIVER_FLAGS_QOS_MAPPING)
   1269 			*pos |= 0x01; /* Bit 32 - QoS Map */
   1270 #endif /* CONFIG_INTERWORKING */
   1271 		break;
   1272 	case 5: /* Bits 40-47 */
   1273 #ifdef CONFIG_HS20
   1274 		if (wpa_s->conf->hs20)
   1275 			*pos |= 0x40; /* Bit 46 - WNM-Notification */
   1276 #endif /* CONFIG_HS20 */
   1277 		break;
   1278 	case 6: /* Bits 48-55 */
   1279 		break;
   1280 	}
   1281 }
   1282 
   1283 
   1284 int wpas_build_ext_capab(struct wpa_supplicant *wpa_s, u8 *buf, size_t buflen)
   1285 {
   1286 	u8 *pos = buf;
   1287 	u8 len = 6, i;
   1288 
   1289 	if (len < wpa_s->extended_capa_len)
   1290 		len = wpa_s->extended_capa_len;
   1291 	if (buflen < (size_t) len + 2) {
   1292 		wpa_printf(MSG_INFO,
   1293 			   "Not enough room for building extended capabilities element");
   1294 		return -1;
   1295 	}
   1296 
   1297 	*pos++ = WLAN_EID_EXT_CAPAB;
   1298 	*pos++ = len;
   1299 	for (i = 0; i < len; i++, pos++) {
   1300 		wpas_ext_capab_byte(wpa_s, pos, i);
   1301 
   1302 		if (i < wpa_s->extended_capa_len) {
   1303 			*pos &= ~wpa_s->extended_capa_mask[i];
   1304 			*pos |= wpa_s->extended_capa[i];
   1305 		}
   1306 	}
   1307 
   1308 	while (len > 0 && buf[1 + len] == 0) {
   1309 		len--;
   1310 		buf[1] = len;
   1311 	}
   1312 	if (len == 0)
   1313 		return 0;
   1314 
   1315 	return 2 + len;
   1316 }
   1317 
   1318 
   1319 static int wpas_valid_bss(struct wpa_supplicant *wpa_s,
   1320 			  struct wpa_bss *test_bss)
   1321 {
   1322 	struct wpa_bss *bss;
   1323 
   1324 	dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
   1325 		if (bss == test_bss)
   1326 			return 1;
   1327 	}
   1328 
   1329 	return 0;
   1330 }
   1331 
   1332 
   1333 static int wpas_valid_ssid(struct wpa_supplicant *wpa_s,
   1334 			   struct wpa_ssid *test_ssid)
   1335 {
   1336 	struct wpa_ssid *ssid;
   1337 
   1338 	for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) {
   1339 		if (ssid == test_ssid)
   1340 			return 1;
   1341 	}
   1342 
   1343 	return 0;
   1344 }
   1345 
   1346 
   1347 int wpas_valid_bss_ssid(struct wpa_supplicant *wpa_s, struct wpa_bss *test_bss,
   1348 			struct wpa_ssid *test_ssid)
   1349 {
   1350 	if (test_bss && !wpas_valid_bss(wpa_s, test_bss))
   1351 		return 0;
   1352 
   1353 	return test_ssid == NULL || wpas_valid_ssid(wpa_s, test_ssid);
   1354 }
   1355 
   1356 
   1357 void wpas_connect_work_free(struct wpa_connect_work *cwork)
   1358 {
   1359 	if (cwork == NULL)
   1360 		return;
   1361 	os_free(cwork);
   1362 }
   1363 
   1364 
   1365 void wpas_connect_work_done(struct wpa_supplicant *wpa_s)
   1366 {
   1367 	struct wpa_connect_work *cwork;
   1368 	struct wpa_radio_work *work = wpa_s->connect_work;
   1369 
   1370 	if (!work)
   1371 		return;
   1372 
   1373 	wpa_s->connect_work = NULL;
   1374 	cwork = work->ctx;
   1375 	work->ctx = NULL;
   1376 	wpas_connect_work_free(cwork);
   1377 	radio_work_done(work);
   1378 }
   1379 
   1380 
   1381 int wpas_update_random_addr(struct wpa_supplicant *wpa_s, int style)
   1382 {
   1383 	struct os_reltime now;
   1384 	u8 addr[ETH_ALEN];
   1385 
   1386 	os_get_reltime(&now);
   1387 	if (wpa_s->last_mac_addr_style == style &&
   1388 	    wpa_s->last_mac_addr_change.sec != 0 &&
   1389 	    !os_reltime_expired(&now, &wpa_s->last_mac_addr_change,
   1390 				wpa_s->conf->rand_addr_lifetime)) {
   1391 		wpa_msg(wpa_s, MSG_DEBUG,
   1392 			"Previously selected random MAC address has not yet expired");
   1393 		return 0;
   1394 	}
   1395 
   1396 	switch (style) {
   1397 	case 1:
   1398 		if (random_mac_addr(addr) < 0)
   1399 			return -1;
   1400 		break;
   1401 	case 2:
   1402 		os_memcpy(addr, wpa_s->perm_addr, ETH_ALEN);
   1403 		if (random_mac_addr_keep_oui(addr) < 0)
   1404 			return -1;
   1405 		break;
   1406 	default:
   1407 		return -1;
   1408 	}
   1409 
   1410 	if (wpa_drv_set_mac_addr(wpa_s, addr) < 0) {
   1411 		wpa_msg(wpa_s, MSG_INFO,
   1412 			"Failed to set random MAC address");
   1413 		return -1;
   1414 	}
   1415 
   1416 	os_get_reltime(&wpa_s->last_mac_addr_change);
   1417 	wpa_s->mac_addr_changed = 1;
   1418 	wpa_s->last_mac_addr_style = style;
   1419 
   1420 	if (wpa_supplicant_update_mac_addr(wpa_s) < 0) {
   1421 		wpa_msg(wpa_s, MSG_INFO,
   1422 			"Could not update MAC address information");
   1423 		return -1;
   1424 	}
   1425 
   1426 	wpa_msg(wpa_s, MSG_DEBUG, "Using random MAC address " MACSTR,
   1427 		MAC2STR(addr));
   1428 
   1429 	return 0;
   1430 }
   1431 
   1432 
   1433 int wpas_update_random_addr_disassoc(struct wpa_supplicant *wpa_s)
   1434 {
   1435 	if (wpa_s->wpa_state >= WPA_AUTHENTICATING ||
   1436 	    !wpa_s->conf->preassoc_mac_addr)
   1437 		return 0;
   1438 
   1439 	return wpas_update_random_addr(wpa_s, wpa_s->conf->preassoc_mac_addr);
   1440 }
   1441 
   1442 
   1443 static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit);
   1444 
   1445 /**
   1446  * wpa_supplicant_associate - Request association
   1447  * @wpa_s: Pointer to wpa_supplicant data
   1448  * @bss: Scan results for the selected BSS, or %NULL if not available
   1449  * @ssid: Configuration data for the selected network
   1450  *
   1451  * This function is used to request %wpa_supplicant to associate with a BSS.
   1452  */
   1453 void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
   1454 			      struct wpa_bss *bss, struct wpa_ssid *ssid)
   1455 {
   1456 	struct wpa_connect_work *cwork;
   1457 	int rand_style;
   1458 
   1459 	if (ssid->mac_addr == -1)
   1460 		rand_style = wpa_s->conf->mac_addr;
   1461 	else
   1462 		rand_style = ssid->mac_addr;
   1463 
   1464 	if (wpa_s->last_ssid == ssid) {
   1465 		wpa_dbg(wpa_s, MSG_DEBUG, "Re-association to the same ESS");
   1466 	} else if (rand_style > 0) {
   1467 		if (wpas_update_random_addr(wpa_s, rand_style) < 0)
   1468 			return;
   1469 		wpa_sm_pmksa_cache_flush(wpa_s->wpa, ssid);
   1470 	} else if (wpa_s->mac_addr_changed) {
   1471 		if (wpa_drv_set_mac_addr(wpa_s, NULL) < 0) {
   1472 			wpa_msg(wpa_s, MSG_INFO,
   1473 				"Could not restore permanent MAC address");
   1474 			return;
   1475 		}
   1476 		wpa_s->mac_addr_changed = 0;
   1477 		if (wpa_supplicant_update_mac_addr(wpa_s) < 0) {
   1478 			wpa_msg(wpa_s, MSG_INFO,
   1479 				"Could not update MAC address information");
   1480 			return;
   1481 		}
   1482 		wpa_msg(wpa_s, MSG_DEBUG, "Using permanent MAC address");
   1483 	}
   1484 	wpa_s->last_ssid = ssid;
   1485 
   1486 #ifdef CONFIG_IBSS_RSN
   1487 	ibss_rsn_deinit(wpa_s->ibss_rsn);
   1488 	wpa_s->ibss_rsn = NULL;
   1489 #endif /* CONFIG_IBSS_RSN */
   1490 
   1491 	if (ssid->mode == WPAS_MODE_AP || ssid->mode == WPAS_MODE_P2P_GO ||
   1492 	    ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) {
   1493 #ifdef CONFIG_AP
   1494 		if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_AP)) {
   1495 			wpa_msg(wpa_s, MSG_INFO, "Driver does not support AP "
   1496 				"mode");
   1497 			return;
   1498 		}
   1499 		if (wpa_supplicant_create_ap(wpa_s, ssid) < 0) {
   1500 			wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
   1501 			if (ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION)
   1502 				wpas_p2p_ap_setup_failed(wpa_s);
   1503 			return;
   1504 		}
   1505 		wpa_s->current_bss = bss;
   1506 #else /* CONFIG_AP */
   1507 		wpa_msg(wpa_s, MSG_ERROR, "AP mode support not included in "
   1508 			"the build");
   1509 #endif /* CONFIG_AP */
   1510 		return;
   1511 	}
   1512 
   1513 #ifdef CONFIG_TDLS
   1514 	if (bss)
   1515 		wpa_tdls_ap_ies(wpa_s->wpa, (const u8 *) (bss + 1),
   1516 				bss->ie_len);
   1517 #endif /* CONFIG_TDLS */
   1518 
   1519 	if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) &&
   1520 	    ssid->mode == IEEE80211_MODE_INFRA) {
   1521 		sme_authenticate(wpa_s, bss, ssid);
   1522 		return;
   1523 	}
   1524 
   1525 	if (wpa_s->connect_work) {
   1526 		wpa_dbg(wpa_s, MSG_DEBUG, "Reject wpa_supplicant_associate() call since connect_work exist");
   1527 		return;
   1528 	}
   1529 
   1530 	if (radio_work_pending(wpa_s, "connect")) {
   1531 		wpa_dbg(wpa_s, MSG_DEBUG, "Reject wpa_supplicant_associate() call since pending work exist");
   1532 		return;
   1533 	}
   1534 
   1535 	cwork = os_zalloc(sizeof(*cwork));
   1536 	if (cwork == NULL)
   1537 		return;
   1538 
   1539 	cwork->bss = bss;
   1540 	cwork->ssid = ssid;
   1541 
   1542 	if (radio_add_work(wpa_s, bss ? bss->freq : 0, "connect", 1,
   1543 			   wpas_start_assoc_cb, cwork) < 0) {
   1544 		os_free(cwork);
   1545 	}
   1546 }
   1547 
   1548 
   1549 static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
   1550 {
   1551 	struct wpa_connect_work *cwork = work->ctx;
   1552 	struct wpa_bss *bss = cwork->bss;
   1553 	struct wpa_ssid *ssid = cwork->ssid;
   1554 	struct wpa_supplicant *wpa_s = work->wpa_s;
   1555 	u8 wpa_ie[200];
   1556 	size_t wpa_ie_len;
   1557 	int use_crypt, ret, i, bssid_changed;
   1558 	int algs = WPA_AUTH_ALG_OPEN;
   1559 	unsigned int cipher_pairwise, cipher_group;
   1560 	struct wpa_driver_associate_params params;
   1561 	int wep_keys_set = 0;
   1562 	int assoc_failed = 0;
   1563 	struct wpa_ssid *old_ssid;
   1564 #ifdef CONFIG_HT_OVERRIDES
   1565 	struct ieee80211_ht_capabilities htcaps;
   1566 	struct ieee80211_ht_capabilities htcaps_mask;
   1567 #endif /* CONFIG_HT_OVERRIDES */
   1568 #ifdef CONFIG_VHT_OVERRIDES
   1569        struct ieee80211_vht_capabilities vhtcaps;
   1570        struct ieee80211_vht_capabilities vhtcaps_mask;
   1571 #endif /* CONFIG_VHT_OVERRIDES */
   1572 
   1573 	if (deinit) {
   1574 		if (work->started) {
   1575 			wpa_s->connect_work = NULL;
   1576 
   1577 			/* cancel possible auth. timeout */
   1578 			eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s,
   1579 					     NULL);
   1580 		}
   1581 		wpas_connect_work_free(cwork);
   1582 		return;
   1583 	}
   1584 
   1585 	wpa_s->connect_work = work;
   1586 
   1587 	if (cwork->bss_removed || !wpas_valid_bss_ssid(wpa_s, bss, ssid)) {
   1588 		wpa_dbg(wpa_s, MSG_DEBUG, "BSS/SSID entry for association not valid anymore - drop connection attempt");
   1589 		wpas_connect_work_done(wpa_s);
   1590 		return;
   1591 	}
   1592 
   1593 	os_memset(&params, 0, sizeof(params));
   1594 	wpa_s->reassociate = 0;
   1595 	wpa_s->eap_expected_failure = 0;
   1596 	if (bss && !wpas_driver_bss_selection(wpa_s)) {
   1597 #ifdef CONFIG_IEEE80211R
   1598 		const u8 *ie, *md = NULL;
   1599 #endif /* CONFIG_IEEE80211R */
   1600 		wpa_msg(wpa_s, MSG_INFO, "Trying to associate with " MACSTR
   1601 			" (SSID='%s' freq=%d MHz)", MAC2STR(bss->bssid),
   1602 			wpa_ssid_txt(bss->ssid, bss->ssid_len), bss->freq);
   1603 		bssid_changed = !is_zero_ether_addr(wpa_s->bssid);
   1604 		os_memset(wpa_s->bssid, 0, ETH_ALEN);
   1605 		os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN);
   1606 		if (bssid_changed)
   1607 			wpas_notify_bssid_changed(wpa_s);
   1608 #ifdef CONFIG_IEEE80211R
   1609 		ie = wpa_bss_get_ie(bss, WLAN_EID_MOBILITY_DOMAIN);
   1610 		if (ie && ie[1] >= MOBILITY_DOMAIN_ID_LEN)
   1611 			md = ie + 2;
   1612 		wpa_sm_set_ft_params(wpa_s->wpa, ie, ie ? 2 + ie[1] : 0);
   1613 		if (md) {
   1614 			/* Prepare for the next transition */
   1615 			wpa_ft_prepare_auth_request(wpa_s->wpa, ie);
   1616 		}
   1617 #endif /* CONFIG_IEEE80211R */
   1618 #ifdef CONFIG_WPS
   1619 	} else if ((ssid->ssid == NULL || ssid->ssid_len == 0) &&
   1620 		   wpa_s->conf->ap_scan == 2 &&
   1621 		   (ssid->key_mgmt & WPA_KEY_MGMT_WPS)) {
   1622 		/* Use ap_scan==1 style network selection to find the network
   1623 		 */
   1624 		wpas_connect_work_done(wpa_s);
   1625 		wpa_s->scan_req = MANUAL_SCAN_REQ;
   1626 		wpa_s->reassociate = 1;
   1627 		wpa_supplicant_req_scan(wpa_s, 0, 0);
   1628 		return;
   1629 #endif /* CONFIG_WPS */
   1630 	} else {
   1631 		wpa_msg(wpa_s, MSG_INFO, "Trying to associate with SSID '%s'",
   1632 			wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
   1633 		os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
   1634 	}
   1635 	wpa_supplicant_cancel_sched_scan(wpa_s);
   1636 	wpa_supplicant_cancel_scan(wpa_s);
   1637 
   1638 	/* Starting new association, so clear the possibly used WPA IE from the
   1639 	 * previous association. */
   1640 	wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
   1641 
   1642 #ifdef IEEE8021X_EAPOL
   1643 	if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
   1644 		if (ssid->leap) {
   1645 			if (ssid->non_leap == 0)
   1646 				algs = WPA_AUTH_ALG_LEAP;
   1647 			else
   1648 				algs |= WPA_AUTH_ALG_LEAP;
   1649 		}
   1650 	}
   1651 #endif /* IEEE8021X_EAPOL */
   1652 	wpa_dbg(wpa_s, MSG_DEBUG, "Automatic auth_alg selection: 0x%x", algs);
   1653 	if (ssid->auth_alg) {
   1654 		algs = ssid->auth_alg;
   1655 		wpa_dbg(wpa_s, MSG_DEBUG, "Overriding auth_alg selection: "
   1656 			"0x%x", algs);
   1657 	}
   1658 
   1659 	if (bss && (wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE) ||
   1660 		    wpa_bss_get_ie(bss, WLAN_EID_RSN)) &&
   1661 	    wpa_key_mgmt_wpa(ssid->key_mgmt)) {
   1662 		int try_opportunistic;
   1663 		try_opportunistic = (ssid->proactive_key_caching < 0 ?
   1664 				     wpa_s->conf->okc :
   1665 				     ssid->proactive_key_caching) &&
   1666 			(ssid->proto & WPA_PROTO_RSN);
   1667 		if (pmksa_cache_set_current(wpa_s->wpa, NULL, bss->bssid,
   1668 					    ssid, try_opportunistic) == 0)
   1669 			eapol_sm_notify_pmkid_attempt(wpa_s->eapol, 1);
   1670 		wpa_ie_len = sizeof(wpa_ie);
   1671 		if (wpa_supplicant_set_suites(wpa_s, bss, ssid,
   1672 					      wpa_ie, &wpa_ie_len)) {
   1673 			wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA "
   1674 				"key management and encryption suites");
   1675 			wpas_connect_work_done(wpa_s);
   1676 			return;
   1677 		}
   1678 	} else if ((ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) && bss &&
   1679 		   wpa_key_mgmt_wpa_ieee8021x(ssid->key_mgmt)) {
   1680 		/*
   1681 		 * Both WPA and non-WPA IEEE 802.1X enabled in configuration -
   1682 		 * use non-WPA since the scan results did not indicate that the
   1683 		 * AP is using WPA or WPA2.
   1684 		 */
   1685 		wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
   1686 		wpa_ie_len = 0;
   1687 		wpa_s->wpa_proto = 0;
   1688 	} else if (wpa_key_mgmt_wpa_any(ssid->key_mgmt)) {
   1689 		wpa_ie_len = sizeof(wpa_ie);
   1690 		if (wpa_supplicant_set_suites(wpa_s, NULL, ssid,
   1691 					      wpa_ie, &wpa_ie_len)) {
   1692 			wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA "
   1693 				"key management and encryption suites (no "
   1694 				"scan results)");
   1695 			wpas_connect_work_done(wpa_s);
   1696 			return;
   1697 		}
   1698 #ifdef CONFIG_WPS
   1699 	} else if (ssid->key_mgmt & WPA_KEY_MGMT_WPS) {
   1700 		struct wpabuf *wps_ie;
   1701 		wps_ie = wps_build_assoc_req_ie(wpas_wps_get_req_type(ssid));
   1702 		if (wps_ie && wpabuf_len(wps_ie) <= sizeof(wpa_ie)) {
   1703 			wpa_ie_len = wpabuf_len(wps_ie);
   1704 			os_memcpy(wpa_ie, wpabuf_head(wps_ie), wpa_ie_len);
   1705 		} else
   1706 			wpa_ie_len = 0;
   1707 		wpabuf_free(wps_ie);
   1708 		wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
   1709 		if (!bss || (bss->caps & IEEE80211_CAP_PRIVACY))
   1710 			params.wps = WPS_MODE_PRIVACY;
   1711 		else
   1712 			params.wps = WPS_MODE_OPEN;
   1713 		wpa_s->wpa_proto = 0;
   1714 #endif /* CONFIG_WPS */
   1715 	} else {
   1716 		wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
   1717 		wpa_ie_len = 0;
   1718 		wpa_s->wpa_proto = 0;
   1719 	}
   1720 
   1721 #ifdef CONFIG_P2P
   1722 	if (wpa_s->global->p2p) {
   1723 		u8 *pos;
   1724 		size_t len;
   1725 		int res;
   1726 		pos = wpa_ie + wpa_ie_len;
   1727 		len = sizeof(wpa_ie) - wpa_ie_len;
   1728 		res = wpas_p2p_assoc_req_ie(wpa_s, bss, pos, len,
   1729 					    ssid->p2p_group);
   1730 		if (res >= 0)
   1731 			wpa_ie_len += res;
   1732 	}
   1733 
   1734 	wpa_s->cross_connect_disallowed = 0;
   1735 	if (bss) {
   1736 		struct wpabuf *p2p;
   1737 		p2p = wpa_bss_get_vendor_ie_multi(bss, P2P_IE_VENDOR_TYPE);
   1738 		if (p2p) {
   1739 			wpa_s->cross_connect_disallowed =
   1740 				p2p_get_cross_connect_disallowed(p2p);
   1741 			wpabuf_free(p2p);
   1742 			wpa_dbg(wpa_s, MSG_DEBUG, "P2P: WLAN AP %s cross "
   1743 				"connection",
   1744 				wpa_s->cross_connect_disallowed ?
   1745 				"disallows" : "allows");
   1746 		}
   1747 	}
   1748 
   1749 	os_memset(wpa_s->p2p_ip_addr_info, 0, sizeof(wpa_s->p2p_ip_addr_info));
   1750 #endif /* CONFIG_P2P */
   1751 
   1752 #ifdef CONFIG_HS20
   1753 	if (is_hs20_network(wpa_s, ssid, bss)) {
   1754 		struct wpabuf *hs20;
   1755 		hs20 = wpabuf_alloc(20);
   1756 		if (hs20) {
   1757 			int pps_mo_id = hs20_get_pps_mo_id(wpa_s, ssid);
   1758 			size_t len;
   1759 
   1760 			wpas_hs20_add_indication(hs20, pps_mo_id);
   1761 			len = sizeof(wpa_ie) - wpa_ie_len;
   1762 			if (wpabuf_len(hs20) <= len) {
   1763 				os_memcpy(wpa_ie + wpa_ie_len,
   1764 					  wpabuf_head(hs20), wpabuf_len(hs20));
   1765 				wpa_ie_len += wpabuf_len(hs20);
   1766 			}
   1767 			wpabuf_free(hs20);
   1768 		}
   1769 	}
   1770 #endif /* CONFIG_HS20 */
   1771 
   1772 	/*
   1773 	 * Workaround: Add Extended Capabilities element only if the AP
   1774 	 * included this element in Beacon/Probe Response frames. Some older
   1775 	 * APs seem to have interoperability issues if this element is
   1776 	 * included, so while the standard may require us to include the
   1777 	 * element in all cases, it is justifiable to skip it to avoid
   1778 	 * interoperability issues.
   1779 	 */
   1780 	if (!bss || wpa_bss_get_ie(bss, WLAN_EID_EXT_CAPAB)) {
   1781 		u8 ext_capab[18];
   1782 		int ext_capab_len;
   1783 		ext_capab_len = wpas_build_ext_capab(wpa_s, ext_capab,
   1784 						     sizeof(ext_capab));
   1785 		if (ext_capab_len > 0) {
   1786 			u8 *pos = wpa_ie;
   1787 			if (wpa_ie_len > 0 && pos[0] == WLAN_EID_RSN)
   1788 				pos += 2 + pos[1];
   1789 			os_memmove(pos + ext_capab_len, pos,
   1790 				   wpa_ie_len - (pos - wpa_ie));
   1791 			wpa_ie_len += ext_capab_len;
   1792 			os_memcpy(pos, ext_capab, ext_capab_len);
   1793 		}
   1794 	}
   1795 
   1796 	wpa_clear_keys(wpa_s, bss ? bss->bssid : NULL);
   1797 	use_crypt = 1;
   1798 	cipher_pairwise = wpa_s->pairwise_cipher;
   1799 	cipher_group = wpa_s->group_cipher;
   1800 	if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
   1801 	    wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
   1802 		if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE)
   1803 			use_crypt = 0;
   1804 		if (wpa_set_wep_keys(wpa_s, ssid)) {
   1805 			use_crypt = 1;
   1806 			wep_keys_set = 1;
   1807 		}
   1808 	}
   1809 	if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS)
   1810 		use_crypt = 0;
   1811 
   1812 #ifdef IEEE8021X_EAPOL
   1813 	if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
   1814 		if ((ssid->eapol_flags &
   1815 		     (EAPOL_FLAG_REQUIRE_KEY_UNICAST |
   1816 		      EAPOL_FLAG_REQUIRE_KEY_BROADCAST)) == 0 &&
   1817 		    !wep_keys_set) {
   1818 			use_crypt = 0;
   1819 		} else {
   1820 			/* Assume that dynamic WEP-104 keys will be used and
   1821 			 * set cipher suites in order for drivers to expect
   1822 			 * encryption. */
   1823 			cipher_pairwise = cipher_group = WPA_CIPHER_WEP104;
   1824 		}
   1825 	}
   1826 #endif /* IEEE8021X_EAPOL */
   1827 
   1828 	if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
   1829 		/* Set the key before (and later after) association */
   1830 		wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
   1831 	}
   1832 
   1833 	wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING);
   1834 	if (bss) {
   1835 		params.ssid = bss->ssid;
   1836 		params.ssid_len = bss->ssid_len;
   1837 		if (!wpas_driver_bss_selection(wpa_s) || ssid->bssid_set) {
   1838 			wpa_printf(MSG_DEBUG, "Limit connection to BSSID "
   1839 				   MACSTR " freq=%u MHz based on scan results "
   1840 				   "(bssid_set=%d)",
   1841 				   MAC2STR(bss->bssid), bss->freq,
   1842 				   ssid->bssid_set);
   1843 			params.bssid = bss->bssid;
   1844 			params.freq.freq = bss->freq;
   1845 		}
   1846 		params.bssid_hint = bss->bssid;
   1847 		params.freq_hint = bss->freq;
   1848 	} else {
   1849 		params.ssid = ssid->ssid;
   1850 		params.ssid_len = ssid->ssid_len;
   1851 	}
   1852 
   1853 	if (ssid->mode == WPAS_MODE_IBSS && ssid->bssid_set &&
   1854 	    wpa_s->conf->ap_scan == 2) {
   1855 		params.bssid = ssid->bssid;
   1856 		params.fixed_bssid = 1;
   1857 	}
   1858 
   1859 	if (ssid->mode == WPAS_MODE_IBSS && ssid->frequency > 0 &&
   1860 	    params.freq.freq == 0) {
   1861 		enum hostapd_hw_mode hw_mode;
   1862 		u8 channel;
   1863 
   1864 		params.freq.freq = ssid->frequency;
   1865 
   1866 		hw_mode = ieee80211_freq_to_chan(ssid->frequency, &channel);
   1867 		for (i = 0; wpa_s->hw.modes && i < wpa_s->hw.num_modes; i++) {
   1868 			if (wpa_s->hw.modes[i].mode == hw_mode) {
   1869 				struct hostapd_hw_modes *mode;
   1870 
   1871 				mode = &wpa_s->hw.modes[i];
   1872 				params.freq.ht_enabled = ht_supported(mode);
   1873 				break;
   1874 			}
   1875 		}
   1876 	}
   1877 
   1878 	if (ssid->mode == WPAS_MODE_IBSS) {
   1879 		if (ssid->beacon_int)
   1880 			params.beacon_int = ssid->beacon_int;
   1881 		else
   1882 			params.beacon_int = wpa_s->conf->beacon_int;
   1883 	}
   1884 
   1885 	params.wpa_ie = wpa_ie;
   1886 	params.wpa_ie_len = wpa_ie_len;
   1887 	params.pairwise_suite = cipher_pairwise;
   1888 	params.group_suite = cipher_group;
   1889 	params.key_mgmt_suite = wpa_s->key_mgmt;
   1890 	params.wpa_proto = wpa_s->wpa_proto;
   1891 	params.auth_alg = algs;
   1892 	params.mode = ssid->mode;
   1893 	params.bg_scan_period = ssid->bg_scan_period;
   1894 	for (i = 0; i < NUM_WEP_KEYS; i++) {
   1895 		if (ssid->wep_key_len[i])
   1896 			params.wep_key[i] = ssid->wep_key[i];
   1897 		params.wep_key_len[i] = ssid->wep_key_len[i];
   1898 	}
   1899 	params.wep_tx_keyidx = ssid->wep_tx_keyidx;
   1900 
   1901 	if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) &&
   1902 	    (params.key_mgmt_suite == WPA_KEY_MGMT_PSK ||
   1903 	     params.key_mgmt_suite == WPA_KEY_MGMT_FT_PSK)) {
   1904 		params.passphrase = ssid->passphrase;
   1905 		if (ssid->psk_set)
   1906 			params.psk = ssid->psk;
   1907 	}
   1908 
   1909 	params.drop_unencrypted = use_crypt;
   1910 
   1911 #ifdef CONFIG_IEEE80211W
   1912 	params.mgmt_frame_protection =
   1913 		ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT ?
   1914 		wpa_s->conf->pmf : ssid->ieee80211w;
   1915 	if (params.mgmt_frame_protection != NO_MGMT_FRAME_PROTECTION && bss) {
   1916 		const u8 *rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
   1917 		struct wpa_ie_data ie;
   1918 		if (rsn && wpa_parse_wpa_ie(rsn, 2 + rsn[1], &ie) == 0 &&
   1919 		    ie.capabilities &
   1920 		    (WPA_CAPABILITY_MFPC | WPA_CAPABILITY_MFPR)) {
   1921 			wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected AP supports "
   1922 				"MFP: require MFP");
   1923 			params.mgmt_frame_protection =
   1924 				MGMT_FRAME_PROTECTION_REQUIRED;
   1925 		}
   1926 	}
   1927 #endif /* CONFIG_IEEE80211W */
   1928 
   1929 	params.p2p = ssid->p2p_group;
   1930 
   1931 	if (wpa_s->parent->set_sta_uapsd)
   1932 		params.uapsd = wpa_s->parent->sta_uapsd;
   1933 	else
   1934 		params.uapsd = -1;
   1935 
   1936 #ifdef CONFIG_HT_OVERRIDES
   1937 	os_memset(&htcaps, 0, sizeof(htcaps));
   1938 	os_memset(&htcaps_mask, 0, sizeof(htcaps_mask));
   1939 	params.htcaps = (u8 *) &htcaps;
   1940 	params.htcaps_mask = (u8 *) &htcaps_mask;
   1941 	wpa_supplicant_apply_ht_overrides(wpa_s, ssid, &params);
   1942 #endif /* CONFIG_HT_OVERRIDES */
   1943 #ifdef CONFIG_VHT_OVERRIDES
   1944 	os_memset(&vhtcaps, 0, sizeof(vhtcaps));
   1945 	os_memset(&vhtcaps_mask, 0, sizeof(vhtcaps_mask));
   1946 	params.vhtcaps = &vhtcaps;
   1947 	params.vhtcaps_mask = &vhtcaps_mask;
   1948 	wpa_supplicant_apply_vht_overrides(wpa_s, wpa_s->current_ssid, &params);
   1949 #endif /* CONFIG_VHT_OVERRIDES */
   1950 
   1951 #ifdef CONFIG_P2P
   1952 	/*
   1953 	 * If multi-channel concurrency is not supported, check for any
   1954 	 * frequency conflict. In case of any frequency conflict, remove the
   1955 	 * least prioritized connection.
   1956 	 */
   1957 	if (wpa_s->num_multichan_concurrent < 2) {
   1958 		int freq, num;
   1959 		num = get_shared_radio_freqs(wpa_s, &freq, 1);
   1960 		if (num > 0 && freq > 0 && freq != params.freq.freq) {
   1961 			wpa_printf(MSG_DEBUG,
   1962 				   "Assoc conflicting freq found (%d != %d)",
   1963 				   freq, params.freq.freq);
   1964 			if (wpas_p2p_handle_frequency_conflicts(
   1965 				    wpa_s, params.freq.freq, ssid) < 0) {
   1966 				wpas_connect_work_done(wpa_s);
   1967 				return;
   1968 			}
   1969 		}
   1970 	}
   1971 #endif /* CONFIG_P2P */
   1972 
   1973 	ret = wpa_drv_associate(wpa_s, &params);
   1974 	if (ret < 0) {
   1975 		wpa_msg(wpa_s, MSG_INFO, "Association request to the driver "
   1976 			"failed");
   1977 		if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SANE_ERROR_CODES) {
   1978 			/*
   1979 			 * The driver is known to mean what is saying, so we
   1980 			 * can stop right here; the association will not
   1981 			 * succeed.
   1982 			 */
   1983 			wpas_connection_failed(wpa_s, wpa_s->pending_bssid);
   1984 			wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
   1985 			os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
   1986 			return;
   1987 		}
   1988 		/* try to continue anyway; new association will be tried again
   1989 		 * after timeout */
   1990 		assoc_failed = 1;
   1991 	}
   1992 
   1993 	if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
   1994 		/* Set the key after the association just in case association
   1995 		 * cleared the previously configured key. */
   1996 		wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
   1997 		/* No need to timeout authentication since there is no key
   1998 		 * management. */
   1999 		wpa_supplicant_cancel_auth_timeout(wpa_s);
   2000 		wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
   2001 #ifdef CONFIG_IBSS_RSN
   2002 	} else if (ssid->mode == WPAS_MODE_IBSS &&
   2003 		   wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
   2004 		   wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
   2005 		/*
   2006 		 * RSN IBSS authentication is per-STA and we can disable the
   2007 		 * per-BSSID authentication.
   2008 		 */
   2009 		wpa_supplicant_cancel_auth_timeout(wpa_s);
   2010 #endif /* CONFIG_IBSS_RSN */
   2011 	} else {
   2012 		/* Timeout for IEEE 802.11 authentication and association */
   2013 		int timeout = 60;
   2014 
   2015 		if (assoc_failed) {
   2016 			/* give IBSS a bit more time */
   2017 			timeout = ssid->mode == WPAS_MODE_IBSS ? 10 : 5;
   2018 		} else if (wpa_s->conf->ap_scan == 1) {
   2019 			/* give IBSS a bit more time */
   2020 			timeout = ssid->mode == WPAS_MODE_IBSS ? 20 : 10;
   2021 		}
   2022 		wpa_supplicant_req_auth_timeout(wpa_s, timeout, 0);
   2023 	}
   2024 
   2025 	if (wep_keys_set &&
   2026 	    (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC)) {
   2027 		/* Set static WEP keys again */
   2028 		wpa_set_wep_keys(wpa_s, ssid);
   2029 	}
   2030 
   2031 	if (wpa_s->current_ssid && wpa_s->current_ssid != ssid) {
   2032 		/*
   2033 		 * Do not allow EAP session resumption between different
   2034 		 * network configurations.
   2035 		 */
   2036 		eapol_sm_invalidate_cached_session(wpa_s->eapol);
   2037 	}
   2038 	old_ssid = wpa_s->current_ssid;
   2039 	wpa_s->current_ssid = ssid;
   2040 	wpa_s->current_bss = bss;
   2041 	wpa_supplicant_rsn_supp_set_config(wpa_s, wpa_s->current_ssid);
   2042 	wpa_supplicant_initiate_eapol(wpa_s);
   2043 	if (old_ssid != wpa_s->current_ssid)
   2044 		wpas_notify_network_changed(wpa_s);
   2045 }
   2046 
   2047 
   2048 static void wpa_supplicant_clear_connection(struct wpa_supplicant *wpa_s,
   2049 					    const u8 *addr)
   2050 {
   2051 	struct wpa_ssid *old_ssid;
   2052 
   2053 	wpa_clear_keys(wpa_s, addr);
   2054 	old_ssid = wpa_s->current_ssid;
   2055 	wpa_supplicant_mark_disassoc(wpa_s);
   2056 	wpa_sm_set_config(wpa_s->wpa, NULL);
   2057 	eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
   2058 	if (old_ssid != wpa_s->current_ssid)
   2059 		wpas_notify_network_changed(wpa_s);
   2060 	eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
   2061 }
   2062 
   2063 
   2064 /**
   2065  * wpa_supplicant_deauthenticate - Deauthenticate the current connection
   2066  * @wpa_s: Pointer to wpa_supplicant data
   2067  * @reason_code: IEEE 802.11 reason code for the deauthenticate frame
   2068  *
   2069  * This function is used to request %wpa_supplicant to deauthenticate from the
   2070  * current AP.
   2071  */
   2072 void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
   2073 				   int reason_code)
   2074 {
   2075 	u8 *addr = NULL;
   2076 	union wpa_event_data event;
   2077 	int zero_addr = 0;
   2078 
   2079 	wpa_dbg(wpa_s, MSG_DEBUG, "Request to deauthenticate - bssid=" MACSTR
   2080 		" pending_bssid=" MACSTR " reason=%d state=%s",
   2081 		MAC2STR(wpa_s->bssid), MAC2STR(wpa_s->pending_bssid),
   2082 		reason_code, wpa_supplicant_state_txt(wpa_s->wpa_state));
   2083 
   2084 	if (!is_zero_ether_addr(wpa_s->bssid))
   2085 		addr = wpa_s->bssid;
   2086 	else if (!is_zero_ether_addr(wpa_s->pending_bssid) &&
   2087 		 (wpa_s->wpa_state == WPA_AUTHENTICATING ||
   2088 		  wpa_s->wpa_state == WPA_ASSOCIATING))
   2089 		addr = wpa_s->pending_bssid;
   2090 	else if (wpa_s->wpa_state == WPA_ASSOCIATING) {
   2091 		/*
   2092 		 * When using driver-based BSS selection, we may not know the
   2093 		 * BSSID with which we are currently trying to associate. We
   2094 		 * need to notify the driver of this disconnection even in such
   2095 		 * a case, so use the all zeros address here.
   2096 		 */
   2097 		addr = wpa_s->bssid;
   2098 		zero_addr = 1;
   2099 	}
   2100 
   2101 #ifdef CONFIG_TDLS
   2102 	wpa_tdls_teardown_peers(wpa_s->wpa);
   2103 #endif /* CONFIG_TDLS */
   2104 
   2105 	if (addr) {
   2106 		wpa_drv_deauthenticate(wpa_s, addr, reason_code);
   2107 		os_memset(&event, 0, sizeof(event));
   2108 		event.deauth_info.reason_code = (u16) reason_code;
   2109 		event.deauth_info.locally_generated = 1;
   2110 		wpa_supplicant_event(wpa_s, EVENT_DEAUTH, &event);
   2111 		if (zero_addr)
   2112 			addr = NULL;
   2113 	}
   2114 
   2115 	wpa_supplicant_clear_connection(wpa_s, addr);
   2116 }
   2117 
   2118 static void wpa_supplicant_enable_one_network(struct wpa_supplicant *wpa_s,
   2119 					      struct wpa_ssid *ssid)
   2120 {
   2121 	if (!ssid || !ssid->disabled || ssid->disabled == 2)
   2122 		return;
   2123 
   2124 	ssid->disabled = 0;
   2125 	wpas_clear_temp_disabled(wpa_s, ssid, 1);
   2126 	wpas_notify_network_enabled_changed(wpa_s, ssid);
   2127 
   2128 	/*
   2129 	 * Try to reassociate since there is no current configuration and a new
   2130 	 * network was made available.
   2131 	 */
   2132 	if (!wpa_s->current_ssid && !wpa_s->disconnected)
   2133 		wpa_s->reassociate = 1;
   2134 }
   2135 
   2136 
   2137 /**
   2138  * wpa_supplicant_enable_network - Mark a configured network as enabled
   2139  * @wpa_s: wpa_supplicant structure for a network interface
   2140  * @ssid: wpa_ssid structure for a configured network or %NULL
   2141  *
   2142  * Enables the specified network or all networks if no network specified.
   2143  */
   2144 void wpa_supplicant_enable_network(struct wpa_supplicant *wpa_s,
   2145 				   struct wpa_ssid *ssid)
   2146 {
   2147 	if (ssid == NULL) {
   2148 		for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
   2149 			wpa_supplicant_enable_one_network(wpa_s, ssid);
   2150 	} else
   2151 		wpa_supplicant_enable_one_network(wpa_s, ssid);
   2152 
   2153 	if (wpa_s->reassociate && !wpa_s->disconnected) {
   2154 		if (wpa_s->sched_scanning) {
   2155 			wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan to add "
   2156 				   "new network to scan filters");
   2157 			wpa_supplicant_cancel_sched_scan(wpa_s);
   2158 		}
   2159 
   2160 		if (wpa_supplicant_fast_associate(wpa_s) != 1)
   2161 			wpa_supplicant_req_scan(wpa_s, 0, 0);
   2162 	}
   2163 }
   2164 
   2165 
   2166 /**
   2167  * wpa_supplicant_disable_network - Mark a configured network as disabled
   2168  * @wpa_s: wpa_supplicant structure for a network interface
   2169  * @ssid: wpa_ssid structure for a configured network or %NULL
   2170  *
   2171  * Disables the specified network or all networks if no network specified.
   2172  */
   2173 void wpa_supplicant_disable_network(struct wpa_supplicant *wpa_s,
   2174 				    struct wpa_ssid *ssid)
   2175 {
   2176 	struct wpa_ssid *other_ssid;
   2177 	int was_disabled;
   2178 
   2179 	if (ssid == NULL) {
   2180 		if (wpa_s->sched_scanning)
   2181 			wpa_supplicant_cancel_sched_scan(wpa_s);
   2182 
   2183 		for (other_ssid = wpa_s->conf->ssid; other_ssid;
   2184 		     other_ssid = other_ssid->next) {
   2185 			was_disabled = other_ssid->disabled;
   2186 			if (was_disabled == 2)
   2187 				continue; /* do not change persistent P2P group
   2188 					   * data */
   2189 
   2190 			other_ssid->disabled = 1;
   2191 
   2192 			if (was_disabled != other_ssid->disabled)
   2193 				wpas_notify_network_enabled_changed(
   2194 					wpa_s, other_ssid);
   2195 		}
   2196 		if (wpa_s->current_ssid)
   2197 			wpa_supplicant_deauthenticate(
   2198 				wpa_s, WLAN_REASON_DEAUTH_LEAVING);
   2199 	} else if (ssid->disabled != 2) {
   2200 		if (ssid == wpa_s->current_ssid)
   2201 			wpa_supplicant_deauthenticate(
   2202 				wpa_s, WLAN_REASON_DEAUTH_LEAVING);
   2203 
   2204 		was_disabled = ssid->disabled;
   2205 
   2206 		ssid->disabled = 1;
   2207 
   2208 		if (was_disabled != ssid->disabled) {
   2209 			wpas_notify_network_enabled_changed(wpa_s, ssid);
   2210 			if (wpa_s->sched_scanning) {
   2211 				wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan "
   2212 					   "to remove network from filters");
   2213 				wpa_supplicant_cancel_sched_scan(wpa_s);
   2214 				wpa_supplicant_req_scan(wpa_s, 0, 0);
   2215 			}
   2216 		}
   2217 	}
   2218 }
   2219 
   2220 
   2221 /**
   2222  * wpa_supplicant_select_network - Attempt association with a network
   2223  * @wpa_s: wpa_supplicant structure for a network interface
   2224  * @ssid: wpa_ssid structure for a configured network or %NULL for any network
   2225  */
   2226 void wpa_supplicant_select_network(struct wpa_supplicant *wpa_s,
   2227 				   struct wpa_ssid *ssid)
   2228 {
   2229 
   2230 	struct wpa_ssid *other_ssid;
   2231 	int disconnected = 0;
   2232 
   2233 	if (ssid && ssid != wpa_s->current_ssid && wpa_s->current_ssid) {
   2234 		wpa_supplicant_deauthenticate(
   2235 			wpa_s, WLAN_REASON_DEAUTH_LEAVING);
   2236 		disconnected = 1;
   2237 	}
   2238 
   2239 	if (ssid)
   2240 		wpas_clear_temp_disabled(wpa_s, ssid, 1);
   2241 
   2242 	/*
   2243 	 * Mark all other networks disabled or mark all networks enabled if no
   2244 	 * network specified.
   2245 	 */
   2246 	for (other_ssid = wpa_s->conf->ssid; other_ssid;
   2247 	     other_ssid = other_ssid->next) {
   2248 		int was_disabled = other_ssid->disabled;
   2249 		if (was_disabled == 2)
   2250 			continue; /* do not change persistent P2P group data */
   2251 
   2252 		other_ssid->disabled = ssid ? (ssid->id != other_ssid->id) : 0;
   2253 		if (was_disabled && !other_ssid->disabled)
   2254 			wpas_clear_temp_disabled(wpa_s, other_ssid, 0);
   2255 
   2256 		if (was_disabled != other_ssid->disabled)
   2257 			wpas_notify_network_enabled_changed(wpa_s, other_ssid);
   2258 	}
   2259 
   2260 	if (ssid && ssid == wpa_s->current_ssid && wpa_s->current_ssid) {
   2261 		/* We are already associated with the selected network */
   2262 		wpa_printf(MSG_DEBUG, "Already associated with the "
   2263 			   "selected network - do nothing");
   2264 		return;
   2265 	}
   2266 
   2267 	if (ssid) {
   2268 		wpa_s->current_ssid = ssid;
   2269 		eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
   2270 	}
   2271 	wpa_s->connect_without_scan = NULL;
   2272 	wpa_s->disconnected = 0;
   2273 	wpa_s->reassociate = 1;
   2274 
   2275 	if (wpa_supplicant_fast_associate(wpa_s) != 1)
   2276 		wpa_supplicant_req_scan(wpa_s, 0, disconnected ? 100000 : 0);
   2277 
   2278 	if (ssid)
   2279 		wpas_notify_network_selected(wpa_s, ssid);
   2280 }
   2281 
   2282 
   2283 /**
   2284  * wpas_set_pkcs11_engine_and_module_path - Set PKCS #11 engine and module path
   2285  * @wpa_s: wpa_supplicant structure for a network interface
   2286  * @pkcs11_engine_path: PKCS #11 engine path or NULL
   2287  * @pkcs11_module_path: PKCS #11 module path or NULL
   2288  * Returns: 0 on success; -1 on failure
   2289  *
   2290  * Sets the PKCS #11 engine and module path. Both have to be NULL or a valid
   2291  * path. If resetting the EAPOL state machine with the new PKCS #11 engine and
   2292  * module path fails the paths will be reset to the default value (NULL).
   2293  */
   2294 int wpas_set_pkcs11_engine_and_module_path(struct wpa_supplicant *wpa_s,
   2295 					   const char *pkcs11_engine_path,
   2296 					   const char *pkcs11_module_path)
   2297 {
   2298 	char *pkcs11_engine_path_copy = NULL;
   2299 	char *pkcs11_module_path_copy = NULL;
   2300 
   2301 	if (pkcs11_engine_path != NULL) {
   2302 		pkcs11_engine_path_copy = os_strdup(pkcs11_engine_path);
   2303 		if (pkcs11_engine_path_copy == NULL)
   2304 			return -1;
   2305 	}
   2306 	if (pkcs11_module_path != NULL) {
   2307 		pkcs11_module_path_copy = os_strdup(pkcs11_module_path);
   2308 		if (pkcs11_module_path_copy == NULL) {
   2309 			os_free(pkcs11_engine_path_copy);
   2310 			return -1;
   2311 		}
   2312 	}
   2313 
   2314 	os_free(wpa_s->conf->pkcs11_engine_path);
   2315 	os_free(wpa_s->conf->pkcs11_module_path);
   2316 	wpa_s->conf->pkcs11_engine_path = pkcs11_engine_path_copy;
   2317 	wpa_s->conf->pkcs11_module_path = pkcs11_module_path_copy;
   2318 
   2319 	wpa_sm_set_eapol(wpa_s->wpa, NULL);
   2320 	eapol_sm_deinit(wpa_s->eapol);
   2321 	wpa_s->eapol = NULL;
   2322 	if (wpa_supplicant_init_eapol(wpa_s)) {
   2323 		/* Error -> Reset paths to the default value (NULL) once. */
   2324 		if (pkcs11_engine_path != NULL && pkcs11_module_path != NULL)
   2325 			wpas_set_pkcs11_engine_and_module_path(wpa_s, NULL,
   2326 							       NULL);
   2327 
   2328 		return -1;
   2329 	}
   2330 	wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
   2331 
   2332 	return 0;
   2333 }
   2334 
   2335 
   2336 /**
   2337  * wpa_supplicant_set_ap_scan - Set AP scan mode for interface
   2338  * @wpa_s: wpa_supplicant structure for a network interface
   2339  * @ap_scan: AP scan mode
   2340  * Returns: 0 if succeed or -1 if ap_scan has an invalid value
   2341  *
   2342  */
   2343 int wpa_supplicant_set_ap_scan(struct wpa_supplicant *wpa_s, int ap_scan)
   2344 {
   2345 
   2346 	int old_ap_scan;
   2347 
   2348 	if (ap_scan < 0 || ap_scan > 2)
   2349 		return -1;
   2350 
   2351 #ifdef ANDROID
   2352 	if (ap_scan == 2 && ap_scan != wpa_s->conf->ap_scan &&
   2353 	    wpa_s->wpa_state >= WPA_ASSOCIATING &&
   2354 	    wpa_s->wpa_state < WPA_COMPLETED) {
   2355 		wpa_printf(MSG_ERROR, "ap_scan = %d (%d) rejected while "
   2356 			   "associating", wpa_s->conf->ap_scan, ap_scan);
   2357 		return 0;
   2358 	}
   2359 #endif /* ANDROID */
   2360 
   2361 	old_ap_scan = wpa_s->conf->ap_scan;
   2362 	wpa_s->conf->ap_scan = ap_scan;
   2363 
   2364 	if (old_ap_scan != wpa_s->conf->ap_scan)
   2365 		wpas_notify_ap_scan_changed(wpa_s);
   2366 
   2367 	return 0;
   2368 }
   2369 
   2370 
   2371 /**
   2372  * wpa_supplicant_set_bss_expiration_age - Set BSS entry expiration age
   2373  * @wpa_s: wpa_supplicant structure for a network interface
   2374  * @expire_age: Expiration age in seconds
   2375  * Returns: 0 if succeed or -1 if expire_age has an invalid value
   2376  *
   2377  */
   2378 int wpa_supplicant_set_bss_expiration_age(struct wpa_supplicant *wpa_s,
   2379 					  unsigned int bss_expire_age)
   2380 {
   2381 	if (bss_expire_age < 10) {
   2382 		wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration age %u",
   2383 			bss_expire_age);
   2384 		return -1;
   2385 	}
   2386 	wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration age: %d sec",
   2387 		bss_expire_age);
   2388 	wpa_s->conf->bss_expiration_age = bss_expire_age;
   2389 
   2390 	return 0;
   2391 }
   2392 
   2393 
   2394 /**
   2395  * wpa_supplicant_set_bss_expiration_count - Set BSS entry expiration scan count
   2396  * @wpa_s: wpa_supplicant structure for a network interface
   2397  * @expire_count: number of scans after which an unseen BSS is reclaimed
   2398  * Returns: 0 if succeed or -1 if expire_count has an invalid value
   2399  *
   2400  */
   2401 int wpa_supplicant_set_bss_expiration_count(struct wpa_supplicant *wpa_s,
   2402 					    unsigned int bss_expire_count)
   2403 {
   2404 	if (bss_expire_count < 1) {
   2405 		wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration count %u",
   2406 			bss_expire_count);
   2407 		return -1;
   2408 	}
   2409 	wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration scan count: %u",
   2410 		bss_expire_count);
   2411 	wpa_s->conf->bss_expiration_scan_count = bss_expire_count;
   2412 
   2413 	return 0;
   2414 }
   2415 
   2416 
   2417 /**
   2418  * wpa_supplicant_set_scan_interval - Set scan interval
   2419  * @wpa_s: wpa_supplicant structure for a network interface
   2420  * @scan_interval: scan interval in seconds
   2421  * Returns: 0 if succeed or -1 if scan_interval has an invalid value
   2422  *
   2423  */
   2424 int wpa_supplicant_set_scan_interval(struct wpa_supplicant *wpa_s,
   2425 				     int scan_interval)
   2426 {
   2427 	if (scan_interval < 0) {
   2428 		wpa_msg(wpa_s, MSG_ERROR, "Invalid scan interval %d",
   2429 			scan_interval);
   2430 		return -1;
   2431 	}
   2432 	wpa_msg(wpa_s, MSG_DEBUG, "Setting scan interval: %d sec",
   2433 		scan_interval);
   2434 	wpa_supplicant_update_scan_int(wpa_s, scan_interval);
   2435 
   2436 	return 0;
   2437 }
   2438 
   2439 
   2440 /**
   2441  * wpa_supplicant_set_debug_params - Set global debug params
   2442  * @global: wpa_global structure
   2443  * @debug_level: debug level
   2444  * @debug_timestamp: determines if show timestamp in debug data
   2445  * @debug_show_keys: determines if show keys in debug data
   2446  * Returns: 0 if succeed or -1 if debug_level has wrong value
   2447  */
   2448 int wpa_supplicant_set_debug_params(struct wpa_global *global, int debug_level,
   2449 				    int debug_timestamp, int debug_show_keys)
   2450 {
   2451 
   2452 	int old_level, old_timestamp, old_show_keys;
   2453 
   2454 	/* check for allowed debuglevels */
   2455 	if (debug_level != MSG_EXCESSIVE &&
   2456 	    debug_level != MSG_MSGDUMP &&
   2457 	    debug_level != MSG_DEBUG &&
   2458 	    debug_level != MSG_INFO &&
   2459 	    debug_level != MSG_WARNING &&
   2460 	    debug_level != MSG_ERROR)
   2461 		return -1;
   2462 
   2463 	old_level = wpa_debug_level;
   2464 	old_timestamp = wpa_debug_timestamp;
   2465 	old_show_keys = wpa_debug_show_keys;
   2466 
   2467 	wpa_debug_level = debug_level;
   2468 	wpa_debug_timestamp = debug_timestamp ? 1 : 0;
   2469 	wpa_debug_show_keys = debug_show_keys ? 1 : 0;
   2470 
   2471 	if (wpa_debug_level != old_level)
   2472 		wpas_notify_debug_level_changed(global);
   2473 	if (wpa_debug_timestamp != old_timestamp)
   2474 		wpas_notify_debug_timestamp_changed(global);
   2475 	if (wpa_debug_show_keys != old_show_keys)
   2476 		wpas_notify_debug_show_keys_changed(global);
   2477 
   2478 	return 0;
   2479 }
   2480 
   2481 
   2482 /**
   2483  * wpa_supplicant_get_ssid - Get a pointer to the current network structure
   2484  * @wpa_s: Pointer to wpa_supplicant data
   2485  * Returns: A pointer to the current network structure or %NULL on failure
   2486  */
   2487 struct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s)
   2488 {
   2489 	struct wpa_ssid *entry;
   2490 	u8 ssid[MAX_SSID_LEN];
   2491 	int res;
   2492 	size_t ssid_len;
   2493 	u8 bssid[ETH_ALEN];
   2494 	int wired;
   2495 
   2496 	res = wpa_drv_get_ssid(wpa_s, ssid);
   2497 	if (res < 0) {
   2498 		wpa_msg(wpa_s, MSG_WARNING, "Could not read SSID from "
   2499 			"driver");
   2500 		return NULL;
   2501 	}
   2502 	ssid_len = res;
   2503 
   2504 	if (wpa_drv_get_bssid(wpa_s, bssid) < 0) {
   2505 		wpa_msg(wpa_s, MSG_WARNING, "Could not read BSSID from "
   2506 			"driver");
   2507 		return NULL;
   2508 	}
   2509 
   2510 	wired = wpa_s->conf->ap_scan == 0 &&
   2511 		(wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED);
   2512 
   2513 	entry = wpa_s->conf->ssid;
   2514 	while (entry) {
   2515 		if (!wpas_network_disabled(wpa_s, entry) &&
   2516 		    ((ssid_len == entry->ssid_len &&
   2517 		      os_memcmp(ssid, entry->ssid, ssid_len) == 0) || wired) &&
   2518 		    (!entry->bssid_set ||
   2519 		     os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
   2520 			return entry;
   2521 #ifdef CONFIG_WPS
   2522 		if (!wpas_network_disabled(wpa_s, entry) &&
   2523 		    (entry->key_mgmt & WPA_KEY_MGMT_WPS) &&
   2524 		    (entry->ssid == NULL || entry->ssid_len == 0) &&
   2525 		    (!entry->bssid_set ||
   2526 		     os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
   2527 			return entry;
   2528 #endif /* CONFIG_WPS */
   2529 
   2530 		if (!wpas_network_disabled(wpa_s, entry) && entry->bssid_set &&
   2531 		    entry->ssid_len == 0 &&
   2532 		    os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0)
   2533 			return entry;
   2534 
   2535 		entry = entry->next;
   2536 	}
   2537 
   2538 	return NULL;
   2539 }
   2540 
   2541 
   2542 static int select_driver(struct wpa_supplicant *wpa_s, int i)
   2543 {
   2544 	struct wpa_global *global = wpa_s->global;
   2545 
   2546 	if (wpa_drivers[i]->global_init && global->drv_priv[i] == NULL) {
   2547 		global->drv_priv[i] = wpa_drivers[i]->global_init();
   2548 		if (global->drv_priv[i] == NULL) {
   2549 			wpa_printf(MSG_ERROR, "Failed to initialize driver "
   2550 				   "'%s'", wpa_drivers[i]->name);
   2551 			return -1;
   2552 		}
   2553 	}
   2554 
   2555 	wpa_s->driver = wpa_drivers[i];
   2556 	wpa_s->global_drv_priv = global->drv_priv[i];
   2557 
   2558 	return 0;
   2559 }
   2560 
   2561 
   2562 static int wpa_supplicant_set_driver(struct wpa_supplicant *wpa_s,
   2563 				     const char *name)
   2564 {
   2565 	int i;
   2566 	size_t len;
   2567 	const char *pos, *driver = name;
   2568 
   2569 	if (wpa_s == NULL)
   2570 		return -1;
   2571 
   2572 	if (wpa_drivers[0] == NULL) {
   2573 		wpa_msg(wpa_s, MSG_ERROR, "No driver interfaces build into "
   2574 			"wpa_supplicant");
   2575 		return -1;
   2576 	}
   2577 
   2578 	if (name == NULL) {
   2579 		/* default to first driver in the list */
   2580 		return select_driver(wpa_s, 0);
   2581 	}
   2582 
   2583 	do {
   2584 		pos = os_strchr(driver, ',');
   2585 		if (pos)
   2586 			len = pos - driver;
   2587 		else
   2588 			len = os_strlen(driver);
   2589 
   2590 		for (i = 0; wpa_drivers[i]; i++) {
   2591 			if (os_strlen(wpa_drivers[i]->name) == len &&
   2592 			    os_strncmp(driver, wpa_drivers[i]->name, len) ==
   2593 			    0) {
   2594 				/* First driver that succeeds wins */
   2595 				if (select_driver(wpa_s, i) == 0)
   2596 					return 0;
   2597 			}
   2598 		}
   2599 
   2600 		driver = pos + 1;
   2601 	} while (pos);
   2602 
   2603 	wpa_msg(wpa_s, MSG_ERROR, "Unsupported driver '%s'", name);
   2604 	return -1;
   2605 }
   2606 
   2607 
   2608 /**
   2609  * wpa_supplicant_rx_eapol - Deliver a received EAPOL frame to wpa_supplicant
   2610  * @ctx: Context pointer (wpa_s); this is the ctx variable registered
   2611  *	with struct wpa_driver_ops::init()
   2612  * @src_addr: Source address of the EAPOL frame
   2613  * @buf: EAPOL data starting from the EAPOL header (i.e., no Ethernet header)
   2614  * @len: Length of the EAPOL data
   2615  *
   2616  * This function is called for each received EAPOL frame. Most driver
   2617  * interfaces rely on more generic OS mechanism for receiving frames through
   2618  * l2_packet, but if such a mechanism is not available, the driver wrapper may
   2619  * take care of received EAPOL frames and deliver them to the core supplicant
   2620  * code by calling this function.
   2621  */
   2622 void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr,
   2623 			     const u8 *buf, size_t len)
   2624 {
   2625 	struct wpa_supplicant *wpa_s = ctx;
   2626 
   2627 	wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR, MAC2STR(src_addr));
   2628 	wpa_hexdump(MSG_MSGDUMP, "RX EAPOL", buf, len);
   2629 
   2630 #ifdef CONFIG_PEERKEY
   2631 	if (wpa_s->wpa_state > WPA_ASSOCIATED && wpa_s->current_ssid &&
   2632 	    wpa_s->current_ssid->peerkey &&
   2633 	    !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) &&
   2634 	    wpa_sm_rx_eapol_peerkey(wpa_s->wpa, src_addr, buf, len) == 1) {
   2635 		wpa_dbg(wpa_s, MSG_DEBUG, "RSN: Processed PeerKey EAPOL-Key");
   2636 		return;
   2637 	}
   2638 #endif /* CONFIG_PEERKEY */
   2639 
   2640 	if (wpa_s->wpa_state < WPA_ASSOCIATED ||
   2641 	    (wpa_s->last_eapol_matches_bssid &&
   2642 #ifdef CONFIG_AP
   2643 	     !wpa_s->ap_iface &&
   2644 #endif /* CONFIG_AP */
   2645 	     os_memcmp(src_addr, wpa_s->bssid, ETH_ALEN) != 0)) {
   2646 		/*
   2647 		 * There is possible race condition between receiving the
   2648 		 * association event and the EAPOL frame since they are coming
   2649 		 * through different paths from the driver. In order to avoid
   2650 		 * issues in trying to process the EAPOL frame before receiving
   2651 		 * association information, lets queue it for processing until
   2652 		 * the association event is received. This may also be needed in
   2653 		 * driver-based roaming case, so also use src_addr != BSSID as a
   2654 		 * trigger if we have previously confirmed that the
   2655 		 * Authenticator uses BSSID as the src_addr (which is not the
   2656 		 * case with wired IEEE 802.1X).
   2657 		 */
   2658 		wpa_dbg(wpa_s, MSG_DEBUG, "Not associated - Delay processing "
   2659 			"of received EAPOL frame (state=%s bssid=" MACSTR ")",
   2660 			wpa_supplicant_state_txt(wpa_s->wpa_state),
   2661 			MAC2STR(wpa_s->bssid));
   2662 		wpabuf_free(wpa_s->pending_eapol_rx);
   2663 		wpa_s->pending_eapol_rx = wpabuf_alloc_copy(buf, len);
   2664 		if (wpa_s->pending_eapol_rx) {
   2665 			os_get_reltime(&wpa_s->pending_eapol_rx_time);
   2666 			os_memcpy(wpa_s->pending_eapol_rx_src, src_addr,
   2667 				  ETH_ALEN);
   2668 		}
   2669 		return;
   2670 	}
   2671 
   2672 	wpa_s->last_eapol_matches_bssid =
   2673 		os_memcmp(src_addr, wpa_s->bssid, ETH_ALEN) == 0;
   2674 
   2675 #ifdef CONFIG_AP
   2676 	if (wpa_s->ap_iface) {
   2677 		wpa_supplicant_ap_rx_eapol(wpa_s, src_addr, buf, len);
   2678 		return;
   2679 	}
   2680 #endif /* CONFIG_AP */
   2681 
   2682 	if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE) {
   2683 		wpa_dbg(wpa_s, MSG_DEBUG, "Ignored received EAPOL frame since "
   2684 			"no key management is configured");
   2685 		return;
   2686 	}
   2687 
   2688 	if (wpa_s->eapol_received == 0 &&
   2689 	    (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) ||
   2690 	     !wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) ||
   2691 	     wpa_s->wpa_state != WPA_COMPLETED) &&
   2692 	    (wpa_s->current_ssid == NULL ||
   2693 	     wpa_s->current_ssid->mode != IEEE80211_MODE_IBSS)) {
   2694 		/* Timeout for completing IEEE 802.1X and WPA authentication */
   2695 		wpa_supplicant_req_auth_timeout(
   2696 			wpa_s,
   2697 			(wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) ||
   2698 			 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA ||
   2699 			 wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) ?
   2700 			70 : 10, 0);
   2701 	}
   2702 	wpa_s->eapol_received++;
   2703 
   2704 	if (wpa_s->countermeasures) {
   2705 		wpa_msg(wpa_s, MSG_INFO, "WPA: Countermeasures - dropped "
   2706 			"EAPOL packet");
   2707 		return;
   2708 	}
   2709 
   2710 #ifdef CONFIG_IBSS_RSN
   2711 	if (wpa_s->current_ssid &&
   2712 	    wpa_s->current_ssid->mode == WPAS_MODE_IBSS) {
   2713 		ibss_rsn_rx_eapol(wpa_s->ibss_rsn, src_addr, buf, len);
   2714 		return;
   2715 	}
   2716 #endif /* CONFIG_IBSS_RSN */
   2717 
   2718 	/* Source address of the incoming EAPOL frame could be compared to the
   2719 	 * current BSSID. However, it is possible that a centralized
   2720 	 * Authenticator could be using another MAC address than the BSSID of
   2721 	 * an AP, so just allow any address to be used for now. The replies are
   2722 	 * still sent to the current BSSID (if available), though. */
   2723 
   2724 	os_memcpy(wpa_s->last_eapol_src, src_addr, ETH_ALEN);
   2725 	if (!wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) &&
   2726 	    eapol_sm_rx_eapol(wpa_s->eapol, src_addr, buf, len) > 0)
   2727 		return;
   2728 	wpa_drv_poll(wpa_s);
   2729 	if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE))
   2730 		wpa_sm_rx_eapol(wpa_s->wpa, src_addr, buf, len);
   2731 	else if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt)) {
   2732 		/*
   2733 		 * Set portValid = TRUE here since we are going to skip 4-way
   2734 		 * handshake processing which would normally set portValid. We
   2735 		 * need this to allow the EAPOL state machines to be completed
   2736 		 * without going through EAPOL-Key handshake.
   2737 		 */
   2738 		eapol_sm_notify_portValid(wpa_s->eapol, TRUE);
   2739 	}
   2740 }
   2741 
   2742 
   2743 int wpa_supplicant_update_mac_addr(struct wpa_supplicant *wpa_s)
   2744 {
   2745 	if (wpa_s->driver->send_eapol) {
   2746 		const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
   2747 		if (addr)
   2748 			os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
   2749 	} else if ((!wpa_s->p2p_mgmt ||
   2750 		    !(wpa_s->drv_flags &
   2751 		      WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)) &&
   2752 		   !(wpa_s->drv_flags &
   2753 		     WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE)) {
   2754 		l2_packet_deinit(wpa_s->l2);
   2755 		wpa_s->l2 = l2_packet_init(wpa_s->ifname,
   2756 					   wpa_drv_get_mac_addr(wpa_s),
   2757 					   ETH_P_EAPOL,
   2758 					   wpa_supplicant_rx_eapol, wpa_s, 0);
   2759 		if (wpa_s->l2 == NULL)
   2760 			return -1;
   2761 	} else {
   2762 		const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
   2763 		if (addr)
   2764 			os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
   2765 	}
   2766 
   2767 	if (wpa_s->l2 && l2_packet_get_own_addr(wpa_s->l2, wpa_s->own_addr)) {
   2768 		wpa_msg(wpa_s, MSG_ERROR, "Failed to get own L2 address");
   2769 		return -1;
   2770 	}
   2771 
   2772 	wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
   2773 
   2774 	return 0;
   2775 }
   2776 
   2777 
   2778 static void wpa_supplicant_rx_eapol_bridge(void *ctx, const u8 *src_addr,
   2779 					   const u8 *buf, size_t len)
   2780 {
   2781 	struct wpa_supplicant *wpa_s = ctx;
   2782 	const struct l2_ethhdr *eth;
   2783 
   2784 	if (len < sizeof(*eth))
   2785 		return;
   2786 	eth = (const struct l2_ethhdr *) buf;
   2787 
   2788 	if (os_memcmp(eth->h_dest, wpa_s->own_addr, ETH_ALEN) != 0 &&
   2789 	    !(eth->h_dest[0] & 0x01)) {
   2790 		wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR " to " MACSTR
   2791 			" (bridge - not for this interface - ignore)",
   2792 			MAC2STR(src_addr), MAC2STR(eth->h_dest));
   2793 		return;
   2794 	}
   2795 
   2796 	wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR " to " MACSTR
   2797 		" (bridge)", MAC2STR(src_addr), MAC2STR(eth->h_dest));
   2798 	wpa_supplicant_rx_eapol(wpa_s, src_addr, buf + sizeof(*eth),
   2799 				len - sizeof(*eth));
   2800 }
   2801 
   2802 
   2803 /**
   2804  * wpa_supplicant_driver_init - Initialize driver interface parameters
   2805  * @wpa_s: Pointer to wpa_supplicant data
   2806  * Returns: 0 on success, -1 on failure
   2807  *
   2808  * This function is called to initialize driver interface parameters.
   2809  * wpa_drv_init() must have been called before this function to initialize the
   2810  * driver interface.
   2811  */
   2812 int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s)
   2813 {
   2814 	static int interface_count = 0;
   2815 
   2816 	if (wpa_supplicant_update_mac_addr(wpa_s) < 0)
   2817 		return -1;
   2818 
   2819 	wpa_dbg(wpa_s, MSG_DEBUG, "Own MAC address: " MACSTR,
   2820 		MAC2STR(wpa_s->own_addr));
   2821 	os_memcpy(wpa_s->perm_addr, wpa_s->own_addr, ETH_ALEN);
   2822 	wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
   2823 
   2824 	if (wpa_s->bridge_ifname[0]) {
   2825 		wpa_dbg(wpa_s, MSG_DEBUG, "Receiving packets from bridge "
   2826 			"interface '%s'", wpa_s->bridge_ifname);
   2827 		wpa_s->l2_br = l2_packet_init(wpa_s->bridge_ifname,
   2828 					      wpa_s->own_addr,
   2829 					      ETH_P_EAPOL,
   2830 					      wpa_supplicant_rx_eapol_bridge,
   2831 					      wpa_s, 1);
   2832 		if (wpa_s->l2_br == NULL) {
   2833 			wpa_msg(wpa_s, MSG_ERROR, "Failed to open l2_packet "
   2834 				"connection for the bridge interface '%s'",
   2835 				wpa_s->bridge_ifname);
   2836 			return -1;
   2837 		}
   2838 	}
   2839 
   2840 	wpa_clear_keys(wpa_s, NULL);
   2841 
   2842 	/* Make sure that TKIP countermeasures are not left enabled (could
   2843 	 * happen if wpa_supplicant is killed during countermeasures. */
   2844 	wpa_drv_set_countermeasures(wpa_s, 0);
   2845 
   2846 	wpa_dbg(wpa_s, MSG_DEBUG, "RSN: flushing PMKID list in the driver");
   2847 	wpa_drv_flush_pmkid(wpa_s);
   2848 
   2849 	wpa_s->prev_scan_ssid = WILDCARD_SSID_SCAN;
   2850 	wpa_s->prev_scan_wildcard = 0;
   2851 
   2852 	if (wpa_supplicant_enabled_networks(wpa_s)) {
   2853 		if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
   2854 			wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
   2855 			interface_count = 0;
   2856 		}
   2857 		if (!wpa_s->p2p_mgmt &&
   2858 		    wpa_supplicant_delayed_sched_scan(wpa_s,
   2859 						      interface_count % 3,
   2860 						      100000))
   2861 			wpa_supplicant_req_scan(wpa_s, interface_count % 3,
   2862 						100000);
   2863 		interface_count++;
   2864 	} else
   2865 		wpa_supplicant_set_state(wpa_s, WPA_INACTIVE);
   2866 
   2867 	return 0;
   2868 }
   2869 
   2870 
   2871 static int wpa_supplicant_daemon(const char *pid_file)
   2872 {
   2873 	wpa_printf(MSG_DEBUG, "Daemonize..");
   2874 	return os_daemonize(pid_file);
   2875 }
   2876 
   2877 
   2878 static struct wpa_supplicant * wpa_supplicant_alloc(void)
   2879 {
   2880 	struct wpa_supplicant *wpa_s;
   2881 
   2882 	wpa_s = os_zalloc(sizeof(*wpa_s));
   2883 	if (wpa_s == NULL)
   2884 		return NULL;
   2885 	wpa_s->scan_req = INITIAL_SCAN_REQ;
   2886 	wpa_s->scan_interval = 5;
   2887 	wpa_s->new_connection = 1;
   2888 	wpa_s->parent = wpa_s;
   2889 	wpa_s->sched_scanning = 0;
   2890 
   2891 	return wpa_s;
   2892 }
   2893 
   2894 
   2895 #ifdef CONFIG_HT_OVERRIDES
   2896 
   2897 static int wpa_set_htcap_mcs(struct wpa_supplicant *wpa_s,
   2898 			     struct ieee80211_ht_capabilities *htcaps,
   2899 			     struct ieee80211_ht_capabilities *htcaps_mask,
   2900 			     const char *ht_mcs)
   2901 {
   2902 	/* parse ht_mcs into hex array */
   2903 	int i;
   2904 	const char *tmp = ht_mcs;
   2905 	char *end = NULL;
   2906 
   2907 	/* If ht_mcs is null, do not set anything */
   2908 	if (!ht_mcs)
   2909 		return 0;
   2910 
   2911 	/* This is what we are setting in the kernel */
   2912 	os_memset(&htcaps->supported_mcs_set, 0, IEEE80211_HT_MCS_MASK_LEN);
   2913 
   2914 	wpa_msg(wpa_s, MSG_DEBUG, "set_htcap, ht_mcs -:%s:-", ht_mcs);
   2915 
   2916 	for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
   2917 		errno = 0;
   2918 		long v = strtol(tmp, &end, 16);
   2919 		if (errno == 0) {
   2920 			wpa_msg(wpa_s, MSG_DEBUG,
   2921 				"htcap value[%i]: %ld end: %p  tmp: %p",
   2922 				i, v, end, tmp);
   2923 			if (end == tmp)
   2924 				break;
   2925 
   2926 			htcaps->supported_mcs_set[i] = v;
   2927 			tmp = end;
   2928 		} else {
   2929 			wpa_msg(wpa_s, MSG_ERROR,
   2930 				"Failed to parse ht-mcs: %s, error: %s\n",
   2931 				ht_mcs, strerror(errno));
   2932 			return -1;
   2933 		}
   2934 	}
   2935 
   2936 	/*
   2937 	 * If we were able to parse any values, then set mask for the MCS set.
   2938 	 */
   2939 	if (i) {
   2940 		os_memset(&htcaps_mask->supported_mcs_set, 0xff,
   2941 			  IEEE80211_HT_MCS_MASK_LEN - 1);
   2942 		/* skip the 3 reserved bits */
   2943 		htcaps_mask->supported_mcs_set[IEEE80211_HT_MCS_MASK_LEN - 1] =
   2944 			0x1f;
   2945 	}
   2946 
   2947 	return 0;
   2948 }
   2949 
   2950 
   2951 static int wpa_disable_max_amsdu(struct wpa_supplicant *wpa_s,
   2952 				 struct ieee80211_ht_capabilities *htcaps,
   2953 				 struct ieee80211_ht_capabilities *htcaps_mask,
   2954 				 int disabled)
   2955 {
   2956 	le16 msk;
   2957 
   2958 	wpa_msg(wpa_s, MSG_DEBUG, "set_disable_max_amsdu: %d", disabled);
   2959 
   2960 	if (disabled == -1)
   2961 		return 0;
   2962 
   2963 	msk = host_to_le16(HT_CAP_INFO_MAX_AMSDU_SIZE);
   2964 	htcaps_mask->ht_capabilities_info |= msk;
   2965 	if (disabled)
   2966 		htcaps->ht_capabilities_info &= msk;
   2967 	else
   2968 		htcaps->ht_capabilities_info |= msk;
   2969 
   2970 	return 0;
   2971 }
   2972 
   2973 
   2974 static int wpa_set_ampdu_factor(struct wpa_supplicant *wpa_s,
   2975 				struct ieee80211_ht_capabilities *htcaps,
   2976 				struct ieee80211_ht_capabilities *htcaps_mask,
   2977 				int factor)
   2978 {
   2979 	wpa_msg(wpa_s, MSG_DEBUG, "set_ampdu_factor: %d", factor);
   2980 
   2981 	if (factor == -1)
   2982 		return 0;
   2983 
   2984 	if (factor < 0 || factor > 3) {
   2985 		wpa_msg(wpa_s, MSG_ERROR, "ampdu_factor: %d out of range. "
   2986 			"Must be 0-3 or -1", factor);
   2987 		return -EINVAL;
   2988 	}
   2989 
   2990 	htcaps_mask->a_mpdu_params |= 0x3; /* 2 bits for factor */
   2991 	htcaps->a_mpdu_params &= ~0x3;
   2992 	htcaps->a_mpdu_params |= factor & 0x3;
   2993 
   2994 	return 0;
   2995 }
   2996 
   2997 
   2998 static int wpa_set_ampdu_density(struct wpa_supplicant *wpa_s,
   2999 				 struct ieee80211_ht_capabilities *htcaps,
   3000 				 struct ieee80211_ht_capabilities *htcaps_mask,
   3001 				 int density)
   3002 {
   3003 	wpa_msg(wpa_s, MSG_DEBUG, "set_ampdu_density: %d", density);
   3004 
   3005 	if (density == -1)
   3006 		return 0;
   3007 
   3008 	if (density < 0 || density > 7) {
   3009 		wpa_msg(wpa_s, MSG_ERROR,
   3010 			"ampdu_density: %d out of range. Must be 0-7 or -1.",
   3011 			density);
   3012 		return -EINVAL;
   3013 	}
   3014 
   3015 	htcaps_mask->a_mpdu_params |= 0x1C;
   3016 	htcaps->a_mpdu_params &= ~(0x1C);
   3017 	htcaps->a_mpdu_params |= (density << 2) & 0x1C;
   3018 
   3019 	return 0;
   3020 }
   3021 
   3022 
   3023 static int wpa_set_disable_ht40(struct wpa_supplicant *wpa_s,
   3024 				struct ieee80211_ht_capabilities *htcaps,
   3025 				struct ieee80211_ht_capabilities *htcaps_mask,
   3026 				int disabled)
   3027 {
   3028 	/* Masking these out disables HT40 */
   3029 	le16 msk = host_to_le16(HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET |
   3030 				HT_CAP_INFO_SHORT_GI40MHZ);
   3031 
   3032 	wpa_msg(wpa_s, MSG_DEBUG, "set_disable_ht40: %d", disabled);
   3033 
   3034 	if (disabled)
   3035 		htcaps->ht_capabilities_info &= ~msk;
   3036 	else
   3037 		htcaps->ht_capabilities_info |= msk;
   3038 
   3039 	htcaps_mask->ht_capabilities_info |= msk;
   3040 
   3041 	return 0;
   3042 }
   3043 
   3044 
   3045 static int wpa_set_disable_sgi(struct wpa_supplicant *wpa_s,
   3046 			       struct ieee80211_ht_capabilities *htcaps,
   3047 			       struct ieee80211_ht_capabilities *htcaps_mask,
   3048 			       int disabled)
   3049 {
   3050 	/* Masking these out disables SGI */
   3051 	le16 msk = host_to_le16(HT_CAP_INFO_SHORT_GI20MHZ |
   3052 				HT_CAP_INFO_SHORT_GI40MHZ);
   3053 
   3054 	wpa_msg(wpa_s, MSG_DEBUG, "set_disable_sgi: %d", disabled);
   3055 
   3056 	if (disabled)
   3057 		htcaps->ht_capabilities_info &= ~msk;
   3058 	else
   3059 		htcaps->ht_capabilities_info |= msk;
   3060 
   3061 	htcaps_mask->ht_capabilities_info |= msk;
   3062 
   3063 	return 0;
   3064 }
   3065 
   3066 
   3067 static int wpa_set_disable_ldpc(struct wpa_supplicant *wpa_s,
   3068 			       struct ieee80211_ht_capabilities *htcaps,
   3069 			       struct ieee80211_ht_capabilities *htcaps_mask,
   3070 			       int disabled)
   3071 {
   3072 	/* Masking these out disables LDPC */
   3073 	le16 msk = host_to_le16(HT_CAP_INFO_LDPC_CODING_CAP);
   3074 
   3075 	wpa_msg(wpa_s, MSG_DEBUG, "set_disable_ldpc: %d", disabled);
   3076 
   3077 	if (disabled)
   3078 		htcaps->ht_capabilities_info &= ~msk;
   3079 	else
   3080 		htcaps->ht_capabilities_info |= msk;
   3081 
   3082 	htcaps_mask->ht_capabilities_info |= msk;
   3083 
   3084 	return 0;
   3085 }
   3086 
   3087 
   3088 void wpa_supplicant_apply_ht_overrides(
   3089 	struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
   3090 	struct wpa_driver_associate_params *params)
   3091 {
   3092 	struct ieee80211_ht_capabilities *htcaps;
   3093 	struct ieee80211_ht_capabilities *htcaps_mask;
   3094 
   3095 	if (!ssid)
   3096 		return;
   3097 
   3098 	params->disable_ht = ssid->disable_ht;
   3099 	if (!params->htcaps || !params->htcaps_mask)
   3100 		return;
   3101 
   3102 	htcaps = (struct ieee80211_ht_capabilities *) params->htcaps;
   3103 	htcaps_mask = (struct ieee80211_ht_capabilities *) params->htcaps_mask;
   3104 	wpa_set_htcap_mcs(wpa_s, htcaps, htcaps_mask, ssid->ht_mcs);
   3105 	wpa_disable_max_amsdu(wpa_s, htcaps, htcaps_mask,
   3106 			      ssid->disable_max_amsdu);
   3107 	wpa_set_ampdu_factor(wpa_s, htcaps, htcaps_mask, ssid->ampdu_factor);
   3108 	wpa_set_ampdu_density(wpa_s, htcaps, htcaps_mask, ssid->ampdu_density);
   3109 	wpa_set_disable_ht40(wpa_s, htcaps, htcaps_mask, ssid->disable_ht40);
   3110 	wpa_set_disable_sgi(wpa_s, htcaps, htcaps_mask, ssid->disable_sgi);
   3111 	wpa_set_disable_ldpc(wpa_s, htcaps, htcaps_mask, ssid->disable_ldpc);
   3112 
   3113 	if (ssid->ht40_intolerant) {
   3114 		le16 bit = host_to_le16(HT_CAP_INFO_40MHZ_INTOLERANT);
   3115 		htcaps->ht_capabilities_info |= bit;
   3116 		htcaps_mask->ht_capabilities_info |= bit;
   3117 	}
   3118 }
   3119 
   3120 #endif /* CONFIG_HT_OVERRIDES */
   3121 
   3122 
   3123 #ifdef CONFIG_VHT_OVERRIDES
   3124 void wpa_supplicant_apply_vht_overrides(
   3125 	struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
   3126 	struct wpa_driver_associate_params *params)
   3127 {
   3128 	struct ieee80211_vht_capabilities *vhtcaps;
   3129 	struct ieee80211_vht_capabilities *vhtcaps_mask;
   3130 #ifdef CONFIG_HT_OVERRIDES
   3131 	int max_ampdu;
   3132 	const u32 max_ampdu_mask = VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX;
   3133 #endif /* CONFIG_HT_OVERRIDES */
   3134 
   3135 	if (!ssid)
   3136 		return;
   3137 
   3138 	params->disable_vht = ssid->disable_vht;
   3139 
   3140 	vhtcaps = (void *) params->vhtcaps;
   3141 	vhtcaps_mask = (void *) params->vhtcaps_mask;
   3142 
   3143 	if (!vhtcaps || !vhtcaps_mask)
   3144 		return;
   3145 
   3146 	vhtcaps->vht_capabilities_info = ssid->vht_capa;
   3147 	vhtcaps_mask->vht_capabilities_info = ssid->vht_capa_mask;
   3148 
   3149 #ifdef CONFIG_HT_OVERRIDES
   3150 	/* if max ampdu is <= 3, we have to make the HT cap the same */
   3151 	if (ssid->vht_capa_mask & max_ampdu_mask) {
   3152 		max_ampdu = (ssid->vht_capa & max_ampdu_mask) >>
   3153 			find_first_bit(max_ampdu_mask);
   3154 
   3155 		max_ampdu = max_ampdu < 3 ? max_ampdu : 3;
   3156 		wpa_set_ampdu_factor(wpa_s,
   3157 				     (void *) params->htcaps,
   3158 				     (void *) params->htcaps_mask,
   3159 				     max_ampdu);
   3160 	}
   3161 #endif /* CONFIG_HT_OVERRIDES */
   3162 
   3163 #define OVERRIDE_MCS(i)							\
   3164 	if (ssid->vht_tx_mcs_nss_ ##i >= 0) {				\
   3165 		vhtcaps_mask->vht_supported_mcs_set.tx_map |=		\
   3166 			3 << 2 * (i - 1);				\
   3167 		vhtcaps->vht_supported_mcs_set.tx_map |=		\
   3168 			ssid->vht_tx_mcs_nss_ ##i << 2 * (i - 1);	\
   3169 	}								\
   3170 	if (ssid->vht_rx_mcs_nss_ ##i >= 0) {				\
   3171 		vhtcaps_mask->vht_supported_mcs_set.rx_map |=		\
   3172 			3 << 2 * (i - 1);				\
   3173 		vhtcaps->vht_supported_mcs_set.rx_map |=		\
   3174 			ssid->vht_rx_mcs_nss_ ##i << 2 * (i - 1);	\
   3175 	}
   3176 
   3177 	OVERRIDE_MCS(1);
   3178 	OVERRIDE_MCS(2);
   3179 	OVERRIDE_MCS(3);
   3180 	OVERRIDE_MCS(4);
   3181 	OVERRIDE_MCS(5);
   3182 	OVERRIDE_MCS(6);
   3183 	OVERRIDE_MCS(7);
   3184 	OVERRIDE_MCS(8);
   3185 }
   3186 #endif /* CONFIG_VHT_OVERRIDES */
   3187 
   3188 
   3189 static int pcsc_reader_init(struct wpa_supplicant *wpa_s)
   3190 {
   3191 #ifdef PCSC_FUNCS
   3192 	size_t len;
   3193 
   3194 	if (!wpa_s->conf->pcsc_reader)
   3195 		return 0;
   3196 
   3197 	wpa_s->scard = scard_init(wpa_s->conf->pcsc_reader);
   3198 	if (!wpa_s->scard)
   3199 		return 1;
   3200 
   3201 	if (wpa_s->conf->pcsc_pin &&
   3202 	    scard_set_pin(wpa_s->scard, wpa_s->conf->pcsc_pin) < 0) {
   3203 		scard_deinit(wpa_s->scard);
   3204 		wpa_s->scard = NULL;
   3205 		wpa_msg(wpa_s, MSG_ERROR, "PC/SC PIN validation failed");
   3206 		return -1;
   3207 	}
   3208 
   3209 	len = sizeof(wpa_s->imsi) - 1;
   3210 	if (scard_get_imsi(wpa_s->scard, wpa_s->imsi, &len)) {
   3211 		scard_deinit(wpa_s->scard);
   3212 		wpa_s->scard = NULL;
   3213 		wpa_msg(wpa_s, MSG_ERROR, "Could not read IMSI");
   3214 		return -1;
   3215 	}
   3216 	wpa_s->imsi[len] = '\0';
   3217 
   3218 	wpa_s->mnc_len = scard_get_mnc_len(wpa_s->scard);
   3219 
   3220 	wpa_printf(MSG_DEBUG, "SCARD: IMSI %s (MNC length %d)",
   3221 		   wpa_s->imsi, wpa_s->mnc_len);
   3222 
   3223 	wpa_sm_set_scard_ctx(wpa_s->wpa, wpa_s->scard);
   3224 	eapol_sm_register_scard_ctx(wpa_s->eapol, wpa_s->scard);
   3225 #endif /* PCSC_FUNCS */
   3226 
   3227 	return 0;
   3228 }
   3229 
   3230 
   3231 int wpas_init_ext_pw(struct wpa_supplicant *wpa_s)
   3232 {
   3233 	char *val, *pos;
   3234 
   3235 	ext_password_deinit(wpa_s->ext_pw);
   3236 	wpa_s->ext_pw = NULL;
   3237 	eapol_sm_set_ext_pw_ctx(wpa_s->eapol, NULL);
   3238 
   3239 	if (!wpa_s->conf->ext_password_backend)
   3240 		return 0;
   3241 
   3242 	val = os_strdup(wpa_s->conf->ext_password_backend);
   3243 	if (val == NULL)
   3244 		return -1;
   3245 	pos = os_strchr(val, ':');
   3246 	if (pos)
   3247 		*pos++ = '\0';
   3248 
   3249 	wpa_printf(MSG_DEBUG, "EXT PW: Initialize backend '%s'", val);
   3250 
   3251 	wpa_s->ext_pw = ext_password_init(val, pos);
   3252 	os_free(val);
   3253 	if (wpa_s->ext_pw == NULL) {
   3254 		wpa_printf(MSG_DEBUG, "EXT PW: Failed to initialize backend");
   3255 		return -1;
   3256 	}
   3257 	eapol_sm_set_ext_pw_ctx(wpa_s->eapol, wpa_s->ext_pw);
   3258 
   3259 	return 0;
   3260 }
   3261 
   3262 
   3263 static int wpas_set_wowlan_triggers(struct wpa_supplicant *wpa_s,
   3264 				    struct wpa_driver_capa *capa)
   3265 {
   3266 	struct wowlan_triggers *triggers;
   3267 	int ret = 0;
   3268 
   3269 	if (!wpa_s->conf->wowlan_triggers)
   3270 		return 0;
   3271 
   3272 	triggers = wpa_get_wowlan_triggers(wpa_s->conf->wowlan_triggers, capa);
   3273 	if (triggers) {
   3274 		ret = wpa_drv_wowlan(wpa_s, triggers);
   3275 		os_free(triggers);
   3276 	}
   3277 	return ret;
   3278 }
   3279 
   3280 
   3281 static struct wpa_radio * radio_add_interface(struct wpa_supplicant *wpa_s,
   3282 					      const char *rn)
   3283 {
   3284 	struct wpa_supplicant *iface = wpa_s->global->ifaces;
   3285 	struct wpa_radio *radio;
   3286 
   3287 	while (rn && iface) {
   3288 		radio = iface->radio;
   3289 		if (radio && os_strcmp(rn, radio->name) == 0) {
   3290 			wpa_printf(MSG_DEBUG, "Add interface %s to existing radio %s",
   3291 				   wpa_s->ifname, rn);
   3292 			dl_list_add(&radio->ifaces, &wpa_s->radio_list);
   3293 			return radio;
   3294 		}
   3295 
   3296 		iface = iface->next;
   3297 	}
   3298 
   3299 	wpa_printf(MSG_DEBUG, "Add interface %s to a new radio %s",
   3300 		   wpa_s->ifname, rn ? rn : "N/A");
   3301 	radio = os_zalloc(sizeof(*radio));
   3302 	if (radio == NULL)
   3303 		return NULL;
   3304 
   3305 	if (rn)
   3306 		os_strlcpy(radio->name, rn, sizeof(radio->name));
   3307 	dl_list_init(&radio->ifaces);
   3308 	dl_list_init(&radio->work);
   3309 	dl_list_add(&radio->ifaces, &wpa_s->radio_list);
   3310 
   3311 	return radio;
   3312 }
   3313 
   3314 
   3315 static void radio_work_free(struct wpa_radio_work *work)
   3316 {
   3317 	if (work->wpa_s->scan_work == work) {
   3318 		/* This should not really happen. */
   3319 		wpa_dbg(work->wpa_s, MSG_INFO, "Freeing radio work '%s'@%p (started=%d) that is marked as scan_work",
   3320 			work->type, work, work->started);
   3321 		work->wpa_s->scan_work = NULL;
   3322 	}
   3323 
   3324 #ifdef CONFIG_P2P
   3325 	if (work->wpa_s->p2p_scan_work == work) {
   3326 		/* This should not really happen. */
   3327 		wpa_dbg(work->wpa_s, MSG_INFO, "Freeing radio work '%s'@%p (started=%d) that is marked as p2p_scan_work",
   3328 			work->type, work, work->started);
   3329 		work->wpa_s->p2p_scan_work = NULL;
   3330 	}
   3331 #endif /* CONFIG_P2P */
   3332 
   3333 	dl_list_del(&work->list);
   3334 	os_free(work);
   3335 }
   3336 
   3337 
   3338 static void radio_start_next_work(void *eloop_ctx, void *timeout_ctx)
   3339 {
   3340 	struct wpa_radio *radio = eloop_ctx;
   3341 	struct wpa_radio_work *work;
   3342 	struct os_reltime now, diff;
   3343 	struct wpa_supplicant *wpa_s;
   3344 
   3345 	work = dl_list_first(&radio->work, struct wpa_radio_work, list);
   3346 	if (work == NULL)
   3347 		return;
   3348 
   3349 	if (work->started)
   3350 		return; /* already started and still in progress */
   3351 
   3352 	wpa_s = dl_list_first(&radio->ifaces, struct wpa_supplicant,
   3353 			      radio_list);
   3354 	if (wpa_s && wpa_s->external_scan_running) {
   3355 		wpa_printf(MSG_DEBUG, "Delay radio work start until externally triggered scan completes");
   3356 		return;
   3357 	}
   3358 
   3359 	os_get_reltime(&now);
   3360 	os_reltime_sub(&now, &work->time, &diff);
   3361 	wpa_dbg(work->wpa_s, MSG_DEBUG, "Starting radio work '%s'@%p after %ld.%06ld second wait",
   3362 		work->type, work, diff.sec, diff.usec);
   3363 	work->started = 1;
   3364 	work->time = now;
   3365 	work->cb(work, 0);
   3366 }
   3367 
   3368 
   3369 /*
   3370  * This function removes both started and pending radio works running on
   3371  * the provided interface's radio.
   3372  * Prior to the removal of the radio work, its callback (cb) is called with
   3373  * deinit set to be 1. Each work's callback is responsible for clearing its
   3374  * internal data and restoring to a correct state.
   3375  * @wpa_s: wpa_supplicant data
   3376  * @type: type of works to be removed
   3377  * @remove_all: 1 to remove all the works on this radio, 0 to remove only
   3378  * this interface's works.
   3379  */
   3380 void radio_remove_works(struct wpa_supplicant *wpa_s,
   3381 			const char *type, int remove_all)
   3382 {
   3383 	struct wpa_radio_work *work, *tmp;
   3384 	struct wpa_radio *radio = wpa_s->radio;
   3385 
   3386 	dl_list_for_each_safe(work, tmp, &radio->work, struct wpa_radio_work,
   3387 			      list) {
   3388 		if (type && os_strcmp(type, work->type) != 0)
   3389 			continue;
   3390 
   3391 		/* skip other ifaces' works */
   3392 		if (!remove_all && work->wpa_s != wpa_s)
   3393 			continue;
   3394 
   3395 		wpa_dbg(wpa_s, MSG_DEBUG, "Remove radio work '%s'@%p%s",
   3396 			work->type, work, work->started ? " (started)" : "");
   3397 		work->cb(work, 1);
   3398 		radio_work_free(work);
   3399 	}
   3400 
   3401 	/* in case we removed the started work */
   3402 	radio_work_check_next(wpa_s);
   3403 }
   3404 
   3405 
   3406 static void radio_remove_interface(struct wpa_supplicant *wpa_s)
   3407 {
   3408 	struct wpa_radio *radio = wpa_s->radio;
   3409 
   3410 	if (!radio)
   3411 		return;
   3412 
   3413 	wpa_printf(MSG_DEBUG, "Remove interface %s from radio %s",
   3414 		   wpa_s->ifname, radio->name);
   3415 	dl_list_del(&wpa_s->radio_list);
   3416 	radio_remove_works(wpa_s, NULL, 0);
   3417 	wpa_s->radio = NULL;
   3418 	if (!dl_list_empty(&radio->ifaces))
   3419 		return; /* Interfaces remain for this radio */
   3420 
   3421 	wpa_printf(MSG_DEBUG, "Remove radio %s", radio->name);
   3422 	eloop_cancel_timeout(radio_start_next_work, radio, NULL);
   3423 	os_free(radio);
   3424 }
   3425 
   3426 
   3427 void radio_work_check_next(struct wpa_supplicant *wpa_s)
   3428 {
   3429 	struct wpa_radio *radio = wpa_s->radio;
   3430 
   3431 	if (dl_list_empty(&radio->work))
   3432 		return;
   3433 	eloop_cancel_timeout(radio_start_next_work, radio, NULL);
   3434 	eloop_register_timeout(0, 0, radio_start_next_work, radio, NULL);
   3435 }
   3436 
   3437 
   3438 /**
   3439  * radio_add_work - Add a radio work item
   3440  * @wpa_s: Pointer to wpa_supplicant data
   3441  * @freq: Frequency of the offchannel operation in MHz or 0
   3442  * @type: Unique identifier for each type of work
   3443  * @next: Force as the next work to be executed
   3444  * @cb: Callback function for indicating when radio is available
   3445  * @ctx: Context pointer for the work (work->ctx in cb())
   3446  * Returns: 0 on success, -1 on failure
   3447  *
   3448  * This function is used to request time for an operation that requires
   3449  * exclusive radio control. Once the radio is available, the registered callback
   3450  * function will be called. radio_work_done() must be called once the exclusive
   3451  * radio operation has been completed, so that the radio is freed for other
   3452  * operations. The special case of deinit=1 is used to free the context data
   3453  * during interface removal. That does not allow the callback function to start
   3454  * the radio operation, i.e., it must free any resources allocated for the radio
   3455  * work and return.
   3456  *
   3457  * The @freq parameter can be used to indicate a single channel on which the
   3458  * offchannel operation will occur. This may allow multiple radio work
   3459  * operations to be performed in parallel if they apply for the same channel.
   3460  * Setting this to 0 indicates that the work item may use multiple channels or
   3461  * requires exclusive control of the radio.
   3462  */
   3463 int radio_add_work(struct wpa_supplicant *wpa_s, unsigned int freq,
   3464 		   const char *type, int next,
   3465 		   void (*cb)(struct wpa_radio_work *work, int deinit),
   3466 		   void *ctx)
   3467 {
   3468 	struct wpa_radio_work *work;
   3469 	int was_empty;
   3470 
   3471 	work = os_zalloc(sizeof(*work));
   3472 	if (work == NULL)
   3473 		return -1;
   3474 	wpa_dbg(wpa_s, MSG_DEBUG, "Add radio work '%s'@%p", type, work);
   3475 	os_get_reltime(&work->time);
   3476 	work->freq = freq;
   3477 	work->type = type;
   3478 	work->wpa_s = wpa_s;
   3479 	work->cb = cb;
   3480 	work->ctx = ctx;
   3481 
   3482 	was_empty = dl_list_empty(&wpa_s->radio->work);
   3483 	if (next)
   3484 		dl_list_add(&wpa_s->radio->work, &work->list);
   3485 	else
   3486 		dl_list_add_tail(&wpa_s->radio->work, &work->list);
   3487 	if (was_empty) {
   3488 		wpa_dbg(wpa_s, MSG_DEBUG, "First radio work item in the queue - schedule start immediately");
   3489 		radio_work_check_next(wpa_s);
   3490 	}
   3491 
   3492 	return 0;
   3493 }
   3494 
   3495 
   3496 /**
   3497  * radio_work_done - Indicate that a radio work item has been completed
   3498  * @work: Completed work
   3499  *
   3500  * This function is called once the callback function registered with
   3501  * radio_add_work() has completed its work.
   3502  */
   3503 void radio_work_done(struct wpa_radio_work *work)
   3504 {
   3505 	struct wpa_supplicant *wpa_s = work->wpa_s;
   3506 	struct os_reltime now, diff;
   3507 	unsigned int started = work->started;
   3508 
   3509 	os_get_reltime(&now);
   3510 	os_reltime_sub(&now, &work->time, &diff);
   3511 	wpa_dbg(wpa_s, MSG_DEBUG, "Radio work '%s'@%p %s in %ld.%06ld seconds",
   3512 		work->type, work, started ? "done" : "canceled",
   3513 		diff.sec, diff.usec);
   3514 	radio_work_free(work);
   3515 	if (started)
   3516 		radio_work_check_next(wpa_s);
   3517 }
   3518 
   3519 
   3520 struct wpa_radio_work *
   3521 radio_work_pending(struct wpa_supplicant *wpa_s, const char *type)
   3522 {
   3523 	struct wpa_radio_work *work;
   3524 	struct wpa_radio *radio = wpa_s->radio;
   3525 
   3526 	dl_list_for_each(work, &radio->work, struct wpa_radio_work, list) {
   3527 		if (work->wpa_s == wpa_s && os_strcmp(work->type, type) == 0)
   3528 			return work;
   3529 	}
   3530 
   3531 	return NULL;
   3532 }
   3533 
   3534 
   3535 static int wpas_init_driver(struct wpa_supplicant *wpa_s,
   3536 			    struct wpa_interface *iface)
   3537 {
   3538 	const char *ifname, *driver, *rn;
   3539 
   3540 	driver = iface->driver;
   3541 next_driver:
   3542 	if (wpa_supplicant_set_driver(wpa_s, driver) < 0)
   3543 		return -1;
   3544 
   3545 	wpa_s->drv_priv = wpa_drv_init(wpa_s, wpa_s->ifname);
   3546 	if (wpa_s->drv_priv == NULL) {
   3547 		const char *pos;
   3548 		pos = driver ? os_strchr(driver, ',') : NULL;
   3549 		if (pos) {
   3550 			wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize "
   3551 				"driver interface - try next driver wrapper");
   3552 			driver = pos + 1;
   3553 			goto next_driver;
   3554 		}
   3555 		wpa_msg(wpa_s, MSG_ERROR, "Failed to initialize driver "
   3556 			"interface");
   3557 		return -1;
   3558 	}
   3559 	if (wpa_drv_set_param(wpa_s, wpa_s->conf->driver_param) < 0) {
   3560 		wpa_msg(wpa_s, MSG_ERROR, "Driver interface rejected "
   3561 			"driver_param '%s'", wpa_s->conf->driver_param);
   3562 		return -1;
   3563 	}
   3564 
   3565 	ifname = wpa_drv_get_ifname(wpa_s);
   3566 	if (ifname && os_strcmp(ifname, wpa_s->ifname) != 0) {
   3567 		wpa_dbg(wpa_s, MSG_DEBUG, "Driver interface replaced "
   3568 			"interface name with '%s'", ifname);
   3569 		os_strlcpy(wpa_s->ifname, ifname, sizeof(wpa_s->ifname));
   3570 	}
   3571 
   3572 	rn = wpa_driver_get_radio_name(wpa_s);
   3573 	if (rn && rn[0] == '\0')
   3574 		rn = NULL;
   3575 
   3576 	wpa_s->radio = radio_add_interface(wpa_s, rn);
   3577 	if (wpa_s->radio == NULL)
   3578 		return -1;
   3579 
   3580 	return 0;
   3581 }
   3582 
   3583 
   3584 static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
   3585 				     struct wpa_interface *iface)
   3586 {
   3587 	struct wpa_driver_capa capa;
   3588 
   3589 	wpa_printf(MSG_DEBUG, "Initializing interface '%s' conf '%s' driver "
   3590 		   "'%s' ctrl_interface '%s' bridge '%s'", iface->ifname,
   3591 		   iface->confname ? iface->confname : "N/A",
   3592 		   iface->driver ? iface->driver : "default",
   3593 		   iface->ctrl_interface ? iface->ctrl_interface : "N/A",
   3594 		   iface->bridge_ifname ? iface->bridge_ifname : "N/A");
   3595 
   3596 	if (iface->confname) {
   3597 #ifdef CONFIG_BACKEND_FILE
   3598 		wpa_s->confname = os_rel2abs_path(iface->confname);
   3599 		if (wpa_s->confname == NULL) {
   3600 			wpa_printf(MSG_ERROR, "Failed to get absolute path "
   3601 				   "for configuration file '%s'.",
   3602 				   iface->confname);
   3603 			return -1;
   3604 		}
   3605 		wpa_printf(MSG_DEBUG, "Configuration file '%s' -> '%s'",
   3606 			   iface->confname, wpa_s->confname);
   3607 #else /* CONFIG_BACKEND_FILE */
   3608 		wpa_s->confname = os_strdup(iface->confname);
   3609 #endif /* CONFIG_BACKEND_FILE */
   3610 		wpa_s->conf = wpa_config_read(wpa_s->confname, NULL);
   3611 		if (wpa_s->conf == NULL) {
   3612 			wpa_printf(MSG_ERROR, "Failed to read or parse "
   3613 				   "configuration '%s'.", wpa_s->confname);
   3614 			return -1;
   3615 		}
   3616 		wpa_s->confanother = os_rel2abs_path(iface->confanother);
   3617 		wpa_config_read(wpa_s->confanother, wpa_s->conf);
   3618 
   3619 		/*
   3620 		 * Override ctrl_interface and driver_param if set on command
   3621 		 * line.
   3622 		 */
   3623 		if (iface->ctrl_interface) {
   3624 			os_free(wpa_s->conf->ctrl_interface);
   3625 			wpa_s->conf->ctrl_interface =
   3626 				os_strdup(iface->ctrl_interface);
   3627 		}
   3628 
   3629 		if (iface->driver_param) {
   3630 			os_free(wpa_s->conf->driver_param);
   3631 			wpa_s->conf->driver_param =
   3632 				os_strdup(iface->driver_param);
   3633 		}
   3634 
   3635 		if (iface->p2p_mgmt && !iface->ctrl_interface) {
   3636 			os_free(wpa_s->conf->ctrl_interface);
   3637 			wpa_s->conf->ctrl_interface = NULL;
   3638 		}
   3639 	} else
   3640 		wpa_s->conf = wpa_config_alloc_empty(iface->ctrl_interface,
   3641 						     iface->driver_param);
   3642 
   3643 	if (wpa_s->conf == NULL) {
   3644 		wpa_printf(MSG_ERROR, "\nNo configuration found.");
   3645 		return -1;
   3646 	}
   3647 
   3648 	if (iface->ifname == NULL) {
   3649 		wpa_printf(MSG_ERROR, "\nInterface name is required.");
   3650 		return -1;
   3651 	}
   3652 	if (os_strlen(iface->ifname) >= sizeof(wpa_s->ifname)) {
   3653 		wpa_printf(MSG_ERROR, "\nToo long interface name '%s'.",
   3654 			   iface->ifname);
   3655 		return -1;
   3656 	}
   3657 	os_strlcpy(wpa_s->ifname, iface->ifname, sizeof(wpa_s->ifname));
   3658 
   3659 	if (iface->bridge_ifname) {
   3660 		if (os_strlen(iface->bridge_ifname) >=
   3661 		    sizeof(wpa_s->bridge_ifname)) {
   3662 			wpa_printf(MSG_ERROR, "\nToo long bridge interface "
   3663 				   "name '%s'.", iface->bridge_ifname);
   3664 			return -1;
   3665 		}
   3666 		os_strlcpy(wpa_s->bridge_ifname, iface->bridge_ifname,
   3667 			   sizeof(wpa_s->bridge_ifname));
   3668 	}
   3669 
   3670 	/* RSNA Supplicant Key Management - INITIALIZE */
   3671 	eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
   3672 	eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
   3673 
   3674 	/* Initialize driver interface and register driver event handler before
   3675 	 * L2 receive handler so that association events are processed before
   3676 	 * EAPOL-Key packets if both become available for the same select()
   3677 	 * call. */
   3678 	if (wpas_init_driver(wpa_s, iface) < 0)
   3679 		return -1;
   3680 
   3681 	if (wpa_supplicant_init_wpa(wpa_s) < 0)
   3682 		return -1;
   3683 
   3684 	wpa_sm_set_ifname(wpa_s->wpa, wpa_s->ifname,
   3685 			  wpa_s->bridge_ifname[0] ? wpa_s->bridge_ifname :
   3686 			  NULL);
   3687 	wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
   3688 
   3689 	if (wpa_s->conf->dot11RSNAConfigPMKLifetime &&
   3690 	    wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_LIFETIME,
   3691 			     wpa_s->conf->dot11RSNAConfigPMKLifetime)) {
   3692 		wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
   3693 			"dot11RSNAConfigPMKLifetime");
   3694 		return -1;
   3695 	}
   3696 
   3697 	if (wpa_s->conf->dot11RSNAConfigPMKReauthThreshold &&
   3698 	    wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_REAUTH_THRESHOLD,
   3699 			     wpa_s->conf->dot11RSNAConfigPMKReauthThreshold)) {
   3700 		wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
   3701 			"dot11RSNAConfigPMKReauthThreshold");
   3702 		return -1;
   3703 	}
   3704 
   3705 	if (wpa_s->conf->dot11RSNAConfigSATimeout &&
   3706 	    wpa_sm_set_param(wpa_s->wpa, RSNA_SA_TIMEOUT,
   3707 			     wpa_s->conf->dot11RSNAConfigSATimeout)) {
   3708 		wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
   3709 			"dot11RSNAConfigSATimeout");
   3710 		return -1;
   3711 	}
   3712 
   3713 	wpa_s->hw.modes = wpa_drv_get_hw_feature_data(wpa_s,
   3714 						      &wpa_s->hw.num_modes,
   3715 						      &wpa_s->hw.flags);
   3716 
   3717 	if (wpa_drv_get_capa(wpa_s, &capa) == 0) {
   3718 		wpa_s->drv_capa_known = 1;
   3719 		wpa_s->drv_flags = capa.flags;
   3720 		wpa_s->drv_enc = capa.enc;
   3721 		wpa_s->probe_resp_offloads = capa.probe_resp_offloads;
   3722 		wpa_s->max_scan_ssids = capa.max_scan_ssids;
   3723 		wpa_s->max_sched_scan_ssids = capa.max_sched_scan_ssids;
   3724 		wpa_s->sched_scan_supported = capa.sched_scan_supported;
   3725 		wpa_s->max_match_sets = capa.max_match_sets;
   3726 		wpa_s->max_remain_on_chan = capa.max_remain_on_chan;
   3727 		wpa_s->max_stations = capa.max_stations;
   3728 		wpa_s->extended_capa = capa.extended_capa;
   3729 		wpa_s->extended_capa_mask = capa.extended_capa_mask;
   3730 		wpa_s->extended_capa_len = capa.extended_capa_len;
   3731 		wpa_s->num_multichan_concurrent =
   3732 			capa.num_multichan_concurrent;
   3733 	}
   3734 	if (wpa_s->max_remain_on_chan == 0)
   3735 		wpa_s->max_remain_on_chan = 1000;
   3736 
   3737 	/*
   3738 	 * Only take p2p_mgmt parameters when P2P Device is supported.
   3739 	 * Doing it here as it determines whether l2_packet_init() will be done
   3740 	 * during wpa_supplicant_driver_init().
   3741 	 */
   3742 	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)
   3743 		wpa_s->p2p_mgmt = iface->p2p_mgmt;
   3744 	else
   3745 		iface->p2p_mgmt = 1;
   3746 
   3747 	if (wpa_s->num_multichan_concurrent == 0)
   3748 		wpa_s->num_multichan_concurrent = 1;
   3749 
   3750 	if (wpa_supplicant_driver_init(wpa_s) < 0)
   3751 		return -1;
   3752 
   3753 #ifdef CONFIG_TDLS
   3754 	if ((!iface->p2p_mgmt ||
   3755 	     !(wpa_s->drv_flags &
   3756 	       WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)) &&
   3757 	    wpa_tdls_init(wpa_s->wpa))
   3758 		return -1;
   3759 #endif /* CONFIG_TDLS */
   3760 
   3761 	if (wpa_s->conf->country[0] && wpa_s->conf->country[1] &&
   3762 	    wpa_drv_set_country(wpa_s, wpa_s->conf->country)) {
   3763 		wpa_dbg(wpa_s, MSG_DEBUG, "Failed to set country");
   3764 		return -1;
   3765 	}
   3766 
   3767 	if (wpas_wps_init(wpa_s))
   3768 		return -1;
   3769 
   3770 	if (wpa_supplicant_init_eapol(wpa_s) < 0)
   3771 		return -1;
   3772 	wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
   3773 
   3774 	wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
   3775 	if (wpa_s->ctrl_iface == NULL) {
   3776 		wpa_printf(MSG_ERROR,
   3777 			   "Failed to initialize control interface '%s'.\n"
   3778 			   "You may have another wpa_supplicant process "
   3779 			   "already running or the file was\n"
   3780 			   "left by an unclean termination of wpa_supplicant "
   3781 			   "in which case you will need\n"
   3782 			   "to manually remove this file before starting "
   3783 			   "wpa_supplicant again.\n",
   3784 			   wpa_s->conf->ctrl_interface);
   3785 		return -1;
   3786 	}
   3787 
   3788 	wpa_s->gas = gas_query_init(wpa_s);
   3789 	if (wpa_s->gas == NULL) {
   3790 		wpa_printf(MSG_ERROR, "Failed to initialize GAS query");
   3791 		return -1;
   3792 	}
   3793 
   3794 	if (iface->p2p_mgmt && wpas_p2p_init(wpa_s->global, wpa_s) < 0) {
   3795 		wpa_msg(wpa_s, MSG_ERROR, "Failed to init P2P");
   3796 		return -1;
   3797 	}
   3798 
   3799 	if (wpa_bss_init(wpa_s) < 0)
   3800 		return -1;
   3801 
   3802 	/*
   3803 	 * Set Wake-on-WLAN triggers, if configured.
   3804 	 * Note: We don't restore/remove the triggers on shutdown (it doesn't
   3805 	 * have effect anyway when the interface is down).
   3806 	 */
   3807 	if (wpas_set_wowlan_triggers(wpa_s, &capa) < 0)
   3808 		return -1;
   3809 
   3810 #ifdef CONFIG_EAP_PROXY
   3811 {
   3812 	size_t len;
   3813 	wpa_s->mnc_len = eapol_sm_get_eap_proxy_imsi(wpa_s->eapol, wpa_s->imsi,
   3814 						     &len);
   3815 	if (wpa_s->mnc_len > 0) {
   3816 		wpa_s->imsi[len] = '\0';
   3817 		wpa_printf(MSG_DEBUG, "eap_proxy: IMSI %s (MNC length %d)",
   3818 			   wpa_s->imsi, wpa_s->mnc_len);
   3819 	} else {
   3820 		wpa_printf(MSG_DEBUG, "eap_proxy: IMSI not available");
   3821 	}
   3822 }
   3823 #endif /* CONFIG_EAP_PROXY */
   3824 
   3825 	if (pcsc_reader_init(wpa_s) < 0)
   3826 		return -1;
   3827 
   3828 	if (wpas_init_ext_pw(wpa_s) < 0)
   3829 		return -1;
   3830 
   3831 	return 0;
   3832 }
   3833 
   3834 
   3835 static void wpa_supplicant_deinit_iface(struct wpa_supplicant *wpa_s,
   3836 					int notify, int terminate)
   3837 {
   3838 	wpa_s->disconnected = 1;
   3839 	if (wpa_s->drv_priv) {
   3840 		wpa_supplicant_deauthenticate(wpa_s,
   3841 					      WLAN_REASON_DEAUTH_LEAVING);
   3842 
   3843 		wpa_drv_set_countermeasures(wpa_s, 0);
   3844 		wpa_clear_keys(wpa_s, NULL);
   3845 	}
   3846 
   3847 	wpa_supplicant_cleanup(wpa_s);
   3848 	wpas_p2p_deinit_iface(wpa_s);
   3849 
   3850 	wpas_ctrl_radio_work_flush(wpa_s);
   3851 	radio_remove_interface(wpa_s);
   3852 
   3853 	if (wpa_s->drv_priv)
   3854 		wpa_drv_deinit(wpa_s);
   3855 
   3856 	if (notify)
   3857 		wpas_notify_iface_removed(wpa_s);
   3858 
   3859 	if (terminate)
   3860 		wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TERMINATING);
   3861 
   3862 	if (wpa_s->ctrl_iface) {
   3863 		wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
   3864 		wpa_s->ctrl_iface = NULL;
   3865 	}
   3866 
   3867 	if (wpa_s->conf != NULL) {
   3868 		wpa_config_free(wpa_s->conf);
   3869 		wpa_s->conf = NULL;
   3870 	}
   3871 
   3872 	os_free(wpa_s);
   3873 }
   3874 
   3875 
   3876 /**
   3877  * wpa_supplicant_add_iface - Add a new network interface
   3878  * @global: Pointer to global data from wpa_supplicant_init()
   3879  * @iface: Interface configuration options
   3880  * Returns: Pointer to the created interface or %NULL on failure
   3881  *
   3882  * This function is used to add new network interfaces for %wpa_supplicant.
   3883  * This can be called before wpa_supplicant_run() to add interfaces before the
   3884  * main event loop has been started. In addition, new interfaces can be added
   3885  * dynamically while %wpa_supplicant is already running. This could happen,
   3886  * e.g., when a hotplug network adapter is inserted.
   3887  */
   3888 struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
   3889 						 struct wpa_interface *iface)
   3890 {
   3891 	struct wpa_supplicant *wpa_s;
   3892 	struct wpa_interface t_iface;
   3893 	struct wpa_ssid *ssid;
   3894 
   3895 	if (global == NULL || iface == NULL)
   3896 		return NULL;
   3897 
   3898 	wpa_s = wpa_supplicant_alloc();
   3899 	if (wpa_s == NULL)
   3900 		return NULL;
   3901 
   3902 	wpa_s->global = global;
   3903 
   3904 	t_iface = *iface;
   3905 	if (global->params.override_driver) {
   3906 		wpa_printf(MSG_DEBUG, "Override interface parameter: driver "
   3907 			   "('%s' -> '%s')",
   3908 			   iface->driver, global->params.override_driver);
   3909 		t_iface.driver = global->params.override_driver;
   3910 	}
   3911 	if (global->params.override_ctrl_interface) {
   3912 		wpa_printf(MSG_DEBUG, "Override interface parameter: "
   3913 			   "ctrl_interface ('%s' -> '%s')",
   3914 			   iface->ctrl_interface,
   3915 			   global->params.override_ctrl_interface);
   3916 		t_iface.ctrl_interface =
   3917 			global->params.override_ctrl_interface;
   3918 	}
   3919 	if (wpa_supplicant_init_iface(wpa_s, &t_iface)) {
   3920 		wpa_printf(MSG_DEBUG, "Failed to add interface %s",
   3921 			   iface->ifname);
   3922 		wpa_supplicant_deinit_iface(wpa_s, 0, 0);
   3923 		return NULL;
   3924 	}
   3925 
   3926 	/* Notify the control interfaces about new iface */
   3927 	if (wpas_notify_iface_added(wpa_s)) {
   3928 		wpa_supplicant_deinit_iface(wpa_s, 1, 0);
   3929 		return NULL;
   3930 	}
   3931 
   3932 	for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
   3933 		wpas_notify_network_added(wpa_s, ssid);
   3934 
   3935 	wpa_s->next = global->ifaces;
   3936 	global->ifaces = wpa_s;
   3937 
   3938 	wpa_dbg(wpa_s, MSG_DEBUG, "Added interface %s", wpa_s->ifname);
   3939 	wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
   3940 
   3941 	return wpa_s;
   3942 }
   3943 
   3944 
   3945 /**
   3946  * wpa_supplicant_remove_iface - Remove a network interface
   3947  * @global: Pointer to global data from wpa_supplicant_init()
   3948  * @wpa_s: Pointer to the network interface to be removed
   3949  * Returns: 0 if interface was removed, -1 if interface was not found
   3950  *
   3951  * This function can be used to dynamically remove network interfaces from
   3952  * %wpa_supplicant, e.g., when a hotplug network adapter is ejected. In
   3953  * addition, this function is used to remove all remaining interfaces when
   3954  * %wpa_supplicant is terminated.
   3955  */
   3956 int wpa_supplicant_remove_iface(struct wpa_global *global,
   3957 				struct wpa_supplicant *wpa_s,
   3958 				int terminate)
   3959 {
   3960 	struct wpa_supplicant *prev;
   3961 
   3962 	/* Remove interface from the global list of interfaces */
   3963 	prev = global->ifaces;
   3964 	if (prev == wpa_s) {
   3965 		global->ifaces = wpa_s->next;
   3966 	} else {
   3967 		while (prev && prev->next != wpa_s)
   3968 			prev = prev->next;
   3969 		if (prev == NULL)
   3970 			return -1;
   3971 		prev->next = wpa_s->next;
   3972 	}
   3973 
   3974 	wpa_dbg(wpa_s, MSG_DEBUG, "Removing interface %s", wpa_s->ifname);
   3975 
   3976 	if (global->p2p_group_formation == wpa_s)
   3977 		global->p2p_group_formation = NULL;
   3978 	if (global->p2p_invite_group == wpa_s)
   3979 		global->p2p_invite_group = NULL;
   3980 	wpa_supplicant_deinit_iface(wpa_s, 1, terminate);
   3981 
   3982 	return 0;
   3983 }
   3984 
   3985 
   3986 /**
   3987  * wpa_supplicant_get_eap_mode - Get the current EAP mode
   3988  * @wpa_s: Pointer to the network interface
   3989  * Returns: Pointer to the eap mode or the string "UNKNOWN" if not found
   3990  */
   3991 const char * wpa_supplicant_get_eap_mode(struct wpa_supplicant *wpa_s)
   3992 {
   3993 	const char *eapol_method;
   3994 
   3995         if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) == 0 &&
   3996             wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
   3997 		return "NO-EAP";
   3998 	}
   3999 
   4000 	eapol_method = eapol_sm_get_method_name(wpa_s->eapol);
   4001 	if (eapol_method == NULL)
   4002 		return "UNKNOWN-EAP";
   4003 
   4004 	return eapol_method;
   4005 }
   4006 
   4007 
   4008 /**
   4009  * wpa_supplicant_get_iface - Get a new network interface
   4010  * @global: Pointer to global data from wpa_supplicant_init()
   4011  * @ifname: Interface name
   4012  * Returns: Pointer to the interface or %NULL if not found
   4013  */
   4014 struct wpa_supplicant * wpa_supplicant_get_iface(struct wpa_global *global,
   4015 						 const char *ifname)
   4016 {
   4017 	struct wpa_supplicant *wpa_s;
   4018 
   4019 	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
   4020 		if (os_strcmp(wpa_s->ifname, ifname) == 0)
   4021 			return wpa_s;
   4022 	}
   4023 	return NULL;
   4024 }
   4025 
   4026 
   4027 #ifndef CONFIG_NO_WPA_MSG
   4028 static const char * wpa_supplicant_msg_ifname_cb(void *ctx)
   4029 {
   4030 	struct wpa_supplicant *wpa_s = ctx;
   4031 	if (wpa_s == NULL)
   4032 		return NULL;
   4033 	return wpa_s->ifname;
   4034 }
   4035 #endif /* CONFIG_NO_WPA_MSG */
   4036 
   4037 
   4038 /**
   4039  * wpa_supplicant_init - Initialize %wpa_supplicant
   4040  * @params: Parameters for %wpa_supplicant
   4041  * Returns: Pointer to global %wpa_supplicant data, or %NULL on failure
   4042  *
   4043  * This function is used to initialize %wpa_supplicant. After successful
   4044  * initialization, the returned data pointer can be used to add and remove
   4045  * network interfaces, and eventually, to deinitialize %wpa_supplicant.
   4046  */
   4047 struct wpa_global * wpa_supplicant_init(struct wpa_params *params)
   4048 {
   4049 	struct wpa_global *global;
   4050 	int ret, i;
   4051 
   4052 	if (params == NULL)
   4053 		return NULL;
   4054 
   4055 #ifdef CONFIG_DRIVER_NDIS
   4056 	{
   4057 		void driver_ndis_init_ops(void);
   4058 		driver_ndis_init_ops();
   4059 	}
   4060 #endif /* CONFIG_DRIVER_NDIS */
   4061 
   4062 #ifndef CONFIG_NO_WPA_MSG
   4063 	wpa_msg_register_ifname_cb(wpa_supplicant_msg_ifname_cb);
   4064 #endif /* CONFIG_NO_WPA_MSG */
   4065 
   4066 	wpa_debug_open_file(params->wpa_debug_file_path);
   4067 	if (params->wpa_debug_syslog)
   4068 		wpa_debug_open_syslog();
   4069 	if (params->wpa_debug_tracing) {
   4070 		ret = wpa_debug_open_linux_tracing();
   4071 		if (ret) {
   4072 			wpa_printf(MSG_ERROR,
   4073 				   "Failed to enable trace logging");
   4074 			return NULL;
   4075 		}
   4076 	}
   4077 
   4078 	ret = eap_register_methods();
   4079 	if (ret) {
   4080 		wpa_printf(MSG_ERROR, "Failed to register EAP methods");
   4081 		if (ret == -2)
   4082 			wpa_printf(MSG_ERROR, "Two or more EAP methods used "
   4083 				   "the same EAP type.");
   4084 		return NULL;
   4085 	}
   4086 
   4087 	global = os_zalloc(sizeof(*global));
   4088 	if (global == NULL)
   4089 		return NULL;
   4090 	dl_list_init(&global->p2p_srv_bonjour);
   4091 	dl_list_init(&global->p2p_srv_upnp);
   4092 	global->params.daemonize = params->daemonize;
   4093 	global->params.wait_for_monitor = params->wait_for_monitor;
   4094 	global->params.dbus_ctrl_interface = params->dbus_ctrl_interface;
   4095 	if (params->pid_file)
   4096 		global->params.pid_file = os_strdup(params->pid_file);
   4097 	if (params->ctrl_interface)
   4098 		global->params.ctrl_interface =
   4099 			os_strdup(params->ctrl_interface);
   4100 	if (params->ctrl_interface_group)
   4101 		global->params.ctrl_interface_group =
   4102 			os_strdup(params->ctrl_interface_group);
   4103 	if (params->override_driver)
   4104 		global->params.override_driver =
   4105 			os_strdup(params->override_driver);
   4106 	if (params->override_ctrl_interface)
   4107 		global->params.override_ctrl_interface =
   4108 			os_strdup(params->override_ctrl_interface);
   4109 	wpa_debug_level = global->params.wpa_debug_level =
   4110 		params->wpa_debug_level;
   4111 	wpa_debug_show_keys = global->params.wpa_debug_show_keys =
   4112 		params->wpa_debug_show_keys;
   4113 	wpa_debug_timestamp = global->params.wpa_debug_timestamp =
   4114 		params->wpa_debug_timestamp;
   4115 
   4116 	wpa_printf(MSG_DEBUG, "wpa_supplicant v" VERSION_STR);
   4117 
   4118 	if (eloop_init()) {
   4119 		wpa_printf(MSG_ERROR, "Failed to initialize event loop");
   4120 		wpa_supplicant_deinit(global);
   4121 		return NULL;
   4122 	}
   4123 
   4124 	random_init(params->entropy_file);
   4125 
   4126 	global->ctrl_iface = wpa_supplicant_global_ctrl_iface_init(global);
   4127 	if (global->ctrl_iface == NULL) {
   4128 		wpa_supplicant_deinit(global);
   4129 		return NULL;
   4130 	}
   4131 
   4132 	if (wpas_notify_supplicant_initialized(global)) {
   4133 		wpa_supplicant_deinit(global);
   4134 		return NULL;
   4135 	}
   4136 
   4137 	for (i = 0; wpa_drivers[i]; i++)
   4138 		global->drv_count++;
   4139 	if (global->drv_count == 0) {
   4140 		wpa_printf(MSG_ERROR, "No drivers enabled");
   4141 		wpa_supplicant_deinit(global);
   4142 		return NULL;
   4143 	}
   4144 	global->drv_priv = os_zalloc(global->drv_count * sizeof(void *));
   4145 	if (global->drv_priv == NULL) {
   4146 		wpa_supplicant_deinit(global);
   4147 		return NULL;
   4148 	}
   4149 
   4150 #ifdef CONFIG_WIFI_DISPLAY
   4151 	if (wifi_display_init(global) < 0) {
   4152 		wpa_printf(MSG_ERROR, "Failed to initialize Wi-Fi Display");
   4153 		wpa_supplicant_deinit(global);
   4154 		return NULL;
   4155 	}
   4156 #endif /* CONFIG_WIFI_DISPLAY */
   4157 
   4158 	return global;
   4159 }
   4160 
   4161 
   4162 /**
   4163  * wpa_supplicant_run - Run the %wpa_supplicant main event loop
   4164  * @global: Pointer to global data from wpa_supplicant_init()
   4165  * Returns: 0 after successful event loop run, -1 on failure
   4166  *
   4167  * This function starts the main event loop and continues running as long as
   4168  * there are any remaining events. In most cases, this function is running as
   4169  * long as the %wpa_supplicant process in still in use.
   4170  */
   4171 int wpa_supplicant_run(struct wpa_global *global)
   4172 {
   4173 	struct wpa_supplicant *wpa_s;
   4174 
   4175 	if (global->params.daemonize &&
   4176 	    wpa_supplicant_daemon(global->params.pid_file))
   4177 		return -1;
   4178 
   4179 	if (global->params.wait_for_monitor) {
   4180 		for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
   4181 			if (wpa_s->ctrl_iface)
   4182 				wpa_supplicant_ctrl_iface_wait(
   4183 					wpa_s->ctrl_iface);
   4184 	}
   4185 
   4186 	eloop_register_signal_terminate(wpa_supplicant_terminate, global);
   4187 	eloop_register_signal_reconfig(wpa_supplicant_reconfig, global);
   4188 
   4189 	eloop_run();
   4190 
   4191 	return 0;
   4192 }
   4193 
   4194 
   4195 /**
   4196  * wpa_supplicant_deinit - Deinitialize %wpa_supplicant
   4197  * @global: Pointer to global data from wpa_supplicant_init()
   4198  *
   4199  * This function is called to deinitialize %wpa_supplicant and to free all
   4200  * allocated resources. Remaining network interfaces will also be removed.
   4201  */
   4202 void wpa_supplicant_deinit(struct wpa_global *global)
   4203 {
   4204 	int i;
   4205 
   4206 	if (global == NULL)
   4207 		return;
   4208 
   4209 #ifdef CONFIG_WIFI_DISPLAY
   4210 	wifi_display_deinit(global);
   4211 #endif /* CONFIG_WIFI_DISPLAY */
   4212 
   4213 	while (global->ifaces)
   4214 		wpa_supplicant_remove_iface(global, global->ifaces, 1);
   4215 
   4216 	if (global->ctrl_iface)
   4217 		wpa_supplicant_global_ctrl_iface_deinit(global->ctrl_iface);
   4218 
   4219 	wpas_notify_supplicant_deinitialized(global);
   4220 
   4221 	eap_peer_unregister_methods();
   4222 #ifdef CONFIG_AP
   4223 	eap_server_unregister_methods();
   4224 #endif /* CONFIG_AP */
   4225 
   4226 	for (i = 0; wpa_drivers[i] && global->drv_priv; i++) {
   4227 		if (!global->drv_priv[i])
   4228 			continue;
   4229 		wpa_drivers[i]->global_deinit(global->drv_priv[i]);
   4230 	}
   4231 	os_free(global->drv_priv);
   4232 
   4233 	random_deinit();
   4234 
   4235 	eloop_destroy();
   4236 
   4237 	if (global->params.pid_file) {
   4238 		os_daemonize_terminate(global->params.pid_file);
   4239 		os_free(global->params.pid_file);
   4240 	}
   4241 	os_free(global->params.ctrl_interface);
   4242 	os_free(global->params.ctrl_interface_group);
   4243 	os_free(global->params.override_driver);
   4244 	os_free(global->params.override_ctrl_interface);
   4245 
   4246 	os_free(global->p2p_disallow_freq.range);
   4247 	os_free(global->p2p_go_avoid_freq.range);
   4248 	os_free(global->add_psk);
   4249 
   4250 	os_free(global);
   4251 	wpa_debug_close_syslog();
   4252 	wpa_debug_close_file();
   4253 	wpa_debug_close_linux_tracing();
   4254 }
   4255 
   4256 
   4257 void wpa_supplicant_update_config(struct wpa_supplicant *wpa_s)
   4258 {
   4259 	if ((wpa_s->conf->changed_parameters & CFG_CHANGED_COUNTRY) &&
   4260 	    wpa_s->conf->country[0] && wpa_s->conf->country[1]) {
   4261 		char country[3];
   4262 		country[0] = wpa_s->conf->country[0];
   4263 		country[1] = wpa_s->conf->country[1];
   4264 		country[2] = '\0';
   4265 		if (wpa_drv_set_country(wpa_s, country) < 0) {
   4266 			wpa_printf(MSG_ERROR, "Failed to set country code "
   4267 				   "'%s'", country);
   4268 		}
   4269 	}
   4270 
   4271 	if (wpa_s->conf->changed_parameters & CFG_CHANGED_EXT_PW_BACKEND)
   4272 		wpas_init_ext_pw(wpa_s);
   4273 
   4274 #ifdef CONFIG_WPS
   4275 	wpas_wps_update_config(wpa_s);
   4276 #endif /* CONFIG_WPS */
   4277 	wpas_p2p_update_config(wpa_s);
   4278 	wpa_s->conf->changed_parameters = 0;
   4279 }
   4280 
   4281 
   4282 static void add_freq(int *freqs, int *num_freqs, int freq)
   4283 {
   4284 	int i;
   4285 
   4286 	for (i = 0; i < *num_freqs; i++) {
   4287 		if (freqs[i] == freq)
   4288 			return;
   4289 	}
   4290 
   4291 	freqs[*num_freqs] = freq;
   4292 	(*num_freqs)++;
   4293 }
   4294 
   4295 
   4296 static int * get_bss_freqs_in_ess(struct wpa_supplicant *wpa_s)
   4297 {
   4298 	struct wpa_bss *bss, *cbss;
   4299 	const int max_freqs = 10;
   4300 	int *freqs;
   4301 	int num_freqs = 0;
   4302 
   4303 	freqs = os_zalloc(sizeof(int) * (max_freqs + 1));
   4304 	if (freqs == NULL)
   4305 		return NULL;
   4306 
   4307 	cbss = wpa_s->current_bss;
   4308 
   4309 	dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
   4310 		if (bss == cbss)
   4311 			continue;
   4312 		if (bss->ssid_len == cbss->ssid_len &&
   4313 		    os_memcmp(bss->ssid, cbss->ssid, bss->ssid_len) == 0 &&
   4314 		    wpa_blacklist_get(wpa_s, bss->bssid) == NULL) {
   4315 			add_freq(freqs, &num_freqs, bss->freq);
   4316 			if (num_freqs == max_freqs)
   4317 				break;
   4318 		}
   4319 	}
   4320 
   4321 	if (num_freqs == 0) {
   4322 		os_free(freqs);
   4323 		freqs = NULL;
   4324 	}
   4325 
   4326 	return freqs;
   4327 }
   4328 
   4329 
   4330 void wpas_connection_failed(struct wpa_supplicant *wpa_s, const u8 *bssid)
   4331 {
   4332 	int timeout;
   4333 	int count;
   4334 	int *freqs = NULL;
   4335 
   4336 	wpas_connect_work_done(wpa_s);
   4337 
   4338 	/*
   4339 	 * Remove possible authentication timeout since the connection failed.
   4340 	 */
   4341 	eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
   4342 
   4343 	if (wpa_s->disconnected) {
   4344 		/*
   4345 		 * There is no point in blacklisting the AP if this event is
   4346 		 * generated based on local request to disconnect.
   4347 		 */
   4348 		wpa_dbg(wpa_s, MSG_DEBUG, "Ignore connection failure "
   4349 			"indication since interface has been put into "
   4350 			"disconnected state");
   4351 		return;
   4352 	}
   4353 
   4354 	/*
   4355 	 * Add the failed BSSID into the blacklist and speed up next scan
   4356 	 * attempt if there could be other APs that could accept association.
   4357 	 * The current blacklist count indicates how many times we have tried
   4358 	 * connecting to this AP and multiple attempts mean that other APs are
   4359 	 * either not available or has already been tried, so that we can start
   4360 	 * increasing the delay here to avoid constant scanning.
   4361 	 */
   4362 	count = wpa_blacklist_add(wpa_s, bssid);
   4363 	if (count == 1 && wpa_s->current_bss) {
   4364 		/*
   4365 		 * This BSS was not in the blacklist before. If there is
   4366 		 * another BSS available for the same ESS, we should try that
   4367 		 * next. Otherwise, we may as well try this one once more
   4368 		 * before allowing other, likely worse, ESSes to be considered.
   4369 		 */
   4370 		freqs = get_bss_freqs_in_ess(wpa_s);
   4371 		if (freqs) {
   4372 			wpa_dbg(wpa_s, MSG_DEBUG, "Another BSS in this ESS "
   4373 				"has been seen; try it next");
   4374 			wpa_blacklist_add(wpa_s, bssid);
   4375 			/*
   4376 			 * On the next scan, go through only the known channels
   4377 			 * used in this ESS based on previous scans to speed up
   4378 			 * common load balancing use case.
   4379 			 */
   4380 			os_free(wpa_s->next_scan_freqs);
   4381 			wpa_s->next_scan_freqs = freqs;
   4382 		}
   4383 	}
   4384 
   4385 	/*
   4386 	 * Add previous failure count in case the temporary blacklist was
   4387 	 * cleared due to no other BSSes being available.
   4388 	 */
   4389 	count += wpa_s->extra_blacklist_count;
   4390 
   4391 	if (count > 3 && wpa_s->current_ssid) {
   4392 		wpa_printf(MSG_DEBUG, "Continuous association failures - "
   4393 			   "consider temporary network disabling");
   4394 		wpas_auth_failed(wpa_s, "CONN_FAILED");
   4395 	}
   4396 
   4397 	switch (count) {
   4398 	case 1:
   4399 		timeout = 100;
   4400 		break;
   4401 	case 2:
   4402 		timeout = 500;
   4403 		break;
   4404 	case 3:
   4405 		timeout = 1000;
   4406 		break;
   4407 	case 4:
   4408 		timeout = 5000;
   4409 		break;
   4410 	default:
   4411 		timeout = 10000;
   4412 		break;
   4413 	}
   4414 
   4415 	wpa_dbg(wpa_s, MSG_DEBUG, "Blacklist count %d --> request scan in %d "
   4416 		"ms", count, timeout);
   4417 
   4418 	/*
   4419 	 * TODO: if more than one possible AP is available in scan results,
   4420 	 * could try the other ones before requesting a new scan.
   4421 	 */
   4422 	wpa_supplicant_req_scan(wpa_s, timeout / 1000,
   4423 				1000 * (timeout % 1000));
   4424 }
   4425 
   4426 
   4427 int wpas_driver_bss_selection(struct wpa_supplicant *wpa_s)
   4428 {
   4429 	return wpa_s->conf->ap_scan == 2 ||
   4430 		(wpa_s->drv_flags & WPA_DRIVER_FLAGS_BSS_SELECTION);
   4431 }
   4432 
   4433 
   4434 #if defined(CONFIG_CTRL_IFACE) || defined(CONFIG_CTRL_IFACE_DBUS_NEW)
   4435 int wpa_supplicant_ctrl_iface_ctrl_rsp_handle(struct wpa_supplicant *wpa_s,
   4436 					      struct wpa_ssid *ssid,
   4437 					      const char *field,
   4438 					      const char *value)
   4439 {
   4440 #ifdef IEEE8021X_EAPOL
   4441 	struct eap_peer_config *eap = &ssid->eap;
   4442 
   4443 	wpa_printf(MSG_DEBUG, "CTRL_IFACE: response handle field=%s", field);
   4444 	wpa_hexdump_ascii_key(MSG_DEBUG, "CTRL_IFACE: response value",
   4445 			      (const u8 *) value, os_strlen(value));
   4446 
   4447 	switch (wpa_supplicant_ctrl_req_from_string(field)) {
   4448 	case WPA_CTRL_REQ_EAP_IDENTITY:
   4449 		os_free(eap->identity);
   4450 		eap->identity = (u8 *) os_strdup(value);
   4451 		eap->identity_len = os_strlen(value);
   4452 		eap->pending_req_identity = 0;
   4453 		if (ssid == wpa_s->current_ssid)
   4454 			wpa_s->reassociate = 1;
   4455 		break;
   4456 	case WPA_CTRL_REQ_EAP_PASSWORD:
   4457 		bin_clear_free(eap->password, eap->password_len);
   4458 		eap->password = (u8 *) os_strdup(value);
   4459 		eap->password_len = os_strlen(value);
   4460 		eap->pending_req_password = 0;
   4461 		if (ssid == wpa_s->current_ssid)
   4462 			wpa_s->reassociate = 1;
   4463 		break;
   4464 	case WPA_CTRL_REQ_EAP_NEW_PASSWORD:
   4465 		bin_clear_free(eap->new_password, eap->new_password_len);
   4466 		eap->new_password = (u8 *) os_strdup(value);
   4467 		eap->new_password_len = os_strlen(value);
   4468 		eap->pending_req_new_password = 0;
   4469 		if (ssid == wpa_s->current_ssid)
   4470 			wpa_s->reassociate = 1;
   4471 		break;
   4472 	case WPA_CTRL_REQ_EAP_PIN:
   4473 		str_clear_free(eap->pin);
   4474 		eap->pin = os_strdup(value);
   4475 		eap->pending_req_pin = 0;
   4476 		if (ssid == wpa_s->current_ssid)
   4477 			wpa_s->reassociate = 1;
   4478 		break;
   4479 	case WPA_CTRL_REQ_EAP_OTP:
   4480 		bin_clear_free(eap->otp, eap->otp_len);
   4481 		eap->otp = (u8 *) os_strdup(value);
   4482 		eap->otp_len = os_strlen(value);
   4483 		os_free(eap->pending_req_otp);
   4484 		eap->pending_req_otp = NULL;
   4485 		eap->pending_req_otp_len = 0;
   4486 		break;
   4487 	case WPA_CTRL_REQ_EAP_PASSPHRASE:
   4488 		str_clear_free(eap->private_key_passwd);
   4489 		eap->private_key_passwd = os_strdup(value);
   4490 		eap->pending_req_passphrase = 0;
   4491 		if (ssid == wpa_s->current_ssid)
   4492 			wpa_s->reassociate = 1;
   4493 		break;
   4494 	case WPA_CTRL_REQ_SIM:
   4495 		str_clear_free(eap->external_sim_resp);
   4496 		eap->external_sim_resp = os_strdup(value);
   4497 		break;
   4498 	default:
   4499 		wpa_printf(MSG_DEBUG, "CTRL_IFACE: Unknown field '%s'", field);
   4500 		return -1;
   4501 	}
   4502 
   4503 	return 0;
   4504 #else /* IEEE8021X_EAPOL */
   4505 	wpa_printf(MSG_DEBUG, "CTRL_IFACE: IEEE 802.1X not included");
   4506 	return -1;
   4507 #endif /* IEEE8021X_EAPOL */
   4508 }
   4509 #endif /* CONFIG_CTRL_IFACE || CONFIG_CTRL_IFACE_DBUS_NEW */
   4510 
   4511 
   4512 int wpas_network_disabled(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
   4513 {
   4514 	int i;
   4515 	unsigned int drv_enc;
   4516 
   4517 	if (ssid == NULL)
   4518 		return 1;
   4519 
   4520 	if (ssid->disabled)
   4521 		return 1;
   4522 
   4523 	if (wpa_s && wpa_s->drv_capa_known)
   4524 		drv_enc = wpa_s->drv_enc;
   4525 	else
   4526 		drv_enc = (unsigned int) -1;
   4527 
   4528 	for (i = 0; i < NUM_WEP_KEYS; i++) {
   4529 		size_t len = ssid->wep_key_len[i];
   4530 		if (len == 0)
   4531 			continue;
   4532 		if (len == 5 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP40))
   4533 			continue;
   4534 		if (len == 13 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP104))
   4535 			continue;
   4536 		if (len == 16 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP128))
   4537 			continue;
   4538 		return 1; /* invalid WEP key */
   4539 	}
   4540 
   4541 	if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt) && !ssid->psk_set &&
   4542 	    (!ssid->passphrase || ssid->ssid_len != 0) && !ssid->ext_psk)
   4543 		return 1;
   4544 
   4545 	return 0;
   4546 }
   4547 
   4548 
   4549 int wpas_is_p2p_prioritized(struct wpa_supplicant *wpa_s)
   4550 {
   4551 	if (wpa_s->global->conc_pref == WPA_CONC_PREF_P2P)
   4552 		return 1;
   4553 	if (wpa_s->global->conc_pref == WPA_CONC_PREF_STA)
   4554 		return 0;
   4555 	return -1;
   4556 }
   4557 
   4558 
   4559 void wpas_auth_failed(struct wpa_supplicant *wpa_s, char *reason)
   4560 {
   4561 	struct wpa_ssid *ssid = wpa_s->current_ssid;
   4562 	int dur;
   4563 	struct os_reltime now;
   4564 
   4565 	if (ssid == NULL) {
   4566 		wpa_printf(MSG_DEBUG, "Authentication failure but no known "
   4567 			   "SSID block");
   4568 		return;
   4569 	}
   4570 
   4571 	if (ssid->key_mgmt == WPA_KEY_MGMT_WPS)
   4572 		return;
   4573 
   4574 	ssid->auth_failures++;
   4575 
   4576 #ifdef CONFIG_P2P
   4577 	if (ssid->p2p_group &&
   4578 	    (wpa_s->p2p_in_provisioning || wpa_s->show_group_started)) {
   4579 		/*
   4580 		 * Skip the wait time since there is a short timeout on the
   4581 		 * connection to a P2P group.
   4582 		 */
   4583 		return;
   4584 	}
   4585 #endif /* CONFIG_P2P */
   4586 
   4587 	if (ssid->auth_failures > 50)
   4588 		dur = 300;
   4589 	else if (ssid->auth_failures > 10)
   4590 		dur = 120;
   4591 	else if (ssid->auth_failures > 5)
   4592 		dur = 90;
   4593 	else if (ssid->auth_failures > 3)
   4594 		dur = 60;
   4595 	else if (ssid->auth_failures > 2)
   4596 		dur = 30;
   4597 	else if (ssid->auth_failures > 1)
   4598 		dur = 20;
   4599 	else
   4600 		dur = 10;
   4601 
   4602 	if (ssid->auth_failures > 1 &&
   4603 	    wpa_key_mgmt_wpa_ieee8021x(ssid->key_mgmt))
   4604 		dur += os_random() % (ssid->auth_failures * 10);
   4605 
   4606 	os_get_reltime(&now);
   4607 	if (now.sec + dur <= ssid->disabled_until.sec)
   4608 		return;
   4609 
   4610 	ssid->disabled_until.sec = now.sec + dur;
   4611 
   4612 	wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TEMP_DISABLED
   4613 		"id=%d ssid=\"%s\" auth_failures=%u duration=%d reason=%s",
   4614 		ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
   4615 		ssid->auth_failures, dur, reason);
   4616 }
   4617 
   4618 
   4619 void wpas_clear_temp_disabled(struct wpa_supplicant *wpa_s,
   4620 			      struct wpa_ssid *ssid, int clear_failures)
   4621 {
   4622 	if (ssid == NULL)
   4623 		return;
   4624 
   4625 	if (ssid->disabled_until.sec) {
   4626 		wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_REENABLED
   4627 			"id=%d ssid=\"%s\"",
   4628 			ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
   4629 	}
   4630 	ssid->disabled_until.sec = 0;
   4631 	ssid->disabled_until.usec = 0;
   4632 	if (clear_failures)
   4633 		ssid->auth_failures = 0;
   4634 }
   4635 
   4636 
   4637 int disallowed_bssid(struct wpa_supplicant *wpa_s, const u8 *bssid)
   4638 {
   4639 	size_t i;
   4640 
   4641 	if (wpa_s->disallow_aps_bssid == NULL)
   4642 		return 0;
   4643 
   4644 	for (i = 0; i < wpa_s->disallow_aps_bssid_count; i++) {
   4645 		if (os_memcmp(wpa_s->disallow_aps_bssid + i * ETH_ALEN,
   4646 			      bssid, ETH_ALEN) == 0)
   4647 			return 1;
   4648 	}
   4649 
   4650 	return 0;
   4651 }
   4652 
   4653 
   4654 int disallowed_ssid(struct wpa_supplicant *wpa_s, const u8 *ssid,
   4655 		    size_t ssid_len)
   4656 {
   4657 	size_t i;
   4658 
   4659 	if (wpa_s->disallow_aps_ssid == NULL || ssid == NULL)
   4660 		return 0;
   4661 
   4662 	for (i = 0; i < wpa_s->disallow_aps_ssid_count; i++) {
   4663 		struct wpa_ssid_value *s = &wpa_s->disallow_aps_ssid[i];
   4664 		if (ssid_len == s->ssid_len &&
   4665 		    os_memcmp(ssid, s->ssid, ssid_len) == 0)
   4666 			return 1;
   4667 	}
   4668 
   4669 	return 0;
   4670 }
   4671 
   4672 
   4673 /**
   4674  * wpas_request_connection - Request a new connection
   4675  * @wpa_s: Pointer to the network interface
   4676  *
   4677  * This function is used to request a new connection to be found. It will mark
   4678  * the interface to allow reassociation and request a new scan to find a
   4679  * suitable network to connect to.
   4680  */
   4681 void wpas_request_connection(struct wpa_supplicant *wpa_s)
   4682 {
   4683 	wpa_s->normal_scans = 0;
   4684 	wpa_supplicant_reinit_autoscan(wpa_s);
   4685 	wpa_s->extra_blacklist_count = 0;
   4686 	wpa_s->disconnected = 0;
   4687 	wpa_s->reassociate = 1;
   4688 
   4689 	if (wpa_supplicant_fast_associate(wpa_s) != 1)
   4690 		wpa_supplicant_req_scan(wpa_s, 0, 0);
   4691 }
   4692 
   4693 
   4694 void dump_freq_data(struct wpa_supplicant *wpa_s, const char *title,
   4695 		    struct wpa_used_freq_data *freqs_data,
   4696 		    unsigned int len)
   4697 {
   4698 	unsigned int i;
   4699 
   4700 	wpa_dbg(wpa_s, MSG_DEBUG, "Shared frequencies (len=%u): %s",
   4701 		len, title);
   4702 	for (i = 0; i < len; i++) {
   4703 		struct wpa_used_freq_data *cur = &freqs_data[i];
   4704 		wpa_dbg(wpa_s, MSG_DEBUG, "freq[%u]: %d, flags=0x%X",
   4705 			i, cur->freq, cur->flags);
   4706 	}
   4707 }
   4708 
   4709 
   4710 /*
   4711  * Find the operating frequencies of any of the virtual interfaces that
   4712  * are using the same radio as the current interface, and in addition, get
   4713  * information about the interface types that are using the frequency.
   4714  */
   4715 int get_shared_radio_freqs_data(struct wpa_supplicant *wpa_s,
   4716 				struct wpa_used_freq_data *freqs_data,
   4717 				unsigned int len)
   4718 {
   4719 	struct wpa_supplicant *ifs;
   4720 	u8 bssid[ETH_ALEN];
   4721 	int freq;
   4722 	unsigned int idx = 0, i;
   4723 
   4724 	wpa_dbg(wpa_s, MSG_DEBUG,
   4725 		"Determining shared radio frequencies (max len %u)", len);
   4726 	os_memset(freqs_data, 0, sizeof(struct wpa_used_freq_data) * len);
   4727 
   4728 	dl_list_for_each(ifs, &wpa_s->radio->ifaces, struct wpa_supplicant,
   4729 			 radio_list) {
   4730 		if (idx == len)
   4731 			break;
   4732 
   4733 		if (ifs->current_ssid == NULL || ifs->assoc_freq == 0)
   4734 			continue;
   4735 
   4736 		if (ifs->current_ssid->mode == WPAS_MODE_AP ||
   4737 		    ifs->current_ssid->mode == WPAS_MODE_P2P_GO)
   4738 			freq = ifs->current_ssid->frequency;
   4739 		else if (wpa_drv_get_bssid(ifs, bssid) == 0)
   4740 			freq = ifs->assoc_freq;
   4741 		else
   4742 			continue;
   4743 
   4744 		/* Hold only distinct freqs */
   4745 		for (i = 0; i < idx; i++)
   4746 			if (freqs_data[i].freq == freq)
   4747 				break;
   4748 
   4749 		if (i == idx)
   4750 			freqs_data[idx++].freq = freq;
   4751 
   4752 		if (ifs->current_ssid->mode == WPAS_MODE_INFRA) {
   4753 			freqs_data[i].flags = ifs->current_ssid->p2p_group ?
   4754 				WPA_FREQ_USED_BY_P2P_CLIENT :
   4755 				WPA_FREQ_USED_BY_INFRA_STATION;
   4756 		}
   4757 	}
   4758 
   4759 	dump_freq_data(wpa_s, "completed iteration", freqs_data, idx);
   4760 	return idx;
   4761 }
   4762 
   4763 
   4764 /*
   4765  * Find the operating frequencies of any of the virtual interfaces that
   4766  * are using the same radio as the current interface.
   4767  */
   4768 int get_shared_radio_freqs(struct wpa_supplicant *wpa_s,
   4769 			   int *freq_array, unsigned int len)
   4770 {
   4771 	struct wpa_used_freq_data *freqs_data;
   4772 	int num, i;
   4773 
   4774 	os_memset(freq_array, 0, sizeof(int) * len);
   4775 
   4776 	freqs_data = os_calloc(len, sizeof(struct wpa_used_freq_data));
   4777 	if (!freqs_data)
   4778 		return -1;
   4779 
   4780 	num = get_shared_radio_freqs_data(wpa_s, freqs_data, len);
   4781 	for (i = 0; i < num; i++)
   4782 		freq_array[i] = freqs_data[i].freq;
   4783 
   4784 	os_free(freqs_data);
   4785 
   4786 	return num;
   4787 }
   4788