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