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