1/*
2 * wpa_supplicant - SME
3 * Copyright (c) 2009-2014, Jouni Malinen <j@w1.fi>
4 *
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
7 */
8
9#include "includes.h"
10
11#include "common.h"
12#include "utils/eloop.h"
13#include "common/ieee802_11_defs.h"
14#include "common/ieee802_11_common.h"
15#include "eapol_supp/eapol_supp_sm.h"
16#include "common/wpa_common.h"
17#include "common/sae.h"
18#include "rsn_supp/wpa.h"
19#include "rsn_supp/pmksa_cache.h"
20#include "config.h"
21#include "wpa_supplicant_i.h"
22#include "driver_i.h"
23#include "wpas_glue.h"
24#include "wps_supplicant.h"
25#include "p2p_supplicant.h"
26#include "notify.h"
27#include "bss.h"
28#include "scan.h"
29#include "sme.h"
30#include "hs20_supplicant.h"
31
32#define SME_AUTH_TIMEOUT 5
33#define SME_ASSOC_TIMEOUT 5
34
35static void sme_auth_timer(void *eloop_ctx, void *timeout_ctx);
36static void sme_assoc_timer(void *eloop_ctx, void *timeout_ctx);
37static void sme_obss_scan_timeout(void *eloop_ctx, void *timeout_ctx);
38#ifdef CONFIG_IEEE80211W
39static void sme_stop_sa_query(struct wpa_supplicant *wpa_s);
40#endif /* CONFIG_IEEE80211W */
41
42
43#ifdef CONFIG_SAE
44
45static int index_within_array(const int *array, int idx)
46{
47	int i;
48	for (i = 0; i < idx; i++) {
49		if (array[i] <= 0)
50			return 0;
51	}
52	return 1;
53}
54
55
56static int sme_set_sae_group(struct wpa_supplicant *wpa_s)
57{
58	int *groups = wpa_s->conf->sae_groups;
59	int default_groups[] = { 19, 20, 21, 25, 26, 0 };
60
61	if (!groups || groups[0] <= 0)
62		groups = default_groups;
63
64	/* Configuration may have changed, so validate current index */
65	if (!index_within_array(groups, wpa_s->sme.sae_group_index))
66		return -1;
67
68	for (;;) {
69		int group = groups[wpa_s->sme.sae_group_index];
70		if (group < 0)
71			break;
72		if (sae_set_group(&wpa_s->sme.sae, group) == 0) {
73			wpa_dbg(wpa_s, MSG_DEBUG, "SME: Selected SAE group %d",
74				wpa_s->sme.sae.group);
75		       return 0;
76		}
77		wpa_s->sme.sae_group_index++;
78	}
79
80	return -1;
81}
82
83
84static struct wpabuf * sme_auth_build_sae_commit(struct wpa_supplicant *wpa_s,
85						 struct wpa_ssid *ssid,
86						 const u8 *bssid)
87{
88	struct wpabuf *buf;
89	size_t len;
90
91	if (ssid->passphrase == NULL) {
92		wpa_printf(MSG_DEBUG, "SAE: No password available");
93		return NULL;
94	}
95
96	if (sme_set_sae_group(wpa_s) < 0) {
97		wpa_printf(MSG_DEBUG, "SAE: Failed to select group");
98		return NULL;
99	}
100
101	if (sae_prepare_commit(wpa_s->own_addr, bssid,
102			       (u8 *) ssid->passphrase,
103			       os_strlen(ssid->passphrase),
104			       &wpa_s->sme.sae) < 0) {
105		wpa_printf(MSG_DEBUG, "SAE: Could not pick PWE");
106		return NULL;
107	}
108
109	len = wpa_s->sme.sae_token ? wpabuf_len(wpa_s->sme.sae_token) : 0;
110	buf = wpabuf_alloc(4 + SAE_COMMIT_MAX_LEN + len);
111	if (buf == NULL)
112		return NULL;
113
114	wpabuf_put_le16(buf, 1); /* Transaction seq# */
115	wpabuf_put_le16(buf, WLAN_STATUS_SUCCESS);
116	sae_write_commit(&wpa_s->sme.sae, buf, wpa_s->sme.sae_token);
117
118	return buf;
119}
120
121
122static struct wpabuf * sme_auth_build_sae_confirm(struct wpa_supplicant *wpa_s)
123{
124	struct wpabuf *buf;
125
126	buf = wpabuf_alloc(4 + SAE_CONFIRM_MAX_LEN);
127	if (buf == NULL)
128		return NULL;
129
130	wpabuf_put_le16(buf, 2); /* Transaction seq# */
131	wpabuf_put_le16(buf, WLAN_STATUS_SUCCESS);
132	sae_write_confirm(&wpa_s->sme.sae, buf);
133
134	return buf;
135}
136
137#endif /* CONFIG_SAE */
138
139
140static void sme_send_authentication(struct wpa_supplicant *wpa_s,
141				    struct wpa_bss *bss, struct wpa_ssid *ssid,
142				    int start)
143{
144	struct wpa_driver_auth_params params;
145	struct wpa_ssid *old_ssid;
146#ifdef CONFIG_IEEE80211R
147	const u8 *ie;
148#endif /* CONFIG_IEEE80211R */
149#ifdef CONFIG_IEEE80211R
150	const u8 *md = NULL;
151#endif /* CONFIG_IEEE80211R */
152	int i, bssid_changed;
153	struct wpabuf *resp = NULL;
154	u8 ext_capab[18];
155	int ext_capab_len;
156
157	if (bss == NULL) {
158		wpa_msg(wpa_s, MSG_ERROR, "SME: No scan result available for "
159			"the network");
160		wpas_connect_work_done(wpa_s);
161		return;
162	}
163
164	wpa_s->current_bss = bss;
165
166	os_memset(&params, 0, sizeof(params));
167	wpa_s->reassociate = 0;
168
169	params.freq = bss->freq;
170	params.bssid = bss->bssid;
171	params.ssid = bss->ssid;
172	params.ssid_len = bss->ssid_len;
173	params.p2p = ssid->p2p_group;
174
175	if (wpa_s->sme.ssid_len != params.ssid_len ||
176	    os_memcmp(wpa_s->sme.ssid, params.ssid, params.ssid_len) != 0)
177		wpa_s->sme.prev_bssid_set = 0;
178
179	wpa_s->sme.freq = params.freq;
180	os_memcpy(wpa_s->sme.ssid, params.ssid, params.ssid_len);
181	wpa_s->sme.ssid_len = params.ssid_len;
182
183	params.auth_alg = WPA_AUTH_ALG_OPEN;
184#ifdef IEEE8021X_EAPOL
185	if (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) {
186		if (ssid->leap) {
187			if (ssid->non_leap == 0)
188				params.auth_alg = WPA_AUTH_ALG_LEAP;
189			else
190				params.auth_alg |= WPA_AUTH_ALG_LEAP;
191		}
192	}
193#endif /* IEEE8021X_EAPOL */
194	wpa_dbg(wpa_s, MSG_DEBUG, "Automatic auth_alg selection: 0x%x",
195		params.auth_alg);
196	if (ssid->auth_alg) {
197		params.auth_alg = ssid->auth_alg;
198		wpa_dbg(wpa_s, MSG_DEBUG, "Overriding auth_alg selection: "
199			"0x%x", params.auth_alg);
200	}
201#ifdef CONFIG_SAE
202	if (wpa_key_mgmt_sae(ssid->key_mgmt)) {
203		const u8 *rsn;
204		struct wpa_ie_data ied;
205
206		rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
207		if (rsn &&
208		    wpa_parse_wpa_ie(rsn, 2 + rsn[1], &ied) == 0) {
209			if (wpa_key_mgmt_sae(ied.key_mgmt)) {
210				wpa_dbg(wpa_s, MSG_DEBUG, "Using SAE auth_alg");
211				params.auth_alg = WPA_AUTH_ALG_SAE;
212			}
213		}
214	}
215#endif /* CONFIG_SAE */
216
217	for (i = 0; i < NUM_WEP_KEYS; i++) {
218		if (ssid->wep_key_len[i])
219			params.wep_key[i] = ssid->wep_key[i];
220		params.wep_key_len[i] = ssid->wep_key_len[i];
221	}
222	params.wep_tx_keyidx = ssid->wep_tx_keyidx;
223
224	bssid_changed = !is_zero_ether_addr(wpa_s->bssid);
225	os_memset(wpa_s->bssid, 0, ETH_ALEN);
226	os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN);
227	if (bssid_changed)
228		wpas_notify_bssid_changed(wpa_s);
229
230	if ((wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE) ||
231	     wpa_bss_get_ie(bss, WLAN_EID_RSN)) &&
232	    wpa_key_mgmt_wpa(ssid->key_mgmt)) {
233		int try_opportunistic;
234		try_opportunistic = (ssid->proactive_key_caching < 0 ?
235				     wpa_s->conf->okc :
236				     ssid->proactive_key_caching) &&
237			(ssid->proto & WPA_PROTO_RSN);
238		if (pmksa_cache_set_current(wpa_s->wpa, NULL, bss->bssid,
239					    wpa_s->current_ssid,
240					    try_opportunistic) == 0)
241			eapol_sm_notify_pmkid_attempt(wpa_s->eapol, 1);
242		wpa_s->sme.assoc_req_ie_len = sizeof(wpa_s->sme.assoc_req_ie);
243		if (wpa_supplicant_set_suites(wpa_s, bss, ssid,
244					      wpa_s->sme.assoc_req_ie,
245					      &wpa_s->sme.assoc_req_ie_len)) {
246			wpa_msg(wpa_s, MSG_WARNING, "SME: Failed to set WPA "
247				"key management and encryption suites");
248			wpas_connect_work_done(wpa_s);
249			return;
250		}
251	} else if ((ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) &&
252		   wpa_key_mgmt_wpa_ieee8021x(ssid->key_mgmt)) {
253		/*
254		 * Both WPA and non-WPA IEEE 802.1X enabled in configuration -
255		 * use non-WPA since the scan results did not indicate that the
256		 * AP is using WPA or WPA2.
257		 */
258		wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
259		wpa_s->sme.assoc_req_ie_len = 0;
260	} else if (wpa_key_mgmt_wpa_any(ssid->key_mgmt)) {
261		wpa_s->sme.assoc_req_ie_len = sizeof(wpa_s->sme.assoc_req_ie);
262		if (wpa_supplicant_set_suites(wpa_s, NULL, ssid,
263					      wpa_s->sme.assoc_req_ie,
264					      &wpa_s->sme.assoc_req_ie_len)) {
265			wpa_msg(wpa_s, MSG_WARNING, "SME: Failed to set WPA "
266				"key management and encryption suites (no "
267				"scan results)");
268			wpas_connect_work_done(wpa_s);
269			return;
270		}
271#ifdef CONFIG_WPS
272	} else if (ssid->key_mgmt & WPA_KEY_MGMT_WPS) {
273		struct wpabuf *wps_ie;
274		wps_ie = wps_build_assoc_req_ie(wpas_wps_get_req_type(ssid));
275		if (wps_ie && wpabuf_len(wps_ie) <=
276		    sizeof(wpa_s->sme.assoc_req_ie)) {
277			wpa_s->sme.assoc_req_ie_len = wpabuf_len(wps_ie);
278			os_memcpy(wpa_s->sme.assoc_req_ie, wpabuf_head(wps_ie),
279				  wpa_s->sme.assoc_req_ie_len);
280		} else
281			wpa_s->sme.assoc_req_ie_len = 0;
282		wpabuf_free(wps_ie);
283		wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
284#endif /* CONFIG_WPS */
285	} else {
286		wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
287		wpa_s->sme.assoc_req_ie_len = 0;
288	}
289
290#ifdef CONFIG_IEEE80211R
291	ie = wpa_bss_get_ie(bss, WLAN_EID_MOBILITY_DOMAIN);
292	if (ie && ie[1] >= MOBILITY_DOMAIN_ID_LEN)
293		md = ie + 2;
294	wpa_sm_set_ft_params(wpa_s->wpa, ie, ie ? 2 + ie[1] : 0);
295	if (md) {
296		/* Prepare for the next transition */
297		wpa_ft_prepare_auth_request(wpa_s->wpa, ie);
298	}
299
300	if (md && wpa_key_mgmt_ft(ssid->key_mgmt)) {
301		if (wpa_s->sme.assoc_req_ie_len + 5 <
302		    sizeof(wpa_s->sme.assoc_req_ie)) {
303			struct rsn_mdie *mdie;
304			u8 *pos = wpa_s->sme.assoc_req_ie +
305				wpa_s->sme.assoc_req_ie_len;
306			*pos++ = WLAN_EID_MOBILITY_DOMAIN;
307			*pos++ = sizeof(*mdie);
308			mdie = (struct rsn_mdie *) pos;
309			os_memcpy(mdie->mobility_domain, md,
310				  MOBILITY_DOMAIN_ID_LEN);
311			mdie->ft_capab = md[MOBILITY_DOMAIN_ID_LEN];
312			wpa_s->sme.assoc_req_ie_len += 5;
313		}
314
315		if (wpa_s->sme.ft_used &&
316		    os_memcmp(md, wpa_s->sme.mobility_domain, 2) == 0 &&
317		    wpa_sm_has_ptk(wpa_s->wpa)) {
318			wpa_dbg(wpa_s, MSG_DEBUG, "SME: Trying to use FT "
319				"over-the-air");
320			params.auth_alg = WPA_AUTH_ALG_FT;
321			params.ie = wpa_s->sme.ft_ies;
322			params.ie_len = wpa_s->sme.ft_ies_len;
323		}
324	}
325#endif /* CONFIG_IEEE80211R */
326
327#ifdef CONFIG_IEEE80211W
328	wpa_s->sme.mfp = ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT ?
329		wpa_s->conf->pmf : ssid->ieee80211w;
330	if (wpa_s->sme.mfp != NO_MGMT_FRAME_PROTECTION) {
331		const u8 *rsn = wpa_bss_get_ie(bss, WLAN_EID_RSN);
332		struct wpa_ie_data _ie;
333		if (rsn && wpa_parse_wpa_ie(rsn, 2 + rsn[1], &_ie) == 0 &&
334		    _ie.capabilities &
335		    (WPA_CAPABILITY_MFPC | WPA_CAPABILITY_MFPR)) {
336			wpa_dbg(wpa_s, MSG_DEBUG, "SME: Selected AP supports "
337				"MFP: require MFP");
338			wpa_s->sme.mfp = MGMT_FRAME_PROTECTION_REQUIRED;
339		}
340	}
341#endif /* CONFIG_IEEE80211W */
342
343#ifdef CONFIG_P2P
344	if (wpa_s->global->p2p) {
345		u8 *pos;
346		size_t len;
347		int res;
348		pos = wpa_s->sme.assoc_req_ie + wpa_s->sme.assoc_req_ie_len;
349		len = sizeof(wpa_s->sme.assoc_req_ie) -
350			wpa_s->sme.assoc_req_ie_len;
351		res = wpas_p2p_assoc_req_ie(wpa_s, bss, pos, len,
352					    ssid->p2p_group);
353		if (res >= 0)
354			wpa_s->sme.assoc_req_ie_len += res;
355	}
356#endif /* CONFIG_P2P */
357
358#ifdef CONFIG_HS20
359	if (is_hs20_network(wpa_s, ssid, bss)) {
360		struct wpabuf *hs20;
361		hs20 = wpabuf_alloc(20);
362		if (hs20) {
363			int pps_mo_id = hs20_get_pps_mo_id(wpa_s, ssid);
364			size_t len;
365
366			wpas_hs20_add_indication(hs20, pps_mo_id);
367			len = sizeof(wpa_s->sme.assoc_req_ie) -
368				wpa_s->sme.assoc_req_ie_len;
369			if (wpabuf_len(hs20) <= len) {
370				os_memcpy(wpa_s->sme.assoc_req_ie +
371					  wpa_s->sme.assoc_req_ie_len,
372					  wpabuf_head(hs20), wpabuf_len(hs20));
373				wpa_s->sme.assoc_req_ie_len += wpabuf_len(hs20);
374			}
375			wpabuf_free(hs20);
376		}
377	}
378#endif /* CONFIG_HS20 */
379
380	ext_capab_len = wpas_build_ext_capab(wpa_s, ext_capab,
381					     sizeof(ext_capab));
382	if (ext_capab_len > 0) {
383		u8 *pos = wpa_s->sme.assoc_req_ie;
384		if (wpa_s->sme.assoc_req_ie_len > 0 && pos[0] == WLAN_EID_RSN)
385			pos += 2 + pos[1];
386		os_memmove(pos + ext_capab_len, pos,
387			   wpa_s->sme.assoc_req_ie_len -
388			   (pos - wpa_s->sme.assoc_req_ie));
389		wpa_s->sme.assoc_req_ie_len += ext_capab_len;
390		os_memcpy(pos, ext_capab, ext_capab_len);
391	}
392
393#ifdef CONFIG_SAE
394	if (params.auth_alg == WPA_AUTH_ALG_SAE) {
395		if (start)
396			resp = sme_auth_build_sae_commit(wpa_s, ssid,
397							 bss->bssid);
398		else
399			resp = sme_auth_build_sae_confirm(wpa_s);
400		if (resp == NULL) {
401			wpas_connect_work_done(wpa_s);
402			return;
403		}
404		params.sae_data = wpabuf_head(resp);
405		params.sae_data_len = wpabuf_len(resp);
406		wpa_s->sme.sae.state = start ? SAE_COMMITTED : SAE_CONFIRMED;
407	}
408#endif /* CONFIG_SAE */
409
410	wpa_supplicant_cancel_sched_scan(wpa_s);
411	wpa_supplicant_cancel_scan(wpa_s);
412
413	wpa_msg(wpa_s, MSG_INFO, "SME: Trying to authenticate with " MACSTR
414		" (SSID='%s' freq=%d MHz)", MAC2STR(params.bssid),
415		wpa_ssid_txt(params.ssid, params.ssid_len), params.freq);
416
417	wpa_clear_keys(wpa_s, bss->bssid);
418	wpa_supplicant_set_state(wpa_s, WPA_AUTHENTICATING);
419	old_ssid = wpa_s->current_ssid;
420	wpa_s->current_ssid = ssid;
421	wpa_supplicant_rsn_supp_set_config(wpa_s, wpa_s->current_ssid);
422	wpa_supplicant_initiate_eapol(wpa_s);
423	if (old_ssid != wpa_s->current_ssid)
424		wpas_notify_network_changed(wpa_s);
425
426#ifdef CONFIG_P2P
427	/*
428	 * If multi-channel concurrency is not supported, check for any
429	 * frequency conflict. In case of any frequency conflict, remove the
430	 * least prioritized connection.
431	 */
432	if (wpa_s->num_multichan_concurrent < 2) {
433		int freq, num;
434		num = get_shared_radio_freqs(wpa_s, &freq, 1);
435		if (num > 0 && freq > 0 && freq != params.freq) {
436			wpa_printf(MSG_DEBUG,
437				   "Conflicting frequency found (%d != %d)",
438				   freq, params.freq);
439			if (wpas_p2p_handle_frequency_conflicts(wpa_s,
440								params.freq,
441								ssid) < 0) {
442				wpas_connection_failed(wpa_s, bss->bssid);
443				wpa_supplicant_mark_disassoc(wpa_s);
444				wpabuf_free(resp);
445				wpas_connect_work_done(wpa_s);
446				return;
447			}
448		}
449	}
450#endif /* CONFIG_P2P */
451
452	wpa_s->sme.auth_alg = params.auth_alg;
453	if (wpa_drv_authenticate(wpa_s, &params) < 0) {
454		wpa_msg(wpa_s, MSG_INFO, "SME: Authentication request to the "
455			"driver failed");
456		wpas_connection_failed(wpa_s, bss->bssid);
457		wpa_supplicant_mark_disassoc(wpa_s);
458		wpabuf_free(resp);
459		wpas_connect_work_done(wpa_s);
460		return;
461	}
462
463	eloop_register_timeout(SME_AUTH_TIMEOUT, 0, sme_auth_timer, wpa_s,
464			       NULL);
465
466	/*
467	 * Association will be started based on the authentication event from
468	 * the driver.
469	 */
470
471	wpabuf_free(resp);
472}
473
474
475static void sme_auth_start_cb(struct wpa_radio_work *work, int deinit)
476{
477	struct wpa_connect_work *cwork = work->ctx;
478	struct wpa_supplicant *wpa_s = work->wpa_s;
479
480	if (deinit) {
481		if (work->started)
482			wpa_s->connect_work = NULL;
483
484		wpas_connect_work_free(cwork);
485		return;
486	}
487
488	wpa_s->connect_work = work;
489
490	if (!wpas_valid_bss_ssid(wpa_s, cwork->bss, cwork->ssid)) {
491		wpa_dbg(wpa_s, MSG_DEBUG, "SME: BSS/SSID entry for authentication not valid anymore - drop connection attempt");
492		wpas_connect_work_done(wpa_s);
493		return;
494	}
495
496	sme_send_authentication(wpa_s, cwork->bss, cwork->ssid, 1);
497}
498
499
500void sme_authenticate(struct wpa_supplicant *wpa_s,
501		      struct wpa_bss *bss, struct wpa_ssid *ssid)
502{
503	struct wpa_connect_work *cwork;
504
505	if (bss == NULL || ssid == NULL)
506		return;
507	if (wpa_s->connect_work) {
508		wpa_dbg(wpa_s, MSG_DEBUG, "SME: Reject sme_authenticate() call since connect_work exist");
509		return;
510	}
511
512	if (radio_work_pending(wpa_s, "sme-connect")) {
513		/*
514		 * The previous sme-connect work might no longer be valid due to
515		 * the fact that the BSS list was updated. In addition, it makes
516		 * sense to adhere to the 'newer' decision.
517		 */
518		wpa_dbg(wpa_s, MSG_DEBUG,
519			"SME: Remove previous pending sme-connect");
520		radio_remove_works(wpa_s, "sme-connect", 0);
521	}
522
523	cwork = os_zalloc(sizeof(*cwork));
524	if (cwork == NULL)
525		return;
526	cwork->bss = bss;
527	cwork->ssid = ssid;
528	cwork->sme = 1;
529
530#ifdef CONFIG_SAE
531	wpa_s->sme.sae.state = SAE_NOTHING;
532	wpa_s->sme.sae.send_confirm = 0;
533	wpa_s->sme.sae_group_index = 0;
534#endif /* CONFIG_SAE */
535
536	if (radio_add_work(wpa_s, bss->freq, "sme-connect", 1,
537			   sme_auth_start_cb, cwork) < 0)
538		wpas_connect_work_free(cwork);
539}
540
541
542#ifdef CONFIG_SAE
543
544static int sme_sae_auth(struct wpa_supplicant *wpa_s, u16 auth_transaction,
545			u16 status_code, const u8 *data, size_t len)
546{
547	wpa_dbg(wpa_s, MSG_DEBUG, "SME: SAE authentication transaction %u "
548		"status code %u", auth_transaction, status_code);
549
550	if (auth_transaction == 1 &&
551	    status_code == WLAN_STATUS_ANTI_CLOGGING_TOKEN_REQ &&
552	    wpa_s->sme.sae.state == SAE_COMMITTED &&
553	    wpa_s->current_bss && wpa_s->current_ssid) {
554		wpa_dbg(wpa_s, MSG_DEBUG, "SME: SAE anti-clogging token "
555			"requested");
556		wpabuf_free(wpa_s->sme.sae_token);
557		wpa_s->sme.sae_token = wpabuf_alloc_copy(data, len);
558		sme_send_authentication(wpa_s, wpa_s->current_bss,
559					wpa_s->current_ssid, 1);
560		return 0;
561	}
562
563	if (auth_transaction == 1 &&
564	    status_code == WLAN_STATUS_FINITE_CYCLIC_GROUP_NOT_SUPPORTED &&
565	    wpa_s->sme.sae.state == SAE_COMMITTED &&
566	    wpa_s->current_bss && wpa_s->current_ssid) {
567		wpa_dbg(wpa_s, MSG_DEBUG, "SME: SAE group not supported");
568		wpa_s->sme.sae_group_index++;
569		if (sme_set_sae_group(wpa_s) < 0)
570			return -1; /* no other groups enabled */
571		wpa_dbg(wpa_s, MSG_DEBUG, "SME: Try next enabled SAE group");
572		sme_send_authentication(wpa_s, wpa_s->current_bss,
573					wpa_s->current_ssid, 1);
574		return 0;
575	}
576
577	if (status_code != WLAN_STATUS_SUCCESS)
578		return -1;
579
580	if (auth_transaction == 1) {
581		int *groups = wpa_s->conf->sae_groups;
582
583		wpa_dbg(wpa_s, MSG_DEBUG, "SME SAE commit");
584		if (wpa_s->current_bss == NULL ||
585		    wpa_s->current_ssid == NULL)
586			return -1;
587		if (wpa_s->sme.sae.state != SAE_COMMITTED)
588			return -1;
589		if (groups && groups[0] <= 0)
590			groups = NULL;
591		if (sae_parse_commit(&wpa_s->sme.sae, data, len, NULL, NULL,
592				     groups) != WLAN_STATUS_SUCCESS)
593			return -1;
594
595		if (sae_process_commit(&wpa_s->sme.sae) < 0) {
596			wpa_printf(MSG_DEBUG, "SAE: Failed to process peer "
597				   "commit");
598			return -1;
599		}
600
601		wpabuf_free(wpa_s->sme.sae_token);
602		wpa_s->sme.sae_token = NULL;
603		sme_send_authentication(wpa_s, wpa_s->current_bss,
604					wpa_s->current_ssid, 0);
605		return 0;
606	} else if (auth_transaction == 2) {
607		wpa_dbg(wpa_s, MSG_DEBUG, "SME SAE confirm");
608		if (wpa_s->sme.sae.state != SAE_CONFIRMED)
609			return -1;
610		if (sae_check_confirm(&wpa_s->sme.sae, data, len) < 0)
611			return -1;
612		wpa_s->sme.sae.state = SAE_ACCEPTED;
613		sae_clear_temp_data(&wpa_s->sme.sae);
614		return 1;
615	}
616
617	return -1;
618}
619#endif /* CONFIG_SAE */
620
621
622void sme_event_auth(struct wpa_supplicant *wpa_s, union wpa_event_data *data)
623{
624	struct wpa_ssid *ssid = wpa_s->current_ssid;
625
626	if (ssid == NULL) {
627		wpa_dbg(wpa_s, MSG_DEBUG, "SME: Ignore authentication event "
628			"when network is not selected");
629		return;
630	}
631
632	if (wpa_s->wpa_state != WPA_AUTHENTICATING) {
633		wpa_dbg(wpa_s, MSG_DEBUG, "SME: Ignore authentication event "
634			"when not in authenticating state");
635		return;
636	}
637
638	if (os_memcmp(wpa_s->pending_bssid, data->auth.peer, ETH_ALEN) != 0) {
639		wpa_dbg(wpa_s, MSG_DEBUG, "SME: Ignore authentication with "
640			"unexpected peer " MACSTR,
641			MAC2STR(data->auth.peer));
642		return;
643	}
644
645	wpa_dbg(wpa_s, MSG_DEBUG, "SME: Authentication response: peer=" MACSTR
646		" auth_type=%d auth_transaction=%d status_code=%d",
647		MAC2STR(data->auth.peer), data->auth.auth_type,
648		data->auth.auth_transaction, data->auth.status_code);
649	wpa_hexdump(MSG_MSGDUMP, "SME: Authentication response IEs",
650		    data->auth.ies, data->auth.ies_len);
651
652	eloop_cancel_timeout(sme_auth_timer, wpa_s, NULL);
653
654#ifdef CONFIG_SAE
655	if (data->auth.auth_type == WLAN_AUTH_SAE) {
656		int res;
657		res = sme_sae_auth(wpa_s, data->auth.auth_transaction,
658				   data->auth.status_code, data->auth.ies,
659				   data->auth.ies_len);
660		if (res < 0) {
661			wpas_connection_failed(wpa_s, wpa_s->pending_bssid);
662			wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
663
664		}
665		if (res != 1)
666			return;
667
668		wpa_printf(MSG_DEBUG, "SME: SAE completed - setting PMK for "
669			   "4-way handshake");
670		wpa_sm_set_pmk(wpa_s->wpa, wpa_s->sme.sae.pmk, PMK_LEN);
671	}
672#endif /* CONFIG_SAE */
673
674	if (data->auth.status_code != WLAN_STATUS_SUCCESS) {
675		wpa_dbg(wpa_s, MSG_DEBUG, "SME: Authentication failed (status "
676			"code %d)", data->auth.status_code);
677
678		if (data->auth.status_code !=
679		    WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG ||
680		    wpa_s->sme.auth_alg == data->auth.auth_type ||
681		    wpa_s->current_ssid->auth_alg == WPA_AUTH_ALG_LEAP) {
682			wpas_connection_failed(wpa_s, wpa_s->pending_bssid);
683			wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
684			return;
685		}
686
687		wpas_connect_work_done(wpa_s);
688
689		switch (data->auth.auth_type) {
690		case WLAN_AUTH_OPEN:
691			wpa_s->current_ssid->auth_alg = WPA_AUTH_ALG_SHARED;
692
693			wpa_dbg(wpa_s, MSG_DEBUG, "SME: Trying SHARED auth");
694			wpa_supplicant_associate(wpa_s, wpa_s->current_bss,
695						 wpa_s->current_ssid);
696			return;
697
698		case WLAN_AUTH_SHARED_KEY:
699			wpa_s->current_ssid->auth_alg = WPA_AUTH_ALG_LEAP;
700
701			wpa_dbg(wpa_s, MSG_DEBUG, "SME: Trying LEAP auth");
702			wpa_supplicant_associate(wpa_s, wpa_s->current_bss,
703						 wpa_s->current_ssid);
704			return;
705
706		default:
707			return;
708		}
709	}
710
711#ifdef CONFIG_IEEE80211R
712	if (data->auth.auth_type == WLAN_AUTH_FT) {
713		union wpa_event_data edata;
714		os_memset(&edata, 0, sizeof(edata));
715		edata.ft_ies.ies = data->auth.ies;
716		edata.ft_ies.ies_len = data->auth.ies_len;
717		os_memcpy(edata.ft_ies.target_ap, data->auth.peer, ETH_ALEN);
718		wpa_supplicant_event(wpa_s, EVENT_FT_RESPONSE, &edata);
719	}
720#endif /* CONFIG_IEEE80211R */
721
722	sme_associate(wpa_s, ssid->mode, data->auth.peer,
723		      data->auth.auth_type);
724}
725
726
727void sme_associate(struct wpa_supplicant *wpa_s, enum wpas_mode mode,
728		   const u8 *bssid, u16 auth_type)
729{
730	struct wpa_driver_associate_params params;
731	struct ieee802_11_elems elems;
732#ifdef CONFIG_HT_OVERRIDES
733	struct ieee80211_ht_capabilities htcaps;
734	struct ieee80211_ht_capabilities htcaps_mask;
735#endif /* CONFIG_HT_OVERRIDES */
736#ifdef CONFIG_VHT_OVERRIDES
737	struct ieee80211_vht_capabilities vhtcaps;
738	struct ieee80211_vht_capabilities vhtcaps_mask;
739#endif /* CONFIG_VHT_OVERRIDES */
740
741	os_memset(&params, 0, sizeof(params));
742	params.bssid = bssid;
743	params.ssid = wpa_s->sme.ssid;
744	params.ssid_len = wpa_s->sme.ssid_len;
745	params.freq = wpa_s->sme.freq;
746	params.bg_scan_period = wpa_s->current_ssid ?
747		wpa_s->current_ssid->bg_scan_period : -1;
748	params.wpa_ie = wpa_s->sme.assoc_req_ie_len ?
749		wpa_s->sme.assoc_req_ie : NULL;
750	params.wpa_ie_len = wpa_s->sme.assoc_req_ie_len;
751	params.pairwise_suite = wpa_s->pairwise_cipher;
752	params.group_suite = wpa_s->group_cipher;
753	params.key_mgmt_suite = wpa_s->key_mgmt;
754	params.wpa_proto = wpa_s->wpa_proto;
755#ifdef CONFIG_HT_OVERRIDES
756	os_memset(&htcaps, 0, sizeof(htcaps));
757	os_memset(&htcaps_mask, 0, sizeof(htcaps_mask));
758	params.htcaps = (u8 *) &htcaps;
759	params.htcaps_mask = (u8 *) &htcaps_mask;
760	wpa_supplicant_apply_ht_overrides(wpa_s, wpa_s->current_ssid, &params);
761#endif /* CONFIG_HT_OVERRIDES */
762#ifdef CONFIG_VHT_OVERRIDES
763	os_memset(&vhtcaps, 0, sizeof(vhtcaps));
764	os_memset(&vhtcaps_mask, 0, sizeof(vhtcaps_mask));
765	params.vhtcaps = &vhtcaps;
766	params.vhtcaps_mask = &vhtcaps_mask;
767	wpa_supplicant_apply_vht_overrides(wpa_s, wpa_s->current_ssid, &params);
768#endif /* CONFIG_VHT_OVERRIDES */
769#ifdef CONFIG_IEEE80211R
770	if (auth_type == WLAN_AUTH_FT && wpa_s->sme.ft_ies) {
771		params.wpa_ie = wpa_s->sme.ft_ies;
772		params.wpa_ie_len = wpa_s->sme.ft_ies_len;
773	}
774#endif /* CONFIG_IEEE80211R */
775	params.mode = mode;
776	params.mgmt_frame_protection = wpa_s->sme.mfp;
777	if (wpa_s->sme.prev_bssid_set)
778		params.prev_bssid = wpa_s->sme.prev_bssid;
779
780	wpa_msg(wpa_s, MSG_INFO, "Trying to associate with " MACSTR
781		" (SSID='%s' freq=%d MHz)", MAC2STR(params.bssid),
782		params.ssid ? wpa_ssid_txt(params.ssid, params.ssid_len) : "",
783		params.freq);
784
785	wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING);
786
787	if (params.wpa_ie == NULL ||
788	    ieee802_11_parse_elems(params.wpa_ie, params.wpa_ie_len, &elems, 0)
789	    < 0) {
790		wpa_dbg(wpa_s, MSG_DEBUG, "SME: Could not parse own IEs?!");
791		os_memset(&elems, 0, sizeof(elems));
792	}
793	if (elems.rsn_ie) {
794		params.wpa_proto = WPA_PROTO_RSN;
795		wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, elems.rsn_ie - 2,
796					elems.rsn_ie_len + 2);
797	} else if (elems.wpa_ie) {
798		params.wpa_proto = WPA_PROTO_WPA;
799		wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, elems.wpa_ie - 2,
800					elems.wpa_ie_len + 2);
801	} else if (elems.osen) {
802		params.wpa_proto = WPA_PROTO_OSEN;
803		wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, elems.osen - 2,
804					elems.osen_len + 2);
805	} else
806		wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
807	if (wpa_s->current_ssid && wpa_s->current_ssid->p2p_group)
808		params.p2p = 1;
809
810	if (wpa_s->parent->set_sta_uapsd)
811		params.uapsd = wpa_s->parent->sta_uapsd;
812	else
813		params.uapsd = -1;
814
815	if (wpa_drv_associate(wpa_s, &params) < 0) {
816		wpa_msg(wpa_s, MSG_INFO, "SME: Association request to the "
817			"driver failed");
818		wpas_connection_failed(wpa_s, wpa_s->pending_bssid);
819		wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
820		os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
821		return;
822	}
823
824	eloop_register_timeout(SME_ASSOC_TIMEOUT, 0, sme_assoc_timer, wpa_s,
825			       NULL);
826}
827
828
829int sme_update_ft_ies(struct wpa_supplicant *wpa_s, const u8 *md,
830		      const u8 *ies, size_t ies_len)
831{
832	if (md == NULL || ies == NULL) {
833		wpa_dbg(wpa_s, MSG_DEBUG, "SME: Remove mobility domain");
834		os_free(wpa_s->sme.ft_ies);
835		wpa_s->sme.ft_ies = NULL;
836		wpa_s->sme.ft_ies_len = 0;
837		wpa_s->sme.ft_used = 0;
838		return 0;
839	}
840
841	os_memcpy(wpa_s->sme.mobility_domain, md, MOBILITY_DOMAIN_ID_LEN);
842	wpa_hexdump(MSG_DEBUG, "SME: FT IEs", ies, ies_len);
843	os_free(wpa_s->sme.ft_ies);
844	wpa_s->sme.ft_ies = os_malloc(ies_len);
845	if (wpa_s->sme.ft_ies == NULL)
846		return -1;
847	os_memcpy(wpa_s->sme.ft_ies, ies, ies_len);
848	wpa_s->sme.ft_ies_len = ies_len;
849	return 0;
850}
851
852
853static void sme_deauth(struct wpa_supplicant *wpa_s)
854{
855	int bssid_changed;
856
857	bssid_changed = !is_zero_ether_addr(wpa_s->bssid);
858
859	if (wpa_drv_deauthenticate(wpa_s, wpa_s->pending_bssid,
860				   WLAN_REASON_DEAUTH_LEAVING) < 0) {
861		wpa_msg(wpa_s, MSG_INFO, "SME: Deauth request to the driver "
862			"failed");
863	}
864	wpa_s->sme.prev_bssid_set = 0;
865
866	wpas_connection_failed(wpa_s, wpa_s->pending_bssid);
867	wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
868	os_memset(wpa_s->bssid, 0, ETH_ALEN);
869	os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
870	if (bssid_changed)
871		wpas_notify_bssid_changed(wpa_s);
872}
873
874
875void sme_event_assoc_reject(struct wpa_supplicant *wpa_s,
876			    union wpa_event_data *data)
877{
878	wpa_dbg(wpa_s, MSG_DEBUG, "SME: Association with " MACSTR " failed: "
879		"status code %d", MAC2STR(wpa_s->pending_bssid),
880		data->assoc_reject.status_code);
881
882	eloop_cancel_timeout(sme_assoc_timer, wpa_s, NULL);
883
884	/*
885	 * For now, unconditionally terminate the previous authentication. In
886	 * theory, this should not be needed, but mac80211 gets quite confused
887	 * if the authentication is left pending.. Some roaming cases might
888	 * benefit from using the previous authentication, so this could be
889	 * optimized in the future.
890	 */
891	sme_deauth(wpa_s);
892}
893
894
895void sme_event_auth_timed_out(struct wpa_supplicant *wpa_s,
896			      union wpa_event_data *data)
897{
898	wpa_dbg(wpa_s, MSG_DEBUG, "SME: Authentication timed out");
899	wpas_connection_failed(wpa_s, wpa_s->pending_bssid);
900	wpa_supplicant_mark_disassoc(wpa_s);
901}
902
903
904void sme_event_assoc_timed_out(struct wpa_supplicant *wpa_s,
905			       union wpa_event_data *data)
906{
907	wpa_dbg(wpa_s, MSG_DEBUG, "SME: Association timed out");
908	wpas_connection_failed(wpa_s, wpa_s->pending_bssid);
909	wpa_supplicant_mark_disassoc(wpa_s);
910}
911
912
913void sme_event_disassoc(struct wpa_supplicant *wpa_s,
914			struct disassoc_info *info)
915{
916	wpa_dbg(wpa_s, MSG_DEBUG, "SME: Disassociation event received");
917	if (wpa_s->sme.prev_bssid_set) {
918		/*
919		 * cfg80211/mac80211 can get into somewhat confused state if
920		 * the AP only disassociates us and leaves us in authenticated
921		 * state. For now, force the state to be cleared to avoid
922		 * confusing errors if we try to associate with the AP again.
923		 */
924		wpa_dbg(wpa_s, MSG_DEBUG, "SME: Deauthenticate to clear "
925			"driver state");
926		wpa_drv_deauthenticate(wpa_s, wpa_s->sme.prev_bssid,
927				       WLAN_REASON_DEAUTH_LEAVING);
928	}
929}
930
931
932static void sme_auth_timer(void *eloop_ctx, void *timeout_ctx)
933{
934	struct wpa_supplicant *wpa_s = eloop_ctx;
935	if (wpa_s->wpa_state == WPA_AUTHENTICATING) {
936		wpa_msg(wpa_s, MSG_DEBUG, "SME: Authentication timeout");
937		sme_deauth(wpa_s);
938	}
939}
940
941
942static void sme_assoc_timer(void *eloop_ctx, void *timeout_ctx)
943{
944	struct wpa_supplicant *wpa_s = eloop_ctx;
945	if (wpa_s->wpa_state == WPA_ASSOCIATING) {
946		wpa_msg(wpa_s, MSG_DEBUG, "SME: Association timeout");
947		sme_deauth(wpa_s);
948	}
949}
950
951
952void sme_state_changed(struct wpa_supplicant *wpa_s)
953{
954	/* Make sure timers are cleaned up appropriately. */
955	if (wpa_s->wpa_state != WPA_ASSOCIATING)
956		eloop_cancel_timeout(sme_assoc_timer, wpa_s, NULL);
957	if (wpa_s->wpa_state != WPA_AUTHENTICATING)
958		eloop_cancel_timeout(sme_auth_timer, wpa_s, NULL);
959}
960
961
962void sme_disassoc_while_authenticating(struct wpa_supplicant *wpa_s,
963				       const u8 *prev_pending_bssid)
964{
965	/*
966	 * mac80211-workaround to force deauth on failed auth cmd,
967	 * requires us to remain in authenticating state to allow the
968	 * second authentication attempt to be continued properly.
969	 */
970	wpa_dbg(wpa_s, MSG_DEBUG, "SME: Allow pending authentication "
971		"to proceed after disconnection event");
972	wpa_supplicant_set_state(wpa_s, WPA_AUTHENTICATING);
973	os_memcpy(wpa_s->pending_bssid, prev_pending_bssid, ETH_ALEN);
974
975	/*
976	 * Re-arm authentication timer in case auth fails for whatever reason.
977	 */
978	eloop_cancel_timeout(sme_auth_timer, wpa_s, NULL);
979	eloop_register_timeout(SME_AUTH_TIMEOUT, 0, sme_auth_timer, wpa_s,
980			       NULL);
981}
982
983
984void sme_deinit(struct wpa_supplicant *wpa_s)
985{
986	os_free(wpa_s->sme.ft_ies);
987	wpa_s->sme.ft_ies = NULL;
988	wpa_s->sme.ft_ies_len = 0;
989#ifdef CONFIG_IEEE80211W
990	sme_stop_sa_query(wpa_s);
991#endif /* CONFIG_IEEE80211W */
992#ifdef CONFIG_SAE
993	wpabuf_free(wpa_s->sme.sae_token);
994	wpa_s->sme.sae_token = NULL;
995	sae_clear_data(&wpa_s->sme.sae);
996#endif /* CONFIG_SAE */
997
998	eloop_cancel_timeout(sme_assoc_timer, wpa_s, NULL);
999	eloop_cancel_timeout(sme_auth_timer, wpa_s, NULL);
1000	eloop_cancel_timeout(sme_obss_scan_timeout, wpa_s, NULL);
1001}
1002
1003
1004static void sme_send_2040_bss_coex(struct wpa_supplicant *wpa_s,
1005				   const u8 *chan_list, u8 num_channels,
1006				   u8 num_intol)
1007{
1008	struct ieee80211_2040_bss_coex_ie *bc_ie;
1009	struct ieee80211_2040_intol_chan_report *ic_report;
1010	struct wpabuf *buf;
1011
1012	wpa_printf(MSG_DEBUG, "SME: Send 20/40 BSS Coexistence to " MACSTR
1013		   " (num_channels=%u num_intol=%u)",
1014		   MAC2STR(wpa_s->bssid), num_channels, num_intol);
1015	wpa_hexdump(MSG_DEBUG, "SME: 20/40 BSS Intolerant Channels",
1016		    chan_list, num_channels);
1017
1018	buf = wpabuf_alloc(2 + /* action.category + action_code */
1019			   sizeof(struct ieee80211_2040_bss_coex_ie) +
1020			   sizeof(struct ieee80211_2040_intol_chan_report) +
1021			   num_channels);
1022	if (buf == NULL)
1023		return;
1024
1025	wpabuf_put_u8(buf, WLAN_ACTION_PUBLIC);
1026	wpabuf_put_u8(buf, WLAN_PA_20_40_BSS_COEX);
1027
1028	bc_ie = wpabuf_put(buf, sizeof(*bc_ie));
1029	bc_ie->element_id = WLAN_EID_20_40_BSS_COEXISTENCE;
1030	bc_ie->length = 1;
1031	if (num_intol)
1032		bc_ie->coex_param |= WLAN_20_40_BSS_COEX_20MHZ_WIDTH_REQ;
1033
1034	if (num_channels > 0) {
1035		ic_report = wpabuf_put(buf, sizeof(*ic_report));
1036		ic_report->element_id = WLAN_EID_20_40_BSS_INTOLERANT;
1037		ic_report->length = num_channels + 1;
1038		ic_report->op_class = 0;
1039		os_memcpy(wpabuf_put(buf, num_channels), chan_list,
1040			  num_channels);
1041	}
1042
1043	if (wpa_drv_send_action(wpa_s, wpa_s->assoc_freq, 0, wpa_s->bssid,
1044				wpa_s->own_addr, wpa_s->bssid,
1045				wpabuf_head(buf), wpabuf_len(buf), 0) < 0) {
1046		wpa_msg(wpa_s, MSG_INFO,
1047			"SME: Failed to send 20/40 BSS Coexistence frame");
1048	}
1049
1050	wpabuf_free(buf);
1051}
1052
1053
1054int sme_proc_obss_scan(struct wpa_supplicant *wpa_s)
1055{
1056	struct wpa_bss *bss;
1057	const u8 *ie;
1058	u16 ht_cap;
1059	u8 chan_list[P2P_MAX_CHANNELS], channel;
1060	u8 num_channels = 0, num_intol = 0, i;
1061
1062	if (!wpa_s->sme.sched_obss_scan)
1063		return 0;
1064
1065	wpa_s->sme.sched_obss_scan = 0;
1066	if (!wpa_s->current_bss || wpa_s->wpa_state != WPA_COMPLETED)
1067		return 1;
1068
1069	/*
1070	 * Check whether AP uses regulatory triplet or channel triplet in
1071	 * country info. Right now the operating class of the BSS channel
1072	 * width trigger event is "unknown" (IEEE Std 802.11-2012 10.15.12),
1073	 * based on the assumption that operating class triplet is not used in
1074	 * beacon frame. If the First Channel Number/Operating Extension
1075	 * Identifier octet has a positive integer value of 201 or greater,
1076	 * then its operating class triplet.
1077	 *
1078	 * TODO: If Supported Operating Classes element is present in beacon
1079	 * frame, have to lookup operating class in Annex E and fill them in
1080	 * 2040 coex frame.
1081	 */
1082	ie = wpa_bss_get_ie(wpa_s->current_bss, WLAN_EID_COUNTRY);
1083	if (ie && (ie[1] >= 6) && (ie[5] >= 201))
1084		return 1;
1085
1086	os_memset(chan_list, 0, sizeof(chan_list));
1087
1088	dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
1089		/* Skip other band bss */
1090		enum hostapd_hw_mode mode;
1091		mode = ieee80211_freq_to_chan(bss->freq, &channel);
1092		if (mode != HOSTAPD_MODE_IEEE80211G &&
1093		    mode != HOSTAPD_MODE_IEEE80211B)
1094			continue;
1095
1096		ie = wpa_bss_get_ie(bss, WLAN_EID_HT_CAP);
1097		ht_cap = (ie && (ie[1] == 26)) ? WPA_GET_LE16(ie + 2) : 0;
1098		wpa_printf(MSG_DEBUG, "SME OBSS scan BSS " MACSTR
1099			   " freq=%u chan=%u ht_cap=0x%x",
1100			   MAC2STR(bss->bssid), bss->freq, channel, ht_cap);
1101
1102		if (!ht_cap || (ht_cap & HT_CAP_INFO_40MHZ_INTOLERANT)) {
1103			if (ht_cap & HT_CAP_INFO_40MHZ_INTOLERANT)
1104				num_intol++;
1105
1106			/* Check whether the channel is already considered */
1107			for (i = 0; i < num_channels; i++) {
1108				if (channel == chan_list[i])
1109					break;
1110			}
1111			if (i != num_channels)
1112				continue;
1113
1114			chan_list[num_channels++] = channel;
1115		}
1116	}
1117
1118	sme_send_2040_bss_coex(wpa_s, chan_list, num_channels, num_intol);
1119	return 1;
1120}
1121
1122
1123static struct hostapd_hw_modes * get_mode(struct hostapd_hw_modes *modes,
1124					  u16 num_modes,
1125					  enum hostapd_hw_mode mode)
1126{
1127	u16 i;
1128
1129	for (i = 0; i < num_modes; i++) {
1130		if (modes[i].mode == mode)
1131			return &modes[i];
1132	}
1133
1134	return NULL;
1135}
1136
1137
1138static void wpa_setband_scan_freqs_list(struct wpa_supplicant *wpa_s,
1139					enum hostapd_hw_mode band,
1140					struct wpa_driver_scan_params *params)
1141{
1142	/* Include only supported channels for the specified band */
1143	struct hostapd_hw_modes *mode;
1144	int count, i;
1145
1146	mode = get_mode(wpa_s->hw.modes, wpa_s->hw.num_modes, band);
1147	if (mode == NULL) {
1148		/* No channels supported in this band - use empty list */
1149		params->freqs = os_zalloc(sizeof(int));
1150		return;
1151	}
1152
1153	params->freqs = os_calloc(mode->num_channels + 1, sizeof(int));
1154	if (params->freqs == NULL)
1155		return;
1156	for (count = 0, i = 0; i < mode->num_channels; i++) {
1157		if (mode->channels[i].flag & HOSTAPD_CHAN_DISABLED)
1158			continue;
1159		params->freqs[count++] = mode->channels[i].freq;
1160	}
1161}
1162
1163
1164static void sme_obss_scan_timeout(void *eloop_ctx, void *timeout_ctx)
1165{
1166	struct wpa_supplicant *wpa_s = eloop_ctx;
1167	struct wpa_driver_scan_params params;
1168
1169	if (!wpa_s->current_bss) {
1170		wpa_printf(MSG_DEBUG, "SME OBSS: Ignore scan request");
1171		return;
1172	}
1173
1174	os_memset(&params, 0, sizeof(params));
1175	wpa_setband_scan_freqs_list(wpa_s, HOSTAPD_MODE_IEEE80211G, &params);
1176	params.low_priority = 1;
1177	wpa_printf(MSG_DEBUG, "SME OBSS: Request an OBSS scan");
1178
1179	if (wpa_supplicant_trigger_scan(wpa_s, &params))
1180		wpa_printf(MSG_DEBUG, "SME OBSS: Failed to trigger scan");
1181	else
1182		wpa_s->sme.sched_obss_scan = 1;
1183	os_free(params.freqs);
1184
1185	eloop_register_timeout(wpa_s->sme.obss_scan_int, 0,
1186			       sme_obss_scan_timeout, wpa_s, NULL);
1187}
1188
1189
1190void sme_sched_obss_scan(struct wpa_supplicant *wpa_s, int enable)
1191{
1192	const u8 *ie;
1193	struct wpa_bss *bss = wpa_s->current_bss;
1194	struct wpa_ssid *ssid = wpa_s->current_ssid;
1195	struct hostapd_hw_modes *hw_mode = NULL;
1196	int i;
1197
1198	eloop_cancel_timeout(sme_obss_scan_timeout, wpa_s, NULL);
1199	wpa_s->sme.sched_obss_scan = 0;
1200	if (!enable)
1201		return;
1202
1203	/*
1204	 * Schedule OBSS scan if driver is using station SME in wpa_supplicant
1205	 * or it expects OBSS scan to be performed by wpa_supplicant.
1206	 */
1207	if (!((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) ||
1208	      (wpa_s->drv_flags & WPA_DRIVER_FLAGS_OBSS_SCAN)) ||
1209	    ssid == NULL || ssid->mode != IEEE80211_MODE_INFRA)
1210		return;
1211
1212	if (!wpa_s->hw.modes)
1213		return;
1214
1215	/* only HT caps in 11g mode are relevant */
1216	for (i = 0; i < wpa_s->hw.num_modes; i++) {
1217		hw_mode = &wpa_s->hw.modes[i];
1218		if (hw_mode->mode == HOSTAPD_MODE_IEEE80211G)
1219			break;
1220	}
1221
1222	/* Driver does not support HT40 for 11g or doesn't have 11g. */
1223	if (i == wpa_s->hw.num_modes || !hw_mode ||
1224	    !(hw_mode->ht_capab & HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET))
1225		return;
1226
1227	if (bss == NULL || bss->freq < 2400 || bss->freq > 2500)
1228		return; /* Not associated on 2.4 GHz band */
1229
1230	/* Check whether AP supports HT40 */
1231	ie = wpa_bss_get_ie(wpa_s->current_bss, WLAN_EID_HT_CAP);
1232	if (!ie || ie[1] < 2 ||
1233	    !(WPA_GET_LE16(ie + 2) & HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET))
1234		return; /* AP does not support HT40 */
1235
1236	ie = wpa_bss_get_ie(wpa_s->current_bss,
1237			    WLAN_EID_OVERLAPPING_BSS_SCAN_PARAMS);
1238	if (!ie || ie[1] < 14)
1239		return; /* AP does not request OBSS scans */
1240
1241	wpa_s->sme.obss_scan_int = WPA_GET_LE16(ie + 6);
1242	if (wpa_s->sme.obss_scan_int < 10) {
1243		wpa_printf(MSG_DEBUG, "SME: Invalid OBSS Scan Interval %u "
1244			   "replaced with the minimum 10 sec",
1245			   wpa_s->sme.obss_scan_int);
1246		wpa_s->sme.obss_scan_int = 10;
1247	}
1248	wpa_printf(MSG_DEBUG, "SME: OBSS Scan Interval %u sec",
1249		   wpa_s->sme.obss_scan_int);
1250	eloop_register_timeout(wpa_s->sme.obss_scan_int, 0,
1251			       sme_obss_scan_timeout, wpa_s, NULL);
1252}
1253
1254
1255#ifdef CONFIG_IEEE80211W
1256
1257static const unsigned int sa_query_max_timeout = 1000;
1258static const unsigned int sa_query_retry_timeout = 201;
1259
1260static int sme_check_sa_query_timeout(struct wpa_supplicant *wpa_s)
1261{
1262	u32 tu;
1263	struct os_reltime now, passed;
1264	os_get_reltime(&now);
1265	os_reltime_sub(&now, &wpa_s->sme.sa_query_start, &passed);
1266	tu = (passed.sec * 1000000 + passed.usec) / 1024;
1267	if (sa_query_max_timeout < tu) {
1268		wpa_dbg(wpa_s, MSG_DEBUG, "SME: SA Query timed out");
1269		sme_stop_sa_query(wpa_s);
1270		wpa_supplicant_deauthenticate(
1271			wpa_s, WLAN_REASON_PREV_AUTH_NOT_VALID);
1272		return 1;
1273	}
1274
1275	return 0;
1276}
1277
1278
1279static void sme_send_sa_query_req(struct wpa_supplicant *wpa_s,
1280				  const u8 *trans_id)
1281{
1282	u8 req[2 + WLAN_SA_QUERY_TR_ID_LEN];
1283	wpa_dbg(wpa_s, MSG_DEBUG, "SME: Sending SA Query Request to "
1284		MACSTR, MAC2STR(wpa_s->bssid));
1285	wpa_hexdump(MSG_DEBUG, "SME: SA Query Transaction ID",
1286		    trans_id, WLAN_SA_QUERY_TR_ID_LEN);
1287	req[0] = WLAN_ACTION_SA_QUERY;
1288	req[1] = WLAN_SA_QUERY_REQUEST;
1289	os_memcpy(req + 2, trans_id, WLAN_SA_QUERY_TR_ID_LEN);
1290	if (wpa_drv_send_action(wpa_s, wpa_s->assoc_freq, 0, wpa_s->bssid,
1291				wpa_s->own_addr, wpa_s->bssid,
1292				req, sizeof(req), 0) < 0)
1293		wpa_msg(wpa_s, MSG_INFO, "SME: Failed to send SA Query "
1294			"Request");
1295}
1296
1297
1298static void sme_sa_query_timer(void *eloop_ctx, void *timeout_ctx)
1299{
1300	struct wpa_supplicant *wpa_s = eloop_ctx;
1301	unsigned int timeout, sec, usec;
1302	u8 *trans_id, *nbuf;
1303
1304	if (wpa_s->sme.sa_query_count > 0 &&
1305	    sme_check_sa_query_timeout(wpa_s))
1306		return;
1307
1308	nbuf = os_realloc_array(wpa_s->sme.sa_query_trans_id,
1309				wpa_s->sme.sa_query_count + 1,
1310				WLAN_SA_QUERY_TR_ID_LEN);
1311	if (nbuf == NULL)
1312		return;
1313	if (wpa_s->sme.sa_query_count == 0) {
1314		/* Starting a new SA Query procedure */
1315		os_get_reltime(&wpa_s->sme.sa_query_start);
1316	}
1317	trans_id = nbuf + wpa_s->sme.sa_query_count * WLAN_SA_QUERY_TR_ID_LEN;
1318	wpa_s->sme.sa_query_trans_id = nbuf;
1319	wpa_s->sme.sa_query_count++;
1320
1321	os_get_random(trans_id, WLAN_SA_QUERY_TR_ID_LEN);
1322
1323	timeout = sa_query_retry_timeout;
1324	sec = ((timeout / 1000) * 1024) / 1000;
1325	usec = (timeout % 1000) * 1024;
1326	eloop_register_timeout(sec, usec, sme_sa_query_timer, wpa_s, NULL);
1327
1328	wpa_dbg(wpa_s, MSG_DEBUG, "SME: Association SA Query attempt %d",
1329		wpa_s->sme.sa_query_count);
1330
1331	sme_send_sa_query_req(wpa_s, trans_id);
1332}
1333
1334
1335static void sme_start_sa_query(struct wpa_supplicant *wpa_s)
1336{
1337	sme_sa_query_timer(wpa_s, NULL);
1338}
1339
1340
1341static void sme_stop_sa_query(struct wpa_supplicant *wpa_s)
1342{
1343	eloop_cancel_timeout(sme_sa_query_timer, wpa_s, NULL);
1344	os_free(wpa_s->sme.sa_query_trans_id);
1345	wpa_s->sme.sa_query_trans_id = NULL;
1346	wpa_s->sme.sa_query_count = 0;
1347}
1348
1349
1350void sme_event_unprot_disconnect(struct wpa_supplicant *wpa_s, const u8 *sa,
1351				 const u8 *da, u16 reason_code)
1352{
1353	struct wpa_ssid *ssid;
1354	struct os_reltime now;
1355
1356	if (wpa_s->wpa_state != WPA_COMPLETED)
1357		return;
1358	ssid = wpa_s->current_ssid;
1359	if (ssid == NULL ||
1360	    (ssid->ieee80211w == MGMT_FRAME_PROTECTION_DEFAULT ?
1361	     wpa_s->conf->pmf : ssid->ieee80211w) == NO_MGMT_FRAME_PROTECTION)
1362		return;
1363	if (os_memcmp(sa, wpa_s->bssid, ETH_ALEN) != 0)
1364		return;
1365	if (reason_code != WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA &&
1366	    reason_code != WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA)
1367		return;
1368	if (wpa_s->sme.sa_query_count > 0)
1369		return;
1370
1371	os_get_reltime(&now);
1372	if (wpa_s->sme.last_unprot_disconnect.sec &&
1373	    !os_reltime_expired(&now, &wpa_s->sme.last_unprot_disconnect, 10))
1374		return; /* limit SA Query procedure frequency */
1375	wpa_s->sme.last_unprot_disconnect = now;
1376
1377	wpa_dbg(wpa_s, MSG_DEBUG, "SME: Unprotected disconnect dropped - "
1378		"possible AP/STA state mismatch - trigger SA Query");
1379	sme_start_sa_query(wpa_s);
1380}
1381
1382
1383void sme_sa_query_rx(struct wpa_supplicant *wpa_s, const u8 *sa,
1384		     const u8 *data, size_t len)
1385{
1386	int i;
1387
1388	if (wpa_s->sme.sa_query_trans_id == NULL ||
1389	    len < 1 + WLAN_SA_QUERY_TR_ID_LEN ||
1390	    data[0] != WLAN_SA_QUERY_RESPONSE)
1391		return;
1392	wpa_dbg(wpa_s, MSG_DEBUG, "SME: Received SA Query response from "
1393		MACSTR " (trans_id %02x%02x)", MAC2STR(sa), data[1], data[2]);
1394
1395	if (os_memcmp(sa, wpa_s->bssid, ETH_ALEN) != 0)
1396		return;
1397
1398	for (i = 0; i < wpa_s->sme.sa_query_count; i++) {
1399		if (os_memcmp(wpa_s->sme.sa_query_trans_id +
1400			      i * WLAN_SA_QUERY_TR_ID_LEN,
1401			      data + 1, WLAN_SA_QUERY_TR_ID_LEN) == 0)
1402			break;
1403	}
1404
1405	if (i >= wpa_s->sme.sa_query_count) {
1406		wpa_dbg(wpa_s, MSG_DEBUG, "SME: No matching SA Query "
1407			"transaction identifier found");
1408		return;
1409	}
1410
1411	wpa_dbg(wpa_s, MSG_DEBUG, "SME: Reply to pending SA Query received "
1412		"from " MACSTR, MAC2STR(sa));
1413	sme_stop_sa_query(wpa_s);
1414}
1415
1416#endif /* CONFIG_IEEE80211W */
1417