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