wpa_supplicant.c revision 1f69aa52ea2e0a73ac502565df8c666ee49cab6a
1/*
2 * WPA Supplicant
3 * Copyright (c) 2003-2011, Jouni Malinen <j@w1.fi>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 *
9 * Alternatively, this software may be distributed under the terms of BSD
10 * license.
11 *
12 * See README and COPYING for more details.
13 *
14 * This file implements functions for registering and unregistering
15 * %wpa_supplicant interfaces. In addition, this file contains number of
16 * functions for managing network connections.
17 */
18
19#include "includes.h"
20
21#include "common.h"
22#include "crypto/random.h"
23#include "crypto/sha1.h"
24#include "eapol_supp/eapol_supp_sm.h"
25#include "eap_peer/eap.h"
26#include "eap_server/eap_methods.h"
27#include "rsn_supp/wpa.h"
28#include "eloop.h"
29#include "config.h"
30#include "l2_packet/l2_packet.h"
31#include "wpa_supplicant_i.h"
32#include "driver_i.h"
33#include "ctrl_iface.h"
34#include "pcsc_funcs.h"
35#include "common/version.h"
36#include "rsn_supp/preauth.h"
37#include "rsn_supp/pmksa_cache.h"
38#include "common/wpa_ctrl.h"
39#include "common/ieee802_11_defs.h"
40#include "p2p/p2p.h"
41#include "blacklist.h"
42#include "wpas_glue.h"
43#include "wps_supplicant.h"
44#include "ibss_rsn.h"
45#include "sme.h"
46#include "gas_query.h"
47#include "ap.h"
48#include "p2p_supplicant.h"
49#include "notify.h"
50#include "bgscan.h"
51#include "bss.h"
52#include "scan.h"
53#include "offchannel.h"
54
55const char *wpa_supplicant_version =
56"wpa_supplicant v" VERSION_STR "\n"
57"Copyright (c) 2003-2011, Jouni Malinen <j@w1.fi> and contributors";
58
59const char *wpa_supplicant_license =
60"This program is free software. You can distribute it and/or modify it\n"
61"under the terms of the GNU General Public License version 2.\n"
62"\n"
63"Alternatively, this software may be distributed under the terms of the\n"
64"BSD license. See README and COPYING for more details.\n"
65#ifdef EAP_TLS_OPENSSL
66"\nThis product includes software developed by the OpenSSL Project\n"
67"for use in the OpenSSL Toolkit (http://www.openssl.org/)\n"
68#endif /* EAP_TLS_OPENSSL */
69;
70
71#ifndef CONFIG_NO_STDOUT_DEBUG
72/* Long text divided into parts in order to fit in C89 strings size limits. */
73const char *wpa_supplicant_full_license1 =
74"This program is free software; you can redistribute it and/or modify\n"
75"it under the terms of the GNU General Public License version 2 as\n"
76"published by the Free Software Foundation.\n"
77"\n"
78"This program is distributed in the hope that it will be useful,\n"
79"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
80"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
81"GNU General Public License for more details.\n"
82"\n";
83const char *wpa_supplicant_full_license2 =
84"You should have received a copy of the GNU General Public License\n"
85"along with this program; if not, write to the Free Software\n"
86"Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n"
87"\n"
88"Alternatively, this software may be distributed under the terms of the\n"
89"BSD license.\n"
90"\n"
91"Redistribution and use in source and binary forms, with or without\n"
92"modification, are permitted provided that the following conditions are\n"
93"met:\n"
94"\n";
95const char *wpa_supplicant_full_license3 =
96"1. Redistributions of source code must retain the above copyright\n"
97"   notice, this list of conditions and the following disclaimer.\n"
98"\n"
99"2. Redistributions in binary form must reproduce the above copyright\n"
100"   notice, this list of conditions and the following disclaimer in the\n"
101"   documentation and/or other materials provided with the distribution.\n"
102"\n";
103const char *wpa_supplicant_full_license4 =
104"3. Neither the name(s) of the above-listed copyright holder(s) nor the\n"
105"   names of its contributors may be used to endorse or promote products\n"
106"   derived from this software without specific prior written permission.\n"
107"\n"
108"THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
109"\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
110"LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
111"A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n";
112const char *wpa_supplicant_full_license5 =
113"OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
114"SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
115"LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
116"DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
117"THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
118"(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
119"OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
120"\n";
121#endif /* CONFIG_NO_STDOUT_DEBUG */
122
123extern int wpa_debug_level;
124extern int wpa_debug_show_keys;
125extern int wpa_debug_timestamp;
126extern struct wpa_driver_ops *wpa_drivers[];
127
128/* Configure default/group WEP keys for static WEP */
129int wpa_set_wep_keys(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
130{
131	int i, set = 0;
132
133	for (i = 0; i < NUM_WEP_KEYS; i++) {
134		if (ssid->wep_key_len[i] == 0)
135			continue;
136
137		set = 1;
138		wpa_drv_set_key(wpa_s, WPA_ALG_WEP, NULL,
139				i, i == ssid->wep_tx_keyidx, NULL, 0,
140				ssid->wep_key[i], ssid->wep_key_len[i]);
141	}
142
143	return set;
144}
145
146
147static int wpa_supplicant_set_wpa_none_key(struct wpa_supplicant *wpa_s,
148					   struct wpa_ssid *ssid)
149{
150	u8 key[32];
151	size_t keylen;
152	enum wpa_alg alg;
153	u8 seq[6] = { 0 };
154
155	/* IBSS/WPA-None uses only one key (Group) for both receiving and
156	 * sending unicast and multicast packets. */
157
158	if (ssid->mode != WPAS_MODE_IBSS) {
159		wpa_msg(wpa_s, MSG_INFO, "WPA: Invalid mode %d (not "
160			"IBSS/ad-hoc) for WPA-None", ssid->mode);
161		return -1;
162	}
163
164	if (!ssid->psk_set) {
165		wpa_msg(wpa_s, MSG_INFO, "WPA: No PSK configured for "
166			"WPA-None");
167		return -1;
168	}
169
170	switch (wpa_s->group_cipher) {
171	case WPA_CIPHER_CCMP:
172		os_memcpy(key, ssid->psk, 16);
173		keylen = 16;
174		alg = WPA_ALG_CCMP;
175		break;
176	case WPA_CIPHER_TKIP:
177		/* WPA-None uses the same Michael MIC key for both TX and RX */
178		os_memcpy(key, ssid->psk, 16 + 8);
179		os_memcpy(key + 16 + 8, ssid->psk + 16, 8);
180		keylen = 32;
181		alg = WPA_ALG_TKIP;
182		break;
183	default:
184		wpa_msg(wpa_s, MSG_INFO, "WPA: Invalid group cipher %d for "
185			"WPA-None", wpa_s->group_cipher);
186		return -1;
187	}
188
189	/* TODO: should actually remember the previously used seq#, both for TX
190	 * and RX from each STA.. */
191
192	return wpa_drv_set_key(wpa_s, alg, NULL, 0, 1, seq, 6, key, keylen);
193}
194
195
196static void wpa_supplicant_timeout(void *eloop_ctx, void *timeout_ctx)
197{
198	struct wpa_supplicant *wpa_s = eloop_ctx;
199	const u8 *bssid = wpa_s->bssid;
200	if (is_zero_ether_addr(bssid))
201		bssid = wpa_s->pending_bssid;
202	wpa_msg(wpa_s, MSG_INFO, "Authentication with " MACSTR " timed out.",
203		MAC2STR(bssid));
204	wpa_blacklist_add(wpa_s, bssid);
205	wpa_sm_notify_disassoc(wpa_s->wpa);
206	wpa_supplicant_disassociate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
207	wpa_s->reassociate = 1;
208
209	/*
210	 * If we timed out, the AP or the local radio may be busy.
211	 * So, wait a second until scanning again.
212	 */
213	wpa_supplicant_req_scan(wpa_s, 1, 0);
214}
215
216
217/**
218 * wpa_supplicant_req_auth_timeout - Schedule a timeout for authentication
219 * @wpa_s: Pointer to wpa_supplicant data
220 * @sec: Number of seconds after which to time out authentication
221 * @usec: Number of microseconds after which to time out authentication
222 *
223 * This function is used to schedule a timeout for the current authentication
224 * attempt.
225 */
226void wpa_supplicant_req_auth_timeout(struct wpa_supplicant *wpa_s,
227				     int sec, int usec)
228{
229	if (wpa_s->conf && wpa_s->conf->ap_scan == 0 &&
230	    (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED))
231		return;
232
233	wpa_dbg(wpa_s, MSG_DEBUG, "Setting authentication timeout: %d sec "
234		"%d usec", sec, usec);
235	eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
236	eloop_register_timeout(sec, usec, wpa_supplicant_timeout, wpa_s, NULL);
237}
238
239
240/**
241 * wpa_supplicant_cancel_auth_timeout - Cancel authentication timeout
242 * @wpa_s: Pointer to wpa_supplicant data
243 *
244 * This function is used to cancel authentication timeout scheduled with
245 * wpa_supplicant_req_auth_timeout() and it is called when authentication has
246 * been completed.
247 */
248void wpa_supplicant_cancel_auth_timeout(struct wpa_supplicant *wpa_s)
249{
250	wpa_dbg(wpa_s, MSG_DEBUG, "Cancelling authentication timeout");
251	eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
252	wpa_blacklist_del(wpa_s, wpa_s->bssid);
253}
254
255
256/**
257 * wpa_supplicant_initiate_eapol - Configure EAPOL state machine
258 * @wpa_s: Pointer to wpa_supplicant data
259 *
260 * This function is used to configure EAPOL state machine based on the selected
261 * authentication mode.
262 */
263void wpa_supplicant_initiate_eapol(struct wpa_supplicant *wpa_s)
264{
265#ifdef IEEE8021X_EAPOL
266	struct eapol_config eapol_conf;
267	struct wpa_ssid *ssid = wpa_s->current_ssid;
268
269#ifdef CONFIG_IBSS_RSN
270	if (ssid->mode == WPAS_MODE_IBSS &&
271	    wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
272	    wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
273		/*
274		 * RSN IBSS authentication is per-STA and we can disable the
275		 * per-BSSID EAPOL authentication.
276		 */
277		eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
278		eapol_sm_notify_eap_success(wpa_s->eapol, TRUE);
279		eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
280		return;
281	}
282#endif /* CONFIG_IBSS_RSN */
283
284	eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
285	eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
286
287	if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
288	    wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE)
289		eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
290	else
291		eapol_sm_notify_portControl(wpa_s->eapol, Auto);
292
293	os_memset(&eapol_conf, 0, sizeof(eapol_conf));
294	if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
295		eapol_conf.accept_802_1x_keys = 1;
296		eapol_conf.required_keys = 0;
297		if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_UNICAST) {
298			eapol_conf.required_keys |= EAPOL_REQUIRE_KEY_UNICAST;
299		}
300		if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_BROADCAST) {
301			eapol_conf.required_keys |=
302				EAPOL_REQUIRE_KEY_BROADCAST;
303		}
304
305		if (wpa_s->conf && (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED))
306			eapol_conf.required_keys = 0;
307	}
308	if (wpa_s->conf)
309		eapol_conf.fast_reauth = wpa_s->conf->fast_reauth;
310	eapol_conf.workaround = ssid->eap_workaround;
311	eapol_conf.eap_disabled =
312		!wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) &&
313		wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA &&
314		wpa_s->key_mgmt != WPA_KEY_MGMT_WPS;
315	eapol_sm_notify_config(wpa_s->eapol, &ssid->eap, &eapol_conf);
316#endif /* IEEE8021X_EAPOL */
317}
318
319
320/**
321 * wpa_supplicant_set_non_wpa_policy - Set WPA parameters to non-WPA mode
322 * @wpa_s: Pointer to wpa_supplicant data
323 * @ssid: Configuration data for the network
324 *
325 * This function is used to configure WPA state machine and related parameters
326 * to a mode where WPA is not enabled. This is called as part of the
327 * authentication configuration when the selected network does not use WPA.
328 */
329void wpa_supplicant_set_non_wpa_policy(struct wpa_supplicant *wpa_s,
330				       struct wpa_ssid *ssid)
331{
332	int i;
333
334	if (ssid->key_mgmt & WPA_KEY_MGMT_WPS)
335		wpa_s->key_mgmt = WPA_KEY_MGMT_WPS;
336	else if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA)
337		wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_NO_WPA;
338	else
339		wpa_s->key_mgmt = WPA_KEY_MGMT_NONE;
340	wpa_sm_set_ap_wpa_ie(wpa_s->wpa, NULL, 0);
341	wpa_sm_set_ap_rsn_ie(wpa_s->wpa, NULL, 0);
342	wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
343	wpa_s->pairwise_cipher = WPA_CIPHER_NONE;
344	wpa_s->group_cipher = WPA_CIPHER_NONE;
345	wpa_s->mgmt_group_cipher = 0;
346
347	for (i = 0; i < NUM_WEP_KEYS; i++) {
348		if (ssid->wep_key_len[i] > 5) {
349			wpa_s->pairwise_cipher = WPA_CIPHER_WEP104;
350			wpa_s->group_cipher = WPA_CIPHER_WEP104;
351			break;
352		} else if (ssid->wep_key_len[i] > 0) {
353			wpa_s->pairwise_cipher = WPA_CIPHER_WEP40;
354			wpa_s->group_cipher = WPA_CIPHER_WEP40;
355			break;
356		}
357	}
358
359	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED, 0);
360	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
361	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
362			 wpa_s->pairwise_cipher);
363	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
364#ifdef CONFIG_IEEE80211W
365	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
366			 wpa_s->mgmt_group_cipher);
367#endif /* CONFIG_IEEE80211W */
368
369	pmksa_cache_clear_current(wpa_s->wpa);
370}
371
372
373static void free_hw_features(struct wpa_supplicant *wpa_s)
374{
375	int i;
376	if (wpa_s->hw.modes == NULL)
377		return;
378
379	for (i = 0; i < wpa_s->hw.num_modes; i++) {
380		os_free(wpa_s->hw.modes[i].channels);
381		os_free(wpa_s->hw.modes[i].rates);
382	}
383
384	os_free(wpa_s->hw.modes);
385	wpa_s->hw.modes = NULL;
386}
387
388
389static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s)
390{
391	bgscan_deinit(wpa_s);
392	scard_deinit(wpa_s->scard);
393	wpa_s->scard = NULL;
394	wpa_sm_set_scard_ctx(wpa_s->wpa, NULL);
395	eapol_sm_register_scard_ctx(wpa_s->eapol, NULL);
396	l2_packet_deinit(wpa_s->l2);
397	wpa_s->l2 = NULL;
398	if (wpa_s->l2_br) {
399		l2_packet_deinit(wpa_s->l2_br);
400		wpa_s->l2_br = NULL;
401	}
402
403	if (wpa_s->conf != NULL) {
404		struct wpa_ssid *ssid;
405		for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
406			wpas_notify_network_removed(wpa_s, ssid);
407	}
408
409	os_free(wpa_s->confname);
410	wpa_s->confname = NULL;
411
412	wpa_sm_set_eapol(wpa_s->wpa, NULL);
413	eapol_sm_deinit(wpa_s->eapol);
414	wpa_s->eapol = NULL;
415
416	rsn_preauth_deinit(wpa_s->wpa);
417
418#ifdef CONFIG_TDLS
419	wpa_tdls_deinit(wpa_s->wpa);
420#endif /* CONFIG_TDLS */
421
422	pmksa_candidate_free(wpa_s->wpa);
423	wpa_sm_deinit(wpa_s->wpa);
424	wpa_s->wpa = NULL;
425	wpa_blacklist_clear(wpa_s);
426
427	wpa_bss_deinit(wpa_s);
428
429	wpa_supplicant_cancel_scan(wpa_s);
430	wpa_supplicant_cancel_auth_timeout(wpa_s);
431	eloop_cancel_timeout(wpa_supplicant_stop_countermeasures, wpa_s, NULL);
432#ifdef CONFIG_DELAYED_MIC_ERROR_REPORT
433	eloop_cancel_timeout(wpa_supplicant_delayed_mic_error_report,
434			     wpa_s, NULL);
435#endif /* CONFIG_DELAYED_MIC_ERROR_REPORT */
436
437	wpas_wps_deinit(wpa_s);
438
439	wpabuf_free(wpa_s->pending_eapol_rx);
440	wpa_s->pending_eapol_rx = NULL;
441
442#ifdef CONFIG_IBSS_RSN
443	ibss_rsn_deinit(wpa_s->ibss_rsn);
444	wpa_s->ibss_rsn = NULL;
445#endif /* CONFIG_IBSS_RSN */
446
447	sme_deinit(wpa_s);
448
449#ifdef CONFIG_AP
450	wpa_supplicant_ap_deinit(wpa_s);
451#endif /* CONFIG_AP */
452
453#ifdef CONFIG_P2P
454	wpas_p2p_deinit(wpa_s);
455#endif /* CONFIG_P2P */
456
457#ifdef CONFIG_OFFCHANNEL
458	offchannel_deinit(wpa_s);
459#endif /* CONFIG_OFFCHANNEL */
460
461	wpa_supplicant_cancel_sched_scan(wpa_s);
462
463	os_free(wpa_s->next_scan_freqs);
464	wpa_s->next_scan_freqs = NULL;
465
466	gas_query_deinit(wpa_s->gas);
467	wpa_s->gas = NULL;
468
469	free_hw_features(wpa_s);
470}
471
472
473/**
474 * wpa_clear_keys - Clear keys configured for the driver
475 * @wpa_s: Pointer to wpa_supplicant data
476 * @addr: Previously used BSSID or %NULL if not available
477 *
478 * This function clears the encryption keys that has been previously configured
479 * for the driver.
480 */
481void wpa_clear_keys(struct wpa_supplicant *wpa_s, const u8 *addr)
482{
483	if (wpa_s->keys_cleared) {
484		/* Some drivers (e.g., ndiswrapper & NDIS drivers) seem to have
485		 * timing issues with keys being cleared just before new keys
486		 * are set or just after association or something similar. This
487		 * shows up in group key handshake failing often because of the
488		 * client not receiving the first encrypted packets correctly.
489		 * Skipping some of the extra key clearing steps seems to help
490		 * in completing group key handshake more reliably. */
491		wpa_dbg(wpa_s, MSG_DEBUG, "No keys have been configured - "
492			"skip key clearing");
493		return;
494	}
495
496	/* MLME-DELETEKEYS.request */
497	wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, 0, 0, NULL, 0, NULL, 0);
498	wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, 1, 0, NULL, 0, NULL, 0);
499	wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, 2, 0, NULL, 0, NULL, 0);
500	wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, 3, 0, NULL, 0, NULL, 0);
501#ifdef CONFIG_IEEE80211W
502	wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, 4, 0, NULL, 0, NULL, 0);
503	wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, 5, 0, NULL, 0, NULL, 0);
504#endif /* CONFIG_IEEE80211W */
505	if (addr) {
506		wpa_drv_set_key(wpa_s, WPA_ALG_NONE, addr, 0, 0, NULL, 0, NULL,
507				0);
508		/* MLME-SETPROTECTION.request(None) */
509		wpa_drv_mlme_setprotection(
510			wpa_s, addr,
511			MLME_SETPROTECTION_PROTECT_TYPE_NONE,
512			MLME_SETPROTECTION_KEY_TYPE_PAIRWISE);
513	}
514	wpa_s->keys_cleared = 1;
515}
516
517
518/**
519 * wpa_supplicant_state_txt - Get the connection state name as a text string
520 * @state: State (wpa_state; WPA_*)
521 * Returns: The state name as a printable text string
522 */
523const char * wpa_supplicant_state_txt(enum wpa_states state)
524{
525	switch (state) {
526	case WPA_DISCONNECTED:
527		return "DISCONNECTED";
528	case WPA_INACTIVE:
529		return "INACTIVE";
530	case WPA_INTERFACE_DISABLED:
531		return "INTERFACE_DISABLED";
532	case WPA_SCANNING:
533		return "SCANNING";
534	case WPA_AUTHENTICATING:
535		return "AUTHENTICATING";
536	case WPA_ASSOCIATING:
537		return "ASSOCIATING";
538	case WPA_ASSOCIATED:
539		return "ASSOCIATED";
540	case WPA_4WAY_HANDSHAKE:
541		return "4WAY_HANDSHAKE";
542	case WPA_GROUP_HANDSHAKE:
543		return "GROUP_HANDSHAKE";
544	case WPA_COMPLETED:
545		return "COMPLETED";
546	default:
547		return "UNKNOWN";
548	}
549}
550
551
552#ifdef CONFIG_BGSCAN
553
554static void wpa_supplicant_start_bgscan(struct wpa_supplicant *wpa_s)
555{
556	if (wpas_driver_bss_selection(wpa_s))
557		return;
558	if (wpa_s->current_ssid == wpa_s->bgscan_ssid)
559		return;
560
561	bgscan_deinit(wpa_s);
562	if (wpa_s->current_ssid && wpa_s->current_ssid->bgscan) {
563		if (bgscan_init(wpa_s, wpa_s->current_ssid)) {
564			wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize "
565				"bgscan");
566			/*
567			 * Live without bgscan; it is only used as a roaming
568			 * optimization, so the initial connection is not
569			 * affected.
570			 */
571		} else
572			wpa_s->bgscan_ssid = wpa_s->current_ssid;
573	} else
574		wpa_s->bgscan_ssid = NULL;
575}
576
577
578static void wpa_supplicant_stop_bgscan(struct wpa_supplicant *wpa_s)
579{
580	if (wpa_s->bgscan_ssid != NULL) {
581		bgscan_deinit(wpa_s);
582		wpa_s->bgscan_ssid = NULL;
583	}
584}
585
586#endif /* CONFIG_BGSCAN */
587
588
589/**
590 * wpa_supplicant_set_state - Set current connection state
591 * @wpa_s: Pointer to wpa_supplicant data
592 * @state: The new connection state
593 *
594 * This function is called whenever the connection state changes, e.g.,
595 * association is completed for WPA/WPA2 4-Way Handshake is started.
596 */
597void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s,
598			      enum wpa_states state)
599{
600	enum wpa_states old_state = wpa_s->wpa_state;
601
602	wpa_dbg(wpa_s, MSG_DEBUG, "State: %s -> %s",
603		wpa_supplicant_state_txt(wpa_s->wpa_state),
604		wpa_supplicant_state_txt(state));
605
606	if (state != WPA_SCANNING)
607		wpa_supplicant_notify_scanning(wpa_s, 0);
608
609	if (state == WPA_COMPLETED && wpa_s->new_connection) {
610#if defined(CONFIG_CTRL_IFACE) || !defined(CONFIG_NO_STDOUT_DEBUG)
611		struct wpa_ssid *ssid = wpa_s->current_ssid;
612		wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_CONNECTED "- Connection to "
613			MACSTR " completed %s [id=%d id_str=%s]",
614			MAC2STR(wpa_s->bssid), wpa_s->reassociated_connection ?
615			"(reauth)" : "(auth)",
616			ssid ? ssid->id : -1,
617			ssid && ssid->id_str ? ssid->id_str : "");
618#endif /* CONFIG_CTRL_IFACE || !CONFIG_NO_STDOUT_DEBUG */
619		wpa_s->new_connection = 0;
620		wpa_s->reassociated_connection = 1;
621		wpa_drv_set_operstate(wpa_s, 1);
622#ifndef IEEE8021X_EAPOL
623		wpa_drv_set_supp_port(wpa_s, 1);
624#endif /* IEEE8021X_EAPOL */
625		wpa_s->after_wps = 0;
626#ifdef CONFIG_P2P
627		wpas_p2p_completed(wpa_s);
628#endif /* CONFIG_P2P */
629	} else if (state == WPA_DISCONNECTED || state == WPA_ASSOCIATING ||
630		   state == WPA_ASSOCIATED) {
631		wpa_s->new_connection = 1;
632		wpa_drv_set_operstate(wpa_s, 0);
633#ifndef IEEE8021X_EAPOL
634		wpa_drv_set_supp_port(wpa_s, 0);
635#endif /* IEEE8021X_EAPOL */
636	}
637	wpa_s->wpa_state = state;
638
639#ifdef CONFIG_BGSCAN
640	if (state == WPA_COMPLETED)
641		wpa_supplicant_start_bgscan(wpa_s);
642	else
643		wpa_supplicant_stop_bgscan(wpa_s);
644#endif /* CONFIG_BGSCAN */
645
646	if (wpa_s->wpa_state != old_state) {
647		wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
648
649		if (wpa_s->wpa_state == WPA_COMPLETED ||
650		    old_state == WPA_COMPLETED)
651			wpas_notify_auth_changed(wpa_s);
652	}
653}
654
655
656void wpa_supplicant_terminate_proc(struct wpa_global *global)
657{
658	int pending = 0;
659#ifdef CONFIG_WPS
660	struct wpa_supplicant *wpa_s = global->ifaces;
661	while (wpa_s) {
662		if (wpas_wps_terminate_pending(wpa_s) == 1)
663			pending = 1;
664		wpa_s = wpa_s->next;
665	}
666#endif /* CONFIG_WPS */
667	if (pending)
668		return;
669	eloop_terminate();
670}
671
672
673static void wpa_supplicant_terminate(int sig, void *signal_ctx)
674{
675	struct wpa_global *global = signal_ctx;
676	struct wpa_supplicant *wpa_s;
677	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
678		wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TERMINATING "- signal %d "
679			"received", sig);
680	}
681	wpa_supplicant_terminate_proc(global);
682}
683
684
685void wpa_supplicant_clear_status(struct wpa_supplicant *wpa_s)
686{
687	enum wpa_states old_state = wpa_s->wpa_state;
688
689	wpa_s->pairwise_cipher = 0;
690	wpa_s->group_cipher = 0;
691	wpa_s->mgmt_group_cipher = 0;
692	wpa_s->key_mgmt = 0;
693	if (wpa_s->wpa_state != WPA_INTERFACE_DISABLED)
694		wpa_s->wpa_state = WPA_DISCONNECTED;
695
696	if (wpa_s->wpa_state != old_state)
697		wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
698}
699
700
701/**
702 * wpa_supplicant_reload_configuration - Reload configuration data
703 * @wpa_s: Pointer to wpa_supplicant data
704 * Returns: 0 on success or -1 if configuration parsing failed
705 *
706 * This function can be used to request that the configuration data is reloaded
707 * (e.g., after configuration file change). This function is reloading
708 * configuration only for one interface, so this may need to be called multiple
709 * times if %wpa_supplicant is controlling multiple interfaces and all
710 * interfaces need reconfiguration.
711 */
712int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s)
713{
714	struct wpa_config *conf;
715	int reconf_ctrl;
716	int old_ap_scan;
717
718	if (wpa_s->confname == NULL)
719		return -1;
720	conf = wpa_config_read(wpa_s->confname);
721	if (conf == NULL) {
722		wpa_msg(wpa_s, MSG_ERROR, "Failed to parse the configuration "
723			"file '%s' - exiting", wpa_s->confname);
724		return -1;
725	}
726	conf->changed_parameters = (unsigned int) -1;
727
728	reconf_ctrl = !!conf->ctrl_interface != !!wpa_s->conf->ctrl_interface
729		|| (conf->ctrl_interface && wpa_s->conf->ctrl_interface &&
730		    os_strcmp(conf->ctrl_interface,
731			      wpa_s->conf->ctrl_interface) != 0);
732
733	if (reconf_ctrl && wpa_s->ctrl_iface) {
734		wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
735		wpa_s->ctrl_iface = NULL;
736	}
737
738	eapol_sm_invalidate_cached_session(wpa_s->eapol);
739	if (wpa_s->current_ssid) {
740		wpa_supplicant_deauthenticate(wpa_s,
741					      WLAN_REASON_DEAUTH_LEAVING);
742	}
743
744	/*
745	 * TODO: should notify EAPOL SM about changes in opensc_engine_path,
746	 * pkcs11_engine_path, pkcs11_module_path.
747	 */
748	if (wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt)) {
749		/*
750		 * Clear forced success to clear EAP state for next
751		 * authentication.
752		 */
753		eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
754	}
755	eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
756	wpa_sm_set_config(wpa_s->wpa, NULL);
757	wpa_sm_pmksa_cache_flush(wpa_s->wpa, NULL);
758	wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
759	rsn_preauth_deinit(wpa_s->wpa);
760
761	old_ap_scan = wpa_s->conf->ap_scan;
762	wpa_config_free(wpa_s->conf);
763	wpa_s->conf = conf;
764	if (old_ap_scan != wpa_s->conf->ap_scan)
765		wpas_notify_ap_scan_changed(wpa_s);
766
767	if (reconf_ctrl)
768		wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
769
770	wpa_supplicant_update_config(wpa_s);
771
772	wpa_supplicant_clear_status(wpa_s);
773	if (wpa_supplicant_enabled_networks(wpa_s->conf)) {
774		wpa_s->reassociate = 1;
775		wpa_supplicant_req_scan(wpa_s, 0, 0);
776	}
777	wpa_dbg(wpa_s, MSG_DEBUG, "Reconfiguration completed");
778	return 0;
779}
780
781
782static void wpa_supplicant_reconfig(int sig, void *signal_ctx)
783{
784	struct wpa_global *global = signal_ctx;
785	struct wpa_supplicant *wpa_s;
786	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
787		wpa_dbg(wpa_s, MSG_DEBUG, "Signal %d received - reconfiguring",
788			sig);
789		if (wpa_supplicant_reload_configuration(wpa_s) < 0) {
790			wpa_supplicant_terminate_proc(global);
791		}
792	}
793}
794
795
796enum wpa_cipher cipher_suite2driver(int cipher)
797{
798	switch (cipher) {
799	case WPA_CIPHER_NONE:
800		return CIPHER_NONE;
801	case WPA_CIPHER_WEP40:
802		return CIPHER_WEP40;
803	case WPA_CIPHER_WEP104:
804		return CIPHER_WEP104;
805	case WPA_CIPHER_CCMP:
806		return CIPHER_CCMP;
807	case WPA_CIPHER_TKIP:
808	default:
809		return CIPHER_TKIP;
810	}
811}
812
813
814enum wpa_key_mgmt key_mgmt2driver(int key_mgmt)
815{
816	switch (key_mgmt) {
817	case WPA_KEY_MGMT_NONE:
818		return KEY_MGMT_NONE;
819	case WPA_KEY_MGMT_IEEE8021X_NO_WPA:
820		return KEY_MGMT_802_1X_NO_WPA;
821	case WPA_KEY_MGMT_IEEE8021X:
822		return KEY_MGMT_802_1X;
823	case WPA_KEY_MGMT_WPA_NONE:
824		return KEY_MGMT_WPA_NONE;
825	case WPA_KEY_MGMT_FT_IEEE8021X:
826		return KEY_MGMT_FT_802_1X;
827	case WPA_KEY_MGMT_FT_PSK:
828		return KEY_MGMT_FT_PSK;
829	case WPA_KEY_MGMT_IEEE8021X_SHA256:
830		return KEY_MGMT_802_1X_SHA256;
831	case WPA_KEY_MGMT_PSK_SHA256:
832		return KEY_MGMT_PSK_SHA256;
833	case WPA_KEY_MGMT_WPS:
834		return KEY_MGMT_WPS;
835	case WPA_KEY_MGMT_PSK:
836	default:
837		return KEY_MGMT_PSK;
838	}
839}
840
841
842static int wpa_supplicant_suites_from_ai(struct wpa_supplicant *wpa_s,
843					 struct wpa_ssid *ssid,
844					 struct wpa_ie_data *ie)
845{
846	int ret = wpa_sm_parse_own_wpa_ie(wpa_s->wpa, ie);
847	if (ret) {
848		if (ret == -2) {
849			wpa_msg(wpa_s, MSG_INFO, "WPA: Failed to parse WPA IE "
850				"from association info");
851		}
852		return -1;
853	}
854
855	wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Using WPA IE from AssocReq to set "
856		"cipher suites");
857	if (!(ie->group_cipher & ssid->group_cipher)) {
858		wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled group "
859			"cipher 0x%x (mask 0x%x) - reject",
860			ie->group_cipher, ssid->group_cipher);
861		return -1;
862	}
863	if (!(ie->pairwise_cipher & ssid->pairwise_cipher)) {
864		wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled pairwise "
865			"cipher 0x%x (mask 0x%x) - reject",
866			ie->pairwise_cipher, ssid->pairwise_cipher);
867		return -1;
868	}
869	if (!(ie->key_mgmt & ssid->key_mgmt)) {
870		wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled key "
871			"management 0x%x (mask 0x%x) - reject",
872			ie->key_mgmt, ssid->key_mgmt);
873		return -1;
874	}
875
876#ifdef CONFIG_IEEE80211W
877	if (!(ie->capabilities & WPA_CAPABILITY_MFPC) &&
878	    ssid->ieee80211w == MGMT_FRAME_PROTECTION_REQUIRED) {
879		wpa_msg(wpa_s, MSG_INFO, "WPA: Driver associated with an AP "
880			"that does not support management frame protection - "
881			"reject");
882		return -1;
883	}
884#endif /* CONFIG_IEEE80211W */
885
886	return 0;
887}
888
889
890/**
891 * wpa_supplicant_set_suites - Set authentication and encryption parameters
892 * @wpa_s: Pointer to wpa_supplicant data
893 * @bss: Scan results for the selected BSS, or %NULL if not available
894 * @ssid: Configuration data for the selected network
895 * @wpa_ie: Buffer for the WPA/RSN IE
896 * @wpa_ie_len: Maximum wpa_ie buffer size on input. This is changed to be the
897 * used buffer length in case the functions returns success.
898 * Returns: 0 on success or -1 on failure
899 *
900 * This function is used to configure authentication and encryption parameters
901 * based on the network configuration and scan result for the selected BSS (if
902 * available).
903 */
904int wpa_supplicant_set_suites(struct wpa_supplicant *wpa_s,
905			      struct wpa_bss *bss, struct wpa_ssid *ssid,
906			      u8 *wpa_ie, size_t *wpa_ie_len)
907{
908	struct wpa_ie_data ie;
909	int sel, proto;
910	const u8 *bss_wpa, *bss_rsn;
911
912	if (bss) {
913		bss_wpa = wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE);
914		bss_rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
915	} else
916		bss_wpa = bss_rsn = NULL;
917
918	if (bss_rsn && (ssid->proto & WPA_PROTO_RSN) &&
919	    wpa_parse_wpa_ie(bss_rsn, 2 + bss_rsn[1], &ie) == 0 &&
920	    (ie.group_cipher & ssid->group_cipher) &&
921	    (ie.pairwise_cipher & ssid->pairwise_cipher) &&
922	    (ie.key_mgmt & ssid->key_mgmt)) {
923		wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using IEEE 802.11i/D9.0");
924		proto = WPA_PROTO_RSN;
925	} else if (bss_wpa && (ssid->proto & WPA_PROTO_WPA) &&
926		   wpa_parse_wpa_ie(bss_wpa, 2 +bss_wpa[1], &ie) == 0 &&
927		   (ie.group_cipher & ssid->group_cipher) &&
928		   (ie.pairwise_cipher & ssid->pairwise_cipher) &&
929		   (ie.key_mgmt & ssid->key_mgmt)) {
930		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using IEEE 802.11i/D3.0");
931		proto = WPA_PROTO_WPA;
932	} else if (bss) {
933		wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select WPA/RSN");
934		return -1;
935	} else {
936		if (ssid->proto & WPA_PROTO_RSN)
937			proto = WPA_PROTO_RSN;
938		else
939			proto = WPA_PROTO_WPA;
940		if (wpa_supplicant_suites_from_ai(wpa_s, ssid, &ie) < 0) {
941			os_memset(&ie, 0, sizeof(ie));
942			ie.group_cipher = ssid->group_cipher;
943			ie.pairwise_cipher = ssid->pairwise_cipher;
944			ie.key_mgmt = ssid->key_mgmt;
945#ifdef CONFIG_IEEE80211W
946			ie.mgmt_group_cipher =
947				ssid->ieee80211w != NO_MGMT_FRAME_PROTECTION ?
948				WPA_CIPHER_AES_128_CMAC : 0;
949#endif /* CONFIG_IEEE80211W */
950			wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Set cipher suites "
951				"based on configuration");
952		} else
953			proto = ie.proto;
954	}
955
956	wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected cipher suites: group %d "
957		"pairwise %d key_mgmt %d proto %d",
958		ie.group_cipher, ie.pairwise_cipher, ie.key_mgmt, proto);
959#ifdef CONFIG_IEEE80211W
960	if (ssid->ieee80211w) {
961		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected mgmt group cipher %d",
962			ie.mgmt_group_cipher);
963	}
964#endif /* CONFIG_IEEE80211W */
965
966	wpa_s->wpa_proto = proto;
967	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PROTO, proto);
968	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED,
969			 !!(ssid->proto & WPA_PROTO_RSN));
970
971	if (bss || !wpa_s->ap_ies_from_associnfo) {
972		if (wpa_sm_set_ap_wpa_ie(wpa_s->wpa, bss_wpa,
973					 bss_wpa ? 2 + bss_wpa[1] : 0) ||
974		    wpa_sm_set_ap_rsn_ie(wpa_s->wpa, bss_rsn,
975					 bss_rsn ? 2 + bss_rsn[1] : 0))
976			return -1;
977	}
978
979	sel = ie.group_cipher & ssid->group_cipher;
980	if (sel & WPA_CIPHER_CCMP) {
981		wpa_s->group_cipher = WPA_CIPHER_CCMP;
982		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using GTK CCMP");
983	} else if (sel & WPA_CIPHER_TKIP) {
984		wpa_s->group_cipher = WPA_CIPHER_TKIP;
985		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using GTK TKIP");
986	} else if (sel & WPA_CIPHER_WEP104) {
987		wpa_s->group_cipher = WPA_CIPHER_WEP104;
988		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using GTK WEP104");
989	} else if (sel & WPA_CIPHER_WEP40) {
990		wpa_s->group_cipher = WPA_CIPHER_WEP40;
991		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using GTK WEP40");
992	} else {
993		wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select group "
994			"cipher");
995		return -1;
996	}
997
998	sel = ie.pairwise_cipher & ssid->pairwise_cipher;
999	if (sel & WPA_CIPHER_CCMP) {
1000		wpa_s->pairwise_cipher = WPA_CIPHER_CCMP;
1001		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using PTK CCMP");
1002	} else if (sel & WPA_CIPHER_TKIP) {
1003		wpa_s->pairwise_cipher = WPA_CIPHER_TKIP;
1004		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using PTK TKIP");
1005	} else if (sel & WPA_CIPHER_NONE) {
1006		wpa_s->pairwise_cipher = WPA_CIPHER_NONE;
1007		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using PTK NONE");
1008	} else {
1009		wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select pairwise "
1010			"cipher");
1011		return -1;
1012	}
1013
1014	sel = ie.key_mgmt & ssid->key_mgmt;
1015	if (0) {
1016#ifdef CONFIG_IEEE80211R
1017	} else if (sel & WPA_KEY_MGMT_FT_IEEE8021X) {
1018		wpa_s->key_mgmt = WPA_KEY_MGMT_FT_IEEE8021X;
1019		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/802.1X");
1020	} else if (sel & WPA_KEY_MGMT_FT_PSK) {
1021		wpa_s->key_mgmt = WPA_KEY_MGMT_FT_PSK;
1022		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/PSK");
1023#endif /* CONFIG_IEEE80211R */
1024#ifdef CONFIG_IEEE80211W
1025	} else if (sel & WPA_KEY_MGMT_IEEE8021X_SHA256) {
1026		wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SHA256;
1027		wpa_dbg(wpa_s, MSG_DEBUG,
1028			"WPA: using KEY_MGMT 802.1X with SHA256");
1029	} else if (sel & WPA_KEY_MGMT_PSK_SHA256) {
1030		wpa_s->key_mgmt = WPA_KEY_MGMT_PSK_SHA256;
1031		wpa_dbg(wpa_s, MSG_DEBUG,
1032			"WPA: using KEY_MGMT PSK with SHA256");
1033#endif /* CONFIG_IEEE80211W */
1034	} else if (sel & WPA_KEY_MGMT_IEEE8021X) {
1035		wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X;
1036		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT 802.1X");
1037	} else if (sel & WPA_KEY_MGMT_PSK) {
1038		wpa_s->key_mgmt = WPA_KEY_MGMT_PSK;
1039		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-PSK");
1040	} else if (sel & WPA_KEY_MGMT_WPA_NONE) {
1041		wpa_s->key_mgmt = WPA_KEY_MGMT_WPA_NONE;
1042		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-NONE");
1043	} else {
1044		wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select "
1045			"authenticated key management type");
1046		return -1;
1047	}
1048
1049	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
1050	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
1051			 wpa_s->pairwise_cipher);
1052	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
1053
1054#ifdef CONFIG_IEEE80211W
1055	sel = ie.mgmt_group_cipher;
1056	if (ssid->ieee80211w == NO_MGMT_FRAME_PROTECTION ||
1057	    !(ie.capabilities & WPA_CAPABILITY_MFPC))
1058		sel = 0;
1059	if (sel & WPA_CIPHER_AES_128_CMAC) {
1060		wpa_s->mgmt_group_cipher = WPA_CIPHER_AES_128_CMAC;
1061		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1062			"AES-128-CMAC");
1063	} else {
1064		wpa_s->mgmt_group_cipher = 0;
1065		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: not using MGMT group cipher");
1066	}
1067	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
1068			 wpa_s->mgmt_group_cipher);
1069	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MFP, ssid->ieee80211w);
1070#endif /* CONFIG_IEEE80211W */
1071
1072	if (wpa_sm_set_assoc_wpa_ie_default(wpa_s->wpa, wpa_ie, wpa_ie_len)) {
1073		wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to generate WPA IE");
1074		return -1;
1075	}
1076
1077	if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt)) {
1078		wpa_sm_set_pmk(wpa_s->wpa, ssid->psk, PMK_LEN);
1079#ifndef CONFIG_NO_PBKDF2
1080		if (bss && ssid->bssid_set && ssid->ssid_len == 0 &&
1081		    ssid->passphrase) {
1082			u8 psk[PMK_LEN];
1083		        pbkdf2_sha1(ssid->passphrase, (char *) bss->ssid,
1084				    bss->ssid_len, 4096, psk, PMK_LEN);
1085		        wpa_hexdump_key(MSG_MSGDUMP, "PSK (from passphrase)",
1086					psk, PMK_LEN);
1087			wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN);
1088		}
1089#endif /* CONFIG_NO_PBKDF2 */
1090	} else
1091		wpa_sm_set_pmk_from_pmksa(wpa_s->wpa);
1092
1093	return 0;
1094}
1095
1096
1097/**
1098 * wpa_supplicant_associate - Request association
1099 * @wpa_s: Pointer to wpa_supplicant data
1100 * @bss: Scan results for the selected BSS, or %NULL if not available
1101 * @ssid: Configuration data for the selected network
1102 *
1103 * This function is used to request %wpa_supplicant to associate with a BSS.
1104 */
1105void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
1106			      struct wpa_bss *bss, struct wpa_ssid *ssid)
1107{
1108	u8 wpa_ie[200];
1109	size_t wpa_ie_len;
1110	int use_crypt, ret, i, bssid_changed;
1111	int algs = WPA_AUTH_ALG_OPEN;
1112	enum wpa_cipher cipher_pairwise, cipher_group;
1113	struct wpa_driver_associate_params params;
1114	int wep_keys_set = 0;
1115	struct wpa_driver_capa capa;
1116	int assoc_failed = 0;
1117	struct wpa_ssid *old_ssid;
1118#ifdef ANDROID_P2P
1119	int freq = 0;
1120#endif
1121
1122#ifdef CONFIG_IBSS_RSN
1123	ibss_rsn_deinit(wpa_s->ibss_rsn);
1124	wpa_s->ibss_rsn = NULL;
1125#endif /* CONFIG_IBSS_RSN */
1126
1127	if (ssid->mode == WPAS_MODE_AP || ssid->mode == WPAS_MODE_P2P_GO ||
1128	    ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) {
1129#ifdef CONFIG_AP
1130		if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_AP)) {
1131			wpa_msg(wpa_s, MSG_INFO, "Driver does not support AP "
1132				"mode");
1133			return;
1134		}
1135		wpa_supplicant_create_ap(wpa_s, ssid);
1136		wpa_s->current_bss = bss;
1137#else /* CONFIG_AP */
1138		wpa_msg(wpa_s, MSG_ERROR, "AP mode support not included in "
1139			"the build");
1140#endif /* CONFIG_AP */
1141		return;
1142	}
1143
1144#ifdef CONFIG_TDLS
1145	if (bss)
1146		wpa_tdls_ap_ies(wpa_s->wpa, (const u8 *) (bss + 1),
1147				bss->ie_len);
1148#endif /* CONFIG_TDLS */
1149
1150	if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) &&
1151	    ssid->mode == IEEE80211_MODE_INFRA) {
1152		sme_authenticate(wpa_s, bss, ssid);
1153		return;
1154	}
1155
1156	os_memset(&params, 0, sizeof(params));
1157	wpa_s->reassociate = 0;
1158	if (bss && !wpas_driver_bss_selection(wpa_s)) {
1159#ifdef CONFIG_IEEE80211R
1160		const u8 *ie, *md = NULL;
1161#endif /* CONFIG_IEEE80211R */
1162		wpa_msg(wpa_s, MSG_INFO, "Trying to associate with " MACSTR
1163			" (SSID='%s' freq=%d MHz)", MAC2STR(bss->bssid),
1164			wpa_ssid_txt(bss->ssid, bss->ssid_len), bss->freq);
1165		bssid_changed = !is_zero_ether_addr(wpa_s->bssid);
1166		os_memset(wpa_s->bssid, 0, ETH_ALEN);
1167		os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN);
1168		if (bssid_changed)
1169			wpas_notify_bssid_changed(wpa_s);
1170#ifdef CONFIG_IEEE80211R
1171		ie = wpa_bss_get_ie(bss, WLAN_EID_MOBILITY_DOMAIN);
1172		if (ie && ie[1] >= MOBILITY_DOMAIN_ID_LEN)
1173			md = ie + 2;
1174		wpa_sm_set_ft_params(wpa_s->wpa, ie, ie ? 2 + ie[1] : 0);
1175		if (md) {
1176			/* Prepare for the next transition */
1177			wpa_ft_prepare_auth_request(wpa_s->wpa, ie);
1178		}
1179#endif /* CONFIG_IEEE80211R */
1180#ifdef CONFIG_WPS
1181	} else if ((ssid->ssid == NULL || ssid->ssid_len == 0) &&
1182		   wpa_s->conf->ap_scan == 2 &&
1183		   (ssid->key_mgmt & WPA_KEY_MGMT_WPS)) {
1184		/* Use ap_scan==1 style network selection to find the network
1185		 */
1186		wpa_s->scan_req = 2;
1187		wpa_s->reassociate = 1;
1188		wpa_supplicant_req_scan(wpa_s, 0, 0);
1189		return;
1190#endif /* CONFIG_WPS */
1191	} else {
1192		wpa_msg(wpa_s, MSG_INFO, "Trying to associate with SSID '%s'",
1193			wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
1194		os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
1195	}
1196	wpa_supplicant_cancel_sched_scan(wpa_s);
1197	wpa_supplicant_cancel_scan(wpa_s);
1198
1199	/* Starting new association, so clear the possibly used WPA IE from the
1200	 * previous association. */
1201	wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
1202
1203#ifdef IEEE8021X_EAPOL
1204	if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1205		if (ssid->leap) {
1206			if (ssid->non_leap == 0)
1207				algs = WPA_AUTH_ALG_LEAP;
1208			else
1209				algs |= WPA_AUTH_ALG_LEAP;
1210		}
1211	}
1212#endif /* IEEE8021X_EAPOL */
1213	wpa_dbg(wpa_s, MSG_DEBUG, "Automatic auth_alg selection: 0x%x", algs);
1214	if (ssid->auth_alg) {
1215		algs = ssid->auth_alg;
1216		wpa_dbg(wpa_s, MSG_DEBUG, "Overriding auth_alg selection: "
1217			"0x%x", algs);
1218	}
1219
1220	if (bss && (wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE) ||
1221		    wpa_bss_get_ie(bss, WLAN_EID_RSN)) &&
1222	    wpa_key_mgmt_wpa(ssid->key_mgmt)) {
1223		int try_opportunistic;
1224		try_opportunistic = ssid->proactive_key_caching &&
1225			(ssid->proto & WPA_PROTO_RSN);
1226		if (pmksa_cache_set_current(wpa_s->wpa, NULL, bss->bssid,
1227					    wpa_s->current_ssid,
1228					    try_opportunistic) == 0)
1229			eapol_sm_notify_pmkid_attempt(wpa_s->eapol, 1);
1230		wpa_ie_len = sizeof(wpa_ie);
1231		if (wpa_supplicant_set_suites(wpa_s, bss, ssid,
1232					      wpa_ie, &wpa_ie_len)) {
1233			wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA "
1234				"key management and encryption suites");
1235			return;
1236		}
1237	} else if (wpa_key_mgmt_wpa_any(ssid->key_mgmt)) {
1238		wpa_ie_len = sizeof(wpa_ie);
1239		if (wpa_supplicant_set_suites(wpa_s, NULL, ssid,
1240					      wpa_ie, &wpa_ie_len)) {
1241			wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA "
1242				"key management and encryption suites (no "
1243				"scan results)");
1244			return;
1245		}
1246#ifdef CONFIG_WPS
1247	} else if (ssid->key_mgmt & WPA_KEY_MGMT_WPS) {
1248		struct wpabuf *wps_ie;
1249		wps_ie = wps_build_assoc_req_ie(wpas_wps_get_req_type(ssid));
1250		if (wps_ie && wpabuf_len(wps_ie) <= sizeof(wpa_ie)) {
1251			wpa_ie_len = wpabuf_len(wps_ie);
1252			os_memcpy(wpa_ie, wpabuf_head(wps_ie), wpa_ie_len);
1253		} else
1254			wpa_ie_len = 0;
1255		wpabuf_free(wps_ie);
1256		wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
1257		if (!bss || (bss->caps & IEEE80211_CAP_PRIVACY))
1258			params.wps = WPS_MODE_PRIVACY;
1259		else
1260			params.wps = WPS_MODE_OPEN;
1261		wpa_s->wpa_proto = 0;
1262#endif /* CONFIG_WPS */
1263	} else {
1264		wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
1265		wpa_ie_len = 0;
1266		wpa_s->wpa_proto = 0;
1267	}
1268
1269#ifdef CONFIG_P2P
1270	if (wpa_s->global->p2p) {
1271		u8 *pos;
1272		size_t len;
1273		int res;
1274		int p2p_group;
1275		p2p_group = wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_CAPABLE;
1276		pos = wpa_ie + wpa_ie_len;
1277		len = sizeof(wpa_ie) - wpa_ie_len;
1278		res = wpas_p2p_assoc_req_ie(wpa_s, bss, pos, len, p2p_group);
1279		if (res >= 0)
1280			wpa_ie_len += res;
1281	}
1282
1283	wpa_s->cross_connect_disallowed = 0;
1284	if (bss) {
1285		struct wpabuf *p2p;
1286		p2p = wpa_bss_get_vendor_ie_multi(bss, P2P_IE_VENDOR_TYPE);
1287		if (p2p) {
1288			wpa_s->cross_connect_disallowed =
1289				p2p_get_cross_connect_disallowed(p2p);
1290			wpabuf_free(p2p);
1291			wpa_dbg(wpa_s, MSG_DEBUG, "P2P: WLAN AP %s cross "
1292				"connection",
1293				wpa_s->cross_connect_disallowed ?
1294				"disallows" : "allows");
1295		}
1296	}
1297#endif /* CONFIG_P2P */
1298
1299#ifdef CONFIG_INTERWORKING
1300	if (wpa_s->conf->interworking) {
1301		u8 *pos = wpa_ie;
1302		if (wpa_ie_len > 0 && pos[0] == WLAN_EID_RSN)
1303			pos += 2 + pos[1];
1304		os_memmove(pos + 6, pos, wpa_ie_len - (pos - wpa_ie));
1305		wpa_ie_len += 6;
1306		*pos++ = WLAN_EID_EXT_CAPAB;
1307		*pos++ = 4;
1308		*pos++ = 0x00;
1309		*pos++ = 0x00;
1310		*pos++ = 0x00;
1311		*pos++ = 0x80; /* Bit 31 - Interworking */
1312	}
1313#endif /* CONFIG_INTERWORKING */
1314
1315	wpa_clear_keys(wpa_s, bss ? bss->bssid : NULL);
1316	use_crypt = 1;
1317	cipher_pairwise = cipher_suite2driver(wpa_s->pairwise_cipher);
1318	cipher_group = cipher_suite2driver(wpa_s->group_cipher);
1319	if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
1320	    wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1321		if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE)
1322			use_crypt = 0;
1323		if (wpa_set_wep_keys(wpa_s, ssid)) {
1324			use_crypt = 1;
1325			wep_keys_set = 1;
1326		}
1327	}
1328	if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS)
1329		use_crypt = 0;
1330
1331#ifdef IEEE8021X_EAPOL
1332	if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1333		if ((ssid->eapol_flags &
1334		     (EAPOL_FLAG_REQUIRE_KEY_UNICAST |
1335		      EAPOL_FLAG_REQUIRE_KEY_BROADCAST)) == 0 &&
1336		    !wep_keys_set) {
1337			use_crypt = 0;
1338		} else {
1339			/* Assume that dynamic WEP-104 keys will be used and
1340			 * set cipher suites in order for drivers to expect
1341			 * encryption. */
1342			cipher_pairwise = cipher_group = CIPHER_WEP104;
1343		}
1344	}
1345#endif /* IEEE8021X_EAPOL */
1346
1347	if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
1348		/* Set the key before (and later after) association */
1349		wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
1350	}
1351
1352	wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING);
1353	if (bss) {
1354		params.ssid = bss->ssid;
1355		params.ssid_len = bss->ssid_len;
1356		if (!wpas_driver_bss_selection(wpa_s)) {
1357			params.bssid = bss->bssid;
1358			params.freq = bss->freq;
1359		}
1360	} else {
1361		params.ssid = ssid->ssid;
1362		params.ssid_len = ssid->ssid_len;
1363	}
1364	if (ssid->mode == WPAS_MODE_IBSS && ssid->frequency > 0 &&
1365	    params.freq == 0)
1366		params.freq = ssid->frequency; /* Initial channel for IBSS */
1367	params.wpa_ie = wpa_ie;
1368	params.wpa_ie_len = wpa_ie_len;
1369	params.pairwise_suite = cipher_pairwise;
1370	params.group_suite = cipher_group;
1371	params.key_mgmt_suite = key_mgmt2driver(wpa_s->key_mgmt);
1372	params.wpa_proto = wpa_s->wpa_proto;
1373	params.auth_alg = algs;
1374	params.mode = ssid->mode;
1375	for (i = 0; i < NUM_WEP_KEYS; i++) {
1376		if (ssid->wep_key_len[i])
1377			params.wep_key[i] = ssid->wep_key[i];
1378		params.wep_key_len[i] = ssid->wep_key_len[i];
1379	}
1380	params.wep_tx_keyidx = ssid->wep_tx_keyidx;
1381
1382	if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) &&
1383	    (params.key_mgmt_suite == KEY_MGMT_PSK ||
1384	     params.key_mgmt_suite == KEY_MGMT_FT_PSK)) {
1385		params.passphrase = ssid->passphrase;
1386		if (ssid->psk_set)
1387			params.psk = ssid->psk;
1388	}
1389
1390	params.drop_unencrypted = use_crypt;
1391
1392#ifdef CONFIG_IEEE80211W
1393	params.mgmt_frame_protection = ssid->ieee80211w;
1394	if (ssid->ieee80211w != NO_MGMT_FRAME_PROTECTION && bss) {
1395		const u8 *rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
1396		struct wpa_ie_data ie;
1397		if (rsn && wpa_parse_wpa_ie(rsn, 2 + rsn[1], &ie) == 0 &&
1398		    ie.capabilities &
1399		    (WPA_CAPABILITY_MFPC | WPA_CAPABILITY_MFPR)) {
1400			wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected AP supports "
1401				"MFP: require MFP");
1402			params.mgmt_frame_protection =
1403				MGMT_FRAME_PROTECTION_REQUIRED;
1404		}
1405	}
1406#endif /* CONFIG_IEEE80211W */
1407
1408	params.p2p = ssid->p2p_group;
1409
1410	if (wpa_s->parent->set_sta_uapsd)
1411		params.uapsd = wpa_s->parent->sta_uapsd;
1412	else
1413		params.uapsd = -1;
1414
1415#ifdef ANDROID_P2P
1416	/* If multichannel concurrency is not supported, check for any frequency
1417	 * conflict and take appropriate action.
1418	 */
1419	if (((freq = wpa_drv_shared_freq(wpa_s)) > 0) && (freq != params.freq) &&
1420		!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_MULTI_CHANNEL_CONCURRENT)) {
1421		wpa_printf(MSG_ERROR, "Shared interface with conflicting frequency found (%d != %d)"
1422																, freq, params.freq);
1423		wpas_p2p_handle_frequency_conflicts(wpa_s, params.freq);
1424	}
1425#endif
1426	ret = wpa_drv_associate(wpa_s, &params);
1427	if (ret < 0) {
1428		wpa_msg(wpa_s, MSG_INFO, "Association request to the driver "
1429			"failed");
1430		if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SANE_ERROR_CODES) {
1431			/*
1432			 * The driver is known to mean what is saying, so we
1433			 * can stop right here; the association will not
1434			 * succeed.
1435			 */
1436			wpas_connection_failed(wpa_s, wpa_s->pending_bssid);
1437			os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
1438			return;
1439		}
1440		/* try to continue anyway; new association will be tried again
1441		 * after timeout */
1442		assoc_failed = 1;
1443	}
1444
1445	if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
1446		/* Set the key after the association just in case association
1447		 * cleared the previously configured key. */
1448		wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
1449		/* No need to timeout authentication since there is no key
1450		 * management. */
1451		wpa_supplicant_cancel_auth_timeout(wpa_s);
1452		wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
1453#ifdef CONFIG_IBSS_RSN
1454	} else if (ssid->mode == WPAS_MODE_IBSS &&
1455		   wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
1456		   wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
1457		/*
1458		 * RSN IBSS authentication is per-STA and we can disable the
1459		 * per-BSSID authentication.
1460		 */
1461		wpa_supplicant_cancel_auth_timeout(wpa_s);
1462#endif /* CONFIG_IBSS_RSN */
1463	} else {
1464		/* Timeout for IEEE 802.11 authentication and association */
1465		int timeout = 60;
1466
1467		if (assoc_failed) {
1468			/* give IBSS a bit more time */
1469			timeout = ssid->mode == WPAS_MODE_IBSS ? 10 : 5;
1470		} else if (wpa_s->conf->ap_scan == 1) {
1471			/* give IBSS a bit more time */
1472			timeout = ssid->mode == WPAS_MODE_IBSS ? 20 : 10;
1473		}
1474		wpa_supplicant_req_auth_timeout(wpa_s, timeout, 0);
1475	}
1476
1477	if (wep_keys_set && wpa_drv_get_capa(wpa_s, &capa) == 0 &&
1478	    capa.flags & WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC) {
1479		/* Set static WEP keys again */
1480		wpa_set_wep_keys(wpa_s, ssid);
1481	}
1482
1483	if (wpa_s->current_ssid && wpa_s->current_ssid != ssid) {
1484		/*
1485		 * Do not allow EAP session resumption between different
1486		 * network configurations.
1487		 */
1488		eapol_sm_invalidate_cached_session(wpa_s->eapol);
1489	}
1490	old_ssid = wpa_s->current_ssid;
1491	wpa_s->current_ssid = ssid;
1492	wpa_s->current_bss = bss;
1493	wpa_supplicant_rsn_supp_set_config(wpa_s, wpa_s->current_ssid);
1494	wpa_supplicant_initiate_eapol(wpa_s);
1495	if (old_ssid != wpa_s->current_ssid)
1496		wpas_notify_network_changed(wpa_s);
1497}
1498
1499
1500static void wpa_supplicant_clear_connection(struct wpa_supplicant *wpa_s,
1501					    const u8 *addr)
1502{
1503	struct wpa_ssid *old_ssid;
1504
1505	wpa_clear_keys(wpa_s, addr);
1506	wpa_supplicant_mark_disassoc(wpa_s);
1507	old_ssid = wpa_s->current_ssid;
1508	wpa_s->current_ssid = NULL;
1509	wpa_s->current_bss = NULL;
1510	wpa_sm_set_config(wpa_s->wpa, NULL);
1511	eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
1512	if (old_ssid != wpa_s->current_ssid)
1513		wpas_notify_network_changed(wpa_s);
1514	eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
1515}
1516
1517
1518/**
1519 * wpa_supplicant_disassociate - Disassociate the current connection
1520 * @wpa_s: Pointer to wpa_supplicant data
1521 * @reason_code: IEEE 802.11 reason code for the disassociate frame
1522 *
1523 * This function is used to request %wpa_supplicant to disassociate with the
1524 * current AP.
1525 */
1526void wpa_supplicant_disassociate(struct wpa_supplicant *wpa_s,
1527				 int reason_code)
1528{
1529	u8 *addr = NULL;
1530
1531	if (!is_zero_ether_addr(wpa_s->bssid)) {
1532		wpa_drv_disassociate(wpa_s, wpa_s->bssid, reason_code);
1533		addr = wpa_s->bssid;
1534	}
1535
1536	wpa_supplicant_clear_connection(wpa_s, addr);
1537}
1538
1539
1540/**
1541 * wpa_supplicant_deauthenticate - Deauthenticate the current connection
1542 * @wpa_s: Pointer to wpa_supplicant data
1543 * @reason_code: IEEE 802.11 reason code for the deauthenticate frame
1544 *
1545 * This function is used to request %wpa_supplicant to deauthenticate from the
1546 * current AP.
1547 */
1548void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
1549				   int reason_code)
1550{
1551	u8 *addr = NULL;
1552
1553	if (!is_zero_ether_addr(wpa_s->bssid)) {
1554		wpa_drv_deauthenticate(wpa_s, wpa_s->bssid, reason_code);
1555		addr = wpa_s->bssid;
1556	}
1557
1558	wpa_supplicant_clear_connection(wpa_s, addr);
1559}
1560
1561
1562/**
1563 * wpa_supplicant_enable_network - Mark a configured network as enabled
1564 * @wpa_s: wpa_supplicant structure for a network interface
1565 * @ssid: wpa_ssid structure for a configured network or %NULL
1566 *
1567 * Enables the specified network or all networks if no network specified.
1568 */
1569void wpa_supplicant_enable_network(struct wpa_supplicant *wpa_s,
1570				   struct wpa_ssid *ssid)
1571{
1572	struct wpa_ssid *other_ssid;
1573	int was_disabled;
1574
1575	if (ssid == NULL) {
1576		for (other_ssid = wpa_s->conf->ssid; other_ssid;
1577		     other_ssid = other_ssid->next) {
1578			if (other_ssid->disabled == 2)
1579				continue; /* do not change persistent P2P group
1580					   * data */
1581			if (other_ssid == wpa_s->current_ssid &&
1582			    other_ssid->disabled)
1583				wpa_s->reassociate = 1;
1584
1585			was_disabled = other_ssid->disabled;
1586
1587			other_ssid->disabled = 0;
1588
1589			if (was_disabled != other_ssid->disabled)
1590				wpas_notify_network_enabled_changed(
1591					wpa_s, other_ssid);
1592		}
1593		if (wpa_s->reassociate)
1594			wpa_supplicant_req_scan(wpa_s, 0, 0);
1595	} else if (ssid->disabled && ssid->disabled != 2) {
1596		if (wpa_s->current_ssid == NULL) {
1597			/*
1598			 * Try to reassociate since there is no current
1599			 * configuration and a new network was made available.
1600			 */
1601			wpa_s->reassociate = 1;
1602			wpa_supplicant_req_scan(wpa_s, 0, 0);
1603		}
1604
1605		was_disabled = ssid->disabled;
1606
1607		ssid->disabled = 0;
1608
1609		if (was_disabled != ssid->disabled)
1610			wpas_notify_network_enabled_changed(wpa_s, ssid);
1611	}
1612}
1613
1614
1615/**
1616 * wpa_supplicant_disable_network - Mark a configured network as disabled
1617 * @wpa_s: wpa_supplicant structure for a network interface
1618 * @ssid: wpa_ssid structure for a configured network or %NULL
1619 *
1620 * Disables the specified network or all networks if no network specified.
1621 */
1622void wpa_supplicant_disable_network(struct wpa_supplicant *wpa_s,
1623				    struct wpa_ssid *ssid)
1624{
1625	struct wpa_ssid *other_ssid;
1626	int was_disabled;
1627
1628	if (ssid == NULL) {
1629		for (other_ssid = wpa_s->conf->ssid; other_ssid;
1630		     other_ssid = other_ssid->next) {
1631			was_disabled = other_ssid->disabled;
1632			if (was_disabled == 2)
1633				continue; /* do not change persistent P2P group
1634					   * data */
1635
1636			other_ssid->disabled = 1;
1637
1638			if (was_disabled != other_ssid->disabled)
1639				wpas_notify_network_enabled_changed(
1640					wpa_s, other_ssid);
1641		}
1642		if (wpa_s->current_ssid)
1643			wpa_supplicant_disassociate(
1644				wpa_s, WLAN_REASON_DEAUTH_LEAVING);
1645	} else if (ssid->disabled != 2) {
1646		if (ssid == wpa_s->current_ssid)
1647			wpa_supplicant_disassociate(
1648				wpa_s, WLAN_REASON_DEAUTH_LEAVING);
1649
1650		was_disabled = ssid->disabled;
1651
1652		ssid->disabled = 1;
1653
1654		if (was_disabled != ssid->disabled)
1655			wpas_notify_network_enabled_changed(wpa_s, ssid);
1656	}
1657}
1658
1659
1660/**
1661 * wpa_supplicant_select_network - Attempt association with a network
1662 * @wpa_s: wpa_supplicant structure for a network interface
1663 * @ssid: wpa_ssid structure for a configured network or %NULL for any network
1664 */
1665void wpa_supplicant_select_network(struct wpa_supplicant *wpa_s,
1666				   struct wpa_ssid *ssid)
1667{
1668
1669	struct wpa_ssid *other_ssid;
1670
1671	if (ssid && ssid != wpa_s->current_ssid && wpa_s->current_ssid)
1672		wpa_supplicant_disassociate(
1673			wpa_s, WLAN_REASON_DEAUTH_LEAVING);
1674
1675	/*
1676	 * Mark all other networks disabled or mark all networks enabled if no
1677	 * network specified.
1678	 */
1679	for (other_ssid = wpa_s->conf->ssid; other_ssid;
1680	     other_ssid = other_ssid->next) {
1681		int was_disabled = other_ssid->disabled;
1682		if (was_disabled == 2)
1683			continue; /* do not change persistent P2P group data */
1684
1685		other_ssid->disabled = ssid ? (ssid->id != other_ssid->id) : 0;
1686
1687		if (was_disabled != other_ssid->disabled)
1688			wpas_notify_network_enabled_changed(wpa_s, other_ssid);
1689	}
1690
1691	if (ssid && ssid == wpa_s->current_ssid && wpa_s->current_ssid) {
1692		/* We are already associated with the selected network */
1693		wpa_printf(MSG_DEBUG, "Already associated with the "
1694			   "selected network - do nothing");
1695		return;
1696	}
1697
1698	wpa_s->connect_without_scan = NULL;
1699	wpa_s->disconnected = 0;
1700	wpa_s->reassociate = 1;
1701	wpa_supplicant_req_scan(wpa_s, 0, 0);
1702
1703	if (ssid)
1704		wpas_notify_network_selected(wpa_s, ssid);
1705}
1706
1707
1708/**
1709 * wpa_supplicant_set_ap_scan - Set AP scan mode for interface
1710 * @wpa_s: wpa_supplicant structure for a network interface
1711 * @ap_scan: AP scan mode
1712 * Returns: 0 if succeed or -1 if ap_scan has an invalid value
1713 *
1714 */
1715int wpa_supplicant_set_ap_scan(struct wpa_supplicant *wpa_s, int ap_scan)
1716{
1717
1718	int old_ap_scan;
1719
1720	if (ap_scan < 0 || ap_scan > 2)
1721		return -1;
1722
1723#ifdef ANDROID
1724	if (ap_scan == 2 && ap_scan != wpa_s->conf->ap_scan &&
1725	    wpa_s->wpa_state >= WPA_ASSOCIATING &&
1726	    wpa_s->wpa_state < WPA_COMPLETED) {
1727		wpa_printf(MSG_ERROR, "ap_scan = %d (%d) rejected while "
1728			   "associating", wpa_s->conf->ap_scan, ap_scan);
1729		return 0;
1730	}
1731#endif /* ANDROID */
1732
1733	old_ap_scan = wpa_s->conf->ap_scan;
1734	wpa_s->conf->ap_scan = ap_scan;
1735
1736	if (old_ap_scan != wpa_s->conf->ap_scan)
1737		wpas_notify_ap_scan_changed(wpa_s);
1738
1739	return 0;
1740}
1741
1742
1743/**
1744 * wpa_supplicant_set_bss_expiration_age - Set BSS entry expiration age
1745 * @wpa_s: wpa_supplicant structure for a network interface
1746 * @expire_age: Expiration age in seconds
1747 * Returns: 0 if succeed or -1 if expire_age has an invalid value
1748 *
1749 */
1750int wpa_supplicant_set_bss_expiration_age(struct wpa_supplicant *wpa_s,
1751					  unsigned int bss_expire_age)
1752{
1753	if (bss_expire_age < 10) {
1754		wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration age %u",
1755			bss_expire_age);
1756		return -1;
1757	}
1758	wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration age: %d sec",
1759		bss_expire_age);
1760	wpa_s->conf->bss_expiration_age = bss_expire_age;
1761
1762	return 0;
1763}
1764
1765
1766/**
1767 * wpa_supplicant_set_bss_expiration_count - Set BSS entry expiration scan count
1768 * @wpa_s: wpa_supplicant structure for a network interface
1769 * @expire_count: number of scans after which an unseen BSS is reclaimed
1770 * Returns: 0 if succeed or -1 if expire_count has an invalid value
1771 *
1772 */
1773int wpa_supplicant_set_bss_expiration_count(struct wpa_supplicant *wpa_s,
1774					    unsigned int bss_expire_count)
1775{
1776	if (bss_expire_count < 1) {
1777		wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration count %u",
1778			bss_expire_count);
1779		return -1;
1780	}
1781	wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration scan count: %u",
1782		bss_expire_count);
1783	wpa_s->conf->bss_expiration_scan_count = bss_expire_count;
1784
1785	return 0;
1786}
1787
1788
1789/**
1790 * wpa_supplicant_set_debug_params - Set global debug params
1791 * @global: wpa_global structure
1792 * @debug_level: debug level
1793 * @debug_timestamp: determines if show timestamp in debug data
1794 * @debug_show_keys: determines if show keys in debug data
1795 * Returns: 0 if succeed or -1 if debug_level has wrong value
1796 */
1797int wpa_supplicant_set_debug_params(struct wpa_global *global, int debug_level,
1798				    int debug_timestamp, int debug_show_keys)
1799{
1800
1801	int old_level, old_timestamp, old_show_keys;
1802
1803	/* check for allowed debuglevels */
1804	if (debug_level != MSG_EXCESSIVE &&
1805	    debug_level != MSG_MSGDUMP &&
1806	    debug_level != MSG_DEBUG &&
1807	    debug_level != MSG_INFO &&
1808	    debug_level != MSG_WARNING &&
1809	    debug_level != MSG_ERROR)
1810		return -1;
1811
1812	old_level = wpa_debug_level;
1813	old_timestamp = wpa_debug_timestamp;
1814	old_show_keys = wpa_debug_show_keys;
1815
1816	wpa_debug_level = debug_level;
1817	wpa_debug_timestamp = debug_timestamp ? 1 : 0;
1818	wpa_debug_show_keys = debug_show_keys ? 1 : 0;
1819
1820	if (wpa_debug_level != old_level)
1821		wpas_notify_debug_level_changed(global);
1822	if (wpa_debug_timestamp != old_timestamp)
1823		wpas_notify_debug_timestamp_changed(global);
1824	if (wpa_debug_show_keys != old_show_keys)
1825		wpas_notify_debug_show_keys_changed(global);
1826
1827	return 0;
1828}
1829
1830
1831/**
1832 * wpa_supplicant_get_ssid - Get a pointer to the current network structure
1833 * @wpa_s: Pointer to wpa_supplicant data
1834 * Returns: A pointer to the current network structure or %NULL on failure
1835 */
1836struct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s)
1837{
1838	struct wpa_ssid *entry;
1839	u8 ssid[MAX_SSID_LEN];
1840	int res;
1841	size_t ssid_len;
1842	u8 bssid[ETH_ALEN];
1843	int wired;
1844
1845	res = wpa_drv_get_ssid(wpa_s, ssid);
1846	if (res < 0) {
1847		wpa_msg(wpa_s, MSG_WARNING, "Could not read SSID from "
1848			"driver");
1849		return NULL;
1850	}
1851	ssid_len = res;
1852
1853	if (wpa_drv_get_bssid(wpa_s, bssid) < 0) {
1854		wpa_msg(wpa_s, MSG_WARNING, "Could not read BSSID from "
1855			"driver");
1856		return NULL;
1857	}
1858
1859	wired = wpa_s->conf->ap_scan == 0 &&
1860		(wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED);
1861
1862	entry = wpa_s->conf->ssid;
1863	while (entry) {
1864		if (!entry->disabled &&
1865		    ((ssid_len == entry->ssid_len &&
1866		      os_memcmp(ssid, entry->ssid, ssid_len) == 0) || wired) &&
1867		    (!entry->bssid_set ||
1868		     os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
1869			return entry;
1870#ifdef CONFIG_WPS
1871		if (!entry->disabled &&
1872		    (entry->key_mgmt & WPA_KEY_MGMT_WPS) &&
1873		    (entry->ssid == NULL || entry->ssid_len == 0) &&
1874		    (!entry->bssid_set ||
1875		     os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
1876			return entry;
1877#endif /* CONFIG_WPS */
1878
1879		if (!entry->disabled && entry->bssid_set &&
1880		    entry->ssid_len == 0 &&
1881		    os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0)
1882			return entry;
1883
1884		entry = entry->next;
1885	}
1886
1887	return NULL;
1888}
1889
1890
1891static int select_driver(struct wpa_supplicant *wpa_s, int i)
1892{
1893	struct wpa_global *global = wpa_s->global;
1894
1895	if (wpa_drivers[i]->global_init && global->drv_priv[i] == NULL) {
1896		global->drv_priv[i] = wpa_drivers[i]->global_init();
1897		if (global->drv_priv[i] == NULL) {
1898			wpa_printf(MSG_ERROR, "Failed to initialize driver "
1899				   "'%s'", wpa_drivers[i]->name);
1900			return -1;
1901		}
1902	}
1903
1904	wpa_s->driver = wpa_drivers[i];
1905	wpa_s->global_drv_priv = global->drv_priv[i];
1906
1907	return 0;
1908}
1909
1910
1911static int wpa_supplicant_set_driver(struct wpa_supplicant *wpa_s,
1912				     const char *name)
1913{
1914	int i;
1915	size_t len;
1916	const char *pos, *driver = name;
1917
1918	if (wpa_s == NULL)
1919		return -1;
1920
1921	if (wpa_drivers[0] == NULL) {
1922		wpa_msg(wpa_s, MSG_ERROR, "No driver interfaces build into "
1923			"wpa_supplicant");
1924		return -1;
1925	}
1926
1927	if (name == NULL) {
1928		/* default to first driver in the list */
1929		return select_driver(wpa_s, 0);
1930	}
1931
1932	do {
1933		pos = os_strchr(driver, ',');
1934		if (pos)
1935			len = pos - driver;
1936		else
1937			len = os_strlen(driver);
1938
1939		for (i = 0; wpa_drivers[i]; i++) {
1940			if (os_strlen(wpa_drivers[i]->name) == len &&
1941			    os_strncmp(driver, wpa_drivers[i]->name, len) ==
1942			    0)
1943				return select_driver(wpa_s, i);
1944		}
1945
1946		driver = pos + 1;
1947	} while (pos);
1948
1949	wpa_msg(wpa_s, MSG_ERROR, "Unsupported driver '%s'", name);
1950	return -1;
1951}
1952
1953
1954/**
1955 * wpa_supplicant_rx_eapol - Deliver a received EAPOL frame to wpa_supplicant
1956 * @ctx: Context pointer (wpa_s); this is the ctx variable registered
1957 *	with struct wpa_driver_ops::init()
1958 * @src_addr: Source address of the EAPOL frame
1959 * @buf: EAPOL data starting from the EAPOL header (i.e., no Ethernet header)
1960 * @len: Length of the EAPOL data
1961 *
1962 * This function is called for each received EAPOL frame. Most driver
1963 * interfaces rely on more generic OS mechanism for receiving frames through
1964 * l2_packet, but if such a mechanism is not available, the driver wrapper may
1965 * take care of received EAPOL frames and deliver them to the core supplicant
1966 * code by calling this function.
1967 */
1968void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr,
1969			     const u8 *buf, size_t len)
1970{
1971	struct wpa_supplicant *wpa_s = ctx;
1972
1973	wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR, MAC2STR(src_addr));
1974	wpa_hexdump(MSG_MSGDUMP, "RX EAPOL", buf, len);
1975
1976	if (wpa_s->wpa_state < WPA_ASSOCIATED) {
1977		/*
1978		 * There is possible race condition between receiving the
1979		 * association event and the EAPOL frame since they are coming
1980		 * through different paths from the driver. In order to avoid
1981		 * issues in trying to process the EAPOL frame before receiving
1982		 * association information, lets queue it for processing until
1983		 * the association event is received.
1984		 */
1985		wpa_dbg(wpa_s, MSG_DEBUG, "Not associated - Delay processing "
1986			"of received EAPOL frame");
1987		wpabuf_free(wpa_s->pending_eapol_rx);
1988		wpa_s->pending_eapol_rx = wpabuf_alloc_copy(buf, len);
1989		if (wpa_s->pending_eapol_rx) {
1990			os_get_time(&wpa_s->pending_eapol_rx_time);
1991			os_memcpy(wpa_s->pending_eapol_rx_src, src_addr,
1992				  ETH_ALEN);
1993		}
1994		return;
1995	}
1996
1997#ifdef CONFIG_AP
1998	if (wpa_s->ap_iface) {
1999		wpa_supplicant_ap_rx_eapol(wpa_s, src_addr, buf, len);
2000		return;
2001	}
2002#endif /* CONFIG_AP */
2003
2004	if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE) {
2005		wpa_dbg(wpa_s, MSG_DEBUG, "Ignored received EAPOL frame since "
2006			"no key management is configured");
2007		return;
2008	}
2009
2010	if (wpa_s->eapol_received == 0 &&
2011	    (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) ||
2012	     !wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) ||
2013	     wpa_s->wpa_state != WPA_COMPLETED) &&
2014	    (wpa_s->current_ssid == NULL ||
2015	     wpa_s->current_ssid->mode != IEEE80211_MODE_IBSS)) {
2016		/* Timeout for completing IEEE 802.1X and WPA authentication */
2017		wpa_supplicant_req_auth_timeout(
2018			wpa_s,
2019			(wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) ||
2020			 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA ||
2021			 wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) ?
2022			70 : 10, 0);
2023	}
2024	wpa_s->eapol_received++;
2025
2026	if (wpa_s->countermeasures) {
2027		wpa_msg(wpa_s, MSG_INFO, "WPA: Countermeasures - dropped "
2028			"EAPOL packet");
2029		return;
2030	}
2031
2032#ifdef CONFIG_IBSS_RSN
2033	if (wpa_s->current_ssid &&
2034	    wpa_s->current_ssid->mode == WPAS_MODE_IBSS) {
2035		ibss_rsn_rx_eapol(wpa_s->ibss_rsn, src_addr, buf, len);
2036		return;
2037	}
2038#endif /* CONFIG_IBSS_RSN */
2039
2040	/* Source address of the incoming EAPOL frame could be compared to the
2041	 * current BSSID. However, it is possible that a centralized
2042	 * Authenticator could be using another MAC address than the BSSID of
2043	 * an AP, so just allow any address to be used for now. The replies are
2044	 * still sent to the current BSSID (if available), though. */
2045
2046	os_memcpy(wpa_s->last_eapol_src, src_addr, ETH_ALEN);
2047	if (!wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) &&
2048	    eapol_sm_rx_eapol(wpa_s->eapol, src_addr, buf, len) > 0)
2049		return;
2050	wpa_drv_poll(wpa_s);
2051	if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE))
2052		wpa_sm_rx_eapol(wpa_s->wpa, src_addr, buf, len);
2053	else if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt)) {
2054		/*
2055		 * Set portValid = TRUE here since we are going to skip 4-way
2056		 * handshake processing which would normally set portValid. We
2057		 * need this to allow the EAPOL state machines to be completed
2058		 * without going through EAPOL-Key handshake.
2059		 */
2060		eapol_sm_notify_portValid(wpa_s->eapol, TRUE);
2061	}
2062}
2063
2064
2065int wpa_supplicant_update_mac_addr(struct wpa_supplicant *wpa_s)
2066{
2067	if (wpa_s->driver->send_eapol) {
2068		const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
2069		if (addr)
2070			os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
2071	} else if (!(wpa_s->drv_flags &
2072		     WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE)) {
2073		l2_packet_deinit(wpa_s->l2);
2074		wpa_s->l2 = l2_packet_init(wpa_s->ifname,
2075					   wpa_drv_get_mac_addr(wpa_s),
2076					   ETH_P_EAPOL,
2077					   wpa_supplicant_rx_eapol, wpa_s, 0);
2078		if (wpa_s->l2 == NULL)
2079			return -1;
2080	} else {
2081		const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
2082		if (addr)
2083			os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
2084	}
2085
2086	if (wpa_s->l2 && l2_packet_get_own_addr(wpa_s->l2, wpa_s->own_addr)) {
2087		wpa_msg(wpa_s, MSG_ERROR, "Failed to get own L2 address");
2088		return -1;
2089	}
2090
2091	wpa_dbg(wpa_s, MSG_DEBUG, "Own MAC address: " MACSTR,
2092		MAC2STR(wpa_s->own_addr));
2093	wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
2094
2095	return 0;
2096}
2097
2098
2099/**
2100 * wpa_supplicant_driver_init - Initialize driver interface parameters
2101 * @wpa_s: Pointer to wpa_supplicant data
2102 * Returns: 0 on success, -1 on failure
2103 *
2104 * This function is called to initialize driver interface parameters.
2105 * wpa_drv_init() must have been called before this function to initialize the
2106 * driver interface.
2107 */
2108int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s)
2109{
2110	static int interface_count = 0;
2111
2112	if (wpa_supplicant_update_mac_addr(wpa_s) < 0)
2113		return -1;
2114
2115	if (wpa_s->bridge_ifname[0]) {
2116		wpa_dbg(wpa_s, MSG_DEBUG, "Receiving packets from bridge "
2117			"interface '%s'", wpa_s->bridge_ifname);
2118		wpa_s->l2_br = l2_packet_init(wpa_s->bridge_ifname,
2119					      wpa_s->own_addr,
2120					      ETH_P_EAPOL,
2121					      wpa_supplicant_rx_eapol, wpa_s,
2122					      0);
2123		if (wpa_s->l2_br == NULL) {
2124			wpa_msg(wpa_s, MSG_ERROR, "Failed to open l2_packet "
2125				"connection for the bridge interface '%s'",
2126				wpa_s->bridge_ifname);
2127			return -1;
2128		}
2129	}
2130
2131	wpa_clear_keys(wpa_s, NULL);
2132
2133	/* Make sure that TKIP countermeasures are not left enabled (could
2134	 * happen if wpa_supplicant is killed during countermeasures. */
2135	wpa_drv_set_countermeasures(wpa_s, 0);
2136
2137	wpa_dbg(wpa_s, MSG_DEBUG, "RSN: flushing PMKID list in the driver");
2138	wpa_drv_flush_pmkid(wpa_s);
2139
2140	wpa_s->prev_scan_ssid = WILDCARD_SSID_SCAN;
2141	if (wpa_supplicant_enabled_networks(wpa_s->conf)) {
2142		if (wpa_supplicant_delayed_sched_scan(wpa_s, interface_count,
2143						      100000))
2144			wpa_supplicant_req_scan(wpa_s, interface_count,
2145						100000);
2146		interface_count++;
2147	} else
2148		wpa_supplicant_set_state(wpa_s, WPA_INACTIVE);
2149
2150	return 0;
2151}
2152
2153
2154static int wpa_supplicant_daemon(const char *pid_file)
2155{
2156	wpa_printf(MSG_DEBUG, "Daemonize..");
2157	return os_daemonize(pid_file);
2158}
2159
2160
2161static struct wpa_supplicant * wpa_supplicant_alloc(void)
2162{
2163	struct wpa_supplicant *wpa_s;
2164
2165	wpa_s = os_zalloc(sizeof(*wpa_s));
2166	if (wpa_s == NULL)
2167		return NULL;
2168	wpa_s->scan_req = 1;
2169	wpa_s->scan_interval = 5;
2170	wpa_s->new_connection = 1;
2171	wpa_s->parent = wpa_s;
2172	wpa_s->sched_scanning = 0;
2173
2174	return wpa_s;
2175}
2176
2177
2178static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
2179				     struct wpa_interface *iface)
2180{
2181	const char *ifname, *driver;
2182	struct wpa_driver_capa capa;
2183
2184	wpa_printf(MSG_DEBUG, "Initializing interface '%s' conf '%s' driver "
2185		   "'%s' ctrl_interface '%s' bridge '%s'", iface->ifname,
2186		   iface->confname ? iface->confname : "N/A",
2187		   iface->driver ? iface->driver : "default",
2188		   iface->ctrl_interface ? iface->ctrl_interface : "N/A",
2189		   iface->bridge_ifname ? iface->bridge_ifname : "N/A");
2190
2191	if (iface->confname) {
2192#ifdef CONFIG_BACKEND_FILE
2193		wpa_s->confname = os_rel2abs_path(iface->confname);
2194		if (wpa_s->confname == NULL) {
2195			wpa_printf(MSG_ERROR, "Failed to get absolute path "
2196				   "for configuration file '%s'.",
2197				   iface->confname);
2198			return -1;
2199		}
2200		wpa_printf(MSG_DEBUG, "Configuration file '%s' -> '%s'",
2201			   iface->confname, wpa_s->confname);
2202#else /* CONFIG_BACKEND_FILE */
2203		wpa_s->confname = os_strdup(iface->confname);
2204#endif /* CONFIG_BACKEND_FILE */
2205		wpa_s->conf = wpa_config_read(wpa_s->confname);
2206		if (wpa_s->conf == NULL) {
2207			wpa_printf(MSG_ERROR, "Failed to read or parse "
2208				   "configuration '%s'.", wpa_s->confname);
2209			return -1;
2210		}
2211
2212		/*
2213		 * Override ctrl_interface and driver_param if set on command
2214		 * line.
2215		 */
2216		if (iface->ctrl_interface) {
2217			os_free(wpa_s->conf->ctrl_interface);
2218			wpa_s->conf->ctrl_interface =
2219				os_strdup(iface->ctrl_interface);
2220		}
2221
2222		if (iface->driver_param) {
2223			os_free(wpa_s->conf->driver_param);
2224			wpa_s->conf->driver_param =
2225				os_strdup(iface->driver_param);
2226		}
2227	} else
2228		wpa_s->conf = wpa_config_alloc_empty(iface->ctrl_interface,
2229						     iface->driver_param);
2230
2231	if (wpa_s->conf == NULL) {
2232		wpa_printf(MSG_ERROR, "\nNo configuration found.");
2233		return -1;
2234	}
2235
2236	if (iface->ifname == NULL) {
2237		wpa_printf(MSG_ERROR, "\nInterface name is required.");
2238		return -1;
2239	}
2240	if (os_strlen(iface->ifname) >= sizeof(wpa_s->ifname)) {
2241		wpa_printf(MSG_ERROR, "\nToo long interface name '%s'.",
2242			   iface->ifname);
2243		return -1;
2244	}
2245	os_strlcpy(wpa_s->ifname, iface->ifname, sizeof(wpa_s->ifname));
2246
2247	if (iface->bridge_ifname) {
2248		if (os_strlen(iface->bridge_ifname) >=
2249		    sizeof(wpa_s->bridge_ifname)) {
2250			wpa_printf(MSG_ERROR, "\nToo long bridge interface "
2251				   "name '%s'.", iface->bridge_ifname);
2252			return -1;
2253		}
2254		os_strlcpy(wpa_s->bridge_ifname, iface->bridge_ifname,
2255			   sizeof(wpa_s->bridge_ifname));
2256	}
2257
2258	/* RSNA Supplicant Key Management - INITIALIZE */
2259	eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
2260	eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
2261
2262	/* Initialize driver interface and register driver event handler before
2263	 * L2 receive handler so that association events are processed before
2264	 * EAPOL-Key packets if both become available for the same select()
2265	 * call. */
2266	driver = iface->driver;
2267next_driver:
2268	if (wpa_supplicant_set_driver(wpa_s, driver) < 0)
2269		return -1;
2270
2271	wpa_s->drv_priv = wpa_drv_init(wpa_s, wpa_s->ifname);
2272	if (wpa_s->drv_priv == NULL) {
2273		const char *pos;
2274		pos = driver ? os_strchr(driver, ',') : NULL;
2275		if (pos) {
2276			wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize "
2277				"driver interface - try next driver wrapper");
2278			driver = pos + 1;
2279			goto next_driver;
2280		}
2281		wpa_msg(wpa_s, MSG_ERROR, "Failed to initialize driver "
2282			"interface");
2283		return -1;
2284	}
2285	if (wpa_drv_set_param(wpa_s, wpa_s->conf->driver_param) < 0) {
2286		wpa_msg(wpa_s, MSG_ERROR, "Driver interface rejected "
2287			"driver_param '%s'", wpa_s->conf->driver_param);
2288		return -1;
2289	}
2290
2291	ifname = wpa_drv_get_ifname(wpa_s);
2292	if (ifname && os_strcmp(ifname, wpa_s->ifname) != 0) {
2293		wpa_dbg(wpa_s, MSG_DEBUG, "Driver interface replaced "
2294			"interface name with '%s'", ifname);
2295		os_strlcpy(wpa_s->ifname, ifname, sizeof(wpa_s->ifname));
2296	}
2297
2298	if (wpa_supplicant_init_wpa(wpa_s) < 0)
2299		return -1;
2300
2301	wpa_sm_set_ifname(wpa_s->wpa, wpa_s->ifname,
2302			  wpa_s->bridge_ifname[0] ? wpa_s->bridge_ifname :
2303			  NULL);
2304	wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
2305
2306	if (wpa_s->conf->dot11RSNAConfigPMKLifetime &&
2307	    wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_LIFETIME,
2308			     wpa_s->conf->dot11RSNAConfigPMKLifetime)) {
2309		wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
2310			"dot11RSNAConfigPMKLifetime");
2311		return -1;
2312	}
2313
2314	if (wpa_s->conf->dot11RSNAConfigPMKReauthThreshold &&
2315	    wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_REAUTH_THRESHOLD,
2316			     wpa_s->conf->dot11RSNAConfigPMKReauthThreshold)) {
2317		wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
2318			"dot11RSNAConfigPMKReauthThreshold");
2319		return -1;
2320	}
2321
2322	if (wpa_s->conf->dot11RSNAConfigSATimeout &&
2323	    wpa_sm_set_param(wpa_s->wpa, RSNA_SA_TIMEOUT,
2324			     wpa_s->conf->dot11RSNAConfigSATimeout)) {
2325		wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
2326			"dot11RSNAConfigSATimeout");
2327		return -1;
2328	}
2329
2330	wpa_s->hw.modes = wpa_drv_get_hw_feature_data(wpa_s,
2331						      &wpa_s->hw.num_modes,
2332						      &wpa_s->hw.flags);
2333
2334	if (wpa_drv_get_capa(wpa_s, &capa) == 0) {
2335		wpa_s->drv_capa_known = 1;
2336		wpa_s->drv_flags = capa.flags;
2337		wpa_s->probe_resp_offloads = capa.probe_resp_offloads;
2338		wpa_s->max_scan_ssids = capa.max_scan_ssids;
2339		wpa_s->max_sched_scan_ssids = capa.max_sched_scan_ssids;
2340		wpa_s->sched_scan_supported = capa.sched_scan_supported;
2341		wpa_s->max_match_sets = capa.max_match_sets;
2342		wpa_s->max_remain_on_chan = capa.max_remain_on_chan;
2343		wpa_s->max_stations = capa.max_stations;
2344	}
2345	if (wpa_s->max_remain_on_chan == 0)
2346		wpa_s->max_remain_on_chan = 1000;
2347
2348	if (wpa_supplicant_driver_init(wpa_s) < 0)
2349		return -1;
2350
2351#ifdef CONFIG_TDLS
2352	if (wpa_tdls_init(wpa_s->wpa))
2353		return -1;
2354#endif /* CONFIG_TDLS */
2355
2356	if (wpa_s->conf->country[0] && wpa_s->conf->country[1] &&
2357	    wpa_drv_set_country(wpa_s, wpa_s->conf->country)) {
2358		wpa_dbg(wpa_s, MSG_DEBUG, "Failed to set country");
2359		return -1;
2360	}
2361
2362	if (wpas_wps_init(wpa_s))
2363		return -1;
2364
2365	if (wpa_supplicant_init_eapol(wpa_s) < 0)
2366		return -1;
2367	wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
2368
2369	wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
2370	if (wpa_s->ctrl_iface == NULL) {
2371		wpa_printf(MSG_ERROR,
2372			   "Failed to initialize control interface '%s'.\n"
2373			   "You may have another wpa_supplicant process "
2374			   "already running or the file was\n"
2375			   "left by an unclean termination of wpa_supplicant "
2376			   "in which case you will need\n"
2377			   "to manually remove this file before starting "
2378			   "wpa_supplicant again.\n",
2379			   wpa_s->conf->ctrl_interface);
2380		return -1;
2381	}
2382
2383	wpa_s->gas = gas_query_init(wpa_s);
2384	if (wpa_s->gas == NULL) {
2385		wpa_printf(MSG_ERROR, "Failed to initialize GAS query");
2386		return -1;
2387	}
2388
2389#ifdef CONFIG_P2P
2390	if (wpas_p2p_init(wpa_s->global, wpa_s) < 0) {
2391		wpa_msg(wpa_s, MSG_ERROR, "Failed to init P2P");
2392		return -1;
2393	}
2394#endif /* CONFIG_P2P */
2395
2396	if (wpa_bss_init(wpa_s) < 0)
2397		return -1;
2398
2399	return 0;
2400}
2401
2402
2403static void wpa_supplicant_deinit_iface(struct wpa_supplicant *wpa_s,
2404					int notify, int terminate)
2405{
2406	if (wpa_s->drv_priv) {
2407		wpa_supplicant_deauthenticate(wpa_s,
2408					      WLAN_REASON_DEAUTH_LEAVING);
2409
2410		wpa_drv_set_countermeasures(wpa_s, 0);
2411		wpa_clear_keys(wpa_s, NULL);
2412	}
2413
2414	wpa_supplicant_cleanup(wpa_s);
2415
2416	if (wpa_s->drv_priv)
2417		wpa_drv_deinit(wpa_s);
2418
2419	if (notify)
2420		wpas_notify_iface_removed(wpa_s);
2421
2422/**
2423 * The wpa_drv_deinit call after sending TERMINATING to the framework causes
2424 * race condition with the start of hostapd.
2425 * This has been moved out of wpa_supplicant_cleanup(). Send the control
2426 * message and free config after the deinit.
2427 */
2428	if (terminate)
2429		wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TERMINATING);
2430
2431	if (wpa_s->ctrl_iface) {
2432		wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
2433		wpa_s->ctrl_iface = NULL;
2434	}
2435
2436	if (wpa_s->conf != NULL) {
2437		wpa_config_free(wpa_s->conf);
2438		wpa_s->conf = NULL;
2439	}
2440}
2441
2442
2443/**
2444 * wpa_supplicant_add_iface - Add a new network interface
2445 * @global: Pointer to global data from wpa_supplicant_init()
2446 * @iface: Interface configuration options
2447 * Returns: Pointer to the created interface or %NULL on failure
2448 *
2449 * This function is used to add new network interfaces for %wpa_supplicant.
2450 * This can be called before wpa_supplicant_run() to add interfaces before the
2451 * main event loop has been started. In addition, new interfaces can be added
2452 * dynamically while %wpa_supplicant is already running. This could happen,
2453 * e.g., when a hotplug network adapter is inserted.
2454 */
2455struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
2456						 struct wpa_interface *iface)
2457{
2458	struct wpa_supplicant *wpa_s;
2459	struct wpa_interface t_iface;
2460	struct wpa_ssid *ssid;
2461
2462	if (global == NULL || iface == NULL)
2463		return NULL;
2464
2465	wpa_s = wpa_supplicant_alloc();
2466	if (wpa_s == NULL)
2467		return NULL;
2468
2469	wpa_s->global = global;
2470
2471	t_iface = *iface;
2472	if (global->params.override_driver) {
2473		wpa_printf(MSG_DEBUG, "Override interface parameter: driver "
2474			   "('%s' -> '%s')",
2475			   iface->driver, global->params.override_driver);
2476		t_iface.driver = global->params.override_driver;
2477	}
2478	if (global->params.override_ctrl_interface) {
2479		wpa_printf(MSG_DEBUG, "Override interface parameter: "
2480			   "ctrl_interface ('%s' -> '%s')",
2481			   iface->ctrl_interface,
2482			   global->params.override_ctrl_interface);
2483		t_iface.ctrl_interface =
2484			global->params.override_ctrl_interface;
2485	}
2486	if (wpa_supplicant_init_iface(wpa_s, &t_iface)) {
2487		wpa_printf(MSG_DEBUG, "Failed to add interface %s",
2488			   iface->ifname);
2489		wpa_supplicant_deinit_iface(wpa_s, 0, 0);
2490		os_free(wpa_s);
2491		return NULL;
2492	}
2493
2494	/* Notify the control interfaces about new iface */
2495	if (wpas_notify_iface_added(wpa_s)) {
2496		wpa_supplicant_deinit_iface(wpa_s, 1, 0);
2497		os_free(wpa_s);
2498		return NULL;
2499	}
2500
2501	for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
2502		wpas_notify_network_added(wpa_s, ssid);
2503
2504	wpa_s->next = global->ifaces;
2505	global->ifaces = wpa_s;
2506
2507	wpa_dbg(wpa_s, MSG_DEBUG, "Added interface %s", wpa_s->ifname);
2508
2509	return wpa_s;
2510}
2511
2512
2513/**
2514 * wpa_supplicant_remove_iface - Remove a network interface
2515 * @global: Pointer to global data from wpa_supplicant_init()
2516 * @wpa_s: Pointer to the network interface to be removed
2517 * Returns: 0 if interface was removed, -1 if interface was not found
2518 *
2519 * This function can be used to dynamically remove network interfaces from
2520 * %wpa_supplicant, e.g., when a hotplug network adapter is ejected. In
2521 * addition, this function is used to remove all remaining interfaces when
2522 * %wpa_supplicant is terminated.
2523 */
2524int wpa_supplicant_remove_iface(struct wpa_global *global,
2525				struct wpa_supplicant *wpa_s,
2526				int terminate)
2527{
2528	struct wpa_supplicant *prev;
2529
2530	/* Remove interface from the global list of interfaces */
2531	prev = global->ifaces;
2532	if (prev == wpa_s) {
2533		global->ifaces = wpa_s->next;
2534	} else {
2535		while (prev && prev->next != wpa_s)
2536			prev = prev->next;
2537		if (prev == NULL)
2538			return -1;
2539		prev->next = wpa_s->next;
2540	}
2541
2542	wpa_dbg(wpa_s, MSG_DEBUG, "Removing interface %s", wpa_s->ifname);
2543
2544	if (global->p2p_group_formation == wpa_s)
2545		global->p2p_group_formation = NULL;
2546	wpa_supplicant_deinit_iface(wpa_s, 1, terminate);
2547	os_free(wpa_s);
2548
2549	return 0;
2550}
2551
2552
2553/**
2554 * wpa_supplicant_get_eap_mode - Get the current EAP mode
2555 * @wpa_s: Pointer to the network interface
2556 * Returns: Pointer to the eap mode or the string "UNKNOWN" if not found
2557 */
2558const char * wpa_supplicant_get_eap_mode(struct wpa_supplicant *wpa_s)
2559{
2560	const char *eapol_method;
2561
2562        if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) == 0 &&
2563            wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
2564		return "NO-EAP";
2565	}
2566
2567	eapol_method = eapol_sm_get_method_name(wpa_s->eapol);
2568	if (eapol_method == NULL)
2569		return "UNKNOWN-EAP";
2570
2571	return eapol_method;
2572}
2573
2574
2575/**
2576 * wpa_supplicant_get_iface - Get a new network interface
2577 * @global: Pointer to global data from wpa_supplicant_init()
2578 * @ifname: Interface name
2579 * Returns: Pointer to the interface or %NULL if not found
2580 */
2581struct wpa_supplicant * wpa_supplicant_get_iface(struct wpa_global *global,
2582						 const char *ifname)
2583{
2584	struct wpa_supplicant *wpa_s;
2585
2586	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
2587		if (os_strcmp(wpa_s->ifname, ifname) == 0)
2588			return wpa_s;
2589	}
2590	return NULL;
2591}
2592
2593
2594#ifndef CONFIG_NO_WPA_MSG
2595static const char * wpa_supplicant_msg_ifname_cb(void *ctx)
2596{
2597	struct wpa_supplicant *wpa_s = ctx;
2598	if (wpa_s == NULL)
2599		return NULL;
2600	return wpa_s->ifname;
2601}
2602#endif /* CONFIG_NO_WPA_MSG */
2603
2604
2605/**
2606 * wpa_supplicant_init - Initialize %wpa_supplicant
2607 * @params: Parameters for %wpa_supplicant
2608 * Returns: Pointer to global %wpa_supplicant data, or %NULL on failure
2609 *
2610 * This function is used to initialize %wpa_supplicant. After successful
2611 * initialization, the returned data pointer can be used to add and remove
2612 * network interfaces, and eventually, to deinitialize %wpa_supplicant.
2613 */
2614struct wpa_global * wpa_supplicant_init(struct wpa_params *params)
2615{
2616	struct wpa_global *global;
2617	int ret, i;
2618
2619	if (params == NULL)
2620		return NULL;
2621
2622#ifdef CONFIG_DRIVER_NDIS
2623	{
2624		void driver_ndis_init_ops(void);
2625		driver_ndis_init_ops();
2626	}
2627#endif /* CONFIG_DRIVER_NDIS */
2628
2629#ifndef CONFIG_NO_WPA_MSG
2630	wpa_msg_register_ifname_cb(wpa_supplicant_msg_ifname_cb);
2631#endif /* CONFIG_NO_WPA_MSG */
2632
2633	wpa_debug_open_file(params->wpa_debug_file_path);
2634	if (params->wpa_debug_syslog)
2635		wpa_debug_open_syslog();
2636
2637	ret = eap_register_methods();
2638	if (ret) {
2639		wpa_printf(MSG_ERROR, "Failed to register EAP methods");
2640		if (ret == -2)
2641			wpa_printf(MSG_ERROR, "Two or more EAP methods used "
2642				   "the same EAP type.");
2643		return NULL;
2644	}
2645
2646	global = os_zalloc(sizeof(*global));
2647	if (global == NULL)
2648		return NULL;
2649	dl_list_init(&global->p2p_srv_bonjour);
2650	dl_list_init(&global->p2p_srv_upnp);
2651	global->params.daemonize = params->daemonize;
2652	global->params.wait_for_monitor = params->wait_for_monitor;
2653	global->params.dbus_ctrl_interface = params->dbus_ctrl_interface;
2654	if (params->pid_file)
2655		global->params.pid_file = os_strdup(params->pid_file);
2656	if (params->ctrl_interface)
2657		global->params.ctrl_interface =
2658			os_strdup(params->ctrl_interface);
2659	if (params->override_driver)
2660		global->params.override_driver =
2661			os_strdup(params->override_driver);
2662	if (params->override_ctrl_interface)
2663		global->params.override_ctrl_interface =
2664			os_strdup(params->override_ctrl_interface);
2665	wpa_debug_level = global->params.wpa_debug_level =
2666		params->wpa_debug_level;
2667	wpa_debug_show_keys = global->params.wpa_debug_show_keys =
2668		params->wpa_debug_show_keys;
2669	wpa_debug_timestamp = global->params.wpa_debug_timestamp =
2670		params->wpa_debug_timestamp;
2671
2672	wpa_printf(MSG_DEBUG, "wpa_supplicant v" VERSION_STR);
2673
2674	if (eloop_init()) {
2675		wpa_printf(MSG_ERROR, "Failed to initialize event loop");
2676		wpa_supplicant_deinit(global);
2677		return NULL;
2678	}
2679
2680	random_init(params->entropy_file);
2681
2682	global->ctrl_iface = wpa_supplicant_global_ctrl_iface_init(global);
2683	if (global->ctrl_iface == NULL) {
2684		wpa_supplicant_deinit(global);
2685		return NULL;
2686	}
2687
2688	if (wpas_notify_supplicant_initialized(global)) {
2689		wpa_supplicant_deinit(global);
2690		return NULL;
2691	}
2692
2693	for (i = 0; wpa_drivers[i]; i++)
2694		global->drv_count++;
2695	if (global->drv_count == 0) {
2696		wpa_printf(MSG_ERROR, "No drivers enabled");
2697		wpa_supplicant_deinit(global);
2698		return NULL;
2699	}
2700	global->drv_priv = os_zalloc(global->drv_count * sizeof(void *));
2701	if (global->drv_priv == NULL) {
2702		wpa_supplicant_deinit(global);
2703		return NULL;
2704	}
2705
2706	return global;
2707}
2708
2709
2710/**
2711 * wpa_supplicant_run - Run the %wpa_supplicant main event loop
2712 * @global: Pointer to global data from wpa_supplicant_init()
2713 * Returns: 0 after successful event loop run, -1 on failure
2714 *
2715 * This function starts the main event loop and continues running as long as
2716 * there are any remaining events. In most cases, this function is running as
2717 * long as the %wpa_supplicant process in still in use.
2718 */
2719int wpa_supplicant_run(struct wpa_global *global)
2720{
2721	struct wpa_supplicant *wpa_s;
2722
2723	if (global->params.daemonize &&
2724	    wpa_supplicant_daemon(global->params.pid_file))
2725		return -1;
2726
2727	if (global->params.wait_for_monitor) {
2728		for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
2729			if (wpa_s->ctrl_iface)
2730				wpa_supplicant_ctrl_iface_wait(
2731					wpa_s->ctrl_iface);
2732	}
2733
2734	eloop_register_signal_terminate(wpa_supplicant_terminate, global);
2735	eloop_register_signal_reconfig(wpa_supplicant_reconfig, global);
2736
2737	eloop_run();
2738
2739	return 0;
2740}
2741
2742
2743/**
2744 * wpa_supplicant_deinit - Deinitialize %wpa_supplicant
2745 * @global: Pointer to global data from wpa_supplicant_init()
2746 *
2747 * This function is called to deinitialize %wpa_supplicant and to free all
2748 * allocated resources. Remaining network interfaces will also be removed.
2749 */
2750void wpa_supplicant_deinit(struct wpa_global *global)
2751{
2752	int i;
2753
2754	if (global == NULL)
2755		return;
2756
2757#ifdef CONFIG_P2P
2758	wpas_p2p_deinit_global(global);
2759#endif /* CONFIG_P2P */
2760
2761	while (global->ifaces)
2762		wpa_supplicant_remove_iface(global, global->ifaces, 1);
2763
2764	if (global->ctrl_iface)
2765		wpa_supplicant_global_ctrl_iface_deinit(global->ctrl_iface);
2766
2767	wpas_notify_supplicant_deinitialized(global);
2768
2769	eap_peer_unregister_methods();
2770#ifdef CONFIG_AP
2771	eap_server_unregister_methods();
2772#endif /* CONFIG_AP */
2773
2774	for (i = 0; wpa_drivers[i] && global->drv_priv; i++) {
2775		if (!global->drv_priv[i])
2776			continue;
2777		wpa_drivers[i]->global_deinit(global->drv_priv[i]);
2778	}
2779	os_free(global->drv_priv);
2780
2781	random_deinit();
2782
2783	eloop_destroy();
2784
2785	if (global->params.pid_file) {
2786		os_daemonize_terminate(global->params.pid_file);
2787		os_free(global->params.pid_file);
2788	}
2789	os_free(global->params.ctrl_interface);
2790	os_free(global->params.override_driver);
2791	os_free(global->params.override_ctrl_interface);
2792
2793	os_free(global);
2794	wpa_debug_close_syslog();
2795	wpa_debug_close_file();
2796}
2797
2798
2799void wpa_supplicant_update_config(struct wpa_supplicant *wpa_s)
2800{
2801	if ((wpa_s->conf->changed_parameters & CFG_CHANGED_COUNTRY) &&
2802	    wpa_s->conf->country[0] && wpa_s->conf->country[1]) {
2803		char country[3];
2804		country[0] = wpa_s->conf->country[0];
2805		country[1] = wpa_s->conf->country[1];
2806		country[2] = '\0';
2807		if (wpa_drv_set_country(wpa_s, country) < 0) {
2808			wpa_printf(MSG_ERROR, "Failed to set country code "
2809				   "'%s'", country);
2810		}
2811	}
2812
2813#ifdef CONFIG_WPS
2814	wpas_wps_update_config(wpa_s);
2815#endif /* CONFIG_WPS */
2816
2817#ifdef CONFIG_P2P
2818	wpas_p2p_update_config(wpa_s);
2819#endif /* CONFIG_P2P */
2820
2821	wpa_s->conf->changed_parameters = 0;
2822}
2823
2824
2825static void add_freq(int *freqs, int *num_freqs, int freq)
2826{
2827	int i;
2828
2829	for (i = 0; i < *num_freqs; i++) {
2830		if (freqs[i] == freq)
2831			return;
2832	}
2833
2834	freqs[*num_freqs] = freq;
2835	(*num_freqs)++;
2836}
2837
2838
2839static int * get_bss_freqs_in_ess(struct wpa_supplicant *wpa_s)
2840{
2841	struct wpa_bss *bss, *cbss;
2842	const int max_freqs = 10;
2843	int *freqs;
2844	int num_freqs = 0;
2845
2846	freqs = os_zalloc(sizeof(int) * (max_freqs + 1));
2847	if (freqs == NULL)
2848		return NULL;
2849
2850	cbss = wpa_s->current_bss;
2851
2852	dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
2853		if (bss == cbss)
2854			continue;
2855		if (bss->ssid_len == cbss->ssid_len &&
2856		    os_memcmp(bss->ssid, cbss->ssid, bss->ssid_len) == 0 &&
2857		    wpa_blacklist_get(wpa_s, bss->bssid) == NULL) {
2858			add_freq(freqs, &num_freqs, bss->freq);
2859			if (num_freqs == max_freqs)
2860				break;
2861		}
2862	}
2863
2864	if (num_freqs == 0) {
2865		os_free(freqs);
2866		freqs = NULL;
2867	}
2868
2869	return freqs;
2870}
2871
2872
2873void wpas_connection_failed(struct wpa_supplicant *wpa_s, const u8 *bssid)
2874{
2875	int timeout;
2876	int count;
2877	int *freqs = NULL;
2878
2879	/*
2880	 * Add the failed BSSID into the blacklist and speed up next scan
2881	 * attempt if there could be other APs that could accept association.
2882	 * The current blacklist count indicates how many times we have tried
2883	 * connecting to this AP and multiple attempts mean that other APs are
2884	 * either not available or has already been tried, so that we can start
2885	 * increasing the delay here to avoid constant scanning.
2886	 */
2887	count = wpa_blacklist_add(wpa_s, bssid);
2888	if (count == 1 && wpa_s->current_bss) {
2889		/*
2890		 * This BSS was not in the blacklist before. If there is
2891		 * another BSS available for the same ESS, we should try that
2892		 * next. Otherwise, we may as well try this one once more
2893		 * before allowing other, likely worse, ESSes to be considered.
2894		 */
2895		freqs = get_bss_freqs_in_ess(wpa_s);
2896		if (freqs) {
2897			wpa_dbg(wpa_s, MSG_DEBUG, "Another BSS in this ESS "
2898				"has been seen; try it next");
2899			wpa_blacklist_add(wpa_s, bssid);
2900			/*
2901			 * On the next scan, go through only the known channels
2902			 * used in this ESS based on previous scans to speed up
2903			 * common load balancing use case.
2904			 */
2905			os_free(wpa_s->next_scan_freqs);
2906			wpa_s->next_scan_freqs = freqs;
2907		}
2908	}
2909
2910	switch (count) {
2911	case 1:
2912		timeout = 100;
2913		break;
2914	case 2:
2915		timeout = 500;
2916		break;
2917	case 3:
2918		timeout = 1000;
2919		break;
2920	default:
2921		timeout = 5000;
2922	}
2923
2924	/*
2925	 * TODO: if more than one possible AP is available in scan results,
2926	 * could try the other ones before requesting a new scan.
2927	 */
2928	wpa_supplicant_req_scan(wpa_s, timeout / 1000,
2929				1000 * (timeout % 1000));
2930}
2931
2932
2933int wpas_driver_bss_selection(struct wpa_supplicant *wpa_s)
2934{
2935	return wpa_s->conf->ap_scan == 2 ||
2936		(wpa_s->drv_flags & WPA_DRIVER_FLAGS_BSS_SELECTION);
2937}
2938