]> git.ipfire.org Git - thirdparty/hostap.git/blob - wpa_supplicant/wpa_supplicant.c
wpa_supplicant: Add option -I for additional config file
[thirdparty/hostap.git] / wpa_supplicant / wpa_supplicant.c
1 /*
2 * WPA Supplicant
3 * Copyright (c) 2003-2012, Jouni Malinen <j@w1.fi>
4 *
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
7 *
8 * This file implements functions for registering and unregistering
9 * %wpa_supplicant interfaces. In addition, this file contains number of
10 * functions for managing network connections.
11 */
12
13 #include "includes.h"
14
15 #include "common.h"
16 #include "crypto/random.h"
17 #include "crypto/sha1.h"
18 #include "eapol_supp/eapol_supp_sm.h"
19 #include "eap_peer/eap.h"
20 #include "eap_server/eap_methods.h"
21 #include "rsn_supp/wpa.h"
22 #include "eloop.h"
23 #include "config.h"
24 #include "utils/ext_password.h"
25 #include "l2_packet/l2_packet.h"
26 #include "wpa_supplicant_i.h"
27 #include "driver_i.h"
28 #include "ctrl_iface.h"
29 #include "pcsc_funcs.h"
30 #include "common/version.h"
31 #include "rsn_supp/preauth.h"
32 #include "rsn_supp/pmksa_cache.h"
33 #include "common/wpa_ctrl.h"
34 #include "common/ieee802_11_defs.h"
35 #include "p2p/p2p.h"
36 #include "blacklist.h"
37 #include "wpas_glue.h"
38 #include "wps_supplicant.h"
39 #include "ibss_rsn.h"
40 #include "sme.h"
41 #include "gas_query.h"
42 #include "ap.h"
43 #include "p2p_supplicant.h"
44 #include "wifi_display.h"
45 #include "notify.h"
46 #include "bgscan.h"
47 #include "autoscan.h"
48 #include "bss.h"
49 #include "scan.h"
50 #include "offchannel.h"
51 #include "hs20_supplicant.h"
52
53 const char *wpa_supplicant_version =
54 "wpa_supplicant v" VERSION_STR "\n"
55 "Copyright (c) 2003-2013, Jouni Malinen <j@w1.fi> and contributors";
56
57 const char *wpa_supplicant_license =
58 "This software may be distributed under the terms of the BSD license.\n"
59 "See README 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 "";
70 const char *wpa_supplicant_full_license2 =
71 "This software may be distributed under the terms of the BSD license.\n"
72 "\n"
73 "Redistribution and use in source and binary forms, with or without\n"
74 "modification, are permitted provided that the following conditions are\n"
75 "met:\n"
76 "\n";
77 const char *wpa_supplicant_full_license3 =
78 "1. Redistributions of source code must retain the above copyright\n"
79 " notice, this list of conditions and the following disclaimer.\n"
80 "\n"
81 "2. Redistributions in binary form must reproduce the above copyright\n"
82 " notice, this list of conditions and the following disclaimer in the\n"
83 " documentation and/or other materials provided with the distribution.\n"
84 "\n";
85 const char *wpa_supplicant_full_license4 =
86 "3. Neither the name(s) of the above-listed copyright holder(s) nor the\n"
87 " names of its contributors may be used to endorse or promote products\n"
88 " derived from this software without specific prior written permission.\n"
89 "\n"
90 "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
91 "\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
92 "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
93 "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n";
94 const char *wpa_supplicant_full_license5 =
95 "OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
96 "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
97 "LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
98 "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
99 "THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
100 "(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
101 "OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
102 "\n";
103 #endif /* CONFIG_NO_STDOUT_DEBUG */
104
105 extern int wpa_debug_level;
106 extern int wpa_debug_show_keys;
107 extern int wpa_debug_timestamp;
108 extern struct wpa_driver_ops *wpa_drivers[];
109
110 /* Configure default/group WEP keys for static WEP */
111 int wpa_set_wep_keys(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
112 {
113 int i, set = 0;
114
115 for (i = 0; i < NUM_WEP_KEYS; i++) {
116 if (ssid->wep_key_len[i] == 0)
117 continue;
118
119 set = 1;
120 wpa_drv_set_key(wpa_s, WPA_ALG_WEP, NULL,
121 i, i == ssid->wep_tx_keyidx, NULL, 0,
122 ssid->wep_key[i], ssid->wep_key_len[i]);
123 }
124
125 return set;
126 }
127
128
129 static int wpa_supplicant_set_wpa_none_key(struct wpa_supplicant *wpa_s,
130 struct wpa_ssid *ssid)
131 {
132 u8 key[32];
133 size_t keylen;
134 enum wpa_alg alg;
135 u8 seq[6] = { 0 };
136
137 /* IBSS/WPA-None uses only one key (Group) for both receiving and
138 * sending unicast and multicast packets. */
139
140 if (ssid->mode != WPAS_MODE_IBSS) {
141 wpa_msg(wpa_s, MSG_INFO, "WPA: Invalid mode %d (not "
142 "IBSS/ad-hoc) for WPA-None", ssid->mode);
143 return -1;
144 }
145
146 if (!ssid->psk_set) {
147 wpa_msg(wpa_s, MSG_INFO, "WPA: No PSK configured for "
148 "WPA-None");
149 return -1;
150 }
151
152 switch (wpa_s->group_cipher) {
153 case WPA_CIPHER_CCMP:
154 os_memcpy(key, ssid->psk, 16);
155 keylen = 16;
156 alg = WPA_ALG_CCMP;
157 break;
158 case WPA_CIPHER_GCMP:
159 os_memcpy(key, ssid->psk, 16);
160 keylen = 16;
161 alg = WPA_ALG_GCMP;
162 break;
163 case WPA_CIPHER_TKIP:
164 /* WPA-None uses the same Michael MIC key for both TX and RX */
165 os_memcpy(key, ssid->psk, 16 + 8);
166 os_memcpy(key + 16 + 8, ssid->psk + 16, 8);
167 keylen = 32;
168 alg = WPA_ALG_TKIP;
169 break;
170 default:
171 wpa_msg(wpa_s, MSG_INFO, "WPA: Invalid group cipher %d for "
172 "WPA-None", wpa_s->group_cipher);
173 return -1;
174 }
175
176 /* TODO: should actually remember the previously used seq#, both for TX
177 * and RX from each STA.. */
178
179 return wpa_drv_set_key(wpa_s, alg, NULL, 0, 1, seq, 6, key, keylen);
180 }
181
182
183 static void wpa_supplicant_timeout(void *eloop_ctx, void *timeout_ctx)
184 {
185 struct wpa_supplicant *wpa_s = eloop_ctx;
186 const u8 *bssid = wpa_s->bssid;
187 if (is_zero_ether_addr(bssid))
188 bssid = wpa_s->pending_bssid;
189 wpa_msg(wpa_s, MSG_INFO, "Authentication with " MACSTR " timed out.",
190 MAC2STR(bssid));
191 wpa_blacklist_add(wpa_s, bssid);
192 wpa_sm_notify_disassoc(wpa_s->wpa);
193 wpa_supplicant_deauthenticate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
194 wpa_s->reassociate = 1;
195
196 /*
197 * If we timed out, the AP or the local radio may be busy.
198 * So, wait a second until scanning again.
199 */
200 wpa_supplicant_req_scan(wpa_s, 1, 0);
201
202 wpas_p2p_continue_after_scan(wpa_s);
203 }
204
205
206 /**
207 * wpa_supplicant_req_auth_timeout - Schedule a timeout for authentication
208 * @wpa_s: Pointer to wpa_supplicant data
209 * @sec: Number of seconds after which to time out authentication
210 * @usec: Number of microseconds after which to time out authentication
211 *
212 * This function is used to schedule a timeout for the current authentication
213 * attempt.
214 */
215 void wpa_supplicant_req_auth_timeout(struct wpa_supplicant *wpa_s,
216 int sec, int usec)
217 {
218 if (wpa_s->conf && wpa_s->conf->ap_scan == 0 &&
219 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED))
220 return;
221
222 wpa_dbg(wpa_s, MSG_DEBUG, "Setting authentication timeout: %d sec "
223 "%d usec", sec, usec);
224 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
225 eloop_register_timeout(sec, usec, wpa_supplicant_timeout, wpa_s, NULL);
226 }
227
228
229 /**
230 * wpa_supplicant_cancel_auth_timeout - Cancel authentication timeout
231 * @wpa_s: Pointer to wpa_supplicant data
232 *
233 * This function is used to cancel authentication timeout scheduled with
234 * wpa_supplicant_req_auth_timeout() and it is called when authentication has
235 * been completed.
236 */
237 void wpa_supplicant_cancel_auth_timeout(struct wpa_supplicant *wpa_s)
238 {
239 wpa_dbg(wpa_s, MSG_DEBUG, "Cancelling authentication timeout");
240 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
241 wpa_blacklist_del(wpa_s, wpa_s->bssid);
242 }
243
244
245 /**
246 * wpa_supplicant_initiate_eapol - Configure EAPOL state machine
247 * @wpa_s: Pointer to wpa_supplicant data
248 *
249 * This function is used to configure EAPOL state machine based on the selected
250 * authentication mode.
251 */
252 void wpa_supplicant_initiate_eapol(struct wpa_supplicant *wpa_s)
253 {
254 #ifdef IEEE8021X_EAPOL
255 struct eapol_config eapol_conf;
256 struct wpa_ssid *ssid = wpa_s->current_ssid;
257
258 #ifdef CONFIG_IBSS_RSN
259 if (ssid->mode == WPAS_MODE_IBSS &&
260 wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
261 wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
262 /*
263 * RSN IBSS authentication is per-STA and we can disable the
264 * per-BSSID EAPOL authentication.
265 */
266 eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
267 eapol_sm_notify_eap_success(wpa_s->eapol, TRUE);
268 eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
269 return;
270 }
271 #endif /* CONFIG_IBSS_RSN */
272
273 eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
274 eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
275
276 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
277 wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE)
278 eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
279 else
280 eapol_sm_notify_portControl(wpa_s->eapol, Auto);
281
282 os_memset(&eapol_conf, 0, sizeof(eapol_conf));
283 if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
284 eapol_conf.accept_802_1x_keys = 1;
285 eapol_conf.required_keys = 0;
286 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_UNICAST) {
287 eapol_conf.required_keys |= EAPOL_REQUIRE_KEY_UNICAST;
288 }
289 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_BROADCAST) {
290 eapol_conf.required_keys |=
291 EAPOL_REQUIRE_KEY_BROADCAST;
292 }
293
294 if (wpa_s->conf && (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED))
295 eapol_conf.required_keys = 0;
296 }
297 if (wpa_s->conf)
298 eapol_conf.fast_reauth = wpa_s->conf->fast_reauth;
299 eapol_conf.workaround = ssid->eap_workaround;
300 eapol_conf.eap_disabled =
301 !wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) &&
302 wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA &&
303 wpa_s->key_mgmt != WPA_KEY_MGMT_WPS;
304 eapol_sm_notify_config(wpa_s->eapol, &ssid->eap, &eapol_conf);
305 #endif /* IEEE8021X_EAPOL */
306 }
307
308
309 /**
310 * wpa_supplicant_set_non_wpa_policy - Set WPA parameters to non-WPA mode
311 * @wpa_s: Pointer to wpa_supplicant data
312 * @ssid: Configuration data for the network
313 *
314 * This function is used to configure WPA state machine and related parameters
315 * to a mode where WPA is not enabled. This is called as part of the
316 * authentication configuration when the selected network does not use WPA.
317 */
318 void wpa_supplicant_set_non_wpa_policy(struct wpa_supplicant *wpa_s,
319 struct wpa_ssid *ssid)
320 {
321 int i;
322
323 if (ssid->key_mgmt & WPA_KEY_MGMT_WPS)
324 wpa_s->key_mgmt = WPA_KEY_MGMT_WPS;
325 else if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA)
326 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_NO_WPA;
327 else
328 wpa_s->key_mgmt = WPA_KEY_MGMT_NONE;
329 wpa_sm_set_ap_wpa_ie(wpa_s->wpa, NULL, 0);
330 wpa_sm_set_ap_rsn_ie(wpa_s->wpa, NULL, 0);
331 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
332 wpa_s->pairwise_cipher = WPA_CIPHER_NONE;
333 wpa_s->group_cipher = WPA_CIPHER_NONE;
334 wpa_s->mgmt_group_cipher = 0;
335
336 for (i = 0; i < NUM_WEP_KEYS; i++) {
337 if (ssid->wep_key_len[i] > 5) {
338 wpa_s->pairwise_cipher = WPA_CIPHER_WEP104;
339 wpa_s->group_cipher = WPA_CIPHER_WEP104;
340 break;
341 } else if (ssid->wep_key_len[i] > 0) {
342 wpa_s->pairwise_cipher = WPA_CIPHER_WEP40;
343 wpa_s->group_cipher = WPA_CIPHER_WEP40;
344 break;
345 }
346 }
347
348 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED, 0);
349 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
350 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
351 wpa_s->pairwise_cipher);
352 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
353 #ifdef CONFIG_IEEE80211W
354 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
355 wpa_s->mgmt_group_cipher);
356 #endif /* CONFIG_IEEE80211W */
357
358 pmksa_cache_clear_current(wpa_s->wpa);
359 }
360
361
362 void free_hw_features(struct wpa_supplicant *wpa_s)
363 {
364 int i;
365 if (wpa_s->hw.modes == NULL)
366 return;
367
368 for (i = 0; i < wpa_s->hw.num_modes; i++) {
369 os_free(wpa_s->hw.modes[i].channels);
370 os_free(wpa_s->hw.modes[i].rates);
371 }
372
373 os_free(wpa_s->hw.modes);
374 wpa_s->hw.modes = NULL;
375 }
376
377
378 static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s)
379 {
380 bgscan_deinit(wpa_s);
381 autoscan_deinit(wpa_s);
382 scard_deinit(wpa_s->scard);
383 wpa_s->scard = NULL;
384 wpa_sm_set_scard_ctx(wpa_s->wpa, NULL);
385 eapol_sm_register_scard_ctx(wpa_s->eapol, NULL);
386 l2_packet_deinit(wpa_s->l2);
387 wpa_s->l2 = NULL;
388 if (wpa_s->l2_br) {
389 l2_packet_deinit(wpa_s->l2_br);
390 wpa_s->l2_br = NULL;
391 }
392
393 if (wpa_s->conf != NULL) {
394 struct wpa_ssid *ssid;
395 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
396 wpas_notify_network_removed(wpa_s, ssid);
397 }
398
399 os_free(wpa_s->confname);
400 wpa_s->confname = NULL;
401
402 os_free(wpa_s->confanother);
403 wpa_s->confanother = NULL;
404
405 wpa_sm_set_eapol(wpa_s->wpa, NULL);
406 eapol_sm_deinit(wpa_s->eapol);
407 wpa_s->eapol = NULL;
408
409 rsn_preauth_deinit(wpa_s->wpa);
410
411 #ifdef CONFIG_TDLS
412 wpa_tdls_deinit(wpa_s->wpa);
413 #endif /* CONFIG_TDLS */
414
415 pmksa_candidate_free(wpa_s->wpa);
416 wpa_sm_deinit(wpa_s->wpa);
417 wpa_s->wpa = NULL;
418 wpa_blacklist_clear(wpa_s);
419
420 wpa_bss_deinit(wpa_s);
421
422 wpa_supplicant_cancel_scan(wpa_s);
423 wpa_supplicant_cancel_auth_timeout(wpa_s);
424 eloop_cancel_timeout(wpa_supplicant_stop_countermeasures, wpa_s, NULL);
425 #ifdef CONFIG_DELAYED_MIC_ERROR_REPORT
426 eloop_cancel_timeout(wpa_supplicant_delayed_mic_error_report,
427 wpa_s, NULL);
428 #endif /* CONFIG_DELAYED_MIC_ERROR_REPORT */
429
430 wpas_wps_deinit(wpa_s);
431
432 wpabuf_free(wpa_s->pending_eapol_rx);
433 wpa_s->pending_eapol_rx = NULL;
434
435 #ifdef CONFIG_IBSS_RSN
436 ibss_rsn_deinit(wpa_s->ibss_rsn);
437 wpa_s->ibss_rsn = NULL;
438 #endif /* CONFIG_IBSS_RSN */
439
440 sme_deinit(wpa_s);
441
442 #ifdef CONFIG_AP
443 wpa_supplicant_ap_deinit(wpa_s);
444 #endif /* CONFIG_AP */
445
446 #ifdef CONFIG_P2P
447 wpas_p2p_deinit(wpa_s);
448 #endif /* CONFIG_P2P */
449
450 #ifdef CONFIG_OFFCHANNEL
451 offchannel_deinit(wpa_s);
452 #endif /* CONFIG_OFFCHANNEL */
453
454 wpa_supplicant_cancel_sched_scan(wpa_s);
455
456 os_free(wpa_s->next_scan_freqs);
457 wpa_s->next_scan_freqs = NULL;
458
459 gas_query_deinit(wpa_s->gas);
460 wpa_s->gas = NULL;
461
462 free_hw_features(wpa_s);
463
464 os_free(wpa_s->bssid_filter);
465 wpa_s->bssid_filter = NULL;
466
467 os_free(wpa_s->disallow_aps_bssid);
468 wpa_s->disallow_aps_bssid = NULL;
469 os_free(wpa_s->disallow_aps_ssid);
470 wpa_s->disallow_aps_ssid = NULL;
471
472 wnm_bss_keep_alive_deinit(wpa_s);
473
474 ext_password_deinit(wpa_s->ext_pw);
475 wpa_s->ext_pw = NULL;
476
477 wpabuf_free(wpa_s->last_gas_resp);
478
479 os_free(wpa_s->last_scan_res);
480 wpa_s->last_scan_res = NULL;
481 }
482
483
484 /**
485 * wpa_clear_keys - Clear keys configured for the driver
486 * @wpa_s: Pointer to wpa_supplicant data
487 * @addr: Previously used BSSID or %NULL if not available
488 *
489 * This function clears the encryption keys that has been previously configured
490 * for the driver.
491 */
492 void wpa_clear_keys(struct wpa_supplicant *wpa_s, const u8 *addr)
493 {
494 if (wpa_s->keys_cleared) {
495 /* Some drivers (e.g., ndiswrapper & NDIS drivers) seem to have
496 * timing issues with keys being cleared just before new keys
497 * are set or just after association or something similar. This
498 * shows up in group key handshake failing often because of the
499 * client not receiving the first encrypted packets correctly.
500 * Skipping some of the extra key clearing steps seems to help
501 * in completing group key handshake more reliably. */
502 wpa_dbg(wpa_s, MSG_DEBUG, "No keys have been configured - "
503 "skip key clearing");
504 return;
505 }
506
507 /* MLME-DELETEKEYS.request */
508 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, 0, 0, NULL, 0, NULL, 0);
509 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, 1, 0, NULL, 0, NULL, 0);
510 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, 2, 0, NULL, 0, NULL, 0);
511 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, 3, 0, NULL, 0, NULL, 0);
512 #ifdef CONFIG_IEEE80211W
513 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, 4, 0, NULL, 0, NULL, 0);
514 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, 5, 0, NULL, 0, NULL, 0);
515 #endif /* CONFIG_IEEE80211W */
516 if (addr) {
517 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, addr, 0, 0, NULL, 0, NULL,
518 0);
519 /* MLME-SETPROTECTION.request(None) */
520 wpa_drv_mlme_setprotection(
521 wpa_s, addr,
522 MLME_SETPROTECTION_PROTECT_TYPE_NONE,
523 MLME_SETPROTECTION_KEY_TYPE_PAIRWISE);
524 }
525 wpa_s->keys_cleared = 1;
526 }
527
528
529 /**
530 * wpa_supplicant_state_txt - Get the connection state name as a text string
531 * @state: State (wpa_state; WPA_*)
532 * Returns: The state name as a printable text string
533 */
534 const char * wpa_supplicant_state_txt(enum wpa_states state)
535 {
536 switch (state) {
537 case WPA_DISCONNECTED:
538 return "DISCONNECTED";
539 case WPA_INACTIVE:
540 return "INACTIVE";
541 case WPA_INTERFACE_DISABLED:
542 return "INTERFACE_DISABLED";
543 case WPA_SCANNING:
544 return "SCANNING";
545 case WPA_AUTHENTICATING:
546 return "AUTHENTICATING";
547 case WPA_ASSOCIATING:
548 return "ASSOCIATING";
549 case WPA_ASSOCIATED:
550 return "ASSOCIATED";
551 case WPA_4WAY_HANDSHAKE:
552 return "4WAY_HANDSHAKE";
553 case WPA_GROUP_HANDSHAKE:
554 return "GROUP_HANDSHAKE";
555 case WPA_COMPLETED:
556 return "COMPLETED";
557 default:
558 return "UNKNOWN";
559 }
560 }
561
562
563 #ifdef CONFIG_BGSCAN
564
565 static void wpa_supplicant_start_bgscan(struct wpa_supplicant *wpa_s)
566 {
567 if (wpas_driver_bss_selection(wpa_s))
568 return;
569 if (wpa_s->current_ssid == wpa_s->bgscan_ssid)
570 return;
571
572 bgscan_deinit(wpa_s);
573 if (wpa_s->current_ssid && wpa_s->current_ssid->bgscan) {
574 if (bgscan_init(wpa_s, wpa_s->current_ssid)) {
575 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize "
576 "bgscan");
577 /*
578 * Live without bgscan; it is only used as a roaming
579 * optimization, so the initial connection is not
580 * affected.
581 */
582 } else {
583 struct wpa_scan_results *scan_res;
584 wpa_s->bgscan_ssid = wpa_s->current_ssid;
585 scan_res = wpa_supplicant_get_scan_results(wpa_s, NULL,
586 0);
587 if (scan_res) {
588 bgscan_notify_scan(wpa_s, scan_res);
589 wpa_scan_results_free(scan_res);
590 }
591 }
592 } else
593 wpa_s->bgscan_ssid = NULL;
594 }
595
596
597 static void wpa_supplicant_stop_bgscan(struct wpa_supplicant *wpa_s)
598 {
599 if (wpa_s->bgscan_ssid != NULL) {
600 bgscan_deinit(wpa_s);
601 wpa_s->bgscan_ssid = NULL;
602 }
603 }
604
605 #endif /* CONFIG_BGSCAN */
606
607
608 static void wpa_supplicant_start_autoscan(struct wpa_supplicant *wpa_s)
609 {
610 if (autoscan_init(wpa_s, 0))
611 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize autoscan");
612 }
613
614
615 static void wpa_supplicant_stop_autoscan(struct wpa_supplicant *wpa_s)
616 {
617 autoscan_deinit(wpa_s);
618 }
619
620
621 void wpa_supplicant_reinit_autoscan(struct wpa_supplicant *wpa_s)
622 {
623 if (wpa_s->wpa_state == WPA_DISCONNECTED ||
624 wpa_s->wpa_state == WPA_SCANNING) {
625 autoscan_deinit(wpa_s);
626 wpa_supplicant_start_autoscan(wpa_s);
627 }
628 }
629
630
631 /**
632 * wpa_supplicant_set_state - Set current connection state
633 * @wpa_s: Pointer to wpa_supplicant data
634 * @state: The new connection state
635 *
636 * This function is called whenever the connection state changes, e.g.,
637 * association is completed for WPA/WPA2 4-Way Handshake is started.
638 */
639 void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s,
640 enum wpa_states state)
641 {
642 enum wpa_states old_state = wpa_s->wpa_state;
643
644 wpa_dbg(wpa_s, MSG_DEBUG, "State: %s -> %s",
645 wpa_supplicant_state_txt(wpa_s->wpa_state),
646 wpa_supplicant_state_txt(state));
647
648 if (state != WPA_SCANNING)
649 wpa_supplicant_notify_scanning(wpa_s, 0);
650
651 if (state == WPA_COMPLETED && wpa_s->new_connection) {
652 struct wpa_ssid *ssid = wpa_s->current_ssid;
653 #if defined(CONFIG_CTRL_IFACE) || !defined(CONFIG_NO_STDOUT_DEBUG)
654 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_CONNECTED "- Connection to "
655 MACSTR " completed [id=%d id_str=%s]",
656 MAC2STR(wpa_s->bssid),
657 ssid ? ssid->id : -1,
658 ssid && ssid->id_str ? ssid->id_str : "");
659 #endif /* CONFIG_CTRL_IFACE || !CONFIG_NO_STDOUT_DEBUG */
660 wpas_clear_temp_disabled(wpa_s, ssid, 1);
661 wpa_s->extra_blacklist_count = 0;
662 wpa_s->new_connection = 0;
663 wpa_drv_set_operstate(wpa_s, 1);
664 #ifndef IEEE8021X_EAPOL
665 wpa_drv_set_supp_port(wpa_s, 1);
666 #endif /* IEEE8021X_EAPOL */
667 wpa_s->after_wps = 0;
668 #ifdef CONFIG_P2P
669 wpas_p2p_completed(wpa_s);
670 #endif /* CONFIG_P2P */
671
672 sme_sched_obss_scan(wpa_s, 1);
673 } else if (state == WPA_DISCONNECTED || state == WPA_ASSOCIATING ||
674 state == WPA_ASSOCIATED) {
675 wpa_s->new_connection = 1;
676 wpa_drv_set_operstate(wpa_s, 0);
677 #ifndef IEEE8021X_EAPOL
678 wpa_drv_set_supp_port(wpa_s, 0);
679 #endif /* IEEE8021X_EAPOL */
680 sme_sched_obss_scan(wpa_s, 0);
681 }
682 wpa_s->wpa_state = state;
683
684 #ifdef CONFIG_BGSCAN
685 if (state == WPA_COMPLETED)
686 wpa_supplicant_start_bgscan(wpa_s);
687 else
688 wpa_supplicant_stop_bgscan(wpa_s);
689 #endif /* CONFIG_BGSCAN */
690
691 if (state == WPA_AUTHENTICATING)
692 wpa_supplicant_stop_autoscan(wpa_s);
693
694 if (state == WPA_DISCONNECTED || state == WPA_INACTIVE)
695 wpa_supplicant_start_autoscan(wpa_s);
696
697 if (wpa_s->wpa_state != old_state) {
698 wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
699
700 if (wpa_s->wpa_state == WPA_COMPLETED ||
701 old_state == WPA_COMPLETED)
702 wpas_notify_auth_changed(wpa_s);
703 }
704 }
705
706
707 void wpa_supplicant_terminate_proc(struct wpa_global *global)
708 {
709 int pending = 0;
710 #ifdef CONFIG_WPS
711 struct wpa_supplicant *wpa_s = global->ifaces;
712 while (wpa_s) {
713 if (wpas_wps_terminate_pending(wpa_s) == 1)
714 pending = 1;
715 wpa_s = wpa_s->next;
716 }
717 #endif /* CONFIG_WPS */
718 if (pending)
719 return;
720 eloop_terminate();
721 }
722
723
724 static void wpa_supplicant_terminate(int sig, void *signal_ctx)
725 {
726 struct wpa_global *global = signal_ctx;
727 wpa_supplicant_terminate_proc(global);
728 }
729
730
731 void wpa_supplicant_clear_status(struct wpa_supplicant *wpa_s)
732 {
733 enum wpa_states old_state = wpa_s->wpa_state;
734
735 wpa_s->pairwise_cipher = 0;
736 wpa_s->group_cipher = 0;
737 wpa_s->mgmt_group_cipher = 0;
738 wpa_s->key_mgmt = 0;
739 if (wpa_s->wpa_state != WPA_INTERFACE_DISABLED)
740 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
741
742 if (wpa_s->wpa_state != old_state)
743 wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
744 }
745
746
747 /**
748 * wpa_supplicant_reload_configuration - Reload configuration data
749 * @wpa_s: Pointer to wpa_supplicant data
750 * Returns: 0 on success or -1 if configuration parsing failed
751 *
752 * This function can be used to request that the configuration data is reloaded
753 * (e.g., after configuration file change). This function is reloading
754 * configuration only for one interface, so this may need to be called multiple
755 * times if %wpa_supplicant is controlling multiple interfaces and all
756 * interfaces need reconfiguration.
757 */
758 int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s)
759 {
760 struct wpa_config *conf;
761 int reconf_ctrl;
762 int old_ap_scan;
763
764 if (wpa_s->confname == NULL)
765 return -1;
766 conf = wpa_config_read(wpa_s->confname, NULL);
767 if (conf == NULL) {
768 wpa_msg(wpa_s, MSG_ERROR, "Failed to parse the configuration "
769 "file '%s' - exiting", wpa_s->confname);
770 return -1;
771 }
772 wpa_config_read(wpa_s->confanother, conf);
773
774 conf->changed_parameters = (unsigned int) -1;
775
776 reconf_ctrl = !!conf->ctrl_interface != !!wpa_s->conf->ctrl_interface
777 || (conf->ctrl_interface && wpa_s->conf->ctrl_interface &&
778 os_strcmp(conf->ctrl_interface,
779 wpa_s->conf->ctrl_interface) != 0);
780
781 if (reconf_ctrl && wpa_s->ctrl_iface) {
782 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
783 wpa_s->ctrl_iface = NULL;
784 }
785
786 eapol_sm_invalidate_cached_session(wpa_s->eapol);
787 if (wpa_s->current_ssid) {
788 wpa_supplicant_deauthenticate(wpa_s,
789 WLAN_REASON_DEAUTH_LEAVING);
790 }
791
792 /*
793 * TODO: should notify EAPOL SM about changes in opensc_engine_path,
794 * pkcs11_engine_path, pkcs11_module_path.
795 */
796 if (wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt)) {
797 /*
798 * Clear forced success to clear EAP state for next
799 * authentication.
800 */
801 eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
802 }
803 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
804 wpa_sm_set_config(wpa_s->wpa, NULL);
805 wpa_sm_pmksa_cache_flush(wpa_s->wpa, NULL);
806 wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
807 rsn_preauth_deinit(wpa_s->wpa);
808
809 old_ap_scan = wpa_s->conf->ap_scan;
810 wpa_config_free(wpa_s->conf);
811 wpa_s->conf = conf;
812 if (old_ap_scan != wpa_s->conf->ap_scan)
813 wpas_notify_ap_scan_changed(wpa_s);
814
815 if (reconf_ctrl)
816 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
817
818 wpa_supplicant_update_config(wpa_s);
819
820 wpa_supplicant_clear_status(wpa_s);
821 if (wpa_supplicant_enabled_networks(wpa_s)) {
822 wpa_s->reassociate = 1;
823 wpa_supplicant_req_scan(wpa_s, 0, 0);
824 }
825 wpa_dbg(wpa_s, MSG_DEBUG, "Reconfiguration completed");
826 return 0;
827 }
828
829
830 static void wpa_supplicant_reconfig(int sig, void *signal_ctx)
831 {
832 struct wpa_global *global = signal_ctx;
833 struct wpa_supplicant *wpa_s;
834 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
835 wpa_dbg(wpa_s, MSG_DEBUG, "Signal %d received - reconfiguring",
836 sig);
837 if (wpa_supplicant_reload_configuration(wpa_s) < 0) {
838 wpa_supplicant_terminate_proc(global);
839 }
840 }
841 }
842
843
844 enum wpa_key_mgmt key_mgmt2driver(int key_mgmt)
845 {
846 switch (key_mgmt) {
847 case WPA_KEY_MGMT_NONE:
848 return KEY_MGMT_NONE;
849 case WPA_KEY_MGMT_IEEE8021X_NO_WPA:
850 return KEY_MGMT_802_1X_NO_WPA;
851 case WPA_KEY_MGMT_IEEE8021X:
852 return KEY_MGMT_802_1X;
853 case WPA_KEY_MGMT_WPA_NONE:
854 return KEY_MGMT_WPA_NONE;
855 case WPA_KEY_MGMT_FT_IEEE8021X:
856 return KEY_MGMT_FT_802_1X;
857 case WPA_KEY_MGMT_FT_PSK:
858 return KEY_MGMT_FT_PSK;
859 case WPA_KEY_MGMT_IEEE8021X_SHA256:
860 return KEY_MGMT_802_1X_SHA256;
861 case WPA_KEY_MGMT_PSK_SHA256:
862 return KEY_MGMT_PSK_SHA256;
863 case WPA_KEY_MGMT_WPS:
864 return KEY_MGMT_WPS;
865 case WPA_KEY_MGMT_PSK:
866 default:
867 return KEY_MGMT_PSK;
868 }
869 }
870
871
872 static int wpa_supplicant_suites_from_ai(struct wpa_supplicant *wpa_s,
873 struct wpa_ssid *ssid,
874 struct wpa_ie_data *ie)
875 {
876 int ret = wpa_sm_parse_own_wpa_ie(wpa_s->wpa, ie);
877 if (ret) {
878 if (ret == -2) {
879 wpa_msg(wpa_s, MSG_INFO, "WPA: Failed to parse WPA IE "
880 "from association info");
881 }
882 return -1;
883 }
884
885 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Using WPA IE from AssocReq to set "
886 "cipher suites");
887 if (!(ie->group_cipher & ssid->group_cipher)) {
888 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled group "
889 "cipher 0x%x (mask 0x%x) - reject",
890 ie->group_cipher, ssid->group_cipher);
891 return -1;
892 }
893 if (!(ie->pairwise_cipher & ssid->pairwise_cipher)) {
894 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled pairwise "
895 "cipher 0x%x (mask 0x%x) - reject",
896 ie->pairwise_cipher, ssid->pairwise_cipher);
897 return -1;
898 }
899 if (!(ie->key_mgmt & ssid->key_mgmt)) {
900 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled key "
901 "management 0x%x (mask 0x%x) - reject",
902 ie->key_mgmt, ssid->key_mgmt);
903 return -1;
904 }
905
906 #ifdef CONFIG_IEEE80211W
907 if (!(ie->capabilities & WPA_CAPABILITY_MFPC) &&
908 (ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT ?
909 wpa_s->conf->pmf : ssid->ieee80211w) ==
910 MGMT_FRAME_PROTECTION_REQUIRED) {
911 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver associated with an AP "
912 "that does not support management frame protection - "
913 "reject");
914 return -1;
915 }
916 #endif /* CONFIG_IEEE80211W */
917
918 return 0;
919 }
920
921
922 /**
923 * wpa_supplicant_set_suites - Set authentication and encryption parameters
924 * @wpa_s: Pointer to wpa_supplicant data
925 * @bss: Scan results for the selected BSS, or %NULL if not available
926 * @ssid: Configuration data for the selected network
927 * @wpa_ie: Buffer for the WPA/RSN IE
928 * @wpa_ie_len: Maximum wpa_ie buffer size on input. This is changed to be the
929 * used buffer length in case the functions returns success.
930 * Returns: 0 on success or -1 on failure
931 *
932 * This function is used to configure authentication and encryption parameters
933 * based on the network configuration and scan result for the selected BSS (if
934 * available).
935 */
936 int wpa_supplicant_set_suites(struct wpa_supplicant *wpa_s,
937 struct wpa_bss *bss, struct wpa_ssid *ssid,
938 u8 *wpa_ie, size_t *wpa_ie_len)
939 {
940 struct wpa_ie_data ie;
941 int sel, proto;
942 const u8 *bss_wpa, *bss_rsn;
943
944 if (bss) {
945 bss_wpa = wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE);
946 bss_rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
947 } else
948 bss_wpa = bss_rsn = NULL;
949
950 if (bss_rsn && (ssid->proto & WPA_PROTO_RSN) &&
951 wpa_parse_wpa_ie(bss_rsn, 2 + bss_rsn[1], &ie) == 0 &&
952 (ie.group_cipher & ssid->group_cipher) &&
953 (ie.pairwise_cipher & ssid->pairwise_cipher) &&
954 (ie.key_mgmt & ssid->key_mgmt)) {
955 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using IEEE 802.11i/D9.0");
956 proto = WPA_PROTO_RSN;
957 } else if (bss_wpa && (ssid->proto & WPA_PROTO_WPA) &&
958 wpa_parse_wpa_ie(bss_wpa, 2 +bss_wpa[1], &ie) == 0 &&
959 (ie.group_cipher & ssid->group_cipher) &&
960 (ie.pairwise_cipher & ssid->pairwise_cipher) &&
961 (ie.key_mgmt & ssid->key_mgmt)) {
962 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using IEEE 802.11i/D3.0");
963 proto = WPA_PROTO_WPA;
964 } else if (bss) {
965 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select WPA/RSN");
966 return -1;
967 } else {
968 if (ssid->proto & WPA_PROTO_RSN)
969 proto = WPA_PROTO_RSN;
970 else
971 proto = WPA_PROTO_WPA;
972 if (wpa_supplicant_suites_from_ai(wpa_s, ssid, &ie) < 0) {
973 os_memset(&ie, 0, sizeof(ie));
974 ie.group_cipher = ssid->group_cipher;
975 ie.pairwise_cipher = ssid->pairwise_cipher;
976 ie.key_mgmt = ssid->key_mgmt;
977 #ifdef CONFIG_IEEE80211W
978 ie.mgmt_group_cipher =
979 ssid->ieee80211w != NO_MGMT_FRAME_PROTECTION ?
980 WPA_CIPHER_AES_128_CMAC : 0;
981 #endif /* CONFIG_IEEE80211W */
982 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Set cipher suites "
983 "based on configuration");
984 } else
985 proto = ie.proto;
986 }
987
988 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected cipher suites: group %d "
989 "pairwise %d key_mgmt %d proto %d",
990 ie.group_cipher, ie.pairwise_cipher, ie.key_mgmt, proto);
991 #ifdef CONFIG_IEEE80211W
992 if (ssid->ieee80211w) {
993 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected mgmt group cipher %d",
994 ie.mgmt_group_cipher);
995 }
996 #endif /* CONFIG_IEEE80211W */
997
998 wpa_s->wpa_proto = proto;
999 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PROTO, proto);
1000 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED,
1001 !!(ssid->proto & WPA_PROTO_RSN));
1002
1003 if (bss || !wpa_s->ap_ies_from_associnfo) {
1004 if (wpa_sm_set_ap_wpa_ie(wpa_s->wpa, bss_wpa,
1005 bss_wpa ? 2 + bss_wpa[1] : 0) ||
1006 wpa_sm_set_ap_rsn_ie(wpa_s->wpa, bss_rsn,
1007 bss_rsn ? 2 + bss_rsn[1] : 0))
1008 return -1;
1009 }
1010
1011 sel = ie.group_cipher & ssid->group_cipher;
1012 wpa_s->group_cipher = wpa_pick_group_cipher(sel);
1013 if (wpa_s->group_cipher < 0) {
1014 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select group "
1015 "cipher");
1016 return -1;
1017 }
1018 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using GTK %s",
1019 wpa_cipher_txt(wpa_s->group_cipher));
1020
1021 sel = ie.pairwise_cipher & ssid->pairwise_cipher;
1022 wpa_s->pairwise_cipher = wpa_pick_pairwise_cipher(sel, 1);
1023 if (wpa_s->pairwise_cipher < 0) {
1024 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select pairwise "
1025 "cipher");
1026 return -1;
1027 }
1028 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using PTK %s",
1029 wpa_cipher_txt(wpa_s->pairwise_cipher));
1030
1031 sel = ie.key_mgmt & ssid->key_mgmt;
1032 #ifdef CONFIG_SAE
1033 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SAE))
1034 sel &= ~(WPA_KEY_MGMT_SAE | WPA_KEY_MGMT_FT_SAE);
1035 #endif /* CONFIG_SAE */
1036 if (0) {
1037 #ifdef CONFIG_IEEE80211R
1038 } else if (sel & WPA_KEY_MGMT_FT_IEEE8021X) {
1039 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_IEEE8021X;
1040 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/802.1X");
1041 } else if (sel & WPA_KEY_MGMT_FT_PSK) {
1042 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_PSK;
1043 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/PSK");
1044 #endif /* CONFIG_IEEE80211R */
1045 #ifdef CONFIG_SAE
1046 } else if (sel & WPA_KEY_MGMT_SAE) {
1047 wpa_s->key_mgmt = WPA_KEY_MGMT_SAE;
1048 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT SAE");
1049 } else if (sel & WPA_KEY_MGMT_FT_SAE) {
1050 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_SAE;
1051 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT FT/SAE");
1052 #endif /* CONFIG_SAE */
1053 #ifdef CONFIG_IEEE80211W
1054 } else if (sel & WPA_KEY_MGMT_IEEE8021X_SHA256) {
1055 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SHA256;
1056 wpa_dbg(wpa_s, MSG_DEBUG,
1057 "WPA: using KEY_MGMT 802.1X with SHA256");
1058 } else if (sel & WPA_KEY_MGMT_PSK_SHA256) {
1059 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK_SHA256;
1060 wpa_dbg(wpa_s, MSG_DEBUG,
1061 "WPA: using KEY_MGMT PSK with SHA256");
1062 #endif /* CONFIG_IEEE80211W */
1063 } else if (sel & WPA_KEY_MGMT_IEEE8021X) {
1064 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X;
1065 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT 802.1X");
1066 } else if (sel & WPA_KEY_MGMT_PSK) {
1067 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK;
1068 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-PSK");
1069 } else if (sel & WPA_KEY_MGMT_WPA_NONE) {
1070 wpa_s->key_mgmt = WPA_KEY_MGMT_WPA_NONE;
1071 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-NONE");
1072 } else {
1073 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select "
1074 "authenticated key management type");
1075 return -1;
1076 }
1077
1078 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
1079 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
1080 wpa_s->pairwise_cipher);
1081 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
1082
1083 #ifdef CONFIG_IEEE80211W
1084 sel = ie.mgmt_group_cipher;
1085 if ((ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT ?
1086 wpa_s->conf->pmf : ssid->ieee80211w) == NO_MGMT_FRAME_PROTECTION ||
1087 !(ie.capabilities & WPA_CAPABILITY_MFPC))
1088 sel = 0;
1089 if (sel & WPA_CIPHER_AES_128_CMAC) {
1090 wpa_s->mgmt_group_cipher = WPA_CIPHER_AES_128_CMAC;
1091 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1092 "AES-128-CMAC");
1093 } else {
1094 wpa_s->mgmt_group_cipher = 0;
1095 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: not using MGMT group cipher");
1096 }
1097 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
1098 wpa_s->mgmt_group_cipher);
1099 wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MFP,
1100 (ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT ?
1101 wpa_s->conf->pmf : ssid->ieee80211w));
1102 #endif /* CONFIG_IEEE80211W */
1103
1104 if (wpa_sm_set_assoc_wpa_ie_default(wpa_s->wpa, wpa_ie, wpa_ie_len)) {
1105 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to generate WPA IE");
1106 return -1;
1107 }
1108
1109 if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt)) {
1110 wpa_sm_set_pmk(wpa_s->wpa, ssid->psk, PMK_LEN);
1111 #ifndef CONFIG_NO_PBKDF2
1112 if (bss && ssid->bssid_set && ssid->ssid_len == 0 &&
1113 ssid->passphrase) {
1114 u8 psk[PMK_LEN];
1115 pbkdf2_sha1(ssid->passphrase, bss->ssid, bss->ssid_len,
1116 4096, psk, PMK_LEN);
1117 wpa_hexdump_key(MSG_MSGDUMP, "PSK (from passphrase)",
1118 psk, PMK_LEN);
1119 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN);
1120 }
1121 #endif /* CONFIG_NO_PBKDF2 */
1122 #ifdef CONFIG_EXT_PASSWORD
1123 if (ssid->ext_psk) {
1124 struct wpabuf *pw = ext_password_get(wpa_s->ext_pw,
1125 ssid->ext_psk);
1126 char pw_str[64 + 1];
1127 u8 psk[PMK_LEN];
1128
1129 if (pw == NULL) {
1130 wpa_msg(wpa_s, MSG_INFO, "EXT PW: No PSK "
1131 "found from external storage");
1132 return -1;
1133 }
1134
1135 if (wpabuf_len(pw) < 8 || wpabuf_len(pw) > 64) {
1136 wpa_msg(wpa_s, MSG_INFO, "EXT PW: Unexpected "
1137 "PSK length %d in external storage",
1138 (int) wpabuf_len(pw));
1139 ext_password_free(pw);
1140 return -1;
1141 }
1142
1143 os_memcpy(pw_str, wpabuf_head(pw), wpabuf_len(pw));
1144 pw_str[wpabuf_len(pw)] = '\0';
1145
1146 #ifndef CONFIG_NO_PBKDF2
1147 if (wpabuf_len(pw) >= 8 && wpabuf_len(pw) < 64 && bss)
1148 {
1149 pbkdf2_sha1(pw_str, bss->ssid, bss->ssid_len,
1150 4096, psk, PMK_LEN);
1151 os_memset(pw_str, 0, sizeof(pw_str));
1152 wpa_hexdump_key(MSG_MSGDUMP, "PSK (from "
1153 "external passphrase)",
1154 psk, PMK_LEN);
1155 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN);
1156 } else
1157 #endif /* CONFIG_NO_PBKDF2 */
1158 if (wpabuf_len(pw) == 2 * PMK_LEN) {
1159 if (hexstr2bin(pw_str, psk, PMK_LEN) < 0) {
1160 wpa_msg(wpa_s, MSG_INFO, "EXT PW: "
1161 "Invalid PSK hex string");
1162 os_memset(pw_str, 0, sizeof(pw_str));
1163 ext_password_free(pw);
1164 return -1;
1165 }
1166 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN);
1167 } else {
1168 wpa_msg(wpa_s, MSG_INFO, "EXT PW: No suitable "
1169 "PSK available");
1170 os_memset(pw_str, 0, sizeof(pw_str));
1171 ext_password_free(pw);
1172 return -1;
1173 }
1174
1175 os_memset(pw_str, 0, sizeof(pw_str));
1176 ext_password_free(pw);
1177 }
1178 #endif /* CONFIG_EXT_PASSWORD */
1179 } else
1180 wpa_sm_set_pmk_from_pmksa(wpa_s->wpa);
1181
1182 return 0;
1183 }
1184
1185
1186 static void wpas_ext_capab_byte(struct wpa_supplicant *wpa_s, u8 *pos, int idx)
1187 {
1188 *pos = 0x00;
1189
1190 switch (idx) {
1191 case 0: /* Bits 0-7 */
1192 break;
1193 case 1: /* Bits 8-15 */
1194 break;
1195 case 2: /* Bits 16-23 */
1196 #ifdef CONFIG_WNM
1197 *pos |= 0x02; /* Bit 17 - WNM-Sleep Mode */
1198 *pos |= 0x08; /* Bit 19 - BSS Transition */
1199 #endif /* CONFIG_WNM */
1200 break;
1201 case 3: /* Bits 24-31 */
1202 #ifdef CONFIG_WNM
1203 *pos |= 0x02; /* Bit 25 - SSID List */
1204 #endif /* CONFIG_WNM */
1205 #ifdef CONFIG_INTERWORKING
1206 if (wpa_s->conf->interworking)
1207 *pos |= 0x80; /* Bit 31 - Interworking */
1208 #endif /* CONFIG_INTERWORKING */
1209 break;
1210 case 4: /* Bits 32-39 */
1211 break;
1212 case 5: /* Bits 40-47 */
1213 break;
1214 case 6: /* Bits 48-55 */
1215 break;
1216 }
1217 }
1218
1219
1220 int wpas_build_ext_capab(struct wpa_supplicant *wpa_s, u8 *buf)
1221 {
1222 u8 *pos = buf;
1223 u8 len = 4, i;
1224
1225 if (len < wpa_s->extended_capa_len)
1226 len = wpa_s->extended_capa_len;
1227
1228 *pos++ = WLAN_EID_EXT_CAPAB;
1229 *pos++ = len;
1230 for (i = 0; i < len; i++, pos++) {
1231 wpas_ext_capab_byte(wpa_s, pos, i);
1232
1233 if (i < wpa_s->extended_capa_len) {
1234 *pos &= ~wpa_s->extended_capa_mask[i];
1235 *pos |= wpa_s->extended_capa[i];
1236 }
1237 }
1238
1239 while (len > 0 && buf[1 + len] == 0) {
1240 len--;
1241 buf[1] = len;
1242 }
1243 if (len == 0)
1244 return 0;
1245
1246 return 2 + len;
1247 }
1248
1249
1250 /**
1251 * wpa_supplicant_associate - Request association
1252 * @wpa_s: Pointer to wpa_supplicant data
1253 * @bss: Scan results for the selected BSS, or %NULL if not available
1254 * @ssid: Configuration data for the selected network
1255 *
1256 * This function is used to request %wpa_supplicant to associate with a BSS.
1257 */
1258 void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
1259 struct wpa_bss *bss, struct wpa_ssid *ssid)
1260 {
1261 u8 wpa_ie[200];
1262 size_t wpa_ie_len;
1263 int use_crypt, ret, i, bssid_changed;
1264 int algs = WPA_AUTH_ALG_OPEN;
1265 enum wpa_cipher cipher_pairwise, cipher_group;
1266 struct wpa_driver_associate_params params;
1267 int wep_keys_set = 0;
1268 struct wpa_driver_capa capa;
1269 int assoc_failed = 0;
1270 struct wpa_ssid *old_ssid;
1271 u8 ext_capab[10];
1272 int ext_capab_len;
1273 #ifdef CONFIG_HT_OVERRIDES
1274 struct ieee80211_ht_capabilities htcaps;
1275 struct ieee80211_ht_capabilities htcaps_mask;
1276 #endif /* CONFIG_HT_OVERRIDES */
1277
1278 #ifdef CONFIG_IBSS_RSN
1279 ibss_rsn_deinit(wpa_s->ibss_rsn);
1280 wpa_s->ibss_rsn = NULL;
1281 #endif /* CONFIG_IBSS_RSN */
1282
1283 if (ssid->mode == WPAS_MODE_AP || ssid->mode == WPAS_MODE_P2P_GO ||
1284 ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) {
1285 #ifdef CONFIG_AP
1286 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_AP)) {
1287 wpa_msg(wpa_s, MSG_INFO, "Driver does not support AP "
1288 "mode");
1289 return;
1290 }
1291 if (wpa_supplicant_create_ap(wpa_s, ssid) < 0) {
1292 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
1293 return;
1294 }
1295 wpa_s->current_bss = bss;
1296 #else /* CONFIG_AP */
1297 wpa_msg(wpa_s, MSG_ERROR, "AP mode support not included in "
1298 "the build");
1299 #endif /* CONFIG_AP */
1300 return;
1301 }
1302
1303 #ifdef CONFIG_TDLS
1304 if (bss)
1305 wpa_tdls_ap_ies(wpa_s->wpa, (const u8 *) (bss + 1),
1306 bss->ie_len);
1307 #endif /* CONFIG_TDLS */
1308
1309 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) &&
1310 ssid->mode == IEEE80211_MODE_INFRA) {
1311 sme_authenticate(wpa_s, bss, ssid);
1312 return;
1313 }
1314
1315 os_memset(&params, 0, sizeof(params));
1316 wpa_s->reassociate = 0;
1317 if (bss && !wpas_driver_bss_selection(wpa_s)) {
1318 #ifdef CONFIG_IEEE80211R
1319 const u8 *ie, *md = NULL;
1320 #endif /* CONFIG_IEEE80211R */
1321 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with " MACSTR
1322 " (SSID='%s' freq=%d MHz)", MAC2STR(bss->bssid),
1323 wpa_ssid_txt(bss->ssid, bss->ssid_len), bss->freq);
1324 bssid_changed = !is_zero_ether_addr(wpa_s->bssid);
1325 os_memset(wpa_s->bssid, 0, ETH_ALEN);
1326 os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN);
1327 if (bssid_changed)
1328 wpas_notify_bssid_changed(wpa_s);
1329 #ifdef CONFIG_IEEE80211R
1330 ie = wpa_bss_get_ie(bss, WLAN_EID_MOBILITY_DOMAIN);
1331 if (ie && ie[1] >= MOBILITY_DOMAIN_ID_LEN)
1332 md = ie + 2;
1333 wpa_sm_set_ft_params(wpa_s->wpa, ie, ie ? 2 + ie[1] : 0);
1334 if (md) {
1335 /* Prepare for the next transition */
1336 wpa_ft_prepare_auth_request(wpa_s->wpa, ie);
1337 }
1338 #endif /* CONFIG_IEEE80211R */
1339 #ifdef CONFIG_WPS
1340 } else if ((ssid->ssid == NULL || ssid->ssid_len == 0) &&
1341 wpa_s->conf->ap_scan == 2 &&
1342 (ssid->key_mgmt & WPA_KEY_MGMT_WPS)) {
1343 /* Use ap_scan==1 style network selection to find the network
1344 */
1345 wpa_s->scan_req = MANUAL_SCAN_REQ;
1346 wpa_s->reassociate = 1;
1347 wpa_supplicant_req_scan(wpa_s, 0, 0);
1348 return;
1349 #endif /* CONFIG_WPS */
1350 } else {
1351 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with SSID '%s'",
1352 wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
1353 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
1354 }
1355 wpa_supplicant_cancel_sched_scan(wpa_s);
1356 wpa_supplicant_cancel_scan(wpa_s);
1357
1358 /* Starting new association, so clear the possibly used WPA IE from the
1359 * previous association. */
1360 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
1361
1362 #ifdef IEEE8021X_EAPOL
1363 if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1364 if (ssid->leap) {
1365 if (ssid->non_leap == 0)
1366 algs = WPA_AUTH_ALG_LEAP;
1367 else
1368 algs |= WPA_AUTH_ALG_LEAP;
1369 }
1370 }
1371 #endif /* IEEE8021X_EAPOL */
1372 wpa_dbg(wpa_s, MSG_DEBUG, "Automatic auth_alg selection: 0x%x", algs);
1373 if (ssid->auth_alg) {
1374 algs = ssid->auth_alg;
1375 wpa_dbg(wpa_s, MSG_DEBUG, "Overriding auth_alg selection: "
1376 "0x%x", algs);
1377 }
1378
1379 if (bss && (wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE) ||
1380 wpa_bss_get_ie(bss, WLAN_EID_RSN)) &&
1381 wpa_key_mgmt_wpa(ssid->key_mgmt)) {
1382 int try_opportunistic;
1383 try_opportunistic = (ssid->proactive_key_caching < 0 ?
1384 wpa_s->conf->okc :
1385 ssid->proactive_key_caching) &&
1386 (ssid->proto & WPA_PROTO_RSN);
1387 if (pmksa_cache_set_current(wpa_s->wpa, NULL, bss->bssid,
1388 ssid, try_opportunistic) == 0)
1389 eapol_sm_notify_pmkid_attempt(wpa_s->eapol, 1);
1390 wpa_ie_len = sizeof(wpa_ie);
1391 if (wpa_supplicant_set_suites(wpa_s, bss, ssid,
1392 wpa_ie, &wpa_ie_len)) {
1393 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA "
1394 "key management and encryption suites");
1395 return;
1396 }
1397 } else if ((ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) && bss &&
1398 wpa_key_mgmt_wpa_ieee8021x(ssid->key_mgmt)) {
1399 /*
1400 * Both WPA and non-WPA IEEE 802.1X enabled in configuration -
1401 * use non-WPA since the scan results did not indicate that the
1402 * AP is using WPA or WPA2.
1403 */
1404 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
1405 wpa_ie_len = 0;
1406 wpa_s->wpa_proto = 0;
1407 } else if (wpa_key_mgmt_wpa_any(ssid->key_mgmt)) {
1408 wpa_ie_len = sizeof(wpa_ie);
1409 if (wpa_supplicant_set_suites(wpa_s, NULL, ssid,
1410 wpa_ie, &wpa_ie_len)) {
1411 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA "
1412 "key management and encryption suites (no "
1413 "scan results)");
1414 return;
1415 }
1416 #ifdef CONFIG_WPS
1417 } else if (ssid->key_mgmt & WPA_KEY_MGMT_WPS) {
1418 struct wpabuf *wps_ie;
1419 wps_ie = wps_build_assoc_req_ie(wpas_wps_get_req_type(ssid));
1420 if (wps_ie && wpabuf_len(wps_ie) <= sizeof(wpa_ie)) {
1421 wpa_ie_len = wpabuf_len(wps_ie);
1422 os_memcpy(wpa_ie, wpabuf_head(wps_ie), wpa_ie_len);
1423 } else
1424 wpa_ie_len = 0;
1425 wpabuf_free(wps_ie);
1426 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
1427 if (!bss || (bss->caps & IEEE80211_CAP_PRIVACY))
1428 params.wps = WPS_MODE_PRIVACY;
1429 else
1430 params.wps = WPS_MODE_OPEN;
1431 wpa_s->wpa_proto = 0;
1432 #endif /* CONFIG_WPS */
1433 } else {
1434 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
1435 wpa_ie_len = 0;
1436 wpa_s->wpa_proto = 0;
1437 }
1438
1439 #ifdef CONFIG_P2P
1440 if (wpa_s->global->p2p) {
1441 u8 *pos;
1442 size_t len;
1443 int res;
1444 pos = wpa_ie + wpa_ie_len;
1445 len = sizeof(wpa_ie) - wpa_ie_len;
1446 res = wpas_p2p_assoc_req_ie(wpa_s, bss, pos, len,
1447 ssid->p2p_group);
1448 if (res >= 0)
1449 wpa_ie_len += res;
1450 }
1451
1452 wpa_s->cross_connect_disallowed = 0;
1453 if (bss) {
1454 struct wpabuf *p2p;
1455 p2p = wpa_bss_get_vendor_ie_multi(bss, P2P_IE_VENDOR_TYPE);
1456 if (p2p) {
1457 wpa_s->cross_connect_disallowed =
1458 p2p_get_cross_connect_disallowed(p2p);
1459 wpabuf_free(p2p);
1460 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: WLAN AP %s cross "
1461 "connection",
1462 wpa_s->cross_connect_disallowed ?
1463 "disallows" : "allows");
1464 }
1465 }
1466 #endif /* CONFIG_P2P */
1467
1468 #ifdef CONFIG_HS20
1469 if (wpa_s->conf->hs20) {
1470 struct wpabuf *hs20;
1471 hs20 = wpabuf_alloc(20);
1472 if (hs20) {
1473 wpas_hs20_add_indication(hs20);
1474 os_memcpy(wpa_ie + wpa_ie_len, wpabuf_head(hs20),
1475 wpabuf_len(hs20));
1476 wpa_ie_len += wpabuf_len(hs20);
1477 wpabuf_free(hs20);
1478 }
1479 }
1480 #endif /* CONFIG_HS20 */
1481
1482 ext_capab_len = wpas_build_ext_capab(wpa_s, ext_capab);
1483 if (ext_capab_len > 0) {
1484 u8 *pos = wpa_ie;
1485 if (wpa_ie_len > 0 && pos[0] == WLAN_EID_RSN)
1486 pos += 2 + pos[1];
1487 os_memmove(pos + ext_capab_len, pos,
1488 wpa_ie_len - (pos - wpa_ie));
1489 wpa_ie_len += ext_capab_len;
1490 os_memcpy(pos, ext_capab, ext_capab_len);
1491 }
1492
1493 wpa_clear_keys(wpa_s, bss ? bss->bssid : NULL);
1494 use_crypt = 1;
1495 cipher_pairwise = wpa_cipher_to_suite_driver(wpa_s->pairwise_cipher);
1496 cipher_group = wpa_cipher_to_suite_driver(wpa_s->group_cipher);
1497 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
1498 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1499 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE)
1500 use_crypt = 0;
1501 if (wpa_set_wep_keys(wpa_s, ssid)) {
1502 use_crypt = 1;
1503 wep_keys_set = 1;
1504 }
1505 }
1506 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS)
1507 use_crypt = 0;
1508
1509 #ifdef IEEE8021X_EAPOL
1510 if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1511 if ((ssid->eapol_flags &
1512 (EAPOL_FLAG_REQUIRE_KEY_UNICAST |
1513 EAPOL_FLAG_REQUIRE_KEY_BROADCAST)) == 0 &&
1514 !wep_keys_set) {
1515 use_crypt = 0;
1516 } else {
1517 /* Assume that dynamic WEP-104 keys will be used and
1518 * set cipher suites in order for drivers to expect
1519 * encryption. */
1520 cipher_pairwise = cipher_group = CIPHER_WEP104;
1521 }
1522 }
1523 #endif /* IEEE8021X_EAPOL */
1524
1525 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
1526 /* Set the key before (and later after) association */
1527 wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
1528 }
1529
1530 wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING);
1531 if (bss) {
1532 params.ssid = bss->ssid;
1533 params.ssid_len = bss->ssid_len;
1534 if (!wpas_driver_bss_selection(wpa_s) || ssid->bssid_set) {
1535 wpa_printf(MSG_DEBUG, "Limit connection to BSSID "
1536 MACSTR " freq=%u MHz based on scan results "
1537 "(bssid_set=%d)",
1538 MAC2STR(bss->bssid), bss->freq,
1539 ssid->bssid_set);
1540 params.bssid = bss->bssid;
1541 params.freq = bss->freq;
1542 }
1543 } else {
1544 params.ssid = ssid->ssid;
1545 params.ssid_len = ssid->ssid_len;
1546 }
1547
1548 if (ssid->mode == WPAS_MODE_IBSS && ssid->bssid_set &&
1549 wpa_s->conf->ap_scan == 2) {
1550 params.bssid = ssid->bssid;
1551 params.fixed_bssid = 1;
1552 }
1553
1554 if (ssid->mode == WPAS_MODE_IBSS && ssid->frequency > 0 &&
1555 params.freq == 0)
1556 params.freq = ssid->frequency; /* Initial channel for IBSS */
1557 params.wpa_ie = wpa_ie;
1558 params.wpa_ie_len = wpa_ie_len;
1559 params.pairwise_suite = cipher_pairwise;
1560 params.group_suite = cipher_group;
1561 params.key_mgmt_suite = key_mgmt2driver(wpa_s->key_mgmt);
1562 params.wpa_proto = wpa_s->wpa_proto;
1563 params.auth_alg = algs;
1564 params.mode = ssid->mode;
1565 params.bg_scan_period = ssid->bg_scan_period;
1566 for (i = 0; i < NUM_WEP_KEYS; i++) {
1567 if (ssid->wep_key_len[i])
1568 params.wep_key[i] = ssid->wep_key[i];
1569 params.wep_key_len[i] = ssid->wep_key_len[i];
1570 }
1571 params.wep_tx_keyidx = ssid->wep_tx_keyidx;
1572
1573 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) &&
1574 (params.key_mgmt_suite == KEY_MGMT_PSK ||
1575 params.key_mgmt_suite == KEY_MGMT_FT_PSK)) {
1576 params.passphrase = ssid->passphrase;
1577 if (ssid->psk_set)
1578 params.psk = ssid->psk;
1579 }
1580
1581 params.drop_unencrypted = use_crypt;
1582
1583 #ifdef CONFIG_IEEE80211W
1584 params.mgmt_frame_protection =
1585 ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT ?
1586 wpa_s->conf->pmf : ssid->ieee80211w;
1587 if (params.mgmt_frame_protection != NO_MGMT_FRAME_PROTECTION && bss) {
1588 const u8 *rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
1589 struct wpa_ie_data ie;
1590 if (rsn && wpa_parse_wpa_ie(rsn, 2 + rsn[1], &ie) == 0 &&
1591 ie.capabilities &
1592 (WPA_CAPABILITY_MFPC | WPA_CAPABILITY_MFPR)) {
1593 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected AP supports "
1594 "MFP: require MFP");
1595 params.mgmt_frame_protection =
1596 MGMT_FRAME_PROTECTION_REQUIRED;
1597 }
1598 }
1599 #endif /* CONFIG_IEEE80211W */
1600
1601 params.p2p = ssid->p2p_group;
1602
1603 if (wpa_s->parent->set_sta_uapsd)
1604 params.uapsd = wpa_s->parent->sta_uapsd;
1605 else
1606 params.uapsd = -1;
1607
1608 #ifdef CONFIG_HT_OVERRIDES
1609 os_memset(&htcaps, 0, sizeof(htcaps));
1610 os_memset(&htcaps_mask, 0, sizeof(htcaps_mask));
1611 params.htcaps = (u8 *) &htcaps;
1612 params.htcaps_mask = (u8 *) &htcaps_mask;
1613 wpa_supplicant_apply_ht_overrides(wpa_s, ssid, &params);
1614 #endif /* CONFIG_HT_OVERRIDES */
1615
1616 ret = wpa_drv_associate(wpa_s, &params);
1617 if (ret < 0) {
1618 wpa_msg(wpa_s, MSG_INFO, "Association request to the driver "
1619 "failed");
1620 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SANE_ERROR_CODES) {
1621 /*
1622 * The driver is known to mean what is saying, so we
1623 * can stop right here; the association will not
1624 * succeed.
1625 */
1626 wpas_connection_failed(wpa_s, wpa_s->pending_bssid);
1627 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
1628 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
1629 return;
1630 }
1631 /* try to continue anyway; new association will be tried again
1632 * after timeout */
1633 assoc_failed = 1;
1634 }
1635
1636 if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
1637 /* Set the key after the association just in case association
1638 * cleared the previously configured key. */
1639 wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
1640 /* No need to timeout authentication since there is no key
1641 * management. */
1642 wpa_supplicant_cancel_auth_timeout(wpa_s);
1643 wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
1644 #ifdef CONFIG_IBSS_RSN
1645 } else if (ssid->mode == WPAS_MODE_IBSS &&
1646 wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
1647 wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
1648 /*
1649 * RSN IBSS authentication is per-STA and we can disable the
1650 * per-BSSID authentication.
1651 */
1652 wpa_supplicant_cancel_auth_timeout(wpa_s);
1653 #endif /* CONFIG_IBSS_RSN */
1654 } else {
1655 /* Timeout for IEEE 802.11 authentication and association */
1656 int timeout = 60;
1657
1658 if (assoc_failed) {
1659 /* give IBSS a bit more time */
1660 timeout = ssid->mode == WPAS_MODE_IBSS ? 10 : 5;
1661 } else if (wpa_s->conf->ap_scan == 1) {
1662 /* give IBSS a bit more time */
1663 timeout = ssid->mode == WPAS_MODE_IBSS ? 20 : 10;
1664 }
1665 wpa_supplicant_req_auth_timeout(wpa_s, timeout, 0);
1666 }
1667
1668 if (wep_keys_set && wpa_drv_get_capa(wpa_s, &capa) == 0 &&
1669 capa.flags & WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC) {
1670 /* Set static WEP keys again */
1671 wpa_set_wep_keys(wpa_s, ssid);
1672 }
1673
1674 if (wpa_s->current_ssid && wpa_s->current_ssid != ssid) {
1675 /*
1676 * Do not allow EAP session resumption between different
1677 * network configurations.
1678 */
1679 eapol_sm_invalidate_cached_session(wpa_s->eapol);
1680 }
1681 old_ssid = wpa_s->current_ssid;
1682 wpa_s->current_ssid = ssid;
1683 wpa_s->current_bss = bss;
1684 wpa_supplicant_rsn_supp_set_config(wpa_s, wpa_s->current_ssid);
1685 wpa_supplicant_initiate_eapol(wpa_s);
1686 if (old_ssid != wpa_s->current_ssid)
1687 wpas_notify_network_changed(wpa_s);
1688 }
1689
1690
1691 static void wpa_supplicant_clear_connection(struct wpa_supplicant *wpa_s,
1692 const u8 *addr)
1693 {
1694 struct wpa_ssid *old_ssid;
1695
1696 wpa_clear_keys(wpa_s, addr);
1697 old_ssid = wpa_s->current_ssid;
1698 wpa_supplicant_mark_disassoc(wpa_s);
1699 wpa_sm_set_config(wpa_s->wpa, NULL);
1700 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
1701 if (old_ssid != wpa_s->current_ssid)
1702 wpas_notify_network_changed(wpa_s);
1703 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
1704 }
1705
1706
1707 /**
1708 * wpa_supplicant_deauthenticate - Deauthenticate the current connection
1709 * @wpa_s: Pointer to wpa_supplicant data
1710 * @reason_code: IEEE 802.11 reason code for the deauthenticate frame
1711 *
1712 * This function is used to request %wpa_supplicant to deauthenticate from the
1713 * current AP.
1714 */
1715 void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
1716 int reason_code)
1717 {
1718 u8 *addr = NULL;
1719 union wpa_event_data event;
1720 int zero_addr = 0;
1721
1722 wpa_dbg(wpa_s, MSG_DEBUG, "Request to deauthenticate - bssid=" MACSTR
1723 " pending_bssid=" MACSTR " reason=%d state=%s",
1724 MAC2STR(wpa_s->bssid), MAC2STR(wpa_s->pending_bssid),
1725 reason_code, wpa_supplicant_state_txt(wpa_s->wpa_state));
1726
1727 if (!is_zero_ether_addr(wpa_s->bssid))
1728 addr = wpa_s->bssid;
1729 else if (!is_zero_ether_addr(wpa_s->pending_bssid) &&
1730 (wpa_s->wpa_state == WPA_AUTHENTICATING ||
1731 wpa_s->wpa_state == WPA_ASSOCIATING))
1732 addr = wpa_s->pending_bssid;
1733 else if (wpa_s->wpa_state == WPA_ASSOCIATING) {
1734 /*
1735 * When using driver-based BSS selection, we may not know the
1736 * BSSID with which we are currently trying to associate. We
1737 * need to notify the driver of this disconnection even in such
1738 * a case, so use the all zeros address here.
1739 */
1740 addr = wpa_s->bssid;
1741 zero_addr = 1;
1742 }
1743
1744 #ifdef CONFIG_TDLS
1745 wpa_tdls_teardown_peers(wpa_s->wpa);
1746 #endif /* CONFIG_TDLS */
1747
1748 if (addr) {
1749 wpa_drv_deauthenticate(wpa_s, addr, reason_code);
1750 os_memset(&event, 0, sizeof(event));
1751 event.deauth_info.reason_code = (u16) reason_code;
1752 event.deauth_info.locally_generated = 1;
1753 wpa_supplicant_event(wpa_s, EVENT_DEAUTH, &event);
1754 if (zero_addr)
1755 addr = NULL;
1756 }
1757
1758 wpa_supplicant_clear_connection(wpa_s, addr);
1759 }
1760
1761 static void wpa_supplicant_enable_one_network(struct wpa_supplicant *wpa_s,
1762 struct wpa_ssid *ssid)
1763 {
1764 if (!ssid || !ssid->disabled || ssid->disabled == 2)
1765 return;
1766
1767 ssid->disabled = 0;
1768 wpas_clear_temp_disabled(wpa_s, ssid, 1);
1769 wpas_notify_network_enabled_changed(wpa_s, ssid);
1770
1771 /*
1772 * Try to reassociate since there is no current configuration and a new
1773 * network was made available.
1774 */
1775 if (!wpa_s->current_ssid)
1776 wpa_s->reassociate = 1;
1777 }
1778
1779
1780 /**
1781 * wpa_supplicant_enable_network - Mark a configured network as enabled
1782 * @wpa_s: wpa_supplicant structure for a network interface
1783 * @ssid: wpa_ssid structure for a configured network or %NULL
1784 *
1785 * Enables the specified network or all networks if no network specified.
1786 */
1787 void wpa_supplicant_enable_network(struct wpa_supplicant *wpa_s,
1788 struct wpa_ssid *ssid)
1789 {
1790 if (ssid == NULL) {
1791 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
1792 wpa_supplicant_enable_one_network(wpa_s, ssid);
1793 } else
1794 wpa_supplicant_enable_one_network(wpa_s, ssid);
1795
1796 if (wpa_s->reassociate) {
1797 if (wpa_s->sched_scanning) {
1798 wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan to add "
1799 "new network to scan filters");
1800 wpa_supplicant_cancel_sched_scan(wpa_s);
1801 }
1802
1803 wpa_supplicant_req_scan(wpa_s, 0, 0);
1804 }
1805 }
1806
1807
1808 /**
1809 * wpa_supplicant_disable_network - Mark a configured network as disabled
1810 * @wpa_s: wpa_supplicant structure for a network interface
1811 * @ssid: wpa_ssid structure for a configured network or %NULL
1812 *
1813 * Disables the specified network or all networks if no network specified.
1814 */
1815 void wpa_supplicant_disable_network(struct wpa_supplicant *wpa_s,
1816 struct wpa_ssid *ssid)
1817 {
1818 struct wpa_ssid *other_ssid;
1819 int was_disabled;
1820
1821 if (ssid == NULL) {
1822 if (wpa_s->sched_scanning)
1823 wpa_supplicant_cancel_sched_scan(wpa_s);
1824
1825 for (other_ssid = wpa_s->conf->ssid; other_ssid;
1826 other_ssid = other_ssid->next) {
1827 was_disabled = other_ssid->disabled;
1828 if (was_disabled == 2)
1829 continue; /* do not change persistent P2P group
1830 * data */
1831
1832 other_ssid->disabled = 1;
1833
1834 if (was_disabled != other_ssid->disabled)
1835 wpas_notify_network_enabled_changed(
1836 wpa_s, other_ssid);
1837 }
1838 if (wpa_s->current_ssid)
1839 wpa_supplicant_deauthenticate(
1840 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
1841 } else if (ssid->disabled != 2) {
1842 if (ssid == wpa_s->current_ssid)
1843 wpa_supplicant_deauthenticate(
1844 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
1845
1846 was_disabled = ssid->disabled;
1847
1848 ssid->disabled = 1;
1849
1850 if (was_disabled != ssid->disabled) {
1851 wpas_notify_network_enabled_changed(wpa_s, ssid);
1852 if (wpa_s->sched_scanning) {
1853 wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan "
1854 "to remove network from filters");
1855 wpa_supplicant_cancel_sched_scan(wpa_s);
1856 wpa_supplicant_req_scan(wpa_s, 0, 0);
1857 }
1858 }
1859 }
1860 }
1861
1862
1863 /**
1864 * wpa_supplicant_select_network - Attempt association with a network
1865 * @wpa_s: wpa_supplicant structure for a network interface
1866 * @ssid: wpa_ssid structure for a configured network or %NULL for any network
1867 */
1868 void wpa_supplicant_select_network(struct wpa_supplicant *wpa_s,
1869 struct wpa_ssid *ssid)
1870 {
1871
1872 struct wpa_ssid *other_ssid;
1873 int disconnected = 0;
1874
1875 if (ssid && ssid != wpa_s->current_ssid && wpa_s->current_ssid) {
1876 wpa_supplicant_deauthenticate(
1877 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
1878 disconnected = 1;
1879 }
1880
1881 if (ssid)
1882 wpas_clear_temp_disabled(wpa_s, ssid, 1);
1883
1884 /*
1885 * Mark all other networks disabled or mark all networks enabled if no
1886 * network specified.
1887 */
1888 for (other_ssid = wpa_s->conf->ssid; other_ssid;
1889 other_ssid = other_ssid->next) {
1890 int was_disabled = other_ssid->disabled;
1891 if (was_disabled == 2)
1892 continue; /* do not change persistent P2P group data */
1893
1894 other_ssid->disabled = ssid ? (ssid->id != other_ssid->id) : 0;
1895 if (was_disabled && !other_ssid->disabled)
1896 wpas_clear_temp_disabled(wpa_s, other_ssid, 0);
1897
1898 if (was_disabled != other_ssid->disabled)
1899 wpas_notify_network_enabled_changed(wpa_s, other_ssid);
1900 }
1901
1902 if (ssid && ssid == wpa_s->current_ssid && wpa_s->current_ssid) {
1903 /* We are already associated with the selected network */
1904 wpa_printf(MSG_DEBUG, "Already associated with the "
1905 "selected network - do nothing");
1906 return;
1907 }
1908
1909 if (ssid)
1910 wpa_s->current_ssid = ssid;
1911 wpa_s->connect_without_scan = NULL;
1912 wpa_s->disconnected = 0;
1913 wpa_s->reassociate = 1;
1914
1915 if (wpa_supplicant_fast_associate(wpa_s) != 1)
1916 wpa_supplicant_req_scan(wpa_s, 0, disconnected ? 100000 : 0);
1917
1918 if (ssid)
1919 wpas_notify_network_selected(wpa_s, ssid);
1920 }
1921
1922
1923 /**
1924 * wpa_supplicant_set_ap_scan - Set AP scan mode for interface
1925 * @wpa_s: wpa_supplicant structure for a network interface
1926 * @ap_scan: AP scan mode
1927 * Returns: 0 if succeed or -1 if ap_scan has an invalid value
1928 *
1929 */
1930 int wpa_supplicant_set_ap_scan(struct wpa_supplicant *wpa_s, int ap_scan)
1931 {
1932
1933 int old_ap_scan;
1934
1935 if (ap_scan < 0 || ap_scan > 2)
1936 return -1;
1937
1938 #ifdef ANDROID
1939 if (ap_scan == 2 && ap_scan != wpa_s->conf->ap_scan &&
1940 wpa_s->wpa_state >= WPA_ASSOCIATING &&
1941 wpa_s->wpa_state < WPA_COMPLETED) {
1942 wpa_printf(MSG_ERROR, "ap_scan = %d (%d) rejected while "
1943 "associating", wpa_s->conf->ap_scan, ap_scan);
1944 return 0;
1945 }
1946 #endif /* ANDROID */
1947
1948 old_ap_scan = wpa_s->conf->ap_scan;
1949 wpa_s->conf->ap_scan = ap_scan;
1950
1951 if (old_ap_scan != wpa_s->conf->ap_scan)
1952 wpas_notify_ap_scan_changed(wpa_s);
1953
1954 return 0;
1955 }
1956
1957
1958 /**
1959 * wpa_supplicant_set_bss_expiration_age - Set BSS entry expiration age
1960 * @wpa_s: wpa_supplicant structure for a network interface
1961 * @expire_age: Expiration age in seconds
1962 * Returns: 0 if succeed or -1 if expire_age has an invalid value
1963 *
1964 */
1965 int wpa_supplicant_set_bss_expiration_age(struct wpa_supplicant *wpa_s,
1966 unsigned int bss_expire_age)
1967 {
1968 if (bss_expire_age < 10) {
1969 wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration age %u",
1970 bss_expire_age);
1971 return -1;
1972 }
1973 wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration age: %d sec",
1974 bss_expire_age);
1975 wpa_s->conf->bss_expiration_age = bss_expire_age;
1976
1977 return 0;
1978 }
1979
1980
1981 /**
1982 * wpa_supplicant_set_bss_expiration_count - Set BSS entry expiration scan count
1983 * @wpa_s: wpa_supplicant structure for a network interface
1984 * @expire_count: number of scans after which an unseen BSS is reclaimed
1985 * Returns: 0 if succeed or -1 if expire_count has an invalid value
1986 *
1987 */
1988 int wpa_supplicant_set_bss_expiration_count(struct wpa_supplicant *wpa_s,
1989 unsigned int bss_expire_count)
1990 {
1991 if (bss_expire_count < 1) {
1992 wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration count %u",
1993 bss_expire_count);
1994 return -1;
1995 }
1996 wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration scan count: %u",
1997 bss_expire_count);
1998 wpa_s->conf->bss_expiration_scan_count = bss_expire_count;
1999
2000 return 0;
2001 }
2002
2003
2004 /**
2005 * wpa_supplicant_set_scan_interval - Set scan interval
2006 * @wpa_s: wpa_supplicant structure for a network interface
2007 * @scan_interval: scan interval in seconds
2008 * Returns: 0 if succeed or -1 if scan_interval has an invalid value
2009 *
2010 */
2011 int wpa_supplicant_set_scan_interval(struct wpa_supplicant *wpa_s,
2012 int scan_interval)
2013 {
2014 if (scan_interval < 0) {
2015 wpa_msg(wpa_s, MSG_ERROR, "Invalid scan interval %d",
2016 scan_interval);
2017 return -1;
2018 }
2019 wpa_msg(wpa_s, MSG_DEBUG, "Setting scan interval: %d sec",
2020 scan_interval);
2021 wpa_supplicant_update_scan_int(wpa_s, scan_interval);
2022
2023 return 0;
2024 }
2025
2026
2027 /**
2028 * wpa_supplicant_set_debug_params - Set global debug params
2029 * @global: wpa_global structure
2030 * @debug_level: debug level
2031 * @debug_timestamp: determines if show timestamp in debug data
2032 * @debug_show_keys: determines if show keys in debug data
2033 * Returns: 0 if succeed or -1 if debug_level has wrong value
2034 */
2035 int wpa_supplicant_set_debug_params(struct wpa_global *global, int debug_level,
2036 int debug_timestamp, int debug_show_keys)
2037 {
2038
2039 int old_level, old_timestamp, old_show_keys;
2040
2041 /* check for allowed debuglevels */
2042 if (debug_level != MSG_EXCESSIVE &&
2043 debug_level != MSG_MSGDUMP &&
2044 debug_level != MSG_DEBUG &&
2045 debug_level != MSG_INFO &&
2046 debug_level != MSG_WARNING &&
2047 debug_level != MSG_ERROR)
2048 return -1;
2049
2050 old_level = wpa_debug_level;
2051 old_timestamp = wpa_debug_timestamp;
2052 old_show_keys = wpa_debug_show_keys;
2053
2054 wpa_debug_level = debug_level;
2055 wpa_debug_timestamp = debug_timestamp ? 1 : 0;
2056 wpa_debug_show_keys = debug_show_keys ? 1 : 0;
2057
2058 if (wpa_debug_level != old_level)
2059 wpas_notify_debug_level_changed(global);
2060 if (wpa_debug_timestamp != old_timestamp)
2061 wpas_notify_debug_timestamp_changed(global);
2062 if (wpa_debug_show_keys != old_show_keys)
2063 wpas_notify_debug_show_keys_changed(global);
2064
2065 return 0;
2066 }
2067
2068
2069 /**
2070 * wpa_supplicant_get_ssid - Get a pointer to the current network structure
2071 * @wpa_s: Pointer to wpa_supplicant data
2072 * Returns: A pointer to the current network structure or %NULL on failure
2073 */
2074 struct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s)
2075 {
2076 struct wpa_ssid *entry;
2077 u8 ssid[MAX_SSID_LEN];
2078 int res;
2079 size_t ssid_len;
2080 u8 bssid[ETH_ALEN];
2081 int wired;
2082
2083 res = wpa_drv_get_ssid(wpa_s, ssid);
2084 if (res < 0) {
2085 wpa_msg(wpa_s, MSG_WARNING, "Could not read SSID from "
2086 "driver");
2087 return NULL;
2088 }
2089 ssid_len = res;
2090
2091 if (wpa_drv_get_bssid(wpa_s, bssid) < 0) {
2092 wpa_msg(wpa_s, MSG_WARNING, "Could not read BSSID from "
2093 "driver");
2094 return NULL;
2095 }
2096
2097 wired = wpa_s->conf->ap_scan == 0 &&
2098 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED);
2099
2100 entry = wpa_s->conf->ssid;
2101 while (entry) {
2102 if (!wpas_network_disabled(wpa_s, entry) &&
2103 ((ssid_len == entry->ssid_len &&
2104 os_memcmp(ssid, entry->ssid, ssid_len) == 0) || wired) &&
2105 (!entry->bssid_set ||
2106 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
2107 return entry;
2108 #ifdef CONFIG_WPS
2109 if (!wpas_network_disabled(wpa_s, entry) &&
2110 (entry->key_mgmt & WPA_KEY_MGMT_WPS) &&
2111 (entry->ssid == NULL || entry->ssid_len == 0) &&
2112 (!entry->bssid_set ||
2113 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
2114 return entry;
2115 #endif /* CONFIG_WPS */
2116
2117 if (!wpas_network_disabled(wpa_s, entry) && entry->bssid_set &&
2118 entry->ssid_len == 0 &&
2119 os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0)
2120 return entry;
2121
2122 entry = entry->next;
2123 }
2124
2125 return NULL;
2126 }
2127
2128
2129 static int select_driver(struct wpa_supplicant *wpa_s, int i)
2130 {
2131 struct wpa_global *global = wpa_s->global;
2132
2133 if (wpa_drivers[i]->global_init && global->drv_priv[i] == NULL) {
2134 global->drv_priv[i] = wpa_drivers[i]->global_init();
2135 if (global->drv_priv[i] == NULL) {
2136 wpa_printf(MSG_ERROR, "Failed to initialize driver "
2137 "'%s'", wpa_drivers[i]->name);
2138 return -1;
2139 }
2140 }
2141
2142 wpa_s->driver = wpa_drivers[i];
2143 wpa_s->global_drv_priv = global->drv_priv[i];
2144
2145 return 0;
2146 }
2147
2148
2149 static int wpa_supplicant_set_driver(struct wpa_supplicant *wpa_s,
2150 const char *name)
2151 {
2152 int i;
2153 size_t len;
2154 const char *pos, *driver = name;
2155
2156 if (wpa_s == NULL)
2157 return -1;
2158
2159 if (wpa_drivers[0] == NULL) {
2160 wpa_msg(wpa_s, MSG_ERROR, "No driver interfaces build into "
2161 "wpa_supplicant");
2162 return -1;
2163 }
2164
2165 if (name == NULL) {
2166 /* default to first driver in the list */
2167 return select_driver(wpa_s, 0);
2168 }
2169
2170 do {
2171 pos = os_strchr(driver, ',');
2172 if (pos)
2173 len = pos - driver;
2174 else
2175 len = os_strlen(driver);
2176
2177 for (i = 0; wpa_drivers[i]; i++) {
2178 if (os_strlen(wpa_drivers[i]->name) == len &&
2179 os_strncmp(driver, wpa_drivers[i]->name, len) ==
2180 0) {
2181 /* First driver that succeeds wins */
2182 if (select_driver(wpa_s, i) == 0)
2183 return 0;
2184 }
2185 }
2186
2187 driver = pos + 1;
2188 } while (pos);
2189
2190 wpa_msg(wpa_s, MSG_ERROR, "Unsupported driver '%s'", name);
2191 return -1;
2192 }
2193
2194
2195 /**
2196 * wpa_supplicant_rx_eapol - Deliver a received EAPOL frame to wpa_supplicant
2197 * @ctx: Context pointer (wpa_s); this is the ctx variable registered
2198 * with struct wpa_driver_ops::init()
2199 * @src_addr: Source address of the EAPOL frame
2200 * @buf: EAPOL data starting from the EAPOL header (i.e., no Ethernet header)
2201 * @len: Length of the EAPOL data
2202 *
2203 * This function is called for each received EAPOL frame. Most driver
2204 * interfaces rely on more generic OS mechanism for receiving frames through
2205 * l2_packet, but if such a mechanism is not available, the driver wrapper may
2206 * take care of received EAPOL frames and deliver them to the core supplicant
2207 * code by calling this function.
2208 */
2209 void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr,
2210 const u8 *buf, size_t len)
2211 {
2212 struct wpa_supplicant *wpa_s = ctx;
2213
2214 wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR, MAC2STR(src_addr));
2215 wpa_hexdump(MSG_MSGDUMP, "RX EAPOL", buf, len);
2216
2217 if (wpa_s->wpa_state < WPA_ASSOCIATED ||
2218 (wpa_s->last_eapol_matches_bssid &&
2219 #ifdef CONFIG_AP
2220 !wpa_s->ap_iface &&
2221 #endif /* CONFIG_AP */
2222 os_memcmp(src_addr, wpa_s->bssid, ETH_ALEN) != 0)) {
2223 /*
2224 * There is possible race condition between receiving the
2225 * association event and the EAPOL frame since they are coming
2226 * through different paths from the driver. In order to avoid
2227 * issues in trying to process the EAPOL frame before receiving
2228 * association information, lets queue it for processing until
2229 * the association event is received. This may also be needed in
2230 * driver-based roaming case, so also use src_addr != BSSID as a
2231 * trigger if we have previously confirmed that the
2232 * Authenticator uses BSSID as the src_addr (which is not the
2233 * case with wired IEEE 802.1X).
2234 */
2235 wpa_dbg(wpa_s, MSG_DEBUG, "Not associated - Delay processing "
2236 "of received EAPOL frame (state=%s bssid=" MACSTR ")",
2237 wpa_supplicant_state_txt(wpa_s->wpa_state),
2238 MAC2STR(wpa_s->bssid));
2239 wpabuf_free(wpa_s->pending_eapol_rx);
2240 wpa_s->pending_eapol_rx = wpabuf_alloc_copy(buf, len);
2241 if (wpa_s->pending_eapol_rx) {
2242 os_get_time(&wpa_s->pending_eapol_rx_time);
2243 os_memcpy(wpa_s->pending_eapol_rx_src, src_addr,
2244 ETH_ALEN);
2245 }
2246 return;
2247 }
2248
2249 wpa_s->last_eapol_matches_bssid =
2250 os_memcmp(src_addr, wpa_s->bssid, ETH_ALEN) == 0;
2251
2252 #ifdef CONFIG_AP
2253 if (wpa_s->ap_iface) {
2254 wpa_supplicant_ap_rx_eapol(wpa_s, src_addr, buf, len);
2255 return;
2256 }
2257 #endif /* CONFIG_AP */
2258
2259 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE) {
2260 wpa_dbg(wpa_s, MSG_DEBUG, "Ignored received EAPOL frame since "
2261 "no key management is configured");
2262 return;
2263 }
2264
2265 if (wpa_s->eapol_received == 0 &&
2266 (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) ||
2267 !wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) ||
2268 wpa_s->wpa_state != WPA_COMPLETED) &&
2269 (wpa_s->current_ssid == NULL ||
2270 wpa_s->current_ssid->mode != IEEE80211_MODE_IBSS)) {
2271 /* Timeout for completing IEEE 802.1X and WPA authentication */
2272 wpa_supplicant_req_auth_timeout(
2273 wpa_s,
2274 (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) ||
2275 wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA ||
2276 wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) ?
2277 70 : 10, 0);
2278 }
2279 wpa_s->eapol_received++;
2280
2281 if (wpa_s->countermeasures) {
2282 wpa_msg(wpa_s, MSG_INFO, "WPA: Countermeasures - dropped "
2283 "EAPOL packet");
2284 return;
2285 }
2286
2287 #ifdef CONFIG_IBSS_RSN
2288 if (wpa_s->current_ssid &&
2289 wpa_s->current_ssid->mode == WPAS_MODE_IBSS) {
2290 ibss_rsn_rx_eapol(wpa_s->ibss_rsn, src_addr, buf, len);
2291 return;
2292 }
2293 #endif /* CONFIG_IBSS_RSN */
2294
2295 /* Source address of the incoming EAPOL frame could be compared to the
2296 * current BSSID. However, it is possible that a centralized
2297 * Authenticator could be using another MAC address than the BSSID of
2298 * an AP, so just allow any address to be used for now. The replies are
2299 * still sent to the current BSSID (if available), though. */
2300
2301 os_memcpy(wpa_s->last_eapol_src, src_addr, ETH_ALEN);
2302 if (!wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) &&
2303 eapol_sm_rx_eapol(wpa_s->eapol, src_addr, buf, len) > 0)
2304 return;
2305 wpa_drv_poll(wpa_s);
2306 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE))
2307 wpa_sm_rx_eapol(wpa_s->wpa, src_addr, buf, len);
2308 else if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt)) {
2309 /*
2310 * Set portValid = TRUE here since we are going to skip 4-way
2311 * handshake processing which would normally set portValid. We
2312 * need this to allow the EAPOL state machines to be completed
2313 * without going through EAPOL-Key handshake.
2314 */
2315 eapol_sm_notify_portValid(wpa_s->eapol, TRUE);
2316 }
2317 }
2318
2319
2320 int wpa_supplicant_update_mac_addr(struct wpa_supplicant *wpa_s)
2321 {
2322 if (wpa_s->driver->send_eapol) {
2323 const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
2324 if (addr)
2325 os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
2326 } else if (!(wpa_s->drv_flags &
2327 WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE)) {
2328 l2_packet_deinit(wpa_s->l2);
2329 wpa_s->l2 = l2_packet_init(wpa_s->ifname,
2330 wpa_drv_get_mac_addr(wpa_s),
2331 ETH_P_EAPOL,
2332 wpa_supplicant_rx_eapol, wpa_s, 0);
2333 if (wpa_s->l2 == NULL)
2334 return -1;
2335 } else {
2336 const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
2337 if (addr)
2338 os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
2339 }
2340
2341 if (wpa_s->l2 && l2_packet_get_own_addr(wpa_s->l2, wpa_s->own_addr)) {
2342 wpa_msg(wpa_s, MSG_ERROR, "Failed to get own L2 address");
2343 return -1;
2344 }
2345
2346 wpa_dbg(wpa_s, MSG_DEBUG, "Own MAC address: " MACSTR,
2347 MAC2STR(wpa_s->own_addr));
2348 wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
2349
2350 return 0;
2351 }
2352
2353
2354 static void wpa_supplicant_rx_eapol_bridge(void *ctx, const u8 *src_addr,
2355 const u8 *buf, size_t len)
2356 {
2357 struct wpa_supplicant *wpa_s = ctx;
2358 const struct l2_ethhdr *eth;
2359
2360 if (len < sizeof(*eth))
2361 return;
2362 eth = (const struct l2_ethhdr *) buf;
2363
2364 if (os_memcmp(eth->h_dest, wpa_s->own_addr, ETH_ALEN) != 0 &&
2365 !(eth->h_dest[0] & 0x01)) {
2366 wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR " to " MACSTR
2367 " (bridge - not for this interface - ignore)",
2368 MAC2STR(src_addr), MAC2STR(eth->h_dest));
2369 return;
2370 }
2371
2372 wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR " to " MACSTR
2373 " (bridge)", MAC2STR(src_addr), MAC2STR(eth->h_dest));
2374 wpa_supplicant_rx_eapol(wpa_s, src_addr, buf + sizeof(*eth),
2375 len - sizeof(*eth));
2376 }
2377
2378
2379 /**
2380 * wpa_supplicant_driver_init - Initialize driver interface parameters
2381 * @wpa_s: Pointer to wpa_supplicant data
2382 * Returns: 0 on success, -1 on failure
2383 *
2384 * This function is called to initialize driver interface parameters.
2385 * wpa_drv_init() must have been called before this function to initialize the
2386 * driver interface.
2387 */
2388 int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s)
2389 {
2390 static int interface_count = 0;
2391
2392 if (wpa_supplicant_update_mac_addr(wpa_s) < 0)
2393 return -1;
2394
2395 if (wpa_s->bridge_ifname[0]) {
2396 wpa_dbg(wpa_s, MSG_DEBUG, "Receiving packets from bridge "
2397 "interface '%s'", wpa_s->bridge_ifname);
2398 wpa_s->l2_br = l2_packet_init(wpa_s->bridge_ifname,
2399 wpa_s->own_addr,
2400 ETH_P_EAPOL,
2401 wpa_supplicant_rx_eapol_bridge,
2402 wpa_s, 1);
2403 if (wpa_s->l2_br == NULL) {
2404 wpa_msg(wpa_s, MSG_ERROR, "Failed to open l2_packet "
2405 "connection for the bridge interface '%s'",
2406 wpa_s->bridge_ifname);
2407 return -1;
2408 }
2409 }
2410
2411 wpa_clear_keys(wpa_s, NULL);
2412
2413 /* Make sure that TKIP countermeasures are not left enabled (could
2414 * happen if wpa_supplicant is killed during countermeasures. */
2415 wpa_drv_set_countermeasures(wpa_s, 0);
2416
2417 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: flushing PMKID list in the driver");
2418 wpa_drv_flush_pmkid(wpa_s);
2419
2420 wpa_s->prev_scan_ssid = WILDCARD_SSID_SCAN;
2421 wpa_s->prev_scan_wildcard = 0;
2422
2423 if (wpa_supplicant_enabled_networks(wpa_s)) {
2424 if (wpa_supplicant_delayed_sched_scan(wpa_s, interface_count,
2425 100000))
2426 wpa_supplicant_req_scan(wpa_s, interface_count,
2427 100000);
2428 interface_count++;
2429 } else
2430 wpa_supplicant_set_state(wpa_s, WPA_INACTIVE);
2431
2432 return 0;
2433 }
2434
2435
2436 static int wpa_supplicant_daemon(const char *pid_file)
2437 {
2438 wpa_printf(MSG_DEBUG, "Daemonize..");
2439 return os_daemonize(pid_file);
2440 }
2441
2442
2443 static struct wpa_supplicant * wpa_supplicant_alloc(void)
2444 {
2445 struct wpa_supplicant *wpa_s;
2446
2447 wpa_s = os_zalloc(sizeof(*wpa_s));
2448 if (wpa_s == NULL)
2449 return NULL;
2450 wpa_s->scan_req = INITIAL_SCAN_REQ;
2451 wpa_s->scan_interval = 5;
2452 wpa_s->new_connection = 1;
2453 wpa_s->parent = wpa_s;
2454 wpa_s->sched_scanning = 0;
2455
2456 return wpa_s;
2457 }
2458
2459
2460 #ifdef CONFIG_HT_OVERRIDES
2461
2462 static int wpa_set_htcap_mcs(struct wpa_supplicant *wpa_s,
2463 struct ieee80211_ht_capabilities *htcaps,
2464 struct ieee80211_ht_capabilities *htcaps_mask,
2465 const char *ht_mcs)
2466 {
2467 /* parse ht_mcs into hex array */
2468 int i;
2469 const char *tmp = ht_mcs;
2470 char *end = NULL;
2471
2472 /* If ht_mcs is null, do not set anything */
2473 if (!ht_mcs)
2474 return 0;
2475
2476 /* This is what we are setting in the kernel */
2477 os_memset(&htcaps->supported_mcs_set, 0, IEEE80211_HT_MCS_MASK_LEN);
2478
2479 wpa_msg(wpa_s, MSG_DEBUG, "set_htcap, ht_mcs -:%s:-", ht_mcs);
2480
2481 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
2482 errno = 0;
2483 long v = strtol(tmp, &end, 16);
2484 if (errno == 0) {
2485 wpa_msg(wpa_s, MSG_DEBUG,
2486 "htcap value[%i]: %ld end: %p tmp: %p",
2487 i, v, end, tmp);
2488 if (end == tmp)
2489 break;
2490
2491 htcaps->supported_mcs_set[i] = v;
2492 tmp = end;
2493 } else {
2494 wpa_msg(wpa_s, MSG_ERROR,
2495 "Failed to parse ht-mcs: %s, error: %s\n",
2496 ht_mcs, strerror(errno));
2497 return -1;
2498 }
2499 }
2500
2501 /*
2502 * If we were able to parse any values, then set mask for the MCS set.
2503 */
2504 if (i) {
2505 os_memset(&htcaps_mask->supported_mcs_set, 0xff,
2506 IEEE80211_HT_MCS_MASK_LEN - 1);
2507 /* skip the 3 reserved bits */
2508 htcaps_mask->supported_mcs_set[IEEE80211_HT_MCS_MASK_LEN - 1] =
2509 0x1f;
2510 }
2511
2512 return 0;
2513 }
2514
2515
2516 static int wpa_disable_max_amsdu(struct wpa_supplicant *wpa_s,
2517 struct ieee80211_ht_capabilities *htcaps,
2518 struct ieee80211_ht_capabilities *htcaps_mask,
2519 int disabled)
2520 {
2521 u16 msk;
2522
2523 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_max_amsdu: %d", disabled);
2524
2525 if (disabled == -1)
2526 return 0;
2527
2528 msk = host_to_le16(HT_CAP_INFO_MAX_AMSDU_SIZE);
2529 htcaps_mask->ht_capabilities_info |= msk;
2530 if (disabled)
2531 htcaps->ht_capabilities_info &= msk;
2532 else
2533 htcaps->ht_capabilities_info |= msk;
2534
2535 return 0;
2536 }
2537
2538
2539 static int wpa_set_ampdu_factor(struct wpa_supplicant *wpa_s,
2540 struct ieee80211_ht_capabilities *htcaps,
2541 struct ieee80211_ht_capabilities *htcaps_mask,
2542 int factor)
2543 {
2544 wpa_msg(wpa_s, MSG_DEBUG, "set_ampdu_factor: %d", factor);
2545
2546 if (factor == -1)
2547 return 0;
2548
2549 if (factor < 0 || factor > 3) {
2550 wpa_msg(wpa_s, MSG_ERROR, "ampdu_factor: %d out of range. "
2551 "Must be 0-3 or -1", factor);
2552 return -EINVAL;
2553 }
2554
2555 htcaps_mask->a_mpdu_params |= 0x3; /* 2 bits for factor */
2556 htcaps->a_mpdu_params &= ~0x3;
2557 htcaps->a_mpdu_params |= factor & 0x3;
2558
2559 return 0;
2560 }
2561
2562
2563 static int wpa_set_ampdu_density(struct wpa_supplicant *wpa_s,
2564 struct ieee80211_ht_capabilities *htcaps,
2565 struct ieee80211_ht_capabilities *htcaps_mask,
2566 int density)
2567 {
2568 wpa_msg(wpa_s, MSG_DEBUG, "set_ampdu_density: %d", density);
2569
2570 if (density == -1)
2571 return 0;
2572
2573 if (density < 0 || density > 7) {
2574 wpa_msg(wpa_s, MSG_ERROR,
2575 "ampdu_density: %d out of range. Must be 0-7 or -1.",
2576 density);
2577 return -EINVAL;
2578 }
2579
2580 htcaps_mask->a_mpdu_params |= 0x1C;
2581 htcaps->a_mpdu_params &= ~(0x1C);
2582 htcaps->a_mpdu_params |= (density << 2) & 0x1C;
2583
2584 return 0;
2585 }
2586
2587
2588 static int wpa_set_disable_ht40(struct wpa_supplicant *wpa_s,
2589 struct ieee80211_ht_capabilities *htcaps,
2590 struct ieee80211_ht_capabilities *htcaps_mask,
2591 int disabled)
2592 {
2593 /* Masking these out disables HT40 */
2594 u16 msk = host_to_le16(HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET |
2595 HT_CAP_INFO_SHORT_GI40MHZ);
2596
2597 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_ht40: %d", disabled);
2598
2599 if (disabled)
2600 htcaps->ht_capabilities_info &= ~msk;
2601 else
2602 htcaps->ht_capabilities_info |= msk;
2603
2604 htcaps_mask->ht_capabilities_info |= msk;
2605
2606 return 0;
2607 }
2608
2609
2610 static int wpa_set_disable_sgi(struct wpa_supplicant *wpa_s,
2611 struct ieee80211_ht_capabilities *htcaps,
2612 struct ieee80211_ht_capabilities *htcaps_mask,
2613 int disabled)
2614 {
2615 /* Masking these out disables SGI */
2616 u16 msk = host_to_le16(HT_CAP_INFO_SHORT_GI20MHZ |
2617 HT_CAP_INFO_SHORT_GI40MHZ);
2618
2619 wpa_msg(wpa_s, MSG_DEBUG, "set_disable_sgi: %d", disabled);
2620
2621 if (disabled)
2622 htcaps->ht_capabilities_info &= ~msk;
2623 else
2624 htcaps->ht_capabilities_info |= msk;
2625
2626 htcaps_mask->ht_capabilities_info |= msk;
2627
2628 return 0;
2629 }
2630
2631
2632 void wpa_supplicant_apply_ht_overrides(
2633 struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
2634 struct wpa_driver_associate_params *params)
2635 {
2636 struct ieee80211_ht_capabilities *htcaps;
2637 struct ieee80211_ht_capabilities *htcaps_mask;
2638
2639 if (!ssid)
2640 return;
2641
2642 params->disable_ht = ssid->disable_ht;
2643 if (!params->htcaps || !params->htcaps_mask)
2644 return;
2645
2646 htcaps = (struct ieee80211_ht_capabilities *) params->htcaps;
2647 htcaps_mask = (struct ieee80211_ht_capabilities *) params->htcaps_mask;
2648 wpa_set_htcap_mcs(wpa_s, htcaps, htcaps_mask, ssid->ht_mcs);
2649 wpa_disable_max_amsdu(wpa_s, htcaps, htcaps_mask,
2650 ssid->disable_max_amsdu);
2651 wpa_set_ampdu_factor(wpa_s, htcaps, htcaps_mask, ssid->ampdu_factor);
2652 wpa_set_ampdu_density(wpa_s, htcaps, htcaps_mask, ssid->ampdu_density);
2653 wpa_set_disable_ht40(wpa_s, htcaps, htcaps_mask, ssid->disable_ht40);
2654 wpa_set_disable_sgi(wpa_s, htcaps, htcaps_mask, ssid->disable_sgi);
2655 }
2656
2657 #endif /* CONFIG_HT_OVERRIDES */
2658
2659
2660 #ifdef CONFIG_VHT_OVERRIDES
2661 void wpa_supplicant_apply_vht_overrides(
2662 struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
2663 struct wpa_driver_associate_params *params)
2664 {
2665 struct ieee80211_vht_capabilities *vhtcaps;
2666 struct ieee80211_vht_capabilities *vhtcaps_mask;
2667
2668 if (!ssid)
2669 return;
2670
2671 params->disable_vht = ssid->disable_vht;
2672
2673 vhtcaps = (void *) params->vhtcaps;
2674 vhtcaps_mask = (void *) params->vhtcaps_mask;
2675
2676 if (!vhtcaps || !vhtcaps_mask)
2677 return;
2678
2679 vhtcaps->vht_capabilities_info = ssid->vht_capa;
2680 vhtcaps_mask->vht_capabilities_info = ssid->vht_capa_mask;
2681
2682 #define OVERRIDE_MCS(i) \
2683 if (ssid->vht_tx_mcs_nss_ ##i >= 0) { \
2684 vhtcaps_mask->vht_supported_mcs_set.tx_map |= \
2685 3 << 2 * (i - 1); \
2686 vhtcaps->vht_supported_mcs_set.tx_map |= \
2687 ssid->vht_tx_mcs_nss_ ##i << 2 * (i - 1); \
2688 } \
2689 if (ssid->vht_rx_mcs_nss_ ##i >= 0) { \
2690 vhtcaps_mask->vht_supported_mcs_set.rx_map |= \
2691 3 << 2 * (i - 1); \
2692 vhtcaps->vht_supported_mcs_set.rx_map |= \
2693 ssid->vht_rx_mcs_nss_ ##i << 2 * (i - 1); \
2694 }
2695
2696 OVERRIDE_MCS(1);
2697 OVERRIDE_MCS(2);
2698 OVERRIDE_MCS(3);
2699 OVERRIDE_MCS(4);
2700 OVERRIDE_MCS(5);
2701 OVERRIDE_MCS(6);
2702 OVERRIDE_MCS(7);
2703 OVERRIDE_MCS(8);
2704 }
2705 #endif /* CONFIG_VHT_OVERRIDES */
2706
2707
2708 static int pcsc_reader_init(struct wpa_supplicant *wpa_s)
2709 {
2710 #ifdef PCSC_FUNCS
2711 size_t len;
2712
2713 if (!wpa_s->conf->pcsc_reader)
2714 return 0;
2715
2716 wpa_s->scard = scard_init(SCARD_TRY_BOTH, wpa_s->conf->pcsc_reader);
2717 if (!wpa_s->scard)
2718 return 1;
2719
2720 if (wpa_s->conf->pcsc_pin &&
2721 scard_set_pin(wpa_s->scard, wpa_s->conf->pcsc_pin) < 0) {
2722 scard_deinit(wpa_s->scard);
2723 wpa_s->scard = NULL;
2724 wpa_msg(wpa_s, MSG_ERROR, "PC/SC PIN validation failed");
2725 return -1;
2726 }
2727
2728 len = sizeof(wpa_s->imsi) - 1;
2729 if (scard_get_imsi(wpa_s->scard, wpa_s->imsi, &len)) {
2730 scard_deinit(wpa_s->scard);
2731 wpa_s->scard = NULL;
2732 wpa_msg(wpa_s, MSG_ERROR, "Could not read IMSI");
2733 return -1;
2734 }
2735 wpa_s->imsi[len] = '\0';
2736
2737 wpa_s->mnc_len = scard_get_mnc_len(wpa_s->scard);
2738
2739 wpa_printf(MSG_DEBUG, "SCARD: IMSI %s (MNC length %d)",
2740 wpa_s->imsi, wpa_s->mnc_len);
2741
2742 wpa_sm_set_scard_ctx(wpa_s->wpa, wpa_s->scard);
2743 eapol_sm_register_scard_ctx(wpa_s->eapol, wpa_s->scard);
2744 #endif /* PCSC_FUNCS */
2745
2746 return 0;
2747 }
2748
2749
2750 int wpas_init_ext_pw(struct wpa_supplicant *wpa_s)
2751 {
2752 char *val, *pos;
2753
2754 ext_password_deinit(wpa_s->ext_pw);
2755 wpa_s->ext_pw = NULL;
2756 eapol_sm_set_ext_pw_ctx(wpa_s->eapol, NULL);
2757
2758 if (!wpa_s->conf->ext_password_backend)
2759 return 0;
2760
2761 val = os_strdup(wpa_s->conf->ext_password_backend);
2762 if (val == NULL)
2763 return -1;
2764 pos = os_strchr(val, ':');
2765 if (pos)
2766 *pos++ = '\0';
2767
2768 wpa_printf(MSG_DEBUG, "EXT PW: Initialize backend '%s'", val);
2769
2770 wpa_s->ext_pw = ext_password_init(val, pos);
2771 os_free(val);
2772 if (wpa_s->ext_pw == NULL) {
2773 wpa_printf(MSG_DEBUG, "EXT PW: Failed to initialize backend");
2774 return -1;
2775 }
2776 eapol_sm_set_ext_pw_ctx(wpa_s->eapol, wpa_s->ext_pw);
2777
2778 return 0;
2779 }
2780
2781
2782 static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
2783 struct wpa_interface *iface)
2784 {
2785 const char *ifname, *driver;
2786 struct wpa_driver_capa capa;
2787
2788 wpa_printf(MSG_DEBUG, "Initializing interface '%s' conf '%s' driver "
2789 "'%s' ctrl_interface '%s' bridge '%s'", iface->ifname,
2790 iface->confname ? iface->confname : "N/A",
2791 iface->driver ? iface->driver : "default",
2792 iface->ctrl_interface ? iface->ctrl_interface : "N/A",
2793 iface->bridge_ifname ? iface->bridge_ifname : "N/A");
2794
2795 if (iface->confname) {
2796 #ifdef CONFIG_BACKEND_FILE
2797 wpa_s->confname = os_rel2abs_path(iface->confname);
2798 if (wpa_s->confname == NULL) {
2799 wpa_printf(MSG_ERROR, "Failed to get absolute path "
2800 "for configuration file '%s'.",
2801 iface->confname);
2802 return -1;
2803 }
2804 wpa_printf(MSG_DEBUG, "Configuration file '%s' -> '%s'",
2805 iface->confname, wpa_s->confname);
2806 #else /* CONFIG_BACKEND_FILE */
2807 wpa_s->confname = os_strdup(iface->confname);
2808 #endif /* CONFIG_BACKEND_FILE */
2809 wpa_s->conf = wpa_config_read(wpa_s->confname, NULL);
2810 if (wpa_s->conf == NULL) {
2811 wpa_printf(MSG_ERROR, "Failed to read or parse "
2812 "configuration '%s'.", wpa_s->confname);
2813 return -1;
2814 }
2815 wpa_s->confanother = os_rel2abs_path(iface->confanother);
2816 wpa_config_read(wpa_s->confanother, wpa_s->conf);
2817
2818 /*
2819 * Override ctrl_interface and driver_param if set on command
2820 * line.
2821 */
2822 if (iface->ctrl_interface) {
2823 os_free(wpa_s->conf->ctrl_interface);
2824 wpa_s->conf->ctrl_interface =
2825 os_strdup(iface->ctrl_interface);
2826 }
2827
2828 if (iface->driver_param) {
2829 os_free(wpa_s->conf->driver_param);
2830 wpa_s->conf->driver_param =
2831 os_strdup(iface->driver_param);
2832 }
2833 } else
2834 wpa_s->conf = wpa_config_alloc_empty(iface->ctrl_interface,
2835 iface->driver_param);
2836
2837 if (wpa_s->conf == NULL) {
2838 wpa_printf(MSG_ERROR, "\nNo configuration found.");
2839 return -1;
2840 }
2841
2842 if (iface->ifname == NULL) {
2843 wpa_printf(MSG_ERROR, "\nInterface name is required.");
2844 return -1;
2845 }
2846 if (os_strlen(iface->ifname) >= sizeof(wpa_s->ifname)) {
2847 wpa_printf(MSG_ERROR, "\nToo long interface name '%s'.",
2848 iface->ifname);
2849 return -1;
2850 }
2851 os_strlcpy(wpa_s->ifname, iface->ifname, sizeof(wpa_s->ifname));
2852
2853 if (iface->bridge_ifname) {
2854 if (os_strlen(iface->bridge_ifname) >=
2855 sizeof(wpa_s->bridge_ifname)) {
2856 wpa_printf(MSG_ERROR, "\nToo long bridge interface "
2857 "name '%s'.", iface->bridge_ifname);
2858 return -1;
2859 }
2860 os_strlcpy(wpa_s->bridge_ifname, iface->bridge_ifname,
2861 sizeof(wpa_s->bridge_ifname));
2862 }
2863
2864 /* RSNA Supplicant Key Management - INITIALIZE */
2865 eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
2866 eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
2867
2868 /* Initialize driver interface and register driver event handler before
2869 * L2 receive handler so that association events are processed before
2870 * EAPOL-Key packets if both become available for the same select()
2871 * call. */
2872 driver = iface->driver;
2873 next_driver:
2874 if (wpa_supplicant_set_driver(wpa_s, driver) < 0)
2875 return -1;
2876
2877 wpa_s->drv_priv = wpa_drv_init(wpa_s, wpa_s->ifname);
2878 if (wpa_s->drv_priv == NULL) {
2879 const char *pos;
2880 pos = driver ? os_strchr(driver, ',') : NULL;
2881 if (pos) {
2882 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize "
2883 "driver interface - try next driver wrapper");
2884 driver = pos + 1;
2885 goto next_driver;
2886 }
2887 wpa_msg(wpa_s, MSG_ERROR, "Failed to initialize driver "
2888 "interface");
2889 return -1;
2890 }
2891 if (wpa_drv_set_param(wpa_s, wpa_s->conf->driver_param) < 0) {
2892 wpa_msg(wpa_s, MSG_ERROR, "Driver interface rejected "
2893 "driver_param '%s'", wpa_s->conf->driver_param);
2894 return -1;
2895 }
2896
2897 ifname = wpa_drv_get_ifname(wpa_s);
2898 if (ifname && os_strcmp(ifname, wpa_s->ifname) != 0) {
2899 wpa_dbg(wpa_s, MSG_DEBUG, "Driver interface replaced "
2900 "interface name with '%s'", ifname);
2901 os_strlcpy(wpa_s->ifname, ifname, sizeof(wpa_s->ifname));
2902 }
2903
2904 if (wpa_supplicant_init_wpa(wpa_s) < 0)
2905 return -1;
2906
2907 wpa_sm_set_ifname(wpa_s->wpa, wpa_s->ifname,
2908 wpa_s->bridge_ifname[0] ? wpa_s->bridge_ifname :
2909 NULL);
2910 wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
2911
2912 if (wpa_s->conf->dot11RSNAConfigPMKLifetime &&
2913 wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_LIFETIME,
2914 wpa_s->conf->dot11RSNAConfigPMKLifetime)) {
2915 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
2916 "dot11RSNAConfigPMKLifetime");
2917 return -1;
2918 }
2919
2920 if (wpa_s->conf->dot11RSNAConfigPMKReauthThreshold &&
2921 wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_REAUTH_THRESHOLD,
2922 wpa_s->conf->dot11RSNAConfigPMKReauthThreshold)) {
2923 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
2924 "dot11RSNAConfigPMKReauthThreshold");
2925 return -1;
2926 }
2927
2928 if (wpa_s->conf->dot11RSNAConfigSATimeout &&
2929 wpa_sm_set_param(wpa_s->wpa, RSNA_SA_TIMEOUT,
2930 wpa_s->conf->dot11RSNAConfigSATimeout)) {
2931 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
2932 "dot11RSNAConfigSATimeout");
2933 return -1;
2934 }
2935
2936 wpa_s->hw.modes = wpa_drv_get_hw_feature_data(wpa_s,
2937 &wpa_s->hw.num_modes,
2938 &wpa_s->hw.flags);
2939
2940 if (wpa_drv_get_capa(wpa_s, &capa) == 0) {
2941 wpa_s->drv_capa_known = 1;
2942 wpa_s->drv_flags = capa.flags;
2943 wpa_s->drv_enc = capa.enc;
2944 wpa_s->probe_resp_offloads = capa.probe_resp_offloads;
2945 wpa_s->max_scan_ssids = capa.max_scan_ssids;
2946 wpa_s->max_sched_scan_ssids = capa.max_sched_scan_ssids;
2947 wpa_s->sched_scan_supported = capa.sched_scan_supported;
2948 wpa_s->max_match_sets = capa.max_match_sets;
2949 wpa_s->max_remain_on_chan = capa.max_remain_on_chan;
2950 wpa_s->max_stations = capa.max_stations;
2951 wpa_s->extended_capa = capa.extended_capa;
2952 wpa_s->extended_capa_mask = capa.extended_capa_mask;
2953 wpa_s->extended_capa_len = capa.extended_capa_len;
2954 }
2955 if (wpa_s->max_remain_on_chan == 0)
2956 wpa_s->max_remain_on_chan = 1000;
2957
2958 if (wpa_supplicant_driver_init(wpa_s) < 0)
2959 return -1;
2960
2961 #ifdef CONFIG_TDLS
2962 if (wpa_tdls_init(wpa_s->wpa))
2963 return -1;
2964 #endif /* CONFIG_TDLS */
2965
2966 if (wpa_s->conf->country[0] && wpa_s->conf->country[1] &&
2967 wpa_drv_set_country(wpa_s, wpa_s->conf->country)) {
2968 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to set country");
2969 return -1;
2970 }
2971
2972 if (wpas_wps_init(wpa_s))
2973 return -1;
2974
2975 if (wpa_supplicant_init_eapol(wpa_s) < 0)
2976 return -1;
2977 wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
2978
2979 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
2980 if (wpa_s->ctrl_iface == NULL) {
2981 wpa_printf(MSG_ERROR,
2982 "Failed to initialize control interface '%s'.\n"
2983 "You may have another wpa_supplicant process "
2984 "already running or the file was\n"
2985 "left by an unclean termination of wpa_supplicant "
2986 "in which case you will need\n"
2987 "to manually remove this file before starting "
2988 "wpa_supplicant again.\n",
2989 wpa_s->conf->ctrl_interface);
2990 return -1;
2991 }
2992
2993 wpa_s->gas = gas_query_init(wpa_s);
2994 if (wpa_s->gas == NULL) {
2995 wpa_printf(MSG_ERROR, "Failed to initialize GAS query");
2996 return -1;
2997 }
2998
2999 #ifdef CONFIG_P2P
3000 if (wpas_p2p_init(wpa_s->global, wpa_s) < 0) {
3001 wpa_msg(wpa_s, MSG_ERROR, "Failed to init P2P");
3002 return -1;
3003 }
3004 #endif /* CONFIG_P2P */
3005
3006 if (wpa_bss_init(wpa_s) < 0)
3007 return -1;
3008
3009 if (pcsc_reader_init(wpa_s) < 0)
3010 return -1;
3011
3012 if (wpas_init_ext_pw(wpa_s) < 0)
3013 return -1;
3014
3015 return 0;
3016 }
3017
3018
3019 static void wpa_supplicant_deinit_iface(struct wpa_supplicant *wpa_s,
3020 int notify, int terminate)
3021 {
3022 if (wpa_s->drv_priv) {
3023 wpa_supplicant_deauthenticate(wpa_s,
3024 WLAN_REASON_DEAUTH_LEAVING);
3025
3026 wpa_drv_set_countermeasures(wpa_s, 0);
3027 wpa_clear_keys(wpa_s, NULL);
3028 }
3029
3030 wpa_supplicant_cleanup(wpa_s);
3031
3032 #ifdef CONFIG_P2P
3033 if (wpa_s == wpa_s->global->p2p_init_wpa_s && wpa_s->global->p2p) {
3034 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Disable P2P since removing "
3035 "the management interface is being removed");
3036 wpas_p2p_deinit_global(wpa_s->global);
3037 }
3038 #endif /* CONFIG_P2P */
3039
3040 if (wpa_s->drv_priv)
3041 wpa_drv_deinit(wpa_s);
3042
3043 if (notify)
3044 wpas_notify_iface_removed(wpa_s);
3045
3046 if (terminate)
3047 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TERMINATING);
3048
3049 if (wpa_s->ctrl_iface) {
3050 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
3051 wpa_s->ctrl_iface = NULL;
3052 }
3053
3054 if (wpa_s->conf != NULL) {
3055 wpa_config_free(wpa_s->conf);
3056 wpa_s->conf = NULL;
3057 }
3058 }
3059
3060
3061 /**
3062 * wpa_supplicant_add_iface - Add a new network interface
3063 * @global: Pointer to global data from wpa_supplicant_init()
3064 * @iface: Interface configuration options
3065 * Returns: Pointer to the created interface or %NULL on failure
3066 *
3067 * This function is used to add new network interfaces for %wpa_supplicant.
3068 * This can be called before wpa_supplicant_run() to add interfaces before the
3069 * main event loop has been started. In addition, new interfaces can be added
3070 * dynamically while %wpa_supplicant is already running. This could happen,
3071 * e.g., when a hotplug network adapter is inserted.
3072 */
3073 struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
3074 struct wpa_interface *iface)
3075 {
3076 struct wpa_supplicant *wpa_s;
3077 struct wpa_interface t_iface;
3078 struct wpa_ssid *ssid;
3079
3080 if (global == NULL || iface == NULL)
3081 return NULL;
3082
3083 wpa_s = wpa_supplicant_alloc();
3084 if (wpa_s == NULL)
3085 return NULL;
3086
3087 wpa_s->global = global;
3088
3089 t_iface = *iface;
3090 if (global->params.override_driver) {
3091 wpa_printf(MSG_DEBUG, "Override interface parameter: driver "
3092 "('%s' -> '%s')",
3093 iface->driver, global->params.override_driver);
3094 t_iface.driver = global->params.override_driver;
3095 }
3096 if (global->params.override_ctrl_interface) {
3097 wpa_printf(MSG_DEBUG, "Override interface parameter: "
3098 "ctrl_interface ('%s' -> '%s')",
3099 iface->ctrl_interface,
3100 global->params.override_ctrl_interface);
3101 t_iface.ctrl_interface =
3102 global->params.override_ctrl_interface;
3103 }
3104 if (wpa_supplicant_init_iface(wpa_s, &t_iface)) {
3105 wpa_printf(MSG_DEBUG, "Failed to add interface %s",
3106 iface->ifname);
3107 wpa_supplicant_deinit_iface(wpa_s, 0, 0);
3108 os_free(wpa_s);
3109 return NULL;
3110 }
3111
3112 /* Notify the control interfaces about new iface */
3113 if (wpas_notify_iface_added(wpa_s)) {
3114 wpa_supplicant_deinit_iface(wpa_s, 1, 0);
3115 os_free(wpa_s);
3116 return NULL;
3117 }
3118
3119 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
3120 wpas_notify_network_added(wpa_s, ssid);
3121
3122 wpa_s->next = global->ifaces;
3123 global->ifaces = wpa_s;
3124
3125 wpa_dbg(wpa_s, MSG_DEBUG, "Added interface %s", wpa_s->ifname);
3126 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
3127
3128 return wpa_s;
3129 }
3130
3131
3132 /**
3133 * wpa_supplicant_remove_iface - Remove a network interface
3134 * @global: Pointer to global data from wpa_supplicant_init()
3135 * @wpa_s: Pointer to the network interface to be removed
3136 * Returns: 0 if interface was removed, -1 if interface was not found
3137 *
3138 * This function can be used to dynamically remove network interfaces from
3139 * %wpa_supplicant, e.g., when a hotplug network adapter is ejected. In
3140 * addition, this function is used to remove all remaining interfaces when
3141 * %wpa_supplicant is terminated.
3142 */
3143 int wpa_supplicant_remove_iface(struct wpa_global *global,
3144 struct wpa_supplicant *wpa_s,
3145 int terminate)
3146 {
3147 struct wpa_supplicant *prev;
3148
3149 /* Remove interface from the global list of interfaces */
3150 prev = global->ifaces;
3151 if (prev == wpa_s) {
3152 global->ifaces = wpa_s->next;
3153 } else {
3154 while (prev && prev->next != wpa_s)
3155 prev = prev->next;
3156 if (prev == NULL)
3157 return -1;
3158 prev->next = wpa_s->next;
3159 }
3160
3161 wpa_dbg(wpa_s, MSG_DEBUG, "Removing interface %s", wpa_s->ifname);
3162
3163 if (global->p2p_group_formation == wpa_s)
3164 global->p2p_group_formation = NULL;
3165 if (global->p2p_invite_group == wpa_s)
3166 global->p2p_invite_group = NULL;
3167 wpa_supplicant_deinit_iface(wpa_s, 1, terminate);
3168 os_free(wpa_s);
3169
3170 return 0;
3171 }
3172
3173
3174 /**
3175 * wpa_supplicant_get_eap_mode - Get the current EAP mode
3176 * @wpa_s: Pointer to the network interface
3177 * Returns: Pointer to the eap mode or the string "UNKNOWN" if not found
3178 */
3179 const char * wpa_supplicant_get_eap_mode(struct wpa_supplicant *wpa_s)
3180 {
3181 const char *eapol_method;
3182
3183 if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) == 0 &&
3184 wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
3185 return "NO-EAP";
3186 }
3187
3188 eapol_method = eapol_sm_get_method_name(wpa_s->eapol);
3189 if (eapol_method == NULL)
3190 return "UNKNOWN-EAP";
3191
3192 return eapol_method;
3193 }
3194
3195
3196 /**
3197 * wpa_supplicant_get_iface - Get a new network interface
3198 * @global: Pointer to global data from wpa_supplicant_init()
3199 * @ifname: Interface name
3200 * Returns: Pointer to the interface or %NULL if not found
3201 */
3202 struct wpa_supplicant * wpa_supplicant_get_iface(struct wpa_global *global,
3203 const char *ifname)
3204 {
3205 struct wpa_supplicant *wpa_s;
3206
3207 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
3208 if (os_strcmp(wpa_s->ifname, ifname) == 0)
3209 return wpa_s;
3210 }
3211 return NULL;
3212 }
3213
3214
3215 #ifndef CONFIG_NO_WPA_MSG
3216 static const char * wpa_supplicant_msg_ifname_cb(void *ctx)
3217 {
3218 struct wpa_supplicant *wpa_s = ctx;
3219 if (wpa_s == NULL)
3220 return NULL;
3221 return wpa_s->ifname;
3222 }
3223 #endif /* CONFIG_NO_WPA_MSG */
3224
3225
3226 /**
3227 * wpa_supplicant_init - Initialize %wpa_supplicant
3228 * @params: Parameters for %wpa_supplicant
3229 * Returns: Pointer to global %wpa_supplicant data, or %NULL on failure
3230 *
3231 * This function is used to initialize %wpa_supplicant. After successful
3232 * initialization, the returned data pointer can be used to add and remove
3233 * network interfaces, and eventually, to deinitialize %wpa_supplicant.
3234 */
3235 struct wpa_global * wpa_supplicant_init(struct wpa_params *params)
3236 {
3237 struct wpa_global *global;
3238 int ret, i;
3239
3240 if (params == NULL)
3241 return NULL;
3242
3243 #ifdef CONFIG_DRIVER_NDIS
3244 {
3245 void driver_ndis_init_ops(void);
3246 driver_ndis_init_ops();
3247 }
3248 #endif /* CONFIG_DRIVER_NDIS */
3249
3250 #ifndef CONFIG_NO_WPA_MSG
3251 wpa_msg_register_ifname_cb(wpa_supplicant_msg_ifname_cb);
3252 #endif /* CONFIG_NO_WPA_MSG */
3253
3254 wpa_debug_open_file(params->wpa_debug_file_path);
3255 if (params->wpa_debug_syslog)
3256 wpa_debug_open_syslog();
3257 if (params->wpa_debug_tracing) {
3258 ret = wpa_debug_open_linux_tracing();
3259 if (ret) {
3260 wpa_printf(MSG_ERROR,
3261 "Failed to enable trace logging");
3262 return NULL;
3263 }
3264 }
3265
3266 ret = eap_register_methods();
3267 if (ret) {
3268 wpa_printf(MSG_ERROR, "Failed to register EAP methods");
3269 if (ret == -2)
3270 wpa_printf(MSG_ERROR, "Two or more EAP methods used "
3271 "the same EAP type.");
3272 return NULL;
3273 }
3274
3275 global = os_zalloc(sizeof(*global));
3276 if (global == NULL)
3277 return NULL;
3278 dl_list_init(&global->p2p_srv_bonjour);
3279 dl_list_init(&global->p2p_srv_upnp);
3280 global->params.daemonize = params->daemonize;
3281 global->params.wait_for_monitor = params->wait_for_monitor;
3282 global->params.dbus_ctrl_interface = params->dbus_ctrl_interface;
3283 if (params->pid_file)
3284 global->params.pid_file = os_strdup(params->pid_file);
3285 if (params->ctrl_interface)
3286 global->params.ctrl_interface =
3287 os_strdup(params->ctrl_interface);
3288 if (params->override_driver)
3289 global->params.override_driver =
3290 os_strdup(params->override_driver);
3291 if (params->override_ctrl_interface)
3292 global->params.override_ctrl_interface =
3293 os_strdup(params->override_ctrl_interface);
3294 wpa_debug_level = global->params.wpa_debug_level =
3295 params->wpa_debug_level;
3296 wpa_debug_show_keys = global->params.wpa_debug_show_keys =
3297 params->wpa_debug_show_keys;
3298 wpa_debug_timestamp = global->params.wpa_debug_timestamp =
3299 params->wpa_debug_timestamp;
3300
3301 wpa_printf(MSG_DEBUG, "wpa_supplicant v" VERSION_STR);
3302
3303 if (eloop_init()) {
3304 wpa_printf(MSG_ERROR, "Failed to initialize event loop");
3305 wpa_supplicant_deinit(global);
3306 return NULL;
3307 }
3308
3309 random_init(params->entropy_file);
3310
3311 global->ctrl_iface = wpa_supplicant_global_ctrl_iface_init(global);
3312 if (global->ctrl_iface == NULL) {
3313 wpa_supplicant_deinit(global);
3314 return NULL;
3315 }
3316
3317 if (wpas_notify_supplicant_initialized(global)) {
3318 wpa_supplicant_deinit(global);
3319 return NULL;
3320 }
3321
3322 for (i = 0; wpa_drivers[i]; i++)
3323 global->drv_count++;
3324 if (global->drv_count == 0) {
3325 wpa_printf(MSG_ERROR, "No drivers enabled");
3326 wpa_supplicant_deinit(global);
3327 return NULL;
3328 }
3329 global->drv_priv = os_zalloc(global->drv_count * sizeof(void *));
3330 if (global->drv_priv == NULL) {
3331 wpa_supplicant_deinit(global);
3332 return NULL;
3333 }
3334
3335 #ifdef CONFIG_WIFI_DISPLAY
3336 if (wifi_display_init(global) < 0) {
3337 wpa_printf(MSG_ERROR, "Failed to initialize Wi-Fi Display");
3338 wpa_supplicant_deinit(global);
3339 return NULL;
3340 }
3341 #endif /* CONFIG_WIFI_DISPLAY */
3342
3343 return global;
3344 }
3345
3346
3347 /**
3348 * wpa_supplicant_run - Run the %wpa_supplicant main event loop
3349 * @global: Pointer to global data from wpa_supplicant_init()
3350 * Returns: 0 after successful event loop run, -1 on failure
3351 *
3352 * This function starts the main event loop and continues running as long as
3353 * there are any remaining events. In most cases, this function is running as
3354 * long as the %wpa_supplicant process in still in use.
3355 */
3356 int wpa_supplicant_run(struct wpa_global *global)
3357 {
3358 struct wpa_supplicant *wpa_s;
3359
3360 if (global->params.daemonize &&
3361 wpa_supplicant_daemon(global->params.pid_file))
3362 return -1;
3363
3364 if (global->params.wait_for_monitor) {
3365 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
3366 if (wpa_s->ctrl_iface)
3367 wpa_supplicant_ctrl_iface_wait(
3368 wpa_s->ctrl_iface);
3369 }
3370
3371 eloop_register_signal_terminate(wpa_supplicant_terminate, global);
3372 eloop_register_signal_reconfig(wpa_supplicant_reconfig, global);
3373
3374 eloop_run();
3375
3376 return 0;
3377 }
3378
3379
3380 /**
3381 * wpa_supplicant_deinit - Deinitialize %wpa_supplicant
3382 * @global: Pointer to global data from wpa_supplicant_init()
3383 *
3384 * This function is called to deinitialize %wpa_supplicant and to free all
3385 * allocated resources. Remaining network interfaces will also be removed.
3386 */
3387 void wpa_supplicant_deinit(struct wpa_global *global)
3388 {
3389 int i;
3390
3391 if (global == NULL)
3392 return;
3393
3394 #ifdef CONFIG_WIFI_DISPLAY
3395 wifi_display_deinit(global);
3396 #endif /* CONFIG_WIFI_DISPLAY */
3397 #ifdef CONFIG_P2P
3398 wpas_p2p_deinit_global(global);
3399 #endif /* CONFIG_P2P */
3400
3401 while (global->ifaces)
3402 wpa_supplicant_remove_iface(global, global->ifaces, 1);
3403
3404 if (global->ctrl_iface)
3405 wpa_supplicant_global_ctrl_iface_deinit(global->ctrl_iface);
3406
3407 wpas_notify_supplicant_deinitialized(global);
3408
3409 eap_peer_unregister_methods();
3410 #ifdef CONFIG_AP
3411 eap_server_unregister_methods();
3412 #endif /* CONFIG_AP */
3413
3414 for (i = 0; wpa_drivers[i] && global->drv_priv; i++) {
3415 if (!global->drv_priv[i])
3416 continue;
3417 wpa_drivers[i]->global_deinit(global->drv_priv[i]);
3418 }
3419 os_free(global->drv_priv);
3420
3421 random_deinit();
3422
3423 eloop_destroy();
3424
3425 if (global->params.pid_file) {
3426 os_daemonize_terminate(global->params.pid_file);
3427 os_free(global->params.pid_file);
3428 }
3429 os_free(global->params.ctrl_interface);
3430 os_free(global->params.override_driver);
3431 os_free(global->params.override_ctrl_interface);
3432
3433 os_free(global->p2p_disallow_freq);
3434
3435 os_free(global);
3436 wpa_debug_close_syslog();
3437 wpa_debug_close_file();
3438 wpa_debug_close_linux_tracing();
3439 }
3440
3441
3442 void wpa_supplicant_update_config(struct wpa_supplicant *wpa_s)
3443 {
3444 if ((wpa_s->conf->changed_parameters & CFG_CHANGED_COUNTRY) &&
3445 wpa_s->conf->country[0] && wpa_s->conf->country[1]) {
3446 char country[3];
3447 country[0] = wpa_s->conf->country[0];
3448 country[1] = wpa_s->conf->country[1];
3449 country[2] = '\0';
3450 if (wpa_drv_set_country(wpa_s, country) < 0) {
3451 wpa_printf(MSG_ERROR, "Failed to set country code "
3452 "'%s'", country);
3453 }
3454 }
3455
3456 if (wpa_s->conf->changed_parameters & CFG_CHANGED_EXT_PW_BACKEND)
3457 wpas_init_ext_pw(wpa_s);
3458
3459 #ifdef CONFIG_WPS
3460 wpas_wps_update_config(wpa_s);
3461 #endif /* CONFIG_WPS */
3462
3463 #ifdef CONFIG_P2P
3464 wpas_p2p_update_config(wpa_s);
3465 #endif /* CONFIG_P2P */
3466
3467 wpa_s->conf->changed_parameters = 0;
3468 }
3469
3470
3471 static void add_freq(int *freqs, int *num_freqs, int freq)
3472 {
3473 int i;
3474
3475 for (i = 0; i < *num_freqs; i++) {
3476 if (freqs[i] == freq)
3477 return;
3478 }
3479
3480 freqs[*num_freqs] = freq;
3481 (*num_freqs)++;
3482 }
3483
3484
3485 static int * get_bss_freqs_in_ess(struct wpa_supplicant *wpa_s)
3486 {
3487 struct wpa_bss *bss, *cbss;
3488 const int max_freqs = 10;
3489 int *freqs;
3490 int num_freqs = 0;
3491
3492 freqs = os_zalloc(sizeof(int) * (max_freqs + 1));
3493 if (freqs == NULL)
3494 return NULL;
3495
3496 cbss = wpa_s->current_bss;
3497
3498 dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
3499 if (bss == cbss)
3500 continue;
3501 if (bss->ssid_len == cbss->ssid_len &&
3502 os_memcmp(bss->ssid, cbss->ssid, bss->ssid_len) == 0 &&
3503 wpa_blacklist_get(wpa_s, bss->bssid) == NULL) {
3504 add_freq(freqs, &num_freqs, bss->freq);
3505 if (num_freqs == max_freqs)
3506 break;
3507 }
3508 }
3509
3510 if (num_freqs == 0) {
3511 os_free(freqs);
3512 freqs = NULL;
3513 }
3514
3515 return freqs;
3516 }
3517
3518
3519 void wpas_connection_failed(struct wpa_supplicant *wpa_s, const u8 *bssid)
3520 {
3521 int timeout;
3522 int count;
3523 int *freqs = NULL;
3524
3525 /*
3526 * Remove possible authentication timeout since the connection failed.
3527 */
3528 eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
3529
3530 /*
3531 * Add the failed BSSID into the blacklist and speed up next scan
3532 * attempt if there could be other APs that could accept association.
3533 * The current blacklist count indicates how many times we have tried
3534 * connecting to this AP and multiple attempts mean that other APs are
3535 * either not available or has already been tried, so that we can start
3536 * increasing the delay here to avoid constant scanning.
3537 */
3538 count = wpa_blacklist_add(wpa_s, bssid);
3539 if (count == 1 && wpa_s->current_bss) {
3540 /*
3541 * This BSS was not in the blacklist before. If there is
3542 * another BSS available for the same ESS, we should try that
3543 * next. Otherwise, we may as well try this one once more
3544 * before allowing other, likely worse, ESSes to be considered.
3545 */
3546 freqs = get_bss_freqs_in_ess(wpa_s);
3547 if (freqs) {
3548 wpa_dbg(wpa_s, MSG_DEBUG, "Another BSS in this ESS "
3549 "has been seen; try it next");
3550 wpa_blacklist_add(wpa_s, bssid);
3551 /*
3552 * On the next scan, go through only the known channels
3553 * used in this ESS based on previous scans to speed up
3554 * common load balancing use case.
3555 */
3556 os_free(wpa_s->next_scan_freqs);
3557 wpa_s->next_scan_freqs = freqs;
3558 }
3559 }
3560
3561 /*
3562 * Add previous failure count in case the temporary blacklist was
3563 * cleared due to no other BSSes being available.
3564 */
3565 count += wpa_s->extra_blacklist_count;
3566
3567 switch (count) {
3568 case 1:
3569 timeout = 100;
3570 break;
3571 case 2:
3572 timeout = 500;
3573 break;
3574 case 3:
3575 timeout = 1000;
3576 break;
3577 case 4:
3578 timeout = 5000;
3579 break;
3580 default:
3581 timeout = 10000;
3582 break;
3583 }
3584
3585 wpa_dbg(wpa_s, MSG_DEBUG, "Blacklist count %d --> request scan in %d "
3586 "ms", count, timeout);
3587
3588 /*
3589 * TODO: if more than one possible AP is available in scan results,
3590 * could try the other ones before requesting a new scan.
3591 */
3592 wpa_supplicant_req_scan(wpa_s, timeout / 1000,
3593 1000 * (timeout % 1000));
3594
3595 wpas_p2p_continue_after_scan(wpa_s);
3596 }
3597
3598
3599 int wpas_driver_bss_selection(struct wpa_supplicant *wpa_s)
3600 {
3601 return wpa_s->conf->ap_scan == 2 ||
3602 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_BSS_SELECTION);
3603 }
3604
3605
3606 #if defined(CONFIG_CTRL_IFACE) || defined(CONFIG_CTRL_IFACE_DBUS_NEW)
3607 int wpa_supplicant_ctrl_iface_ctrl_rsp_handle(struct wpa_supplicant *wpa_s,
3608 struct wpa_ssid *ssid,
3609 const char *field,
3610 const char *value)
3611 {
3612 #ifdef IEEE8021X_EAPOL
3613 struct eap_peer_config *eap = &ssid->eap;
3614
3615 wpa_printf(MSG_DEBUG, "CTRL_IFACE: response handle field=%s", field);
3616 wpa_hexdump_ascii_key(MSG_DEBUG, "CTRL_IFACE: response value",
3617 (const u8 *) value, os_strlen(value));
3618
3619 switch (wpa_supplicant_ctrl_req_from_string(field)) {
3620 case WPA_CTRL_REQ_EAP_IDENTITY:
3621 os_free(eap->identity);
3622 eap->identity = (u8 *) os_strdup(value);
3623 eap->identity_len = os_strlen(value);
3624 eap->pending_req_identity = 0;
3625 if (ssid == wpa_s->current_ssid)
3626 wpa_s->reassociate = 1;
3627 break;
3628 case WPA_CTRL_REQ_EAP_PASSWORD:
3629 os_free(eap->password);
3630 eap->password = (u8 *) os_strdup(value);
3631 eap->password_len = os_strlen(value);
3632 eap->pending_req_password = 0;
3633 if (ssid == wpa_s->current_ssid)
3634 wpa_s->reassociate = 1;
3635 break;
3636 case WPA_CTRL_REQ_EAP_NEW_PASSWORD:
3637 os_free(eap->new_password);
3638 eap->new_password = (u8 *) os_strdup(value);
3639 eap->new_password_len = os_strlen(value);
3640 eap->pending_req_new_password = 0;
3641 if (ssid == wpa_s->current_ssid)
3642 wpa_s->reassociate = 1;
3643 break;
3644 case WPA_CTRL_REQ_EAP_PIN:
3645 os_free(eap->pin);
3646 eap->pin = os_strdup(value);
3647 eap->pending_req_pin = 0;
3648 if (ssid == wpa_s->current_ssid)
3649 wpa_s->reassociate = 1;
3650 break;
3651 case WPA_CTRL_REQ_EAP_OTP:
3652 os_free(eap->otp);
3653 eap->otp = (u8 *) os_strdup(value);
3654 eap->otp_len = os_strlen(value);
3655 os_free(eap->pending_req_otp);
3656 eap->pending_req_otp = NULL;
3657 eap->pending_req_otp_len = 0;
3658 break;
3659 case WPA_CTRL_REQ_EAP_PASSPHRASE:
3660 os_free(eap->private_key_passwd);
3661 eap->private_key_passwd = (u8 *) os_strdup(value);
3662 eap->pending_req_passphrase = 0;
3663 if (ssid == wpa_s->current_ssid)
3664 wpa_s->reassociate = 1;
3665 break;
3666 default:
3667 wpa_printf(MSG_DEBUG, "CTRL_IFACE: Unknown field '%s'", field);
3668 return -1;
3669 }
3670
3671 return 0;
3672 #else /* IEEE8021X_EAPOL */
3673 wpa_printf(MSG_DEBUG, "CTRL_IFACE: IEEE 802.1X not included");
3674 return -1;
3675 #endif /* IEEE8021X_EAPOL */
3676 }
3677 #endif /* CONFIG_CTRL_IFACE || CONFIG_CTRL_IFACE_DBUS_NEW */
3678
3679
3680 int wpas_network_disabled(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
3681 {
3682 int i;
3683 unsigned int drv_enc;
3684
3685 if (ssid == NULL)
3686 return 1;
3687
3688 if (ssid->disabled)
3689 return 1;
3690
3691 if (wpa_s && wpa_s->drv_capa_known)
3692 drv_enc = wpa_s->drv_enc;
3693 else
3694 drv_enc = (unsigned int) -1;
3695
3696 for (i = 0; i < NUM_WEP_KEYS; i++) {
3697 size_t len = ssid->wep_key_len[i];
3698 if (len == 0)
3699 continue;
3700 if (len == 5 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP40))
3701 continue;
3702 if (len == 13 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP104))
3703 continue;
3704 if (len == 16 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP128))
3705 continue;
3706 return 1; /* invalid WEP key */
3707 }
3708
3709 if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt) && !ssid->psk_set &&
3710 !ssid->ext_psk)
3711 return 1;
3712
3713 return 0;
3714 }
3715
3716
3717 int wpas_is_p2p_prioritized(struct wpa_supplicant *wpa_s)
3718 {
3719 if (wpa_s->global->conc_pref == WPA_CONC_PREF_P2P)
3720 return 1;
3721 if (wpa_s->global->conc_pref == WPA_CONC_PREF_STA)
3722 return 0;
3723 return -1;
3724 }
3725
3726
3727 void wpas_auth_failed(struct wpa_supplicant *wpa_s)
3728 {
3729 struct wpa_ssid *ssid = wpa_s->current_ssid;
3730 int dur;
3731 struct os_time now;
3732
3733 if (ssid == NULL) {
3734 wpa_printf(MSG_DEBUG, "Authentication failure but no known "
3735 "SSID block");
3736 return;
3737 }
3738
3739 if (ssid->key_mgmt == WPA_KEY_MGMT_WPS)
3740 return;
3741
3742 ssid->auth_failures++;
3743 if (ssid->auth_failures > 50)
3744 dur = 300;
3745 else if (ssid->auth_failures > 20)
3746 dur = 120;
3747 else if (ssid->auth_failures > 10)
3748 dur = 60;
3749 else if (ssid->auth_failures > 5)
3750 dur = 30;
3751 else if (ssid->auth_failures > 1)
3752 dur = 20;
3753 else
3754 dur = 10;
3755
3756 os_get_time(&now);
3757 if (now.sec + dur <= ssid->disabled_until.sec)
3758 return;
3759
3760 ssid->disabled_until.sec = now.sec + dur;
3761
3762 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TEMP_DISABLED
3763 "id=%d ssid=\"%s\" auth_failures=%u duration=%d",
3764 ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
3765 ssid->auth_failures, dur);
3766 }
3767
3768
3769 void wpas_clear_temp_disabled(struct wpa_supplicant *wpa_s,
3770 struct wpa_ssid *ssid, int clear_failures)
3771 {
3772 if (ssid == NULL)
3773 return;
3774
3775 if (ssid->disabled_until.sec) {
3776 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_REENABLED
3777 "id=%d ssid=\"%s\"",
3778 ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
3779 }
3780 ssid->disabled_until.sec = 0;
3781 ssid->disabled_until.usec = 0;
3782 if (clear_failures)
3783 ssid->auth_failures = 0;
3784 }
3785
3786
3787 int disallowed_bssid(struct wpa_supplicant *wpa_s, const u8 *bssid)
3788 {
3789 size_t i;
3790
3791 if (wpa_s->disallow_aps_bssid == NULL)
3792 return 0;
3793
3794 for (i = 0; i < wpa_s->disallow_aps_bssid_count; i++) {
3795 if (os_memcmp(wpa_s->disallow_aps_bssid + i * ETH_ALEN,
3796 bssid, ETH_ALEN) == 0)
3797 return 1;
3798 }
3799
3800 return 0;
3801 }
3802
3803
3804 int disallowed_ssid(struct wpa_supplicant *wpa_s, const u8 *ssid,
3805 size_t ssid_len)
3806 {
3807 size_t i;
3808
3809 if (wpa_s->disallow_aps_ssid == NULL || ssid == NULL)
3810 return 0;
3811
3812 for (i = 0; i < wpa_s->disallow_aps_ssid_count; i++) {
3813 struct wpa_ssid_value *s = &wpa_s->disallow_aps_ssid[i];
3814 if (ssid_len == s->ssid_len &&
3815 os_memcmp(ssid, s->ssid, ssid_len) == 0)
3816 return 1;
3817 }
3818
3819 return 0;
3820 }
3821
3822
3823 /**
3824 * wpas_request_connection - Request a new connection
3825 * @wpa_s: Pointer to the network interface
3826 *
3827 * This function is used to request a new connection to be found. It will mark
3828 * the interface to allow reassociation and request a new scan to find a
3829 * suitable network to connect to.
3830 */
3831 void wpas_request_connection(struct wpa_supplicant *wpa_s)
3832 {
3833 wpa_s->normal_scans = 0;
3834 wpa_supplicant_reinit_autoscan(wpa_s);
3835 wpa_s->extra_blacklist_count = 0;
3836 wpa_s->disconnected = 0;
3837 wpa_s->reassociate = 1;
3838
3839 if (wpa_supplicant_fast_associate(wpa_s) != 1)
3840 wpa_supplicant_req_scan(wpa_s, 0, 0);
3841 }