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