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