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