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