Do not trigger initial scan if there are no enabled networks
[libeap.git] / wpa_supplicant / wpa_supplicant.c
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
50 const char *wpa_supplicant_version =
51 "wpa_supplicant v" VERSION_STR "\n"
52 "Copyright (c) 2003-2010, Jouni Malinen <j@w1.fi> and contributors";
53
54 const 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. */
68 const 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";
78 const 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";
90 const 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";
98 const 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";
107 const 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
118 extern int wpa_debug_level;
119 extern int wpa_debug_show_keys;
120 extern int wpa_debug_timestamp;
121 extern struct wpa_driver_ops *wpa_drivers[];
122
123 /* Configure default/group WEP keys for static WEP */
124 int 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
143 static 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
192 static 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  */
217 void 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  */
239 void 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  */
254 void 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  */
320 void 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
364 static 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  */
441 void 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  */
485 const 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  */
520 void 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
558 void 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
575 static 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
587 static 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  */
613 int 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
678 static 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
691 enum 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
709 enum 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
737 static 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  */
799 int 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  */
988 void 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  */
1304 void 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 }
1327
1328
1329 /**
1330  * wpa_supplicant_deauthenticate - Deauthenticate the current connection
1331  * @wpa_s: Pointer to wpa_supplicant data
1332  * @reason_code: IEEE 802.11 reason code for the deauthenticate frame
1333  *
1334  * This function is used to request %wpa_supplicant to deauthenticate from the
1335  * current AP.
1336  */
1337 void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
1338                                    int reason_code)
1339 {
1340         struct wpa_ssid *old_ssid;
1341         u8 *addr = NULL;
1342
1343         if (!is_zero_ether_addr(wpa_s->bssid)) {
1344                 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME)
1345                         ieee80211_sta_deauthenticate(wpa_s, reason_code);
1346                 else
1347                         wpa_drv_deauthenticate(wpa_s, wpa_s->bssid,
1348                                                reason_code);
1349                 addr = wpa_s->bssid;
1350         }
1351         wpa_clear_keys(wpa_s, addr);
1352         wpa_supplicant_mark_disassoc(wpa_s);
1353         old_ssid = wpa_s->current_ssid;
1354         wpa_s->current_ssid = NULL;
1355         wpa_s->current_bss = NULL;
1356         wpa_sm_set_config(wpa_s->wpa, NULL);
1357         eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
1358         if (old_ssid != wpa_s->current_ssid)
1359                 wpas_notify_network_changed(wpa_s);
1360 }
1361
1362
1363 /**
1364  * wpa_supplicant_enable_network - Mark a configured network as enabled
1365  * @wpa_s: wpa_supplicant structure for a network interface
1366  * @ssid: wpa_ssid structure for a configured network or %NULL
1367  *
1368  * Enables the specified network or all networks if no network specified.
1369  */
1370 void wpa_supplicant_enable_network(struct wpa_supplicant *wpa_s,
1371                                    struct wpa_ssid *ssid)
1372 {
1373         struct wpa_ssid *other_ssid;
1374         int was_disabled;
1375
1376         if (ssid == NULL) {
1377                 other_ssid = wpa_s->conf->ssid;
1378                 while (other_ssid) {
1379                         if (other_ssid == wpa_s->current_ssid &&
1380                             other_ssid->disabled)
1381                                 wpa_s->reassociate = 1;
1382
1383                         was_disabled = other_ssid->disabled;
1384
1385                         other_ssid->disabled = 0;
1386
1387                         if (was_disabled != other_ssid->disabled)
1388                                 wpas_notify_network_enabled_changed(
1389                                         wpa_s, other_ssid);
1390
1391                         other_ssid = other_ssid->next;
1392                 }
1393                 if (wpa_s->reassociate)
1394                         wpa_supplicant_req_scan(wpa_s, 0, 0);
1395         } else if (wpa_s->current_ssid == NULL && ssid->disabled) {
1396                 /*
1397                  * Try to reassociate since there is no current configuration
1398                  * and a new network was made available.
1399                  */
1400                 wpa_s->reassociate = 1;
1401                 wpa_supplicant_req_scan(wpa_s, 0, 0);
1402
1403                 was_disabled = ssid->disabled;
1404
1405                 ssid->disabled = 0;
1406
1407                 if (was_disabled != ssid->disabled)
1408                         wpas_notify_network_enabled_changed(wpa_s, ssid);
1409         }
1410 }
1411
1412
1413 /**
1414  * wpa_supplicant_disable_network - Mark a configured network as disabled
1415  * @wpa_s: wpa_supplicant structure for a network interface
1416  * @ssid: wpa_ssid structure for a configured network or %NULL
1417  *
1418  * Disables the specified network or all networks if no network specified.
1419  */
1420 void wpa_supplicant_disable_network(struct wpa_supplicant *wpa_s,
1421                                     struct wpa_ssid *ssid)
1422 {
1423         struct wpa_ssid *other_ssid;
1424         int was_disabled;
1425
1426         if (ssid == NULL) {
1427                 other_ssid = wpa_s->conf->ssid;
1428                 while (other_ssid) {
1429                         was_disabled = other_ssid->disabled;
1430
1431                         other_ssid->disabled = 1;
1432
1433                         if (was_disabled != other_ssid->disabled)
1434                                 wpas_notify_network_enabled_changed(
1435                                         wpa_s, other_ssid);
1436
1437                         other_ssid = other_ssid->next;
1438                 }
1439                 if (wpa_s->current_ssid)
1440                         wpa_supplicant_disassociate(
1441                                 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
1442         } else {
1443                 if (ssid == wpa_s->current_ssid)
1444                         wpa_supplicant_disassociate(
1445                                 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
1446
1447                 was_disabled = ssid->disabled;
1448
1449                 ssid->disabled = 1;
1450
1451                 if (was_disabled != ssid->disabled)
1452                         wpas_notify_network_enabled_changed(wpa_s, ssid);
1453         }
1454 }
1455
1456
1457 /**
1458  * wpa_supplicant_select_network - Attempt association with a network
1459  * @wpa_s: wpa_supplicant structure for a network interface
1460  * @ssid: wpa_ssid structure for a configured network or %NULL for any network
1461  */
1462 void wpa_supplicant_select_network(struct wpa_supplicant *wpa_s,
1463                                    struct wpa_ssid *ssid)
1464 {
1465
1466         struct wpa_ssid *other_ssid;
1467
1468         if (ssid && ssid != wpa_s->current_ssid && wpa_s->current_ssid)
1469                 wpa_supplicant_disassociate(
1470                         wpa_s, WLAN_REASON_DEAUTH_LEAVING);
1471
1472         /*
1473          * Mark all other networks disabled or mark all networks enabled if no
1474          * network specified.
1475          */
1476         other_ssid = wpa_s->conf->ssid;
1477         while (other_ssid) {
1478                 int was_disabled = other_ssid->disabled;
1479
1480                 other_ssid->disabled = ssid ? (ssid->id != other_ssid->id) : 0;
1481
1482                 if (was_disabled != other_ssid->disabled)
1483                         wpas_notify_network_enabled_changed(wpa_s, other_ssid);
1484
1485                 other_ssid = other_ssid->next;
1486         }
1487         wpa_s->disconnected = 0;
1488         wpa_s->reassociate = 1;
1489         wpa_supplicant_req_scan(wpa_s, 0, 0);
1490
1491         if (ssid)
1492                 wpas_notify_network_selected(wpa_s, ssid);
1493 }
1494
1495
1496 /**
1497  * wpa_supplicant_set_ap_scan - Set AP scan mode for interface
1498  * @wpa_s: wpa_supplicant structure for a network interface
1499  * @ap_scan: AP scan mode
1500  * Returns: 0 if succeed or -1 if ap_scan has an invalid value
1501  *
1502  */
1503 int wpa_supplicant_set_ap_scan(struct wpa_supplicant *wpa_s, int ap_scan)
1504 {
1505
1506         int old_ap_scan;
1507
1508         if (ap_scan < 0 || ap_scan > 2)
1509                 return -1;
1510
1511         old_ap_scan = wpa_s->conf->ap_scan;
1512         wpa_s->conf->ap_scan = ap_scan;
1513
1514         if (old_ap_scan != wpa_s->conf->ap_scan)
1515                 wpas_notify_ap_scan_changed(wpa_s);
1516
1517         return 0;
1518 }
1519
1520
1521 /**
1522  * wpa_supplicant_set_debug_params - Set global debug params
1523  * @global: wpa_global structure
1524  * @debug_level: debug level
1525  * @debug_timestamp: determines if show timestamp in debug data
1526  * @debug_show_keys: determines if show keys in debug data
1527  * Returns: 0 if succeed or -1 if debug_level has wrong value
1528  */
1529 int wpa_supplicant_set_debug_params(struct wpa_global *global, int debug_level,
1530                                     int debug_timestamp, int debug_show_keys)
1531 {
1532
1533         int old_level, old_timestamp, old_show_keys;
1534
1535         /* check for allowed debuglevels */
1536         if (debug_level != MSG_MSGDUMP &&
1537             debug_level != MSG_DEBUG &&
1538             debug_level != MSG_INFO &&
1539             debug_level != MSG_WARNING &&
1540             debug_level != MSG_ERROR)
1541                 return -1;
1542
1543         old_level = wpa_debug_level;
1544         old_timestamp = wpa_debug_timestamp;
1545         old_show_keys = wpa_debug_show_keys;
1546
1547         wpa_debug_level = debug_level;
1548         wpa_debug_timestamp = debug_timestamp ? 1 : 0;
1549         wpa_debug_show_keys = debug_show_keys ? 1 : 0;
1550
1551         if (wpa_debug_level != old_level)
1552                 wpas_notify_debug_level_changed(global);
1553         if (wpa_debug_timestamp != old_timestamp)
1554                 wpas_notify_debug_timestamp_changed(global);
1555         if (wpa_debug_show_keys != old_show_keys)
1556                 wpas_notify_debug_show_keys_changed(global);
1557
1558         return 0;
1559 }
1560
1561
1562 /**
1563  * wpa_supplicant_get_ssid - Get a pointer to the current network structure
1564  * @wpa_s: Pointer to wpa_supplicant data
1565  * Returns: A pointer to the current network structure or %NULL on failure
1566  */
1567 struct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s)
1568 {
1569         struct wpa_ssid *entry;
1570         u8 ssid[MAX_SSID_LEN];
1571         int res;
1572         size_t ssid_len;
1573         u8 bssid[ETH_ALEN];
1574         int wired;
1575
1576         if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME) {
1577                 if (ieee80211_sta_get_ssid(wpa_s, ssid, &ssid_len)) {
1578                         wpa_printf(MSG_WARNING, "Could not read SSID from "
1579                                    "MLME.");
1580                         return NULL;
1581                 }
1582         } else {
1583                 res = wpa_drv_get_ssid(wpa_s, ssid);
1584                 if (res < 0) {
1585                         wpa_printf(MSG_WARNING, "Could not read SSID from "
1586                                    "driver.");
1587                         return NULL;
1588                 }
1589                 ssid_len = res;
1590         }
1591
1592         if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME)
1593                 os_memcpy(bssid, wpa_s->bssid, ETH_ALEN);
1594         else if (wpa_drv_get_bssid(wpa_s, bssid) < 0) {
1595                 wpa_printf(MSG_WARNING, "Could not read BSSID from driver.");
1596                 return NULL;
1597         }
1598
1599         wired = wpa_s->conf->ap_scan == 0 &&
1600                 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED);
1601
1602         entry = wpa_s->conf->ssid;
1603         while (entry) {
1604                 if (!entry->disabled &&
1605                     ((ssid_len == entry->ssid_len &&
1606                       os_memcmp(ssid, entry->ssid, ssid_len) == 0) || wired) &&
1607                     (!entry->bssid_set ||
1608                      os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
1609                         return entry;
1610 #ifdef CONFIG_WPS
1611                 if (!entry->disabled &&
1612                     (entry->key_mgmt & WPA_KEY_MGMT_WPS) &&
1613                     (entry->ssid == NULL || entry->ssid_len == 0) &&
1614                     (!entry->bssid_set ||
1615                      os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
1616                         return entry;
1617 #endif /* CONFIG_WPS */
1618                 entry = entry->next;
1619         }
1620
1621         return NULL;
1622 }
1623
1624
1625 static int wpa_supplicant_set_driver(struct wpa_supplicant *wpa_s,
1626                                      const char *name)
1627 {
1628         int i;
1629         size_t len;
1630         const char *pos;
1631
1632         if (wpa_s == NULL)
1633                 return -1;
1634
1635         if (wpa_drivers[0] == NULL) {
1636                 wpa_printf(MSG_ERROR, "No driver interfaces build into "
1637                            "wpa_supplicant.");
1638                 return -1;
1639         }
1640
1641         if (name == NULL) {
1642                 /* default to first driver in the list */
1643                 wpa_s->driver = wpa_drivers[0];
1644                 wpa_s->global_drv_priv = wpa_s->global->drv_priv[0];
1645                 return 0;
1646         }
1647
1648         pos = os_strchr(name, ',');
1649         if (pos)
1650                 len = pos - name;
1651         else
1652                 len = os_strlen(name);
1653         for (i = 0; wpa_drivers[i]; i++) {
1654                 if (os_strlen(wpa_drivers[i]->name) == len &&
1655                     os_strncmp(name, wpa_drivers[i]->name, len) ==
1656                     0) {
1657                         wpa_s->driver = wpa_drivers[i];
1658                         wpa_s->global_drv_priv = wpa_s->global->drv_priv[i];
1659                         return 0;
1660                 }
1661         }
1662
1663         wpa_printf(MSG_ERROR, "Unsupported driver '%s'.", name);
1664         return -1;
1665 }
1666
1667
1668 /**
1669  * wpa_supplicant_rx_eapol - Deliver a received EAPOL frame to wpa_supplicant
1670  * @ctx: Context pointer (wpa_s); this is the ctx variable registered
1671  *      with struct wpa_driver_ops::init()
1672  * @src_addr: Source address of the EAPOL frame
1673  * @buf: EAPOL data starting from the EAPOL header (i.e., no Ethernet header)
1674  * @len: Length of the EAPOL data
1675  *
1676  * This function is called for each received EAPOL frame. Most driver
1677  * interfaces rely on more generic OS mechanism for receiving frames through
1678  * l2_packet, but if such a mechanism is not available, the driver wrapper may
1679  * take care of received EAPOL frames and deliver them to the core supplicant
1680  * code by calling this function.
1681  */
1682 void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr,
1683                              const u8 *buf, size_t len)
1684 {
1685         struct wpa_supplicant *wpa_s = ctx;
1686
1687         wpa_printf(MSG_DEBUG, "RX EAPOL from " MACSTR, MAC2STR(src_addr));
1688         wpa_hexdump(MSG_MSGDUMP, "RX EAPOL", buf, len);
1689
1690         if (wpa_s->wpa_state < WPA_ASSOCIATED) {
1691                 /*
1692                  * There is possible race condition between receiving the
1693                  * association event and the EAPOL frame since they are coming
1694                  * through different paths from the driver. In order to avoid
1695                  * issues in trying to process the EAPOL frame before receiving
1696                  * association information, lets queue it for processing until
1697                  * the association event is received.
1698                  */
1699                 wpa_printf(MSG_DEBUG, "Not associated - Delay processing of "
1700                            "received EAPOL frame");
1701                 wpabuf_free(wpa_s->pending_eapol_rx);
1702                 wpa_s->pending_eapol_rx = wpabuf_alloc_copy(buf, len);
1703                 if (wpa_s->pending_eapol_rx) {
1704                         os_get_time(&wpa_s->pending_eapol_rx_time);
1705                         os_memcpy(wpa_s->pending_eapol_rx_src, src_addr,
1706                                   ETH_ALEN);
1707                 }
1708                 return;
1709         }
1710
1711 #ifdef CONFIG_AP
1712         if (wpa_s->ap_iface) {
1713                 wpa_supplicant_ap_rx_eapol(wpa_s, src_addr, buf, len);
1714                 return;
1715         }
1716 #endif /* CONFIG_AP */
1717
1718         if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE) {
1719                 wpa_printf(MSG_DEBUG, "Ignored received EAPOL frame since "
1720                            "no key management is configured");
1721                 return;
1722         }
1723
1724         if (wpa_s->eapol_received == 0 &&
1725             (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) ||
1726              !wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) ||
1727              wpa_s->wpa_state != WPA_COMPLETED) &&
1728             (wpa_s->current_ssid == NULL ||
1729              wpa_s->current_ssid->mode != IEEE80211_MODE_IBSS)) {
1730                 /* Timeout for completing IEEE 802.1X and WPA authentication */
1731                 wpa_supplicant_req_auth_timeout(
1732                         wpa_s,
1733                         (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) ||
1734                          wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA ||
1735                          wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) ?
1736                         70 : 10, 0);
1737         }
1738         wpa_s->eapol_received++;
1739
1740         if (wpa_s->countermeasures) {
1741                 wpa_printf(MSG_INFO, "WPA: Countermeasures - dropped EAPOL "
1742                            "packet");
1743                 return;
1744         }
1745
1746 #ifdef CONFIG_IBSS_RSN
1747         if (wpa_s->current_ssid &&
1748             wpa_s->current_ssid->mode == WPAS_MODE_IBSS) {
1749                 ibss_rsn_rx_eapol(wpa_s->ibss_rsn, src_addr, buf, len);
1750                 return;
1751         }
1752 #endif /* CONFIG_IBSS_RSN */
1753
1754         /* Source address of the incoming EAPOL frame could be compared to the
1755          * current BSSID. However, it is possible that a centralized
1756          * Authenticator could be using another MAC address than the BSSID of
1757          * an AP, so just allow any address to be used for now. The replies are
1758          * still sent to the current BSSID (if available), though. */
1759
1760         os_memcpy(wpa_s->last_eapol_src, src_addr, ETH_ALEN);
1761         if (!wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) &&
1762             eapol_sm_rx_eapol(wpa_s->eapol, src_addr, buf, len) > 0)
1763                 return;
1764         wpa_drv_poll(wpa_s);
1765         if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE))
1766                 wpa_sm_rx_eapol(wpa_s->wpa, src_addr, buf, len);
1767         else if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt)) {
1768                 /*
1769                  * Set portValid = TRUE here since we are going to skip 4-way
1770                  * handshake processing which would normally set portValid. We
1771                  * need this to allow the EAPOL state machines to be completed
1772                  * without going through EAPOL-Key handshake.
1773                  */
1774                 eapol_sm_notify_portValid(wpa_s->eapol, TRUE);
1775         }
1776 }
1777
1778
1779 /**
1780  * wpa_supplicant_driver_init - Initialize driver interface parameters
1781  * @wpa_s: Pointer to wpa_supplicant data
1782  * Returns: 0 on success, -1 on failure
1783  *
1784  * This function is called to initialize driver interface parameters.
1785  * wpa_drv_init() must have been called before this function to initialize the
1786  * driver interface.
1787  */
1788 int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s)
1789 {
1790         static int interface_count = 0;
1791
1792         if (wpa_s->driver->send_eapol) {
1793                 const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
1794                 if (addr)
1795                         os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
1796         } else {
1797                 wpa_s->l2 = l2_packet_init(wpa_s->ifname,
1798                                            wpa_drv_get_mac_addr(wpa_s),
1799                                            ETH_P_EAPOL,
1800                                            wpa_supplicant_rx_eapol, wpa_s, 0);
1801                 if (wpa_s->l2 == NULL)
1802                         return -1;
1803         }
1804
1805         if (wpa_s->l2 && l2_packet_get_own_addr(wpa_s->l2, wpa_s->own_addr)) {
1806                 wpa_printf(MSG_ERROR, "Failed to get own L2 address");
1807                 return -1;
1808         }
1809
1810         wpa_printf(MSG_DEBUG, "Own MAC address: " MACSTR,
1811                    MAC2STR(wpa_s->own_addr));
1812
1813         if (wpa_s->bridge_ifname[0]) {
1814                 wpa_printf(MSG_DEBUG, "Receiving packets from bridge interface"
1815                            " '%s'", wpa_s->bridge_ifname);
1816                 wpa_s->l2_br = l2_packet_init(wpa_s->bridge_ifname,
1817                                               wpa_s->own_addr,
1818                                               ETH_P_EAPOL,
1819                                               wpa_supplicant_rx_eapol, wpa_s,
1820                                               0);
1821                 if (wpa_s->l2_br == NULL) {
1822                         wpa_printf(MSG_ERROR, "Failed to open l2_packet "
1823                                    "connection for the bridge interface '%s'",
1824                                    wpa_s->bridge_ifname);
1825                         return -1;
1826                 }
1827         }
1828
1829         wpa_clear_keys(wpa_s, NULL);
1830
1831         /* Make sure that TKIP countermeasures are not left enabled (could
1832          * happen if wpa_supplicant is killed during countermeasures. */
1833         wpa_drv_set_countermeasures(wpa_s, 0);
1834
1835         wpa_printf(MSG_DEBUG, "RSN: flushing PMKID list in the driver");
1836         wpa_drv_flush_pmkid(wpa_s);
1837
1838         wpa_s->prev_scan_ssid = WILDCARD_SSID_SCAN;
1839         if (wpa_supplicant_enabled_networks(wpa_s->conf)) {
1840                 wpa_supplicant_req_scan(wpa_s, interface_count, 100000);
1841                 interface_count++;
1842         } else
1843                 wpa_supplicant_set_state(wpa_s, WPA_INACTIVE);
1844
1845         return 0;
1846 }
1847
1848
1849 static int wpa_supplicant_daemon(const char *pid_file)
1850 {
1851         wpa_printf(MSG_DEBUG, "Daemonize..");
1852         return os_daemonize(pid_file);
1853 }
1854
1855
1856 static struct wpa_supplicant * wpa_supplicant_alloc(void)
1857 {
1858         struct wpa_supplicant *wpa_s;
1859
1860         wpa_s = os_zalloc(sizeof(*wpa_s));
1861         if (wpa_s == NULL)
1862                 return NULL;
1863         wpa_s->scan_req = 1;
1864         wpa_s->new_connection = 1;
1865
1866         return wpa_s;
1867 }
1868
1869
1870 static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
1871                                      struct wpa_interface *iface)
1872 {
1873         const char *ifname, *driver;
1874         struct wpa_driver_capa capa;
1875
1876         wpa_printf(MSG_DEBUG, "Initializing interface '%s' conf '%s' driver "
1877                    "'%s' ctrl_interface '%s' bridge '%s'", iface->ifname,
1878                    iface->confname ? iface->confname : "N/A",
1879                    iface->driver ? iface->driver : "default",
1880                    iface->ctrl_interface ? iface->ctrl_interface : "N/A",
1881                    iface->bridge_ifname ? iface->bridge_ifname : "N/A");
1882
1883         if (iface->confname) {
1884 #ifdef CONFIG_BACKEND_FILE
1885                 wpa_s->confname = os_rel2abs_path(iface->confname);
1886                 if (wpa_s->confname == NULL) {
1887                         wpa_printf(MSG_ERROR, "Failed to get absolute path "
1888                                    "for configuration file '%s'.",
1889                                    iface->confname);
1890                         return -1;
1891                 }
1892                 wpa_printf(MSG_DEBUG, "Configuration file '%s' -> '%s'",
1893                            iface->confname, wpa_s->confname);
1894 #else /* CONFIG_BACKEND_FILE */
1895                 wpa_s->confname = os_strdup(iface->confname);
1896 #endif /* CONFIG_BACKEND_FILE */
1897                 wpa_s->conf = wpa_config_read(wpa_s->confname);
1898                 if (wpa_s->conf == NULL) {
1899                         wpa_printf(MSG_ERROR, "Failed to read or parse "
1900                                    "configuration '%s'.", wpa_s->confname);
1901                         return -1;
1902                 }
1903
1904                 /*
1905                  * Override ctrl_interface and driver_param if set on command
1906                  * line.
1907                  */
1908                 if (iface->ctrl_interface) {
1909                         os_free(wpa_s->conf->ctrl_interface);
1910                         wpa_s->conf->ctrl_interface =
1911                                 os_strdup(iface->ctrl_interface);
1912                 }
1913
1914                 if (iface->driver_param) {
1915                         os_free(wpa_s->conf->driver_param);
1916                         wpa_s->conf->driver_param =
1917                                 os_strdup(iface->driver_param);
1918                 }
1919         } else
1920                 wpa_s->conf = wpa_config_alloc_empty(iface->ctrl_interface,
1921                                                      iface->driver_param);
1922
1923         if (wpa_s->conf == NULL) {
1924                 wpa_printf(MSG_ERROR, "\nNo configuration found.");
1925                 return -1;
1926         }
1927
1928         if (iface->ifname == NULL) {
1929                 wpa_printf(MSG_ERROR, "\nInterface name is required.");
1930                 return -1;
1931         }
1932         if (os_strlen(iface->ifname) >= sizeof(wpa_s->ifname)) {
1933                 wpa_printf(MSG_ERROR, "\nToo long interface name '%s'.",
1934                            iface->ifname);
1935                 return -1;
1936         }
1937         os_strlcpy(wpa_s->ifname, iface->ifname, sizeof(wpa_s->ifname));
1938
1939         if (iface->bridge_ifname) {
1940                 if (os_strlen(iface->bridge_ifname) >=
1941                     sizeof(wpa_s->bridge_ifname)) {
1942                         wpa_printf(MSG_ERROR, "\nToo long bridge interface "
1943                                    "name '%s'.", iface->bridge_ifname);
1944                         return -1;
1945                 }
1946                 os_strlcpy(wpa_s->bridge_ifname, iface->bridge_ifname,
1947                            sizeof(wpa_s->bridge_ifname));
1948         }
1949
1950         /* RSNA Supplicant Key Management - INITIALIZE */
1951         eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
1952         eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
1953
1954         /* Initialize driver interface and register driver event handler before
1955          * L2 receive handler so that association events are processed before
1956          * EAPOL-Key packets if both become available for the same select()
1957          * call. */
1958         driver = iface->driver;
1959 next_driver:
1960         if (wpa_supplicant_set_driver(wpa_s, driver) < 0)
1961                 return -1;
1962
1963         wpa_s->drv_priv = wpa_drv_init(wpa_s, wpa_s->ifname);
1964         if (wpa_s->drv_priv == NULL) {
1965                 const char *pos;
1966                 pos = driver ? os_strchr(driver, ',') : NULL;
1967                 if (pos) {
1968                         wpa_printf(MSG_DEBUG, "Failed to initialize driver "
1969                                    "interface - try next driver wrapper");
1970                         driver = pos + 1;
1971                         goto next_driver;
1972                 }
1973                 wpa_printf(MSG_ERROR, "Failed to initialize driver interface");
1974                 return -1;
1975         }
1976         if (wpa_drv_set_param(wpa_s, wpa_s->conf->driver_param) < 0) {
1977                 wpa_printf(MSG_ERROR, "Driver interface rejected "
1978                            "driver_param '%s'", wpa_s->conf->driver_param);
1979                 return -1;
1980         }
1981
1982         ifname = wpa_drv_get_ifname(wpa_s);
1983         if (ifname && os_strcmp(ifname, wpa_s->ifname) != 0) {
1984                 wpa_printf(MSG_DEBUG, "Driver interface replaced interface "
1985                            "name with '%s'", ifname);
1986                 os_strlcpy(wpa_s->ifname, ifname, sizeof(wpa_s->ifname));
1987         }
1988
1989         if (wpa_supplicant_init_wpa(wpa_s) < 0)
1990                 return -1;
1991
1992         wpa_sm_set_ifname(wpa_s->wpa, wpa_s->ifname,
1993                           wpa_s->bridge_ifname[0] ? wpa_s->bridge_ifname :
1994                           NULL);
1995         wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
1996
1997         if (wpa_s->conf->dot11RSNAConfigPMKLifetime &&
1998             wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_LIFETIME,
1999                              wpa_s->conf->dot11RSNAConfigPMKLifetime)) {
2000                 wpa_printf(MSG_ERROR, "Invalid WPA parameter value for "
2001                            "dot11RSNAConfigPMKLifetime");
2002                 return -1;
2003         }
2004
2005         if (wpa_s->conf->dot11RSNAConfigPMKReauthThreshold &&
2006             wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_REAUTH_THRESHOLD,
2007                              wpa_s->conf->dot11RSNAConfigPMKReauthThreshold)) {
2008                 wpa_printf(MSG_ERROR, "Invalid WPA parameter value for "
2009                         "dot11RSNAConfigPMKReauthThreshold");
2010                 return -1;
2011         }
2012
2013         if (wpa_s->conf->dot11RSNAConfigSATimeout &&
2014             wpa_sm_set_param(wpa_s->wpa, RSNA_SA_TIMEOUT,
2015                              wpa_s->conf->dot11RSNAConfigSATimeout)) {
2016                 wpa_printf(MSG_ERROR, "Invalid WPA parameter value for "
2017                            "dot11RSNAConfigSATimeout");
2018                 return -1;
2019         }
2020
2021         if (wpa_drv_get_capa(wpa_s, &capa) == 0) {
2022                 wpa_s->drv_flags = capa.flags;
2023                 if (capa.flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME) {
2024                         if (ieee80211_sta_init(wpa_s))
2025                                 return -1;
2026                 }
2027                 wpa_s->max_scan_ssids = capa.max_scan_ssids;
2028                 wpa_s->max_remain_on_chan = capa.max_remain_on_chan;
2029         }
2030         if (wpa_s->max_remain_on_chan == 0)
2031                 wpa_s->max_remain_on_chan = 1000;
2032
2033         if (wpa_supplicant_driver_init(wpa_s) < 0)
2034                 return -1;
2035
2036         if (wpa_s->conf->country[0] && wpa_s->conf->country[1] &&
2037             wpa_drv_set_country(wpa_s, wpa_s->conf->country)) {
2038                 wpa_printf(MSG_DEBUG, "Failed to set country");
2039                 return -1;
2040         }
2041
2042         wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
2043
2044         if (wpas_wps_init(wpa_s))
2045                 return -1;
2046
2047         if (wpa_supplicant_init_eapol(wpa_s) < 0)
2048                 return -1;
2049         wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
2050
2051         wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
2052         if (wpa_s->ctrl_iface == NULL) {
2053                 wpa_printf(MSG_ERROR,
2054                            "Failed to initialize control interface '%s'.\n"
2055                            "You may have another wpa_supplicant process "
2056                            "already running or the file was\n"
2057                            "left by an unclean termination of wpa_supplicant "
2058                            "in which case you will need\n"
2059                            "to manually remove this file before starting "
2060                            "wpa_supplicant again.\n",
2061                            wpa_s->conf->ctrl_interface);
2062                 return -1;
2063         }
2064
2065 #ifdef CONFIG_IBSS_RSN
2066         wpa_s->ibss_rsn = ibss_rsn_init(wpa_s);
2067         if (!wpa_s->ibss_rsn) {
2068                 wpa_printf(MSG_DEBUG, "Failed to init IBSS RSN");
2069                 return -1;
2070         }
2071 #endif /* CONFIG_IBSS_RSN */
2072
2073         if (wpa_bss_init(wpa_s) < 0)
2074                 return -1;
2075
2076         return 0;
2077 }
2078
2079
2080 static void wpa_supplicant_deinit_iface(struct wpa_supplicant *wpa_s,
2081                                         int notify)
2082 {
2083         if (wpa_s->drv_priv) {
2084                 wpa_supplicant_deauthenticate(wpa_s,
2085                                               WLAN_REASON_DEAUTH_LEAVING);
2086
2087                 wpa_drv_set_countermeasures(wpa_s, 0);
2088                 wpa_clear_keys(wpa_s, NULL);
2089         }
2090
2091         wpa_supplicant_cleanup(wpa_s);
2092
2093         if (notify)
2094                 wpas_notify_iface_removed(wpa_s);
2095
2096         if (wpa_s->drv_priv)
2097                 wpa_drv_deinit(wpa_s);
2098 }
2099
2100
2101 /**
2102  * wpa_supplicant_add_iface - Add a new network interface
2103  * @global: Pointer to global data from wpa_supplicant_init()
2104  * @iface: Interface configuration options
2105  * Returns: Pointer to the created interface or %NULL on failure
2106  *
2107  * This function is used to add new network interfaces for %wpa_supplicant.
2108  * This can be called before wpa_supplicant_run() to add interfaces before the
2109  * main event loop has been started. In addition, new interfaces can be added
2110  * dynamically while %wpa_supplicant is already running. This could happen,
2111  * e.g., when a hotplug network adapter is inserted.
2112  */
2113 struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
2114                                                  struct wpa_interface *iface)
2115 {
2116         struct wpa_supplicant *wpa_s;
2117         struct wpa_interface t_iface;
2118         struct wpa_ssid *ssid;
2119
2120         if (global == NULL || iface == NULL)
2121                 return NULL;
2122
2123         wpa_s = wpa_supplicant_alloc();
2124         if (wpa_s == NULL)
2125                 return NULL;
2126
2127         wpa_s->global = global;
2128
2129         t_iface = *iface;
2130         if (global->params.override_driver) {
2131                 wpa_printf(MSG_DEBUG, "Override interface parameter: driver "
2132                            "('%s' -> '%s')",
2133                            iface->driver, global->params.override_driver);
2134                 t_iface.driver = global->params.override_driver;
2135         }
2136         if (global->params.override_ctrl_interface) {
2137                 wpa_printf(MSG_DEBUG, "Override interface parameter: "
2138                            "ctrl_interface ('%s' -> '%s')",
2139                            iface->ctrl_interface,
2140                            global->params.override_ctrl_interface);
2141                 t_iface.ctrl_interface =
2142                         global->params.override_ctrl_interface;
2143         }
2144         if (wpa_supplicant_init_iface(wpa_s, &t_iface)) {
2145                 wpa_printf(MSG_DEBUG, "Failed to add interface %s",
2146                            iface->ifname);
2147                 wpa_supplicant_deinit_iface(wpa_s, 0);
2148                 os_free(wpa_s);
2149                 return NULL;
2150         }
2151
2152         /* Notify the control interfaces about new iface */
2153         if (wpas_notify_iface_added(wpa_s)) {
2154                 wpa_supplicant_deinit_iface(wpa_s, 1);
2155                 os_free(wpa_s);
2156                 return NULL;
2157         }
2158
2159         for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
2160                 wpas_notify_network_added(wpa_s, ssid);
2161
2162         wpa_s->next = global->ifaces;
2163         global->ifaces = wpa_s;
2164
2165         wpa_printf(MSG_DEBUG, "Added interface %s", wpa_s->ifname);
2166
2167         return wpa_s;
2168 }
2169
2170
2171 /**
2172  * wpa_supplicant_remove_iface - Remove a network interface
2173  * @global: Pointer to global data from wpa_supplicant_init()
2174  * @wpa_s: Pointer to the network interface to be removed
2175  * Returns: 0 if interface was removed, -1 if interface was not found
2176  *
2177  * This function can be used to dynamically remove network interfaces from
2178  * %wpa_supplicant, e.g., when a hotplug network adapter is ejected. In
2179  * addition, this function is used to remove all remaining interfaces when
2180  * %wpa_supplicant is terminated.
2181  */
2182 int wpa_supplicant_remove_iface(struct wpa_global *global,
2183                                 struct wpa_supplicant *wpa_s)
2184 {
2185         struct wpa_supplicant *prev;
2186
2187         /* Remove interface from the global list of interfaces */
2188         prev = global->ifaces;
2189         if (prev == wpa_s) {
2190                 global->ifaces = wpa_s->next;
2191         } else {
2192                 while (prev && prev->next != wpa_s)
2193                         prev = prev->next;
2194                 if (prev == NULL)
2195                         return -1;
2196                 prev->next = wpa_s->next;
2197         }
2198
2199         wpa_printf(MSG_DEBUG, "Removing interface %s", wpa_s->ifname);
2200
2201         wpa_supplicant_deinit_iface(wpa_s, 1);
2202         os_free(wpa_s);
2203
2204         return 0;
2205 }
2206
2207
2208 /**
2209  * wpa_supplicant_get_iface - Get a new network interface
2210  * @global: Pointer to global data from wpa_supplicant_init()
2211  * @ifname: Interface name
2212  * Returns: Pointer to the interface or %NULL if not found
2213  */
2214 struct wpa_supplicant * wpa_supplicant_get_iface(struct wpa_global *global,
2215                                                  const char *ifname)
2216 {
2217         struct wpa_supplicant *wpa_s;
2218
2219         for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
2220                 if (os_strcmp(wpa_s->ifname, ifname) == 0)
2221                         return wpa_s;
2222         }
2223         return NULL;
2224 }
2225
2226
2227 /**
2228  * wpa_supplicant_init - Initialize %wpa_supplicant
2229  * @params: Parameters for %wpa_supplicant
2230  * Returns: Pointer to global %wpa_supplicant data, or %NULL on failure
2231  *
2232  * This function is used to initialize %wpa_supplicant. After successful
2233  * initialization, the returned data pointer can be used to add and remove
2234  * network interfaces, and eventually, to deinitialize %wpa_supplicant.
2235  */
2236 struct wpa_global * wpa_supplicant_init(struct wpa_params *params)
2237 {
2238         struct wpa_global *global;
2239         int ret, i;
2240
2241         if (params == NULL)
2242                 return NULL;
2243
2244         wpa_debug_open_file(params->wpa_debug_file_path);
2245         if (params->wpa_debug_syslog)
2246                 wpa_debug_open_syslog();
2247
2248         ret = eap_register_methods();
2249         if (ret) {
2250                 wpa_printf(MSG_ERROR, "Failed to register EAP methods");
2251                 if (ret == -2)
2252                         wpa_printf(MSG_ERROR, "Two or more EAP methods used "
2253                                    "the same EAP type.");
2254                 return NULL;
2255         }
2256
2257         global = os_zalloc(sizeof(*global));
2258         if (global == NULL)
2259                 return NULL;
2260         global->params.daemonize = params->daemonize;
2261         global->params.wait_for_monitor = params->wait_for_monitor;
2262         global->params.dbus_ctrl_interface = params->dbus_ctrl_interface;
2263         if (params->pid_file)
2264                 global->params.pid_file = os_strdup(params->pid_file);
2265         if (params->ctrl_interface)
2266                 global->params.ctrl_interface =
2267                         os_strdup(params->ctrl_interface);
2268         if (params->override_driver)
2269                 global->params.override_driver =
2270                         os_strdup(params->override_driver);
2271         if (params->override_ctrl_interface)
2272                 global->params.override_ctrl_interface =
2273                         os_strdup(params->override_ctrl_interface);
2274         wpa_debug_level = global->params.wpa_debug_level =
2275                 params->wpa_debug_level;
2276         wpa_debug_show_keys = global->params.wpa_debug_show_keys =
2277                 params->wpa_debug_show_keys;
2278         wpa_debug_timestamp = global->params.wpa_debug_timestamp =
2279                 params->wpa_debug_timestamp;
2280
2281         if (eloop_init()) {
2282                 wpa_printf(MSG_ERROR, "Failed to initialize event loop");
2283                 wpa_supplicant_deinit(global);
2284                 return NULL;
2285         }
2286
2287         global->ctrl_iface = wpa_supplicant_global_ctrl_iface_init(global);
2288         if (global->ctrl_iface == NULL) {
2289                 wpa_supplicant_deinit(global);
2290                 return NULL;
2291         }
2292
2293         if (wpas_notify_supplicant_initialized(global)) {
2294                 wpa_supplicant_deinit(global);
2295                 return NULL;
2296         }
2297
2298         for (i = 0; wpa_drivers[i]; i++)
2299                 global->drv_count++;
2300         if (global->drv_count == 0) {
2301                 wpa_printf(MSG_ERROR, "No drivers enabled");
2302                 wpa_supplicant_deinit(global);
2303                 return NULL;
2304         }
2305         global->drv_priv = os_zalloc(global->drv_count * sizeof(void *));
2306         if (global->drv_priv == NULL) {
2307                 wpa_supplicant_deinit(global);
2308                 return NULL;
2309         }
2310         for (i = 0; wpa_drivers[i]; i++) {
2311                 if (!wpa_drivers[i]->global_init)
2312                         continue;
2313                 global->drv_priv[i] = wpa_drivers[i]->global_init();
2314                 if (global->drv_priv[i] == NULL) {
2315                         wpa_printf(MSG_ERROR, "Failed to initialize driver "
2316                                    "'%s'", wpa_drivers[i]->name);
2317                         wpa_supplicant_deinit(global);
2318                         return NULL;
2319                 }
2320         }
2321
2322         return global;
2323 }
2324
2325
2326 /**
2327  * wpa_supplicant_run - Run the %wpa_supplicant main event loop
2328  * @global: Pointer to global data from wpa_supplicant_init()
2329  * Returns: 0 after successful event loop run, -1 on failure
2330  *
2331  * This function starts the main event loop and continues running as long as
2332  * there are any remaining events. In most cases, this function is running as
2333  * long as the %wpa_supplicant process in still in use.
2334  */
2335 int wpa_supplicant_run(struct wpa_global *global)
2336 {
2337         struct wpa_supplicant *wpa_s;
2338
2339         if (global->params.daemonize &&
2340             wpa_supplicant_daemon(global->params.pid_file))
2341                 return -1;
2342
2343         if (global->params.wait_for_monitor) {
2344                 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
2345                         if (wpa_s->ctrl_iface)
2346                                 wpa_supplicant_ctrl_iface_wait(
2347                                         wpa_s->ctrl_iface);
2348         }
2349
2350         eloop_register_signal_terminate(wpa_supplicant_terminate, global);
2351         eloop_register_signal_reconfig(wpa_supplicant_reconfig, global);
2352
2353         eloop_run();
2354
2355         return 0;
2356 }
2357
2358
2359 /**
2360  * wpa_supplicant_deinit - Deinitialize %wpa_supplicant
2361  * @global: Pointer to global data from wpa_supplicant_init()
2362  *
2363  * This function is called to deinitialize %wpa_supplicant and to free all
2364  * allocated resources. Remaining network interfaces will also be removed.
2365  */
2366 void wpa_supplicant_deinit(struct wpa_global *global)
2367 {
2368         int i;
2369
2370         if (global == NULL)
2371                 return;
2372
2373         while (global->ifaces)
2374                 wpa_supplicant_remove_iface(global, global->ifaces);
2375
2376         if (global->ctrl_iface)
2377                 wpa_supplicant_global_ctrl_iface_deinit(global->ctrl_iface);
2378
2379         wpas_notify_supplicant_deinitialized(global);
2380
2381         eap_peer_unregister_methods();
2382 #ifdef CONFIG_AP
2383         eap_server_unregister_methods();
2384 #endif /* CONFIG_AP */
2385
2386         for (i = 0; wpa_drivers[i] && global->drv_priv; i++) {
2387                 if (!global->drv_priv[i])
2388                         continue;
2389                 wpa_drivers[i]->global_deinit(global->drv_priv[i]);
2390         }
2391         os_free(global->drv_priv);
2392
2393         eloop_destroy();
2394
2395         if (global->params.pid_file) {
2396                 os_daemonize_terminate(global->params.pid_file);
2397                 os_free(global->params.pid_file);
2398         }
2399         os_free(global->params.ctrl_interface);
2400         os_free(global->params.override_driver);
2401         os_free(global->params.override_ctrl_interface);
2402
2403         os_free(global);
2404         wpa_debug_close_syslog();
2405         wpa_debug_close_file();
2406 }