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