Home | History | Annotate | Download | only in wpa_supplicant
      1 /*
      2  * WPA Supplicant
      3  * Copyright (c) 2003-2012, 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_server/eap_methods.h"
     21 #include "rsn_supp/wpa.h"
     22 #include "eloop.h"
     23 #include "config.h"
     24 #include "utils/ext_password.h"
     25 #include "l2_packet/l2_packet.h"
     26 #include "wpa_supplicant_i.h"
     27 #include "driver_i.h"
     28 #include "ctrl_iface.h"
     29 #include "pcsc_funcs.h"
     30 #include "common/version.h"
     31 #include "rsn_supp/preauth.h"
     32 #include "rsn_supp/pmksa_cache.h"
     33 #include "common/wpa_ctrl.h"
     34 #include "common/ieee802_11_defs.h"
     35 #include "p2p/p2p.h"
     36 #include "blacklist.h"
     37 #include "wpas_glue.h"
     38 #include "wps_supplicant.h"
     39 #include "ibss_rsn.h"
     40 #include "sme.h"
     41 #include "gas_query.h"
     42 #include "ap.h"
     43 #include "p2p_supplicant.h"
     44 #include "wifi_display.h"
     45 #include "notify.h"
     46 #include "bgscan.h"
     47 #include "autoscan.h"
     48 #include "bss.h"
     49 #include "scan.h"
     50 #include "offchannel.h"
     51 #include "hs20_supplicant.h"
     52 
     53 const char *wpa_supplicant_version =
     54 "wpa_supplicant v" VERSION_STR "\n"
     55 "Copyright (c) 2003-2012, Jouni Malinen <j (at) w1.fi> and contributors";
     56 
     57 const char *wpa_supplicant_license =
     58 "This software may be distributed under the terms of the BSD license.\n"
     59 "See README for more details.\n"
     60 #ifdef EAP_TLS_OPENSSL
     61 "\nThis product includes software developed by the OpenSSL Project\n"
     62 "for use in the OpenSSL Toolkit (http://www.openssl.org/)\n"
     63 #endif /* EAP_TLS_OPENSSL */
     64 ;
     65 
     66 #ifndef CONFIG_NO_STDOUT_DEBUG
     67 /* Long text divided into parts in order to fit in C89 strings size limits. */
     68 const char *wpa_supplicant_full_license1 =
     69 "";
     70 const char *wpa_supplicant_full_license2 =
     71 "This software may be distributed under the terms of the BSD license.\n"
     72 "\n"
     73 "Redistribution and use in source and binary forms, with or without\n"
     74 "modification, are permitted provided that the following conditions are\n"
     75 "met:\n"
     76 "\n";
     77 const char *wpa_supplicant_full_license3 =
     78 "1. Redistributions of source code must retain the above copyright\n"
     79 "   notice, this list of conditions and the following disclaimer.\n"
     80 "\n"
     81 "2. Redistributions in binary form must reproduce the above copyright\n"
     82 "   notice, this list of conditions and the following disclaimer in the\n"
     83 "   documentation and/or other materials provided with the distribution.\n"
     84 "\n";
     85 const char *wpa_supplicant_full_license4 =
     86 "3. Neither the name(s) of the above-listed copyright holder(s) nor the\n"
     87 "   names of its contributors may be used to endorse or promote products\n"
     88 "   derived from this software without specific prior written permission.\n"
     89 "\n"
     90 "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
     91 "\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
     92 "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
     93 "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n";
     94 const char *wpa_supplicant_full_license5 =
     95 "OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
     96 "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
     97 "LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
     98 "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
     99 "THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
    100 "(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
    101 "OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
    102 "\n";
    103 #endif /* CONFIG_NO_STDOUT_DEBUG */
    104 
    105 extern int wpa_debug_level;
    106 extern int wpa_debug_show_keys;
    107 extern int wpa_debug_timestamp;
    108 extern struct wpa_driver_ops *wpa_drivers[];
    109 
    110 /* Configure default/group WEP keys for static WEP */
    111 int wpa_set_wep_keys(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
    112 {
    113 	int i, set = 0;
    114 
    115 	for (i = 0; i < NUM_WEP_KEYS; i++) {
    116 		if (ssid->wep_key_len[i] == 0)
    117 			continue;
    118 
    119 		set = 1;
    120 		wpa_drv_set_key(wpa_s, WPA_ALG_WEP, NULL,
    121 				i, i == ssid->wep_tx_keyidx, NULL, 0,
    122 				ssid->wep_key[i], ssid->wep_key_len[i]);
    123 	}
    124 
    125 	return set;
    126 }
    127 
    128 
    129 static int wpa_supplicant_set_wpa_none_key(struct wpa_supplicant *wpa_s,
    130 					   struct wpa_ssid *ssid)
    131 {
    132 	u8 key[32];
    133 	size_t keylen;
    134 	enum wpa_alg alg;
    135 	u8 seq[6] = { 0 };
    136 
    137 	/* IBSS/WPA-None uses only one key (Group) for both receiving and
    138 	 * sending unicast and multicast packets. */
    139 
    140 	if (ssid->mode != WPAS_MODE_IBSS) {
    141 		wpa_msg(wpa_s, MSG_INFO, "WPA: Invalid mode %d (not "
    142 			"IBSS/ad-hoc) for WPA-None", ssid->mode);
    143 		return -1;
    144 	}
    145 
    146 	if (!ssid->psk_set) {
    147 		wpa_msg(wpa_s, MSG_INFO, "WPA: No PSK configured for "
    148 			"WPA-None");
    149 		return -1;
    150 	}
    151 
    152 	switch (wpa_s->group_cipher) {
    153 	case WPA_CIPHER_CCMP:
    154 		os_memcpy(key, ssid->psk, 16);
    155 		keylen = 16;
    156 		alg = WPA_ALG_CCMP;
    157 		break;
    158 	case WPA_CIPHER_GCMP:
    159 		os_memcpy(key, ssid->psk, 16);
    160 		keylen = 16;
    161 		alg = WPA_ALG_GCMP;
    162 		break;
    163 	case WPA_CIPHER_TKIP:
    164 		/* WPA-None uses the same Michael MIC key for both TX and RX */
    165 		os_memcpy(key, ssid->psk, 16 + 8);
    166 		os_memcpy(key + 16 + 8, ssid->psk + 16, 8);
    167 		keylen = 32;
    168 		alg = WPA_ALG_TKIP;
    169 		break;
    170 	default:
    171 		wpa_msg(wpa_s, MSG_INFO, "WPA: Invalid group cipher %d for "
    172 			"WPA-None", wpa_s->group_cipher);
    173 		return -1;
    174 	}
    175 
    176 	/* TODO: should actually remember the previously used seq#, both for TX
    177 	 * and RX from each STA.. */
    178 
    179 	return wpa_drv_set_key(wpa_s, alg, NULL, 0, 1, seq, 6, key, keylen);
    180 }
    181 
    182 
    183 static void wpa_supplicant_timeout(void *eloop_ctx, void *timeout_ctx)
    184 {
    185 	struct wpa_supplicant *wpa_s = eloop_ctx;
    186 	const u8 *bssid = wpa_s->bssid;
    187 	if (is_zero_ether_addr(bssid))
    188 		bssid = wpa_s->pending_bssid;
    189 	wpa_msg(wpa_s, MSG_INFO, "Authentication with " MACSTR " timed out.",
    190 		MAC2STR(bssid));
    191 	wpa_blacklist_add(wpa_s, bssid);
    192 	wpa_sm_notify_disassoc(wpa_s->wpa);
    193 	wpa_supplicant_disassociate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
    194 	wpa_s->reassociate = 1;
    195 
    196 	/*
    197 	 * If we timed out, the AP or the local radio may be busy.
    198 	 * So, wait a second until scanning again.
    199 	 */
    200 	wpa_supplicant_req_scan(wpa_s, 1, 0);
    201 
    202 #ifdef CONFIG_P2P
    203 	if (wpa_s->global->p2p_cb_on_scan_complete && !wpa_s->global->p2p_disabled &&
    204 	    wpa_s->global->p2p != NULL) {
    205 		wpa_s->global->p2p_cb_on_scan_complete = 0;
    206 		if (p2p_other_scan_completed(wpa_s->global->p2p) == 1) {
    207 			wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Pending P2P operation "
    208 				"continued after timed out authentication");
    209 		}
    210 	}
    211 #endif /* CONFIG_P2P */
    212 }
    213 
    214 
    215 /**
    216  * wpa_supplicant_req_auth_timeout - Schedule a timeout for authentication
    217  * @wpa_s: Pointer to wpa_supplicant data
    218  * @sec: Number of seconds after which to time out authentication
    219  * @usec: Number of microseconds after which to time out authentication
    220  *
    221  * This function is used to schedule a timeout for the current authentication
    222  * attempt.
    223  */
    224 void wpa_supplicant_req_auth_timeout(struct wpa_supplicant *wpa_s,
    225 				     int sec, int usec)
    226 {
    227 	if (wpa_s->conf && wpa_s->conf->ap_scan == 0 &&
    228 	    (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED))
    229 		return;
    230 
    231 	wpa_dbg(wpa_s, MSG_DEBUG, "Setting authentication timeout: %d sec "
    232 		"%d usec", sec, usec);
    233 	eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
    234 	eloop_register_timeout(sec, usec, wpa_supplicant_timeout, wpa_s, NULL);
    235 }
    236 
    237 
    238 /**
    239  * wpa_supplicant_cancel_auth_timeout - Cancel authentication timeout
    240  * @wpa_s: Pointer to wpa_supplicant data
    241  *
    242  * This function is used to cancel authentication timeout scheduled with
    243  * wpa_supplicant_req_auth_timeout() and it is called when authentication has
    244  * been completed.
    245  */
    246 void wpa_supplicant_cancel_auth_timeout(struct wpa_supplicant *wpa_s)
    247 {
    248 	wpa_dbg(wpa_s, MSG_DEBUG, "Cancelling authentication timeout");
    249 	eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
    250 	wpa_blacklist_del(wpa_s, wpa_s->bssid);
    251 }
    252 
    253 
    254 /**
    255  * wpa_supplicant_initiate_eapol - Configure EAPOL state machine
    256  * @wpa_s: Pointer to wpa_supplicant data
    257  *
    258  * This function is used to configure EAPOL state machine based on the selected
    259  * authentication mode.
    260  */
    261 void wpa_supplicant_initiate_eapol(struct wpa_supplicant *wpa_s)
    262 {
    263 #ifdef IEEE8021X_EAPOL
    264 	struct eapol_config eapol_conf;
    265 	struct wpa_ssid *ssid = wpa_s->current_ssid;
    266 
    267 #ifdef CONFIG_IBSS_RSN
    268 	if (ssid->mode == WPAS_MODE_IBSS &&
    269 	    wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
    270 	    wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
    271 		/*
    272 		 * RSN IBSS authentication is per-STA and we can disable the
    273 		 * per-BSSID EAPOL authentication.
    274 		 */
    275 		eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
    276 		eapol_sm_notify_eap_success(wpa_s->eapol, TRUE);
    277 		eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
    278 		return;
    279 	}
    280 #endif /* CONFIG_IBSS_RSN */
    281 
    282 	eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
    283 	eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
    284 
    285 	if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
    286 	    wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE)
    287 		eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
    288 	else
    289 		eapol_sm_notify_portControl(wpa_s->eapol, Auto);
    290 
    291 	os_memset(&eapol_conf, 0, sizeof(eapol_conf));
    292 	if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
    293 		eapol_conf.accept_802_1x_keys = 1;
    294 		eapol_conf.required_keys = 0;
    295 		if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_UNICAST) {
    296 			eapol_conf.required_keys |= EAPOL_REQUIRE_KEY_UNICAST;
    297 		}
    298 		if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_BROADCAST) {
    299 			eapol_conf.required_keys |=
    300 				EAPOL_REQUIRE_KEY_BROADCAST;
    301 		}
    302 
    303 		if (wpa_s->conf && (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED))
    304 			eapol_conf.required_keys = 0;
    305 	}
    306 	if (wpa_s->conf)
    307 		eapol_conf.fast_reauth = wpa_s->conf->fast_reauth;
    308 	eapol_conf.workaround = ssid->eap_workaround;
    309 	eapol_conf.eap_disabled =
    310 		!wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) &&
    311 		wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA &&
    312 		wpa_s->key_mgmt != WPA_KEY_MGMT_WPS;
    313 	eapol_sm_notify_config(wpa_s->eapol, &ssid->eap, &eapol_conf);
    314 #endif /* IEEE8021X_EAPOL */
    315 }
    316 
    317 
    318 /**
    319  * wpa_supplicant_set_non_wpa_policy - Set WPA parameters to non-WPA mode
    320  * @wpa_s: Pointer to wpa_supplicant data
    321  * @ssid: Configuration data for the network
    322  *
    323  * This function is used to configure WPA state machine and related parameters
    324  * to a mode where WPA is not enabled. This is called as part of the
    325  * authentication configuration when the selected network does not use WPA.
    326  */
    327 void wpa_supplicant_set_non_wpa_policy(struct wpa_supplicant *wpa_s,
    328 				       struct wpa_ssid *ssid)
    329 {
    330 	int i;
    331 
    332 	if (ssid->key_mgmt & WPA_KEY_MGMT_WPS)
    333 		wpa_s->key_mgmt = WPA_KEY_MGMT_WPS;
    334 	else if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA)
    335 		wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_NO_WPA;
    336 	else
    337 		wpa_s->key_mgmt = WPA_KEY_MGMT_NONE;
    338 	wpa_sm_set_ap_wpa_ie(wpa_s->wpa, NULL, 0);
    339 	wpa_sm_set_ap_rsn_ie(wpa_s->wpa, NULL, 0);
    340 	wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
    341 	wpa_s->pairwise_cipher = WPA_CIPHER_NONE;
    342 	wpa_s->group_cipher = WPA_CIPHER_NONE;
    343 	wpa_s->mgmt_group_cipher = 0;
    344 
    345 	for (i = 0; i < NUM_WEP_KEYS; i++) {
    346 		if (ssid->wep_key_len[i] > 5) {
    347 			wpa_s->pairwise_cipher = WPA_CIPHER_WEP104;
    348 			wpa_s->group_cipher = WPA_CIPHER_WEP104;
    349 			break;
    350 		} else if (ssid->wep_key_len[i] > 0) {
    351 			wpa_s->pairwise_cipher = WPA_CIPHER_WEP40;
    352 			wpa_s->group_cipher = WPA_CIPHER_WEP40;
    353 			break;
    354 		}
    355 	}
    356 
    357 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED, 0);
    358 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
    359 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
    360 			 wpa_s->pairwise_cipher);
    361 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
    362 #ifdef CONFIG_IEEE80211W
    363 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
    364 			 wpa_s->mgmt_group_cipher);
    365 #endif /* CONFIG_IEEE80211W */
    366 
    367 	pmksa_cache_clear_current(wpa_s->wpa);
    368 }
    369 
    370 
    371 void free_hw_features(struct wpa_supplicant *wpa_s)
    372 {
    373 	int i;
    374 	if (wpa_s->hw.modes == NULL)
    375 		return;
    376 
    377 	for (i = 0; i < wpa_s->hw.num_modes; i++) {
    378 		os_free(wpa_s->hw.modes[i].channels);
    379 		os_free(wpa_s->hw.modes[i].rates);
    380 	}
    381 
    382 	os_free(wpa_s->hw.modes);
    383 	wpa_s->hw.modes = NULL;
    384 }
    385 
    386 
    387 static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s)
    388 {
    389 	bgscan_deinit(wpa_s);
    390 	autoscan_deinit(wpa_s);
    391 	scard_deinit(wpa_s->scard);
    392 	wpa_s->scard = NULL;
    393 	wpa_sm_set_scard_ctx(wpa_s->wpa, NULL);
    394 	eapol_sm_register_scard_ctx(wpa_s->eapol, NULL);
    395 	l2_packet_deinit(wpa_s->l2);
    396 	wpa_s->l2 = NULL;
    397 	if (wpa_s->l2_br) {
    398 		l2_packet_deinit(wpa_s->l2_br);
    399 		wpa_s->l2_br = NULL;
    400 	}
    401 
    402 	if (wpa_s->conf != NULL) {
    403 		struct wpa_ssid *ssid;
    404 		for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
    405 			wpas_notify_network_removed(wpa_s, ssid);
    406 	}
    407 
    408 	os_free(wpa_s->confname);
    409 	wpa_s->confname = NULL;
    410 
    411 	wpa_sm_set_eapol(wpa_s->wpa, NULL);
    412 	eapol_sm_deinit(wpa_s->eapol);
    413 	wpa_s->eapol = NULL;
    414 
    415 	rsn_preauth_deinit(wpa_s->wpa);
    416 
    417 #ifdef CONFIG_TDLS
    418 	wpa_tdls_deinit(wpa_s->wpa);
    419 #endif /* CONFIG_TDLS */
    420 
    421 	pmksa_candidate_free(wpa_s->wpa);
    422 	wpa_sm_deinit(wpa_s->wpa);
    423 	wpa_s->wpa = NULL;
    424 	wpa_blacklist_clear(wpa_s);
    425 
    426 	wpa_bss_deinit(wpa_s);
    427 
    428 	wpa_supplicant_cancel_scan(wpa_s);
    429 	wpa_supplicant_cancel_auth_timeout(wpa_s);
    430 	eloop_cancel_timeout(wpa_supplicant_stop_countermeasures, wpa_s, NULL);
    431 #ifdef CONFIG_DELAYED_MIC_ERROR_REPORT
    432 	eloop_cancel_timeout(wpa_supplicant_delayed_mic_error_report,
    433 			     wpa_s, NULL);
    434 #endif /* CONFIG_DELAYED_MIC_ERROR_REPORT */
    435 
    436 	wpas_wps_deinit(wpa_s);
    437 
    438 	wpabuf_free(wpa_s->pending_eapol_rx);
    439 	wpa_s->pending_eapol_rx = NULL;
    440 
    441 #ifdef CONFIG_IBSS_RSN
    442 	ibss_rsn_deinit(wpa_s->ibss_rsn);
    443 	wpa_s->ibss_rsn = NULL;
    444 #endif /* CONFIG_IBSS_RSN */
    445 
    446 	sme_deinit(wpa_s);
    447 
    448 #ifdef CONFIG_AP
    449 	wpa_supplicant_ap_deinit(wpa_s);
    450 #endif /* CONFIG_AP */
    451 
    452 #ifdef CONFIG_P2P
    453 	wpas_p2p_deinit(wpa_s);
    454 #endif /* CONFIG_P2P */
    455 
    456 #ifdef CONFIG_OFFCHANNEL
    457 	offchannel_deinit(wpa_s);
    458 #endif /* CONFIG_OFFCHANNEL */
    459 
    460 	wpa_supplicant_cancel_sched_scan(wpa_s);
    461 
    462 	os_free(wpa_s->next_scan_freqs);
    463 	wpa_s->next_scan_freqs = NULL;
    464 
    465 	gas_query_deinit(wpa_s->gas);
    466 	wpa_s->gas = NULL;
    467 
    468 	free_hw_features(wpa_s);
    469 
    470 	os_free(wpa_s->bssid_filter);
    471 	wpa_s->bssid_filter = NULL;
    472 
    473 	wnm_bss_keep_alive_deinit(wpa_s);
    474 
    475 	ext_password_deinit(wpa_s->ext_pw);
    476 	wpa_s->ext_pw = NULL;
    477 
    478 	wpabuf_free(wpa_s->last_gas_resp);
    479 
    480 	os_free(wpa_s->last_scan_res);
    481 	wpa_s->last_scan_res = NULL;
    482 }
    483 
    484 
    485 /**
    486  * wpa_clear_keys - Clear keys configured for the driver
    487  * @wpa_s: Pointer to wpa_supplicant data
    488  * @addr: Previously used BSSID or %NULL if not available
    489  *
    490  * This function clears the encryption keys that has been previously configured
    491  * for the driver.
    492  */
    493 void wpa_clear_keys(struct wpa_supplicant *wpa_s, const u8 *addr)
    494 {
    495 	if (wpa_s->keys_cleared) {
    496 		/* Some drivers (e.g., ndiswrapper & NDIS drivers) seem to have
    497 		 * timing issues with keys being cleared just before new keys
    498 		 * are set or just after association or something similar. This
    499 		 * shows up in group key handshake failing often because of the
    500 		 * client not receiving the first encrypted packets correctly.
    501 		 * Skipping some of the extra key clearing steps seems to help
    502 		 * in completing group key handshake more reliably. */
    503 		wpa_dbg(wpa_s, MSG_DEBUG, "No keys have been configured - "
    504 			"skip key clearing");
    505 		return;
    506 	}
    507 
    508 	/* MLME-DELETEKEYS.request */
    509 	wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, 0, 0, NULL, 0, NULL, 0);
    510 	wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, 1, 0, NULL, 0, NULL, 0);
    511 	wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, 2, 0, NULL, 0, NULL, 0);
    512 	wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, 3, 0, NULL, 0, NULL, 0);
    513 #ifdef CONFIG_IEEE80211W
    514 	wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, 4, 0, NULL, 0, NULL, 0);
    515 	wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, 5, 0, NULL, 0, NULL, 0);
    516 #endif /* CONFIG_IEEE80211W */
    517 	if (addr) {
    518 		wpa_drv_set_key(wpa_s, WPA_ALG_NONE, addr, 0, 0, NULL, 0, NULL,
    519 				0);
    520 		/* MLME-SETPROTECTION.request(None) */
    521 		wpa_drv_mlme_setprotection(
    522 			wpa_s, addr,
    523 			MLME_SETPROTECTION_PROTECT_TYPE_NONE,
    524 			MLME_SETPROTECTION_KEY_TYPE_PAIRWISE);
    525 	}
    526 	wpa_s->keys_cleared = 1;
    527 }
    528 
    529 
    530 /**
    531  * wpa_supplicant_state_txt - Get the connection state name as a text string
    532  * @state: State (wpa_state; WPA_*)
    533  * Returns: The state name as a printable text string
    534  */
    535 const char * wpa_supplicant_state_txt(enum wpa_states state)
    536 {
    537 	switch (state) {
    538 	case WPA_DISCONNECTED:
    539 		return "DISCONNECTED";
    540 	case WPA_INACTIVE:
    541 		return "INACTIVE";
    542 	case WPA_INTERFACE_DISABLED:
    543 		return "INTERFACE_DISABLED";
    544 	case WPA_SCANNING:
    545 		return "SCANNING";
    546 	case WPA_AUTHENTICATING:
    547 		return "AUTHENTICATING";
    548 	case WPA_ASSOCIATING:
    549 		return "ASSOCIATING";
    550 	case WPA_ASSOCIATED:
    551 		return "ASSOCIATED";
    552 	case WPA_4WAY_HANDSHAKE:
    553 		return "4WAY_HANDSHAKE";
    554 	case WPA_GROUP_HANDSHAKE:
    555 		return "GROUP_HANDSHAKE";
    556 	case WPA_COMPLETED:
    557 		return "COMPLETED";
    558 	default:
    559 		return "UNKNOWN";
    560 	}
    561 }
    562 
    563 
    564 #ifdef CONFIG_BGSCAN
    565 
    566 static void wpa_supplicant_start_bgscan(struct wpa_supplicant *wpa_s)
    567 {
    568 	if (wpas_driver_bss_selection(wpa_s))
    569 		return;
    570 	if (wpa_s->current_ssid == wpa_s->bgscan_ssid)
    571 		return;
    572 
    573 	bgscan_deinit(wpa_s);
    574 	if (wpa_s->current_ssid && wpa_s->current_ssid->bgscan) {
    575 		if (bgscan_init(wpa_s, wpa_s->current_ssid)) {
    576 			wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize "
    577 				"bgscan");
    578 			/*
    579 			 * Live without bgscan; it is only used as a roaming
    580 			 * optimization, so the initial connection is not
    581 			 * affected.
    582 			 */
    583 		} else {
    584 			struct wpa_scan_results *scan_res;
    585 			wpa_s->bgscan_ssid = wpa_s->current_ssid;
    586 			scan_res = wpa_supplicant_get_scan_results(wpa_s, NULL,
    587 								   0);
    588 			if (scan_res) {
    589 				bgscan_notify_scan(wpa_s, scan_res);
    590 				wpa_scan_results_free(scan_res);
    591 			}
    592 		}
    593 	} else
    594 		wpa_s->bgscan_ssid = NULL;
    595 }
    596 
    597 
    598 static void wpa_supplicant_stop_bgscan(struct wpa_supplicant *wpa_s)
    599 {
    600 	if (wpa_s->bgscan_ssid != NULL) {
    601 		bgscan_deinit(wpa_s);
    602 		wpa_s->bgscan_ssid = NULL;
    603 	}
    604 }
    605 
    606 #endif /* CONFIG_BGSCAN */
    607 
    608 
    609 static void wpa_supplicant_start_autoscan(struct wpa_supplicant *wpa_s)
    610 {
    611 	if (autoscan_init(wpa_s, 0))
    612 		wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize autoscan");
    613 }
    614 
    615 
    616 static void wpa_supplicant_stop_autoscan(struct wpa_supplicant *wpa_s)
    617 {
    618 	autoscan_deinit(wpa_s);
    619 }
    620 
    621 
    622 void wpa_supplicant_reinit_autoscan(struct wpa_supplicant *wpa_s)
    623 {
    624 	if (wpa_s->wpa_state == WPA_DISCONNECTED ||
    625 	    wpa_s->wpa_state == WPA_SCANNING) {
    626 		autoscan_deinit(wpa_s);
    627 		wpa_supplicant_start_autoscan(wpa_s);
    628 	}
    629 }
    630 
    631 
    632 /**
    633  * wpa_supplicant_set_state - Set current connection state
    634  * @wpa_s: Pointer to wpa_supplicant data
    635  * @state: The new connection state
    636  *
    637  * This function is called whenever the connection state changes, e.g.,
    638  * association is completed for WPA/WPA2 4-Way Handshake is started.
    639  */
    640 void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s,
    641 			      enum wpa_states state)
    642 {
    643 	enum wpa_states old_state = wpa_s->wpa_state;
    644 
    645 	wpa_dbg(wpa_s, MSG_DEBUG, "State: %s -> %s",
    646 		wpa_supplicant_state_txt(wpa_s->wpa_state),
    647 		wpa_supplicant_state_txt(state));
    648 
    649 #ifdef ANDROID_P2P
    650 	if(state == WPA_ASSOCIATED && wpa_s->current_ssid) {
    651 		wpa_s->current_ssid->assoc_retry = 0;
    652 	}
    653 #endif /* ANDROID_P2P */
    654 
    655 	if (state != WPA_SCANNING)
    656 		wpa_supplicant_notify_scanning(wpa_s, 0);
    657 
    658 	if (state == WPA_COMPLETED && wpa_s->new_connection) {
    659 #if defined(CONFIG_CTRL_IFACE) || !defined(CONFIG_NO_STDOUT_DEBUG)
    660 		struct wpa_ssid *ssid = wpa_s->current_ssid;
    661 		wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_CONNECTED "- Connection to "
    662 			MACSTR " completed %s [id=%d id_str=%s]",
    663 			MAC2STR(wpa_s->bssid), wpa_s->reassociated_connection ?
    664 			"(reauth)" : "(auth)",
    665 			ssid ? ssid->id : -1,
    666 			ssid && ssid->id_str ? ssid->id_str : "");
    667 #endif /* CONFIG_CTRL_IFACE || !CONFIG_NO_STDOUT_DEBUG */
    668 		wpas_clear_temp_disabled(wpa_s, ssid, 1);
    669 		wpa_s->new_connection = 0;
    670 		wpa_s->reassociated_connection = 1;
    671 		wpa_drv_set_operstate(wpa_s, 1);
    672 #ifndef IEEE8021X_EAPOL
    673 		wpa_drv_set_supp_port(wpa_s, 1);
    674 #endif /* IEEE8021X_EAPOL */
    675 		wpa_s->after_wps = 0;
    676 #ifdef CONFIG_P2P
    677 		wpas_p2p_completed(wpa_s);
    678 #endif /* CONFIG_P2P */
    679 
    680 		sme_sched_obss_scan(wpa_s, 1);
    681 	} else if (state == WPA_DISCONNECTED || state == WPA_ASSOCIATING ||
    682 		   state == WPA_ASSOCIATED) {
    683 		wpa_s->new_connection = 1;
    684 		wpa_drv_set_operstate(wpa_s, 0);
    685 #ifndef IEEE8021X_EAPOL
    686 		wpa_drv_set_supp_port(wpa_s, 0);
    687 #endif /* IEEE8021X_EAPOL */
    688 		sme_sched_obss_scan(wpa_s, 0);
    689 	}
    690 	wpa_s->wpa_state = state;
    691 
    692 #ifdef CONFIG_BGSCAN
    693 	if (state == WPA_COMPLETED)
    694 		wpa_supplicant_start_bgscan(wpa_s);
    695 	else
    696 		wpa_supplicant_stop_bgscan(wpa_s);
    697 #endif /* CONFIG_BGSCAN */
    698 
    699 	if (state == WPA_AUTHENTICATING)
    700 		wpa_supplicant_stop_autoscan(wpa_s);
    701 
    702 	if (state == WPA_DISCONNECTED || state == WPA_INACTIVE)
    703 		wpa_supplicant_start_autoscan(wpa_s);
    704 
    705 	if (wpa_s->wpa_state != old_state) {
    706 		wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
    707 
    708 		if (wpa_s->wpa_state == WPA_COMPLETED ||
    709 		    old_state == WPA_COMPLETED)
    710 			wpas_notify_auth_changed(wpa_s);
    711 	}
    712 }
    713 
    714 
    715 void wpa_supplicant_terminate_proc(struct wpa_global *global)
    716 {
    717 	int pending = 0;
    718 #ifdef CONFIG_WPS
    719 	struct wpa_supplicant *wpa_s = global->ifaces;
    720 	while (wpa_s) {
    721 		if (wpas_wps_terminate_pending(wpa_s) == 1)
    722 			pending = 1;
    723 		wpa_s = wpa_s->next;
    724 	}
    725 #endif /* CONFIG_WPS */
    726 	if (pending)
    727 		return;
    728 	eloop_terminate();
    729 }
    730 
    731 
    732 static void wpa_supplicant_terminate(int sig, void *signal_ctx)
    733 {
    734 	struct wpa_global *global = signal_ctx;
    735 	wpa_supplicant_terminate_proc(global);
    736 }
    737 
    738 
    739 void wpa_supplicant_clear_status(struct wpa_supplicant *wpa_s)
    740 {
    741 	enum wpa_states old_state = wpa_s->wpa_state;
    742 
    743 	wpa_s->pairwise_cipher = 0;
    744 	wpa_s->group_cipher = 0;
    745 	wpa_s->mgmt_group_cipher = 0;
    746 	wpa_s->key_mgmt = 0;
    747 	if (wpa_s->wpa_state != WPA_INTERFACE_DISABLED)
    748 		wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
    749 
    750 	if (wpa_s->wpa_state != old_state)
    751 		wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
    752 }
    753 
    754 
    755 /**
    756  * wpa_supplicant_reload_configuration - Reload configuration data
    757  * @wpa_s: Pointer to wpa_supplicant data
    758  * Returns: 0 on success or -1 if configuration parsing failed
    759  *
    760  * This function can be used to request that the configuration data is reloaded
    761  * (e.g., after configuration file change). This function is reloading
    762  * configuration only for one interface, so this may need to be called multiple
    763  * times if %wpa_supplicant is controlling multiple interfaces and all
    764  * interfaces need reconfiguration.
    765  */
    766 int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s)
    767 {
    768 	struct wpa_config *conf;
    769 	int reconf_ctrl;
    770 	int old_ap_scan;
    771 
    772 	if (wpa_s->confname == NULL)
    773 		return -1;
    774 	conf = wpa_config_read(wpa_s->confname);
    775 	if (conf == NULL) {
    776 		wpa_msg(wpa_s, MSG_ERROR, "Failed to parse the configuration "
    777 			"file '%s' - exiting", wpa_s->confname);
    778 		return -1;
    779 	}
    780 	conf->changed_parameters = (unsigned int) -1;
    781 
    782 	reconf_ctrl = !!conf->ctrl_interface != !!wpa_s->conf->ctrl_interface
    783 		|| (conf->ctrl_interface && wpa_s->conf->ctrl_interface &&
    784 		    os_strcmp(conf->ctrl_interface,
    785 			      wpa_s->conf->ctrl_interface) != 0);
    786 
    787 	if (reconf_ctrl && wpa_s->ctrl_iface) {
    788 		wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
    789 		wpa_s->ctrl_iface = NULL;
    790 	}
    791 
    792 	eapol_sm_invalidate_cached_session(wpa_s->eapol);
    793 	if (wpa_s->current_ssid) {
    794 		wpa_supplicant_deauthenticate(wpa_s,
    795 					      WLAN_REASON_DEAUTH_LEAVING);
    796 	}
    797 
    798 	/*
    799 	 * TODO: should notify EAPOL SM about changes in opensc_engine_path,
    800 	 * pkcs11_engine_path, pkcs11_module_path.
    801 	 */
    802 	if (wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt)) {
    803 		/*
    804 		 * Clear forced success to clear EAP state for next
    805 		 * authentication.
    806 		 */
    807 		eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
    808 	}
    809 	eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
    810 	wpa_sm_set_config(wpa_s->wpa, NULL);
    811 	wpa_sm_pmksa_cache_flush(wpa_s->wpa, NULL);
    812 	wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
    813 	rsn_preauth_deinit(wpa_s->wpa);
    814 
    815 	old_ap_scan = wpa_s->conf->ap_scan;
    816 	wpa_config_free(wpa_s->conf);
    817 	wpa_s->conf = conf;
    818 	if (old_ap_scan != wpa_s->conf->ap_scan)
    819 		wpas_notify_ap_scan_changed(wpa_s);
    820 
    821 	if (reconf_ctrl)
    822 		wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
    823 
    824 	wpa_supplicant_update_config(wpa_s);
    825 
    826 	wpa_supplicant_clear_status(wpa_s);
    827 	if (wpa_supplicant_enabled_networks(wpa_s)) {
    828 		wpa_s->reassociate = 1;
    829 		wpa_supplicant_req_scan(wpa_s, 0, 0);
    830 	}
    831 	wpa_dbg(wpa_s, MSG_DEBUG, "Reconfiguration completed");
    832 	return 0;
    833 }
    834 
    835 
    836 static void wpa_supplicant_reconfig(int sig, void *signal_ctx)
    837 {
    838 	struct wpa_global *global = signal_ctx;
    839 	struct wpa_supplicant *wpa_s;
    840 	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
    841 		wpa_dbg(wpa_s, MSG_DEBUG, "Signal %d received - reconfiguring",
    842 			sig);
    843 		if (wpa_supplicant_reload_configuration(wpa_s) < 0) {
    844 			wpa_supplicant_terminate_proc(global);
    845 		}
    846 	}
    847 }
    848 
    849 
    850 enum wpa_cipher cipher_suite2driver(int cipher)
    851 {
    852 	switch (cipher) {
    853 	case WPA_CIPHER_NONE:
    854 		return CIPHER_NONE;
    855 	case WPA_CIPHER_WEP40:
    856 		return CIPHER_WEP40;
    857 	case WPA_CIPHER_WEP104:
    858 		return CIPHER_WEP104;
    859 	case WPA_CIPHER_CCMP:
    860 		return CIPHER_CCMP;
    861 	case WPA_CIPHER_GCMP:
    862 		return CIPHER_GCMP;
    863 	case WPA_CIPHER_TKIP:
    864 	default:
    865 		return CIPHER_TKIP;
    866 	}
    867 }
    868 
    869 
    870 enum wpa_key_mgmt key_mgmt2driver(int key_mgmt)
    871 {
    872 	switch (key_mgmt) {
    873 	case WPA_KEY_MGMT_NONE:
    874 		return KEY_MGMT_NONE;
    875 	case WPA_KEY_MGMT_IEEE8021X_NO_WPA:
    876 		return KEY_MGMT_802_1X_NO_WPA;
    877 	case WPA_KEY_MGMT_IEEE8021X:
    878 		return KEY_MGMT_802_1X;
    879 	case WPA_KEY_MGMT_WPA_NONE:
    880 		return KEY_MGMT_WPA_NONE;
    881 	case WPA_KEY_MGMT_FT_IEEE8021X:
    882 		return KEY_MGMT_FT_802_1X;
    883 	case WPA_KEY_MGMT_FT_PSK:
    884 		return KEY_MGMT_FT_PSK;
    885 	case WPA_KEY_MGMT_IEEE8021X_SHA256:
    886 		return KEY_MGMT_802_1X_SHA256;
    887 	case WPA_KEY_MGMT_PSK_SHA256:
    888 		return KEY_MGMT_PSK_SHA256;
    889 	case WPA_KEY_MGMT_WPS:
    890 		return KEY_MGMT_WPS;
    891 	case WPA_KEY_MGMT_PSK:
    892 	default:
    893 		return KEY_MGMT_PSK;
    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_REQUIRED) {
    935 		wpa_msg(wpa_s, MSG_INFO, "WPA: Driver associated with an AP "
    936 			"that does not support management frame protection - "
    937 			"reject");
    938 		return -1;
    939 	}
    940 #endif /* CONFIG_IEEE80211W */
    941 
    942 	return 0;
    943 }
    944 
    945 
    946 /**
    947  * wpa_supplicant_set_suites - Set authentication and encryption parameters
    948  * @wpa_s: Pointer to wpa_supplicant data
    949  * @bss: Scan results for the selected BSS, or %NULL if not available
    950  * @ssid: Configuration data for the selected network
    951  * @wpa_ie: Buffer for the WPA/RSN IE
    952  * @wpa_ie_len: Maximum wpa_ie buffer size on input. This is changed to be the
    953  * used buffer length in case the functions returns success.
    954  * Returns: 0 on success or -1 on failure
    955  *
    956  * This function is used to configure authentication and encryption parameters
    957  * based on the network configuration and scan result for the selected BSS (if
    958  * available).
    959  */
    960 int wpa_supplicant_set_suites(struct wpa_supplicant *wpa_s,
    961 			      struct wpa_bss *bss, struct wpa_ssid *ssid,
    962 			      u8 *wpa_ie, size_t *wpa_ie_len)
    963 {
    964 	struct wpa_ie_data ie;
    965 	int sel, proto;
    966 	const u8 *bss_wpa, *bss_rsn;
    967 
    968 	if (bss) {
    969 		bss_wpa = wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE);
    970 		bss_rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
    971 	} else
    972 		bss_wpa = bss_rsn = NULL;
    973 
    974 	if (bss_rsn && (ssid->proto & WPA_PROTO_RSN) &&
    975 	    wpa_parse_wpa_ie(bss_rsn, 2 + bss_rsn[1], &ie) == 0 &&
    976 	    (ie.group_cipher & ssid->group_cipher) &&
    977 	    (ie.pairwise_cipher & ssid->pairwise_cipher) &&
    978 	    (ie.key_mgmt & ssid->key_mgmt)) {
    979 		wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using IEEE 802.11i/D9.0");
    980 		proto = WPA_PROTO_RSN;
    981 	} else if (bss_wpa && (ssid->proto & WPA_PROTO_WPA) &&
    982 		   wpa_parse_wpa_ie(bss_wpa, 2 +bss_wpa[1], &ie) == 0 &&
    983 		   (ie.group_cipher & ssid->group_cipher) &&
    984 		   (ie.pairwise_cipher & ssid->pairwise_cipher) &&
    985 		   (ie.key_mgmt & ssid->key_mgmt)) {
    986 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using IEEE 802.11i/D3.0");
    987 		proto = WPA_PROTO_WPA;
    988 	} else if (bss) {
    989 		wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select WPA/RSN");
    990 		return -1;
    991 	} else {
    992 		if (ssid->proto & WPA_PROTO_RSN)
    993 			proto = WPA_PROTO_RSN;
    994 		else
    995 			proto = WPA_PROTO_WPA;
    996 		if (wpa_supplicant_suites_from_ai(wpa_s, ssid, &ie) < 0) {
    997 			os_memset(&ie, 0, sizeof(ie));
    998 			ie.group_cipher = ssid->group_cipher;
    999 			ie.pairwise_cipher = ssid->pairwise_cipher;
   1000 			ie.key_mgmt = ssid->key_mgmt;
   1001 #ifdef CONFIG_IEEE80211W
   1002 			ie.mgmt_group_cipher =
   1003 				ssid->ieee80211w != NO_MGMT_FRAME_PROTECTION ?
   1004 				WPA_CIPHER_AES_128_CMAC : 0;
   1005 #endif /* CONFIG_IEEE80211W */
   1006 			wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Set cipher suites "
   1007 				"based on configuration");
   1008 		} else
   1009 			proto = ie.proto;
   1010 	}
   1011 
   1012 	wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected cipher suites: group %d "
   1013 		"pairwise %d key_mgmt %d proto %d",
   1014 		ie.group_cipher, ie.pairwise_cipher, ie.key_mgmt, proto);
   1015 #ifdef CONFIG_IEEE80211W
   1016 	if (ssid->ieee80211w) {
   1017 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected mgmt group cipher %d",
   1018 			ie.mgmt_group_cipher);
   1019 	}
   1020 #endif /* CONFIG_IEEE80211W */
   1021 
   1022 	wpa_s->wpa_proto = proto;
   1023 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PROTO, proto);
   1024 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED,
   1025 			 !!(ssid->proto & WPA_PROTO_RSN));
   1026 
   1027 	if (bss || !wpa_s->ap_ies_from_associnfo) {
   1028 		if (wpa_sm_set_ap_wpa_ie(wpa_s->wpa, bss_wpa,
   1029 					 bss_wpa ? 2 + bss_wpa[1] : 0) ||
   1030 		    wpa_sm_set_ap_rsn_ie(wpa_s->wpa, bss_rsn,
   1031 					 bss_rsn ? 2 + bss_rsn[1] : 0))
   1032 			return -1;
   1033 	}
   1034 
   1035 	sel = ie.group_cipher & ssid->group_cipher;
   1036 	if (sel & WPA_CIPHER_CCMP) {
   1037 		wpa_s->group_cipher = WPA_CIPHER_CCMP;
   1038 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using GTK CCMP");
   1039 	} else if (sel & WPA_CIPHER_GCMP) {
   1040 		wpa_s->group_cipher = WPA_CIPHER_GCMP;
   1041 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using GTK GCMP");
   1042 	} else if (sel & WPA_CIPHER_TKIP) {
   1043 		wpa_s->group_cipher = WPA_CIPHER_TKIP;
   1044 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using GTK TKIP");
   1045 	} else if (sel & WPA_CIPHER_WEP104) {
   1046 		wpa_s->group_cipher = WPA_CIPHER_WEP104;
   1047 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using GTK WEP104");
   1048 	} else if (sel & WPA_CIPHER_WEP40) {
   1049 		wpa_s->group_cipher = WPA_CIPHER_WEP40;
   1050 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using GTK WEP40");
   1051 	} else {
   1052 		wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select group "
   1053 			"cipher");
   1054 		return -1;
   1055 	}
   1056 
   1057 	sel = ie.pairwise_cipher & ssid->pairwise_cipher;
   1058 	if (sel & WPA_CIPHER_CCMP) {
   1059 		wpa_s->pairwise_cipher = WPA_CIPHER_CCMP;
   1060 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using PTK CCMP");
   1061 	} else if (sel & WPA_CIPHER_GCMP) {
   1062 		wpa_s->pairwise_cipher = WPA_CIPHER_GCMP;
   1063 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using PTK GCMP");
   1064 	} else if (sel & WPA_CIPHER_TKIP) {
   1065 		wpa_s->pairwise_cipher = WPA_CIPHER_TKIP;
   1066 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using PTK TKIP");
   1067 	} else if (sel & WPA_CIPHER_NONE) {
   1068 		wpa_s->pairwise_cipher = WPA_CIPHER_NONE;
   1069 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using PTK NONE");
   1070 	} else {
   1071 		wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select pairwise "
   1072 			"cipher");
   1073 		return -1;
   1074 	}
   1075 
   1076 	sel = ie.key_mgmt & ssid->key_mgmt;
   1077 	if (0) {
   1078 #ifdef CONFIG_IEEE80211R
   1079 	} else if (sel & WPA_KEY_MGMT_FT_IEEE8021X) {
   1080 		wpa_s->key_mgmt = WPA_KEY_MGMT_FT_IEEE8021X;
   1081 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/802.1X");
   1082 	} else if (sel & WPA_KEY_MGMT_FT_PSK) {
   1083 		wpa_s->key_mgmt = WPA_KEY_MGMT_FT_PSK;
   1084 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/PSK");
   1085 #endif /* CONFIG_IEEE80211R */
   1086 #ifdef CONFIG_IEEE80211W
   1087 	} else if (sel & WPA_KEY_MGMT_IEEE8021X_SHA256) {
   1088 		wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SHA256;
   1089 		wpa_dbg(wpa_s, MSG_DEBUG,
   1090 			"WPA: using KEY_MGMT 802.1X with SHA256");
   1091 	} else if (sel & WPA_KEY_MGMT_PSK_SHA256) {
   1092 		wpa_s->key_mgmt = WPA_KEY_MGMT_PSK_SHA256;
   1093 		wpa_dbg(wpa_s, MSG_DEBUG,
   1094 			"WPA: using KEY_MGMT PSK with SHA256");
   1095 #endif /* CONFIG_IEEE80211W */
   1096 	} else if (sel & WPA_KEY_MGMT_IEEE8021X) {
   1097 		wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X;
   1098 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT 802.1X");
   1099 	} else if (sel & WPA_KEY_MGMT_PSK) {
   1100 		wpa_s->key_mgmt = WPA_KEY_MGMT_PSK;
   1101 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-PSK");
   1102 	} else if (sel & WPA_KEY_MGMT_WPA_NONE) {
   1103 		wpa_s->key_mgmt = WPA_KEY_MGMT_WPA_NONE;
   1104 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-NONE");
   1105 	} else {
   1106 		wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select "
   1107 			"authenticated key management type");
   1108 		return -1;
   1109 	}
   1110 
   1111 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
   1112 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
   1113 			 wpa_s->pairwise_cipher);
   1114 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
   1115 
   1116 #ifdef CONFIG_IEEE80211W
   1117 	sel = ie.mgmt_group_cipher;
   1118 	if (ssid->ieee80211w == NO_MGMT_FRAME_PROTECTION ||
   1119 	    !(ie.capabilities & WPA_CAPABILITY_MFPC))
   1120 		sel = 0;
   1121 	if (sel & WPA_CIPHER_AES_128_CMAC) {
   1122 		wpa_s->mgmt_group_cipher = WPA_CIPHER_AES_128_CMAC;
   1123 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
   1124 			"AES-128-CMAC");
   1125 	} else {
   1126 		wpa_s->mgmt_group_cipher = 0;
   1127 		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: not using MGMT group cipher");
   1128 	}
   1129 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
   1130 			 wpa_s->mgmt_group_cipher);
   1131 	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MFP, ssid->ieee80211w);
   1132 #endif /* CONFIG_IEEE80211W */
   1133 
   1134 	if (wpa_sm_set_assoc_wpa_ie_default(wpa_s->wpa, wpa_ie, wpa_ie_len)) {
   1135 		wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to generate WPA IE");
   1136 		return -1;
   1137 	}
   1138 
   1139 	if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt)) {
   1140 		wpa_sm_set_pmk(wpa_s->wpa, ssid->psk, PMK_LEN);
   1141 #ifndef CONFIG_NO_PBKDF2
   1142 		if (bss && ssid->bssid_set && ssid->ssid_len == 0 &&
   1143 		    ssid->passphrase) {
   1144 			u8 psk[PMK_LEN];
   1145 		        pbkdf2_sha1(ssid->passphrase, bss->ssid, bss->ssid_len,
   1146 				    4096, psk, PMK_LEN);
   1147 		        wpa_hexdump_key(MSG_MSGDUMP, "PSK (from passphrase)",
   1148 					psk, PMK_LEN);
   1149 			wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN);
   1150 		}
   1151 #endif /* CONFIG_NO_PBKDF2 */
   1152 #ifdef CONFIG_EXT_PASSWORD
   1153 		if (ssid->ext_psk) {
   1154 			struct wpabuf *pw = ext_password_get(wpa_s->ext_pw,
   1155 							     ssid->ext_psk);
   1156 			char pw_str[64 + 1];
   1157 			u8 psk[PMK_LEN];
   1158 
   1159 			if (pw == NULL) {
   1160 				wpa_msg(wpa_s, MSG_INFO, "EXT PW: No PSK "
   1161 					"found from external storage");
   1162 				return -1;
   1163 			}
   1164 
   1165 			if (wpabuf_len(pw) < 8 || wpabuf_len(pw) > 64) {
   1166 				wpa_msg(wpa_s, MSG_INFO, "EXT PW: Unexpected "
   1167 					"PSK length %d in external storage",
   1168 					(int) wpabuf_len(pw));
   1169 				ext_password_free(pw);
   1170 				return -1;
   1171 			}
   1172 
   1173 			os_memcpy(pw_str, wpabuf_head(pw), wpabuf_len(pw));
   1174 			pw_str[wpabuf_len(pw)] = '\0';
   1175 
   1176 #ifndef CONFIG_NO_PBKDF2
   1177 			if (wpabuf_len(pw) >= 8 && wpabuf_len(pw) < 64 && bss)
   1178 			{
   1179 				pbkdf2_sha1(pw_str, bss->ssid, bss->ssid_len,
   1180 					    4096, psk, PMK_LEN);
   1181 				os_memset(pw_str, 0, sizeof(pw_str));
   1182 				wpa_hexdump_key(MSG_MSGDUMP, "PSK (from "
   1183 						"external passphrase)",
   1184 						psk, PMK_LEN);
   1185 				wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN);
   1186 			} else
   1187 #endif /* CONFIG_NO_PBKDF2 */
   1188 			if (wpabuf_len(pw) == 2 * PMK_LEN) {
   1189 				if (hexstr2bin(pw_str, psk, PMK_LEN) < 0) {
   1190 					wpa_msg(wpa_s, MSG_INFO, "EXT PW: "
   1191 						"Invalid PSK hex string");
   1192 					os_memset(pw_str, 0, sizeof(pw_str));
   1193 					ext_password_free(pw);
   1194 					return -1;
   1195 				}
   1196 				wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN);
   1197 			} else {
   1198 				wpa_msg(wpa_s, MSG_INFO, "EXT PW: No suitable "
   1199 					"PSK available");
   1200 				os_memset(pw_str, 0, sizeof(pw_str));
   1201 				ext_password_free(pw);
   1202 				return -1;
   1203 			}
   1204 
   1205 			os_memset(pw_str, 0, sizeof(pw_str));
   1206 			ext_password_free(pw);
   1207 		}
   1208 #endif /* CONFIG_EXT_PASSWORD */
   1209 	} else
   1210 		wpa_sm_set_pmk_from_pmksa(wpa_s->wpa);
   1211 
   1212 	return 0;
   1213 }
   1214 
   1215 
   1216 /**
   1217  * wpa_supplicant_associate - Request association
   1218  * @wpa_s: Pointer to wpa_supplicant data
   1219  * @bss: Scan results for the selected BSS, or %NULL if not available
   1220  * @ssid: Configuration data for the selected network
   1221  *
   1222  * This function is used to request %wpa_supplicant to associate with a BSS.
   1223  */
   1224 void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
   1225 			      struct wpa_bss *bss, struct wpa_ssid *ssid)
   1226 {
   1227 	u8 wpa_ie[200];
   1228 	size_t wpa_ie_len;
   1229 	int use_crypt, ret, i, bssid_changed;
   1230 	int algs = WPA_AUTH_ALG_OPEN;
   1231 	enum wpa_cipher cipher_pairwise, cipher_group;
   1232 	struct wpa_driver_associate_params params;
   1233 	int wep_keys_set = 0;
   1234 	struct wpa_driver_capa capa;
   1235 	int assoc_failed = 0;
   1236 	struct wpa_ssid *old_ssid;
   1237 #ifdef CONFIG_HT_OVERRIDES
   1238 	struct ieee80211_ht_capabilities htcaps;
   1239 	struct ieee80211_ht_capabilities htcaps_mask;
   1240 #endif /* CONFIG_HT_OVERRIDES */
   1241 
   1242 #ifdef CONFIG_IBSS_RSN
   1243 	ibss_rsn_deinit(wpa_s->ibss_rsn);
   1244 	wpa_s->ibss_rsn = NULL;
   1245 #endif /* CONFIG_IBSS_RSN */
   1246 #ifdef ANDROID_P2P
   1247 	int freq = 0;
   1248 #endif
   1249 
   1250 	if (ssid->mode == WPAS_MODE_AP || ssid->mode == WPAS_MODE_P2P_GO ||
   1251 	    ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) {
   1252 #ifdef CONFIG_AP
   1253 		if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_AP)) {
   1254 			wpa_msg(wpa_s, MSG_INFO, "Driver does not support AP "
   1255 				"mode");
   1256 			return;
   1257 		}
   1258 		if (wpa_supplicant_create_ap(wpa_s, ssid) < 0) {
   1259 			wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
   1260 			return;
   1261 		}
   1262 		wpa_s->current_bss = bss;
   1263 #else /* CONFIG_AP */
   1264 		wpa_msg(wpa_s, MSG_ERROR, "AP mode support not included in "
   1265 			"the build");
   1266 #endif /* CONFIG_AP */
   1267 		return;
   1268 	}
   1269 
   1270 #ifdef CONFIG_TDLS
   1271 	if (bss)
   1272 		wpa_tdls_ap_ies(wpa_s->wpa, (const u8 *) (bss + 1),
   1273 				bss->ie_len);
   1274 #endif /* CONFIG_TDLS */
   1275 
   1276 	if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) &&
   1277 	    ssid->mode == IEEE80211_MODE_INFRA) {
   1278 		sme_authenticate(wpa_s, bss, ssid);
   1279 		return;
   1280 	}
   1281 
   1282 	os_memset(&params, 0, sizeof(params));
   1283 	wpa_s->reassociate = 0;
   1284 	if (bss && !wpas_driver_bss_selection(wpa_s)) {
   1285 #ifdef CONFIG_IEEE80211R
   1286 		const u8 *ie, *md = NULL;
   1287 #endif /* CONFIG_IEEE80211R */
   1288 		wpa_msg(wpa_s, MSG_INFO, "Trying to associate with " MACSTR
   1289 			" (SSID='%s' freq=%d MHz)", MAC2STR(bss->bssid),
   1290 			wpa_ssid_txt(bss->ssid, bss->ssid_len), bss->freq);
   1291 		bssid_changed = !is_zero_ether_addr(wpa_s->bssid);
   1292 		os_memset(wpa_s->bssid, 0, ETH_ALEN);
   1293 		os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN);
   1294 		if (bssid_changed)
   1295 			wpas_notify_bssid_changed(wpa_s);
   1296 #ifdef CONFIG_IEEE80211R
   1297 		ie = wpa_bss_get_ie(bss, WLAN_EID_MOBILITY_DOMAIN);
   1298 		if (ie && ie[1] >= MOBILITY_DOMAIN_ID_LEN)
   1299 			md = ie + 2;
   1300 		wpa_sm_set_ft_params(wpa_s->wpa, ie, ie ? 2 + ie[1] : 0);
   1301 		if (md) {
   1302 			/* Prepare for the next transition */
   1303 			wpa_ft_prepare_auth_request(wpa_s->wpa, ie);
   1304 		}
   1305 #endif /* CONFIG_IEEE80211R */
   1306 #ifdef CONFIG_WPS
   1307 	} else if ((ssid->ssid == NULL || ssid->ssid_len == 0) &&
   1308 		   wpa_s->conf->ap_scan == 2 &&
   1309 		   (ssid->key_mgmt & WPA_KEY_MGMT_WPS)) {
   1310 		/* Use ap_scan==1 style network selection to find the network
   1311 		 */
   1312 		wpa_s->scan_req = 2;
   1313 		wpa_s->reassociate = 1;
   1314 		wpa_supplicant_req_scan(wpa_s, 0, 0);
   1315 		return;
   1316 #endif /* CONFIG_WPS */
   1317 	} else {
   1318 		wpa_msg(wpa_s, MSG_INFO, "Trying to associate with SSID '%s'",
   1319 			wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
   1320 		os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
   1321 	}
   1322 	wpa_supplicant_cancel_sched_scan(wpa_s);
   1323 	wpa_supplicant_cancel_scan(wpa_s);
   1324 
   1325 	/* Starting new association, so clear the possibly used WPA IE from the
   1326 	 * previous association. */
   1327 	wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
   1328 
   1329 #ifdef IEEE8021X_EAPOL
   1330 	if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
   1331 		if (ssid->leap) {
   1332 			if (ssid->non_leap == 0)
   1333 				algs = WPA_AUTH_ALG_LEAP;
   1334 			else
   1335 				algs |= WPA_AUTH_ALG_LEAP;
   1336 		}
   1337 	}
   1338 #endif /* IEEE8021X_EAPOL */
   1339 	wpa_dbg(wpa_s, MSG_DEBUG, "Automatic auth_alg selection: 0x%x", algs);
   1340 	if (ssid->auth_alg) {
   1341 		algs = ssid->auth_alg;
   1342 		wpa_dbg(wpa_s, MSG_DEBUG, "Overriding auth_alg selection: "
   1343 			"0x%x", algs);
   1344 	}
   1345 
   1346 	if (bss && (wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE) ||
   1347 		    wpa_bss_get_ie(bss, WLAN_EID_RSN)) &&
   1348 	    wpa_key_mgmt_wpa(ssid->key_mgmt)) {
   1349 		int try_opportunistic;
   1350 		try_opportunistic = ssid->proactive_key_caching &&
   1351 			(ssid->proto & WPA_PROTO_RSN);
   1352 		if (pmksa_cache_set_current(wpa_s->wpa, NULL, bss->bssid,
   1353 					    wpa_s->current_ssid,
   1354 					    try_opportunistic) == 0)
   1355 			eapol_sm_notify_pmkid_attempt(wpa_s->eapol, 1);
   1356 		wpa_ie_len = sizeof(wpa_ie);
   1357 		if (wpa_supplicant_set_suites(wpa_s, bss, ssid,
   1358 					      wpa_ie, &wpa_ie_len)) {
   1359 			wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA "
   1360 				"key management and encryption suites");
   1361 			return;
   1362 		}
   1363 	} else if ((ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) && bss &&
   1364 		   wpa_key_mgmt_wpa_ieee8021x(ssid->key_mgmt)) {
   1365 		/*
   1366 		 * Both WPA and non-WPA IEEE 802.1X enabled in configuration -
   1367 		 * use non-WPA since the scan results did not indicate that the
   1368 		 * AP is using WPA or WPA2.
   1369 		 */
   1370 		wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
   1371 		wpa_ie_len = 0;
   1372 		wpa_s->wpa_proto = 0;
   1373 	} else if (wpa_key_mgmt_wpa_any(ssid->key_mgmt)) {
   1374 		wpa_ie_len = sizeof(wpa_ie);
   1375 		if (wpa_supplicant_set_suites(wpa_s, NULL, ssid,
   1376 					      wpa_ie, &wpa_ie_len)) {
   1377 			wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA "
   1378 				"key management and encryption suites (no "
   1379 				"scan results)");
   1380 			return;
   1381 		}
   1382 #ifdef CONFIG_WPS
   1383 	} else if (ssid->key_mgmt & WPA_KEY_MGMT_WPS) {
   1384 		struct wpabuf *wps_ie;
   1385 		wps_ie = wps_build_assoc_req_ie(wpas_wps_get_req_type(ssid));
   1386 		if (wps_ie && wpabuf_len(wps_ie) <= sizeof(wpa_ie)) {
   1387 			wpa_ie_len = wpabuf_len(wps_ie);
   1388 			os_memcpy(wpa_ie, wpabuf_head(wps_ie), wpa_ie_len);
   1389 		} else
   1390 			wpa_ie_len = 0;
   1391 		wpabuf_free(wps_ie);
   1392 		wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
   1393 		if (!bss || (bss->caps & IEEE80211_CAP_PRIVACY))
   1394 			params.wps = WPS_MODE_PRIVACY;
   1395 		else
   1396 			params.wps = WPS_MODE_OPEN;
   1397 		wpa_s->wpa_proto = 0;
   1398 #endif /* CONFIG_WPS */
   1399 	} else {
   1400 		wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
   1401 		wpa_ie_len = 0;
   1402 		wpa_s->wpa_proto = 0;
   1403 	}
   1404 
   1405 #ifdef CONFIG_P2P
   1406 	if (wpa_s->global->p2p) {
   1407 		u8 *pos;
   1408 		size_t len;
   1409 		int res;
   1410 		pos = wpa_ie + wpa_ie_len;
   1411 		len = sizeof(wpa_ie) - wpa_ie_len;
   1412 		res = wpas_p2p_assoc_req_ie(wpa_s, bss, pos, len,
   1413 					    ssid->p2p_group);
   1414 		if (res >= 0)
   1415 			wpa_ie_len += res;
   1416 	}
   1417 
   1418 	wpa_s->cross_connect_disallowed = 0;
   1419 	if (bss) {
   1420 		struct wpabuf *p2p;
   1421 		p2p = wpa_bss_get_vendor_ie_multi(bss, P2P_IE_VENDOR_TYPE);
   1422 		if (p2p) {
   1423 			wpa_s->cross_connect_disallowed =
   1424 				p2p_get_cross_connect_disallowed(p2p);
   1425 			wpabuf_free(p2p);
   1426 			wpa_dbg(wpa_s, MSG_DEBUG, "P2P: WLAN AP %s cross "
   1427 				"connection",
   1428 				wpa_s->cross_connect_disallowed ?
   1429 				"disallows" : "allows");
   1430 		}
   1431 	}
   1432 #endif /* CONFIG_P2P */
   1433 
   1434 #ifdef CONFIG_HS20
   1435 	if (wpa_s->conf->hs20) {
   1436 		struct wpabuf *hs20;
   1437 		hs20 = wpabuf_alloc(20);
   1438 		if (hs20) {
   1439 			wpas_hs20_add_indication(hs20);
   1440 			os_memcpy(wpa_ie + wpa_ie_len, wpabuf_head(hs20),
   1441 				  wpabuf_len(hs20));
   1442 			wpa_ie_len += wpabuf_len(hs20);
   1443 			wpabuf_free(hs20);
   1444 		}
   1445 	}
   1446 #endif /* CONFIG_HS20 */
   1447 
   1448 #ifdef CONFIG_INTERWORKING
   1449 	if (wpa_s->conf->interworking) {
   1450 		u8 *pos = wpa_ie;
   1451 		if (wpa_ie_len > 0 && pos[0] == WLAN_EID_RSN)
   1452 			pos += 2 + pos[1];
   1453 		os_memmove(pos + 6, pos, wpa_ie_len - (pos - wpa_ie));
   1454 		wpa_ie_len += 6;
   1455 		*pos++ = WLAN_EID_EXT_CAPAB;
   1456 		*pos++ = 4;
   1457 		*pos++ = 0x00;
   1458 		*pos++ = 0x00;
   1459 		*pos++ = 0x00;
   1460 		*pos++ = 0x80; /* Bit 31 - Interworking */
   1461 	}
   1462 #endif /* CONFIG_INTERWORKING */
   1463 
   1464 	wpa_clear_keys(wpa_s, bss ? bss->bssid : NULL);
   1465 	use_crypt = 1;
   1466 	cipher_pairwise = cipher_suite2driver(wpa_s->pairwise_cipher);
   1467 	cipher_group = cipher_suite2driver(wpa_s->group_cipher);
   1468 	if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
   1469 	    wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
   1470 		if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE)
   1471 			use_crypt = 0;
   1472 		if (wpa_set_wep_keys(wpa_s, ssid)) {
   1473 			use_crypt = 1;
   1474 			wep_keys_set = 1;
   1475 		}
   1476 	}
   1477 	if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS)
   1478 		use_crypt = 0;
   1479 
   1480 #ifdef IEEE8021X_EAPOL
   1481 	if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
   1482 		if ((ssid->eapol_flags &
   1483 		     (EAPOL_FLAG_REQUIRE_KEY_UNICAST |
   1484 		      EAPOL_FLAG_REQUIRE_KEY_BROADCAST)) == 0 &&
   1485 		    !wep_keys_set) {
   1486 			use_crypt = 0;
   1487 		} else {
   1488 			/* Assume that dynamic WEP-104 keys will be used and
   1489 			 * set cipher suites in order for drivers to expect
   1490 			 * encryption. */
   1491 			cipher_pairwise = cipher_group = CIPHER_WEP104;
   1492 		}
   1493 	}
   1494 #endif /* IEEE8021X_EAPOL */
   1495 
   1496 	if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
   1497 		/* Set the key before (and later after) association */
   1498 		wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
   1499 	}
   1500 
   1501 	wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING);
   1502 	if (bss) {
   1503 		params.ssid = bss->ssid;
   1504 		params.ssid_len = bss->ssid_len;
   1505 		if (!wpas_driver_bss_selection(wpa_s) || ssid->bssid_set) {
   1506 			wpa_printf(MSG_DEBUG, "Limit connection to BSSID "
   1507 				   MACSTR " freq=%u MHz based on scan results "
   1508 				   "(bssid_set=%d)",
   1509 				   MAC2STR(bss->bssid), bss->freq,
   1510 				   ssid->bssid_set);
   1511 			params.bssid = bss->bssid;
   1512 			params.freq = bss->freq;
   1513 		}
   1514 	} else {
   1515 		params.ssid = ssid->ssid;
   1516 		params.ssid_len = ssid->ssid_len;
   1517 	}
   1518 
   1519 	if (ssid->mode == WPAS_MODE_IBSS && ssid->bssid_set &&
   1520 	    wpa_s->conf->ap_scan == 2) {
   1521 		params.bssid = ssid->bssid;
   1522 		params.fixed_bssid = 1;
   1523 	}
   1524 
   1525 	if (ssid->mode == WPAS_MODE_IBSS && ssid->frequency > 0 &&
   1526 	    params.freq == 0)
   1527 		params.freq = ssid->frequency; /* Initial channel for IBSS */
   1528 	params.wpa_ie = wpa_ie;
   1529 	params.wpa_ie_len = wpa_ie_len;
   1530 	params.pairwise_suite = cipher_pairwise;
   1531 	params.group_suite = cipher_group;
   1532 	params.key_mgmt_suite = key_mgmt2driver(wpa_s->key_mgmt);
   1533 	params.wpa_proto = wpa_s->wpa_proto;
   1534 	params.auth_alg = algs;
   1535 	params.mode = ssid->mode;
   1536 	params.bg_scan_period = ssid->bg_scan_period;
   1537 	for (i = 0; i < NUM_WEP_KEYS; i++) {
   1538 		if (ssid->wep_key_len[i])
   1539 			params.wep_key[i] = ssid->wep_key[i];
   1540 		params.wep_key_len[i] = ssid->wep_key_len[i];
   1541 	}
   1542 	params.wep_tx_keyidx = ssid->wep_tx_keyidx;
   1543 
   1544 	if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) &&
   1545 	    (params.key_mgmt_suite == KEY_MGMT_PSK ||
   1546 	     params.key_mgmt_suite == KEY_MGMT_FT_PSK)) {
   1547 		params.passphrase = ssid->passphrase;
   1548 		if (ssid->psk_set)
   1549 			params.psk = ssid->psk;
   1550 	}
   1551 
   1552 	params.drop_unencrypted = use_crypt;
   1553 
   1554 #ifdef CONFIG_IEEE80211W
   1555 	params.mgmt_frame_protection = ssid->ieee80211w;
   1556 	if (ssid->ieee80211w != NO_MGMT_FRAME_PROTECTION && bss) {
   1557 		const u8 *rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
   1558 		struct wpa_ie_data ie;
   1559 		if (rsn && wpa_parse_wpa_ie(rsn, 2 + rsn[1], &ie) == 0 &&
   1560 		    ie.capabilities &
   1561 		    (WPA_CAPABILITY_MFPC | WPA_CAPABILITY_MFPR)) {
   1562 			wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected AP supports "
   1563 				"MFP: require MFP");
   1564 			params.mgmt_frame_protection =
   1565 				MGMT_FRAME_PROTECTION_REQUIRED;
   1566 		}
   1567 	}
   1568 #endif /* CONFIG_IEEE80211W */
   1569 
   1570 	params.p2p = ssid->p2p_group;
   1571 
   1572 	if (wpa_s->parent->set_sta_uapsd)
   1573 		params.uapsd = wpa_s->parent->sta_uapsd;
   1574 	else
   1575 		params.uapsd = -1;
   1576 
   1577 #ifdef CONFIG_HT_OVERRIDES
   1578 	os_memset(&htcaps, 0, sizeof(htcaps));
   1579 	os_memset(&htcaps_mask, 0, sizeof(htcaps_mask));
   1580 	params.htcaps = (u8 *) &htcaps;
   1581 	params.htcaps_mask = (u8 *) &htcaps_mask;
   1582 	wpa_supplicant_apply_ht_overrides(wpa_s, ssid, &params);
   1583 #endif /* CONFIG_HT_OVERRIDES */
   1584 
   1585 #ifdef ANDROID_P2P
   1586 	/* If multichannel concurrency is not supported, check for any frequency
   1587 	 * conflict and take appropriate action.
   1588 	 */
   1589 	if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_MULTI_CHANNEL_CONCURRENT) &&
   1590 		((freq = wpa_drv_shared_freq(wpa_s)) > 0) && (freq != params.freq)) {
   1591 		wpa_printf(MSG_DEBUG, "Shared interface with conflicting frequency found (%d != %d)"
   1592 																, freq, params.freq);
   1593 		if (wpas_p2p_handle_frequency_conflicts(wpa_s, params.freq) < 0) {
   1594 			/* Handling conflicts failed. Disable the current connect req and
   1595 			 * notify the userspace to take appropriate action */
   1596 			wpa_printf(MSG_DEBUG, "proiritize is not set. Notifying user space to handle the case");
   1597 			wpa_supplicant_disable_network(wpa_s, ssid);
   1598 			wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_FREQ_CONFLICT
   1599 				" id=%d", ssid->id);
   1600 			os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
   1601 			return;
   1602 		}
   1603 	}
   1604 #endif
   1605 	ret = wpa_drv_associate(wpa_s, &params);
   1606 	if (ret < 0) {
   1607 		wpa_msg(wpa_s, MSG_INFO, "Association request to the driver "
   1608 			"failed");
   1609 		if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SANE_ERROR_CODES) {
   1610 			/*
   1611 			 * The driver is known to mean what is saying, so we
   1612 			 * can stop right here; the association will not
   1613 			 * succeed.
   1614 			 */
   1615 			wpas_connection_failed(wpa_s, wpa_s->pending_bssid);
   1616 			wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
   1617 			os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
   1618 			return;
   1619 		}
   1620 		/* try to continue anyway; new association will be tried again
   1621 		 * after timeout */
   1622 		assoc_failed = 1;
   1623 	}
   1624 
   1625 	if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
   1626 		/* Set the key after the association just in case association
   1627 		 * cleared the previously configured key. */
   1628 		wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
   1629 		/* No need to timeout authentication since there is no key
   1630 		 * management. */
   1631 		wpa_supplicant_cancel_auth_timeout(wpa_s);
   1632 		wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
   1633 #ifdef CONFIG_IBSS_RSN
   1634 	} else if (ssid->mode == WPAS_MODE_IBSS &&
   1635 		   wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
   1636 		   wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
   1637 		/*
   1638 		 * RSN IBSS authentication is per-STA and we can disable the
   1639 		 * per-BSSID authentication.
   1640 		 */
   1641 		wpa_supplicant_cancel_auth_timeout(wpa_s);
   1642 #endif /* CONFIG_IBSS_RSN */
   1643 	} else {
   1644 		/* Timeout for IEEE 802.11 authentication and association */
   1645 		int timeout = 60;
   1646 
   1647 		if (assoc_failed) {
   1648 			/* give IBSS a bit more time */
   1649 			timeout = ssid->mode == WPAS_MODE_IBSS ? 10 : 5;
   1650 		} else if (wpa_s->conf->ap_scan == 1) {
   1651 			/* give IBSS a bit more time */
   1652 			timeout = ssid->mode == WPAS_MODE_IBSS ? 20 : 10;
   1653 		}
   1654 		wpa_supplicant_req_auth_timeout(wpa_s, timeout, 0);
   1655 	}
   1656 
   1657 	if (wep_keys_set && wpa_drv_get_capa(wpa_s, &capa) == 0 &&
   1658 	    capa.flags & WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC) {
   1659 		/* Set static WEP keys again */
   1660 		wpa_set_wep_keys(wpa_s, ssid);
   1661 	}
   1662 
   1663 	if (wpa_s->current_ssid && wpa_s->current_ssid != ssid) {
   1664 		/*
   1665 		 * Do not allow EAP session resumption between different
   1666 		 * network configurations.
   1667 		 */
   1668 		eapol_sm_invalidate_cached_session(wpa_s->eapol);
   1669 	}
   1670 	old_ssid = wpa_s->current_ssid;
   1671 	wpa_s->current_ssid = ssid;
   1672 	wpa_s->current_bss = bss;
   1673 	wpa_supplicant_rsn_supp_set_config(wpa_s, wpa_s->current_ssid);
   1674 	wpa_supplicant_initiate_eapol(wpa_s);
   1675 	if (old_ssid != wpa_s->current_ssid)
   1676 		wpas_notify_network_changed(wpa_s);
   1677 }
   1678 
   1679 
   1680 static void wpa_supplicant_clear_connection(struct wpa_supplicant *wpa_s,
   1681 					    const u8 *addr)
   1682 {
   1683 	struct wpa_ssid *old_ssid;
   1684 
   1685 	wpa_clear_keys(wpa_s, addr);
   1686 	old_ssid = wpa_s->current_ssid;
   1687 	wpa_supplicant_mark_disassoc(wpa_s);
   1688 	wpa_sm_set_config(wpa_s->wpa, NULL);
   1689 	eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
   1690 	if (old_ssid != wpa_s->current_ssid)
   1691 		wpas_notify_network_changed(wpa_s);
   1692 	eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
   1693 }
   1694 
   1695 
   1696 /**
   1697  * wpa_supplicant_disassociate - Disassociate the current connection
   1698  * @wpa_s: Pointer to wpa_supplicant data
   1699  * @reason_code: IEEE 802.11 reason code for the disassociate frame
   1700  *
   1701  * This function is used to request %wpa_supplicant to disassociate with the
   1702  * current AP.
   1703  */
   1704 void wpa_supplicant_disassociate(struct wpa_supplicant *wpa_s,
   1705 				 int reason_code)
   1706 {
   1707 	u8 *addr = NULL;
   1708 	union wpa_event_data event;
   1709 
   1710 	if (!is_zero_ether_addr(wpa_s->bssid)) {
   1711 		wpa_drv_disassociate(wpa_s, wpa_s->bssid, reason_code);
   1712 		addr = wpa_s->bssid;
   1713 		os_memset(&event, 0, sizeof(event));
   1714 		event.disassoc_info.reason_code = (u16) reason_code;
   1715 		event.disassoc_info.locally_generated = 1;
   1716 		wpa_supplicant_event(wpa_s, EVENT_DISASSOC, &event);
   1717 	}
   1718 
   1719 	wpa_supplicant_clear_connection(wpa_s, addr);
   1720 }
   1721 
   1722 
   1723 /**
   1724  * wpa_supplicant_deauthenticate - Deauthenticate the current connection
   1725  * @wpa_s: Pointer to wpa_supplicant data
   1726  * @reason_code: IEEE 802.11 reason code for the deauthenticate frame
   1727  *
   1728  * This function is used to request %wpa_supplicant to deauthenticate from the
   1729  * current AP.
   1730  */
   1731 void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
   1732 				   int reason_code)
   1733 {
   1734 	u8 *addr = NULL;
   1735 	union wpa_event_data event;
   1736 
   1737 	if (!is_zero_ether_addr(wpa_s->bssid)) {
   1738 		wpa_drv_deauthenticate(wpa_s, wpa_s->bssid, reason_code);
   1739 		addr = wpa_s->bssid;
   1740 		os_memset(&event, 0, sizeof(event));
   1741 		event.deauth_info.reason_code = (u16) reason_code;
   1742 		event.deauth_info.locally_generated = 1;
   1743 		wpa_supplicant_event(wpa_s, EVENT_DEAUTH, &event);
   1744 	}
   1745 
   1746 	wpa_supplicant_clear_connection(wpa_s, addr);
   1747 }
   1748 
   1749 
   1750 /**
   1751  * wpa_supplicant_enable_network - Mark a configured network as enabled
   1752  * @wpa_s: wpa_supplicant structure for a network interface
   1753  * @ssid: wpa_ssid structure for a configured network or %NULL
   1754  *
   1755  * Enables the specified network or all networks if no network specified.
   1756  */
   1757 void wpa_supplicant_enable_network(struct wpa_supplicant *wpa_s,
   1758 				   struct wpa_ssid *ssid)
   1759 {
   1760 	struct wpa_ssid *other_ssid;
   1761 	int was_disabled;
   1762 
   1763 	if (ssid == NULL) {
   1764 		for (other_ssid = wpa_s->conf->ssid; other_ssid;
   1765 		     other_ssid = other_ssid->next) {
   1766 			if (other_ssid->disabled == 2)
   1767 				continue; /* do not change persistent P2P group
   1768 					   * data */
   1769 			if (other_ssid == wpa_s->current_ssid &&
   1770 			    other_ssid->disabled)
   1771 				wpa_s->reassociate = 1;
   1772 
   1773 			was_disabled = other_ssid->disabled;
   1774 
   1775 			other_ssid->disabled = 0;
   1776 			if (was_disabled)
   1777 				wpas_clear_temp_disabled(wpa_s, other_ssid, 0);
   1778 
   1779 			if (was_disabled != other_ssid->disabled)
   1780 				wpas_notify_network_enabled_changed(
   1781 					wpa_s, other_ssid);
   1782 		}
   1783 		if (wpa_s->reassociate)
   1784 			wpa_supplicant_req_scan(wpa_s, 0, 0);
   1785 	} else if (ssid->disabled && ssid->disabled != 2) {
   1786 		if (wpa_s->current_ssid == NULL) {
   1787 			/*
   1788 			 * Try to reassociate since there is no current
   1789 			 * configuration and a new network was made available.
   1790 			 */
   1791 			wpa_s->reassociate = 1;
   1792 			wpa_supplicant_req_scan(wpa_s, 0, 0);
   1793 		}
   1794 
   1795 		was_disabled = ssid->disabled;
   1796 
   1797 		ssid->disabled = 0;
   1798 		wpas_clear_temp_disabled(wpa_s, ssid, 1);
   1799 
   1800 		if (was_disabled != ssid->disabled)
   1801 			wpas_notify_network_enabled_changed(wpa_s, ssid);
   1802 	}
   1803 }
   1804 
   1805 
   1806 /**
   1807  * wpa_supplicant_disable_network - Mark a configured network as disabled
   1808  * @wpa_s: wpa_supplicant structure for a network interface
   1809  * @ssid: wpa_ssid structure for a configured network or %NULL
   1810  *
   1811  * Disables the specified network or all networks if no network specified.
   1812  */
   1813 void wpa_supplicant_disable_network(struct wpa_supplicant *wpa_s,
   1814 				    struct wpa_ssid *ssid)
   1815 {
   1816 	struct wpa_ssid *other_ssid;
   1817 	int was_disabled;
   1818 
   1819 	if (ssid == NULL) {
   1820 		for (other_ssid = wpa_s->conf->ssid; other_ssid;
   1821 		     other_ssid = other_ssid->next) {
   1822 			was_disabled = other_ssid->disabled;
   1823 			if (was_disabled == 2)
   1824 				continue; /* do not change persistent P2P group
   1825 					   * data */
   1826 
   1827 			other_ssid->disabled = 1;
   1828 
   1829 			if (was_disabled != other_ssid->disabled)
   1830 				wpas_notify_network_enabled_changed(
   1831 					wpa_s, other_ssid);
   1832 		}
   1833 		if (wpa_s->current_ssid)
   1834 			wpa_supplicant_disassociate(
   1835 				wpa_s, WLAN_REASON_DEAUTH_LEAVING);
   1836 	} else if (ssid->disabled != 2) {
   1837 		if (ssid == wpa_s->current_ssid)
   1838 			wpa_supplicant_disassociate(
   1839 				wpa_s, WLAN_REASON_DEAUTH_LEAVING);
   1840 
   1841 		was_disabled = ssid->disabled;
   1842 
   1843 		ssid->disabled = 1;
   1844 
   1845 		if (was_disabled != ssid->disabled)
   1846 			wpas_notify_network_enabled_changed(wpa_s, ssid);
   1847 	}
   1848 }
   1849 
   1850 
   1851 /**
   1852  * wpa_supplicant_select_network - Attempt association with a network
   1853  * @wpa_s: wpa_supplicant structure for a network interface
   1854  * @ssid: wpa_ssid structure for a configured network or %NULL for any network
   1855  */
   1856 void wpa_supplicant_select_network(struct wpa_supplicant *wpa_s,
   1857 				   struct wpa_ssid *ssid)
   1858 {
   1859 
   1860 	struct wpa_ssid *other_ssid;
   1861 	int disconnected = 0;
   1862 
   1863 	if (ssid && ssid != wpa_s->current_ssid && wpa_s->current_ssid) {
   1864 		wpa_supplicant_disassociate(
   1865 			wpa_s, WLAN_REASON_DEAUTH_LEAVING);
   1866 		disconnected = 1;
   1867 	}
   1868 
   1869 	if (ssid)
   1870 		wpas_clear_temp_disabled(wpa_s, ssid, 1);
   1871 
   1872 	/*
   1873 	 * Mark all other networks disabled or mark all networks enabled if no
   1874 	 * network specified.
   1875 	 */
   1876 	for (other_ssid = wpa_s->conf->ssid; other_ssid;
   1877 	     other_ssid = other_ssid->next) {
   1878 		int was_disabled = other_ssid->disabled;
   1879 		if (was_disabled == 2)
   1880 			continue; /* do not change persistent P2P group data */
   1881 
   1882 		other_ssid->disabled = ssid ? (ssid->id != other_ssid->id) : 0;
   1883 		if (was_disabled && !other_ssid->disabled)
   1884 			wpas_clear_temp_disabled(wpa_s, other_ssid, 0);
   1885 
   1886 		if (was_disabled != other_ssid->disabled)
   1887 			wpas_notify_network_enabled_changed(wpa_s, other_ssid);
   1888 	}
   1889 
   1890 	if (ssid && ssid == wpa_s->current_ssid && wpa_s->current_ssid) {
   1891 		/* We are already associated with the selected network */
   1892 		wpa_printf(MSG_DEBUG, "Already associated with the "
   1893 			   "selected network - do nothing");
   1894 		return;
   1895 	}
   1896 
   1897 	if (ssid)
   1898 		wpa_s->current_ssid = ssid;
   1899 	wpa_s->connect_without_scan = NULL;
   1900 	wpa_s->disconnected = 0;
   1901 	wpa_s->reassociate = 1;
   1902 	wpa_supplicant_req_scan(wpa_s, 0, disconnected ? 100000 : 0);
   1903 
   1904 	if (ssid)
   1905 		wpas_notify_network_selected(wpa_s, ssid);
   1906 }
   1907 
   1908 
   1909 /**
   1910  * wpa_supplicant_set_ap_scan - Set AP scan mode for interface
   1911  * @wpa_s: wpa_supplicant structure for a network interface
   1912  * @ap_scan: AP scan mode
   1913  * Returns: 0 if succeed or -1 if ap_scan has an invalid value
   1914  *
   1915  */
   1916 int wpa_supplicant_set_ap_scan(struct wpa_supplicant *wpa_s, int ap_scan)
   1917 {
   1918 
   1919 	int old_ap_scan;
   1920 
   1921 	if (ap_scan < 0 || ap_scan > 2)
   1922 		return -1;
   1923 
   1924 #ifdef ANDROID
   1925 	if (ap_scan == 2 && ap_scan != wpa_s->conf->ap_scan &&
   1926 	    wpa_s->wpa_state >= WPA_ASSOCIATING &&
   1927 	    wpa_s->wpa_state < WPA_COMPLETED) {
   1928 		wpa_printf(MSG_ERROR, "ap_scan = %d (%d) rejected while "
   1929 			   "associating", wpa_s->conf->ap_scan, ap_scan);
   1930 		return 0;
   1931 	}
   1932 #endif /* ANDROID */
   1933 
   1934 	old_ap_scan = wpa_s->conf->ap_scan;
   1935 	wpa_s->conf->ap_scan = ap_scan;
   1936 
   1937 	if (old_ap_scan != wpa_s->conf->ap_scan)
   1938 		wpas_notify_ap_scan_changed(wpa_s);
   1939 
   1940 	return 0;
   1941 }
   1942 
   1943 
   1944 /**
   1945  * wpa_supplicant_set_bss_expiration_age - Set BSS entry expiration age
   1946  * @wpa_s: wpa_supplicant structure for a network interface
   1947  * @expire_age: Expiration age in seconds
   1948  * Returns: 0 if succeed or -1 if expire_age has an invalid value
   1949  *
   1950  */
   1951 int wpa_supplicant_set_bss_expiration_age(struct wpa_supplicant *wpa_s,
   1952 					  unsigned int bss_expire_age)
   1953 {
   1954 	if (bss_expire_age < 10) {
   1955 		wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration age %u",
   1956 			bss_expire_age);
   1957 		return -1;
   1958 	}
   1959 	wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration age: %d sec",
   1960 		bss_expire_age);
   1961 	wpa_s->conf->bss_expiration_age = bss_expire_age;
   1962 
   1963 	return 0;
   1964 }
   1965 
   1966 
   1967 /**
   1968  * wpa_supplicant_set_bss_expiration_count - Set BSS entry expiration scan count
   1969  * @wpa_s: wpa_supplicant structure for a network interface
   1970  * @expire_count: number of scans after which an unseen BSS is reclaimed
   1971  * Returns: 0 if succeed or -1 if expire_count has an invalid value
   1972  *
   1973  */
   1974 int wpa_supplicant_set_bss_expiration_count(struct wpa_supplicant *wpa_s,
   1975 					    unsigned int bss_expire_count)
   1976 {
   1977 	if (bss_expire_count < 1) {
   1978 		wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration count %u",
   1979 			bss_expire_count);
   1980 		return -1;
   1981 	}
   1982 	wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration scan count: %u",
   1983 		bss_expire_count);
   1984 	wpa_s->conf->bss_expiration_scan_count = bss_expire_count;
   1985 
   1986 	return 0;
   1987 }
   1988 
   1989 
   1990 /**
   1991  * wpa_supplicant_set_scan_interval - Set scan interval
   1992  * @wpa_s: wpa_supplicant structure for a network interface
   1993  * @scan_interval: scan interval in seconds
   1994  * Returns: 0 if succeed or -1 if scan_interval has an invalid value
   1995  *
   1996  */
   1997 int wpa_supplicant_set_scan_interval(struct wpa_supplicant *wpa_s,
   1998 				     int scan_interval)
   1999 {
   2000 	if (scan_interval < 0) {
   2001 		wpa_msg(wpa_s, MSG_ERROR, "Invalid scan interval %d",
   2002 			scan_interval);
   2003 		return -1;
   2004 	}
   2005 	wpa_msg(wpa_s, MSG_DEBUG, "Setting scan interval: %d sec",
   2006 		scan_interval);
   2007 	wpa_s->scan_interval = scan_interval;
   2008 
   2009 	return 0;
   2010 }
   2011 
   2012 
   2013 /**
   2014  * wpa_supplicant_set_debug_params - Set global debug params
   2015  * @global: wpa_global structure
   2016  * @debug_level: debug level
   2017  * @debug_timestamp: determines if show timestamp in debug data
   2018  * @debug_show_keys: determines if show keys in debug data
   2019  * Returns: 0 if succeed or -1 if debug_level has wrong value
   2020  */
   2021 int wpa_supplicant_set_debug_params(struct wpa_global *global, int debug_level,
   2022 				    int debug_timestamp, int debug_show_keys)
   2023 {
   2024 
   2025 	int old_level, old_timestamp, old_show_keys;
   2026 
   2027 	/* check for allowed debuglevels */
   2028 	if (debug_level != MSG_EXCESSIVE &&
   2029 	    debug_level != MSG_MSGDUMP &&
   2030 	    debug_level != MSG_DEBUG &&
   2031 	    debug_level != MSG_INFO &&
   2032 	    debug_level != MSG_WARNING &&
   2033 	    debug_level != MSG_ERROR)
   2034 		return -1;
   2035 
   2036 	old_level = wpa_debug_level;
   2037 	old_timestamp = wpa_debug_timestamp;
   2038 	old_show_keys = wpa_debug_show_keys;
   2039 
   2040 	wpa_debug_level = debug_level;
   2041 	wpa_debug_timestamp = debug_timestamp ? 1 : 0;
   2042 	wpa_debug_show_keys = debug_show_keys ? 1 : 0;
   2043 
   2044 	if (wpa_debug_level != old_level)
   2045 		wpas_notify_debug_level_changed(global);
   2046 	if (wpa_debug_timestamp != old_timestamp)
   2047 		wpas_notify_debug_timestamp_changed(global);
   2048 	if (wpa_debug_show_keys != old_show_keys)
   2049 		wpas_notify_debug_show_keys_changed(global);
   2050 
   2051 	return 0;
   2052 }
   2053 
   2054 
   2055 /**
   2056  * wpa_supplicant_get_ssid - Get a pointer to the current network structure
   2057  * @wpa_s: Pointer to wpa_supplicant data
   2058  * Returns: A pointer to the current network structure or %NULL on failure
   2059  */
   2060 struct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s)
   2061 {
   2062 	struct wpa_ssid *entry;
   2063 	u8 ssid[MAX_SSID_LEN];
   2064 	int res;
   2065 	size_t ssid_len;
   2066 	u8 bssid[ETH_ALEN];
   2067 	int wired;
   2068 
   2069 	res = wpa_drv_get_ssid(wpa_s, ssid);
   2070 	if (res < 0) {
   2071 		wpa_msg(wpa_s, MSG_WARNING, "Could not read SSID from "
   2072 			"driver");
   2073 		return NULL;
   2074 	}
   2075 	ssid_len = res;
   2076 
   2077 	if (wpa_drv_get_bssid(wpa_s, bssid) < 0) {
   2078 		wpa_msg(wpa_s, MSG_WARNING, "Could not read BSSID from "
   2079 			"driver");
   2080 		return NULL;
   2081 	}
   2082 
   2083 	wired = wpa_s->conf->ap_scan == 0 &&
   2084 		(wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED);
   2085 
   2086 	entry = wpa_s->conf->ssid;
   2087 	while (entry) {
   2088 		if (!wpas_network_disabled(wpa_s, entry) &&
   2089 		    ((ssid_len == entry->ssid_len &&
   2090 		      os_memcmp(ssid, entry->ssid, ssid_len) == 0) || wired) &&
   2091 		    (!entry->bssid_set ||
   2092 		     os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
   2093 			return entry;
   2094 #ifdef CONFIG_WPS
   2095 		if (!wpas_network_disabled(wpa_s, entry) &&
   2096 		    (entry->key_mgmt & WPA_KEY_MGMT_WPS) &&
   2097 		    (entry->ssid == NULL || entry->ssid_len == 0) &&
   2098 		    (!entry->bssid_set ||
   2099 		     os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
   2100 			return entry;
   2101 #endif /* CONFIG_WPS */
   2102 
   2103 		if (!wpas_network_disabled(wpa_s, entry) && entry->bssid_set &&
   2104 		    entry->ssid_len == 0 &&
   2105 		    os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0)
   2106 			return entry;
   2107 
   2108 		entry = entry->next;
   2109 	}
   2110 
   2111 	return NULL;
   2112 }
   2113 
   2114 
   2115 static int select_driver(struct wpa_supplicant *wpa_s, int i)
   2116 {
   2117 	struct wpa_global *global = wpa_s->global;
   2118 
   2119 	if (wpa_drivers[i]->global_init && global->drv_priv[i] == NULL) {
   2120 		global->drv_priv[i] = wpa_drivers[i]->global_init();
   2121 		if (global->drv_priv[i] == NULL) {
   2122 			wpa_printf(MSG_ERROR, "Failed to initialize driver "
   2123 				   "'%s'", wpa_drivers[i]->name);
   2124 			return -1;
   2125 		}
   2126 	}
   2127 
   2128 	wpa_s->driver = wpa_drivers[i];
   2129 	wpa_s->global_drv_priv = global->drv_priv[i];
   2130 
   2131 	return 0;
   2132 }
   2133 
   2134 
   2135 static int wpa_supplicant_set_driver(struct wpa_supplicant *wpa_s,
   2136 				     const char *name)
   2137 {
   2138 	int i;
   2139 	size_t len;
   2140 	const char *pos, *driver = name;
   2141 
   2142 	if (wpa_s == NULL)
   2143 		return -1;
   2144 
   2145 	if (wpa_drivers[0] == NULL) {
   2146 		wpa_msg(wpa_s, MSG_ERROR, "No driver interfaces build into "
   2147 			"wpa_supplicant");
   2148 		return -1;
   2149 	}
   2150 
   2151 	if (name == NULL) {
   2152 		/* default to first driver in the list */
   2153 		return select_driver(wpa_s, 0);
   2154 	}
   2155 
   2156 	do {
   2157 		pos = os_strchr(driver, ',');
   2158 		if (pos)
   2159 			len = pos - driver;
   2160 		else
   2161 			len = os_strlen(driver);
   2162 
   2163 		for (i = 0; wpa_drivers[i]; i++) {
   2164 			if (os_strlen(wpa_drivers[i]->name) == len &&
   2165 			    os_strncmp(driver, wpa_drivers[i]->name, len) ==
   2166 			    0) {
   2167 				/* First driver that succeeds wins */
   2168 				if (select_driver(wpa_s, i) == 0)
   2169 					return 0;
   2170 			}
   2171 		}
   2172 
   2173 		driver = pos + 1;
   2174 	} while (pos);
   2175 
   2176 	wpa_msg(wpa_s, MSG_ERROR, "Unsupported driver '%s'", name);
   2177 	return -1;
   2178 }
   2179 
   2180 
   2181 /**
   2182  * wpa_supplicant_rx_eapol - Deliver a received EAPOL frame to wpa_supplicant
   2183  * @ctx: Context pointer (wpa_s); this is the ctx variable registered
   2184  *	with struct wpa_driver_ops::init()
   2185  * @src_addr: Source address of the EAPOL frame
   2186  * @buf: EAPOL data starting from the EAPOL header (i.e., no Ethernet header)
   2187  * @len: Length of the EAPOL data
   2188  *
   2189  * This function is called for each received EAPOL frame. Most driver
   2190  * interfaces rely on more generic OS mechanism for receiving frames through
   2191  * l2_packet, but if such a mechanism is not available, the driver wrapper may
   2192  * take care of received EAPOL frames and deliver them to the core supplicant
   2193  * code by calling this function.
   2194  */
   2195 void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr,
   2196 			     const u8 *buf, size_t len)
   2197 {
   2198 	struct wpa_supplicant *wpa_s = ctx;
   2199 
   2200 	wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR, MAC2STR(src_addr));
   2201 	wpa_hexdump(MSG_MSGDUMP, "RX EAPOL", buf, len);
   2202 
   2203 	if (wpa_s->wpa_state < WPA_ASSOCIATED) {
   2204 		/*
   2205 		 * There is possible race condition between receiving the
   2206 		 * association event and the EAPOL frame since they are coming
   2207 		 * through different paths from the driver. In order to avoid
   2208 		 * issues in trying to process the EAPOL frame before receiving
   2209 		 * association information, lets queue it for processing until
   2210 		 * the association event is received.
   2211 		 */
   2212 		wpa_dbg(wpa_s, MSG_DEBUG, "Not associated - Delay processing "
   2213 			"of received EAPOL frame");
   2214 		wpabuf_free(wpa_s->pending_eapol_rx);
   2215 		wpa_s->pending_eapol_rx = wpabuf_alloc_copy(buf, len);
   2216 		if (wpa_s->pending_eapol_rx) {
   2217 			os_get_time(&wpa_s->pending_eapol_rx_time);
   2218 			os_memcpy(wpa_s->pending_eapol_rx_src, src_addr,
   2219 				  ETH_ALEN);
   2220 		}
   2221 		return;
   2222 	}
   2223 
   2224 #ifdef CONFIG_AP
   2225 	if (wpa_s->ap_iface) {
   2226 		wpa_supplicant_ap_rx_eapol(wpa_s, src_addr, buf, len);
   2227 		return;
   2228 	}
   2229 #endif /* CONFIG_AP */
   2230 
   2231 	if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE) {
   2232 		wpa_dbg(wpa_s, MSG_DEBUG, "Ignored received EAPOL frame since "
   2233 			"no key management is configured");
   2234 		return;
   2235 	}
   2236 
   2237 	if (wpa_s->eapol_received == 0 &&
   2238 	    (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) ||
   2239 	     !wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) ||
   2240 	     wpa_s->wpa_state != WPA_COMPLETED) &&
   2241 	    (wpa_s->current_ssid == NULL ||
   2242 	     wpa_s->current_ssid->mode != IEEE80211_MODE_IBSS)) {
   2243 		/* Timeout for completing IEEE 802.1X and WPA authentication */
   2244 		wpa_supplicant_req_auth_timeout(
   2245 			wpa_s,
   2246 			(wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) ||
   2247 			 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA ||
   2248 			 wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) ?
   2249 			70 : 10, 0);
   2250 	}
   2251 	wpa_s->eapol_received++;
   2252 
   2253 	if (wpa_s->countermeasures) {
   2254 		wpa_msg(wpa_s, MSG_INFO, "WPA: Countermeasures - dropped "
   2255 			"EAPOL packet");
   2256 		return;
   2257 	}
   2258 
   2259 #ifdef CONFIG_IBSS_RSN
   2260 	if (wpa_s->current_ssid &&
   2261 	    wpa_s->current_ssid->mode == WPAS_MODE_IBSS) {
   2262 		ibss_rsn_rx_eapol(wpa_s->ibss_rsn, src_addr, buf, len);
   2263 		return;
   2264 	}
   2265 #endif /* CONFIG_IBSS_RSN */
   2266 
   2267 	/* Source address of the incoming EAPOL frame could be compared to the
   2268 	 * current BSSID. However, it is possible that a centralized
   2269 	 * Authenticator could be using another MAC address than the BSSID of
   2270 	 * an AP, so just allow any address to be used for now. The replies are
   2271 	 * still sent to the current BSSID (if available), though. */
   2272 
   2273 	os_memcpy(wpa_s->last_eapol_src, src_addr, ETH_ALEN);
   2274 	if (!wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) &&
   2275 	    eapol_sm_rx_eapol(wpa_s->eapol, src_addr, buf, len) > 0)
   2276 		return;
   2277 	wpa_drv_poll(wpa_s);
   2278 	if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE))
   2279 		wpa_sm_rx_eapol(wpa_s->wpa, src_addr, buf, len);
   2280 	else if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt)) {
   2281 		/*
   2282 		 * Set portValid = TRUE here since we are going to skip 4-way
   2283 		 * handshake processing which would normally set portValid. We
   2284 		 * need this to allow the EAPOL state machines to be completed
   2285 		 * without going through EAPOL-Key handshake.
   2286 		 */
   2287 		eapol_sm_notify_portValid(wpa_s->eapol, TRUE);
   2288 	}
   2289 }
   2290 
   2291 
   2292 int wpa_supplicant_update_mac_addr(struct wpa_supplicant *wpa_s)
   2293 {
   2294 	if (wpa_s->driver->send_eapol) {
   2295 		const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
   2296 		if (addr)
   2297 			os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
   2298 	} else if (!(wpa_s->drv_flags &
   2299 		     WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE)) {
   2300 		l2_packet_deinit(wpa_s->l2);
   2301 		wpa_s->l2 = l2_packet_init(wpa_s->ifname,
   2302 					   wpa_drv_get_mac_addr(wpa_s),
   2303 					   ETH_P_EAPOL,
   2304 					   wpa_supplicant_rx_eapol, wpa_s, 0);
   2305 		if (wpa_s->l2 == NULL)
   2306 			return -1;
   2307 	} else {
   2308 		const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
   2309 		if (addr)
   2310 			os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
   2311 	}
   2312 
   2313 	if (wpa_s->l2 && l2_packet_get_own_addr(wpa_s->l2, wpa_s->own_addr)) {
   2314 		wpa_msg(wpa_s, MSG_ERROR, "Failed to get own L2 address");
   2315 		return -1;
   2316 	}
   2317 
   2318 	wpa_dbg(wpa_s, MSG_DEBUG, "Own MAC address: " MACSTR,
   2319 		MAC2STR(wpa_s->own_addr));
   2320 	wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
   2321 
   2322 	return 0;
   2323 }
   2324 
   2325 
   2326 static void wpa_supplicant_rx_eapol_bridge(void *ctx, const u8 *src_addr,
   2327 					   const u8 *buf, size_t len)
   2328 {
   2329 	struct wpa_supplicant *wpa_s = ctx;
   2330 	const struct l2_ethhdr *eth;
   2331 
   2332 	if (len < sizeof(*eth))
   2333 		return;
   2334 	eth = (const struct l2_ethhdr *) buf;
   2335 
   2336 	if (os_memcmp(eth->h_dest, wpa_s->own_addr, ETH_ALEN) != 0 &&
   2337 	    !(eth->h_dest[0] & 0x01)) {
   2338 		wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR " to " MACSTR
   2339 			" (bridge - not for this interface - ignore)",
   2340 			MAC2STR(src_addr), MAC2STR(eth->h_dest));
   2341 		return;
   2342 	}
   2343 
   2344 	wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR " to " MACSTR
   2345 		" (bridge)", MAC2STR(src_addr), MAC2STR(eth->h_dest));
   2346 	wpa_supplicant_rx_eapol(wpa_s, src_addr, buf + sizeof(*eth),
   2347 				len - sizeof(*eth));
   2348 }
   2349 
   2350 
   2351 /**
   2352  * wpa_supplicant_driver_init - Initialize driver interface parameters
   2353  * @wpa_s: Pointer to wpa_supplicant data
   2354  * Returns: 0 on success, -1 on failure
   2355  *
   2356  * This function is called to initialize driver interface parameters.
   2357  * wpa_drv_init() must have been called before this function to initialize the
   2358  * driver interface.
   2359  */
   2360 int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s)
   2361 {
   2362 	static int interface_count = 0;
   2363 
   2364 	if (wpa_supplicant_update_mac_addr(wpa_s) < 0)
   2365 		return -1;
   2366 
   2367 	if (wpa_s->bridge_ifname[0]) {
   2368 		wpa_dbg(wpa_s, MSG_DEBUG, "Receiving packets from bridge "
   2369 			"interface '%s'", wpa_s->bridge_ifname);
   2370 		wpa_s->l2_br = l2_packet_init(wpa_s->bridge_ifname,
   2371 					      wpa_s->own_addr,
   2372 					      ETH_P_EAPOL,
   2373 					      wpa_supplicant_rx_eapol_bridge,
   2374 					      wpa_s, 1);
   2375 		if (wpa_s->l2_br == NULL) {
   2376 			wpa_msg(wpa_s, MSG_ERROR, "Failed to open l2_packet "
   2377 				"connection for the bridge interface '%s'",
   2378 				wpa_s->bridge_ifname);
   2379 			return -1;
   2380 		}
   2381 	}
   2382 
   2383 	wpa_clear_keys(wpa_s, NULL);
   2384 
   2385 	/* Make sure that TKIP countermeasures are not left enabled (could
   2386 	 * happen if wpa_supplicant is killed during countermeasures. */
   2387 	wpa_drv_set_countermeasures(wpa_s, 0);
   2388 
   2389 	wpa_dbg(wpa_s, MSG_DEBUG, "RSN: flushing PMKID list in the driver");
   2390 	wpa_drv_flush_pmkid(wpa_s);
   2391 
   2392 	wpa_s->prev_scan_ssid = WILDCARD_SSID_SCAN;
   2393 	wpa_s->prev_scan_wildcard = 0;
   2394 
   2395 	if (wpa_supplicant_enabled_networks(wpa_s)) {
   2396 		if (wpa_supplicant_delayed_sched_scan(wpa_s, interface_count,
   2397 						      100000))
   2398 			wpa_supplicant_req_scan(wpa_s, interface_count,
   2399 						100000);
   2400 		interface_count++;
   2401 	} else
   2402 		wpa_supplicant_set_state(wpa_s, WPA_INACTIVE);
   2403 
   2404 	return 0;
   2405 }
   2406 
   2407 
   2408 static int wpa_supplicant_daemon(const char *pid_file)
   2409 {
   2410 	wpa_printf(MSG_DEBUG, "Daemonize..");
   2411 	return os_daemonize(pid_file);
   2412 }
   2413 
   2414 
   2415 static struct wpa_supplicant * wpa_supplicant_alloc(void)
   2416 {
   2417 	struct wpa_supplicant *wpa_s;
   2418 
   2419 	wpa_s = os_zalloc(sizeof(*wpa_s));
   2420 	if (wpa_s == NULL)
   2421 		return NULL;
   2422 	wpa_s->scan_req = 1;
   2423 	wpa_s->scan_interval = 5;
   2424 	wpa_s->new_connection = 1;
   2425 	wpa_s->parent = wpa_s;
   2426 	wpa_s->sched_scanning = 0;
   2427 
   2428 	return wpa_s;
   2429 }
   2430 
   2431 
   2432 #ifdef CONFIG_HT_OVERRIDES
   2433 
   2434 static int wpa_set_htcap_mcs(struct wpa_supplicant *wpa_s,
   2435 			     struct ieee80211_ht_capabilities *htcaps,
   2436 			     struct ieee80211_ht_capabilities *htcaps_mask,
   2437 			     const char *ht_mcs)
   2438 {
   2439 	/* parse ht_mcs into hex array */
   2440 	int i;
   2441 	const char *tmp = ht_mcs;
   2442 	char *end = NULL;
   2443 
   2444 	/* If ht_mcs is null, do not set anything */
   2445 	if (!ht_mcs)
   2446 		return 0;
   2447 
   2448 	/* This is what we are setting in the kernel */
   2449 	os_memset(&htcaps->supported_mcs_set, 0, IEEE80211_HT_MCS_MASK_LEN);
   2450 
   2451 	wpa_msg(wpa_s, MSG_DEBUG, "set_htcap, ht_mcs -:%s:-", ht_mcs);
   2452 
   2453 	for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
   2454 		errno = 0;
   2455 		long v = strtol(tmp, &end, 16);
   2456 		if (errno == 0) {
   2457 			wpa_msg(wpa_s, MSG_DEBUG,
   2458 				"htcap value[%i]: %ld end: %p  tmp: %p",
   2459 				i, v, end, tmp);
   2460 			if (end == tmp)
   2461 				break;
   2462 
   2463 			htcaps->supported_mcs_set[i] = v;
   2464 			tmp = end;
   2465 		} else {
   2466 			wpa_msg(wpa_s, MSG_ERROR,
   2467 				"Failed to parse ht-mcs: %s, error: %s\n",
   2468 				ht_mcs, strerror(errno));
   2469 			return -1;
   2470 		}
   2471 	}
   2472 
   2473 	/*
   2474 	 * If we were able to parse any values, then set mask for the MCS set.
   2475 	 */
   2476 	if (i) {
   2477 		os_memset(&htcaps_mask->supported_mcs_set, 0xff,
   2478 			  IEEE80211_HT_MCS_MASK_LEN - 1);
   2479 		/* skip the 3 reserved bits */
   2480 		htcaps_mask->supported_mcs_set[IEEE80211_HT_MCS_MASK_LEN - 1] =
   2481 			0x1f;
   2482 	}
   2483 
   2484 	return 0;
   2485 }
   2486 
   2487 
   2488 static int wpa_disable_max_amsdu(struct wpa_supplicant *wpa_s,
   2489 				 struct ieee80211_ht_capabilities *htcaps,
   2490 				 struct ieee80211_ht_capabilities *htcaps_mask,
   2491 				 int disabled)
   2492 {
   2493 	u16 msk;
   2494 
   2495 	wpa_msg(wpa_s, MSG_DEBUG, "set_disable_max_amsdu: %d", disabled);
   2496 
   2497 	if (disabled == -1)
   2498 		return 0;
   2499 
   2500 	msk = host_to_le16(HT_CAP_INFO_MAX_AMSDU_SIZE);
   2501 	htcaps_mask->ht_capabilities_info |= msk;
   2502 	if (disabled)
   2503 		htcaps->ht_capabilities_info &= msk;
   2504 	else
   2505 		htcaps->ht_capabilities_info |= msk;
   2506 
   2507 	return 0;
   2508 }
   2509 
   2510 
   2511 static int wpa_set_ampdu_factor(struct wpa_supplicant *wpa_s,
   2512 				struct ieee80211_ht_capabilities *htcaps,
   2513 				struct ieee80211_ht_capabilities *htcaps_mask,
   2514 				int factor)
   2515 {
   2516 	wpa_msg(wpa_s, MSG_DEBUG, "set_ampdu_factor: %d", factor);
   2517 
   2518 	if (factor == -1)
   2519 		return 0;
   2520 
   2521 	if (factor < 0 || factor > 3) {
   2522 		wpa_msg(wpa_s, MSG_ERROR, "ampdu_factor: %d out of range. "
   2523 			"Must be 0-3 or -1", factor);
   2524 		return -EINVAL;
   2525 	}
   2526 
   2527 	htcaps_mask->a_mpdu_params |= 0x3; /* 2 bits for factor */
   2528 	htcaps->a_mpdu_params &= ~0x3;
   2529 	htcaps->a_mpdu_params |= factor & 0x3;
   2530 
   2531 	return 0;
   2532 }
   2533 
   2534 
   2535 static int wpa_set_ampdu_density(struct wpa_supplicant *wpa_s,
   2536 				 struct ieee80211_ht_capabilities *htcaps,
   2537 				 struct ieee80211_ht_capabilities *htcaps_mask,
   2538 				 int density)
   2539 {
   2540 	wpa_msg(wpa_s, MSG_DEBUG, "set_ampdu_density: %d", density);
   2541 
   2542 	if (density == -1)
   2543 		return 0;
   2544 
   2545 	if (density < 0 || density > 7) {
   2546 		wpa_msg(wpa_s, MSG_ERROR,
   2547 			"ampdu_density: %d out of range. Must be 0-7 or -1.",
   2548 			density);
   2549 		return -EINVAL;
   2550 	}
   2551 
   2552 	htcaps_mask->a_mpdu_params |= 0x1C;
   2553 	htcaps->a_mpdu_params &= ~(0x1C);
   2554 	htcaps->a_mpdu_params |= (density << 2) & 0x1C;
   2555 
   2556 	return 0;
   2557 }
   2558 
   2559 
   2560 static int wpa_set_disable_ht40(struct wpa_supplicant *wpa_s,
   2561 				struct ieee80211_ht_capabilities *htcaps,
   2562 				struct ieee80211_ht_capabilities *htcaps_mask,
   2563 				int disabled)
   2564 {
   2565 	/* Masking these out disables HT40 */
   2566 	u16 msk = host_to_le16(HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET |
   2567 			       HT_CAP_INFO_SHORT_GI40MHZ);
   2568 
   2569 	wpa_msg(wpa_s, MSG_DEBUG, "set_disable_ht40: %d", disabled);
   2570 
   2571 	if (disabled)
   2572 		htcaps->ht_capabilities_info &= ~msk;
   2573 	else
   2574 		htcaps->ht_capabilities_info |= msk;
   2575 
   2576 	htcaps_mask->ht_capabilities_info |= msk;
   2577 
   2578 	return 0;
   2579 }
   2580 
   2581 
   2582 void wpa_supplicant_apply_ht_overrides(
   2583 	struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
   2584 	struct wpa_driver_associate_params *params)
   2585 {
   2586 	struct ieee80211_ht_capabilities *htcaps;
   2587 	struct ieee80211_ht_capabilities *htcaps_mask;
   2588 
   2589 	if (!ssid)
   2590 		return;
   2591 
   2592 	params->disable_ht = ssid->disable_ht;
   2593 	if (!params->htcaps || !params->htcaps_mask)
   2594 		return;
   2595 
   2596 	htcaps = (struct ieee80211_ht_capabilities *) params->htcaps;
   2597 	htcaps_mask = (struct ieee80211_ht_capabilities *) params->htcaps_mask;
   2598 	wpa_set_htcap_mcs(wpa_s, htcaps, htcaps_mask, ssid->ht_mcs);
   2599 	wpa_disable_max_amsdu(wpa_s, htcaps, htcaps_mask,
   2600 			      ssid->disable_max_amsdu);
   2601 	wpa_set_ampdu_factor(wpa_s, htcaps, htcaps_mask, ssid->ampdu_factor);
   2602 	wpa_set_ampdu_density(wpa_s, htcaps, htcaps_mask, ssid->ampdu_density);
   2603 	wpa_set_disable_ht40(wpa_s, htcaps, htcaps_mask, ssid->disable_ht40);
   2604 }
   2605 
   2606 #endif /* CONFIG_HT_OVERRIDES */
   2607 
   2608 
   2609 static int pcsc_reader_init(struct wpa_supplicant *wpa_s)
   2610 {
   2611 #ifdef PCSC_FUNCS
   2612 	size_t len;
   2613 
   2614 	if (!wpa_s->conf->pcsc_reader)
   2615 		return 0;
   2616 
   2617 	wpa_s->scard = scard_init(SCARD_TRY_BOTH, wpa_s->conf->pcsc_reader);
   2618 	if (!wpa_s->scard)
   2619 		return 1;
   2620 
   2621 	if (wpa_s->conf->pcsc_pin &&
   2622 	    scard_set_pin(wpa_s->scard, wpa_s->conf->pcsc_pin) < 0) {
   2623 		scard_deinit(wpa_s->scard);
   2624 		wpa_s->scard = NULL;
   2625 		wpa_msg(wpa_s, MSG_ERROR, "PC/SC PIN validation failed");
   2626 		return -1;
   2627 	}
   2628 
   2629 	len = sizeof(wpa_s->imsi) - 1;
   2630 	if (scard_get_imsi(wpa_s->scard, wpa_s->imsi, &len)) {
   2631 		scard_deinit(wpa_s->scard);
   2632 		wpa_s->scard = NULL;
   2633 		wpa_msg(wpa_s, MSG_ERROR, "Could not read IMSI");
   2634 		return -1;
   2635 	}
   2636 	wpa_s->imsi[len] = '\0';
   2637 
   2638 	wpa_s->mnc_len = scard_get_mnc_len(wpa_s->scard);
   2639 
   2640 	wpa_printf(MSG_DEBUG, "SCARD: IMSI %s (MNC length %d)",
   2641 		   wpa_s->imsi, wpa_s->mnc_len);
   2642 
   2643 	wpa_sm_set_scard_ctx(wpa_s->wpa, wpa_s->scard);
   2644 	eapol_sm_register_scard_ctx(wpa_s->eapol, wpa_s->scard);
   2645 #endif /* PCSC_FUNCS */
   2646 
   2647 	return 0;
   2648 }
   2649 
   2650 
   2651 int wpas_init_ext_pw(struct wpa_supplicant *wpa_s)
   2652 {
   2653 	char *val, *pos;
   2654 
   2655 	ext_password_deinit(wpa_s->ext_pw);
   2656 	wpa_s->ext_pw = NULL;
   2657 	eapol_sm_set_ext_pw_ctx(wpa_s->eapol, NULL);
   2658 
   2659 	if (!wpa_s->conf->ext_password_backend)
   2660 		return 0;
   2661 
   2662 	val = os_strdup(wpa_s->conf->ext_password_backend);
   2663 	if (val == NULL)
   2664 		return -1;
   2665 	pos = os_strchr(val, ':');
   2666 	if (pos)
   2667 		*pos++ = '\0';
   2668 
   2669 	wpa_printf(MSG_DEBUG, "EXT PW: Initialize backend '%s'", val);
   2670 
   2671 	wpa_s->ext_pw = ext_password_init(val, pos);
   2672 	os_free(val);
   2673 	if (wpa_s->ext_pw == NULL) {
   2674 		wpa_printf(MSG_DEBUG, "EXT PW: Failed to initialize backend");
   2675 		return -1;
   2676 	}
   2677 	eapol_sm_set_ext_pw_ctx(wpa_s->eapol, wpa_s->ext_pw);
   2678 
   2679 	return 0;
   2680 }
   2681 
   2682 
   2683 static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
   2684 				     struct wpa_interface *iface)
   2685 {
   2686 	const char *ifname, *driver;
   2687 	struct wpa_driver_capa capa;
   2688 
   2689 	wpa_printf(MSG_DEBUG, "Initializing interface '%s' conf '%s' driver "
   2690 		   "'%s' ctrl_interface '%s' bridge '%s'", iface->ifname,
   2691 		   iface->confname ? iface->confname : "N/A",
   2692 		   iface->driver ? iface->driver : "default",
   2693 		   iface->ctrl_interface ? iface->ctrl_interface : "N/A",
   2694 		   iface->bridge_ifname ? iface->bridge_ifname : "N/A");
   2695 
   2696 	if (iface->confname) {
   2697 #ifdef CONFIG_BACKEND_FILE
   2698 		wpa_s->confname = os_rel2abs_path(iface->confname);
   2699 		if (wpa_s->confname == NULL) {
   2700 			wpa_printf(MSG_ERROR, "Failed to get absolute path "
   2701 				   "for configuration file '%s'.",
   2702 				   iface->confname);
   2703 			return -1;
   2704 		}
   2705 		wpa_printf(MSG_DEBUG, "Configuration file '%s' -> '%s'",
   2706 			   iface->confname, wpa_s->confname);
   2707 #else /* CONFIG_BACKEND_FILE */
   2708 		wpa_s->confname = os_strdup(iface->confname);
   2709 #endif /* CONFIG_BACKEND_FILE */
   2710 		wpa_s->conf = wpa_config_read(wpa_s->confname);
   2711 		if (wpa_s->conf == NULL) {
   2712 			wpa_printf(MSG_ERROR, "Failed to read or parse "
   2713 				   "configuration '%s'.", wpa_s->confname);
   2714 			return -1;
   2715 		}
   2716 
   2717 		/*
   2718 		 * Override ctrl_interface and driver_param if set on command
   2719 		 * line.
   2720 		 */
   2721 		if (iface->ctrl_interface) {
   2722 			os_free(wpa_s->conf->ctrl_interface);
   2723 			wpa_s->conf->ctrl_interface =
   2724 				os_strdup(iface->ctrl_interface);
   2725 		}
   2726 
   2727 		if (iface->driver_param) {
   2728 			os_free(wpa_s->conf->driver_param);
   2729 			wpa_s->conf->driver_param =
   2730 				os_strdup(iface->driver_param);
   2731 		}
   2732 	} else
   2733 		wpa_s->conf = wpa_config_alloc_empty(iface->ctrl_interface,
   2734 						     iface->driver_param);
   2735 
   2736 	if (wpa_s->conf == NULL) {
   2737 		wpa_printf(MSG_ERROR, "\nNo configuration found.");
   2738 		return -1;
   2739 	}
   2740 
   2741 	if (iface->ifname == NULL) {
   2742 		wpa_printf(MSG_ERROR, "\nInterface name is required.");
   2743 		return -1;
   2744 	}
   2745 	if (os_strlen(iface->ifname) >= sizeof(wpa_s->ifname)) {
   2746 		wpa_printf(MSG_ERROR, "\nToo long interface name '%s'.",
   2747 			   iface->ifname);
   2748 		return -1;
   2749 	}
   2750 	os_strlcpy(wpa_s->ifname, iface->ifname, sizeof(wpa_s->ifname));
   2751 
   2752 	if (iface->bridge_ifname) {
   2753 		if (os_strlen(iface->bridge_ifname) >=
   2754 		    sizeof(wpa_s->bridge_ifname)) {
   2755 			wpa_printf(MSG_ERROR, "\nToo long bridge interface "
   2756 				   "name '%s'.", iface->bridge_ifname);
   2757 			return -1;
   2758 		}
   2759 		os_strlcpy(wpa_s->bridge_ifname, iface->bridge_ifname,
   2760 			   sizeof(wpa_s->bridge_ifname));
   2761 	}
   2762 
   2763 	/* RSNA Supplicant Key Management - INITIALIZE */
   2764 	eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
   2765 	eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
   2766 
   2767 	/* Initialize driver interface and register driver event handler before
   2768 	 * L2 receive handler so that association events are processed before
   2769 	 * EAPOL-Key packets if both become available for the same select()
   2770 	 * call. */
   2771 	driver = iface->driver;
   2772 next_driver:
   2773 	if (wpa_supplicant_set_driver(wpa_s, driver) < 0)
   2774 		return -1;
   2775 
   2776 	wpa_s->drv_priv = wpa_drv_init(wpa_s, wpa_s->ifname);
   2777 	if (wpa_s->drv_priv == NULL) {
   2778 		const char *pos;
   2779 		pos = driver ? os_strchr(driver, ',') : NULL;
   2780 		if (pos) {
   2781 			wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize "
   2782 				"driver interface - try next driver wrapper");
   2783 			driver = pos + 1;
   2784 			goto next_driver;
   2785 		}
   2786 		wpa_msg(wpa_s, MSG_ERROR, "Failed to initialize driver "
   2787 			"interface");
   2788 		return -1;
   2789 	}
   2790 	if (wpa_drv_set_param(wpa_s, wpa_s->conf->driver_param) < 0) {
   2791 		wpa_msg(wpa_s, MSG_ERROR, "Driver interface rejected "
   2792 			"driver_param '%s'", wpa_s->conf->driver_param);
   2793 		return -1;
   2794 	}
   2795 
   2796 	ifname = wpa_drv_get_ifname(wpa_s);
   2797 	if (ifname && os_strcmp(ifname, wpa_s->ifname) != 0) {
   2798 		wpa_dbg(wpa_s, MSG_DEBUG, "Driver interface replaced "
   2799 			"interface name with '%s'", ifname);
   2800 		os_strlcpy(wpa_s->ifname, ifname, sizeof(wpa_s->ifname));
   2801 	}
   2802 
   2803 	if (wpa_supplicant_init_wpa(wpa_s) < 0)
   2804 		return -1;
   2805 
   2806 	wpa_sm_set_ifname(wpa_s->wpa, wpa_s->ifname,
   2807 			  wpa_s->bridge_ifname[0] ? wpa_s->bridge_ifname :
   2808 			  NULL);
   2809 	wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
   2810 
   2811 	if (wpa_s->conf->dot11RSNAConfigPMKLifetime &&
   2812 	    wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_LIFETIME,
   2813 			     wpa_s->conf->dot11RSNAConfigPMKLifetime)) {
   2814 		wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
   2815 			"dot11RSNAConfigPMKLifetime");
   2816 		return -1;
   2817 	}
   2818 
   2819 	if (wpa_s->conf->dot11RSNAConfigPMKReauthThreshold &&
   2820 	    wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_REAUTH_THRESHOLD,
   2821 			     wpa_s->conf->dot11RSNAConfigPMKReauthThreshold)) {
   2822 		wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
   2823 			"dot11RSNAConfigPMKReauthThreshold");
   2824 		return -1;
   2825 	}
   2826 
   2827 	if (wpa_s->conf->dot11RSNAConfigSATimeout &&
   2828 	    wpa_sm_set_param(wpa_s->wpa, RSNA_SA_TIMEOUT,
   2829 			     wpa_s->conf->dot11RSNAConfigSATimeout)) {
   2830 		wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
   2831 			"dot11RSNAConfigSATimeout");
   2832 		return -1;
   2833 	}
   2834 
   2835 	wpa_s->hw.modes = wpa_drv_get_hw_feature_data(wpa_s,
   2836 						      &wpa_s->hw.num_modes,
   2837 						      &wpa_s->hw.flags);
   2838 
   2839 	if (wpa_drv_get_capa(wpa_s, &capa) == 0) {
   2840 		wpa_s->drv_capa_known = 1;
   2841 		wpa_s->drv_flags = capa.flags;
   2842 		wpa_s->drv_enc = capa.enc;
   2843 		wpa_s->probe_resp_offloads = capa.probe_resp_offloads;
   2844 		wpa_s->max_scan_ssids = capa.max_scan_ssids;
   2845 		wpa_s->max_sched_scan_ssids = capa.max_sched_scan_ssids;
   2846 		wpa_s->sched_scan_supported = capa.sched_scan_supported;
   2847 		wpa_s->max_match_sets = capa.max_match_sets;
   2848 		wpa_s->max_remain_on_chan = capa.max_remain_on_chan;
   2849 		wpa_s->max_stations = capa.max_stations;
   2850 	}
   2851 	if (wpa_s->max_remain_on_chan == 0)
   2852 		wpa_s->max_remain_on_chan = 1000;
   2853 
   2854 	if (wpa_supplicant_driver_init(wpa_s) < 0)
   2855 		return -1;
   2856 
   2857 #ifdef CONFIG_TDLS
   2858 	if (wpa_tdls_init(wpa_s->wpa))
   2859 		return -1;
   2860 #endif /* CONFIG_TDLS */
   2861 
   2862 	if (wpa_s->conf->country[0] && wpa_s->conf->country[1] &&
   2863 	    wpa_drv_set_country(wpa_s, wpa_s->conf->country)) {
   2864 		wpa_dbg(wpa_s, MSG_DEBUG, "Failed to set country");
   2865 		return -1;
   2866 	}
   2867 
   2868 	if (wpas_wps_init(wpa_s))
   2869 		return -1;
   2870 
   2871 	if (wpa_supplicant_init_eapol(wpa_s) < 0)
   2872 		return -1;
   2873 	wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
   2874 
   2875 	wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
   2876 	if (wpa_s->ctrl_iface == NULL) {
   2877 		wpa_printf(MSG_ERROR,
   2878 			   "Failed to initialize control interface '%s'.\n"
   2879 			   "You may have another wpa_supplicant process "
   2880 			   "already running or the file was\n"
   2881 			   "left by an unclean termination of wpa_supplicant "
   2882 			   "in which case you will need\n"
   2883 			   "to manually remove this file before starting "
   2884 			   "wpa_supplicant again.\n",
   2885 			   wpa_s->conf->ctrl_interface);
   2886 		return -1;
   2887 	}
   2888 
   2889 	wpa_s->gas = gas_query_init(wpa_s);
   2890 	if (wpa_s->gas == NULL) {
   2891 		wpa_printf(MSG_ERROR, "Failed to initialize GAS query");
   2892 		return -1;
   2893 	}
   2894 
   2895 #ifdef CONFIG_P2P
   2896 	if (wpas_p2p_init(wpa_s->global, wpa_s) < 0) {
   2897 		wpa_msg(wpa_s, MSG_ERROR, "Failed to init P2P");
   2898 		return -1;
   2899 	}
   2900 #endif /* CONFIG_P2P */
   2901 
   2902 	if (wpa_bss_init(wpa_s) < 0)
   2903 		return -1;
   2904 
   2905 	if (pcsc_reader_init(wpa_s) < 0)
   2906 		return -1;
   2907 
   2908 	if (wpas_init_ext_pw(wpa_s) < 0)
   2909 		return -1;
   2910 
   2911 	return 0;
   2912 }
   2913 
   2914 
   2915 static void wpa_supplicant_deinit_iface(struct wpa_supplicant *wpa_s,
   2916 					int notify, int terminate)
   2917 {
   2918 	if (wpa_s->drv_priv) {
   2919 		wpa_supplicant_deauthenticate(wpa_s,
   2920 					      WLAN_REASON_DEAUTH_LEAVING);
   2921 
   2922 		wpa_drv_set_countermeasures(wpa_s, 0);
   2923 		wpa_clear_keys(wpa_s, NULL);
   2924 	}
   2925 
   2926 	wpa_supplicant_cleanup(wpa_s);
   2927 
   2928 #ifdef CONFIG_P2P
   2929 	if (wpa_s == wpa_s->global->p2p_init_wpa_s && wpa_s->global->p2p) {
   2930 		wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Disable P2P since removing "
   2931 			"the management interface is being removed");
   2932 		wpas_p2p_deinit_global(wpa_s->global);
   2933 	}
   2934 #endif /* CONFIG_P2P */
   2935 
   2936 	if (wpa_s->drv_priv)
   2937 		wpa_drv_deinit(wpa_s);
   2938 
   2939 	if (notify)
   2940 		wpas_notify_iface_removed(wpa_s);
   2941 
   2942 	if (terminate)
   2943 		wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TERMINATING);
   2944 
   2945 	if (wpa_s->ctrl_iface) {
   2946 		wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
   2947 		wpa_s->ctrl_iface = NULL;
   2948 	}
   2949 
   2950 	if (wpa_s->conf != NULL) {
   2951 		wpa_config_free(wpa_s->conf);
   2952 		wpa_s->conf = NULL;
   2953 	}
   2954 }
   2955 
   2956 
   2957 /**
   2958  * wpa_supplicant_add_iface - Add a new network interface
   2959  * @global: Pointer to global data from wpa_supplicant_init()
   2960  * @iface: Interface configuration options
   2961  * Returns: Pointer to the created interface or %NULL on failure
   2962  *
   2963  * This function is used to add new network interfaces for %wpa_supplicant.
   2964  * This can be called before wpa_supplicant_run() to add interfaces before the
   2965  * main event loop has been started. In addition, new interfaces can be added
   2966  * dynamically while %wpa_supplicant is already running. This could happen,
   2967  * e.g., when a hotplug network adapter is inserted.
   2968  */
   2969 struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
   2970 						 struct wpa_interface *iface)
   2971 {
   2972 	struct wpa_supplicant *wpa_s;
   2973 	struct wpa_interface t_iface;
   2974 	struct wpa_ssid *ssid;
   2975 
   2976 	if (global == NULL || iface == NULL)
   2977 		return NULL;
   2978 
   2979 	wpa_s = wpa_supplicant_alloc();
   2980 	if (wpa_s == NULL)
   2981 		return NULL;
   2982 
   2983 	wpa_s->global = global;
   2984 
   2985 	t_iface = *iface;
   2986 	if (global->params.override_driver) {
   2987 		wpa_printf(MSG_DEBUG, "Override interface parameter: driver "
   2988 			   "('%s' -> '%s')",
   2989 			   iface->driver, global->params.override_driver);
   2990 		t_iface.driver = global->params.override_driver;
   2991 	}
   2992 	if (global->params.override_ctrl_interface) {
   2993 		wpa_printf(MSG_DEBUG, "Override interface parameter: "
   2994 			   "ctrl_interface ('%s' -> '%s')",
   2995 			   iface->ctrl_interface,
   2996 			   global->params.override_ctrl_interface);
   2997 		t_iface.ctrl_interface =
   2998 			global->params.override_ctrl_interface;
   2999 	}
   3000 	if (wpa_supplicant_init_iface(wpa_s, &t_iface)) {
   3001 		wpa_printf(MSG_DEBUG, "Failed to add interface %s",
   3002 			   iface->ifname);
   3003 		wpa_supplicant_deinit_iface(wpa_s, 0, 0);
   3004 		os_free(wpa_s);
   3005 		return NULL;
   3006 	}
   3007 
   3008 	/* Notify the control interfaces about new iface */
   3009 	if (wpas_notify_iface_added(wpa_s)) {
   3010 		wpa_supplicant_deinit_iface(wpa_s, 1, 0);
   3011 		os_free(wpa_s);
   3012 		return NULL;
   3013 	}
   3014 
   3015 	for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
   3016 		wpas_notify_network_added(wpa_s, ssid);
   3017 
   3018 	wpa_s->next = global->ifaces;
   3019 	global->ifaces = wpa_s;
   3020 
   3021 	wpa_dbg(wpa_s, MSG_DEBUG, "Added interface %s", wpa_s->ifname);
   3022 	wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
   3023 
   3024 	return wpa_s;
   3025 }
   3026 
   3027 
   3028 /**
   3029  * wpa_supplicant_remove_iface - Remove a network interface
   3030  * @global: Pointer to global data from wpa_supplicant_init()
   3031  * @wpa_s: Pointer to the network interface to be removed
   3032  * Returns: 0 if interface was removed, -1 if interface was not found
   3033  *
   3034  * This function can be used to dynamically remove network interfaces from
   3035  * %wpa_supplicant, e.g., when a hotplug network adapter is ejected. In
   3036  * addition, this function is used to remove all remaining interfaces when
   3037  * %wpa_supplicant is terminated.
   3038  */
   3039 int wpa_supplicant_remove_iface(struct wpa_global *global,
   3040 				struct wpa_supplicant *wpa_s,
   3041 				int terminate)
   3042 {
   3043 	struct wpa_supplicant *prev;
   3044 
   3045 	/* Remove interface from the global list of interfaces */
   3046 	prev = global->ifaces;
   3047 	if (prev == wpa_s) {
   3048 		global->ifaces = wpa_s->next;
   3049 	} else {
   3050 		while (prev && prev->next != wpa_s)
   3051 			prev = prev->next;
   3052 		if (prev == NULL)
   3053 			return -1;
   3054 		prev->next = wpa_s->next;
   3055 	}
   3056 
   3057 	wpa_dbg(wpa_s, MSG_DEBUG, "Removing interface %s", wpa_s->ifname);
   3058 
   3059 	if (global->p2p_group_formation == wpa_s)
   3060 		global->p2p_group_formation = NULL;
   3061 	wpa_supplicant_deinit_iface(wpa_s, 1, terminate);
   3062 	os_free(wpa_s);
   3063 
   3064 	return 0;
   3065 }
   3066 
   3067 
   3068 /**
   3069  * wpa_supplicant_get_eap_mode - Get the current EAP mode
   3070  * @wpa_s: Pointer to the network interface
   3071  * Returns: Pointer to the eap mode or the string "UNKNOWN" if not found
   3072  */
   3073 const char * wpa_supplicant_get_eap_mode(struct wpa_supplicant *wpa_s)
   3074 {
   3075 	const char *eapol_method;
   3076 
   3077         if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) == 0 &&
   3078             wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
   3079 		return "NO-EAP";
   3080 	}
   3081 
   3082 	eapol_method = eapol_sm_get_method_name(wpa_s->eapol);
   3083 	if (eapol_method == NULL)
   3084 		return "UNKNOWN-EAP";
   3085 
   3086 	return eapol_method;
   3087 }
   3088 
   3089 
   3090 /**
   3091  * wpa_supplicant_get_iface - Get a new network interface
   3092  * @global: Pointer to global data from wpa_supplicant_init()
   3093  * @ifname: Interface name
   3094  * Returns: Pointer to the interface or %NULL if not found
   3095  */
   3096 struct wpa_supplicant * wpa_supplicant_get_iface(struct wpa_global *global,
   3097 						 const char *ifname)
   3098 {
   3099 	struct wpa_supplicant *wpa_s;
   3100 
   3101 	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
   3102 		if (os_strcmp(wpa_s->ifname, ifname) == 0)
   3103 			return wpa_s;
   3104 	}
   3105 	return NULL;
   3106 }
   3107 
   3108 
   3109 #ifndef CONFIG_NO_WPA_MSG
   3110 static const char * wpa_supplicant_msg_ifname_cb(void *ctx)
   3111 {
   3112 	struct wpa_supplicant *wpa_s = ctx;
   3113 	if (wpa_s == NULL)
   3114 		return NULL;
   3115 	return wpa_s->ifname;
   3116 }
   3117 #endif /* CONFIG_NO_WPA_MSG */
   3118 
   3119 
   3120 /**
   3121  * wpa_supplicant_init - Initialize %wpa_supplicant
   3122  * @params: Parameters for %wpa_supplicant
   3123  * Returns: Pointer to global %wpa_supplicant data, or %NULL on failure
   3124  *
   3125  * This function is used to initialize %wpa_supplicant. After successful
   3126  * initialization, the returned data pointer can be used to add and remove
   3127  * network interfaces, and eventually, to deinitialize %wpa_supplicant.
   3128  */
   3129 struct wpa_global * wpa_supplicant_init(struct wpa_params *params)
   3130 {
   3131 	struct wpa_global *global;
   3132 	int ret, i;
   3133 
   3134 	if (params == NULL)
   3135 		return NULL;
   3136 
   3137 #ifdef CONFIG_DRIVER_NDIS
   3138 	{
   3139 		void driver_ndis_init_ops(void);
   3140 		driver_ndis_init_ops();
   3141 	}
   3142 #endif /* CONFIG_DRIVER_NDIS */
   3143 
   3144 #ifndef CONFIG_NO_WPA_MSG
   3145 	wpa_msg_register_ifname_cb(wpa_supplicant_msg_ifname_cb);
   3146 #endif /* CONFIG_NO_WPA_MSG */
   3147 
   3148 	wpa_debug_open_file(params->wpa_debug_file_path);
   3149 	if (params->wpa_debug_syslog)
   3150 		wpa_debug_open_syslog();
   3151 	if (params->wpa_debug_tracing) {
   3152 		ret = wpa_debug_open_linux_tracing();
   3153 		if (ret) {
   3154 			wpa_printf(MSG_ERROR,
   3155 				   "Failed to enable trace logging");
   3156 			return NULL;
   3157 		}
   3158 	}
   3159 
   3160 	ret = eap_register_methods();
   3161 	if (ret) {
   3162 		wpa_printf(MSG_ERROR, "Failed to register EAP methods");
   3163 		if (ret == -2)
   3164 			wpa_printf(MSG_ERROR, "Two or more EAP methods used "
   3165 				   "the same EAP type.");
   3166 		return NULL;
   3167 	}
   3168 
   3169 	global = os_zalloc(sizeof(*global));
   3170 	if (global == NULL)
   3171 		return NULL;
   3172 	dl_list_init(&global->p2p_srv_bonjour);
   3173 	dl_list_init(&global->p2p_srv_upnp);
   3174 	global->params.daemonize = params->daemonize;
   3175 	global->params.wait_for_monitor = params->wait_for_monitor;
   3176 	global->params.dbus_ctrl_interface = params->dbus_ctrl_interface;
   3177 	if (params->pid_file)
   3178 		global->params.pid_file = os_strdup(params->pid_file);
   3179 	if (params->ctrl_interface)
   3180 		global->params.ctrl_interface =
   3181 			os_strdup(params->ctrl_interface);
   3182 	if (params->override_driver)
   3183 		global->params.override_driver =
   3184 			os_strdup(params->override_driver);
   3185 	if (params->override_ctrl_interface)
   3186 		global->params.override_ctrl_interface =
   3187 			os_strdup(params->override_ctrl_interface);
   3188 	wpa_debug_level = global->params.wpa_debug_level =
   3189 		params->wpa_debug_level;
   3190 	wpa_debug_show_keys = global->params.wpa_debug_show_keys =
   3191 		params->wpa_debug_show_keys;
   3192 	wpa_debug_timestamp = global->params.wpa_debug_timestamp =
   3193 		params->wpa_debug_timestamp;
   3194 
   3195 	wpa_printf(MSG_DEBUG, "wpa_supplicant v" VERSION_STR);
   3196 
   3197 	if (eloop_init()) {
   3198 		wpa_printf(MSG_ERROR, "Failed to initialize event loop");
   3199 		wpa_supplicant_deinit(global);
   3200 		return NULL;
   3201 	}
   3202 
   3203 	random_init(params->entropy_file);
   3204 
   3205 	global->ctrl_iface = wpa_supplicant_global_ctrl_iface_init(global);
   3206 	if (global->ctrl_iface == NULL) {
   3207 		wpa_supplicant_deinit(global);
   3208 		return NULL;
   3209 	}
   3210 
   3211 	if (wpas_notify_supplicant_initialized(global)) {
   3212 		wpa_supplicant_deinit(global);
   3213 		return NULL;
   3214 	}
   3215 
   3216 	for (i = 0; wpa_drivers[i]; i++)
   3217 		global->drv_count++;
   3218 	if (global->drv_count == 0) {
   3219 		wpa_printf(MSG_ERROR, "No drivers enabled");
   3220 		wpa_supplicant_deinit(global);
   3221 		return NULL;
   3222 	}
   3223 	global->drv_priv = os_zalloc(global->drv_count * sizeof(void *));
   3224 	if (global->drv_priv == NULL) {
   3225 		wpa_supplicant_deinit(global);
   3226 		return NULL;
   3227 	}
   3228 
   3229 #ifdef CONFIG_WIFI_DISPLAY
   3230 	if (wifi_display_init(global) < 0) {
   3231 		wpa_printf(MSG_ERROR, "Failed to initialize Wi-Fi Display");
   3232 		wpa_supplicant_deinit(global);
   3233 		return NULL;
   3234 	}
   3235 #endif /* CONFIG_WIFI_DISPLAY */
   3236 
   3237 	return global;
   3238 }
   3239 
   3240 
   3241 /**
   3242  * wpa_supplicant_run - Run the %wpa_supplicant main event loop
   3243  * @global: Pointer to global data from wpa_supplicant_init()
   3244  * Returns: 0 after successful event loop run, -1 on failure
   3245  *
   3246  * This function starts the main event loop and continues running as long as
   3247  * there are any remaining events. In most cases, this function is running as
   3248  * long as the %wpa_supplicant process in still in use.
   3249  */
   3250 int wpa_supplicant_run(struct wpa_global *global)
   3251 {
   3252 	struct wpa_supplicant *wpa_s;
   3253 
   3254 	if (global->params.daemonize &&
   3255 	    wpa_supplicant_daemon(global->params.pid_file))
   3256 		return -1;
   3257 
   3258 	if (global->params.wait_for_monitor) {
   3259 		for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
   3260 			if (wpa_s->ctrl_iface)
   3261 				wpa_supplicant_ctrl_iface_wait(
   3262 					wpa_s->ctrl_iface);
   3263 	}
   3264 
   3265 	eloop_register_signal_terminate(wpa_supplicant_terminate, global);
   3266 	eloop_register_signal_reconfig(wpa_supplicant_reconfig, global);
   3267 
   3268 	eloop_run();
   3269 
   3270 	return 0;
   3271 }
   3272 
   3273 
   3274 /**
   3275  * wpa_supplicant_deinit - Deinitialize %wpa_supplicant
   3276  * @global: Pointer to global data from wpa_supplicant_init()
   3277  *
   3278  * This function is called to deinitialize %wpa_supplicant and to free all
   3279  * allocated resources. Remaining network interfaces will also be removed.
   3280  */
   3281 void wpa_supplicant_deinit(struct wpa_global *global)
   3282 {
   3283 	int i;
   3284 
   3285 	if (global == NULL)
   3286 		return;
   3287 
   3288 #ifdef CONFIG_WIFI_DISPLAY
   3289 	wifi_display_deinit(global);
   3290 #endif /* CONFIG_WIFI_DISPLAY */
   3291 #ifdef CONFIG_P2P
   3292 	wpas_p2p_deinit_global(global);
   3293 #endif /* CONFIG_P2P */
   3294 
   3295 	while (global->ifaces)
   3296 		wpa_supplicant_remove_iface(global, global->ifaces, 1);
   3297 
   3298 	if (global->ctrl_iface)
   3299 		wpa_supplicant_global_ctrl_iface_deinit(global->ctrl_iface);
   3300 
   3301 	wpas_notify_supplicant_deinitialized(global);
   3302 
   3303 	eap_peer_unregister_methods();
   3304 #ifdef CONFIG_AP
   3305 	eap_server_unregister_methods();
   3306 #endif /* CONFIG_AP */
   3307 
   3308 	for (i = 0; wpa_drivers[i] && global->drv_priv; i++) {
   3309 		if (!global->drv_priv[i])
   3310 			continue;
   3311 		wpa_drivers[i]->global_deinit(global->drv_priv[i]);
   3312 	}
   3313 	os_free(global->drv_priv);
   3314 
   3315 	random_deinit();
   3316 
   3317 	eloop_destroy();
   3318 
   3319 	if (global->params.pid_file) {
   3320 		os_daemonize_terminate(global->params.pid_file);
   3321 		os_free(global->params.pid_file);
   3322 	}
   3323 	os_free(global->params.ctrl_interface);
   3324 	os_free(global->params.override_driver);
   3325 	os_free(global->params.override_ctrl_interface);
   3326 
   3327 	os_free(global->p2p_disallow_freq);
   3328 
   3329 	os_free(global);
   3330 	wpa_debug_close_syslog();
   3331 	wpa_debug_close_file();
   3332 	wpa_debug_close_linux_tracing();
   3333 }
   3334 
   3335 
   3336 void wpa_supplicant_update_config(struct wpa_supplicant *wpa_s)
   3337 {
   3338 	if ((wpa_s->conf->changed_parameters & CFG_CHANGED_COUNTRY) &&
   3339 	    wpa_s->conf->country[0] && wpa_s->conf->country[1]) {
   3340 		char country[3];
   3341 		country[0] = wpa_s->conf->country[0];
   3342 		country[1] = wpa_s->conf->country[1];
   3343 		country[2] = '\0';
   3344 		if (wpa_drv_set_country(wpa_s, country) < 0) {
   3345 			wpa_printf(MSG_ERROR, "Failed to set country code "
   3346 				   "'%s'", country);
   3347 		}
   3348 	}
   3349 
   3350 	if (wpa_s->conf->changed_parameters & CFG_CHANGED_EXT_PW_BACKEND)
   3351 		wpas_init_ext_pw(wpa_s);
   3352 
   3353 #ifdef CONFIG_WPS
   3354 	wpas_wps_update_config(wpa_s);
   3355 #endif /* CONFIG_WPS */
   3356 
   3357 #ifdef CONFIG_P2P
   3358 	wpas_p2p_update_config(wpa_s);
   3359 #endif /* CONFIG_P2P */
   3360 
   3361 	wpa_s->conf->changed_parameters = 0;
   3362 }
   3363 
   3364 
   3365 static void add_freq(int *freqs, int *num_freqs, int freq)
   3366 {
   3367 	int i;
   3368 
   3369 	for (i = 0; i < *num_freqs; i++) {
   3370 		if (freqs[i] == freq)
   3371 			return;
   3372 	}
   3373 
   3374 	freqs[*num_freqs] = freq;
   3375 	(*num_freqs)++;
   3376 }
   3377 
   3378 
   3379 static int * get_bss_freqs_in_ess(struct wpa_supplicant *wpa_s)
   3380 {
   3381 	struct wpa_bss *bss, *cbss;
   3382 	const int max_freqs = 10;
   3383 	int *freqs;
   3384 	int num_freqs = 0;
   3385 
   3386 	freqs = os_zalloc(sizeof(int) * (max_freqs + 1));
   3387 	if (freqs == NULL)
   3388 		return NULL;
   3389 
   3390 	cbss = wpa_s->current_bss;
   3391 
   3392 	dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
   3393 		if (bss == cbss)
   3394 			continue;
   3395 		if (bss->ssid_len == cbss->ssid_len &&
   3396 		    os_memcmp(bss->ssid, cbss->ssid, bss->ssid_len) == 0 &&
   3397 		    wpa_blacklist_get(wpa_s, bss->bssid) == NULL) {
   3398 			add_freq(freqs, &num_freqs, bss->freq);
   3399 			if (num_freqs == max_freqs)
   3400 				break;
   3401 		}
   3402 	}
   3403 
   3404 	if (num_freqs == 0) {
   3405 		os_free(freqs);
   3406 		freqs = NULL;
   3407 	}
   3408 
   3409 	return freqs;
   3410 }
   3411 
   3412 
   3413 void wpas_connection_failed(struct wpa_supplicant *wpa_s, const u8 *bssid)
   3414 {
   3415 	int timeout;
   3416 	int count;
   3417 	int *freqs = NULL;
   3418 
   3419 	/*
   3420 	 * Remove possible authentication timeout since the connection failed.
   3421 	 */
   3422 	eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
   3423 
   3424 	/*
   3425 	 * Add the failed BSSID into the blacklist and speed up next scan
   3426 	 * attempt if there could be other APs that could accept association.
   3427 	 * The current blacklist count indicates how many times we have tried
   3428 	 * connecting to this AP and multiple attempts mean that other APs are
   3429 	 * either not available or has already been tried, so that we can start
   3430 	 * increasing the delay here to avoid constant scanning.
   3431 	 */
   3432 	count = wpa_blacklist_add(wpa_s, bssid);
   3433 	if (count == 1 && wpa_s->current_bss) {
   3434 		/*
   3435 		 * This BSS was not in the blacklist before. If there is
   3436 		 * another BSS available for the same ESS, we should try that
   3437 		 * next. Otherwise, we may as well try this one once more
   3438 		 * before allowing other, likely worse, ESSes to be considered.
   3439 		 */
   3440 		freqs = get_bss_freqs_in_ess(wpa_s);
   3441 		if (freqs) {
   3442 			wpa_dbg(wpa_s, MSG_DEBUG, "Another BSS in this ESS "
   3443 				"has been seen; try it next");
   3444 			wpa_blacklist_add(wpa_s, bssid);
   3445 			/*
   3446 			 * On the next scan, go through only the known channels
   3447 			 * used in this ESS based on previous scans to speed up
   3448 			 * common load balancing use case.
   3449 			 */
   3450 			os_free(wpa_s->next_scan_freqs);
   3451 			wpa_s->next_scan_freqs = freqs;
   3452 		}
   3453 	}
   3454 
   3455 	switch (count) {
   3456 	case 1:
   3457 		timeout = 100;
   3458 		break;
   3459 	case 2:
   3460 		timeout = 500;
   3461 		break;
   3462 	case 3:
   3463 		timeout = 1000;
   3464 		break;
   3465 	default:
   3466 		timeout = 5000;
   3467 	}
   3468 
   3469 	/*
   3470 	 * TODO: if more than one possible AP is available in scan results,
   3471 	 * could try the other ones before requesting a new scan.
   3472 	 */
   3473 	wpa_supplicant_req_scan(wpa_s, timeout / 1000,
   3474 				1000 * (timeout % 1000));
   3475 
   3476 #ifdef CONFIG_P2P
   3477 	if (wpa_s->global->p2p_cb_on_scan_complete && !wpa_s->global->p2p_disabled &&
   3478 	    wpa_s->global->p2p != NULL) {
   3479 		wpa_s->global->p2p_cb_on_scan_complete = 0;
   3480 		if (p2p_other_scan_completed(wpa_s->global->p2p) == 1) {
   3481 			wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Pending P2P operation "
   3482 				"continued after failed association");
   3483 		}
   3484 	}
   3485 #endif /* CONFIG_P2P */
   3486 }
   3487 
   3488 
   3489 int wpas_driver_bss_selection(struct wpa_supplicant *wpa_s)
   3490 {
   3491 	return wpa_s->conf->ap_scan == 2 ||
   3492 		(wpa_s->drv_flags & WPA_DRIVER_FLAGS_BSS_SELECTION);
   3493 }
   3494 
   3495 
   3496 #if defined(CONFIG_CTRL_IFACE) || defined(CONFIG_CTRL_IFACE_DBUS_NEW)
   3497 int wpa_supplicant_ctrl_iface_ctrl_rsp_handle(struct wpa_supplicant *wpa_s,
   3498 					      struct wpa_ssid *ssid,
   3499 					      const char *field,
   3500 					      const char *value)
   3501 {
   3502 #ifdef IEEE8021X_EAPOL
   3503 	struct eap_peer_config *eap = &ssid->eap;
   3504 
   3505 	wpa_printf(MSG_DEBUG, "CTRL_IFACE: response handle field=%s", field);
   3506 	wpa_hexdump_ascii_key(MSG_DEBUG, "CTRL_IFACE: response value",
   3507 			      (const u8 *) value, os_strlen(value));
   3508 
   3509 	switch (wpa_supplicant_ctrl_req_from_string(field)) {
   3510 	case WPA_CTRL_REQ_EAP_IDENTITY:
   3511 		os_free(eap->identity);
   3512 		eap->identity = (u8 *) os_strdup(value);
   3513 		eap->identity_len = os_strlen(value);
   3514 		eap->pending_req_identity = 0;
   3515 		if (ssid == wpa_s->current_ssid)
   3516 			wpa_s->reassociate = 1;
   3517 		break;
   3518 	case WPA_CTRL_REQ_EAP_PASSWORD:
   3519 		os_free(eap->password);
   3520 		eap->password = (u8 *) os_strdup(value);
   3521 		eap->password_len = os_strlen(value);
   3522 		eap->pending_req_password = 0;
   3523 		if (ssid == wpa_s->current_ssid)
   3524 			wpa_s->reassociate = 1;
   3525 		break;
   3526 	case WPA_CTRL_REQ_EAP_NEW_PASSWORD:
   3527 		os_free(eap->new_password);
   3528 		eap->new_password = (u8 *) os_strdup(value);
   3529 		eap->new_password_len = os_strlen(value);
   3530 		eap->pending_req_new_password = 0;
   3531 		if (ssid == wpa_s->current_ssid)
   3532 			wpa_s->reassociate = 1;
   3533 		break;
   3534 	case WPA_CTRL_REQ_EAP_PIN:
   3535 		os_free(eap->pin);
   3536 		eap->pin = os_strdup(value);
   3537 		eap->pending_req_pin = 0;
   3538 		if (ssid == wpa_s->current_ssid)
   3539 			wpa_s->reassociate = 1;
   3540 		break;
   3541 	case WPA_CTRL_REQ_EAP_OTP:
   3542 		os_free(eap->otp);
   3543 		eap->otp = (u8 *) os_strdup(value);
   3544 		eap->otp_len = os_strlen(value);
   3545 		os_free(eap->pending_req_otp);
   3546 		eap->pending_req_otp = NULL;
   3547 		eap->pending_req_otp_len = 0;
   3548 		break;
   3549 	case WPA_CTRL_REQ_EAP_PASSPHRASE:
   3550 		os_free(eap->private_key_passwd);
   3551 		eap->private_key_passwd = (u8 *) os_strdup(value);
   3552 		eap->pending_req_passphrase = 0;
   3553 		if (ssid == wpa_s->current_ssid)
   3554 			wpa_s->reassociate = 1;
   3555 		break;
   3556 	default:
   3557 		wpa_printf(MSG_DEBUG, "CTRL_IFACE: Unknown field '%s'", field);
   3558 		return -1;
   3559 	}
   3560 
   3561 	return 0;
   3562 #else /* IEEE8021X_EAPOL */
   3563 	wpa_printf(MSG_DEBUG, "CTRL_IFACE: IEEE 802.1X not included");
   3564 	return -1;
   3565 #endif /* IEEE8021X_EAPOL */
   3566 }
   3567 #endif /* CONFIG_CTRL_IFACE || CONFIG_CTRL_IFACE_DBUS_NEW */
   3568 
   3569 
   3570 int wpas_network_disabled(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
   3571 {
   3572 	int i;
   3573 	unsigned int drv_enc;
   3574 
   3575 	if (ssid == NULL)
   3576 		return 1;
   3577 
   3578 	if (ssid->disabled)
   3579 		return 1;
   3580 
   3581 	if (wpa_s && wpa_s->drv_capa_known)
   3582 		drv_enc = wpa_s->drv_enc;
   3583 	else
   3584 		drv_enc = (unsigned int) -1;
   3585 
   3586 	for (i = 0; i < NUM_WEP_KEYS; i++) {
   3587 		size_t len = ssid->wep_key_len[i];
   3588 		if (len == 0)
   3589 			continue;
   3590 		if (len == 5 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP40))
   3591 			continue;
   3592 		if (len == 13 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP104))
   3593 			continue;
   3594 		if (len == 16 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP128))
   3595 			continue;
   3596 		return 1; /* invalid WEP key */
   3597 	}
   3598 
   3599 	if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt) && !ssid->psk_set &&
   3600 	    !ssid->ext_psk)
   3601 		return 1;
   3602 
   3603 	return 0;
   3604 }
   3605 
   3606 
   3607 int wpas_is_p2p_prioritized(struct wpa_supplicant *wpa_s)
   3608 {
   3609 	if (wpa_s->global->conc_pref == WPA_CONC_PREF_P2P)
   3610 		return 1;
   3611 	if (wpa_s->global->conc_pref == WPA_CONC_PREF_STA)
   3612 		return 0;
   3613 	return -1;
   3614 }
   3615 
   3616 
   3617 void wpas_auth_failed(struct wpa_supplicant *wpa_s)
   3618 {
   3619 	struct wpa_ssid *ssid = wpa_s->current_ssid;
   3620 	int dur;
   3621 	struct os_time now;
   3622 
   3623 	if (ssid == NULL) {
   3624 		wpa_printf(MSG_DEBUG, "Authentication failure but no known "
   3625 			   "SSID block");
   3626 		return;
   3627 	}
   3628 
   3629 	if (ssid->key_mgmt == WPA_KEY_MGMT_WPS)
   3630 		return;
   3631 
   3632 	ssid->auth_failures++;
   3633 	if (ssid->auth_failures > 50)
   3634 		dur = 300;
   3635 	else if (ssid->auth_failures > 20)
   3636 		dur = 120;
   3637 	else if (ssid->auth_failures > 10)
   3638 		dur = 60;
   3639 	else if (ssid->auth_failures > 5)
   3640 		dur = 30;
   3641 	else if (ssid->auth_failures > 1)
   3642 		dur = 20;
   3643 	else
   3644 		dur = 10;
   3645 
   3646 	os_get_time(&now);
   3647 	if (now.sec + dur <= ssid->disabled_until.sec)
   3648 		return;
   3649 
   3650 	ssid->disabled_until.sec = now.sec + dur;
   3651 
   3652 	wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TEMP_DISABLED
   3653 		"id=%d ssid=\"%s\" auth_failures=%u duration=%d",
   3654 		ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
   3655 		ssid->auth_failures, dur);
   3656 }
   3657 
   3658 
   3659 void wpas_clear_temp_disabled(struct wpa_supplicant *wpa_s,
   3660 			      struct wpa_ssid *ssid, int clear_failures)
   3661 {
   3662 	if (ssid == NULL)
   3663 		return;
   3664 
   3665 	if (ssid->disabled_until.sec) {
   3666 		wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_REENABLED
   3667 			"id=%d ssid=\"%s\"",
   3668 			ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
   3669 	}
   3670 	ssid->disabled_until.sec = 0;
   3671 	ssid->disabled_until.usec = 0;
   3672 	if (clear_failures)
   3673 		ssid->auth_failures = 0;
   3674 }
   3675