]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/wpa/wpa_supplicant/wpa_supplicant.c
Merge wpa_supplicant/hostapd 2.4.
[FreeBSD/FreeBSD.git] / contrib / wpa / wpa_supplicant / wpa_supplicant.c
1 /*
2  * WPA Supplicant
3  * Copyright (c) 2003-2015, 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_peer/eap_proxy.h"
21 #include "eap_server/eap_methods.h"
22 #include "rsn_supp/wpa.h"
23 #include "eloop.h"
24 #include "config.h"
25 #include "utils/ext_password.h"
26 #include "l2_packet/l2_packet.h"
27 #include "wpa_supplicant_i.h"
28 #include "driver_i.h"
29 #include "ctrl_iface.h"
30 #include "pcsc_funcs.h"
31 #include "common/version.h"
32 #include "rsn_supp/preauth.h"
33 #include "rsn_supp/pmksa_cache.h"
34 #include "common/wpa_ctrl.h"
35 #include "common/ieee802_11_defs.h"
36 #include "common/hw_features_common.h"
37 #include "p2p/p2p.h"
38 #include "blacklist.h"
39 #include "wpas_glue.h"
40 #include "wps_supplicant.h"
41 #include "ibss_rsn.h"
42 #include "sme.h"
43 #include "gas_query.h"
44 #include "ap.h"
45 #include "p2p_supplicant.h"
46 #include "wifi_display.h"
47 #include "notify.h"
48 #include "bgscan.h"
49 #include "autoscan.h"
50 #include "bss.h"
51 #include "scan.h"
52 #include "offchannel.h"
53 #include "hs20_supplicant.h"
54 #include "wnm_sta.h"
55 #include "wpas_kay.h"
56 #include "mesh.h"
57
58 const char *wpa_supplicant_version =
59 "wpa_supplicant v" VERSION_STR "\n"
60 "Copyright (c) 2003-2015, Jouni Malinen <j@w1.fi> and contributors";
61
62 const char *wpa_supplicant_license =
63 "This software may be distributed under the terms of the BSD license.\n"
64 "See README for more details.\n"
65 #ifdef EAP_TLS_OPENSSL
66 "\nThis product includes software developed by the OpenSSL Project\n"
67 "for use in the OpenSSL Toolkit (http://www.openssl.org/)\n"
68 #endif /* EAP_TLS_OPENSSL */
69 ;
70
71 #ifndef CONFIG_NO_STDOUT_DEBUG
72 /* Long text divided into parts in order to fit in C89 strings size limits. */
73 const char *wpa_supplicant_full_license1 =
74 "";
75 const char *wpa_supplicant_full_license2 =
76 "This software may be distributed under the terms of the BSD license.\n"
77 "\n"
78 "Redistribution and use in source and binary forms, with or without\n"
79 "modification, are permitted provided that the following conditions are\n"
80 "met:\n"
81 "\n";
82 const char *wpa_supplicant_full_license3 =
83 "1. Redistributions of source code must retain the above copyright\n"
84 "   notice, this list of conditions and the following disclaimer.\n"
85 "\n"
86 "2. Redistributions in binary form must reproduce the above copyright\n"
87 "   notice, this list of conditions and the following disclaimer in the\n"
88 "   documentation and/or other materials provided with the distribution.\n"
89 "\n";
90 const char *wpa_supplicant_full_license4 =
91 "3. Neither the name(s) of the above-listed copyright holder(s) nor the\n"
92 "   names of its contributors may be used to endorse or promote products\n"
93 "   derived from this software without specific prior written permission.\n"
94 "\n"
95 "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
96 "\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
97 "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
98 "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n";
99 const char *wpa_supplicant_full_license5 =
100 "OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
101 "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
102 "LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
103 "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
104 "THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
105 "(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
106 "OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
107 "\n";
108 #endif /* CONFIG_NO_STDOUT_DEBUG */
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 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         int ret;
137
138         /* IBSS/WPA-None uses only one key (Group) for both receiving and
139          * sending unicast and multicast packets. */
140
141         if (ssid->mode != WPAS_MODE_IBSS) {
142                 wpa_msg(wpa_s, MSG_INFO, "WPA: Invalid mode %d (not "
143                         "IBSS/ad-hoc) for WPA-None", ssid->mode);
144                 return -1;
145         }
146
147         if (!ssid->psk_set) {
148                 wpa_msg(wpa_s, MSG_INFO, "WPA: No PSK configured for "
149                         "WPA-None");
150                 return -1;
151         }
152
153         switch (wpa_s->group_cipher) {
154         case WPA_CIPHER_CCMP:
155                 os_memcpy(key, ssid->psk, 16);
156                 keylen = 16;
157                 alg = WPA_ALG_CCMP;
158                 break;
159         case WPA_CIPHER_GCMP:
160                 os_memcpy(key, ssid->psk, 16);
161                 keylen = 16;
162                 alg = WPA_ALG_GCMP;
163                 break;
164         case WPA_CIPHER_TKIP:
165                 /* WPA-None uses the same Michael MIC key for both TX and RX */
166                 os_memcpy(key, ssid->psk, 16 + 8);
167                 os_memcpy(key + 16 + 8, ssid->psk + 16, 8);
168                 keylen = 32;
169                 alg = WPA_ALG_TKIP;
170                 break;
171         default:
172                 wpa_msg(wpa_s, MSG_INFO, "WPA: Invalid group cipher %d for "
173                         "WPA-None", wpa_s->group_cipher);
174                 return -1;
175         }
176
177         /* TODO: should actually remember the previously used seq#, both for TX
178          * and RX from each STA.. */
179
180         ret = wpa_drv_set_key(wpa_s, alg, NULL, 0, 1, seq, 6, key, keylen);
181         os_memset(key, 0, sizeof(key));
182         return ret;
183 }
184
185
186 static void wpa_supplicant_timeout(void *eloop_ctx, void *timeout_ctx)
187 {
188         struct wpa_supplicant *wpa_s = eloop_ctx;
189         const u8 *bssid = wpa_s->bssid;
190         if (is_zero_ether_addr(bssid))
191                 bssid = wpa_s->pending_bssid;
192         wpa_msg(wpa_s, MSG_INFO, "Authentication with " MACSTR " timed out.",
193                 MAC2STR(bssid));
194         wpa_blacklist_add(wpa_s, bssid);
195         wpa_sm_notify_disassoc(wpa_s->wpa);
196         wpa_supplicant_deauthenticate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
197         wpa_s->reassociate = 1;
198
199         /*
200          * If we timed out, the AP or the local radio may be busy.
201          * So, wait a second until scanning again.
202          */
203         wpa_supplicant_req_scan(wpa_s, 1, 0);
204 }
205
206
207 /**
208  * wpa_supplicant_req_auth_timeout - Schedule a timeout for authentication
209  * @wpa_s: Pointer to wpa_supplicant data
210  * @sec: Number of seconds after which to time out authentication
211  * @usec: Number of microseconds after which to time out authentication
212  *
213  * This function is used to schedule a timeout for the current authentication
214  * attempt.
215  */
216 void wpa_supplicant_req_auth_timeout(struct wpa_supplicant *wpa_s,
217                                      int sec, int usec)
218 {
219         if (wpa_s->conf->ap_scan == 0 &&
220             (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED))
221                 return;
222
223         wpa_dbg(wpa_s, MSG_DEBUG, "Setting authentication timeout: %d sec "
224                 "%d usec", sec, usec);
225         eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
226         eloop_register_timeout(sec, usec, wpa_supplicant_timeout, wpa_s, NULL);
227 }
228
229
230 /**
231  * wpa_supplicant_cancel_auth_timeout - Cancel authentication timeout
232  * @wpa_s: Pointer to wpa_supplicant data
233  *
234  * This function is used to cancel authentication timeout scheduled with
235  * wpa_supplicant_req_auth_timeout() and it is called when authentication has
236  * been completed.
237  */
238 void wpa_supplicant_cancel_auth_timeout(struct wpa_supplicant *wpa_s)
239 {
240         wpa_dbg(wpa_s, MSG_DEBUG, "Cancelling authentication timeout");
241         eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
242         wpa_blacklist_del(wpa_s, wpa_s->bssid);
243 }
244
245
246 /**
247  * wpa_supplicant_initiate_eapol - Configure EAPOL state machine
248  * @wpa_s: Pointer to wpa_supplicant data
249  *
250  * This function is used to configure EAPOL state machine based on the selected
251  * authentication mode.
252  */
253 void wpa_supplicant_initiate_eapol(struct wpa_supplicant *wpa_s)
254 {
255 #ifdef IEEE8021X_EAPOL
256         struct eapol_config eapol_conf;
257         struct wpa_ssid *ssid = wpa_s->current_ssid;
258
259 #ifdef CONFIG_IBSS_RSN
260         if (ssid->mode == WPAS_MODE_IBSS &&
261             wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
262             wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
263                 /*
264                  * RSN IBSS authentication is per-STA and we can disable the
265                  * per-BSSID EAPOL authentication.
266                  */
267                 eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
268                 eapol_sm_notify_eap_success(wpa_s->eapol, TRUE);
269                 eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
270                 return;
271         }
272 #endif /* CONFIG_IBSS_RSN */
273
274         eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
275         eapol_sm_notify_eap_fail(wpa_s->eapol, FALSE);
276
277         if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
278             wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE)
279                 eapol_sm_notify_portControl(wpa_s->eapol, ForceAuthorized);
280         else
281                 eapol_sm_notify_portControl(wpa_s->eapol, Auto);
282
283         os_memset(&eapol_conf, 0, sizeof(eapol_conf));
284         if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
285                 eapol_conf.accept_802_1x_keys = 1;
286                 eapol_conf.required_keys = 0;
287                 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_UNICAST) {
288                         eapol_conf.required_keys |= EAPOL_REQUIRE_KEY_UNICAST;
289                 }
290                 if (ssid->eapol_flags & EAPOL_FLAG_REQUIRE_KEY_BROADCAST) {
291                         eapol_conf.required_keys |=
292                                 EAPOL_REQUIRE_KEY_BROADCAST;
293                 }
294
295                 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED)
296                         eapol_conf.required_keys = 0;
297         }
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_conf.external_sim = wpa_s->conf->external_sim;
305
306 #ifdef CONFIG_WPS
307         if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) {
308                 eapol_conf.wps |= EAPOL_LOCAL_WPS_IN_USE;
309                 if (wpa_s->current_bss) {
310                         struct wpabuf *ie;
311                         ie = wpa_bss_get_vendor_ie_multi(wpa_s->current_bss,
312                                                          WPS_IE_VENDOR_TYPE);
313                         if (ie) {
314                                 if (wps_is_20(ie))
315                                         eapol_conf.wps |=
316                                                 EAPOL_PEER_IS_WPS20_AP;
317                                 wpabuf_free(ie);
318                         }
319                 }
320         }
321 #endif /* CONFIG_WPS */
322
323         eapol_sm_notify_config(wpa_s->eapol, &ssid->eap, &eapol_conf);
324
325         ieee802_1x_alloc_kay_sm(wpa_s, ssid);
326 #endif /* IEEE8021X_EAPOL */
327 }
328
329
330 /**
331  * wpa_supplicant_set_non_wpa_policy - Set WPA parameters to non-WPA mode
332  * @wpa_s: Pointer to wpa_supplicant data
333  * @ssid: Configuration data for the network
334  *
335  * This function is used to configure WPA state machine and related parameters
336  * to a mode where WPA is not enabled. This is called as part of the
337  * authentication configuration when the selected network does not use WPA.
338  */
339 void wpa_supplicant_set_non_wpa_policy(struct wpa_supplicant *wpa_s,
340                                        struct wpa_ssid *ssid)
341 {
342         int i;
343
344         if (ssid->key_mgmt & WPA_KEY_MGMT_WPS)
345                 wpa_s->key_mgmt = WPA_KEY_MGMT_WPS;
346         else if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA)
347                 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_NO_WPA;
348         else
349                 wpa_s->key_mgmt = WPA_KEY_MGMT_NONE;
350         wpa_sm_set_ap_wpa_ie(wpa_s->wpa, NULL, 0);
351         wpa_sm_set_ap_rsn_ie(wpa_s->wpa, NULL, 0);
352         wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
353         wpa_s->pairwise_cipher = WPA_CIPHER_NONE;
354         wpa_s->group_cipher = WPA_CIPHER_NONE;
355         wpa_s->mgmt_group_cipher = 0;
356
357         for (i = 0; i < NUM_WEP_KEYS; i++) {
358                 if (ssid->wep_key_len[i] > 5) {
359                         wpa_s->pairwise_cipher = WPA_CIPHER_WEP104;
360                         wpa_s->group_cipher = WPA_CIPHER_WEP104;
361                         break;
362                 } else if (ssid->wep_key_len[i] > 0) {
363                         wpa_s->pairwise_cipher = WPA_CIPHER_WEP40;
364                         wpa_s->group_cipher = WPA_CIPHER_WEP40;
365                         break;
366                 }
367         }
368
369         wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED, 0);
370         wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
371         wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
372                          wpa_s->pairwise_cipher);
373         wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
374 #ifdef CONFIG_IEEE80211W
375         wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
376                          wpa_s->mgmt_group_cipher);
377 #endif /* CONFIG_IEEE80211W */
378
379         pmksa_cache_clear_current(wpa_s->wpa);
380 }
381
382
383 void free_hw_features(struct wpa_supplicant *wpa_s)
384 {
385         int i;
386         if (wpa_s->hw.modes == NULL)
387                 return;
388
389         for (i = 0; i < wpa_s->hw.num_modes; i++) {
390                 os_free(wpa_s->hw.modes[i].channels);
391                 os_free(wpa_s->hw.modes[i].rates);
392         }
393
394         os_free(wpa_s->hw.modes);
395         wpa_s->hw.modes = NULL;
396 }
397
398
399 static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s)
400 {
401         int i;
402
403         bgscan_deinit(wpa_s);
404         autoscan_deinit(wpa_s);
405         scard_deinit(wpa_s->scard);
406         wpa_s->scard = NULL;
407         wpa_sm_set_scard_ctx(wpa_s->wpa, NULL);
408         eapol_sm_register_scard_ctx(wpa_s->eapol, NULL);
409         l2_packet_deinit(wpa_s->l2);
410         wpa_s->l2 = NULL;
411         if (wpa_s->l2_br) {
412                 l2_packet_deinit(wpa_s->l2_br);
413                 wpa_s->l2_br = NULL;
414         }
415 #ifdef CONFIG_TESTING_OPTIONS
416         l2_packet_deinit(wpa_s->l2_test);
417         wpa_s->l2_test = NULL;
418 #endif /* CONFIG_TESTING_OPTIONS */
419
420         if (wpa_s->conf != NULL) {
421                 struct wpa_ssid *ssid;
422                 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
423                         wpas_notify_network_removed(wpa_s, ssid);
424         }
425
426         os_free(wpa_s->confname);
427         wpa_s->confname = NULL;
428
429         os_free(wpa_s->confanother);
430         wpa_s->confanother = NULL;
431
432         wpa_sm_set_eapol(wpa_s->wpa, NULL);
433         eapol_sm_deinit(wpa_s->eapol);
434         wpa_s->eapol = NULL;
435
436         rsn_preauth_deinit(wpa_s->wpa);
437
438 #ifdef CONFIG_TDLS
439         wpa_tdls_deinit(wpa_s->wpa);
440 #endif /* CONFIG_TDLS */
441
442         wmm_ac_clear_saved_tspecs(wpa_s);
443         pmksa_candidate_free(wpa_s->wpa);
444         wpa_sm_deinit(wpa_s->wpa);
445         wpa_s->wpa = NULL;
446         wpa_blacklist_clear(wpa_s);
447
448         wpa_bss_deinit(wpa_s);
449
450         wpa_supplicant_cancel_delayed_sched_scan(wpa_s);
451         wpa_supplicant_cancel_scan(wpa_s);
452         wpa_supplicant_cancel_auth_timeout(wpa_s);
453         eloop_cancel_timeout(wpa_supplicant_stop_countermeasures, wpa_s, NULL);
454 #ifdef CONFIG_DELAYED_MIC_ERROR_REPORT
455         eloop_cancel_timeout(wpa_supplicant_delayed_mic_error_report,
456                              wpa_s, NULL);
457 #endif /* CONFIG_DELAYED_MIC_ERROR_REPORT */
458
459         wpas_wps_deinit(wpa_s);
460
461         wpabuf_free(wpa_s->pending_eapol_rx);
462         wpa_s->pending_eapol_rx = NULL;
463
464 #ifdef CONFIG_IBSS_RSN
465         ibss_rsn_deinit(wpa_s->ibss_rsn);
466         wpa_s->ibss_rsn = NULL;
467 #endif /* CONFIG_IBSS_RSN */
468
469         sme_deinit(wpa_s);
470
471 #ifdef CONFIG_AP
472         wpa_supplicant_ap_deinit(wpa_s);
473 #endif /* CONFIG_AP */
474
475         wpas_p2p_deinit(wpa_s);
476
477 #ifdef CONFIG_OFFCHANNEL
478         offchannel_deinit(wpa_s);
479 #endif /* CONFIG_OFFCHANNEL */
480
481         wpa_supplicant_cancel_sched_scan(wpa_s);
482
483         os_free(wpa_s->next_scan_freqs);
484         wpa_s->next_scan_freqs = NULL;
485
486         os_free(wpa_s->manual_scan_freqs);
487         wpa_s->manual_scan_freqs = NULL;
488
489         os_free(wpa_s->manual_sched_scan_freqs);
490         wpa_s->manual_sched_scan_freqs = NULL;
491
492         wpas_mac_addr_rand_scan_clear(wpa_s, MAC_ADDR_RAND_ALL);
493
494         gas_query_deinit(wpa_s->gas);
495         wpa_s->gas = NULL;
496
497         free_hw_features(wpa_s);
498
499         ieee802_1x_dealloc_kay_sm(wpa_s);
500
501         os_free(wpa_s->bssid_filter);
502         wpa_s->bssid_filter = NULL;
503
504         os_free(wpa_s->disallow_aps_bssid);
505         wpa_s->disallow_aps_bssid = NULL;
506         os_free(wpa_s->disallow_aps_ssid);
507         wpa_s->disallow_aps_ssid = NULL;
508
509         wnm_bss_keep_alive_deinit(wpa_s);
510 #ifdef CONFIG_WNM
511         wnm_deallocate_memory(wpa_s);
512 #endif /* CONFIG_WNM */
513
514         ext_password_deinit(wpa_s->ext_pw);
515         wpa_s->ext_pw = NULL;
516
517         wpabuf_free(wpa_s->last_gas_resp);
518         wpa_s->last_gas_resp = NULL;
519         wpabuf_free(wpa_s->prev_gas_resp);
520         wpa_s->prev_gas_resp = NULL;
521
522         os_free(wpa_s->last_scan_res);
523         wpa_s->last_scan_res = NULL;
524
525 #ifdef CONFIG_HS20
526         hs20_deinit(wpa_s);
527 #endif /* CONFIG_HS20 */
528
529         for (i = 0; i < NUM_VENDOR_ELEM_FRAMES; i++) {
530                 wpabuf_free(wpa_s->vendor_elem[i]);
531                 wpa_s->vendor_elem[i] = NULL;
532         }
533
534         wmm_ac_notify_disassoc(wpa_s);
535 }
536
537
538 /**
539  * wpa_clear_keys - Clear keys configured for the driver
540  * @wpa_s: Pointer to wpa_supplicant data
541  * @addr: Previously used BSSID or %NULL if not available
542  *
543  * This function clears the encryption keys that has been previously configured
544  * for the driver.
545  */
546 void wpa_clear_keys(struct wpa_supplicant *wpa_s, const u8 *addr)
547 {
548         int i, max;
549
550 #ifdef CONFIG_IEEE80211W
551         max = 6;
552 #else /* CONFIG_IEEE80211W */
553         max = 4;
554 #endif /* CONFIG_IEEE80211W */
555
556         /* MLME-DELETEKEYS.request */
557         for (i = 0; i < max; i++) {
558                 if (wpa_s->keys_cleared & BIT(i))
559                         continue;
560                 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, NULL, i, 0, NULL, 0,
561                                 NULL, 0);
562         }
563         if (!(wpa_s->keys_cleared & BIT(0)) && addr &&
564             !is_zero_ether_addr(addr)) {
565                 wpa_drv_set_key(wpa_s, WPA_ALG_NONE, addr, 0, 0, NULL, 0, NULL,
566                                 0);
567                 /* MLME-SETPROTECTION.request(None) */
568                 wpa_drv_mlme_setprotection(
569                         wpa_s, addr,
570                         MLME_SETPROTECTION_PROTECT_TYPE_NONE,
571                         MLME_SETPROTECTION_KEY_TYPE_PAIRWISE);
572         }
573         wpa_s->keys_cleared = (u32) -1;
574 }
575
576
577 /**
578  * wpa_supplicant_state_txt - Get the connection state name as a text string
579  * @state: State (wpa_state; WPA_*)
580  * Returns: The state name as a printable text string
581  */
582 const char * wpa_supplicant_state_txt(enum wpa_states state)
583 {
584         switch (state) {
585         case WPA_DISCONNECTED:
586                 return "DISCONNECTED";
587         case WPA_INACTIVE:
588                 return "INACTIVE";
589         case WPA_INTERFACE_DISABLED:
590                 return "INTERFACE_DISABLED";
591         case WPA_SCANNING:
592                 return "SCANNING";
593         case WPA_AUTHENTICATING:
594                 return "AUTHENTICATING";
595         case WPA_ASSOCIATING:
596                 return "ASSOCIATING";
597         case WPA_ASSOCIATED:
598                 return "ASSOCIATED";
599         case WPA_4WAY_HANDSHAKE:
600                 return "4WAY_HANDSHAKE";
601         case WPA_GROUP_HANDSHAKE:
602                 return "GROUP_HANDSHAKE";
603         case WPA_COMPLETED:
604                 return "COMPLETED";
605         default:
606                 return "UNKNOWN";
607         }
608 }
609
610
611 #ifdef CONFIG_BGSCAN
612
613 static void wpa_supplicant_start_bgscan(struct wpa_supplicant *wpa_s)
614 {
615         const char *name;
616
617         if (wpa_s->current_ssid && wpa_s->current_ssid->bgscan)
618                 name = wpa_s->current_ssid->bgscan;
619         else
620                 name = wpa_s->conf->bgscan;
621         if (name == NULL || name[0] == '\0')
622                 return;
623         if (wpas_driver_bss_selection(wpa_s))
624                 return;
625         if (wpa_s->current_ssid == wpa_s->bgscan_ssid)
626                 return;
627 #ifdef CONFIG_P2P
628         if (wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE)
629                 return;
630 #endif /* CONFIG_P2P */
631
632         bgscan_deinit(wpa_s);
633         if (wpa_s->current_ssid) {
634                 if (bgscan_init(wpa_s, wpa_s->current_ssid, name)) {
635                         wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize "
636                                 "bgscan");
637                         /*
638                          * Live without bgscan; it is only used as a roaming
639                          * optimization, so the initial connection is not
640                          * affected.
641                          */
642                 } else {
643                         struct wpa_scan_results *scan_res;
644                         wpa_s->bgscan_ssid = wpa_s->current_ssid;
645                         scan_res = wpa_supplicant_get_scan_results(wpa_s, NULL,
646                                                                    0);
647                         if (scan_res) {
648                                 bgscan_notify_scan(wpa_s, scan_res);
649                                 wpa_scan_results_free(scan_res);
650                         }
651                 }
652         } else
653                 wpa_s->bgscan_ssid = NULL;
654 }
655
656
657 static void wpa_supplicant_stop_bgscan(struct wpa_supplicant *wpa_s)
658 {
659         if (wpa_s->bgscan_ssid != NULL) {
660                 bgscan_deinit(wpa_s);
661                 wpa_s->bgscan_ssid = NULL;
662         }
663 }
664
665 #endif /* CONFIG_BGSCAN */
666
667
668 static void wpa_supplicant_start_autoscan(struct wpa_supplicant *wpa_s)
669 {
670         if (autoscan_init(wpa_s, 0))
671                 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize autoscan");
672 }
673
674
675 static void wpa_supplicant_stop_autoscan(struct wpa_supplicant *wpa_s)
676 {
677         autoscan_deinit(wpa_s);
678 }
679
680
681 void wpa_supplicant_reinit_autoscan(struct wpa_supplicant *wpa_s)
682 {
683         if (wpa_s->wpa_state == WPA_DISCONNECTED ||
684             wpa_s->wpa_state == WPA_SCANNING) {
685                 autoscan_deinit(wpa_s);
686                 wpa_supplicant_start_autoscan(wpa_s);
687         }
688 }
689
690
691 /**
692  * wpa_supplicant_set_state - Set current connection state
693  * @wpa_s: Pointer to wpa_supplicant data
694  * @state: The new connection state
695  *
696  * This function is called whenever the connection state changes, e.g.,
697  * association is completed for WPA/WPA2 4-Way Handshake is started.
698  */
699 void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s,
700                               enum wpa_states state)
701 {
702         enum wpa_states old_state = wpa_s->wpa_state;
703
704         wpa_dbg(wpa_s, MSG_DEBUG, "State: %s -> %s",
705                 wpa_supplicant_state_txt(wpa_s->wpa_state),
706                 wpa_supplicant_state_txt(state));
707
708         if (state == WPA_INTERFACE_DISABLED) {
709                 /* Assure normal scan when interface is restored */
710                 wpa_s->normal_scans = 0;
711         }
712
713         if (state == WPA_COMPLETED) {
714                 wpas_connect_work_done(wpa_s);
715                 /* Reinitialize normal_scan counter */
716                 wpa_s->normal_scans = 0;
717         }
718
719         if (state != WPA_SCANNING)
720                 wpa_supplicant_notify_scanning(wpa_s, 0);
721
722         if (state == WPA_COMPLETED && wpa_s->new_connection) {
723                 struct wpa_ssid *ssid = wpa_s->current_ssid;
724 #if defined(CONFIG_CTRL_IFACE) || !defined(CONFIG_NO_STDOUT_DEBUG)
725                 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_CONNECTED "- Connection to "
726                         MACSTR " completed [id=%d id_str=%s]",
727                         MAC2STR(wpa_s->bssid),
728                         ssid ? ssid->id : -1,
729                         ssid && ssid->id_str ? ssid->id_str : "");
730 #endif /* CONFIG_CTRL_IFACE || !CONFIG_NO_STDOUT_DEBUG */
731                 wpas_clear_temp_disabled(wpa_s, ssid, 1);
732                 wpa_s->extra_blacklist_count = 0;
733                 wpa_s->new_connection = 0;
734                 wpa_drv_set_operstate(wpa_s, 1);
735 #ifndef IEEE8021X_EAPOL
736                 wpa_drv_set_supp_port(wpa_s, 1);
737 #endif /* IEEE8021X_EAPOL */
738                 wpa_s->after_wps = 0;
739                 wpa_s->known_wps_freq = 0;
740                 wpas_p2p_completed(wpa_s);
741
742                 sme_sched_obss_scan(wpa_s, 1);
743         } else if (state == WPA_DISCONNECTED || state == WPA_ASSOCIATING ||
744                    state == WPA_ASSOCIATED) {
745                 wpa_s->new_connection = 1;
746                 wpa_drv_set_operstate(wpa_s, 0);
747 #ifndef IEEE8021X_EAPOL
748                 wpa_drv_set_supp_port(wpa_s, 0);
749 #endif /* IEEE8021X_EAPOL */
750                 sme_sched_obss_scan(wpa_s, 0);
751         }
752         wpa_s->wpa_state = state;
753
754 #ifdef CONFIG_BGSCAN
755         if (state == WPA_COMPLETED)
756                 wpa_supplicant_start_bgscan(wpa_s);
757         else if (state < WPA_ASSOCIATED)
758                 wpa_supplicant_stop_bgscan(wpa_s);
759 #endif /* CONFIG_BGSCAN */
760
761         if (state == WPA_AUTHENTICATING)
762                 wpa_supplicant_stop_autoscan(wpa_s);
763
764         if (state == WPA_DISCONNECTED || state == WPA_INACTIVE)
765                 wpa_supplicant_start_autoscan(wpa_s);
766
767         if (old_state >= WPA_ASSOCIATED && wpa_s->wpa_state < WPA_ASSOCIATED)
768                 wmm_ac_notify_disassoc(wpa_s);
769
770         if (wpa_s->wpa_state != old_state) {
771                 wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
772
773                 /*
774                  * Notify the P2P Device interface about a state change in one
775                  * of the interfaces.
776                  */
777                 wpas_p2p_indicate_state_change(wpa_s);
778
779                 if (wpa_s->wpa_state == WPA_COMPLETED ||
780                     old_state == WPA_COMPLETED)
781                         wpas_notify_auth_changed(wpa_s);
782         }
783 }
784
785
786 void wpa_supplicant_terminate_proc(struct wpa_global *global)
787 {
788         int pending = 0;
789 #ifdef CONFIG_WPS
790         struct wpa_supplicant *wpa_s = global->ifaces;
791         while (wpa_s) {
792                 struct wpa_supplicant *next = wpa_s->next;
793                 if (wpas_wps_terminate_pending(wpa_s) == 1)
794                         pending = 1;
795 #ifdef CONFIG_P2P
796                 if (wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE ||
797                     (wpa_s->current_ssid && wpa_s->current_ssid->p2p_group))
798                         wpas_p2p_disconnect(wpa_s);
799 #endif /* CONFIG_P2P */
800                 wpa_s = next;
801         }
802 #endif /* CONFIG_WPS */
803         if (pending)
804                 return;
805         eloop_terminate();
806 }
807
808
809 static void wpa_supplicant_terminate(int sig, void *signal_ctx)
810 {
811         struct wpa_global *global = signal_ctx;
812         wpa_supplicant_terminate_proc(global);
813 }
814
815
816 void wpa_supplicant_clear_status(struct wpa_supplicant *wpa_s)
817 {
818         enum wpa_states old_state = wpa_s->wpa_state;
819
820         wpa_s->pairwise_cipher = 0;
821         wpa_s->group_cipher = 0;
822         wpa_s->mgmt_group_cipher = 0;
823         wpa_s->key_mgmt = 0;
824         if (wpa_s->wpa_state != WPA_INTERFACE_DISABLED)
825                 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
826
827         if (wpa_s->wpa_state != old_state)
828                 wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
829 }
830
831
832 /**
833  * wpa_supplicant_reload_configuration - Reload configuration data
834  * @wpa_s: Pointer to wpa_supplicant data
835  * Returns: 0 on success or -1 if configuration parsing failed
836  *
837  * This function can be used to request that the configuration data is reloaded
838  * (e.g., after configuration file change). This function is reloading
839  * configuration only for one interface, so this may need to be called multiple
840  * times if %wpa_supplicant is controlling multiple interfaces and all
841  * interfaces need reconfiguration.
842  */
843 int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s)
844 {
845         struct wpa_config *conf;
846         int reconf_ctrl;
847         int old_ap_scan;
848
849         if (wpa_s->confname == NULL)
850                 return -1;
851         conf = wpa_config_read(wpa_s->confname, NULL);
852         if (conf == NULL) {
853                 wpa_msg(wpa_s, MSG_ERROR, "Failed to parse the configuration "
854                         "file '%s' - exiting", wpa_s->confname);
855                 return -1;
856         }
857         wpa_config_read(wpa_s->confanother, conf);
858
859         conf->changed_parameters = (unsigned int) -1;
860
861         reconf_ctrl = !!conf->ctrl_interface != !!wpa_s->conf->ctrl_interface
862                 || (conf->ctrl_interface && wpa_s->conf->ctrl_interface &&
863                     os_strcmp(conf->ctrl_interface,
864                               wpa_s->conf->ctrl_interface) != 0);
865
866         if (reconf_ctrl && wpa_s->ctrl_iface) {
867                 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
868                 wpa_s->ctrl_iface = NULL;
869         }
870
871         eapol_sm_invalidate_cached_session(wpa_s->eapol);
872         if (wpa_s->current_ssid) {
873                 wpa_s->own_disconnect_req = 1;
874                 wpa_supplicant_deauthenticate(wpa_s,
875                                               WLAN_REASON_DEAUTH_LEAVING);
876         }
877
878         /*
879          * TODO: should notify EAPOL SM about changes in opensc_engine_path,
880          * pkcs11_engine_path, pkcs11_module_path, openssl_ciphers.
881          */
882         if (wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt)) {
883                 /*
884                  * Clear forced success to clear EAP state for next
885                  * authentication.
886                  */
887                 eapol_sm_notify_eap_success(wpa_s->eapol, FALSE);
888         }
889         eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
890         wpa_sm_set_config(wpa_s->wpa, NULL);
891         wpa_sm_pmksa_cache_flush(wpa_s->wpa, NULL);
892         wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
893         rsn_preauth_deinit(wpa_s->wpa);
894
895         old_ap_scan = wpa_s->conf->ap_scan;
896         wpa_config_free(wpa_s->conf);
897         wpa_s->conf = conf;
898         if (old_ap_scan != wpa_s->conf->ap_scan)
899                 wpas_notify_ap_scan_changed(wpa_s);
900
901         if (reconf_ctrl)
902                 wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
903
904         wpa_supplicant_update_config(wpa_s);
905
906         wpa_supplicant_clear_status(wpa_s);
907         if (wpa_supplicant_enabled_networks(wpa_s)) {
908                 wpa_s->reassociate = 1;
909                 wpa_supplicant_req_scan(wpa_s, 0, 0);
910         }
911         wpa_dbg(wpa_s, MSG_DEBUG, "Reconfiguration completed");
912         return 0;
913 }
914
915
916 static void wpa_supplicant_reconfig(int sig, void *signal_ctx)
917 {
918         struct wpa_global *global = signal_ctx;
919         struct wpa_supplicant *wpa_s;
920         for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
921                 wpa_dbg(wpa_s, MSG_DEBUG, "Signal %d received - reconfiguring",
922                         sig);
923                 if (wpa_supplicant_reload_configuration(wpa_s) < 0) {
924                         wpa_supplicant_terminate_proc(global);
925                 }
926         }
927 }
928
929
930 static int wpa_supplicant_suites_from_ai(struct wpa_supplicant *wpa_s,
931                                          struct wpa_ssid *ssid,
932                                          struct wpa_ie_data *ie)
933 {
934         int ret = wpa_sm_parse_own_wpa_ie(wpa_s->wpa, ie);
935         if (ret) {
936                 if (ret == -2) {
937                         wpa_msg(wpa_s, MSG_INFO, "WPA: Failed to parse WPA IE "
938                                 "from association info");
939                 }
940                 return -1;
941         }
942
943         wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Using WPA IE from AssocReq to set "
944                 "cipher suites");
945         if (!(ie->group_cipher & ssid->group_cipher)) {
946                 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled group "
947                         "cipher 0x%x (mask 0x%x) - reject",
948                         ie->group_cipher, ssid->group_cipher);
949                 return -1;
950         }
951         if (!(ie->pairwise_cipher & ssid->pairwise_cipher)) {
952                 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled pairwise "
953                         "cipher 0x%x (mask 0x%x) - reject",
954                         ie->pairwise_cipher, ssid->pairwise_cipher);
955                 return -1;
956         }
957         if (!(ie->key_mgmt & ssid->key_mgmt)) {
958                 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver used disabled key "
959                         "management 0x%x (mask 0x%x) - reject",
960                         ie->key_mgmt, ssid->key_mgmt);
961                 return -1;
962         }
963
964 #ifdef CONFIG_IEEE80211W
965         if (!(ie->capabilities & WPA_CAPABILITY_MFPC) &&
966             wpas_get_ssid_pmf(wpa_s, ssid) == MGMT_FRAME_PROTECTION_REQUIRED) {
967                 wpa_msg(wpa_s, MSG_INFO, "WPA: Driver associated with an AP "
968                         "that does not support management frame protection - "
969                         "reject");
970                 return -1;
971         }
972 #endif /* CONFIG_IEEE80211W */
973
974         return 0;
975 }
976
977
978 /**
979  * wpa_supplicant_set_suites - Set authentication and encryption parameters
980  * @wpa_s: Pointer to wpa_supplicant data
981  * @bss: Scan results for the selected BSS, or %NULL if not available
982  * @ssid: Configuration data for the selected network
983  * @wpa_ie: Buffer for the WPA/RSN IE
984  * @wpa_ie_len: Maximum wpa_ie buffer size on input. This is changed to be the
985  * used buffer length in case the functions returns success.
986  * Returns: 0 on success or -1 on failure
987  *
988  * This function is used to configure authentication and encryption parameters
989  * based on the network configuration and scan result for the selected BSS (if
990  * available).
991  */
992 int wpa_supplicant_set_suites(struct wpa_supplicant *wpa_s,
993                               struct wpa_bss *bss, struct wpa_ssid *ssid,
994                               u8 *wpa_ie, size_t *wpa_ie_len)
995 {
996         struct wpa_ie_data ie;
997         int sel, proto;
998         const u8 *bss_wpa, *bss_rsn, *bss_osen;
999
1000         if (bss) {
1001                 bss_wpa = wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE);
1002                 bss_rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
1003                 bss_osen = wpa_bss_get_vendor_ie(bss, OSEN_IE_VENDOR_TYPE);
1004         } else
1005                 bss_wpa = bss_rsn = bss_osen = NULL;
1006
1007         if (bss_rsn && (ssid->proto & WPA_PROTO_RSN) &&
1008             wpa_parse_wpa_ie(bss_rsn, 2 + bss_rsn[1], &ie) == 0 &&
1009             (ie.group_cipher & ssid->group_cipher) &&
1010             (ie.pairwise_cipher & ssid->pairwise_cipher) &&
1011             (ie.key_mgmt & ssid->key_mgmt)) {
1012                 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using IEEE 802.11i/D9.0");
1013                 proto = WPA_PROTO_RSN;
1014         } else if (bss_wpa && (ssid->proto & WPA_PROTO_WPA) &&
1015                    wpa_parse_wpa_ie(bss_wpa, 2 + bss_wpa[1], &ie) == 0 &&
1016                    (ie.group_cipher & ssid->group_cipher) &&
1017                    (ie.pairwise_cipher & ssid->pairwise_cipher) &&
1018                    (ie.key_mgmt & ssid->key_mgmt)) {
1019                 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using IEEE 802.11i/D3.0");
1020                 proto = WPA_PROTO_WPA;
1021 #ifdef CONFIG_HS20
1022         } else if (bss_osen && (ssid->proto & WPA_PROTO_OSEN)) {
1023                 wpa_dbg(wpa_s, MSG_DEBUG, "HS 2.0: using OSEN");
1024                 /* TODO: parse OSEN element */
1025                 os_memset(&ie, 0, sizeof(ie));
1026                 ie.group_cipher = WPA_CIPHER_CCMP;
1027                 ie.pairwise_cipher = WPA_CIPHER_CCMP;
1028                 ie.key_mgmt = WPA_KEY_MGMT_OSEN;
1029                 proto = WPA_PROTO_OSEN;
1030 #endif /* CONFIG_HS20 */
1031         } else if (bss) {
1032                 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select WPA/RSN");
1033                 wpa_dbg(wpa_s, MSG_DEBUG,
1034                         "WPA: ssid proto=0x%x pairwise_cipher=0x%x group_cipher=0x%x key_mgmt=0x%x",
1035                         ssid->proto, ssid->pairwise_cipher, ssid->group_cipher,
1036                         ssid->key_mgmt);
1037                 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: BSS " MACSTR " ssid='%s'%s%s%s",
1038                         MAC2STR(bss->bssid),
1039                         wpa_ssid_txt(bss->ssid, bss->ssid_len),
1040                         bss_wpa ? " WPA" : "",
1041                         bss_rsn ? " RSN" : "",
1042                         bss_osen ? " OSEN" : "");
1043                 if (bss_rsn) {
1044                         wpa_hexdump(MSG_DEBUG, "RSN", bss_rsn, 2 + bss_rsn[1]);
1045                         if (wpa_parse_wpa_ie(bss_rsn, 2 + bss_rsn[1], &ie)) {
1046                                 wpa_dbg(wpa_s, MSG_DEBUG,
1047                                         "Could not parse RSN element");
1048                         } else {
1049                                 wpa_dbg(wpa_s, MSG_DEBUG,
1050                                         "RSN: pairwise_cipher=0x%x group_cipher=0x%x key_mgmt=0x%x",
1051                                         ie.pairwise_cipher, ie.group_cipher,
1052                                         ie.key_mgmt);
1053                         }
1054                 }
1055                 if (bss_wpa) {
1056                         wpa_hexdump(MSG_DEBUG, "WPA", bss_wpa, 2 + bss_wpa[1]);
1057                         if (wpa_parse_wpa_ie(bss_wpa, 2 + bss_wpa[1], &ie)) {
1058                                 wpa_dbg(wpa_s, MSG_DEBUG,
1059                                         "Could not parse WPA element");
1060                         } else {
1061                                 wpa_dbg(wpa_s, MSG_DEBUG,
1062                                         "WPA: pairwise_cipher=0x%x group_cipher=0x%x key_mgmt=0x%x",
1063                                         ie.pairwise_cipher, ie.group_cipher,
1064                                         ie.key_mgmt);
1065                         }
1066                 }
1067                 return -1;
1068         } else {
1069                 if (ssid->proto & WPA_PROTO_OSEN)
1070                         proto = WPA_PROTO_OSEN;
1071                 else if (ssid->proto & WPA_PROTO_RSN)
1072                         proto = WPA_PROTO_RSN;
1073                 else
1074                         proto = WPA_PROTO_WPA;
1075                 if (wpa_supplicant_suites_from_ai(wpa_s, ssid, &ie) < 0) {
1076                         os_memset(&ie, 0, sizeof(ie));
1077                         ie.group_cipher = ssid->group_cipher;
1078                         ie.pairwise_cipher = ssid->pairwise_cipher;
1079                         ie.key_mgmt = ssid->key_mgmt;
1080 #ifdef CONFIG_IEEE80211W
1081                         ie.mgmt_group_cipher =
1082                                 ssid->ieee80211w != NO_MGMT_FRAME_PROTECTION ?
1083                                 WPA_CIPHER_AES_128_CMAC : 0;
1084 #endif /* CONFIG_IEEE80211W */
1085                         wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Set cipher suites "
1086                                 "based on configuration");
1087                 } else
1088                         proto = ie.proto;
1089         }
1090
1091         wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected cipher suites: group %d "
1092                 "pairwise %d key_mgmt %d proto %d",
1093                 ie.group_cipher, ie.pairwise_cipher, ie.key_mgmt, proto);
1094 #ifdef CONFIG_IEEE80211W
1095         if (ssid->ieee80211w) {
1096                 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected mgmt group cipher %d",
1097                         ie.mgmt_group_cipher);
1098         }
1099 #endif /* CONFIG_IEEE80211W */
1100
1101         wpa_s->wpa_proto = proto;
1102         wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PROTO, proto);
1103         wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED,
1104                          !!(ssid->proto & (WPA_PROTO_RSN | WPA_PROTO_OSEN)));
1105
1106         if (bss || !wpa_s->ap_ies_from_associnfo) {
1107                 if (wpa_sm_set_ap_wpa_ie(wpa_s->wpa, bss_wpa,
1108                                          bss_wpa ? 2 + bss_wpa[1] : 0) ||
1109                     wpa_sm_set_ap_rsn_ie(wpa_s->wpa, bss_rsn,
1110                                          bss_rsn ? 2 + bss_rsn[1] : 0))
1111                         return -1;
1112         }
1113
1114         sel = ie.group_cipher & ssid->group_cipher;
1115         wpa_s->group_cipher = wpa_pick_group_cipher(sel);
1116         if (wpa_s->group_cipher < 0) {
1117                 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select group "
1118                         "cipher");
1119                 return -1;
1120         }
1121         wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using GTK %s",
1122                 wpa_cipher_txt(wpa_s->group_cipher));
1123
1124         sel = ie.pairwise_cipher & ssid->pairwise_cipher;
1125         wpa_s->pairwise_cipher = wpa_pick_pairwise_cipher(sel, 1);
1126         if (wpa_s->pairwise_cipher < 0) {
1127                 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select pairwise "
1128                         "cipher");
1129                 return -1;
1130         }
1131         wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using PTK %s",
1132                 wpa_cipher_txt(wpa_s->pairwise_cipher));
1133
1134         sel = ie.key_mgmt & ssid->key_mgmt;
1135 #ifdef CONFIG_SAE
1136         if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SAE))
1137                 sel &= ~(WPA_KEY_MGMT_SAE | WPA_KEY_MGMT_FT_SAE);
1138 #endif /* CONFIG_SAE */
1139         if (0) {
1140 #ifdef CONFIG_SUITEB192
1141         } else if (sel & WPA_KEY_MGMT_IEEE8021X_SUITE_B_192) {
1142                 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SUITE_B_192;
1143                 wpa_dbg(wpa_s, MSG_DEBUG,
1144                         "WPA: using KEY_MGMT 802.1X with Suite B (192-bit)");
1145 #endif /* CONFIG_SUITEB192 */
1146 #ifdef CONFIG_SUITEB
1147         } else if (sel & WPA_KEY_MGMT_IEEE8021X_SUITE_B) {
1148                 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SUITE_B;
1149                 wpa_dbg(wpa_s, MSG_DEBUG,
1150                         "WPA: using KEY_MGMT 802.1X with Suite B");
1151 #endif /* CONFIG_SUITEB */
1152 #ifdef CONFIG_IEEE80211R
1153         } else if (sel & WPA_KEY_MGMT_FT_IEEE8021X) {
1154                 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_IEEE8021X;
1155                 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/802.1X");
1156         } else if (sel & WPA_KEY_MGMT_FT_PSK) {
1157                 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_PSK;
1158                 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT FT/PSK");
1159 #endif /* CONFIG_IEEE80211R */
1160 #ifdef CONFIG_SAE
1161         } else if (sel & WPA_KEY_MGMT_SAE) {
1162                 wpa_s->key_mgmt = WPA_KEY_MGMT_SAE;
1163                 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT SAE");
1164         } else if (sel & WPA_KEY_MGMT_FT_SAE) {
1165                 wpa_s->key_mgmt = WPA_KEY_MGMT_FT_SAE;
1166                 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: using KEY_MGMT FT/SAE");
1167 #endif /* CONFIG_SAE */
1168 #ifdef CONFIG_IEEE80211W
1169         } else if (sel & WPA_KEY_MGMT_IEEE8021X_SHA256) {
1170                 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X_SHA256;
1171                 wpa_dbg(wpa_s, MSG_DEBUG,
1172                         "WPA: using KEY_MGMT 802.1X with SHA256");
1173         } else if (sel & WPA_KEY_MGMT_PSK_SHA256) {
1174                 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK_SHA256;
1175                 wpa_dbg(wpa_s, MSG_DEBUG,
1176                         "WPA: using KEY_MGMT PSK with SHA256");
1177 #endif /* CONFIG_IEEE80211W */
1178         } else if (sel & WPA_KEY_MGMT_IEEE8021X) {
1179                 wpa_s->key_mgmt = WPA_KEY_MGMT_IEEE8021X;
1180                 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT 802.1X");
1181         } else if (sel & WPA_KEY_MGMT_PSK) {
1182                 wpa_s->key_mgmt = WPA_KEY_MGMT_PSK;
1183                 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-PSK");
1184         } else if (sel & WPA_KEY_MGMT_WPA_NONE) {
1185                 wpa_s->key_mgmt = WPA_KEY_MGMT_WPA_NONE;
1186                 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT WPA-NONE");
1187 #ifdef CONFIG_HS20
1188         } else if (sel & WPA_KEY_MGMT_OSEN) {
1189                 wpa_s->key_mgmt = WPA_KEY_MGMT_OSEN;
1190                 wpa_dbg(wpa_s, MSG_DEBUG, "HS 2.0: using KEY_MGMT OSEN");
1191 #endif /* CONFIG_HS20 */
1192         } else {
1193                 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to select "
1194                         "authenticated key management type");
1195                 return -1;
1196         }
1197
1198         wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
1199         wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
1200                          wpa_s->pairwise_cipher);
1201         wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
1202
1203 #ifdef CONFIG_IEEE80211W
1204         sel = ie.mgmt_group_cipher;
1205         if (wpas_get_ssid_pmf(wpa_s, ssid) == NO_MGMT_FRAME_PROTECTION ||
1206             !(ie.capabilities & WPA_CAPABILITY_MFPC))
1207                 sel = 0;
1208         if (sel & WPA_CIPHER_AES_128_CMAC) {
1209                 wpa_s->mgmt_group_cipher = WPA_CIPHER_AES_128_CMAC;
1210                 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1211                         "AES-128-CMAC");
1212         } else if (sel & WPA_CIPHER_BIP_GMAC_128) {
1213                 wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_GMAC_128;
1214                 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1215                         "BIP-GMAC-128");
1216         } else if (sel & WPA_CIPHER_BIP_GMAC_256) {
1217                 wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_GMAC_256;
1218                 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1219                         "BIP-GMAC-256");
1220         } else if (sel & WPA_CIPHER_BIP_CMAC_256) {
1221                 wpa_s->mgmt_group_cipher = WPA_CIPHER_BIP_CMAC_256;
1222                 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher "
1223                         "BIP-CMAC-256");
1224         } else {
1225                 wpa_s->mgmt_group_cipher = 0;
1226                 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: not using MGMT group cipher");
1227         }
1228         wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
1229                          wpa_s->mgmt_group_cipher);
1230         wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MFP,
1231                          wpas_get_ssid_pmf(wpa_s, ssid));
1232 #endif /* CONFIG_IEEE80211W */
1233
1234         if (wpa_sm_set_assoc_wpa_ie_default(wpa_s->wpa, wpa_ie, wpa_ie_len)) {
1235                 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to generate WPA IE");
1236                 return -1;
1237         }
1238
1239         if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt)) {
1240                 wpa_sm_set_pmk(wpa_s->wpa, ssid->psk, PMK_LEN, NULL);
1241 #ifndef CONFIG_NO_PBKDF2
1242                 if (bss && ssid->bssid_set && ssid->ssid_len == 0 &&
1243                     ssid->passphrase) {
1244                         u8 psk[PMK_LEN];
1245                         pbkdf2_sha1(ssid->passphrase, bss->ssid, bss->ssid_len,
1246                                     4096, psk, PMK_LEN);
1247                         wpa_hexdump_key(MSG_MSGDUMP, "PSK (from passphrase)",
1248                                         psk, PMK_LEN);
1249                         wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN, NULL);
1250                         os_memset(psk, 0, sizeof(psk));
1251                 }
1252 #endif /* CONFIG_NO_PBKDF2 */
1253 #ifdef CONFIG_EXT_PASSWORD
1254                 if (ssid->ext_psk) {
1255                         struct wpabuf *pw = ext_password_get(wpa_s->ext_pw,
1256                                                              ssid->ext_psk);
1257                         char pw_str[64 + 1];
1258                         u8 psk[PMK_LEN];
1259
1260                         if (pw == NULL) {
1261                                 wpa_msg(wpa_s, MSG_INFO, "EXT PW: No PSK "
1262                                         "found from external storage");
1263                                 return -1;
1264                         }
1265
1266                         if (wpabuf_len(pw) < 8 || wpabuf_len(pw) > 64) {
1267                                 wpa_msg(wpa_s, MSG_INFO, "EXT PW: Unexpected "
1268                                         "PSK length %d in external storage",
1269                                         (int) wpabuf_len(pw));
1270                                 ext_password_free(pw);
1271                                 return -1;
1272                         }
1273
1274                         os_memcpy(pw_str, wpabuf_head(pw), wpabuf_len(pw));
1275                         pw_str[wpabuf_len(pw)] = '\0';
1276
1277 #ifndef CONFIG_NO_PBKDF2
1278                         if (wpabuf_len(pw) >= 8 && wpabuf_len(pw) < 64 && bss)
1279                         {
1280                                 pbkdf2_sha1(pw_str, bss->ssid, bss->ssid_len,
1281                                             4096, psk, PMK_LEN);
1282                                 os_memset(pw_str, 0, sizeof(pw_str));
1283                                 wpa_hexdump_key(MSG_MSGDUMP, "PSK (from "
1284                                                 "external passphrase)",
1285                                                 psk, PMK_LEN);
1286                                 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN, NULL);
1287                                 os_memset(psk, 0, sizeof(psk));
1288                         } else
1289 #endif /* CONFIG_NO_PBKDF2 */
1290                         if (wpabuf_len(pw) == 2 * PMK_LEN) {
1291                                 if (hexstr2bin(pw_str, psk, PMK_LEN) < 0) {
1292                                         wpa_msg(wpa_s, MSG_INFO, "EXT PW: "
1293                                                 "Invalid PSK hex string");
1294                                         os_memset(pw_str, 0, sizeof(pw_str));
1295                                         ext_password_free(pw);
1296                                         return -1;
1297                                 }
1298                                 wpa_sm_set_pmk(wpa_s->wpa, psk, PMK_LEN, NULL);
1299                                 os_memset(psk, 0, sizeof(psk));
1300                         } else {
1301                                 wpa_msg(wpa_s, MSG_INFO, "EXT PW: No suitable "
1302                                         "PSK available");
1303                                 os_memset(pw_str, 0, sizeof(pw_str));
1304                                 ext_password_free(pw);
1305                                 return -1;
1306                         }
1307
1308                         os_memset(pw_str, 0, sizeof(pw_str));
1309                         ext_password_free(pw);
1310                 }
1311 #endif /* CONFIG_EXT_PASSWORD */
1312         } else
1313                 wpa_sm_set_pmk_from_pmksa(wpa_s->wpa);
1314
1315         return 0;
1316 }
1317
1318
1319 static void wpas_ext_capab_byte(struct wpa_supplicant *wpa_s, u8 *pos, int idx)
1320 {
1321         *pos = 0x00;
1322
1323         switch (idx) {
1324         case 0: /* Bits 0-7 */
1325                 break;
1326         case 1: /* Bits 8-15 */
1327                 break;
1328         case 2: /* Bits 16-23 */
1329 #ifdef CONFIG_WNM
1330                 *pos |= 0x02; /* Bit 17 - WNM-Sleep Mode */
1331                 *pos |= 0x08; /* Bit 19 - BSS Transition */
1332 #endif /* CONFIG_WNM */
1333                 break;
1334         case 3: /* Bits 24-31 */
1335 #ifdef CONFIG_WNM
1336                 *pos |= 0x02; /* Bit 25 - SSID List */
1337 #endif /* CONFIG_WNM */
1338 #ifdef CONFIG_INTERWORKING
1339                 if (wpa_s->conf->interworking)
1340                         *pos |= 0x80; /* Bit 31 - Interworking */
1341 #endif /* CONFIG_INTERWORKING */
1342                 break;
1343         case 4: /* Bits 32-39 */
1344 #ifdef CONFIG_INTERWORKING
1345                 if (wpa_s->drv_flags / WPA_DRIVER_FLAGS_QOS_MAPPING)
1346                         *pos |= 0x01; /* Bit 32 - QoS Map */
1347 #endif /* CONFIG_INTERWORKING */
1348                 break;
1349         case 5: /* Bits 40-47 */
1350 #ifdef CONFIG_HS20
1351                 if (wpa_s->conf->hs20)
1352                         *pos |= 0x40; /* Bit 46 - WNM-Notification */
1353 #endif /* CONFIG_HS20 */
1354                 break;
1355         case 6: /* Bits 48-55 */
1356                 break;
1357         }
1358 }
1359
1360
1361 int wpas_build_ext_capab(struct wpa_supplicant *wpa_s, u8 *buf, size_t buflen)
1362 {
1363         u8 *pos = buf;
1364         u8 len = 6, i;
1365
1366         if (len < wpa_s->extended_capa_len)
1367                 len = wpa_s->extended_capa_len;
1368         if (buflen < (size_t) len + 2) {
1369                 wpa_printf(MSG_INFO,
1370                            "Not enough room for building extended capabilities element");
1371                 return -1;
1372         }
1373
1374         *pos++ = WLAN_EID_EXT_CAPAB;
1375         *pos++ = len;
1376         for (i = 0; i < len; i++, pos++) {
1377                 wpas_ext_capab_byte(wpa_s, pos, i);
1378
1379                 if (i < wpa_s->extended_capa_len) {
1380                         *pos &= ~wpa_s->extended_capa_mask[i];
1381                         *pos |= wpa_s->extended_capa[i];
1382                 }
1383         }
1384
1385         while (len > 0 && buf[1 + len] == 0) {
1386                 len--;
1387                 buf[1] = len;
1388         }
1389         if (len == 0)
1390                 return 0;
1391
1392         return 2 + len;
1393 }
1394
1395
1396 static int wpas_valid_bss(struct wpa_supplicant *wpa_s,
1397                           struct wpa_bss *test_bss)
1398 {
1399         struct wpa_bss *bss;
1400
1401         dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
1402                 if (bss == test_bss)
1403                         return 1;
1404         }
1405
1406         return 0;
1407 }
1408
1409
1410 static int wpas_valid_ssid(struct wpa_supplicant *wpa_s,
1411                            struct wpa_ssid *test_ssid)
1412 {
1413         struct wpa_ssid *ssid;
1414
1415         for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) {
1416                 if (ssid == test_ssid)
1417                         return 1;
1418         }
1419
1420         return 0;
1421 }
1422
1423
1424 int wpas_valid_bss_ssid(struct wpa_supplicant *wpa_s, struct wpa_bss *test_bss,
1425                         struct wpa_ssid *test_ssid)
1426 {
1427         if (test_bss && !wpas_valid_bss(wpa_s, test_bss))
1428                 return 0;
1429
1430         return test_ssid == NULL || wpas_valid_ssid(wpa_s, test_ssid);
1431 }
1432
1433
1434 void wpas_connect_work_free(struct wpa_connect_work *cwork)
1435 {
1436         if (cwork == NULL)
1437                 return;
1438         os_free(cwork);
1439 }
1440
1441
1442 void wpas_connect_work_done(struct wpa_supplicant *wpa_s)
1443 {
1444         struct wpa_connect_work *cwork;
1445         struct wpa_radio_work *work = wpa_s->connect_work;
1446
1447         if (!work)
1448                 return;
1449
1450         wpa_s->connect_work = NULL;
1451         cwork = work->ctx;
1452         work->ctx = NULL;
1453         wpas_connect_work_free(cwork);
1454         radio_work_done(work);
1455 }
1456
1457
1458 int wpas_update_random_addr(struct wpa_supplicant *wpa_s, int style)
1459 {
1460         struct os_reltime now;
1461         u8 addr[ETH_ALEN];
1462
1463         os_get_reltime(&now);
1464         if (wpa_s->last_mac_addr_style == style &&
1465             wpa_s->last_mac_addr_change.sec != 0 &&
1466             !os_reltime_expired(&now, &wpa_s->last_mac_addr_change,
1467                                 wpa_s->conf->rand_addr_lifetime)) {
1468                 wpa_msg(wpa_s, MSG_DEBUG,
1469                         "Previously selected random MAC address has not yet expired");
1470                 return 0;
1471         }
1472
1473         switch (style) {
1474         case 1:
1475                 if (random_mac_addr(addr) < 0)
1476                         return -1;
1477                 break;
1478         case 2:
1479                 os_memcpy(addr, wpa_s->perm_addr, ETH_ALEN);
1480                 if (random_mac_addr_keep_oui(addr) < 0)
1481                         return -1;
1482                 break;
1483         default:
1484                 return -1;
1485         }
1486
1487         if (wpa_drv_set_mac_addr(wpa_s, addr) < 0) {
1488                 wpa_msg(wpa_s, MSG_INFO,
1489                         "Failed to set random MAC address");
1490                 return -1;
1491         }
1492
1493         os_get_reltime(&wpa_s->last_mac_addr_change);
1494         wpa_s->mac_addr_changed = 1;
1495         wpa_s->last_mac_addr_style = style;
1496
1497         if (wpa_supplicant_update_mac_addr(wpa_s) < 0) {
1498                 wpa_msg(wpa_s, MSG_INFO,
1499                         "Could not update MAC address information");
1500                 return -1;
1501         }
1502
1503         wpa_msg(wpa_s, MSG_DEBUG, "Using random MAC address " MACSTR,
1504                 MAC2STR(addr));
1505
1506         return 0;
1507 }
1508
1509
1510 int wpas_update_random_addr_disassoc(struct wpa_supplicant *wpa_s)
1511 {
1512         if (wpa_s->wpa_state >= WPA_AUTHENTICATING ||
1513             !wpa_s->conf->preassoc_mac_addr)
1514                 return 0;
1515
1516         return wpas_update_random_addr(wpa_s, wpa_s->conf->preassoc_mac_addr);
1517 }
1518
1519
1520 static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit);
1521
1522 /**
1523  * wpa_supplicant_associate - Request association
1524  * @wpa_s: Pointer to wpa_supplicant data
1525  * @bss: Scan results for the selected BSS, or %NULL if not available
1526  * @ssid: Configuration data for the selected network
1527  *
1528  * This function is used to request %wpa_supplicant to associate with a BSS.
1529  */
1530 void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
1531                               struct wpa_bss *bss, struct wpa_ssid *ssid)
1532 {
1533         struct wpa_connect_work *cwork;
1534         int rand_style;
1535
1536         if (ssid->mac_addr == -1)
1537                 rand_style = wpa_s->conf->mac_addr;
1538         else
1539                 rand_style = ssid->mac_addr;
1540
1541         wmm_ac_clear_saved_tspecs(wpa_s);
1542         wpa_s->reassoc_same_bss = 0;
1543
1544         if (wpa_s->last_ssid == ssid) {
1545                 wpa_dbg(wpa_s, MSG_DEBUG, "Re-association to the same ESS");
1546                 if (wpa_s->current_bss && wpa_s->current_bss == bss) {
1547                         wmm_ac_save_tspecs(wpa_s);
1548                         wpa_s->reassoc_same_bss = 1;
1549                 }
1550         } else if (rand_style > 0) {
1551                 if (wpas_update_random_addr(wpa_s, rand_style) < 0)
1552                         return;
1553                 wpa_sm_pmksa_cache_flush(wpa_s->wpa, ssid);
1554         } else if (wpa_s->mac_addr_changed) {
1555                 if (wpa_drv_set_mac_addr(wpa_s, NULL) < 0) {
1556                         wpa_msg(wpa_s, MSG_INFO,
1557                                 "Could not restore permanent MAC address");
1558                         return;
1559                 }
1560                 wpa_s->mac_addr_changed = 0;
1561                 if (wpa_supplicant_update_mac_addr(wpa_s) < 0) {
1562                         wpa_msg(wpa_s, MSG_INFO,
1563                                 "Could not update MAC address information");
1564                         return;
1565                 }
1566                 wpa_msg(wpa_s, MSG_DEBUG, "Using permanent MAC address");
1567         }
1568         wpa_s->last_ssid = ssid;
1569
1570 #ifdef CONFIG_IBSS_RSN
1571         ibss_rsn_deinit(wpa_s->ibss_rsn);
1572         wpa_s->ibss_rsn = NULL;
1573 #endif /* CONFIG_IBSS_RSN */
1574
1575         if (ssid->mode == WPAS_MODE_AP || ssid->mode == WPAS_MODE_P2P_GO ||
1576             ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) {
1577 #ifdef CONFIG_AP
1578                 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_AP)) {
1579                         wpa_msg(wpa_s, MSG_INFO, "Driver does not support AP "
1580                                 "mode");
1581                         return;
1582                 }
1583                 if (wpa_supplicant_create_ap(wpa_s, ssid) < 0) {
1584                         wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
1585                         if (ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION)
1586                                 wpas_p2p_ap_setup_failed(wpa_s);
1587                         return;
1588                 }
1589                 wpa_s->current_bss = bss;
1590 #else /* CONFIG_AP */
1591                 wpa_msg(wpa_s, MSG_ERROR, "AP mode support not included in "
1592                         "the build");
1593 #endif /* CONFIG_AP */
1594                 return;
1595         }
1596
1597         if (ssid->mode == WPAS_MODE_MESH) {
1598 #ifdef CONFIG_MESH
1599                 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_MESH)) {
1600                         wpa_msg(wpa_s, MSG_INFO,
1601                                 "Driver does not support mesh mode");
1602                         return;
1603                 }
1604                 if (bss)
1605                         ssid->frequency = bss->freq;
1606                 if (wpa_supplicant_join_mesh(wpa_s, ssid) < 0) {
1607                         wpa_msg(wpa_s, MSG_ERROR, "Could not join mesh");
1608                         return;
1609                 }
1610                 wpa_s->current_bss = bss;
1611                 wpa_msg_ctrl(wpa_s, MSG_INFO, MESH_GROUP_STARTED
1612                              "ssid=\"%s\" id=%d",
1613                              wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
1614                              ssid->id);
1615 #else /* CONFIG_MESH */
1616                 wpa_msg(wpa_s, MSG_ERROR,
1617                         "mesh mode support not included in the build");
1618 #endif /* CONFIG_MESH */
1619                 return;
1620         }
1621
1622 #ifdef CONFIG_TDLS
1623         if (bss)
1624                 wpa_tdls_ap_ies(wpa_s->wpa, (const u8 *) (bss + 1),
1625                                 bss->ie_len);
1626 #endif /* CONFIG_TDLS */
1627
1628         if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) &&
1629             ssid->mode == IEEE80211_MODE_INFRA) {
1630                 sme_authenticate(wpa_s, bss, ssid);
1631                 return;
1632         }
1633
1634         if (wpa_s->connect_work) {
1635                 wpa_dbg(wpa_s, MSG_DEBUG, "Reject wpa_supplicant_associate() call since connect_work exist");
1636                 return;
1637         }
1638
1639         if (radio_work_pending(wpa_s, "connect")) {
1640                 wpa_dbg(wpa_s, MSG_DEBUG, "Reject wpa_supplicant_associate() call since pending work exist");
1641                 return;
1642         }
1643
1644         cwork = os_zalloc(sizeof(*cwork));
1645         if (cwork == NULL)
1646                 return;
1647
1648         cwork->bss = bss;
1649         cwork->ssid = ssid;
1650
1651         if (radio_add_work(wpa_s, bss ? bss->freq : 0, "connect", 1,
1652                            wpas_start_assoc_cb, cwork) < 0) {
1653                 os_free(cwork);
1654         }
1655 }
1656
1657
1658 static int bss_is_ibss(struct wpa_bss *bss)
1659 {
1660         return (bss->caps & (IEEE80211_CAP_ESS | IEEE80211_CAP_IBSS)) ==
1661                 IEEE80211_CAP_IBSS;
1662 }
1663
1664
1665 void ibss_mesh_setup_freq(struct wpa_supplicant *wpa_s,
1666                           const struct wpa_ssid *ssid,
1667                           struct hostapd_freq_params *freq)
1668 {
1669         enum hostapd_hw_mode hw_mode;
1670         struct hostapd_hw_modes *mode = NULL;
1671         int ht40plus[] = { 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157,
1672                            184, 192 };
1673         int vht80[] = { 36, 52, 100, 116, 132, 149 };
1674         struct hostapd_channel_data *pri_chan = NULL, *sec_chan = NULL;
1675         u8 channel;
1676         int i, chan_idx, ht40 = -1, res, obss_scan = 1;
1677         unsigned int j;
1678         struct hostapd_freq_params vht_freq;
1679
1680         freq->freq = ssid->frequency;
1681
1682         for (j = 0; j < wpa_s->last_scan_res_used; j++) {
1683                 struct wpa_bss *bss = wpa_s->last_scan_res[j];
1684
1685                 if (ssid->mode != WPAS_MODE_IBSS)
1686                         break;
1687
1688                 /* Don't adjust control freq in case of fixed_freq */
1689                 if (ssid->fixed_freq)
1690                         break;
1691
1692                 if (!bss_is_ibss(bss))
1693                         continue;
1694
1695                 if (ssid->ssid_len == bss->ssid_len &&
1696                     os_memcmp(ssid->ssid, bss->ssid, bss->ssid_len) == 0) {
1697                         wpa_printf(MSG_DEBUG,
1698                                    "IBSS already found in scan results, adjust control freq: %d",
1699                                    bss->freq);
1700                         freq->freq = bss->freq;
1701                         obss_scan = 0;
1702                         break;
1703                 }
1704         }
1705
1706         /* For IBSS check HT_IBSS flag */
1707         if (ssid->mode == WPAS_MODE_IBSS &&
1708             !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_HT_IBSS))
1709                 return;
1710
1711         if (wpa_s->group_cipher == WPA_CIPHER_WEP40 ||
1712             wpa_s->group_cipher == WPA_CIPHER_WEP104 ||
1713             wpa_s->pairwise_cipher == WPA_CIPHER_TKIP) {
1714                 wpa_printf(MSG_DEBUG,
1715                            "IBSS: WEP/TKIP detected, do not try to enable HT");
1716                 return;
1717         }
1718
1719         hw_mode = ieee80211_freq_to_chan(freq->freq, &channel);
1720         for (i = 0; wpa_s->hw.modes && i < wpa_s->hw.num_modes; i++) {
1721                 if (wpa_s->hw.modes[i].mode == hw_mode) {
1722                         mode = &wpa_s->hw.modes[i];
1723                         break;
1724                 }
1725         }
1726
1727         if (!mode)
1728                 return;
1729
1730         freq->ht_enabled = ht_supported(mode);
1731         if (!freq->ht_enabled)
1732                 return;
1733
1734         /* Setup higher BW only for 5 GHz */
1735         if (mode->mode != HOSTAPD_MODE_IEEE80211A)
1736                 return;
1737
1738         for (chan_idx = 0; chan_idx < mode->num_channels; chan_idx++) {
1739                 pri_chan = &mode->channels[chan_idx];
1740                 if (pri_chan->chan == channel)
1741                         break;
1742                 pri_chan = NULL;
1743         }
1744         if (!pri_chan)
1745                 return;
1746
1747         /* Check primary channel flags */
1748         if (pri_chan->flag & (HOSTAPD_CHAN_DISABLED | HOSTAPD_CHAN_NO_IR))
1749                 return;
1750
1751         /* Check/setup HT40+/HT40- */
1752         for (j = 0; j < ARRAY_SIZE(ht40plus); j++) {
1753                 if (ht40plus[j] == channel) {
1754                         ht40 = 1;
1755                         break;
1756                 }
1757         }
1758
1759         /* Find secondary channel */
1760         for (i = 0; i < mode->num_channels; i++) {
1761                 sec_chan = &mode->channels[i];
1762                 if (sec_chan->chan == channel + ht40 * 4)
1763                         break;
1764                 sec_chan = NULL;
1765         }
1766         if (!sec_chan)
1767                 return;
1768
1769         /* Check secondary channel flags */
1770         if (sec_chan->flag & (HOSTAPD_CHAN_DISABLED | HOSTAPD_CHAN_NO_IR))
1771                 return;
1772
1773         freq->channel = pri_chan->chan;
1774
1775         switch (ht40) {
1776         case -1:
1777                 if (!(pri_chan->flag & HOSTAPD_CHAN_HT40MINUS))
1778                         return;
1779                 freq->sec_channel_offset = -1;
1780                 break;
1781         case 1:
1782                 if (!(pri_chan->flag & HOSTAPD_CHAN_HT40PLUS))
1783                         return;
1784                 freq->sec_channel_offset = 1;
1785                 break;
1786         default:
1787                 break;
1788         }
1789
1790         if (freq->sec_channel_offset && obss_scan) {
1791                 struct wpa_scan_results *scan_res;
1792
1793                 scan_res = wpa_supplicant_get_scan_results(wpa_s, NULL, 0);
1794                 if (scan_res == NULL) {
1795                         /* Back to HT20 */
1796                         freq->sec_channel_offset = 0;
1797                         return;
1798                 }
1799
1800                 res = check_40mhz_5g(mode, scan_res, pri_chan->chan,
1801                                      sec_chan->chan);
1802                 switch (res) {
1803                 case 0:
1804                         /* Back to HT20 */
1805                         freq->sec_channel_offset = 0;
1806                         break;
1807                 case 1:
1808                         /* Configuration allowed */
1809                         break;
1810                 case 2:
1811                         /* Switch pri/sec channels */
1812                         freq->freq = hw_get_freq(mode, sec_chan->chan);
1813                         freq->sec_channel_offset = -freq->sec_channel_offset;
1814                         freq->channel = sec_chan->chan;
1815                         break;
1816                 default:
1817                         freq->sec_channel_offset = 0;
1818                         break;
1819                 }
1820
1821                 wpa_scan_results_free(scan_res);
1822         }
1823
1824         wpa_printf(MSG_DEBUG,
1825                    "IBSS/mesh: setup freq channel %d, sec_channel_offset %d",
1826                    freq->channel, freq->sec_channel_offset);
1827
1828         /* Not sure if mesh is ready for VHT */
1829         if (ssid->mode != WPAS_MODE_IBSS)
1830                 return;
1831
1832         /* For IBSS check VHT_IBSS flag */
1833         if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_VHT_IBSS))
1834                 return;
1835
1836         vht_freq = *freq;
1837
1838         vht_freq.vht_enabled = vht_supported(mode);
1839         if (!vht_freq.vht_enabled)
1840                 return;
1841
1842         /* setup center_freq1, bandwidth */
1843         for (j = 0; j < ARRAY_SIZE(vht80); j++) {
1844                 if (freq->channel >= vht80[j] &&
1845                     freq->channel < vht80[j] + 16)
1846                         break;
1847         }
1848
1849         if (j == ARRAY_SIZE(vht80))
1850                 return;
1851
1852         for (i = vht80[j]; i < vht80[j] + 16; i += 4) {
1853                 struct hostapd_channel_data *chan;
1854
1855                 chan = hw_get_channel_chan(mode, i, NULL);
1856                 if (!chan)
1857                         return;
1858
1859                 /* Back to HT configuration if channel not usable */
1860                 if (chan->flag & (HOSTAPD_CHAN_DISABLED | HOSTAPD_CHAN_NO_IR))
1861                         return;
1862         }
1863
1864         if (hostapd_set_freq_params(&vht_freq, mode->mode, freq->freq,
1865                                     freq->channel, freq->ht_enabled,
1866                                     vht_freq.vht_enabled,
1867                                     freq->sec_channel_offset,
1868                                     VHT_CHANWIDTH_80MHZ,
1869                                     vht80[j] + 6, 0, 0) != 0)
1870                 return;
1871
1872         *freq = vht_freq;
1873
1874         wpa_printf(MSG_DEBUG, "IBSS: VHT setup freq cf1 %d, cf2 %d, bw %d",
1875                    freq->center_freq1, freq->center_freq2, freq->bandwidth);
1876 }
1877
1878
1879 static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
1880 {
1881         struct wpa_connect_work *cwork = work->ctx;
1882         struct wpa_bss *bss = cwork->bss;
1883         struct wpa_ssid *ssid = cwork->ssid;
1884         struct wpa_supplicant *wpa_s = work->wpa_s;
1885         u8 wpa_ie[200];
1886         size_t wpa_ie_len;
1887         int use_crypt, ret, i, bssid_changed;
1888         int algs = WPA_AUTH_ALG_OPEN;
1889         unsigned int cipher_pairwise, cipher_group;
1890         struct wpa_driver_associate_params params;
1891         int wep_keys_set = 0;
1892         int assoc_failed = 0;
1893         struct wpa_ssid *old_ssid;
1894 #ifdef CONFIG_HT_OVERRIDES
1895         struct ieee80211_ht_capabilities htcaps;
1896         struct ieee80211_ht_capabilities htcaps_mask;
1897 #endif /* CONFIG_HT_OVERRIDES */
1898 #ifdef CONFIG_VHT_OVERRIDES
1899        struct ieee80211_vht_capabilities vhtcaps;
1900        struct ieee80211_vht_capabilities vhtcaps_mask;
1901 #endif /* CONFIG_VHT_OVERRIDES */
1902
1903         if (deinit) {
1904                 if (work->started) {
1905                         wpa_s->connect_work = NULL;
1906
1907                         /* cancel possible auth. timeout */
1908                         eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s,
1909                                              NULL);
1910                 }
1911                 wpas_connect_work_free(cwork);
1912                 return;
1913         }
1914
1915         wpa_s->connect_work = work;
1916
1917         if (cwork->bss_removed || !wpas_valid_bss_ssid(wpa_s, bss, ssid)) {
1918                 wpa_dbg(wpa_s, MSG_DEBUG, "BSS/SSID entry for association not valid anymore - drop connection attempt");
1919                 wpas_connect_work_done(wpa_s);
1920                 return;
1921         }
1922
1923         os_memset(&params, 0, sizeof(params));
1924         wpa_s->reassociate = 0;
1925         wpa_s->eap_expected_failure = 0;
1926         if (bss &&
1927             (!wpas_driver_bss_selection(wpa_s) || wpas_wps_searching(wpa_s))) {
1928 #ifdef CONFIG_IEEE80211R
1929                 const u8 *ie, *md = NULL;
1930 #endif /* CONFIG_IEEE80211R */
1931                 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with " MACSTR
1932                         " (SSID='%s' freq=%d MHz)", MAC2STR(bss->bssid),
1933                         wpa_ssid_txt(bss->ssid, bss->ssid_len), bss->freq);
1934                 bssid_changed = !is_zero_ether_addr(wpa_s->bssid);
1935                 os_memset(wpa_s->bssid, 0, ETH_ALEN);
1936                 os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN);
1937                 if (bssid_changed)
1938                         wpas_notify_bssid_changed(wpa_s);
1939 #ifdef CONFIG_IEEE80211R
1940                 ie = wpa_bss_get_ie(bss, WLAN_EID_MOBILITY_DOMAIN);
1941                 if (ie && ie[1] >= MOBILITY_DOMAIN_ID_LEN)
1942                         md = ie + 2;
1943                 wpa_sm_set_ft_params(wpa_s->wpa, ie, ie ? 2 + ie[1] : 0);
1944                 if (md) {
1945                         /* Prepare for the next transition */
1946                         wpa_ft_prepare_auth_request(wpa_s->wpa, ie);
1947                 }
1948 #endif /* CONFIG_IEEE80211R */
1949 #ifdef CONFIG_WPS
1950         } else if ((ssid->ssid == NULL || ssid->ssid_len == 0) &&
1951                    wpa_s->conf->ap_scan == 2 &&
1952                    (ssid->key_mgmt & WPA_KEY_MGMT_WPS)) {
1953                 /* Use ap_scan==1 style network selection to find the network
1954                  */
1955                 wpas_connect_work_done(wpa_s);
1956                 wpa_s->scan_req = MANUAL_SCAN_REQ;
1957                 wpa_s->reassociate = 1;
1958                 wpa_supplicant_req_scan(wpa_s, 0, 0);
1959                 return;
1960 #endif /* CONFIG_WPS */
1961         } else {
1962                 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with SSID '%s'",
1963                         wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
1964                 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
1965         }
1966         wpa_supplicant_cancel_sched_scan(wpa_s);
1967         wpa_supplicant_cancel_scan(wpa_s);
1968
1969         /* Starting new association, so clear the possibly used WPA IE from the
1970          * previous association. */
1971         wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
1972
1973 #ifdef IEEE8021X_EAPOL
1974         if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
1975                 if (ssid->leap) {
1976                         if (ssid->non_leap == 0)
1977                                 algs = WPA_AUTH_ALG_LEAP;
1978                         else
1979                                 algs |= WPA_AUTH_ALG_LEAP;
1980                 }
1981         }
1982 #endif /* IEEE8021X_EAPOL */
1983         wpa_dbg(wpa_s, MSG_DEBUG, "Automatic auth_alg selection: 0x%x", algs);
1984         if (ssid->auth_alg) {
1985                 algs = ssid->auth_alg;
1986                 wpa_dbg(wpa_s, MSG_DEBUG, "Overriding auth_alg selection: "
1987                         "0x%x", algs);
1988         }
1989
1990         if (bss && (wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE) ||
1991                     wpa_bss_get_ie(bss, WLAN_EID_RSN)) &&
1992             wpa_key_mgmt_wpa(ssid->key_mgmt)) {
1993                 int try_opportunistic;
1994                 try_opportunistic = (ssid->proactive_key_caching < 0 ?
1995                                      wpa_s->conf->okc :
1996                                      ssid->proactive_key_caching) &&
1997                         (ssid->proto & WPA_PROTO_RSN);
1998                 if (pmksa_cache_set_current(wpa_s->wpa, NULL, bss->bssid,
1999                                             ssid, try_opportunistic) == 0)
2000                         eapol_sm_notify_pmkid_attempt(wpa_s->eapol);
2001                 wpa_ie_len = sizeof(wpa_ie);
2002                 if (wpa_supplicant_set_suites(wpa_s, bss, ssid,
2003                                               wpa_ie, &wpa_ie_len)) {
2004                         wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA "
2005                                 "key management and encryption suites");
2006                         wpas_connect_work_done(wpa_s);
2007                         return;
2008                 }
2009         } else if ((ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) && bss &&
2010                    wpa_key_mgmt_wpa_ieee8021x(ssid->key_mgmt)) {
2011                 /*
2012                  * Both WPA and non-WPA IEEE 802.1X enabled in configuration -
2013                  * use non-WPA since the scan results did not indicate that the
2014                  * AP is using WPA or WPA2.
2015                  */
2016                 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
2017                 wpa_ie_len = 0;
2018                 wpa_s->wpa_proto = 0;
2019         } else if (wpa_key_mgmt_wpa_any(ssid->key_mgmt)) {
2020                 wpa_ie_len = sizeof(wpa_ie);
2021                 if (wpa_supplicant_set_suites(wpa_s, NULL, ssid,
2022                                               wpa_ie, &wpa_ie_len)) {
2023                         wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed to set WPA "
2024                                 "key management and encryption suites (no "
2025                                 "scan results)");
2026                         wpas_connect_work_done(wpa_s);
2027                         return;
2028                 }
2029 #ifdef CONFIG_WPS
2030         } else if (ssid->key_mgmt & WPA_KEY_MGMT_WPS) {
2031                 struct wpabuf *wps_ie;
2032                 wps_ie = wps_build_assoc_req_ie(wpas_wps_get_req_type(ssid));
2033                 if (wps_ie && wpabuf_len(wps_ie) <= sizeof(wpa_ie)) {
2034                         wpa_ie_len = wpabuf_len(wps_ie);
2035                         os_memcpy(wpa_ie, wpabuf_head(wps_ie), wpa_ie_len);
2036                 } else
2037                         wpa_ie_len = 0;
2038                 wpabuf_free(wps_ie);
2039                 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
2040                 if (!bss || (bss->caps & IEEE80211_CAP_PRIVACY))
2041                         params.wps = WPS_MODE_PRIVACY;
2042                 else
2043                         params.wps = WPS_MODE_OPEN;
2044                 wpa_s->wpa_proto = 0;
2045 #endif /* CONFIG_WPS */
2046         } else {
2047                 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
2048                 wpa_ie_len = 0;
2049                 wpa_s->wpa_proto = 0;
2050         }
2051
2052 #ifdef CONFIG_P2P
2053         if (wpa_s->global->p2p) {
2054                 u8 *pos;
2055                 size_t len;
2056                 int res;
2057                 pos = wpa_ie + wpa_ie_len;
2058                 len = sizeof(wpa_ie) - wpa_ie_len;
2059                 res = wpas_p2p_assoc_req_ie(wpa_s, bss, pos, len,
2060                                             ssid->p2p_group);
2061                 if (res >= 0)
2062                         wpa_ie_len += res;
2063         }
2064
2065         wpa_s->cross_connect_disallowed = 0;
2066         if (bss) {
2067                 struct wpabuf *p2p;
2068                 p2p = wpa_bss_get_vendor_ie_multi(bss, P2P_IE_VENDOR_TYPE);
2069                 if (p2p) {
2070                         wpa_s->cross_connect_disallowed =
2071                                 p2p_get_cross_connect_disallowed(p2p);
2072                         wpabuf_free(p2p);
2073                         wpa_dbg(wpa_s, MSG_DEBUG, "P2P: WLAN AP %s cross "
2074                                 "connection",
2075                                 wpa_s->cross_connect_disallowed ?
2076                                 "disallows" : "allows");
2077                 }
2078         }
2079
2080         os_memset(wpa_s->p2p_ip_addr_info, 0, sizeof(wpa_s->p2p_ip_addr_info));
2081 #endif /* CONFIG_P2P */
2082
2083 #ifdef CONFIG_HS20
2084         if (is_hs20_network(wpa_s, ssid, bss)) {
2085                 struct wpabuf *hs20;
2086                 hs20 = wpabuf_alloc(20);
2087                 if (hs20) {
2088                         int pps_mo_id = hs20_get_pps_mo_id(wpa_s, ssid);
2089                         size_t len;
2090
2091                         wpas_hs20_add_indication(hs20, pps_mo_id);
2092                         len = sizeof(wpa_ie) - wpa_ie_len;
2093                         if (wpabuf_len(hs20) <= len) {
2094                                 os_memcpy(wpa_ie + wpa_ie_len,
2095                                           wpabuf_head(hs20), wpabuf_len(hs20));
2096                                 wpa_ie_len += wpabuf_len(hs20);
2097                         }
2098                         wpabuf_free(hs20);
2099                 }
2100         }
2101 #endif /* CONFIG_HS20 */
2102
2103         /*
2104          * Workaround: Add Extended Capabilities element only if the AP
2105          * included this element in Beacon/Probe Response frames. Some older
2106          * APs seem to have interoperability issues if this element is
2107          * included, so while the standard may require us to include the
2108          * element in all cases, it is justifiable to skip it to avoid
2109          * interoperability issues.
2110          */
2111         if (!bss || wpa_bss_get_ie(bss, WLAN_EID_EXT_CAPAB)) {
2112                 u8 ext_capab[18];
2113                 int ext_capab_len;
2114                 ext_capab_len = wpas_build_ext_capab(wpa_s, ext_capab,
2115                                                      sizeof(ext_capab));
2116                 if (ext_capab_len > 0) {
2117                         u8 *pos = wpa_ie;
2118                         if (wpa_ie_len > 0 && pos[0] == WLAN_EID_RSN)
2119                                 pos += 2 + pos[1];
2120                         os_memmove(pos + ext_capab_len, pos,
2121                                    wpa_ie_len - (pos - wpa_ie));
2122                         wpa_ie_len += ext_capab_len;
2123                         os_memcpy(pos, ext_capab, ext_capab_len);
2124                 }
2125         }
2126
2127         if (wpa_s->vendor_elem[VENDOR_ELEM_ASSOC_REQ]) {
2128                 struct wpabuf *buf = wpa_s->vendor_elem[VENDOR_ELEM_ASSOC_REQ];
2129                 size_t len;
2130
2131                 len = sizeof(wpa_ie) - wpa_ie_len;
2132                 if (wpabuf_len(buf) <= len) {
2133                         os_memcpy(wpa_ie + wpa_ie_len,
2134                                   wpabuf_head(buf), wpabuf_len(buf));
2135                         wpa_ie_len += wpabuf_len(buf);
2136                 }
2137         }
2138
2139         wpa_clear_keys(wpa_s, bss ? bss->bssid : NULL);
2140         use_crypt = 1;
2141         cipher_pairwise = wpa_s->pairwise_cipher;
2142         cipher_group = wpa_s->group_cipher;
2143         if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
2144             wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
2145                 if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE)
2146                         use_crypt = 0;
2147                 if (wpa_set_wep_keys(wpa_s, ssid)) {
2148                         use_crypt = 1;
2149                         wep_keys_set = 1;
2150                 }
2151         }
2152         if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPS)
2153                 use_crypt = 0;
2154
2155 #ifdef IEEE8021X_EAPOL
2156         if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
2157                 if ((ssid->eapol_flags &
2158                      (EAPOL_FLAG_REQUIRE_KEY_UNICAST |
2159                       EAPOL_FLAG_REQUIRE_KEY_BROADCAST)) == 0 &&
2160                     !wep_keys_set) {
2161                         use_crypt = 0;
2162                 } else {
2163                         /* Assume that dynamic WEP-104 keys will be used and
2164                          * set cipher suites in order for drivers to expect
2165                          * encryption. */
2166                         cipher_pairwise = cipher_group = WPA_CIPHER_WEP104;
2167                 }
2168         }
2169 #endif /* IEEE8021X_EAPOL */
2170
2171         if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
2172                 /* Set the key before (and later after) association */
2173                 wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
2174         }
2175
2176         wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING);
2177         if (bss) {
2178                 params.ssid = bss->ssid;
2179                 params.ssid_len = bss->ssid_len;
2180                 if (!wpas_driver_bss_selection(wpa_s) || ssid->bssid_set) {
2181                         wpa_printf(MSG_DEBUG, "Limit connection to BSSID "
2182                                    MACSTR " freq=%u MHz based on scan results "
2183                                    "(bssid_set=%d)",
2184                                    MAC2STR(bss->bssid), bss->freq,
2185                                    ssid->bssid_set);
2186                         params.bssid = bss->bssid;
2187                         params.freq.freq = bss->freq;
2188                 }
2189                 params.bssid_hint = bss->bssid;
2190                 params.freq_hint = bss->freq;
2191         } else {
2192                 params.ssid = ssid->ssid;
2193                 params.ssid_len = ssid->ssid_len;
2194         }
2195
2196         if (ssid->mode == WPAS_MODE_IBSS && ssid->bssid_set &&
2197             wpa_s->conf->ap_scan == 2) {
2198                 params.bssid = ssid->bssid;
2199                 params.fixed_bssid = 1;
2200         }
2201
2202         /* Initial frequency for IBSS/mesh */
2203         if ((ssid->mode == WPAS_MODE_IBSS || ssid->mode == WPAS_MODE_MESH) &&
2204             ssid->frequency > 0 && params.freq.freq == 0)
2205                 ibss_mesh_setup_freq(wpa_s, ssid, &params.freq);
2206
2207         if (ssid->mode == WPAS_MODE_IBSS) {
2208                 params.fixed_freq = ssid->fixed_freq;
2209                 if (ssid->beacon_int)
2210                         params.beacon_int = ssid->beacon_int;
2211                 else
2212                         params.beacon_int = wpa_s->conf->beacon_int;
2213         }
2214
2215         params.wpa_ie = wpa_ie;
2216         params.wpa_ie_len = wpa_ie_len;
2217         params.pairwise_suite = cipher_pairwise;
2218         params.group_suite = cipher_group;
2219         params.key_mgmt_suite = wpa_s->key_mgmt;
2220         params.wpa_proto = wpa_s->wpa_proto;
2221         params.auth_alg = algs;
2222         params.mode = ssid->mode;
2223         params.bg_scan_period = ssid->bg_scan_period;
2224         for (i = 0; i < NUM_WEP_KEYS; i++) {
2225                 if (ssid->wep_key_len[i])
2226                         params.wep_key[i] = ssid->wep_key[i];
2227                 params.wep_key_len[i] = ssid->wep_key_len[i];
2228         }
2229         params.wep_tx_keyidx = ssid->wep_tx_keyidx;
2230
2231         if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) &&
2232             (params.key_mgmt_suite == WPA_KEY_MGMT_PSK ||
2233              params.key_mgmt_suite == WPA_KEY_MGMT_FT_PSK)) {
2234                 params.passphrase = ssid->passphrase;
2235                 if (ssid->psk_set)
2236                         params.psk = ssid->psk;
2237         }
2238
2239         if (wpa_s->conf->key_mgmt_offload) {
2240                 if (params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X ||
2241                     params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SHA256 ||
2242                     params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SUITE_B ||
2243                     params.key_mgmt_suite == WPA_KEY_MGMT_IEEE8021X_SUITE_B_192)
2244                         params.req_key_mgmt_offload =
2245                                 ssid->proactive_key_caching < 0 ?
2246                                 wpa_s->conf->okc : ssid->proactive_key_caching;
2247                 else
2248                         params.req_key_mgmt_offload = 1;
2249
2250                 if ((params.key_mgmt_suite == WPA_KEY_MGMT_PSK ||
2251                      params.key_mgmt_suite == WPA_KEY_MGMT_PSK_SHA256 ||
2252                      params.key_mgmt_suite == WPA_KEY_MGMT_FT_PSK) &&
2253                     ssid->psk_set)
2254                         params.psk = ssid->psk;
2255         }
2256
2257         params.drop_unencrypted = use_crypt;
2258
2259 #ifdef CONFIG_IEEE80211W
2260         params.mgmt_frame_protection = wpas_get_ssid_pmf(wpa_s, ssid);
2261         if (params.mgmt_frame_protection != NO_MGMT_FRAME_PROTECTION && bss) {
2262                 const u8 *rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
2263                 struct wpa_ie_data ie;
2264                 if (rsn && wpa_parse_wpa_ie(rsn, 2 + rsn[1], &ie) == 0 &&
2265                     ie.capabilities &
2266                     (WPA_CAPABILITY_MFPC | WPA_CAPABILITY_MFPR)) {
2267                         wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Selected AP supports "
2268                                 "MFP: require MFP");
2269                         params.mgmt_frame_protection =
2270                                 MGMT_FRAME_PROTECTION_REQUIRED;
2271                 }
2272         }
2273 #endif /* CONFIG_IEEE80211W */
2274
2275         params.p2p = ssid->p2p_group;
2276
2277         if (wpa_s->parent->set_sta_uapsd)
2278                 params.uapsd = wpa_s->parent->sta_uapsd;
2279         else
2280                 params.uapsd = -1;
2281
2282 #ifdef CONFIG_HT_OVERRIDES
2283         os_memset(&htcaps, 0, sizeof(htcaps));
2284         os_memset(&htcaps_mask, 0, sizeof(htcaps_mask));
2285         params.htcaps = (u8 *) &htcaps;
2286         params.htcaps_mask = (u8 *) &htcaps_mask;
2287         wpa_supplicant_apply_ht_overrides(wpa_s, ssid, &params);
2288 #endif /* CONFIG_HT_OVERRIDES */
2289 #ifdef CONFIG_VHT_OVERRIDES
2290         os_memset(&vhtcaps, 0, sizeof(vhtcaps));
2291         os_memset(&vhtcaps_mask, 0, sizeof(vhtcaps_mask));
2292         params.vhtcaps = &vhtcaps;
2293         params.vhtcaps_mask = &vhtcaps_mask;
2294         wpa_supplicant_apply_vht_overrides(wpa_s, ssid, &params);
2295 #endif /* CONFIG_VHT_OVERRIDES */
2296
2297 #ifdef CONFIG_P2P
2298         /*
2299          * If multi-channel concurrency is not supported, check for any
2300          * frequency conflict. In case of any frequency conflict, remove the
2301          * least prioritized connection.
2302          */
2303         if (wpa_s->num_multichan_concurrent < 2) {
2304                 int freq, num;
2305                 num = get_shared_radio_freqs(wpa_s, &freq, 1);
2306                 if (num > 0 && freq > 0 && freq != params.freq.freq) {
2307                         wpa_printf(MSG_DEBUG,
2308                                    "Assoc conflicting freq found (%d != %d)",
2309                                    freq, params.freq.freq);
2310                         if (wpas_p2p_handle_frequency_conflicts(
2311                                     wpa_s, params.freq.freq, ssid) < 0) {
2312                                 wpas_connect_work_done(wpa_s);
2313                                 return;
2314                         }
2315                 }
2316         }
2317 #endif /* CONFIG_P2P */
2318
2319         ret = wpa_drv_associate(wpa_s, &params);
2320         if (ret < 0) {
2321                 wpa_msg(wpa_s, MSG_INFO, "Association request to the driver "
2322                         "failed");
2323                 if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SANE_ERROR_CODES) {
2324                         /*
2325                          * The driver is known to mean what is saying, so we
2326                          * can stop right here; the association will not
2327                          * succeed.
2328                          */
2329                         wpas_connection_failed(wpa_s, wpa_s->pending_bssid);
2330                         wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
2331                         os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
2332                         return;
2333                 }
2334                 /* try to continue anyway; new association will be tried again
2335                  * after timeout */
2336                 assoc_failed = 1;
2337         }
2338
2339         if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
2340                 /* Set the key after the association just in case association
2341                  * cleared the previously configured key. */
2342                 wpa_supplicant_set_wpa_none_key(wpa_s, ssid);
2343                 /* No need to timeout authentication since there is no key
2344                  * management. */
2345                 wpa_supplicant_cancel_auth_timeout(wpa_s);
2346                 wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
2347 #ifdef CONFIG_IBSS_RSN
2348         } else if (ssid->mode == WPAS_MODE_IBSS &&
2349                    wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
2350                    wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE) {
2351                 /*
2352                  * RSN IBSS authentication is per-STA and we can disable the
2353                  * per-BSSID authentication.
2354                  */
2355                 wpa_supplicant_cancel_auth_timeout(wpa_s);
2356 #endif /* CONFIG_IBSS_RSN */
2357         } else {
2358                 /* Timeout for IEEE 802.11 authentication and association */
2359                 int timeout = 60;
2360
2361                 if (assoc_failed) {
2362                         /* give IBSS a bit more time */
2363                         timeout = ssid->mode == WPAS_MODE_IBSS ? 10 : 5;
2364                 } else if (wpa_s->conf->ap_scan == 1) {
2365                         /* give IBSS a bit more time */
2366                         timeout = ssid->mode == WPAS_MODE_IBSS ? 20 : 10;
2367                 }
2368                 wpa_supplicant_req_auth_timeout(wpa_s, timeout, 0);
2369         }
2370
2371         if (wep_keys_set &&
2372             (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC)) {
2373                 /* Set static WEP keys again */
2374                 wpa_set_wep_keys(wpa_s, ssid);
2375         }
2376
2377         if (wpa_s->current_ssid && wpa_s->current_ssid != ssid) {
2378                 /*
2379                  * Do not allow EAP session resumption between different
2380                  * network configurations.
2381                  */
2382                 eapol_sm_invalidate_cached_session(wpa_s->eapol);
2383         }
2384         old_ssid = wpa_s->current_ssid;
2385         wpa_s->current_ssid = ssid;
2386         wpa_s->current_bss = bss;
2387         wpa_supplicant_rsn_supp_set_config(wpa_s, wpa_s->current_ssid);
2388         wpa_supplicant_initiate_eapol(wpa_s);
2389         if (old_ssid != wpa_s->current_ssid)
2390                 wpas_notify_network_changed(wpa_s);
2391 }
2392
2393
2394 static void wpa_supplicant_clear_connection(struct wpa_supplicant *wpa_s,
2395                                             const u8 *addr)
2396 {
2397         struct wpa_ssid *old_ssid;
2398
2399         wpas_connect_work_done(wpa_s);
2400         wpa_clear_keys(wpa_s, addr);
2401         old_ssid = wpa_s->current_ssid;
2402         wpa_supplicant_mark_disassoc(wpa_s);
2403         wpa_sm_set_config(wpa_s->wpa, NULL);
2404         eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
2405         if (old_ssid != wpa_s->current_ssid)
2406                 wpas_notify_network_changed(wpa_s);
2407         eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
2408 }
2409
2410
2411 /**
2412  * wpa_supplicant_deauthenticate - Deauthenticate the current connection
2413  * @wpa_s: Pointer to wpa_supplicant data
2414  * @reason_code: IEEE 802.11 reason code for the deauthenticate frame
2415  *
2416  * This function is used to request %wpa_supplicant to deauthenticate from the
2417  * current AP.
2418  */
2419 void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
2420                                    int reason_code)
2421 {
2422         u8 *addr = NULL;
2423         union wpa_event_data event;
2424         int zero_addr = 0;
2425
2426         wpa_dbg(wpa_s, MSG_DEBUG, "Request to deauthenticate - bssid=" MACSTR
2427                 " pending_bssid=" MACSTR " reason=%d state=%s",
2428                 MAC2STR(wpa_s->bssid), MAC2STR(wpa_s->pending_bssid),
2429                 reason_code, wpa_supplicant_state_txt(wpa_s->wpa_state));
2430
2431         if (!is_zero_ether_addr(wpa_s->bssid))
2432                 addr = wpa_s->bssid;
2433         else if (!is_zero_ether_addr(wpa_s->pending_bssid) &&
2434                  (wpa_s->wpa_state == WPA_AUTHENTICATING ||
2435                   wpa_s->wpa_state == WPA_ASSOCIATING))
2436                 addr = wpa_s->pending_bssid;
2437         else if (wpa_s->wpa_state == WPA_ASSOCIATING) {
2438                 /*
2439                  * When using driver-based BSS selection, we may not know the
2440                  * BSSID with which we are currently trying to associate. We
2441                  * need to notify the driver of this disconnection even in such
2442                  * a case, so use the all zeros address here.
2443                  */
2444                 addr = wpa_s->bssid;
2445                 zero_addr = 1;
2446         }
2447
2448 #ifdef CONFIG_TDLS
2449         wpa_tdls_teardown_peers(wpa_s->wpa);
2450 #endif /* CONFIG_TDLS */
2451
2452 #ifdef CONFIG_MESH
2453         if (wpa_s->ifmsh) {
2454                 wpa_msg_ctrl(wpa_s, MSG_INFO, MESH_GROUP_REMOVED "%s",
2455                              wpa_s->ifname);
2456                 wpa_supplicant_leave_mesh(wpa_s);
2457         }
2458 #endif /* CONFIG_MESH */
2459
2460         if (addr) {
2461                 wpa_drv_deauthenticate(wpa_s, addr, reason_code);
2462                 os_memset(&event, 0, sizeof(event));
2463                 event.deauth_info.reason_code = (u16) reason_code;
2464                 event.deauth_info.locally_generated = 1;
2465                 wpa_supplicant_event(wpa_s, EVENT_DEAUTH, &event);
2466                 if (zero_addr)
2467                         addr = NULL;
2468         }
2469
2470         wpa_supplicant_clear_connection(wpa_s, addr);
2471 }
2472
2473 static void wpa_supplicant_enable_one_network(struct wpa_supplicant *wpa_s,
2474                                               struct wpa_ssid *ssid)
2475 {
2476         if (!ssid || !ssid->disabled || ssid->disabled == 2)
2477                 return;
2478
2479         ssid->disabled = 0;
2480         wpas_clear_temp_disabled(wpa_s, ssid, 1);
2481         wpas_notify_network_enabled_changed(wpa_s, ssid);
2482
2483         /*
2484          * Try to reassociate since there is no current configuration and a new
2485          * network was made available.
2486          */
2487         if (!wpa_s->current_ssid && !wpa_s->disconnected)
2488                 wpa_s->reassociate = 1;
2489 }
2490
2491
2492 /**
2493  * wpa_supplicant_enable_network - Mark a configured network as enabled
2494  * @wpa_s: wpa_supplicant structure for a network interface
2495  * @ssid: wpa_ssid structure for a configured network or %NULL
2496  *
2497  * Enables the specified network or all networks if no network specified.
2498  */
2499 void wpa_supplicant_enable_network(struct wpa_supplicant *wpa_s,
2500                                    struct wpa_ssid *ssid)
2501 {
2502         if (ssid == NULL) {
2503                 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
2504                         wpa_supplicant_enable_one_network(wpa_s, ssid);
2505         } else
2506                 wpa_supplicant_enable_one_network(wpa_s, ssid);
2507
2508         if (wpa_s->reassociate && !wpa_s->disconnected) {
2509                 if (wpa_s->sched_scanning) {
2510                         wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan to add "
2511                                    "new network to scan filters");
2512                         wpa_supplicant_cancel_sched_scan(wpa_s);
2513                 }
2514
2515                 if (wpa_supplicant_fast_associate(wpa_s) != 1)
2516                         wpa_supplicant_req_scan(wpa_s, 0, 0);
2517         }
2518 }
2519
2520
2521 /**
2522  * wpa_supplicant_disable_network - Mark a configured network as disabled
2523  * @wpa_s: wpa_supplicant structure for a network interface
2524  * @ssid: wpa_ssid structure for a configured network or %NULL
2525  *
2526  * Disables the specified network or all networks if no network specified.
2527  */
2528 void wpa_supplicant_disable_network(struct wpa_supplicant *wpa_s,
2529                                     struct wpa_ssid *ssid)
2530 {
2531         struct wpa_ssid *other_ssid;
2532         int was_disabled;
2533
2534         if (ssid == NULL) {
2535                 if (wpa_s->sched_scanning)
2536                         wpa_supplicant_cancel_sched_scan(wpa_s);
2537
2538                 for (other_ssid = wpa_s->conf->ssid; other_ssid;
2539                      other_ssid = other_ssid->next) {
2540                         was_disabled = other_ssid->disabled;
2541                         if (was_disabled == 2)
2542                                 continue; /* do not change persistent P2P group
2543                                            * data */
2544
2545                         other_ssid->disabled = 1;
2546
2547                         if (was_disabled != other_ssid->disabled)
2548                                 wpas_notify_network_enabled_changed(
2549                                         wpa_s, other_ssid);
2550                 }
2551                 if (wpa_s->current_ssid)
2552                         wpa_supplicant_deauthenticate(
2553                                 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
2554         } else if (ssid->disabled != 2) {
2555                 if (ssid == wpa_s->current_ssid)
2556                         wpa_supplicant_deauthenticate(
2557                                 wpa_s, WLAN_REASON_DEAUTH_LEAVING);
2558
2559                 was_disabled = ssid->disabled;
2560
2561                 ssid->disabled = 1;
2562
2563                 if (was_disabled != ssid->disabled) {
2564                         wpas_notify_network_enabled_changed(wpa_s, ssid);
2565                         if (wpa_s->sched_scanning) {
2566                                 wpa_printf(MSG_DEBUG, "Stop ongoing sched_scan "
2567                                            "to remove network from filters");
2568                                 wpa_supplicant_cancel_sched_scan(wpa_s);
2569                                 wpa_supplicant_req_scan(wpa_s, 0, 0);
2570                         }
2571                 }
2572         }
2573 }
2574
2575
2576 /**
2577  * wpa_supplicant_select_network - Attempt association with a network
2578  * @wpa_s: wpa_supplicant structure for a network interface
2579  * @ssid: wpa_ssid structure for a configured network or %NULL for any network
2580  */
2581 void wpa_supplicant_select_network(struct wpa_supplicant *wpa_s,
2582                                    struct wpa_ssid *ssid)
2583 {
2584
2585         struct wpa_ssid *other_ssid;
2586         int disconnected = 0;
2587
2588         if (ssid && ssid != wpa_s->current_ssid && wpa_s->current_ssid) {
2589                 wpa_s->own_disconnect_req = 1;
2590                 wpa_supplicant_deauthenticate(
2591                         wpa_s, WLAN_REASON_DEAUTH_LEAVING);
2592                 disconnected = 1;
2593         }
2594
2595         if (ssid)
2596                 wpas_clear_temp_disabled(wpa_s, ssid, 1);
2597
2598         /*
2599          * Mark all other networks disabled or mark all networks enabled if no
2600          * network specified.
2601          */
2602         for (other_ssid = wpa_s->conf->ssid; other_ssid;
2603              other_ssid = other_ssid->next) {
2604                 int was_disabled = other_ssid->disabled;
2605                 if (was_disabled == 2)
2606                         continue; /* do not change persistent P2P group data */
2607
2608                 other_ssid->disabled = ssid ? (ssid->id != other_ssid->id) : 0;
2609                 if (was_disabled && !other_ssid->disabled)
2610                         wpas_clear_temp_disabled(wpa_s, other_ssid, 0);
2611
2612                 if (was_disabled != other_ssid->disabled)
2613                         wpas_notify_network_enabled_changed(wpa_s, other_ssid);
2614         }
2615
2616         if (ssid && ssid == wpa_s->current_ssid && wpa_s->current_ssid) {
2617                 /* We are already associated with the selected network */
2618                 wpa_printf(MSG_DEBUG, "Already associated with the "
2619                            "selected network - do nothing");
2620                 return;
2621         }
2622
2623         if (ssid) {
2624                 wpa_s->current_ssid = ssid;
2625                 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
2626                 wpa_s->connect_without_scan =
2627                         (ssid->mode == WPAS_MODE_MESH) ? ssid : NULL;
2628         } else {
2629                 wpa_s->connect_without_scan = NULL;
2630         }
2631
2632         wpa_s->disconnected = 0;
2633         wpa_s->reassociate = 1;
2634
2635         if (wpa_s->connect_without_scan ||
2636             wpa_supplicant_fast_associate(wpa_s) != 1)
2637                 wpa_supplicant_req_scan(wpa_s, 0, disconnected ? 100000 : 0);
2638
2639         if (ssid)
2640                 wpas_notify_network_selected(wpa_s, ssid);
2641 }
2642
2643
2644 /**
2645  * wpas_set_pkcs11_engine_and_module_path - Set PKCS #11 engine and module path
2646  * @wpa_s: wpa_supplicant structure for a network interface
2647  * @pkcs11_engine_path: PKCS #11 engine path or NULL
2648  * @pkcs11_module_path: PKCS #11 module path or NULL
2649  * Returns: 0 on success; -1 on failure
2650  *
2651  * Sets the PKCS #11 engine and module path. Both have to be NULL or a valid
2652  * path. If resetting the EAPOL state machine with the new PKCS #11 engine and
2653  * module path fails the paths will be reset to the default value (NULL).
2654  */
2655 int wpas_set_pkcs11_engine_and_module_path(struct wpa_supplicant *wpa_s,
2656                                            const char *pkcs11_engine_path,
2657                                            const char *pkcs11_module_path)
2658 {
2659         char *pkcs11_engine_path_copy = NULL;
2660         char *pkcs11_module_path_copy = NULL;
2661
2662         if (pkcs11_engine_path != NULL) {
2663                 pkcs11_engine_path_copy = os_strdup(pkcs11_engine_path);
2664                 if (pkcs11_engine_path_copy == NULL)
2665                         return -1;
2666         }
2667         if (pkcs11_module_path != NULL) {
2668                 pkcs11_module_path_copy = os_strdup(pkcs11_module_path);
2669                 if (pkcs11_module_path_copy == NULL) {
2670                         os_free(pkcs11_engine_path_copy);
2671                         return -1;
2672                 }
2673         }
2674
2675         os_free(wpa_s->conf->pkcs11_engine_path);
2676         os_free(wpa_s->conf->pkcs11_module_path);
2677         wpa_s->conf->pkcs11_engine_path = pkcs11_engine_path_copy;
2678         wpa_s->conf->pkcs11_module_path = pkcs11_module_path_copy;
2679
2680         wpa_sm_set_eapol(wpa_s->wpa, NULL);
2681         eapol_sm_deinit(wpa_s->eapol);
2682         wpa_s->eapol = NULL;
2683         if (wpa_supplicant_init_eapol(wpa_s)) {
2684                 /* Error -> Reset paths to the default value (NULL) once. */
2685                 if (pkcs11_engine_path != NULL && pkcs11_module_path != NULL)
2686                         wpas_set_pkcs11_engine_and_module_path(wpa_s, NULL,
2687                                                                NULL);
2688
2689                 return -1;
2690         }
2691         wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
2692
2693         return 0;
2694 }
2695
2696
2697 /**
2698  * wpa_supplicant_set_ap_scan - Set AP scan mode for interface
2699  * @wpa_s: wpa_supplicant structure for a network interface
2700  * @ap_scan: AP scan mode
2701  * Returns: 0 if succeed or -1 if ap_scan has an invalid value
2702  *
2703  */
2704 int wpa_supplicant_set_ap_scan(struct wpa_supplicant *wpa_s, int ap_scan)
2705 {
2706
2707         int old_ap_scan;
2708
2709         if (ap_scan < 0 || ap_scan > 2)
2710                 return -1;
2711
2712 #ifdef ANDROID
2713         if (ap_scan == 2 && ap_scan != wpa_s->conf->ap_scan &&
2714             wpa_s->wpa_state >= WPA_ASSOCIATING &&
2715             wpa_s->wpa_state < WPA_COMPLETED) {
2716                 wpa_printf(MSG_ERROR, "ap_scan = %d (%d) rejected while "
2717                            "associating", wpa_s->conf->ap_scan, ap_scan);
2718                 return 0;
2719         }
2720 #endif /* ANDROID */
2721
2722         old_ap_scan = wpa_s->conf->ap_scan;
2723         wpa_s->conf->ap_scan = ap_scan;
2724
2725         if (old_ap_scan != wpa_s->conf->ap_scan)
2726                 wpas_notify_ap_scan_changed(wpa_s);
2727
2728         return 0;
2729 }
2730
2731
2732 /**
2733  * wpa_supplicant_set_bss_expiration_age - Set BSS entry expiration age
2734  * @wpa_s: wpa_supplicant structure for a network interface
2735  * @expire_age: Expiration age in seconds
2736  * Returns: 0 if succeed or -1 if expire_age has an invalid value
2737  *
2738  */
2739 int wpa_supplicant_set_bss_expiration_age(struct wpa_supplicant *wpa_s,
2740                                           unsigned int bss_expire_age)
2741 {
2742         if (bss_expire_age < 10) {
2743                 wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration age %u",
2744                         bss_expire_age);
2745                 return -1;
2746         }
2747         wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration age: %d sec",
2748                 bss_expire_age);
2749         wpa_s->conf->bss_expiration_age = bss_expire_age;
2750
2751         return 0;
2752 }
2753
2754
2755 /**
2756  * wpa_supplicant_set_bss_expiration_count - Set BSS entry expiration scan count
2757  * @wpa_s: wpa_supplicant structure for a network interface
2758  * @expire_count: number of scans after which an unseen BSS is reclaimed
2759  * Returns: 0 if succeed or -1 if expire_count has an invalid value
2760  *
2761  */
2762 int wpa_supplicant_set_bss_expiration_count(struct wpa_supplicant *wpa_s,
2763                                             unsigned int bss_expire_count)
2764 {
2765         if (bss_expire_count < 1) {
2766                 wpa_msg(wpa_s, MSG_ERROR, "Invalid bss expiration count %u",
2767                         bss_expire_count);
2768                 return -1;
2769         }
2770         wpa_msg(wpa_s, MSG_DEBUG, "Setting bss expiration scan count: %u",
2771                 bss_expire_count);
2772         wpa_s->conf->bss_expiration_scan_count = bss_expire_count;
2773
2774         return 0;
2775 }
2776
2777
2778 /**
2779  * wpa_supplicant_set_scan_interval - Set scan interval
2780  * @wpa_s: wpa_supplicant structure for a network interface
2781  * @scan_interval: scan interval in seconds
2782  * Returns: 0 if succeed or -1 if scan_interval has an invalid value
2783  *
2784  */
2785 int wpa_supplicant_set_scan_interval(struct wpa_supplicant *wpa_s,
2786                                      int scan_interval)
2787 {
2788         if (scan_interval < 0) {
2789                 wpa_msg(wpa_s, MSG_ERROR, "Invalid scan interval %d",
2790                         scan_interval);
2791                 return -1;
2792         }
2793         wpa_msg(wpa_s, MSG_DEBUG, "Setting scan interval: %d sec",
2794                 scan_interval);
2795         wpa_supplicant_update_scan_int(wpa_s, scan_interval);
2796
2797         return 0;
2798 }
2799
2800
2801 /**
2802  * wpa_supplicant_set_debug_params - Set global debug params
2803  * @global: wpa_global structure
2804  * @debug_level: debug level
2805  * @debug_timestamp: determines if show timestamp in debug data
2806  * @debug_show_keys: determines if show keys in debug data
2807  * Returns: 0 if succeed or -1 if debug_level has wrong value
2808  */
2809 int wpa_supplicant_set_debug_params(struct wpa_global *global, int debug_level,
2810                                     int debug_timestamp, int debug_show_keys)
2811 {
2812
2813         int old_level, old_timestamp, old_show_keys;
2814
2815         /* check for allowed debuglevels */
2816         if (debug_level != MSG_EXCESSIVE &&
2817             debug_level != MSG_MSGDUMP &&
2818             debug_level != MSG_DEBUG &&
2819             debug_level != MSG_INFO &&
2820             debug_level != MSG_WARNING &&
2821             debug_level != MSG_ERROR)
2822                 return -1;
2823
2824         old_level = wpa_debug_level;
2825         old_timestamp = wpa_debug_timestamp;
2826         old_show_keys = wpa_debug_show_keys;
2827
2828         wpa_debug_level = debug_level;
2829         wpa_debug_timestamp = debug_timestamp ? 1 : 0;
2830         wpa_debug_show_keys = debug_show_keys ? 1 : 0;
2831
2832         if (wpa_debug_level != old_level)
2833                 wpas_notify_debug_level_changed(global);
2834         if (wpa_debug_timestamp != old_timestamp)
2835                 wpas_notify_debug_timestamp_changed(global);
2836         if (wpa_debug_show_keys != old_show_keys)
2837                 wpas_notify_debug_show_keys_changed(global);
2838
2839         return 0;
2840 }
2841
2842
2843 /**
2844  * wpa_supplicant_get_ssid - Get a pointer to the current network structure
2845  * @wpa_s: Pointer to wpa_supplicant data
2846  * Returns: A pointer to the current network structure or %NULL on failure
2847  */
2848 struct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s)
2849 {
2850         struct wpa_ssid *entry;
2851         u8 ssid[MAX_SSID_LEN];
2852         int res;
2853         size_t ssid_len;
2854         u8 bssid[ETH_ALEN];
2855         int wired;
2856
2857         res = wpa_drv_get_ssid(wpa_s, ssid);
2858         if (res < 0) {
2859                 wpa_msg(wpa_s, MSG_WARNING, "Could not read SSID from "
2860                         "driver");
2861                 return NULL;
2862         }
2863         ssid_len = res;
2864
2865         if (wpa_drv_get_bssid(wpa_s, bssid) < 0) {
2866                 wpa_msg(wpa_s, MSG_WARNING, "Could not read BSSID from "
2867                         "driver");
2868                 return NULL;
2869         }
2870
2871         wired = wpa_s->conf->ap_scan == 0 &&
2872                 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_WIRED);
2873
2874         entry = wpa_s->conf->ssid;
2875         while (entry) {
2876                 if (!wpas_network_disabled(wpa_s, entry) &&
2877                     ((ssid_len == entry->ssid_len &&
2878                       os_memcmp(ssid, entry->ssid, ssid_len) == 0) || wired) &&
2879                     (!entry->bssid_set ||
2880                      os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
2881                         return entry;
2882 #ifdef CONFIG_WPS
2883                 if (!wpas_network_disabled(wpa_s, entry) &&
2884                     (entry->key_mgmt & WPA_KEY_MGMT_WPS) &&
2885                     (entry->ssid == NULL || entry->ssid_len == 0) &&
2886                     (!entry->bssid_set ||
2887                      os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0))
2888                         return entry;
2889 #endif /* CONFIG_WPS */
2890
2891                 if (!wpas_network_disabled(wpa_s, entry) && entry->bssid_set &&
2892                     entry->ssid_len == 0 &&
2893                     os_memcmp(bssid, entry->bssid, ETH_ALEN) == 0)
2894                         return entry;
2895
2896                 entry = entry->next;
2897         }
2898
2899         return NULL;
2900 }
2901
2902
2903 static int select_driver(struct wpa_supplicant *wpa_s, int i)
2904 {
2905         struct wpa_global *global = wpa_s->global;
2906
2907         if (wpa_drivers[i]->global_init && global->drv_priv[i] == NULL) {
2908                 global->drv_priv[i] = wpa_drivers[i]->global_init();
2909                 if (global->drv_priv[i] == NULL) {
2910                         wpa_printf(MSG_ERROR, "Failed to initialize driver "
2911                                    "'%s'", wpa_drivers[i]->name);
2912                         return -1;
2913                 }
2914         }
2915
2916         wpa_s->driver = wpa_drivers[i];
2917         wpa_s->global_drv_priv = global->drv_priv[i];
2918
2919         return 0;
2920 }
2921
2922
2923 static int wpa_supplicant_set_driver(struct wpa_supplicant *wpa_s,
2924                                      const char *name)
2925 {
2926         int i;
2927         size_t len;
2928         const char *pos, *driver = name;
2929
2930         if (wpa_s == NULL)
2931                 return -1;
2932
2933         if (wpa_drivers[0] == NULL) {
2934                 wpa_msg(wpa_s, MSG_ERROR, "No driver interfaces build into "
2935                         "wpa_supplicant");
2936                 return -1;
2937         }
2938
2939         if (name == NULL) {
2940                 /* default to first driver in the list */
2941                 return select_driver(wpa_s, 0);
2942         }
2943
2944         do {
2945                 pos = os_strchr(driver, ',');
2946                 if (pos)
2947                         len = pos - driver;
2948                 else
2949                         len = os_strlen(driver);
2950
2951                 for (i = 0; wpa_drivers[i]; i++) {
2952                         if (os_strlen(wpa_drivers[i]->name) == len &&
2953                             os_strncmp(driver, wpa_drivers[i]->name, len) ==
2954                             0) {
2955                                 /* First driver that succeeds wins */
2956                                 if (select_driver(wpa_s, i) == 0)
2957                                         return 0;
2958                         }
2959                 }
2960
2961                 driver = pos + 1;
2962         } while (pos);
2963
2964         wpa_msg(wpa_s, MSG_ERROR, "Unsupported driver '%s'", name);
2965         return -1;
2966 }
2967
2968
2969 /**
2970  * wpa_supplicant_rx_eapol - Deliver a received EAPOL frame to wpa_supplicant
2971  * @ctx: Context pointer (wpa_s); this is the ctx variable registered
2972  *      with struct wpa_driver_ops::init()
2973  * @src_addr: Source address of the EAPOL frame
2974  * @buf: EAPOL data starting from the EAPOL header (i.e., no Ethernet header)
2975  * @len: Length of the EAPOL data
2976  *
2977  * This function is called for each received EAPOL frame. Most driver
2978  * interfaces rely on more generic OS mechanism for receiving frames through
2979  * l2_packet, but if such a mechanism is not available, the driver wrapper may
2980  * take care of received EAPOL frames and deliver them to the core supplicant
2981  * code by calling this function.
2982  */
2983 void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr,
2984                              const u8 *buf, size_t len)
2985 {
2986         struct wpa_supplicant *wpa_s = ctx;
2987
2988         wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR, MAC2STR(src_addr));
2989         wpa_hexdump(MSG_MSGDUMP, "RX EAPOL", buf, len);
2990
2991 #ifdef CONFIG_PEERKEY
2992         if (wpa_s->wpa_state > WPA_ASSOCIATED && wpa_s->current_ssid &&
2993             wpa_s->current_ssid->peerkey &&
2994             !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) &&
2995             wpa_sm_rx_eapol_peerkey(wpa_s->wpa, src_addr, buf, len) == 1) {
2996                 wpa_dbg(wpa_s, MSG_DEBUG, "RSN: Processed PeerKey EAPOL-Key");
2997                 return;
2998         }
2999 #endif /* CONFIG_PEERKEY */
3000
3001         if (wpa_s->wpa_state < WPA_ASSOCIATED ||
3002             (wpa_s->last_eapol_matches_bssid &&
3003 #ifdef CONFIG_AP
3004              !wpa_s->ap_iface &&
3005 #endif /* CONFIG_AP */
3006              os_memcmp(src_addr, wpa_s->bssid, ETH_ALEN) != 0)) {
3007                 /*
3008                  * There is possible race condition between receiving the
3009                  * association event and the EAPOL frame since they are coming
3010                  * through different paths from the driver. In order to avoid
3011                  * issues in trying to process the EAPOL frame before receiving
3012                  * association information, lets queue it for processing until
3013                  * the association event is received. This may also be needed in
3014                  * driver-based roaming case, so also use src_addr != BSSID as a
3015                  * trigger if we have previously confirmed that the
3016                  * Authenticator uses BSSID as the src_addr (which is not the
3017                  * case with wired IEEE 802.1X).
3018                  */
3019                 wpa_dbg(wpa_s, MSG_DEBUG, "Not associated - Delay processing "
3020                         "of received EAPOL frame (state=%s bssid=" MACSTR ")",
3021                         wpa_supplicant_state_txt(wpa_s->wpa_state),
3022                         MAC2STR(wpa_s->bssid));
3023                 wpabuf_free(wpa_s->pending_eapol_rx);
3024                 wpa_s->pending_eapol_rx = wpabuf_alloc_copy(buf, len);
3025                 if (wpa_s->pending_eapol_rx) {
3026                         os_get_reltime(&wpa_s->pending_eapol_rx_time);
3027                         os_memcpy(wpa_s->pending_eapol_rx_src, src_addr,
3028                                   ETH_ALEN);
3029                 }
3030                 return;
3031         }
3032
3033         wpa_s->last_eapol_matches_bssid =
3034                 os_memcmp(src_addr, wpa_s->bssid, ETH_ALEN) == 0;
3035
3036 #ifdef CONFIG_AP
3037         if (wpa_s->ap_iface) {
3038                 wpa_supplicant_ap_rx_eapol(wpa_s, src_addr, buf, len);
3039                 return;
3040         }
3041 #endif /* CONFIG_AP */
3042
3043         if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE) {
3044                 wpa_dbg(wpa_s, MSG_DEBUG, "Ignored received EAPOL frame since "
3045                         "no key management is configured");
3046                 return;
3047         }
3048
3049         if (wpa_s->eapol_received == 0 &&
3050             (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE) ||
3051              !wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) ||
3052              wpa_s->wpa_state != WPA_COMPLETED) &&
3053             (wpa_s->current_ssid == NULL ||
3054              wpa_s->current_ssid->mode != IEEE80211_MODE_IBSS)) {
3055                 /* Timeout for completing IEEE 802.1X and WPA authentication */
3056                 wpa_supplicant_req_auth_timeout(
3057                         wpa_s,
3058                         (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) ||
3059                          wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA ||
3060                          wpa_s->key_mgmt == WPA_KEY_MGMT_WPS) ?
3061                         70 : 10, 0);
3062         }
3063         wpa_s->eapol_received++;
3064
3065         if (wpa_s->countermeasures) {
3066                 wpa_msg(wpa_s, MSG_INFO, "WPA: Countermeasures - dropped "
3067                         "EAPOL packet");
3068                 return;
3069         }
3070
3071 #ifdef CONFIG_IBSS_RSN
3072         if (wpa_s->current_ssid &&
3073             wpa_s->current_ssid->mode == WPAS_MODE_IBSS) {
3074                 ibss_rsn_rx_eapol(wpa_s->ibss_rsn, src_addr, buf, len);
3075                 return;
3076         }
3077 #endif /* CONFIG_IBSS_RSN */
3078
3079         /* Source address of the incoming EAPOL frame could be compared to the
3080          * current BSSID. However, it is possible that a centralized
3081          * Authenticator could be using another MAC address than the BSSID of
3082          * an AP, so just allow any address to be used for now. The replies are
3083          * still sent to the current BSSID (if available), though. */
3084
3085         os_memcpy(wpa_s->last_eapol_src, src_addr, ETH_ALEN);
3086         if (!wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) &&
3087             eapol_sm_rx_eapol(wpa_s->eapol, src_addr, buf, len) > 0)
3088                 return;
3089         wpa_drv_poll(wpa_s);
3090         if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE))
3091                 wpa_sm_rx_eapol(wpa_s->wpa, src_addr, buf, len);
3092         else if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt)) {
3093                 /*
3094                  * Set portValid = TRUE here since we are going to skip 4-way
3095                  * handshake processing which would normally set portValid. We
3096                  * need this to allow the EAPOL state machines to be completed
3097                  * without going through EAPOL-Key handshake.
3098                  */
3099                 eapol_sm_notify_portValid(wpa_s->eapol, TRUE);
3100         }
3101 }
3102
3103
3104 int wpa_supplicant_update_mac_addr(struct wpa_supplicant *wpa_s)
3105 {
3106         if ((!wpa_s->p2p_mgmt ||
3107              !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)) &&
3108             !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE)) {
3109                 l2_packet_deinit(wpa_s->l2);
3110                 wpa_s->l2 = l2_packet_init(wpa_s->ifname,
3111                                            wpa_drv_get_mac_addr(wpa_s),
3112                                            ETH_P_EAPOL,
3113                                            wpa_supplicant_rx_eapol, wpa_s, 0);
3114                 if (wpa_s->l2 == NULL)
3115                         return -1;
3116         } else {
3117                 const u8 *addr = wpa_drv_get_mac_addr(wpa_s);
3118                 if (addr)
3119                         os_memcpy(wpa_s->own_addr, addr, ETH_ALEN);
3120         }
3121
3122         if (wpa_s->l2 && l2_packet_get_own_addr(wpa_s->l2, wpa_s->own_addr)) {
3123                 wpa_msg(wpa_s, MSG_ERROR, "Failed to get own L2 address");
3124                 return -1;
3125         }
3126
3127         wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
3128
3129         return 0;
3130 }
3131
3132
3133 static void wpa_supplicant_rx_eapol_bridge(void *ctx, const u8 *src_addr,
3134                                            const u8 *buf, size_t len)
3135 {
3136         struct wpa_supplicant *wpa_s = ctx;
3137         const struct l2_ethhdr *eth;
3138
3139         if (len < sizeof(*eth))
3140                 return;
3141         eth = (const struct l2_ethhdr *) buf;
3142
3143         if (os_memcmp(eth->h_dest, wpa_s->own_addr, ETH_ALEN) != 0 &&
3144             !(eth->h_dest[0] & 0x01)) {
3145                 wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR " to " MACSTR
3146                         " (bridge - not for this interface - ignore)",
3147                         MAC2STR(src_addr), MAC2STR(eth->h_dest));
3148                 return;
3149         }
3150
3151         wpa_dbg(wpa_s, MSG_DEBUG, "RX EAPOL from " MACSTR " to " MACSTR
3152                 " (bridge)", MAC2STR(src_addr), MAC2STR(eth->h_dest));
3153         wpa_supplicant_rx_eapol(wpa_s, src_addr, buf + sizeof(*eth),
3154                                 len - sizeof(*eth));
3155 }
3156
3157
3158 /**
3159  * wpa_supplicant_driver_init - Initialize driver interface parameters
3160  * @wpa_s: Pointer to wpa_supplicant data
3161  * Returns: 0 on success, -1 on failure
3162  *
3163  * This function is called to initialize driver interface parameters.
3164  * wpa_drv_init() must have been called before this function to initialize the
3165  * driver interface.
3166  */
3167 int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s)
3168 {
3169         static int interface_count = 0;
3170
3171         if (wpa_supplicant_update_mac_addr(wpa_s) < 0)
3172                 return -1;
3173
3174         wpa_dbg(wpa_s, MSG_DEBUG, "Own MAC address: " MACSTR,
3175                 MAC2STR(wpa_s->own_addr));
3176         os_memcpy(wpa_s->perm_addr, wpa_s->own_addr, ETH_ALEN);
3177         wpa_sm_set_own_addr(wpa_s->wpa, wpa_s->own_addr);
3178
3179         if (wpa_s->bridge_ifname[0]) {
3180                 wpa_dbg(wpa_s, MSG_DEBUG, "Receiving packets from bridge "
3181                         "interface '%s'", wpa_s->bridge_ifname);
3182                 wpa_s->l2_br = l2_packet_init_bridge(
3183                         wpa_s->bridge_ifname, wpa_s->ifname, wpa_s->own_addr,
3184                         ETH_P_EAPOL, wpa_supplicant_rx_eapol_bridge, wpa_s, 1);
3185                 if (wpa_s->l2_br == NULL) {
3186                         wpa_msg(wpa_s, MSG_ERROR, "Failed to open l2_packet "
3187                                 "connection for the bridge interface '%s'",
3188                                 wpa_s->bridge_ifname);
3189                         return -1;
3190                 }
3191         }
3192
3193         wpa_clear_keys(wpa_s, NULL);
3194
3195         /* Make sure that TKIP countermeasures are not left enabled (could
3196          * happen if wpa_supplicant is killed during countermeasures. */
3197         wpa_drv_set_countermeasures(wpa_s, 0);
3198
3199         wpa_dbg(wpa_s, MSG_DEBUG, "RSN: flushing PMKID list in the driver");
3200         wpa_drv_flush_pmkid(wpa_s);
3201
3202         wpa_s->prev_scan_ssid = WILDCARD_SSID_SCAN;
3203         wpa_s->prev_scan_wildcard = 0;
3204
3205         if (wpa_supplicant_enabled_networks(wpa_s)) {
3206                 if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
3207                         wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
3208                         interface_count = 0;
3209                 }
3210 #ifndef ANDROID
3211                 if (!wpa_s->p2p_mgmt &&
3212                     wpa_supplicant_delayed_sched_scan(wpa_s,
3213                                                       interface_count % 3,
3214                                                       100000))
3215                         wpa_supplicant_req_scan(wpa_s, interface_count % 3,
3216                                                 100000);
3217 #endif /* ANDROID */
3218                 interface_count++;
3219         } else
3220                 wpa_supplicant_set_state(wpa_s, WPA_INACTIVE);
3221
3222         return 0;
3223 }
3224
3225
3226 static int wpa_supplicant_daemon(const char *pid_file)
3227 {
3228         wpa_printf(MSG_DEBUG, "Daemonize..");
3229         return os_daemonize(pid_file);
3230 }
3231
3232
3233 static struct wpa_supplicant *
3234 wpa_supplicant_alloc(struct wpa_supplicant *parent)
3235 {
3236         struct wpa_supplicant *wpa_s;
3237
3238         wpa_s = os_zalloc(sizeof(*wpa_s));
3239         if (wpa_s == NULL)
3240                 return NULL;
3241         wpa_s->scan_req = INITIAL_SCAN_REQ;
3242         wpa_s->scan_interval = 5;
3243         wpa_s->new_connection = 1;
3244         wpa_s->parent = parent ? parent : wpa_s;
3245         wpa_s->sched_scanning = 0;
3246
3247         return wpa_s;
3248 }
3249
3250
3251 #ifdef CONFIG_HT_OVERRIDES
3252
3253 static int wpa_set_htcap_mcs(struct wpa_supplicant *wpa_s,
3254                              struct ieee80211_ht_capabilities *htcaps,
3255                              struct ieee80211_ht_capabilities *htcaps_mask,
3256                              const char *ht_mcs)
3257 {
3258         /* parse ht_mcs into hex array */
3259         int i;
3260         const char *tmp = ht_mcs;
3261         char *end = NULL;
3262
3263         /* If ht_mcs is null, do not set anything */
3264         if (!ht_mcs)
3265                 return 0;
3266
3267         /* This is what we are setting in the kernel */
3268         os_memset(&htcaps->supported_mcs_set, 0, IEEE80211_HT_MCS_MASK_LEN);
3269
3270         wpa_msg(wpa_s, MSG_DEBUG, "set_htcap, ht_mcs -:%s:-", ht_mcs);
3271
3272         for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
3273                 errno = 0;
3274                 long v = strtol(tmp, &end, 16);
3275                 if (errno == 0) {
3276                         wpa_msg(wpa_s, MSG_DEBUG,
3277                                 "htcap value[%i]: %ld end: %p  tmp: %p",
3278                                 i, v, end, tmp);
3279                         if (end == tmp)
3280                                 break;
3281
3282                         htcaps->supported_mcs_set[i] = v;
3283                         tmp = end;
3284                 } else {
3285                         wpa_msg(wpa_s, MSG_ERROR,
3286                                 "Failed to parse ht-mcs: %s, error: %s\n",
3287                                 ht_mcs, strerror(errno));
3288                         return -1;
3289                 }
3290         }
3291
3292         /*
3293          * If we were able to parse any values, then set mask for the MCS set.
3294          */
3295         if (i) {
3296                 os_memset(&htcaps_mask->supported_mcs_set, 0xff,
3297                           IEEE80211_HT_MCS_MASK_LEN - 1);
3298                 /* skip the 3 reserved bits */
3299                 htcaps_mask->supported_mcs_set[IEEE80211_HT_MCS_MASK_LEN - 1] =
3300                         0x1f;
3301         }
3302
3303         return 0;
3304 }
3305
3306
3307 static int wpa_disable_max_amsdu(struct wpa_supplicant *wpa_s,
3308                                  struct ieee80211_ht_capabilities *htcaps,
3309                                  struct ieee80211_ht_capabilities *htcaps_mask,
3310                                  int disabled)
3311 {
3312         le16 msk;
3313
3314         wpa_msg(wpa_s, MSG_DEBUG, "set_disable_max_amsdu: %d", disabled);
3315
3316         if (disabled == -1)
3317                 return 0;
3318
3319         msk = host_to_le16(HT_CAP_INFO_MAX_AMSDU_SIZE);
3320         htcaps_mask->ht_capabilities_info |= msk;
3321         if (disabled)
3322                 htcaps->ht_capabilities_info &= msk;
3323         else
3324                 htcaps->ht_capabilities_info |= msk;
3325
3326         return 0;
3327 }
3328
3329
3330 static int wpa_set_ampdu_factor(struct wpa_supplicant *wpa_s,
3331                                 struct ieee80211_ht_capabilities *htcaps,
3332                                 struct ieee80211_ht_capabilities *htcaps_mask,
3333                                 int factor)
3334 {
3335         wpa_msg(wpa_s, MSG_DEBUG, "set_ampdu_factor: %d", factor);
3336
3337         if (factor == -1)
3338                 return 0;
3339
3340         if (factor < 0 || factor > 3) {
3341                 wpa_msg(wpa_s, MSG_ERROR, "ampdu_factor: %d out of range. "
3342                         "Must be 0-3 or -1", factor);
3343                 return -EINVAL;
3344         }
3345
3346         htcaps_mask->a_mpdu_params |= 0x3; /* 2 bits for factor */
3347         htcaps->a_mpdu_params &= ~0x3;
3348         htcaps->a_mpdu_params |= factor & 0x3;
3349
3350         return 0;
3351 }
3352
3353
3354 static int wpa_set_ampdu_density(struct wpa_supplicant *wpa_s,
3355                                  struct ieee80211_ht_capabilities *htcaps,
3356                                  struct ieee80211_ht_capabilities *htcaps_mask,
3357                                  int density)
3358 {
3359         wpa_msg(wpa_s, MSG_DEBUG, "set_ampdu_density: %d", density);
3360
3361         if (density == -1)
3362                 return 0;
3363
3364         if (density < 0 || density > 7) {
3365                 wpa_msg(wpa_s, MSG_ERROR,
3366                         "ampdu_density: %d out of range. Must be 0-7 or -1.",
3367                         density);
3368                 return -EINVAL;
3369         }
3370
3371         htcaps_mask->a_mpdu_params |= 0x1C;
3372         htcaps->a_mpdu_params &= ~(0x1C);
3373         htcaps->a_mpdu_params |= (density << 2) & 0x1C;
3374
3375         return 0;
3376 }
3377
3378
3379 static int wpa_set_disable_ht40(struct wpa_supplicant *wpa_s,
3380                                 struct ieee80211_ht_capabilities *htcaps,
3381                                 struct ieee80211_ht_capabilities *htcaps_mask,
3382                                 int disabled)
3383 {
3384         /* Masking these out disables HT40 */
3385         le16 msk = host_to_le16(HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET |
3386                                 HT_CAP_INFO_SHORT_GI40MHZ);
3387
3388         wpa_msg(wpa_s, MSG_DEBUG, "set_disable_ht40: %d", disabled);
3389
3390         if (disabled)
3391                 htcaps->ht_capabilities_info &= ~msk;
3392         else
3393                 htcaps->ht_capabilities_info |= msk;
3394
3395         htcaps_mask->ht_capabilities_info |= msk;
3396
3397         return 0;
3398 }
3399
3400
3401 static int wpa_set_disable_sgi(struct wpa_supplicant *wpa_s,
3402                                struct ieee80211_ht_capabilities *htcaps,
3403                                struct ieee80211_ht_capabilities *htcaps_mask,
3404                                int disabled)
3405 {
3406         /* Masking these out disables SGI */
3407         le16 msk = host_to_le16(HT_CAP_INFO_SHORT_GI20MHZ |
3408                                 HT_CAP_INFO_SHORT_GI40MHZ);
3409
3410         wpa_msg(wpa_s, MSG_DEBUG, "set_disable_sgi: %d", disabled);
3411
3412         if (disabled)
3413                 htcaps->ht_capabilities_info &= ~msk;
3414         else
3415                 htcaps->ht_capabilities_info |= msk;
3416
3417         htcaps_mask->ht_capabilities_info |= msk;
3418
3419         return 0;
3420 }
3421
3422
3423 static int wpa_set_disable_ldpc(struct wpa_supplicant *wpa_s,
3424                                struct ieee80211_ht_capabilities *htcaps,
3425                                struct ieee80211_ht_capabilities *htcaps_mask,
3426                                int disabled)
3427 {
3428         /* Masking these out disables LDPC */
3429         le16 msk = host_to_le16(HT_CAP_INFO_LDPC_CODING_CAP);
3430
3431         wpa_msg(wpa_s, MSG_DEBUG, "set_disable_ldpc: %d", disabled);
3432
3433         if (disabled)
3434                 htcaps->ht_capabilities_info &= ~msk;
3435         else
3436                 htcaps->ht_capabilities_info |= msk;
3437
3438         htcaps_mask->ht_capabilities_info |= msk;
3439
3440         return 0;
3441 }
3442
3443
3444 void wpa_supplicant_apply_ht_overrides(
3445         struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
3446         struct wpa_driver_associate_params *params)
3447 {
3448         struct ieee80211_ht_capabilities *htcaps;
3449         struct ieee80211_ht_capabilities *htcaps_mask;
3450
3451         if (!ssid)
3452                 return;
3453
3454         params->disable_ht = ssid->disable_ht;
3455         if (!params->htcaps || !params->htcaps_mask)
3456                 return;
3457
3458         htcaps = (struct ieee80211_ht_capabilities *) params->htcaps;
3459         htcaps_mask = (struct ieee80211_ht_capabilities *) params->htcaps_mask;
3460         wpa_set_htcap_mcs(wpa_s, htcaps, htcaps_mask, ssid->ht_mcs);
3461         wpa_disable_max_amsdu(wpa_s, htcaps, htcaps_mask,
3462                               ssid->disable_max_amsdu);
3463         wpa_set_ampdu_factor(wpa_s, htcaps, htcaps_mask, ssid->ampdu_factor);
3464         wpa_set_ampdu_density(wpa_s, htcaps, htcaps_mask, ssid->ampdu_density);
3465         wpa_set_disable_ht40(wpa_s, htcaps, htcaps_mask, ssid->disable_ht40);
3466         wpa_set_disable_sgi(wpa_s, htcaps, htcaps_mask, ssid->disable_sgi);
3467         wpa_set_disable_ldpc(wpa_s, htcaps, htcaps_mask, ssid->disable_ldpc);
3468
3469         if (ssid->ht40_intolerant) {
3470                 le16 bit = host_to_le16(HT_CAP_INFO_40MHZ_INTOLERANT);
3471                 htcaps->ht_capabilities_info |= bit;
3472                 htcaps_mask->ht_capabilities_info |= bit;
3473         }
3474 }
3475
3476 #endif /* CONFIG_HT_OVERRIDES */
3477
3478
3479 #ifdef CONFIG_VHT_OVERRIDES
3480 void wpa_supplicant_apply_vht_overrides(
3481         struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
3482         struct wpa_driver_associate_params *params)
3483 {
3484         struct ieee80211_vht_capabilities *vhtcaps;
3485         struct ieee80211_vht_capabilities *vhtcaps_mask;
3486
3487         if (!ssid)
3488                 return;
3489
3490         params->disable_vht = ssid->disable_vht;
3491
3492         vhtcaps = (void *) params->vhtcaps;
3493         vhtcaps_mask = (void *) params->vhtcaps_mask;
3494
3495         if (!vhtcaps || !vhtcaps_mask)
3496                 return;
3497
3498         vhtcaps->vht_capabilities_info = ssid->vht_capa;
3499         vhtcaps_mask->vht_capabilities_info = ssid->vht_capa_mask;
3500
3501 #ifdef CONFIG_HT_OVERRIDES
3502         /* if max ampdu is <= 3, we have to make the HT cap the same */
3503         if (ssid->vht_capa_mask & VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX) {
3504                 int max_ampdu;
3505
3506                 max_ampdu = (ssid->vht_capa &
3507                              VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX) >>
3508                         VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX_SHIFT;
3509
3510                 max_ampdu = max_ampdu < 3 ? max_ampdu : 3;
3511                 wpa_set_ampdu_factor(wpa_s,
3512                                      (void *) params->htcaps,
3513                                      (void *) params->htcaps_mask,
3514                                      max_ampdu);
3515         }
3516 #endif /* CONFIG_HT_OVERRIDES */
3517
3518 #define OVERRIDE_MCS(i)                                                 \
3519         if (ssid->vht_tx_mcs_nss_ ##i >= 0) {                           \
3520                 vhtcaps_mask->vht_supported_mcs_set.tx_map |=           \
3521                         3 << 2 * (i - 1);                               \
3522                 vhtcaps->vht_supported_mcs_set.tx_map |=                \
3523                         ssid->vht_tx_mcs_nss_ ##i << 2 * (i - 1);       \
3524         }                                                               \
3525         if (ssid->vht_rx_mcs_nss_ ##i >= 0) {                           \
3526                 vhtcaps_mask->vht_supported_mcs_set.rx_map |=           \
3527                         3 << 2 * (i - 1);                               \
3528                 vhtcaps->vht_supported_mcs_set.rx_map |=                \
3529                         ssid->vht_rx_mcs_nss_ ##i << 2 * (i - 1);       \
3530         }
3531
3532         OVERRIDE_MCS(1);
3533         OVERRIDE_MCS(2);
3534         OVERRIDE_MCS(3);
3535         OVERRIDE_MCS(4);
3536         OVERRIDE_MCS(5);
3537         OVERRIDE_MCS(6);
3538         OVERRIDE_MCS(7);
3539         OVERRIDE_MCS(8);
3540 }
3541 #endif /* CONFIG_VHT_OVERRIDES */
3542
3543
3544 static int pcsc_reader_init(struct wpa_supplicant *wpa_s)
3545 {
3546 #ifdef PCSC_FUNCS
3547         size_t len;
3548
3549         if (!wpa_s->conf->pcsc_reader)
3550                 return 0;
3551
3552         wpa_s->scard = scard_init(wpa_s->conf->pcsc_reader);
3553         if (!wpa_s->scard)
3554                 return 1;
3555
3556         if (wpa_s->conf->pcsc_pin &&
3557             scard_set_pin(wpa_s->scard, wpa_s->conf->pcsc_pin) < 0) {
3558                 scard_deinit(wpa_s->scard);
3559                 wpa_s->scard = NULL;
3560                 wpa_msg(wpa_s, MSG_ERROR, "PC/SC PIN validation failed");
3561                 return -1;
3562         }
3563
3564         len = sizeof(wpa_s->imsi) - 1;
3565         if (scard_get_imsi(wpa_s->scard, wpa_s->imsi, &len)) {
3566                 scard_deinit(wpa_s->scard);
3567                 wpa_s->scard = NULL;
3568                 wpa_msg(wpa_s, MSG_ERROR, "Could not read IMSI");
3569                 return -1;
3570         }
3571         wpa_s->imsi[len] = '\0';
3572
3573         wpa_s->mnc_len = scard_get_mnc_len(wpa_s->scard);
3574
3575         wpa_printf(MSG_DEBUG, "SCARD: IMSI %s (MNC length %d)",
3576                    wpa_s->imsi, wpa_s->mnc_len);
3577
3578         wpa_sm_set_scard_ctx(wpa_s->wpa, wpa_s->scard);
3579         eapol_sm_register_scard_ctx(wpa_s->eapol, wpa_s->scard);
3580 #endif /* PCSC_FUNCS */
3581
3582         return 0;
3583 }
3584
3585
3586 int wpas_init_ext_pw(struct wpa_supplicant *wpa_s)
3587 {
3588         char *val, *pos;
3589
3590         ext_password_deinit(wpa_s->ext_pw);
3591         wpa_s->ext_pw = NULL;
3592         eapol_sm_set_ext_pw_ctx(wpa_s->eapol, NULL);
3593
3594         if (!wpa_s->conf->ext_password_backend)
3595                 return 0;
3596
3597         val = os_strdup(wpa_s->conf->ext_password_backend);
3598         if (val == NULL)
3599                 return -1;
3600         pos = os_strchr(val, ':');
3601         if (pos)
3602                 *pos++ = '\0';
3603
3604         wpa_printf(MSG_DEBUG, "EXT PW: Initialize backend '%s'", val);
3605
3606         wpa_s->ext_pw = ext_password_init(val, pos);
3607         os_free(val);
3608         if (wpa_s->ext_pw == NULL) {
3609                 wpa_printf(MSG_DEBUG, "EXT PW: Failed to initialize backend");
3610                 return -1;
3611         }
3612         eapol_sm_set_ext_pw_ctx(wpa_s->eapol, wpa_s->ext_pw);
3613
3614         return 0;
3615 }
3616
3617
3618 static int wpas_set_wowlan_triggers(struct wpa_supplicant *wpa_s,
3619                                     const struct wpa_driver_capa *capa)
3620 {
3621         struct wowlan_triggers *triggers;
3622         int ret = 0;
3623
3624         if (!wpa_s->conf->wowlan_triggers)
3625                 return 0;
3626
3627         triggers = wpa_get_wowlan_triggers(wpa_s->conf->wowlan_triggers, capa);
3628         if (triggers) {
3629                 ret = wpa_drv_wowlan(wpa_s, triggers);
3630                 os_free(triggers);
3631         }
3632         return ret;
3633 }
3634
3635
3636 static struct wpa_radio * radio_add_interface(struct wpa_supplicant *wpa_s,
3637                                               const char *rn)
3638 {
3639         struct wpa_supplicant *iface = wpa_s->global->ifaces;
3640         struct wpa_radio *radio;
3641
3642         while (rn && iface) {
3643                 radio = iface->radio;
3644                 if (radio && os_strcmp(rn, radio->name) == 0) {
3645                         wpa_printf(MSG_DEBUG, "Add interface %s to existing radio %s",
3646                                    wpa_s->ifname, rn);
3647                         dl_list_add(&radio->ifaces, &wpa_s->radio_list);
3648                         return radio;
3649                 }
3650
3651                 iface = iface->next;
3652         }
3653
3654         wpa_printf(MSG_DEBUG, "Add interface %s to a new radio %s",
3655                    wpa_s->ifname, rn ? rn : "N/A");
3656         radio = os_zalloc(sizeof(*radio));
3657         if (radio == NULL)
3658                 return NULL;
3659
3660         if (rn)
3661                 os_strlcpy(radio->name, rn, sizeof(radio->name));
3662         dl_list_init(&radio->ifaces);
3663         dl_list_init(&radio->work);
3664         dl_list_add(&radio->ifaces, &wpa_s->radio_list);
3665
3666         return radio;
3667 }
3668
3669
3670 static void radio_work_free(struct wpa_radio_work *work)
3671 {
3672         if (work->wpa_s->scan_work == work) {
3673                 /* This should not really happen. */
3674                 wpa_dbg(work->wpa_s, MSG_INFO, "Freeing radio work '%s'@%p (started=%d) that is marked as scan_work",
3675                         work->type, work, work->started);
3676                 work->wpa_s->scan_work = NULL;
3677         }
3678
3679 #ifdef CONFIG_P2P
3680         if (work->wpa_s->p2p_scan_work == work) {
3681                 /* This should not really happen. */
3682                 wpa_dbg(work->wpa_s, MSG_INFO, "Freeing radio work '%s'@%p (started=%d) that is marked as p2p_scan_work",
3683                         work->type, work, work->started);
3684                 work->wpa_s->p2p_scan_work = NULL;
3685         }
3686 #endif /* CONFIG_P2P */
3687
3688         dl_list_del(&work->list);
3689         os_free(work);
3690 }
3691
3692
3693 static void radio_start_next_work(void *eloop_ctx, void *timeout_ctx)
3694 {
3695         struct wpa_radio *radio = eloop_ctx;
3696         struct wpa_radio_work *work;
3697         struct os_reltime now, diff;
3698         struct wpa_supplicant *wpa_s;
3699
3700         work = dl_list_first(&radio->work, struct wpa_radio_work, list);
3701         if (work == NULL)
3702                 return;
3703
3704         if (work->started)
3705                 return; /* already started and still in progress */
3706
3707         wpa_s = dl_list_first(&radio->ifaces, struct wpa_supplicant,
3708                               radio_list);
3709         if (wpa_s && wpa_s->radio->external_scan_running) {
3710                 wpa_printf(MSG_DEBUG, "Delay radio work start until externally triggered scan completes");
3711                 return;
3712         }
3713
3714         os_get_reltime(&now);
3715         os_reltime_sub(&now, &work->time, &diff);
3716         wpa_dbg(work->wpa_s, MSG_DEBUG, "Starting radio work '%s'@%p after %ld.%06ld second wait",
3717                 work->type, work, diff.sec, diff.usec);
3718         work->started = 1;
3719         work->time = now;
3720         work->cb(work, 0);
3721 }
3722
3723
3724 /*
3725  * This function removes both started and pending radio works running on
3726  * the provided interface's radio.
3727  * Prior to the removal of the radio work, its callback (cb) is called with
3728  * deinit set to be 1. Each work's callback is responsible for clearing its
3729  * internal data and restoring to a correct state.
3730  * @wpa_s: wpa_supplicant data
3731  * @type: type of works to be removed
3732  * @remove_all: 1 to remove all the works on this radio, 0 to remove only
3733  * this interface's works.
3734  */
3735 void radio_remove_works(struct wpa_supplicant *wpa_s,
3736                         const char *type, int remove_all)
3737 {
3738         struct wpa_radio_work *work, *tmp;
3739         struct wpa_radio *radio = wpa_s->radio;
3740
3741         dl_list_for_each_safe(work, tmp, &radio->work, struct wpa_radio_work,
3742                               list) {
3743                 if (type && os_strcmp(type, work->type) != 0)
3744                         continue;
3745
3746                 /* skip other ifaces' works */
3747                 if (!remove_all && work->wpa_s != wpa_s)
3748                         continue;
3749
3750                 wpa_dbg(wpa_s, MSG_DEBUG, "Remove radio work '%s'@%p%s",
3751                         work->type, work, work->started ? " (started)" : "");
3752                 work->cb(work, 1);
3753                 radio_work_free(work);
3754         }
3755
3756         /* in case we removed the started work */
3757         radio_work_check_next(wpa_s);
3758 }
3759
3760
3761 static void radio_remove_interface(struct wpa_supplicant *wpa_s)
3762 {
3763         struct wpa_radio *radio = wpa_s->radio;
3764
3765         if (!radio)
3766                 return;
3767
3768         wpa_printf(MSG_DEBUG, "Remove interface %s from radio %s",
3769                    wpa_s->ifname, radio->name);
3770         dl_list_del(&wpa_s->radio_list);
3771         radio_remove_works(wpa_s, NULL, 0);
3772         wpa_s->radio = NULL;
3773         if (!dl_list_empty(&radio->ifaces))
3774                 return; /* Interfaces remain for this radio */
3775
3776         wpa_printf(MSG_DEBUG, "Remove radio %s", radio->name);
3777         eloop_cancel_timeout(radio_start_next_work, radio, NULL);
3778         os_free(radio);
3779 }
3780
3781
3782 void radio_work_check_next(struct wpa_supplicant *wpa_s)
3783 {
3784         struct wpa_radio *radio = wpa_s->radio;
3785
3786         if (dl_list_empty(&radio->work))
3787                 return;
3788         if (wpa_s->ext_work_in_progress) {
3789                 wpa_printf(MSG_DEBUG,
3790                            "External radio work in progress - delay start of pending item");
3791                 return;
3792         }
3793         eloop_cancel_timeout(radio_start_next_work, radio, NULL);
3794         eloop_register_timeout(0, 0, radio_start_next_work, radio, NULL);
3795 }
3796
3797
3798 /**
3799  * radio_add_work - Add a radio work item
3800  * @wpa_s: Pointer to wpa_supplicant data
3801  * @freq: Frequency of the offchannel operation in MHz or 0
3802  * @type: Unique identifier for each type of work
3803  * @next: Force as the next work to be executed
3804  * @cb: Callback function for indicating when radio is available
3805  * @ctx: Context pointer for the work (work->ctx in cb())
3806  * Returns: 0 on success, -1 on failure
3807  *
3808  * This function is used to request time for an operation that requires
3809  * exclusive radio control. Once the radio is available, the registered callback
3810  * function will be called. radio_work_done() must be called once the exclusive
3811  * radio operation has been completed, so that the radio is freed for other
3812  * operations. The special case of deinit=1 is used to free the context data
3813  * during interface removal. That does not allow the callback function to start
3814  * the radio operation, i.e., it must free any resources allocated for the radio
3815  * work and return.
3816  *
3817  * The @freq parameter can be used to indicate a single channel on which the
3818  * offchannel operation will occur. This may allow multiple radio work
3819  * operations to be performed in parallel if they apply for the same channel.
3820  * Setting this to 0 indicates that the work item may use multiple channels or
3821  * requires exclusive control of the radio.
3822  */
3823 int radio_add_work(struct wpa_supplicant *wpa_s, unsigned int freq,
3824                    const char *type, int next,
3825                    void (*cb)(struct wpa_radio_work *work, int deinit),
3826                    void *ctx)
3827 {
3828         struct wpa_radio_work *work;
3829         int was_empty;
3830
3831         work = os_zalloc(sizeof(*work));
3832         if (work == NULL)
3833                 return -1;
3834         wpa_dbg(wpa_s, MSG_DEBUG, "Add radio work '%s'@%p", type, work);
3835         os_get_reltime(&work->time);
3836         work->freq = freq;
3837         work->type = type;
3838         work->wpa_s = wpa_s;
3839         work->cb = cb;
3840         work->ctx = ctx;
3841
3842         was_empty = dl_list_empty(&wpa_s->radio->work);
3843         if (next)
3844                 dl_list_add(&wpa_s->radio->work, &work->list);
3845         else
3846                 dl_list_add_tail(&wpa_s->radio->work, &work->list);
3847         if (was_empty) {
3848                 wpa_dbg(wpa_s, MSG_DEBUG, "First radio work item in the queue - schedule start immediately");
3849                 radio_work_check_next(wpa_s);
3850         }
3851
3852         return 0;
3853 }
3854
3855
3856 /**
3857  * radio_work_done - Indicate that a radio work item has been completed
3858  * @work: Completed work
3859  *
3860  * This function is called once the callback function registered with
3861  * radio_add_work() has completed its work.
3862  */
3863 void radio_work_done(struct wpa_radio_work *work)
3864 {
3865         struct wpa_supplicant *wpa_s = work->wpa_s;
3866         struct os_reltime now, diff;
3867         unsigned int started = work->started;
3868
3869         os_get_reltime(&now);
3870         os_reltime_sub(&now, &work->time, &diff);
3871         wpa_dbg(wpa_s, MSG_DEBUG, "Radio work '%s'@%p %s in %ld.%06ld seconds",
3872                 work->type, work, started ? "done" : "canceled",
3873                 diff.sec, diff.usec);
3874         radio_work_free(work);
3875         if (started)
3876                 radio_work_check_next(wpa_s);
3877 }
3878
3879
3880 struct wpa_radio_work *
3881 radio_work_pending(struct wpa_supplicant *wpa_s, const char *type)
3882 {
3883         struct wpa_radio_work *work;
3884         struct wpa_radio *radio = wpa_s->radio;
3885
3886         dl_list_for_each(work, &radio->work, struct wpa_radio_work, list) {
3887                 if (work->wpa_s == wpa_s && os_strcmp(work->type, type) == 0)
3888                         return work;
3889         }
3890
3891         return NULL;
3892 }
3893
3894
3895 static int wpas_init_driver(struct wpa_supplicant *wpa_s,
3896                             struct wpa_interface *iface)
3897 {
3898         const char *ifname, *driver, *rn;
3899
3900         driver = iface->driver;
3901 next_driver:
3902         if (wpa_supplicant_set_driver(wpa_s, driver) < 0)
3903                 return -1;
3904
3905         wpa_s->drv_priv = wpa_drv_init(wpa_s, wpa_s->ifname);
3906         if (wpa_s->drv_priv == NULL) {
3907                 const char *pos;
3908                 pos = driver ? os_strchr(driver, ',') : NULL;
3909                 if (pos) {
3910                         wpa_dbg(wpa_s, MSG_DEBUG, "Failed to initialize "
3911                                 "driver interface - try next driver wrapper");
3912                         driver = pos + 1;
3913                         goto next_driver;
3914                 }
3915                 wpa_msg(wpa_s, MSG_ERROR, "Failed to initialize driver "
3916                         "interface");
3917                 return -1;
3918         }
3919         if (wpa_drv_set_param(wpa_s, wpa_s->conf->driver_param) < 0) {
3920                 wpa_msg(wpa_s, MSG_ERROR, "Driver interface rejected "
3921                         "driver_param '%s'", wpa_s->conf->driver_param);
3922                 return -1;
3923         }
3924
3925         ifname = wpa_drv_get_ifname(wpa_s);
3926         if (ifname && os_strcmp(ifname, wpa_s->ifname) != 0) {
3927                 wpa_dbg(wpa_s, MSG_DEBUG, "Driver interface replaced "
3928                         "interface name with '%s'", ifname);
3929                 os_strlcpy(wpa_s->ifname, ifname, sizeof(wpa_s->ifname));
3930         }
3931
3932         rn = wpa_driver_get_radio_name(wpa_s);
3933         if (rn && rn[0] == '\0')
3934                 rn = NULL;
3935
3936         wpa_s->radio = radio_add_interface(wpa_s, rn);
3937         if (wpa_s->radio == NULL)
3938                 return -1;
3939
3940         return 0;
3941 }
3942
3943
3944 static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
3945                                      struct wpa_interface *iface)
3946 {
3947         struct wpa_driver_capa capa;
3948         int capa_res;
3949
3950         wpa_printf(MSG_DEBUG, "Initializing interface '%s' conf '%s' driver "
3951                    "'%s' ctrl_interface '%s' bridge '%s'", iface->ifname,
3952                    iface->confname ? iface->confname : "N/A",
3953                    iface->driver ? iface->driver : "default",
3954                    iface->ctrl_interface ? iface->ctrl_interface : "N/A",
3955                    iface->bridge_ifname ? iface->bridge_ifname : "N/A");
3956
3957         if (iface->confname) {
3958 #ifdef CONFIG_BACKEND_FILE
3959                 wpa_s->confname = os_rel2abs_path(iface->confname);
3960                 if (wpa_s->confname == NULL) {
3961                         wpa_printf(MSG_ERROR, "Failed to get absolute path "
3962                                    "for configuration file '%s'.",
3963                                    iface->confname);
3964                         return -1;
3965                 }
3966                 wpa_printf(MSG_DEBUG, "Configuration file '%s' -> '%s'",
3967                            iface->confname, wpa_s->confname);
3968 #else /* CONFIG_BACKEND_FILE */
3969                 wpa_s->confname = os_strdup(iface->confname);
3970 #endif /* CONFIG_BACKEND_FILE */
3971                 wpa_s->conf = wpa_config_read(wpa_s->confname, NULL);
3972                 if (wpa_s->conf == NULL) {
3973                         wpa_printf(MSG_ERROR, "Failed to read or parse "
3974                                    "configuration '%s'.", wpa_s->confname);
3975                         return -1;
3976                 }
3977                 wpa_s->confanother = os_rel2abs_path(iface->confanother);
3978                 wpa_config_read(wpa_s->confanother, wpa_s->conf);
3979
3980                 /*
3981                  * Override ctrl_interface and driver_param if set on command
3982                  * line.
3983                  */
3984                 if (iface->ctrl_interface) {
3985                         os_free(wpa_s->conf->ctrl_interface);
3986                         wpa_s->conf->ctrl_interface =
3987                                 os_strdup(iface->ctrl_interface);
3988                 }
3989
3990                 if (iface->driver_param) {
3991                         os_free(wpa_s->conf->driver_param);
3992                         wpa_s->conf->driver_param =
3993                                 os_strdup(iface->driver_param);
3994                 }
3995
3996                 if (iface->p2p_mgmt && !iface->ctrl_interface) {
3997                         os_free(wpa_s->conf->ctrl_interface);
3998                         wpa_s->conf->ctrl_interface = NULL;
3999                 }
4000         } else
4001                 wpa_s->conf = wpa_config_alloc_empty(iface->ctrl_interface,
4002                                                      iface->driver_param);
4003
4004         if (wpa_s->conf == NULL) {
4005                 wpa_printf(MSG_ERROR, "\nNo configuration found.");
4006                 return -1;
4007         }
4008
4009         if (iface->ifname == NULL) {
4010                 wpa_printf(MSG_ERROR, "\nInterface name is required.");
4011                 return -1;
4012         }
4013         if (os_strlen(iface->ifname) >= sizeof(wpa_s->ifname)) {
4014                 wpa_printf(MSG_ERROR, "\nToo long interface name '%s'.",
4015                            iface->ifname);
4016                 return -1;
4017         }
4018         os_strlcpy(wpa_s->ifname, iface->ifname, sizeof(wpa_s->ifname));
4019
4020         if (iface->bridge_ifname) {
4021                 if (os_strlen(iface->bridge_ifname) >=
4022                     sizeof(wpa_s->bridge_ifname)) {
4023                         wpa_printf(MSG_ERROR, "\nToo long bridge interface "
4024                                    "name '%s'.", iface->bridge_ifname);
4025                         return -1;
4026                 }
4027                 os_strlcpy(wpa_s->bridge_ifname, iface->bridge_ifname,
4028                            sizeof(wpa_s->bridge_ifname));
4029         }
4030
4031         /* RSNA Supplicant Key Management - INITIALIZE */
4032         eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
4033         eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
4034
4035         /* Initialize driver interface and register driver event handler before
4036          * L2 receive handler so that association events are processed before
4037          * EAPOL-Key packets if both become available for the same select()
4038          * call. */
4039         if (wpas_init_driver(wpa_s, iface) < 0)
4040                 return -1;
4041
4042         if (wpa_supplicant_init_wpa(wpa_s) < 0)
4043                 return -1;
4044
4045         wpa_sm_set_ifname(wpa_s->wpa, wpa_s->ifname,
4046                           wpa_s->bridge_ifname[0] ? wpa_s->bridge_ifname :
4047                           NULL);
4048         wpa_sm_set_fast_reauth(wpa_s->wpa, wpa_s->conf->fast_reauth);
4049
4050         if (wpa_s->conf->dot11RSNAConfigPMKLifetime &&
4051             wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_LIFETIME,
4052                              wpa_s->conf->dot11RSNAConfigPMKLifetime)) {
4053                 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
4054                         "dot11RSNAConfigPMKLifetime");
4055                 return -1;
4056         }
4057
4058         if (wpa_s->conf->dot11RSNAConfigPMKReauthThreshold &&
4059             wpa_sm_set_param(wpa_s->wpa, RSNA_PMK_REAUTH_THRESHOLD,
4060                              wpa_s->conf->dot11RSNAConfigPMKReauthThreshold)) {
4061                 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
4062                         "dot11RSNAConfigPMKReauthThreshold");
4063                 return -1;
4064         }
4065
4066         if (wpa_s->conf->dot11RSNAConfigSATimeout &&
4067             wpa_sm_set_param(wpa_s->wpa, RSNA_SA_TIMEOUT,
4068                              wpa_s->conf->dot11RSNAConfigSATimeout)) {
4069                 wpa_msg(wpa_s, MSG_ERROR, "Invalid WPA parameter value for "
4070                         "dot11RSNAConfigSATimeout");
4071                 return -1;
4072         }
4073
4074         wpa_s->hw.modes = wpa_drv_get_hw_feature_data(wpa_s,
4075                                                       &wpa_s->hw.num_modes,
4076                                                       &wpa_s->hw.flags);
4077         if (wpa_s->hw.modes) {
4078                 u16 i;
4079
4080                 for (i = 0; i < wpa_s->hw.num_modes; i++) {
4081                         if (wpa_s->hw.modes[i].vht_capab) {
4082                                 wpa_s->hw_capab = CAPAB_VHT;
4083                                 break;
4084                         }
4085
4086                         if (wpa_s->hw.modes[i].ht_capab &
4087                             HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET)
4088                                 wpa_s->hw_capab = CAPAB_HT40;
4089                         else if (wpa_s->hw.modes[i].ht_capab &&
4090                                  wpa_s->hw_capab == CAPAB_NO_HT_VHT)
4091                                 wpa_s->hw_capab = CAPAB_HT;
4092                 }
4093         }
4094
4095         capa_res = wpa_drv_get_capa(wpa_s, &capa);
4096         if (capa_res == 0) {
4097                 wpa_s->drv_capa_known = 1;
4098                 wpa_s->drv_flags = capa.flags;
4099                 wpa_s->drv_enc = capa.enc;
4100                 wpa_s->drv_smps_modes = capa.smps_modes;
4101                 wpa_s->drv_rrm_flags = capa.rrm_flags;
4102                 wpa_s->probe_resp_offloads = capa.probe_resp_offloads;
4103                 wpa_s->max_scan_ssids = capa.max_scan_ssids;
4104                 wpa_s->max_sched_scan_ssids = capa.max_sched_scan_ssids;
4105                 wpa_s->sched_scan_supported = capa.sched_scan_supported;
4106                 wpa_s->max_match_sets = capa.max_match_sets;
4107                 wpa_s->max_remain_on_chan = capa.max_remain_on_chan;
4108                 wpa_s->max_stations = capa.max_stations;
4109                 wpa_s->extended_capa = capa.extended_capa;
4110                 wpa_s->extended_capa_mask = capa.extended_capa_mask;
4111                 wpa_s->extended_capa_len = capa.extended_capa_len;
4112                 wpa_s->num_multichan_concurrent =
4113                         capa.num_multichan_concurrent;
4114                 wpa_s->wmm_ac_supported = capa.wmm_ac_supported;
4115
4116                 if (capa.mac_addr_rand_scan_supported)
4117                         wpa_s->mac_addr_rand_supported |= MAC_ADDR_RAND_SCAN;
4118                 if (wpa_s->sched_scan_supported &&
4119                     capa.mac_addr_rand_sched_scan_supported)
4120                         wpa_s->mac_addr_rand_supported |=
4121                                 (MAC_ADDR_RAND_SCHED_SCAN | MAC_ADDR_RAND_PNO);
4122         }
4123         if (wpa_s->max_remain_on_chan == 0)
4124                 wpa_s->max_remain_on_chan = 1000;
4125
4126         /*
4127          * Only take p2p_mgmt parameters when P2P Device is supported.
4128          * Doing it here as it determines whether l2_packet_init() will be done
4129          * during wpa_supplicant_driver_init().
4130          */
4131         if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)
4132                 wpa_s->p2p_mgmt = iface->p2p_mgmt;
4133         else
4134                 iface->p2p_mgmt = 1;
4135
4136         if (wpa_s->num_multichan_concurrent == 0)
4137                 wpa_s->num_multichan_concurrent = 1;
4138
4139         if (wpa_supplicant_driver_init(wpa_s) < 0)
4140                 return -1;
4141
4142 #ifdef CONFIG_TDLS
4143         if ((!iface->p2p_mgmt ||
4144              !(wpa_s->drv_flags &
4145                WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)) &&
4146             wpa_tdls_init(wpa_s->wpa))
4147                 return -1;
4148 #endif /* CONFIG_TDLS */
4149
4150         if (wpa_s->conf->country[0] && wpa_s->conf->country[1] &&
4151             wpa_drv_set_country(wpa_s, wpa_s->conf->country)) {
4152                 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to set country");
4153                 return -1;
4154         }
4155
4156         if (wpas_wps_init(wpa_s))
4157                 return -1;
4158
4159         if (wpa_supplicant_init_eapol(wpa_s) < 0)
4160                 return -1;
4161         wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
4162
4163         wpa_s->ctrl_iface = wpa_supplicant_ctrl_iface_init(wpa_s);
4164         if (wpa_s->ctrl_iface == NULL) {
4165                 wpa_printf(MSG_ERROR,
4166                            "Failed to initialize control interface '%s'.\n"
4167                            "You may have another wpa_supplicant process "
4168                            "already running or the file was\n"
4169                            "left by an unclean termination of wpa_supplicant "
4170                            "in which case you will need\n"
4171                            "to manually remove this file before starting "
4172                            "wpa_supplicant again.\n",
4173                            wpa_s->conf->ctrl_interface);
4174                 return -1;
4175         }
4176
4177         wpa_s->gas = gas_query_init(wpa_s);
4178         if (wpa_s->gas == NULL) {
4179                 wpa_printf(MSG_ERROR, "Failed to initialize GAS query");
4180                 return -1;
4181         }
4182
4183         if (iface->p2p_mgmt && wpas_p2p_init(wpa_s->global, wpa_s) < 0) {
4184                 wpa_msg(wpa_s, MSG_ERROR, "Failed to init P2P");
4185                 return -1;
4186         }
4187
4188         if (wpa_bss_init(wpa_s) < 0)
4189                 return -1;
4190
4191         /*
4192          * Set Wake-on-WLAN triggers, if configured.
4193          * Note: We don't restore/remove the triggers on shutdown (it doesn't
4194          * have effect anyway when the interface is down).
4195          */
4196         if (capa_res == 0 && wpas_set_wowlan_triggers(wpa_s, &capa) < 0)
4197                 return -1;
4198
4199 #ifdef CONFIG_EAP_PROXY
4200 {
4201         size_t len;
4202         wpa_s->mnc_len = eapol_sm_get_eap_proxy_imsi(wpa_s->eapol, wpa_s->imsi,
4203                                                      &len);
4204         if (wpa_s->mnc_len > 0) {
4205                 wpa_s->imsi[len] = '\0';
4206                 wpa_printf(MSG_DEBUG, "eap_proxy: IMSI %s (MNC length %d)",
4207                            wpa_s->imsi, wpa_s->mnc_len);
4208         } else {
4209                 wpa_printf(MSG_DEBUG, "eap_proxy: IMSI not available");
4210         }
4211 }
4212 #endif /* CONFIG_EAP_PROXY */
4213
4214         if (pcsc_reader_init(wpa_s) < 0)
4215                 return -1;
4216
4217         if (wpas_init_ext_pw(wpa_s) < 0)
4218                 return -1;
4219
4220         wpas_rrm_reset(wpa_s);
4221
4222         return 0;
4223 }
4224
4225
4226 static void wpa_supplicant_deinit_iface(struct wpa_supplicant *wpa_s,
4227                                         int notify, int terminate)
4228 {
4229         struct wpa_global *global = wpa_s->global;
4230         struct wpa_supplicant *iface, *prev;
4231
4232         if (wpa_s == wpa_s->parent)
4233                 wpas_p2p_group_remove(wpa_s, "*");
4234
4235         iface = global->ifaces;
4236         while (iface) {
4237                 if (iface == wpa_s || iface->parent != wpa_s) {
4238                         iface = iface->next;
4239                         continue;
4240                 }
4241                 wpa_printf(MSG_DEBUG,
4242                            "Remove remaining child interface %s from parent %s",
4243                            iface->ifname, wpa_s->ifname);
4244                 prev = iface;
4245                 iface = iface->next;
4246                 wpa_supplicant_remove_iface(global, prev, terminate);
4247         }
4248
4249         wpa_s->disconnected = 1;
4250         if (wpa_s->drv_priv) {
4251                 wpa_supplicant_deauthenticate(wpa_s,
4252                                               WLAN_REASON_DEAUTH_LEAVING);
4253
4254                 wpa_drv_set_countermeasures(wpa_s, 0);
4255                 wpa_clear_keys(wpa_s, NULL);
4256         }
4257
4258         wpa_supplicant_cleanup(wpa_s);
4259         wpas_p2p_deinit_iface(wpa_s);
4260
4261         wpas_ctrl_radio_work_flush(wpa_s);
4262         radio_remove_interface(wpa_s);
4263
4264         if (wpa_s->drv_priv)
4265                 wpa_drv_deinit(wpa_s);
4266
4267         if (notify)
4268                 wpas_notify_iface_removed(wpa_s);
4269
4270         if (terminate)
4271                 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TERMINATING);
4272
4273         if (wpa_s->ctrl_iface) {
4274                 wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
4275                 wpa_s->ctrl_iface = NULL;
4276         }
4277
4278 #ifdef CONFIG_MESH
4279         if (wpa_s->ifmsh) {
4280                 wpa_supplicant_mesh_iface_deinit(wpa_s, wpa_s->ifmsh);
4281                 wpa_s->ifmsh = NULL;
4282         }
4283 #endif /* CONFIG_MESH */
4284
4285         if (wpa_s->conf != NULL) {
4286                 wpa_config_free(wpa_s->conf);
4287                 wpa_s->conf = NULL;
4288         }
4289
4290         os_free(wpa_s);
4291 }
4292
4293
4294 /**
4295  * wpa_supplicant_add_iface - Add a new network interface
4296  * @global: Pointer to global data from wpa_supplicant_init()
4297  * @iface: Interface configuration options
4298  * @parent: Parent interface or %NULL to assign new interface as parent
4299  * Returns: Pointer to the created interface or %NULL on failure
4300  *
4301  * This function is used to add new network interfaces for %wpa_supplicant.
4302  * This can be called before wpa_supplicant_run() to add interfaces before the
4303  * main event loop has been started. In addition, new interfaces can be added
4304  * dynamically while %wpa_supplicant is already running. This could happen,
4305  * e.g., when a hotplug network adapter is inserted.
4306  */
4307 struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
4308                                                  struct wpa_interface *iface,
4309                                                  struct wpa_supplicant *parent)
4310 {
4311         struct wpa_supplicant *wpa_s;
4312         struct wpa_interface t_iface;
4313         struct wpa_ssid *ssid;
4314
4315         if (global == NULL || iface == NULL)
4316                 return NULL;
4317
4318         wpa_s = wpa_supplicant_alloc(parent);
4319         if (wpa_s == NULL)
4320                 return NULL;
4321
4322         wpa_s->global = global;
4323
4324         t_iface = *iface;
4325         if (global->params.override_driver) {
4326                 wpa_printf(MSG_DEBUG, "Override interface parameter: driver "
4327                            "('%s' -> '%s')",
4328                            iface->driver, global->params.override_driver);
4329                 t_iface.driver = global->params.override_driver;
4330         }
4331         if (global->params.override_ctrl_interface) {
4332                 wpa_printf(MSG_DEBUG, "Override interface parameter: "
4333                            "ctrl_interface ('%s' -> '%s')",
4334                            iface->ctrl_interface,
4335                            global->params.override_ctrl_interface);
4336                 t_iface.ctrl_interface =
4337                         global->params.override_ctrl_interface;
4338         }
4339         if (wpa_supplicant_init_iface(wpa_s, &t_iface)) {
4340                 wpa_printf(MSG_DEBUG, "Failed to add interface %s",
4341                            iface->ifname);
4342                 wpa_supplicant_deinit_iface(wpa_s, 0, 0);
4343                 return NULL;
4344         }
4345
4346         if (iface->p2p_mgmt == 0) {
4347                 /* Notify the control interfaces about new iface */
4348                 if (wpas_notify_iface_added(wpa_s)) {
4349                         wpa_supplicant_deinit_iface(wpa_s, 1, 0);
4350                         return NULL;
4351                 }
4352
4353                 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
4354                         wpas_notify_network_added(wpa_s, ssid);
4355         }
4356
4357         wpa_s->next = global->ifaces;
4358         global->ifaces = wpa_s;
4359
4360         wpa_dbg(wpa_s, MSG_DEBUG, "Added interface %s", wpa_s->ifname);
4361         wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
4362
4363 #ifdef CONFIG_P2P
4364         if (wpa_s->global->p2p == NULL &&
4365             (wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE) &&
4366             wpas_p2p_add_p2pdev_interface(wpa_s, iface->conf_p2p_dev) < 0) {
4367                 wpa_printf(MSG_INFO,
4368                            "P2P: Failed to enable P2P Device interface");
4369                 /* Try to continue without. P2P will be disabled. */
4370         }
4371 #endif /* CONFIG_P2P */
4372
4373         return wpa_s;
4374 }
4375
4376
4377 /**
4378  * wpa_supplicant_remove_iface - Remove a network interface
4379  * @global: Pointer to global data from wpa_supplicant_init()
4380  * @wpa_s: Pointer to the network interface to be removed
4381  * Returns: 0 if interface was removed, -1 if interface was not found
4382  *
4383  * This function can be used to dynamically remove network interfaces from
4384  * %wpa_supplicant, e.g., when a hotplug network adapter is ejected. In
4385  * addition, this function is used to remove all remaining interfaces when
4386  * %wpa_supplicant is terminated.
4387  */
4388 int wpa_supplicant_remove_iface(struct wpa_global *global,
4389                                 struct wpa_supplicant *wpa_s,
4390                                 int terminate)
4391 {
4392         struct wpa_supplicant *prev;
4393 #ifdef CONFIG_MESH
4394         unsigned int mesh_if_created = wpa_s->mesh_if_created;
4395         char *ifname = NULL;
4396 #endif /* CONFIG_MESH */
4397
4398         /* Remove interface from the global list of interfaces */
4399         prev = global->ifaces;
4400         if (prev == wpa_s) {
4401                 global->ifaces = wpa_s->next;
4402         } else {
4403                 while (prev && prev->next != wpa_s)
4404                         prev = prev->next;
4405                 if (prev == NULL)
4406                         return -1;
4407                 prev->next = wpa_s->next;
4408         }
4409
4410         wpa_dbg(wpa_s, MSG_DEBUG, "Removing interface %s", wpa_s->ifname);
4411
4412 #ifdef CONFIG_MESH
4413         if (mesh_if_created) {
4414                 ifname = os_strdup(wpa_s->ifname);
4415                 if (ifname == NULL) {
4416                         wpa_dbg(wpa_s, MSG_ERROR,
4417                                 "mesh: Failed to malloc ifname");
4418                         return -1;
4419                 }
4420         }
4421 #endif /* CONFIG_MESH */
4422
4423         if (global->p2p_group_formation == wpa_s)
4424                 global->p2p_group_formation = NULL;
4425         if (global->p2p_invite_group == wpa_s)
4426                 global->p2p_invite_group = NULL;
4427         wpa_supplicant_deinit_iface(wpa_s, 1, terminate);
4428
4429 #ifdef CONFIG_MESH
4430         if (mesh_if_created) {
4431                 wpa_drv_if_remove(global->ifaces, WPA_IF_MESH, ifname);
4432                 os_free(ifname);
4433         }
4434 #endif /* CONFIG_MESH */
4435
4436         return 0;
4437 }
4438
4439
4440 /**
4441  * wpa_supplicant_get_eap_mode - Get the current EAP mode
4442  * @wpa_s: Pointer to the network interface
4443  * Returns: Pointer to the eap mode or the string "UNKNOWN" if not found
4444  */
4445 const char * wpa_supplicant_get_eap_mode(struct wpa_supplicant *wpa_s)
4446 {
4447         const char *eapol_method;
4448
4449         if (wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) == 0 &&
4450             wpa_s->key_mgmt != WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
4451                 return "NO-EAP";
4452         }
4453
4454         eapol_method = eapol_sm_get_method_name(wpa_s->eapol);
4455         if (eapol_method == NULL)
4456                 return "UNKNOWN-EAP";
4457
4458         return eapol_method;
4459 }
4460
4461
4462 /**
4463  * wpa_supplicant_get_iface - Get a new network interface
4464  * @global: Pointer to global data from wpa_supplicant_init()
4465  * @ifname: Interface name
4466  * Returns: Pointer to the interface or %NULL if not found
4467  */
4468 struct wpa_supplicant * wpa_supplicant_get_iface(struct wpa_global *global,
4469                                                  const char *ifname)
4470 {
4471         struct wpa_supplicant *wpa_s;
4472
4473         for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
4474                 if (os_strcmp(wpa_s->ifname, ifname) == 0)
4475                         return wpa_s;
4476         }
4477         return NULL;
4478 }
4479
4480
4481 #ifndef CONFIG_NO_WPA_MSG
4482 static const char * wpa_supplicant_msg_ifname_cb(void *ctx)
4483 {
4484         struct wpa_supplicant *wpa_s = ctx;
4485         if (wpa_s == NULL)
4486                 return NULL;
4487         return wpa_s->ifname;
4488 }
4489 #endif /* CONFIG_NO_WPA_MSG */
4490
4491
4492 /**
4493  * wpa_supplicant_init - Initialize %wpa_supplicant
4494  * @params: Parameters for %wpa_supplicant
4495  * Returns: Pointer to global %wpa_supplicant data, or %NULL on failure
4496  *
4497  * This function is used to initialize %wpa_supplicant. After successful
4498  * initialization, the returned data pointer can be used to add and remove
4499  * network interfaces, and eventually, to deinitialize %wpa_supplicant.
4500  */
4501 struct wpa_global * wpa_supplicant_init(struct wpa_params *params)
4502 {
4503         struct wpa_global *global;
4504         int ret, i;
4505
4506         if (params == NULL)
4507                 return NULL;
4508
4509 #ifdef CONFIG_DRIVER_NDIS
4510         {
4511                 void driver_ndis_init_ops(void);
4512                 driver_ndis_init_ops();
4513         }
4514 #endif /* CONFIG_DRIVER_NDIS */
4515
4516 #ifndef CONFIG_NO_WPA_MSG
4517         wpa_msg_register_ifname_cb(wpa_supplicant_msg_ifname_cb);
4518 #endif /* CONFIG_NO_WPA_MSG */
4519
4520         if (params->wpa_debug_file_path)
4521                 wpa_debug_open_file(params->wpa_debug_file_path);
4522         else
4523                 wpa_debug_setup_stdout();
4524         if (params->wpa_debug_syslog)
4525                 wpa_debug_open_syslog();
4526         if (params->wpa_debug_tracing) {
4527                 ret = wpa_debug_open_linux_tracing();
4528                 if (ret) {
4529                         wpa_printf(MSG_ERROR,
4530                                    "Failed to enable trace logging");
4531                         return NULL;
4532                 }
4533         }
4534
4535         ret = eap_register_methods();
4536         if (ret) {
4537                 wpa_printf(MSG_ERROR, "Failed to register EAP methods");
4538                 if (ret == -2)
4539                         wpa_printf(MSG_ERROR, "Two or more EAP methods used "
4540                                    "the same EAP type.");
4541                 return NULL;
4542         }
4543
4544         global = os_zalloc(sizeof(*global));
4545         if (global == NULL)
4546                 return NULL;
4547         dl_list_init(&global->p2p_srv_bonjour);
4548         dl_list_init(&global->p2p_srv_upnp);
4549         global->params.daemonize = params->daemonize;
4550         global->params.wait_for_monitor = params->wait_for_monitor;
4551         global->params.dbus_ctrl_interface = params->dbus_ctrl_interface;
4552         if (params->pid_file)
4553                 global->params.pid_file = os_strdup(params->pid_file);
4554         if (params->ctrl_interface)
4555                 global->params.ctrl_interface =
4556                         os_strdup(params->ctrl_interface);
4557         if (params->ctrl_interface_group)
4558                 global->params.ctrl_interface_group =
4559                         os_strdup(params->ctrl_interface_group);
4560         if (params->override_driver)
4561                 global->params.override_driver =
4562                         os_strdup(params->override_driver);
4563         if (params->override_ctrl_interface)
4564                 global->params.override_ctrl_interface =
4565                         os_strdup(params->override_ctrl_interface);
4566         wpa_debug_level = global->params.wpa_debug_level =
4567                 params->wpa_debug_level;
4568         wpa_debug_show_keys = global->params.wpa_debug_show_keys =
4569                 params->wpa_debug_show_keys;
4570         wpa_debug_timestamp = global->params.wpa_debug_timestamp =
4571                 params->wpa_debug_timestamp;
4572
4573         wpa_printf(MSG_DEBUG, "wpa_supplicant v" VERSION_STR);
4574
4575         if (eloop_init()) {
4576                 wpa_printf(MSG_ERROR, "Failed to initialize event loop");
4577                 wpa_supplicant_deinit(global);
4578                 return NULL;
4579         }
4580
4581         random_init(params->entropy_file);
4582
4583         global->ctrl_iface = wpa_supplicant_global_ctrl_iface_init(global);
4584         if (global->ctrl_iface == NULL) {
4585                 wpa_supplicant_deinit(global);
4586                 return NULL;
4587         }
4588
4589         if (wpas_notify_supplicant_initialized(global)) {
4590                 wpa_supplicant_deinit(global);
4591                 return NULL;
4592         }
4593
4594         for (i = 0; wpa_drivers[i]; i++)
4595                 global->drv_count++;
4596         if (global->drv_count == 0) {
4597                 wpa_printf(MSG_ERROR, "No drivers enabled");
4598                 wpa_supplicant_deinit(global);
4599                 return NULL;
4600         }
4601         global->drv_priv = os_calloc(global->drv_count, sizeof(void *));
4602         if (global->drv_priv == NULL) {
4603                 wpa_supplicant_deinit(global);
4604                 return NULL;
4605         }
4606
4607 #ifdef CONFIG_WIFI_DISPLAY
4608         if (wifi_display_init(global) < 0) {
4609                 wpa_printf(MSG_ERROR, "Failed to initialize Wi-Fi Display");
4610                 wpa_supplicant_deinit(global);
4611                 return NULL;
4612         }
4613 #endif /* CONFIG_WIFI_DISPLAY */
4614
4615         return global;
4616 }
4617
4618
4619 /**
4620  * wpa_supplicant_run - Run the %wpa_supplicant main event loop
4621  * @global: Pointer to global data from wpa_supplicant_init()
4622  * Returns: 0 after successful event loop run, -1 on failure
4623  *
4624  * This function starts the main event loop and continues running as long as
4625  * there are any remaining events. In most cases, this function is running as
4626  * long as the %wpa_supplicant process in still in use.
4627  */
4628 int wpa_supplicant_run(struct wpa_global *global)
4629 {
4630         struct wpa_supplicant *wpa_s;
4631
4632         if (global->params.daemonize &&
4633             wpa_supplicant_daemon(global->params.pid_file))
4634                 return -1;
4635
4636         if (global->params.wait_for_monitor) {
4637                 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
4638                         if (wpa_s->ctrl_iface)
4639                                 wpa_supplicant_ctrl_iface_wait(
4640                                         wpa_s->ctrl_iface);
4641         }
4642
4643         eloop_register_signal_terminate(wpa_supplicant_terminate, global);
4644         eloop_register_signal_reconfig(wpa_supplicant_reconfig, global);
4645
4646         eloop_run();
4647
4648         return 0;
4649 }
4650
4651
4652 /**
4653  * wpa_supplicant_deinit - Deinitialize %wpa_supplicant
4654  * @global: Pointer to global data from wpa_supplicant_init()
4655  *
4656  * This function is called to deinitialize %wpa_supplicant and to free all
4657  * allocated resources. Remaining network interfaces will also be removed.
4658  */
4659 void wpa_supplicant_deinit(struct wpa_global *global)
4660 {
4661         int i;
4662
4663         if (global == NULL)
4664                 return;
4665
4666 #ifdef CONFIG_WIFI_DISPLAY
4667         wifi_display_deinit(global);
4668 #endif /* CONFIG_WIFI_DISPLAY */
4669
4670         while (global->ifaces)
4671                 wpa_supplicant_remove_iface(global, global->ifaces, 1);
4672
4673         if (global->ctrl_iface)
4674                 wpa_supplicant_global_ctrl_iface_deinit(global->ctrl_iface);
4675
4676         wpas_notify_supplicant_deinitialized(global);
4677
4678         eap_peer_unregister_methods();
4679 #ifdef CONFIG_AP
4680         eap_server_unregister_methods();
4681 #endif /* CONFIG_AP */
4682
4683         for (i = 0; wpa_drivers[i] && global->drv_priv; i++) {
4684                 if (!global->drv_priv[i])
4685                         continue;
4686                 wpa_drivers[i]->global_deinit(global->drv_priv[i]);
4687         }
4688         os_free(global->drv_priv);
4689
4690         random_deinit();
4691
4692         eloop_destroy();
4693
4694         if (global->params.pid_file) {
4695                 os_daemonize_terminate(global->params.pid_file);
4696                 os_free(global->params.pid_file);
4697         }
4698         os_free(global->params.ctrl_interface);
4699         os_free(global->params.ctrl_interface_group);
4700         os_free(global->params.override_driver);
4701         os_free(global->params.override_ctrl_interface);
4702
4703         os_free(global->p2p_disallow_freq.range);
4704         os_free(global->p2p_go_avoid_freq.range);
4705         os_free(global->add_psk);
4706
4707         os_free(global);
4708         wpa_debug_close_syslog();
4709         wpa_debug_close_file();
4710         wpa_debug_close_linux_tracing();
4711 }
4712
4713
4714 void wpa_supplicant_update_config(struct wpa_supplicant *wpa_s)
4715 {
4716         if ((wpa_s->conf->changed_parameters & CFG_CHANGED_COUNTRY) &&
4717             wpa_s->conf->country[0] && wpa_s->conf->country[1]) {
4718                 char country[3];
4719                 country[0] = wpa_s->conf->country[0];
4720                 country[1] = wpa_s->conf->country[1];
4721                 country[2] = '\0';
4722                 if (wpa_drv_set_country(wpa_s, country) < 0) {
4723                         wpa_printf(MSG_ERROR, "Failed to set country code "
4724                                    "'%s'", country);
4725                 }
4726         }
4727
4728         if (wpa_s->conf->changed_parameters & CFG_CHANGED_EXT_PW_BACKEND)
4729                 wpas_init_ext_pw(wpa_s);
4730
4731 #ifdef CONFIG_WPS
4732         wpas_wps_update_config(wpa_s);
4733 #endif /* CONFIG_WPS */
4734         wpas_p2p_update_config(wpa_s);
4735         wpa_s->conf->changed_parameters = 0;
4736 }
4737
4738
4739 void add_freq(int *freqs, int *num_freqs, int freq)
4740 {
4741         int i;
4742
4743         for (i = 0; i < *num_freqs; i++) {
4744                 if (freqs[i] == freq)
4745                         return;
4746         }
4747
4748         freqs[*num_freqs] = freq;
4749         (*num_freqs)++;
4750 }
4751
4752
4753 static int * get_bss_freqs_in_ess(struct wpa_supplicant *wpa_s)
4754 {
4755         struct wpa_bss *bss, *cbss;
4756         const int max_freqs = 10;
4757         int *freqs;
4758         int num_freqs = 0;
4759
4760         freqs = os_calloc(max_freqs + 1, sizeof(int));
4761         if (freqs == NULL)
4762                 return NULL;
4763
4764         cbss = wpa_s->current_bss;
4765
4766         dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
4767                 if (bss == cbss)
4768                         continue;
4769                 if (bss->ssid_len == cbss->ssid_len &&
4770                     os_memcmp(bss->ssid, cbss->ssid, bss->ssid_len) == 0 &&
4771                     wpa_blacklist_get(wpa_s, bss->bssid) == NULL) {
4772                         add_freq(freqs, &num_freqs, bss->freq);
4773                         if (num_freqs == max_freqs)
4774                                 break;
4775                 }
4776         }
4777
4778         if (num_freqs == 0) {
4779                 os_free(freqs);
4780                 freqs = NULL;
4781         }
4782
4783         return freqs;
4784 }
4785
4786
4787 void wpas_connection_failed(struct wpa_supplicant *wpa_s, const u8 *bssid)
4788 {
4789         int timeout;
4790         int count;
4791         int *freqs = NULL;
4792
4793         wpas_connect_work_done(wpa_s);
4794
4795         /*
4796          * Remove possible authentication timeout since the connection failed.
4797          */
4798         eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
4799
4800         /*
4801          * There is no point in blacklisting the AP if this event is
4802          * generated based on local request to disconnect.
4803          */
4804         if (wpa_s->own_disconnect_req) {
4805                 wpa_s->own_disconnect_req = 0;
4806                 wpa_dbg(wpa_s, MSG_DEBUG,
4807                         "Ignore connection failure due to local request to disconnect");
4808                 return;
4809         }
4810         if (wpa_s->disconnected) {
4811                 wpa_dbg(wpa_s, MSG_DEBUG, "Ignore connection failure "
4812                         "indication since interface has been put into "
4813                         "disconnected state");
4814                 return;
4815         }
4816
4817         /*
4818          * Add the failed BSSID into the blacklist and speed up next scan
4819          * attempt if there could be other APs that could accept association.
4820          * The current blacklist count indicates how many times we have tried
4821          * connecting to this AP and multiple attempts mean that other APs are
4822          * either not available or has already been tried, so that we can start
4823          * increasing the delay here to avoid constant scanning.
4824          */
4825         count = wpa_blacklist_add(wpa_s, bssid);
4826         if (count == 1 && wpa_s->current_bss) {
4827                 /*
4828                  * This BSS was not in the blacklist before. If there is
4829                  * another BSS available for the same ESS, we should try that
4830                  * next. Otherwise, we may as well try this one once more
4831                  * before allowing other, likely worse, ESSes to be considered.
4832                  */
4833                 freqs = get_bss_freqs_in_ess(wpa_s);
4834                 if (freqs) {
4835                         wpa_dbg(wpa_s, MSG_DEBUG, "Another BSS in this ESS "
4836                                 "has been seen; try it next");
4837                         wpa_blacklist_add(wpa_s, bssid);
4838                         /*
4839                          * On the next scan, go through only the known channels
4840                          * used in this ESS based on previous scans to speed up
4841                          * common load balancing use case.
4842                          */
4843                         os_free(wpa_s->next_scan_freqs);
4844                         wpa_s->next_scan_freqs = freqs;
4845                 }
4846         }
4847
4848         /*
4849          * Add previous failure count in case the temporary blacklist was
4850          * cleared due to no other BSSes being available.
4851          */
4852         count += wpa_s->extra_blacklist_count;
4853
4854         if (count > 3 && wpa_s->current_ssid) {
4855                 wpa_printf(MSG_DEBUG, "Continuous association failures - "
4856                            "consider temporary network disabling");
4857                 wpas_auth_failed(wpa_s, "CONN_FAILED");
4858         }
4859
4860         switch (count) {
4861         case 1:
4862                 timeout = 100;
4863                 break;
4864         case 2:
4865                 timeout = 500;
4866                 break;
4867         case 3:
4868                 timeout = 1000;
4869                 break;
4870         case 4:
4871                 timeout = 5000;
4872                 break;
4873         default:
4874                 timeout = 10000;
4875                 break;
4876         }
4877
4878         wpa_dbg(wpa_s, MSG_DEBUG, "Blacklist count %d --> request scan in %d "
4879                 "ms", count, timeout);
4880
4881         /*
4882          * TODO: if more than one possible AP is available in scan results,
4883          * could try the other ones before requesting a new scan.
4884          */
4885         wpa_supplicant_req_scan(wpa_s, timeout / 1000,
4886                                 1000 * (timeout % 1000));
4887 }
4888
4889
4890 int wpas_driver_bss_selection(struct wpa_supplicant *wpa_s)
4891 {
4892         return wpa_s->conf->ap_scan == 2 ||
4893                 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_BSS_SELECTION);
4894 }
4895
4896
4897 #if defined(CONFIG_CTRL_IFACE) || defined(CONFIG_CTRL_IFACE_DBUS_NEW)
4898 int wpa_supplicant_ctrl_iface_ctrl_rsp_handle(struct wpa_supplicant *wpa_s,
4899                                               struct wpa_ssid *ssid,
4900                                               const char *field,
4901                                               const char *value)
4902 {
4903 #ifdef IEEE8021X_EAPOL
4904         struct eap_peer_config *eap = &ssid->eap;
4905
4906         wpa_printf(MSG_DEBUG, "CTRL_IFACE: response handle field=%s", field);
4907         wpa_hexdump_ascii_key(MSG_DEBUG, "CTRL_IFACE: response value",
4908                               (const u8 *) value, os_strlen(value));
4909
4910         switch (wpa_supplicant_ctrl_req_from_string(field)) {
4911         case WPA_CTRL_REQ_EAP_IDENTITY:
4912                 os_free(eap->identity);
4913                 eap->identity = (u8 *) os_strdup(value);
4914                 eap->identity_len = os_strlen(value);
4915                 eap->pending_req_identity = 0;
4916                 if (ssid == wpa_s->current_ssid)
4917                         wpa_s->reassociate = 1;
4918                 break;
4919         case WPA_CTRL_REQ_EAP_PASSWORD:
4920                 bin_clear_free(eap->password, eap->password_len);
4921                 eap->password = (u8 *) os_strdup(value);
4922                 eap->password_len = os_strlen(value);
4923                 eap->pending_req_password = 0;
4924                 if (ssid == wpa_s->current_ssid)
4925                         wpa_s->reassociate = 1;
4926                 break;
4927         case WPA_CTRL_REQ_EAP_NEW_PASSWORD:
4928                 bin_clear_free(eap->new_password, eap->new_password_len);
4929                 eap->new_password = (u8 *) os_strdup(value);
4930                 eap->new_password_len = os_strlen(value);
4931                 eap->pending_req_new_password = 0;
4932                 if (ssid == wpa_s->current_ssid)
4933                         wpa_s->reassociate = 1;
4934                 break;
4935         case WPA_CTRL_REQ_EAP_PIN:
4936                 str_clear_free(eap->pin);
4937                 eap->pin = os_strdup(value);
4938                 eap->pending_req_pin = 0;
4939                 if (ssid == wpa_s->current_ssid)
4940                         wpa_s->reassociate = 1;
4941                 break;
4942         case WPA_CTRL_REQ_EAP_OTP:
4943                 bin_clear_free(eap->otp, eap->otp_len);
4944                 eap->otp = (u8 *) os_strdup(value);
4945                 eap->otp_len = os_strlen(value);
4946                 os_free(eap->pending_req_otp);
4947                 eap->pending_req_otp = NULL;
4948                 eap->pending_req_otp_len = 0;
4949                 break;
4950         case WPA_CTRL_REQ_EAP_PASSPHRASE:
4951                 str_clear_free(eap->private_key_passwd);
4952                 eap->private_key_passwd = os_strdup(value);
4953                 eap->pending_req_passphrase = 0;
4954                 if (ssid == wpa_s->current_ssid)
4955                         wpa_s->reassociate = 1;
4956                 break;
4957         case WPA_CTRL_REQ_SIM:
4958                 str_clear_free(eap->external_sim_resp);
4959                 eap->external_sim_resp = os_strdup(value);
4960                 break;
4961         default:
4962                 wpa_printf(MSG_DEBUG, "CTRL_IFACE: Unknown field '%s'", field);
4963                 return -1;
4964         }
4965
4966         return 0;
4967 #else /* IEEE8021X_EAPOL */
4968         wpa_printf(MSG_DEBUG, "CTRL_IFACE: IEEE 802.1X not included");
4969         return -1;
4970 #endif /* IEEE8021X_EAPOL */
4971 }
4972 #endif /* CONFIG_CTRL_IFACE || CONFIG_CTRL_IFACE_DBUS_NEW */
4973
4974
4975 int wpas_network_disabled(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
4976 {
4977         int i;
4978         unsigned int drv_enc;
4979
4980         if (wpa_s->p2p_mgmt)
4981                 return 1; /* no normal network profiles on p2p_mgmt interface */
4982
4983         if (ssid == NULL)
4984                 return 1;
4985
4986         if (ssid->disabled)
4987                 return 1;
4988
4989         if (wpa_s->drv_capa_known)
4990                 drv_enc = wpa_s->drv_enc;
4991         else
4992                 drv_enc = (unsigned int) -1;
4993
4994         for (i = 0; i < NUM_WEP_KEYS; i++) {
4995                 size_t len = ssid->wep_key_len[i];
4996                 if (len == 0)
4997                         continue;
4998                 if (len == 5 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP40))
4999                         continue;
5000                 if (len == 13 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP104))
5001                         continue;
5002                 if (len == 16 && (drv_enc & WPA_DRIVER_CAPA_ENC_WEP128))
5003                         continue;
5004                 return 1; /* invalid WEP key */
5005         }
5006
5007         if (wpa_key_mgmt_wpa_psk(ssid->key_mgmt) && !ssid->psk_set &&
5008             (!ssid->passphrase || ssid->ssid_len != 0) && !ssid->ext_psk)
5009                 return 1;
5010
5011         return 0;
5012 }
5013
5014
5015 int wpas_get_ssid_pmf(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
5016 {
5017 #ifdef CONFIG_IEEE80211W
5018         if (ssid == NULL || ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT) {
5019                 if (wpa_s->conf->pmf == MGMT_FRAME_PROTECTION_OPTIONAL &&
5020                     !(wpa_s->drv_enc & WPA_DRIVER_CAPA_ENC_BIP)) {
5021                         /*
5022                          * Driver does not support BIP -- ignore pmf=1 default
5023                          * since the connection with PMF would fail and the
5024                          * configuration does not require PMF to be enabled.
5025                          */
5026                         return NO_MGMT_FRAME_PROTECTION;
5027                 }
5028
5029                 return wpa_s->conf->pmf;
5030         }
5031
5032         return ssid->ieee80211w;
5033 #else /* CONFIG_IEEE80211W */
5034         return NO_MGMT_FRAME_PROTECTION;
5035 #endif /* CONFIG_IEEE80211W */
5036 }
5037
5038
5039 int wpas_is_p2p_prioritized(struct wpa_supplicant *wpa_s)
5040 {
5041         if (wpa_s->global->conc_pref == WPA_CONC_PREF_P2P)
5042                 return 1;
5043         if (wpa_s->global->conc_pref == WPA_CONC_PREF_STA)
5044                 return 0;
5045         return -1;
5046 }
5047
5048
5049 void wpas_auth_failed(struct wpa_supplicant *wpa_s, char *reason)
5050 {
5051         struct wpa_ssid *ssid = wpa_s->current_ssid;
5052         int dur;
5053         struct os_reltime now;
5054
5055         if (ssid == NULL) {
5056                 wpa_printf(MSG_DEBUG, "Authentication failure but no known "
5057                            "SSID block");
5058                 return;
5059         }
5060
5061         if (ssid->key_mgmt == WPA_KEY_MGMT_WPS)
5062                 return;
5063
5064         ssid->auth_failures++;
5065
5066 #ifdef CONFIG_P2P
5067         if (ssid->p2p_group &&
5068             (wpa_s->p2p_in_provisioning || wpa_s->show_group_started)) {
5069                 /*
5070                  * Skip the wait time since there is a short timeout on the
5071                  * connection to a P2P group.
5072                  */
5073                 return;
5074         }
5075 #endif /* CONFIG_P2P */
5076
5077         if (ssid->auth_failures > 50)
5078                 dur = 300;
5079         else if (ssid->auth_failures > 10)
5080                 dur = 120;
5081         else if (ssid->auth_failures > 5)
5082                 dur = 90;
5083         else if (ssid->auth_failures > 3)
5084                 dur = 60;
5085         else if (ssid->auth_failures > 2)
5086                 dur = 30;
5087         else if (ssid->auth_failures > 1)
5088                 dur = 20;
5089         else
5090                 dur = 10;
5091
5092         if (ssid->auth_failures > 1 &&
5093             wpa_key_mgmt_wpa_ieee8021x(ssid->key_mgmt))
5094                 dur += os_random() % (ssid->auth_failures * 10);
5095
5096         os_get_reltime(&now);
5097         if (now.sec + dur <= ssid->disabled_until.sec)
5098                 return;
5099
5100         ssid->disabled_until.sec = now.sec + dur;
5101
5102         wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TEMP_DISABLED
5103                 "id=%d ssid=\"%s\" auth_failures=%u duration=%d reason=%s",
5104                 ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
5105                 ssid->auth_failures, dur, reason);
5106 }
5107
5108
5109 void wpas_clear_temp_disabled(struct wpa_supplicant *wpa_s,
5110                               struct wpa_ssid *ssid, int clear_failures)
5111 {
5112         if (ssid == NULL)
5113                 return;
5114
5115         if (ssid->disabled_until.sec) {
5116                 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_REENABLED
5117                         "id=%d ssid=\"%s\"",
5118                         ssid->id, wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
5119         }
5120         ssid->disabled_until.sec = 0;
5121         ssid->disabled_until.usec = 0;
5122         if (clear_failures)
5123                 ssid->auth_failures = 0;
5124 }
5125
5126
5127 int disallowed_bssid(struct wpa_supplicant *wpa_s, const u8 *bssid)
5128 {
5129         size_t i;
5130
5131         if (wpa_s->disallow_aps_bssid == NULL)
5132                 return 0;
5133
5134         for (i = 0; i < wpa_s->disallow_aps_bssid_count; i++) {
5135                 if (os_memcmp(wpa_s->disallow_aps_bssid + i * ETH_ALEN,
5136                               bssid, ETH_ALEN) == 0)
5137                         return 1;
5138         }
5139
5140         return 0;
5141 }
5142
5143
5144 int disallowed_ssid(struct wpa_supplicant *wpa_s, const u8 *ssid,
5145                     size_t ssid_len)
5146 {
5147         size_t i;
5148
5149         if (wpa_s->disallow_aps_ssid == NULL || ssid == NULL)
5150                 return 0;
5151
5152         for (i = 0; i < wpa_s->disallow_aps_ssid_count; i++) {
5153                 struct wpa_ssid_value *s = &wpa_s->disallow_aps_ssid[i];
5154                 if (ssid_len == s->ssid_len &&
5155                     os_memcmp(ssid, s->ssid, ssid_len) == 0)
5156                         return 1;
5157         }
5158
5159         return 0;
5160 }
5161
5162
5163 /**
5164  * wpas_request_connection - Request a new connection
5165  * @wpa_s: Pointer to the network interface
5166  *
5167  * This function is used to request a new connection to be found. It will mark
5168  * the interface to allow reassociation and request a new scan to find a
5169  * suitable network to connect to.
5170  */
5171 void wpas_request_connection(struct wpa_supplicant *wpa_s)
5172 {
5173         wpa_s->normal_scans = 0;
5174         wpa_s->scan_req = NORMAL_SCAN_REQ;
5175         wpa_supplicant_reinit_autoscan(wpa_s);
5176         wpa_s->extra_blacklist_count = 0;
5177         wpa_s->disconnected = 0;
5178         wpa_s->reassociate = 1;
5179
5180         if (wpa_supplicant_fast_associate(wpa_s) != 1)
5181                 wpa_supplicant_req_scan(wpa_s, 0, 0);
5182         else
5183                 wpa_s->reattach = 0;
5184 }
5185
5186
5187 void dump_freq_data(struct wpa_supplicant *wpa_s, const char *title,
5188                     struct wpa_used_freq_data *freqs_data,
5189                     unsigned int len)
5190 {
5191         unsigned int i;
5192
5193         wpa_dbg(wpa_s, MSG_DEBUG, "Shared frequencies (len=%u): %s",
5194                 len, title);
5195         for (i = 0; i < len; i++) {
5196                 struct wpa_used_freq_data *cur = &freqs_data[i];
5197                 wpa_dbg(wpa_s, MSG_DEBUG, "freq[%u]: %d, flags=0x%X",
5198                         i, cur->freq, cur->flags);
5199         }
5200 }
5201
5202
5203 /*
5204  * Find the operating frequencies of any of the virtual interfaces that
5205  * are using the same radio as the current interface, and in addition, get
5206  * information about the interface types that are using the frequency.
5207  */
5208 int get_shared_radio_freqs_data(struct wpa_supplicant *wpa_s,
5209                                 struct wpa_used_freq_data *freqs_data,
5210                                 unsigned int len)
5211 {
5212         struct wpa_supplicant *ifs;
5213         u8 bssid[ETH_ALEN];
5214         int freq;
5215         unsigned int idx = 0, i;
5216
5217         wpa_dbg(wpa_s, MSG_DEBUG,
5218                 "Determining shared radio frequencies (max len %u)", len);
5219         os_memset(freqs_data, 0, sizeof(struct wpa_used_freq_data) * len);
5220
5221         dl_list_for_each(ifs, &wpa_s->radio->ifaces, struct wpa_supplicant,
5222                          radio_list) {
5223                 if (idx == len)
5224                         break;
5225
5226                 if (ifs->current_ssid == NULL || ifs->assoc_freq == 0)
5227                         continue;
5228
5229                 if (ifs->current_ssid->mode == WPAS_MODE_AP ||
5230                     ifs->current_ssid->mode == WPAS_MODE_P2P_GO)
5231                         freq = ifs->current_ssid->frequency;
5232                 else if (wpa_drv_get_bssid(ifs, bssid) == 0)
5233                         freq = ifs->assoc_freq;
5234                 else
5235                         continue;
5236
5237                 /* Hold only distinct freqs */
5238                 for (i = 0; i < idx; i++)
5239                         if (freqs_data[i].freq == freq)
5240                                 break;
5241
5242                 if (i == idx)
5243                         freqs_data[idx++].freq = freq;
5244
5245                 if (ifs->current_ssid->mode == WPAS_MODE_INFRA) {
5246                         freqs_data[i].flags = ifs->current_ssid->p2p_group ?
5247                                 WPA_FREQ_USED_BY_P2P_CLIENT :
5248                                 WPA_FREQ_USED_BY_INFRA_STATION;
5249                 }
5250         }
5251
5252         dump_freq_data(wpa_s, "completed iteration", freqs_data, idx);
5253         return idx;
5254 }
5255
5256
5257 /*
5258  * Find the operating frequencies of any of the virtual interfaces that
5259  * are using the same radio as the current interface.
5260  */
5261 int get_shared_radio_freqs(struct wpa_supplicant *wpa_s,
5262                            int *freq_array, unsigned int len)
5263 {
5264         struct wpa_used_freq_data *freqs_data;
5265         int num, i;
5266
5267         os_memset(freq_array, 0, sizeof(int) * len);
5268
5269         freqs_data = os_calloc(len, sizeof(struct wpa_used_freq_data));
5270         if (!freqs_data)
5271                 return -1;
5272
5273         num = get_shared_radio_freqs_data(wpa_s, freqs_data, len);
5274         for (i = 0; i < num; i++)
5275                 freq_array[i] = freqs_data[i].freq;
5276
5277         os_free(freqs_data);
5278
5279         return num;
5280 }
5281
5282
5283 static void wpas_rrm_neighbor_rep_timeout_handler(void *data, void *user_ctx)
5284 {
5285         struct rrm_data *rrm = data;
5286
5287         if (!rrm->notify_neighbor_rep) {
5288                 wpa_printf(MSG_ERROR,
5289                            "RRM: Unexpected neighbor report timeout");
5290                 return;
5291         }
5292
5293         wpa_printf(MSG_DEBUG, "RRM: Notifying neighbor report - NONE");
5294         rrm->notify_neighbor_rep(rrm->neighbor_rep_cb_ctx, NULL);
5295
5296         rrm->notify_neighbor_rep = NULL;
5297         rrm->neighbor_rep_cb_ctx = NULL;
5298 }
5299
5300
5301 /*
5302  * wpas_rrm_reset - Clear and reset all RRM data in wpa_supplicant
5303  * @wpa_s: Pointer to wpa_supplicant
5304  */
5305 void wpas_rrm_reset(struct wpa_supplicant *wpa_s)
5306 {
5307         wpa_s->rrm.rrm_used = 0;
5308
5309         eloop_cancel_timeout(wpas_rrm_neighbor_rep_timeout_handler, &wpa_s->rrm,
5310                              NULL);
5311         if (wpa_s->rrm.notify_neighbor_rep)
5312                 wpas_rrm_neighbor_rep_timeout_handler(&wpa_s->rrm, NULL);
5313         wpa_s->rrm.next_neighbor_rep_token = 1;
5314 }
5315
5316
5317 /*
5318  * wpas_rrm_process_neighbor_rep - Handle incoming neighbor report
5319  * @wpa_s: Pointer to wpa_supplicant
5320  * @report: Neighbor report buffer, prefixed by a 1-byte dialog token
5321  * @report_len: Length of neighbor report buffer
5322  */
5323 void wpas_rrm_process_neighbor_rep(struct wpa_supplicant *wpa_s,
5324                                    const u8 *report, size_t report_len)
5325 {
5326         struct wpabuf *neighbor_rep;
5327
5328         wpa_hexdump(MSG_DEBUG, "RRM: New Neighbor Report", report, report_len);
5329         if (report_len < 1)
5330                 return;
5331
5332         if (report[0] != wpa_s->rrm.next_neighbor_rep_token - 1) {
5333                 wpa_printf(MSG_DEBUG,
5334                            "RRM: Discarding neighbor report with token %d (expected %d)",
5335                            report[0], wpa_s->rrm.next_neighbor_rep_token - 1);
5336                 return;
5337         }
5338
5339         eloop_cancel_timeout(wpas_rrm_neighbor_rep_timeout_handler, &wpa_s->rrm,
5340                              NULL);
5341
5342         if (!wpa_s->rrm.notify_neighbor_rep) {
5343                 wpa_printf(MSG_ERROR, "RRM: Unexpected neighbor report");
5344                 return;
5345         }
5346
5347         /* skipping the first byte, which is only an id (dialog token) */
5348         neighbor_rep = wpabuf_alloc(report_len - 1);
5349         if (neighbor_rep == NULL)
5350                 return;
5351         wpabuf_put_data(neighbor_rep, report + 1, report_len - 1);
5352         wpa_printf(MSG_DEBUG, "RRM: Notifying neighbor report (token = %d)",
5353                    report[0]);
5354         wpa_s->rrm.notify_neighbor_rep(wpa_s->rrm.neighbor_rep_cb_ctx,
5355                                        neighbor_rep);
5356         wpa_s->rrm.notify_neighbor_rep = NULL;
5357         wpa_s->rrm.neighbor_rep_cb_ctx = NULL;
5358 }
5359
5360
5361 #if defined(__CYGWIN__) || defined(CONFIG_NATIVE_WINDOWS)
5362 /* Workaround different, undefined for Windows, error codes used here */
5363 #define ENOTCONN -1
5364 #define EOPNOTSUPP -1
5365 #define ECANCELED -1
5366 #endif
5367
5368 /**
5369  * wpas_rrm_send_neighbor_rep_request - Request a neighbor report from our AP
5370  * @wpa_s: Pointer to wpa_supplicant
5371  * @ssid: if not null, this is sent in the request. Otherwise, no SSID IE
5372  *        is sent in the request.
5373  * @cb: Callback function to be called once the requested report arrives, or
5374  *      timed out after RRM_NEIGHBOR_REPORT_TIMEOUT seconds.
5375  *      In the former case, 'neighbor_rep' is a newly allocated wpabuf, and it's
5376  *      the requester's responsibility to free it.
5377  *      In the latter case NULL will be sent in 'neighbor_rep'.
5378  * @cb_ctx: Context value to send the callback function
5379  * Returns: 0 in case of success, negative error code otherwise
5380  *
5381  * In case there is a previous request which has not been answered yet, the
5382  * new request fails. The caller may retry after RRM_NEIGHBOR_REPORT_TIMEOUT.
5383  * Request must contain a callback function.
5384  */
5385 int wpas_rrm_send_neighbor_rep_request(struct wpa_supplicant *wpa_s,
5386                                        const struct wpa_ssid *ssid,
5387                                        void (*cb)(void *ctx,
5388                                                   struct wpabuf *neighbor_rep),
5389                                        void *cb_ctx)
5390 {
5391         struct wpabuf *buf;
5392         const u8 *rrm_ie;
5393
5394         if (wpa_s->wpa_state != WPA_COMPLETED || wpa_s->current_ssid == NULL) {
5395                 wpa_printf(MSG_DEBUG, "RRM: No connection, no RRM.");
5396                 return -ENOTCONN;
5397         }
5398
5399         if (!wpa_s->rrm.rrm_used) {
5400                 wpa_printf(MSG_DEBUG, "RRM: No RRM in current connection.");
5401                 return -EOPNOTSUPP;
5402         }
5403
5404         rrm_ie = wpa_bss_get_ie(wpa_s->current_bss,
5405                                 WLAN_EID_RRM_ENABLED_CAPABILITIES);
5406         if (!rrm_ie || !(wpa_s->current_bss->caps & IEEE80211_CAP_RRM) ||
5407             !(rrm_ie[2] & WLAN_RRM_CAPS_NEIGHBOR_REPORT)) {
5408                 wpa_printf(MSG_DEBUG,
5409                            "RRM: No network support for Neighbor Report.");
5410                 return -EOPNOTSUPP;
5411         }
5412
5413         if (!cb) {
5414                 wpa_printf(MSG_DEBUG,
5415                            "RRM: Neighbor Report request must provide a callback.");
5416                 return -EINVAL;
5417         }
5418
5419         /* Refuse if there's a live request */
5420         if (wpa_s->rrm.notify_neighbor_rep) {
5421                 wpa_printf(MSG_DEBUG,
5422                            "RRM: Currently handling previous Neighbor Report.");
5423                 return -EBUSY;
5424         }
5425
5426         /* 3 = action category + action code + dialog token */
5427         buf = wpabuf_alloc(3 + (ssid ? 2 + ssid->ssid_len : 0));
5428         if (buf == NULL) {
5429                 wpa_printf(MSG_DEBUG,
5430                            "RRM: Failed to allocate Neighbor Report Request");
5431                 return -ENOMEM;
5432         }
5433
5434         wpa_printf(MSG_DEBUG, "RRM: Neighbor report request (for %s), token=%d",
5435                    (ssid ? wpa_ssid_txt(ssid->ssid, ssid->ssid_len) : ""),
5436                    wpa_s->rrm.next_neighbor_rep_token);
5437
5438         wpabuf_put_u8(buf, WLAN_ACTION_RADIO_MEASUREMENT);
5439         wpabuf_put_u8(buf, WLAN_RRM_NEIGHBOR_REPORT_REQUEST);
5440         wpabuf_put_u8(buf, wpa_s->rrm.next_neighbor_rep_token);
5441         if (ssid) {
5442                 wpabuf_put_u8(buf, WLAN_EID_SSID);
5443                 wpabuf_put_u8(buf, ssid->ssid_len);
5444                 wpabuf_put_data(buf, ssid->ssid, ssid->ssid_len);
5445         }
5446
5447         wpa_s->rrm.next_neighbor_rep_token++;
5448
5449         if (wpa_drv_send_action(wpa_s, wpa_s->assoc_freq, 0, wpa_s->bssid,
5450                                 wpa_s->own_addr, wpa_s->bssid,
5451                                 wpabuf_head(buf), wpabuf_len(buf), 0) < 0) {
5452                 wpa_printf(MSG_DEBUG,
5453                            "RRM: Failed to send Neighbor Report Request");
5454                 wpabuf_free(buf);
5455                 return -ECANCELED;
5456         }
5457
5458         wpa_s->rrm.neighbor_rep_cb_ctx = cb_ctx;
5459         wpa_s->rrm.notify_neighbor_rep = cb;
5460         eloop_register_timeout(RRM_NEIGHBOR_REPORT_TIMEOUT, 0,
5461                                wpas_rrm_neighbor_rep_timeout_handler,
5462                                &wpa_s->rrm, NULL);
5463
5464         wpabuf_free(buf);
5465         return 0;
5466 }
5467
5468
5469 void wpas_rrm_handle_link_measurement_request(struct wpa_supplicant *wpa_s,
5470                                               const u8 *src,
5471                                               const u8 *frame, size_t len,
5472                                               int rssi)
5473 {
5474         struct wpabuf *buf;
5475         const struct rrm_link_measurement_request *req;
5476         struct rrm_link_measurement_report report;
5477
5478         if (wpa_s->wpa_state != WPA_COMPLETED) {
5479                 wpa_printf(MSG_INFO,
5480                            "RRM: Ignoring link measurement request. Not associated");
5481                 return;
5482         }
5483
5484         if (!wpa_s->rrm.rrm_used) {
5485                 wpa_printf(MSG_INFO,
5486                            "RRM: Ignoring link measurement request. Not RRM network");
5487                 return;
5488         }
5489
5490         if (!(wpa_s->drv_rrm_flags & WPA_DRIVER_FLAGS_TX_POWER_INSERTION)) {
5491                 wpa_printf(MSG_INFO,
5492                            "RRM: Measurement report failed. TX power insertion not supported");
5493                 return;
5494         }
5495
5496         req = (const struct rrm_link_measurement_request *) frame;
5497         if (len < sizeof(*req)) {
5498                 wpa_printf(MSG_INFO,
5499                            "RRM: Link measurement report failed. Request too short");
5500                 return;
5501         }
5502
5503         os_memset(&report, 0, sizeof(report));
5504         report.tpc.eid = WLAN_EID_TPC_REPORT;
5505         report.tpc.len = 2;
5506         report.rsni = 255; /* 255 indicates that RSNI is not available */
5507         report.dialog_token = req->dialog_token;
5508
5509         /*
5510          * It's possible to estimate RCPI based on RSSI in dBm. This
5511          * calculation will not reflect the correct value for high rates,
5512          * but it's good enough for Action frames which are transmitted
5513          * with up to 24 Mbps rates.
5514          */
5515         if (!rssi)
5516                 report.rcpi = 255; /* not available */
5517         else if (rssi < -110)
5518                 report.rcpi = 0;
5519         else if (rssi > 0)
5520                 report.rcpi = 220;
5521         else
5522                 report.rcpi = (rssi + 110) * 2;
5523
5524         /* action_category + action_code */
5525         buf = wpabuf_alloc(2 + sizeof(report));
5526         if (buf == NULL) {
5527                 wpa_printf(MSG_ERROR,
5528                            "RRM: Link measurement report failed. Buffer allocation failed");
5529                 return;
5530         }
5531
5532         wpabuf_put_u8(buf, WLAN_ACTION_RADIO_MEASUREMENT);
5533         wpabuf_put_u8(buf, WLAN_RRM_LINK_MEASUREMENT_REPORT);
5534         wpabuf_put_data(buf, &report, sizeof(report));
5535         wpa_hexdump(MSG_DEBUG, "RRM: Link measurement report:",
5536                     wpabuf_head(buf), wpabuf_len(buf));
5537
5538         if (wpa_drv_send_action(wpa_s, wpa_s->assoc_freq, 0, src,
5539                                 wpa_s->own_addr, wpa_s->bssid,
5540                                 wpabuf_head(buf), wpabuf_len(buf), 0)) {
5541                 wpa_printf(MSG_ERROR,
5542                            "RRM: Link measurement report failed. Send action failed");
5543         }
5544         wpabuf_free(buf);
5545 }