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