1  /*
2   * WPA Supplicant - Driver event processing
3   * Copyright (c) 2003-2019, 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/crc32.h"
13  #include "eapol_supp/eapol_supp_sm.h"
14  #include "rsn_supp/wpa.h"
15  #include "eloop.h"
16  #include "config.h"
17  #include "l2_packet/l2_packet.h"
18  #include "wpa_supplicant_i.h"
19  #include "driver_i.h"
20  #include "pcsc_funcs.h"
21  #include "rsn_supp/preauth.h"
22  #include "rsn_supp/pmksa_cache.h"
23  #include "common/wpa_ctrl.h"
24  #include "eap_peer/eap.h"
25  #include "ap/hostapd.h"
26  #include "ap/sta_info.h"
27  #include "p2p/p2p.h"
28  #include "fst/fst.h"
29  #include "wnm_sta.h"
30  #include "notify.h"
31  #include "common/ieee802_11_defs.h"
32  #include "common/ieee802_11_common.h"
33  #include "common/gas_server.h"
34  #include "common/dpp.h"
35  #include "common/ptksa_cache.h"
36  #include "crypto/random.h"
37  #include "bssid_ignore.h"
38  #include "wpas_glue.h"
39  #include "wps_supplicant.h"
40  #include "ibss_rsn.h"
41  #include "sme.h"
42  #include "gas_query.h"
43  #include "p2p_supplicant.h"
44  #include "bgscan.h"
45  #include "autoscan.h"
46  #include "ap.h"
47  #include "bss.h"
48  #include "scan.h"
49  #include "offchannel.h"
50  #include "interworking.h"
51  #include "mesh.h"
52  #include "mesh_mpm.h"
53  #include "wmm_ac.h"
54  #include "nan_usd.h"
55  #include "dpp_supplicant.h"
56  
57  
58  #define MAX_OWE_TRANSITION_BSS_SELECT_COUNT 5
59  
60  
61  #ifndef CONFIG_NO_SCAN_PROCESSING
62  static int wpas_select_network_from_last_scan(struct wpa_supplicant *wpa_s,
63  					      int new_scan, int own_request,
64  					      bool trigger_6ghz_scan,
65  					      union wpa_event_data *data);
66  #endif /* CONFIG_NO_SCAN_PROCESSING */
67  
68  
wpas_temp_disabled(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)69  int wpas_temp_disabled(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
70  {
71  	struct os_reltime now;
72  
73  	if (ssid == NULL || ssid->disabled_until.sec == 0)
74  		return 0;
75  
76  	os_get_reltime(&now);
77  	if (ssid->disabled_until.sec > now.sec)
78  		return ssid->disabled_until.sec - now.sec;
79  
80  	wpas_clear_temp_disabled(wpa_s, ssid, 0);
81  
82  	return 0;
83  }
84  
85  
86  #ifndef CONFIG_NO_SCAN_PROCESSING
87  /**
88   * wpas_reenabled_network_time - Time until first network is re-enabled
89   * @wpa_s: Pointer to wpa_supplicant data
90   * Returns: If all enabled networks are temporarily disabled, returns the time
91   *	(in sec) until the first network is re-enabled. Otherwise returns 0.
92   *
93   * This function is used in case all enabled networks are temporarily disabled,
94   * in which case it returns the time (in sec) that the first network will be
95   * re-enabled. The function assumes that at least one network is enabled.
96   */
wpas_reenabled_network_time(struct wpa_supplicant * wpa_s)97  static int wpas_reenabled_network_time(struct wpa_supplicant *wpa_s)
98  {
99  	struct wpa_ssid *ssid;
100  	int disabled_for, res = 0;
101  
102  #ifdef CONFIG_INTERWORKING
103  	if (wpa_s->conf->auto_interworking && wpa_s->conf->interworking &&
104  	    wpa_s->conf->cred)
105  		return 0;
106  #endif /* CONFIG_INTERWORKING */
107  
108  	for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) {
109  		if (ssid->disabled)
110  			continue;
111  
112  		disabled_for = wpas_temp_disabled(wpa_s, ssid);
113  		if (!disabled_for)
114  			return 0;
115  
116  		if (!res || disabled_for < res)
117  			res = disabled_for;
118  	}
119  
120  	return res;
121  }
122  #endif /* CONFIG_NO_SCAN_PROCESSING */
123  
124  
wpas_network_reenabled(void * eloop_ctx,void * timeout_ctx)125  void wpas_network_reenabled(void *eloop_ctx, void *timeout_ctx)
126  {
127  	struct wpa_supplicant *wpa_s = eloop_ctx;
128  
129  	if (wpa_s->disconnected || wpa_s->wpa_state != WPA_SCANNING)
130  		return;
131  
132  	wpa_dbg(wpa_s, MSG_DEBUG,
133  		"Try to associate due to network getting re-enabled");
134  	if (wpa_supplicant_fast_associate(wpa_s) != 1) {
135  		wpa_supplicant_cancel_sched_scan(wpa_s);
136  		wpa_supplicant_req_scan(wpa_s, 0, 0);
137  	}
138  }
139  
140  
__wpa_supplicant_get_new_bss(struct wpa_supplicant * wpa_s,const u8 * bssid,const u8 * ssid,size_t ssid_len)141  static struct wpa_bss * __wpa_supplicant_get_new_bss(
142  	struct wpa_supplicant *wpa_s, const u8 *bssid, const u8 *ssid,
143  	size_t ssid_len)
144  {
145  	if (ssid && ssid_len > 0)
146  		return wpa_bss_get(wpa_s, bssid, ssid, ssid_len);
147  	else
148  		return wpa_bss_get_bssid(wpa_s, bssid);
149  }
150  
151  
_wpa_supplicant_get_new_bss(struct wpa_supplicant * wpa_s,const u8 * bssid,const u8 * ssid,size_t ssid_len,bool try_update_scan_results)152  static struct wpa_bss * _wpa_supplicant_get_new_bss(
153  	struct wpa_supplicant *wpa_s, const u8 *bssid, const u8 *ssid,
154  	size_t ssid_len, bool try_update_scan_results)
155  {
156  	struct wpa_bss *bss = __wpa_supplicant_get_new_bss(wpa_s, bssid, ssid,
157  							   ssid_len);
158  
159  	if (bss || !try_update_scan_results)
160  		return bss;
161  
162  	wpa_supplicant_update_scan_results(wpa_s, bssid);
163  
164  	return __wpa_supplicant_get_new_bss(wpa_s, bssid, ssid, ssid_len);
165  }
166  
167  
wpa_supplicant_get_new_bss(struct wpa_supplicant * wpa_s,const u8 * bssid)168  static struct wpa_bss * wpa_supplicant_get_new_bss(
169  	struct wpa_supplicant *wpa_s, const u8 *bssid)
170  {
171  	struct wpa_bss *bss = NULL;
172  	struct wpa_ssid *ssid = wpa_s->current_ssid;
173  	u8 drv_ssid[SSID_MAX_LEN];
174  	int res;
175  	bool try_update_scan_results = true;
176  
177  	res = wpa_drv_get_ssid(wpa_s, drv_ssid);
178  	if (res > 0) {
179  		bss = _wpa_supplicant_get_new_bss(wpa_s, bssid, drv_ssid, res,
180  						  try_update_scan_results);
181  		try_update_scan_results = false;
182  	}
183  	if (!bss && ssid && ssid->ssid_len > 0) {
184  		bss = _wpa_supplicant_get_new_bss(wpa_s, bssid, ssid->ssid,
185  						  ssid->ssid_len,
186  						  try_update_scan_results);
187  		try_update_scan_results = false;
188  	}
189  	if (!bss)
190  		bss = _wpa_supplicant_get_new_bss(wpa_s, bssid, NULL, 0,
191  						  try_update_scan_results);
192  
193  	return bss;
194  }
195  
196  
197  static struct wpa_bss *
wpa_supplicant_update_current_bss(struct wpa_supplicant * wpa_s,const u8 * bssid)198  wpa_supplicant_update_current_bss(struct wpa_supplicant *wpa_s, const u8 *bssid)
199  {
200  	struct wpa_bss *bss = wpa_supplicant_get_new_bss(wpa_s, bssid);
201  
202  	if (bss)
203  		wpa_s->current_bss = bss;
204  
205  	return bss;
206  }
207  
208  
wpa_supplicant_update_link_bss(struct wpa_supplicant * wpa_s,u8 link_id,const u8 * bssid)209  static void wpa_supplicant_update_link_bss(struct wpa_supplicant *wpa_s,
210  					   u8 link_id, const u8 *bssid)
211  {
212  	struct wpa_bss *bss = wpa_supplicant_get_new_bss(wpa_s, bssid);
213  
214  	if (bss)
215  		wpa_s->links[link_id].bss = bss;
216  }
217  
218  
wpa_supplicant_select_config(struct wpa_supplicant * wpa_s,union wpa_event_data * data)219  static int wpa_supplicant_select_config(struct wpa_supplicant *wpa_s,
220  					union wpa_event_data *data)
221  {
222  	struct wpa_ssid *ssid, *old_ssid;
223  	struct wpa_bss *bss;
224  	u8 drv_ssid[SSID_MAX_LEN];
225  	size_t drv_ssid_len;
226  	int res;
227  
228  	if (wpa_s->conf->ap_scan == 1 && wpa_s->current_ssid) {
229  		wpa_supplicant_update_current_bss(wpa_s, wpa_s->bssid);
230  
231  		if (wpa_s->current_ssid->ssid_len == 0)
232  			return 0; /* current profile still in use */
233  		res = wpa_drv_get_ssid(wpa_s, drv_ssid);
234  		if (res < 0) {
235  			wpa_msg(wpa_s, MSG_INFO,
236  				"Failed to read SSID from driver");
237  			return 0; /* try to use current profile */
238  		}
239  		drv_ssid_len = res;
240  
241  		if (drv_ssid_len == wpa_s->current_ssid->ssid_len &&
242  		    os_memcmp(drv_ssid, wpa_s->current_ssid->ssid,
243  			      drv_ssid_len) == 0)
244  			return 0; /* current profile still in use */
245  
246  #ifdef CONFIG_OWE
247  		if ((wpa_s->current_ssid->key_mgmt & WPA_KEY_MGMT_OWE) &&
248  		    wpa_s->current_bss &&
249  		    (wpa_s->current_bss->flags & WPA_BSS_OWE_TRANSITION) &&
250  		    drv_ssid_len == wpa_s->current_bss->ssid_len &&
251  		    os_memcmp(drv_ssid, wpa_s->current_bss->ssid,
252  			      drv_ssid_len) == 0)
253  			return 0; /* current profile still in use */
254  #endif /* CONFIG_OWE */
255  
256  		wpa_msg(wpa_s, MSG_DEBUG,
257  			"Driver-initiated BSS selection changed the SSID to %s",
258  			wpa_ssid_txt(drv_ssid, drv_ssid_len));
259  		/* continue selecting a new network profile */
260  	}
261  
262  	wpa_dbg(wpa_s, MSG_DEBUG, "Select network based on association "
263  		"information");
264  	ssid = wpa_supplicant_get_ssid(wpa_s);
265  	if (ssid == NULL) {
266  		wpa_msg(wpa_s, MSG_INFO,
267  			"No network configuration found for the current AP");
268  		return -1;
269  	}
270  
271  	if (wpas_network_disabled(wpa_s, ssid)) {
272  		wpa_dbg(wpa_s, MSG_DEBUG, "Selected network is disabled");
273  		return -1;
274  	}
275  
276  	if (disallowed_bssid(wpa_s, wpa_s->bssid) ||
277  	    disallowed_ssid(wpa_s, ssid->ssid, ssid->ssid_len)) {
278  		wpa_dbg(wpa_s, MSG_DEBUG, "Selected BSS is disallowed");
279  		return -1;
280  	}
281  
282  	res = wpas_temp_disabled(wpa_s, ssid);
283  	if (res > 0) {
284  		wpa_dbg(wpa_s, MSG_DEBUG, "Selected network is temporarily "
285  			"disabled for %d second(s)", res);
286  		return -1;
287  	}
288  
289  	wpa_dbg(wpa_s, MSG_DEBUG, "Network configuration found for the "
290  		"current AP");
291  	bss = wpa_supplicant_update_current_bss(wpa_s, wpa_s->bssid);
292  	if (wpa_key_mgmt_wpa_any(ssid->key_mgmt)) {
293  		u8 wpa_ie[80];
294  		size_t wpa_ie_len = sizeof(wpa_ie);
295  		bool skip_default_rsne;
296  
297  		/* Do not override RSNE/RSNXE with the default values if the
298  		 * driver indicated the actual values used in the
299  		 * (Re)Association Request frame. */
300  		skip_default_rsne = data && data->assoc_info.req_ies;
301  		if (wpa_supplicant_set_suites(wpa_s, bss, ssid,
302  					      wpa_ie, &wpa_ie_len,
303  					      skip_default_rsne) < 0)
304  			wpa_dbg(wpa_s, MSG_DEBUG, "Could not set WPA suites");
305  	} else {
306  		wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
307  	}
308  
309  	if (wpa_s->current_ssid && wpa_s->current_ssid != ssid)
310  		eapol_sm_invalidate_cached_session(wpa_s->eapol);
311  	old_ssid = wpa_s->current_ssid;
312  	wpa_s->current_ssid = ssid;
313  
314  	wpa_supplicant_rsn_supp_set_config(wpa_s, wpa_s->current_ssid);
315  	wpa_supplicant_initiate_eapol(wpa_s);
316  	if (old_ssid != wpa_s->current_ssid)
317  		wpas_notify_network_changed(wpa_s);
318  
319  	return 0;
320  }
321  
322  
wpa_supplicant_stop_countermeasures(void * eloop_ctx,void * sock_ctx)323  void wpa_supplicant_stop_countermeasures(void *eloop_ctx, void *sock_ctx)
324  {
325  	struct wpa_supplicant *wpa_s = eloop_ctx;
326  
327  	if (wpa_s->countermeasures) {
328  		wpa_s->countermeasures = 0;
329  		wpa_drv_set_countermeasures(wpa_s, 0);
330  		wpa_msg(wpa_s, MSG_INFO, "WPA: TKIP countermeasures stopped");
331  
332  		/*
333  		 * It is possible that the device is sched scanning, which means
334  		 * that a connection attempt will be done only when we receive
335  		 * scan results. However, in this case, it would be preferable
336  		 * to scan and connect immediately, so cancel the sched_scan and
337  		 * issue a regular scan flow.
338  		 */
339  		wpa_supplicant_cancel_sched_scan(wpa_s);
340  		wpa_supplicant_req_scan(wpa_s, 0, 0);
341  	}
342  }
343  
344  
wpas_reset_mlo_info(struct wpa_supplicant * wpa_s)345  void wpas_reset_mlo_info(struct wpa_supplicant *wpa_s)
346  {
347  	if (!wpa_s->valid_links)
348  		return;
349  
350  	wpa_s->valid_links = 0;
351  	wpa_s->mlo_assoc_link_id = 0;
352  	os_memset(wpa_s->ap_mld_addr, 0, ETH_ALEN);
353  	os_memset(wpa_s->links, 0, sizeof(wpa_s->links));
354  }
355  
356  
wpa_supplicant_mark_disassoc(struct wpa_supplicant * wpa_s)357  void wpa_supplicant_mark_disassoc(struct wpa_supplicant *wpa_s)
358  {
359  	int bssid_changed;
360  
361  	wnm_bss_keep_alive_deinit(wpa_s);
362  
363  #ifdef CONFIG_IBSS_RSN
364  	ibss_rsn_deinit(wpa_s->ibss_rsn);
365  	wpa_s->ibss_rsn = NULL;
366  #endif /* CONFIG_IBSS_RSN */
367  
368  #ifdef CONFIG_AP
369  	wpa_supplicant_ap_deinit(wpa_s);
370  #endif /* CONFIG_AP */
371  
372  #ifdef CONFIG_HS20
373  	/* Clear possibly configured frame filters */
374  	wpa_drv_configure_frame_filters(wpa_s, 0);
375  #endif /* CONFIG_HS20 */
376  
377  	if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED)
378  		return;
379  
380  	if (os_reltime_initialized(&wpa_s->session_start)) {
381  		os_reltime_age(&wpa_s->session_start, &wpa_s->session_length);
382  		wpa_s->session_start.sec = 0;
383  		wpa_s->session_start.usec = 0;
384  		wpas_notify_session_length(wpa_s);
385  	}
386  
387  	wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
388  	bssid_changed = !is_zero_ether_addr(wpa_s->bssid);
389  	os_memset(wpa_s->bssid, 0, ETH_ALEN);
390  	os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
391  	sme_clear_on_disassoc(wpa_s);
392  	wpa_s->current_bss = NULL;
393  	wpa_s->assoc_freq = 0;
394  
395  	if (bssid_changed)
396  		wpas_notify_bssid_changed(wpa_s);
397  
398  	eapol_sm_notify_portEnabled(wpa_s->eapol, false);
399  	eapol_sm_notify_portValid(wpa_s->eapol, false);
400  	if (wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) ||
401  	    wpa_s->key_mgmt == WPA_KEY_MGMT_OWE ||
402  	    wpa_s->key_mgmt == WPA_KEY_MGMT_DPP || wpa_s->drv_authorized_port)
403  		eapol_sm_notify_eap_success(wpa_s->eapol, false);
404  	wpa_s->drv_authorized_port = 0;
405  	wpa_s->ap_ies_from_associnfo = 0;
406  	wpa_s->current_ssid = NULL;
407  	eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
408  	wpa_s->key_mgmt = 0;
409  	wpa_s->allowed_key_mgmts = 0;
410  
411  #ifndef CONFIG_NO_RRM
412  	wpas_rrm_reset(wpa_s);
413  #endif /* CONFIG_NO_RRM */
414  	wpa_s->wnmsleep_used = 0;
415  #ifdef CONFIG_WNM
416  	wpa_s->wnm_mode = 0;
417  #endif /* CONFIG_WNM */
418  	wnm_clear_coloc_intf_reporting(wpa_s);
419  	wpa_s->disable_mbo_oce = 0;
420  
421  #ifdef CONFIG_TESTING_OPTIONS
422  	wpa_s->last_tk_alg = WPA_ALG_NONE;
423  	os_memset(wpa_s->last_tk, 0, sizeof(wpa_s->last_tk));
424  #endif /* CONFIG_TESTING_OPTIONS */
425  	wpa_s->ieee80211ac = 0;
426  
427  	if (wpa_s->enabled_4addr_mode && wpa_drv_set_4addr_mode(wpa_s, 0) == 0)
428  		wpa_s->enabled_4addr_mode = 0;
429  
430  	wpa_s->wps_scan_done = false;
431  	wpas_reset_mlo_info(wpa_s);
432  
433  #ifdef CONFIG_SME
434  	wpa_s->sme.bss_max_idle_period = 0;
435  #endif /* CONFIG_SME */
436  
437  	wpa_s->ssid_verified = false;
438  	wpa_s->bigtk_set = false;
439  
440  	wpabuf_free(wpa_s->pending_eapol_rx);
441  	wpa_s->pending_eapol_rx = NULL;
442  }
443  
444  
wpa_find_assoc_pmkid(struct wpa_supplicant * wpa_s)445  static void wpa_find_assoc_pmkid(struct wpa_supplicant *wpa_s)
446  {
447  	struct wpa_ie_data ie;
448  	int pmksa_set = -1;
449  	size_t i;
450  	struct rsn_pmksa_cache_entry *cur_pmksa;
451  
452  	/* Start with assumption of no PMKSA cache entry match for cases other
453  	 * than SAE. In particular, this is needed to generate the PMKSA cache
454  	 * entries for Suite B cases with driver-based roaming indication. */
455  	cur_pmksa = pmksa_cache_get_current(wpa_s->wpa);
456  	if (cur_pmksa && !wpa_key_mgmt_sae(cur_pmksa->akmp))
457  		pmksa_cache_clear_current(wpa_s->wpa);
458  
459  	if (wpa_sm_parse_own_wpa_ie(wpa_s->wpa, &ie) < 0 ||
460  	    ie.pmkid == NULL)
461  		return;
462  
463  	for (i = 0; i < ie.num_pmkid; i++) {
464  		pmksa_set = pmksa_cache_set_current(wpa_s->wpa,
465  						    ie.pmkid + i * PMKID_LEN,
466  						    NULL, NULL, 0, NULL, 0,
467  						    true);
468  		if (pmksa_set == 0) {
469  			eapol_sm_notify_pmkid_attempt(wpa_s->eapol);
470  			wpa_sm_set_pmk_from_pmksa(wpa_s->wpa);
471  			break;
472  		}
473  	}
474  
475  	wpa_dbg(wpa_s, MSG_DEBUG, "RSN: PMKID from assoc IE %sfound from "
476  		"PMKSA cache", pmksa_set == 0 ? "" : "not ");
477  }
478  
479  
wpa_supplicant_event_pmkid_candidate(struct wpa_supplicant * wpa_s,union wpa_event_data * data)480  static void wpa_supplicant_event_pmkid_candidate(struct wpa_supplicant *wpa_s,
481  						 union wpa_event_data *data)
482  {
483  	if (data == NULL) {
484  		wpa_dbg(wpa_s, MSG_DEBUG, "RSN: No data in PMKID candidate "
485  			"event");
486  		return;
487  	}
488  	wpa_dbg(wpa_s, MSG_DEBUG, "RSN: PMKID candidate event - bssid=" MACSTR
489  		" index=%d preauth=%d",
490  		MAC2STR(data->pmkid_candidate.bssid),
491  		data->pmkid_candidate.index,
492  		data->pmkid_candidate.preauth);
493  
494  	pmksa_candidate_add(wpa_s->wpa, data->pmkid_candidate.bssid,
495  			    data->pmkid_candidate.index,
496  			    data->pmkid_candidate.preauth);
497  }
498  
499  
wpa_supplicant_dynamic_keys(struct wpa_supplicant * wpa_s)500  static int wpa_supplicant_dynamic_keys(struct wpa_supplicant *wpa_s)
501  {
502  	if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
503  	    wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE)
504  		return 0;
505  
506  #ifdef IEEE8021X_EAPOL
507  	if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA &&
508  	    wpa_s->current_ssid &&
509  	    !(wpa_s->current_ssid->eapol_flags &
510  	      (EAPOL_FLAG_REQUIRE_KEY_UNICAST |
511  	       EAPOL_FLAG_REQUIRE_KEY_BROADCAST))) {
512  		/* IEEE 802.1X, but not using dynamic WEP keys (i.e., either
513  		 * plaintext or static WEP keys). */
514  		return 0;
515  	}
516  #endif /* IEEE8021X_EAPOL */
517  
518  	return 1;
519  }
520  
521  
522  /**
523   * wpa_supplicant_scard_init - Initialize SIM/USIM access with PC/SC
524   * @wpa_s: pointer to wpa_supplicant data
525   * @ssid: Configuration data for the network
526   * Returns: 0 on success, -1 on failure
527   *
528   * This function is called when starting authentication with a network that is
529   * configured to use PC/SC for SIM/USIM access (EAP-SIM or EAP-AKA).
530   */
wpa_supplicant_scard_init(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)531  int wpa_supplicant_scard_init(struct wpa_supplicant *wpa_s,
532  			      struct wpa_ssid *ssid)
533  {
534  #ifdef IEEE8021X_EAPOL
535  #ifdef PCSC_FUNCS
536  	int aka = 0, sim = 0;
537  
538  	if ((ssid != NULL && ssid->eap.pcsc == NULL) ||
539  	    wpa_s->scard != NULL || wpa_s->conf->external_sim)
540  		return 0;
541  
542  	if (ssid == NULL || ssid->eap.eap_methods == NULL) {
543  		sim = 1;
544  		aka = 1;
545  	} else {
546  		struct eap_method_type *eap = ssid->eap.eap_methods;
547  		while (eap->vendor != EAP_VENDOR_IETF ||
548  		       eap->method != EAP_TYPE_NONE) {
549  			if (eap->vendor == EAP_VENDOR_IETF) {
550  				if (eap->method == EAP_TYPE_SIM)
551  					sim = 1;
552  				else if (eap->method == EAP_TYPE_AKA ||
553  					 eap->method == EAP_TYPE_AKA_PRIME)
554  					aka = 1;
555  			}
556  			eap++;
557  		}
558  	}
559  
560  	if (eap_peer_get_eap_method(EAP_VENDOR_IETF, EAP_TYPE_SIM) == NULL)
561  		sim = 0;
562  	if (eap_peer_get_eap_method(EAP_VENDOR_IETF, EAP_TYPE_AKA) == NULL &&
563  	    eap_peer_get_eap_method(EAP_VENDOR_IETF, EAP_TYPE_AKA_PRIME) ==
564  	    NULL)
565  		aka = 0;
566  
567  	if (!sim && !aka) {
568  		wpa_dbg(wpa_s, MSG_DEBUG, "Selected network is configured to "
569  			"use SIM, but neither EAP-SIM nor EAP-AKA are "
570  			"enabled");
571  		return 0;
572  	}
573  
574  	wpa_dbg(wpa_s, MSG_DEBUG, "Selected network is configured to use SIM "
575  		"(sim=%d aka=%d) - initialize PCSC", sim, aka);
576  
577  	wpa_s->scard = scard_init(wpa_s->conf->pcsc_reader);
578  	if (wpa_s->scard == NULL) {
579  		wpa_msg(wpa_s, MSG_WARNING, "Failed to initialize SIM "
580  			"(pcsc-lite)");
581  		return -1;
582  	}
583  	wpa_sm_set_scard_ctx(wpa_s->wpa, wpa_s->scard);
584  	eapol_sm_register_scard_ctx(wpa_s->eapol, wpa_s->scard);
585  #endif /* PCSC_FUNCS */
586  #endif /* IEEE8021X_EAPOL */
587  
588  	return 0;
589  }
590  
591  
592  #ifndef CONFIG_NO_SCAN_PROCESSING
593  
594  #ifdef CONFIG_WEP
has_wep_key(struct wpa_ssid * ssid)595  static int has_wep_key(struct wpa_ssid *ssid)
596  {
597  	int i;
598  
599  	for (i = 0; i < NUM_WEP_KEYS; i++) {
600  		if (ssid->wep_key_len[i])
601  			return 1;
602  	}
603  
604  	return 0;
605  }
606  #endif /* CONFIG_WEP */
607  
608  
wpa_supplicant_match_privacy(struct wpa_bss * bss,struct wpa_ssid * ssid)609  static int wpa_supplicant_match_privacy(struct wpa_bss *bss,
610  					struct wpa_ssid *ssid)
611  {
612  	int privacy = 0;
613  
614  	if (ssid->mixed_cell)
615  		return 1;
616  
617  #ifdef CONFIG_WPS
618  	if (ssid->key_mgmt & WPA_KEY_MGMT_WPS)
619  		return 1;
620  #endif /* CONFIG_WPS */
621  
622  #ifdef CONFIG_OWE
623  	if ((ssid->key_mgmt & WPA_KEY_MGMT_OWE) && !ssid->owe_only)
624  		return 1;
625  #endif /* CONFIG_OWE */
626  
627  #ifdef CONFIG_WEP
628  	if (has_wep_key(ssid))
629  		privacy = 1;
630  #endif /* CONFIG_WEP */
631  
632  #ifdef IEEE8021X_EAPOL
633  	if ((ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) &&
634  	    ssid->eapol_flags & (EAPOL_FLAG_REQUIRE_KEY_UNICAST |
635  				 EAPOL_FLAG_REQUIRE_KEY_BROADCAST))
636  		privacy = 1;
637  #endif /* IEEE8021X_EAPOL */
638  
639  	if (wpa_key_mgmt_wpa(ssid->key_mgmt))
640  		privacy = 1;
641  
642  	if (bss->caps & IEEE80211_CAP_PRIVACY)
643  		return privacy;
644  	return !privacy;
645  }
646  
647  
wpa_supplicant_ssid_bss_match(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid,struct wpa_bss * bss,int debug_print)648  static int wpa_supplicant_ssid_bss_match(struct wpa_supplicant *wpa_s,
649  					 struct wpa_ssid *ssid,
650  					 struct wpa_bss *bss, int debug_print)
651  {
652  	struct wpa_ie_data ie;
653  	int proto_match = 0;
654  	const u8 *rsn_ie, *wpa_ie;
655  	int ret;
656  #ifdef CONFIG_WEP
657  	int wep_ok;
658  #endif /* CONFIG_WEP */
659  	bool is_6ghz_bss = is_6ghz_freq(bss->freq);
660  
661  	ret = wpas_wps_ssid_bss_match(wpa_s, ssid, bss);
662  	if (ret >= 0)
663  		return ret;
664  
665  #ifdef CONFIG_WEP
666  	/* Allow TSN if local configuration accepts WEP use without WPA/WPA2 */
667  	wep_ok = !wpa_key_mgmt_wpa(ssid->key_mgmt) &&
668  		(((ssid->key_mgmt & WPA_KEY_MGMT_NONE) &&
669  		  ssid->wep_key_len[ssid->wep_tx_keyidx] > 0) ||
670  		 (ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA));
671  #endif /* CONFIG_WEP */
672  
673  	rsn_ie = wpa_bss_get_rsne(wpa_s, bss, ssid, false);
674  	if (is_6ghz_bss && !rsn_ie) {
675  		if (debug_print)
676  			wpa_dbg(wpa_s, MSG_DEBUG,
677  				"   skip - 6 GHz BSS without RSNE");
678  		return 0;
679  	}
680  
681  	while ((ssid->proto & WPA_PROTO_RSN) && rsn_ie) {
682  		proto_match++;
683  
684  		if (wpa_parse_wpa_ie(rsn_ie, 2 + rsn_ie[1], &ie)) {
685  			if (debug_print)
686  				wpa_dbg(wpa_s, MSG_DEBUG,
687  					"   skip RSN IE - parse failed");
688  			break;
689  		}
690  		if (!ie.has_pairwise)
691  			ie.pairwise_cipher = wpa_default_rsn_cipher(bss->freq);
692  		if (!ie.has_group)
693  			ie.group_cipher = wpa_default_rsn_cipher(bss->freq);
694  
695  		if (is_6ghz_bss || !is_zero_ether_addr(bss->mld_addr)) {
696  			/* WEP and TKIP are not allowed on 6 GHz/MLD */
697  			ie.pairwise_cipher &= ~(WPA_CIPHER_WEP40 |
698  						WPA_CIPHER_WEP104 |
699  						WPA_CIPHER_TKIP);
700  			ie.group_cipher &= ~(WPA_CIPHER_WEP40 |
701  					     WPA_CIPHER_WEP104 |
702  					     WPA_CIPHER_TKIP);
703  		}
704  
705  #ifdef CONFIG_WEP
706  		if (wep_ok &&
707  		    (ie.group_cipher & (WPA_CIPHER_WEP40 | WPA_CIPHER_WEP104)))
708  		{
709  			if (debug_print)
710  				wpa_dbg(wpa_s, MSG_DEBUG,
711  					"   selected based on TSN in RSN IE");
712  			return 1;
713  		}
714  #endif /* CONFIG_WEP */
715  
716  		if (!(ie.proto & ssid->proto)) {
717  			if (debug_print)
718  				wpa_dbg(wpa_s, MSG_DEBUG,
719  					"   skip RSN IE - proto mismatch");
720  			break;
721  		}
722  
723  		if (!(ie.pairwise_cipher & ssid->pairwise_cipher)) {
724  			if (debug_print)
725  				wpa_dbg(wpa_s, MSG_DEBUG,
726  					"   skip RSN IE - PTK cipher mismatch");
727  			break;
728  		}
729  
730  		if (!(ie.group_cipher & ssid->group_cipher)) {
731  			if (debug_print)
732  				wpa_dbg(wpa_s, MSG_DEBUG,
733  					"   skip RSN IE - GTK cipher mismatch");
734  			break;
735  		}
736  
737  		if (ssid->group_mgmt_cipher &&
738  		    !(ie.mgmt_group_cipher & ssid->group_mgmt_cipher)) {
739  			if (debug_print)
740  				wpa_dbg(wpa_s, MSG_DEBUG,
741  					"   skip RSN IE - group mgmt cipher mismatch");
742  			break;
743  		}
744  
745  		if (is_6ghz_bss) {
746  			/* MFPC must be supported on 6 GHz */
747  			if (!(ie.capabilities & WPA_CAPABILITY_MFPC)) {
748  				if (debug_print)
749  					wpa_dbg(wpa_s, MSG_DEBUG,
750  						"   skip RSNE - 6 GHz without MFPC");
751  				break;
752  			}
753  
754  			/* WPA PSK is not allowed on the 6 GHz band */
755  			ie.key_mgmt &= ~(WPA_KEY_MGMT_PSK |
756  					 WPA_KEY_MGMT_FT_PSK |
757  					 WPA_KEY_MGMT_PSK_SHA256);
758  		}
759  
760  		if (!(ie.key_mgmt & ssid->key_mgmt)) {
761  			if (debug_print)
762  				wpa_dbg(wpa_s, MSG_DEBUG,
763  					"   skip RSN IE - key mgmt mismatch");
764  			break;
765  		}
766  
767  		if (!(ie.capabilities & WPA_CAPABILITY_MFPC) &&
768  		    wpas_get_ssid_pmf(wpa_s, ssid) ==
769  		    MGMT_FRAME_PROTECTION_REQUIRED) {
770  			if (debug_print)
771  				wpa_dbg(wpa_s, MSG_DEBUG,
772  					"   skip RSN IE - no mgmt frame protection");
773  			break;
774  		}
775  		if ((ie.capabilities & WPA_CAPABILITY_MFPR) &&
776  		    wpas_get_ssid_pmf(wpa_s, ssid) ==
777  		    NO_MGMT_FRAME_PROTECTION) {
778  			if (debug_print)
779  				wpa_dbg(wpa_s, MSG_DEBUG,
780  					"   skip RSN IE - no mgmt frame protection enabled but AP requires it");
781  			break;
782  		}
783  
784  		if (debug_print)
785  			wpa_dbg(wpa_s, MSG_DEBUG,
786  				"   selected based on RSN IE");
787  		return 1;
788  	}
789  
790  	if (is_6ghz_bss) {
791  		if (debug_print)
792  			wpa_dbg(wpa_s, MSG_DEBUG,
793  				"   skip - 6 GHz BSS without matching RSNE");
794  		return 0;
795  	}
796  
797  	wpa_ie = wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE);
798  
799  	if (wpas_get_ssid_pmf(wpa_s, ssid) == MGMT_FRAME_PROTECTION_REQUIRED &&
800  	    (!(ssid->key_mgmt & WPA_KEY_MGMT_OWE) || ssid->owe_only)) {
801  #ifdef CONFIG_OWE
802  		if ((ssid->key_mgmt & WPA_KEY_MGMT_OWE) && ssid->owe_only &&
803  		    !wpa_ie && !rsn_ie &&
804  		    wpa_s->owe_transition_select &&
805  		    wpa_bss_get_vendor_ie(bss, OWE_IE_VENDOR_TYPE) &&
806  		    ssid->owe_transition_bss_select_count + 1 <=
807  		    MAX_OWE_TRANSITION_BSS_SELECT_COUNT) {
808  			ssid->owe_transition_bss_select_count++;
809  			if (debug_print)
810  				wpa_dbg(wpa_s, MSG_DEBUG,
811  					"   skip OWE open BSS (selection count %d does not exceed %d)",
812  					ssid->owe_transition_bss_select_count,
813  					MAX_OWE_TRANSITION_BSS_SELECT_COUNT);
814  			wpa_s->owe_transition_search = 1;
815  			return 0;
816  		}
817  #endif /* CONFIG_OWE */
818  		if (debug_print)
819  			wpa_dbg(wpa_s, MSG_DEBUG,
820  				"   skip - MFP Required but network not MFP Capable");
821  		return 0;
822  	}
823  
824  	while ((ssid->proto & WPA_PROTO_WPA) && wpa_ie) {
825  		proto_match++;
826  
827  		if (wpa_parse_wpa_ie(wpa_ie, 2 + wpa_ie[1], &ie)) {
828  			if (debug_print)
829  				wpa_dbg(wpa_s, MSG_DEBUG,
830  					"   skip WPA IE - parse failed");
831  			break;
832  		}
833  
834  #ifdef CONFIG_WEP
835  		if (wep_ok &&
836  		    (ie.group_cipher & (WPA_CIPHER_WEP40 | WPA_CIPHER_WEP104)))
837  		{
838  			if (debug_print)
839  				wpa_dbg(wpa_s, MSG_DEBUG,
840  					"   selected based on TSN in WPA IE");
841  			return 1;
842  		}
843  #endif /* CONFIG_WEP */
844  
845  		if (!(ie.proto & ssid->proto)) {
846  			if (debug_print)
847  				wpa_dbg(wpa_s, MSG_DEBUG,
848  					"   skip WPA IE - proto mismatch");
849  			break;
850  		}
851  
852  		if (!(ie.pairwise_cipher & ssid->pairwise_cipher)) {
853  			if (debug_print)
854  				wpa_dbg(wpa_s, MSG_DEBUG,
855  					"   skip WPA IE - PTK cipher mismatch");
856  			break;
857  		}
858  
859  		if (!(ie.group_cipher & ssid->group_cipher)) {
860  			if (debug_print)
861  				wpa_dbg(wpa_s, MSG_DEBUG,
862  					"   skip WPA IE - GTK cipher mismatch");
863  			break;
864  		}
865  
866  		if (!(ie.key_mgmt & ssid->key_mgmt)) {
867  			if (debug_print)
868  				wpa_dbg(wpa_s, MSG_DEBUG,
869  					"   skip WPA IE - key mgmt mismatch");
870  			break;
871  		}
872  
873  		if (debug_print)
874  			wpa_dbg(wpa_s, MSG_DEBUG,
875  				"   selected based on WPA IE");
876  		return 1;
877  	}
878  
879  	if ((ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA) && !wpa_ie &&
880  	    !rsn_ie) {
881  		if (debug_print)
882  			wpa_dbg(wpa_s, MSG_DEBUG,
883  				"   allow for non-WPA IEEE 802.1X");
884  		return 1;
885  	}
886  
887  #ifdef CONFIG_OWE
888  	if ((ssid->key_mgmt & WPA_KEY_MGMT_OWE) && !ssid->owe_only &&
889  	    !wpa_ie && !rsn_ie) {
890  		if (wpa_s->owe_transition_select &&
891  		    wpa_bss_get_vendor_ie(bss, OWE_IE_VENDOR_TYPE) &&
892  		    ssid->owe_transition_bss_select_count + 1 <=
893  		    MAX_OWE_TRANSITION_BSS_SELECT_COUNT) {
894  			ssid->owe_transition_bss_select_count++;
895  			if (debug_print)
896  				wpa_dbg(wpa_s, MSG_DEBUG,
897  					"   skip OWE transition BSS (selection count %d does not exceed %d)",
898  					ssid->owe_transition_bss_select_count,
899  					MAX_OWE_TRANSITION_BSS_SELECT_COUNT);
900  			wpa_s->owe_transition_search = 1;
901  			return 0;
902  		}
903  		if (debug_print)
904  			wpa_dbg(wpa_s, MSG_DEBUG,
905  				"   allow in OWE transition mode");
906  		return 1;
907  	}
908  #endif /* CONFIG_OWE */
909  
910  	if ((ssid->proto & (WPA_PROTO_WPA | WPA_PROTO_RSN)) &&
911  	    wpa_key_mgmt_wpa(ssid->key_mgmt) && proto_match == 0) {
912  		if (debug_print)
913  			wpa_dbg(wpa_s, MSG_DEBUG,
914  				"   skip - no WPA/RSN proto match");
915  		return 0;
916  	}
917  
918  	if (!wpa_key_mgmt_wpa(ssid->key_mgmt)) {
919  		if (debug_print)
920  			wpa_dbg(wpa_s, MSG_DEBUG, "   allow in non-WPA/WPA2");
921  		return 1;
922  	}
923  
924  	if (debug_print)
925  		wpa_dbg(wpa_s, MSG_DEBUG,
926  			"   reject due to mismatch with WPA/WPA2");
927  
928  	return 0;
929  }
930  
931  
freq_allowed(int * freqs,int freq)932  static int freq_allowed(int *freqs, int freq)
933  {
934  	int i;
935  
936  	if (freqs == NULL)
937  		return 1;
938  
939  	for (i = 0; freqs[i]; i++)
940  		if (freqs[i] == freq)
941  			return 1;
942  	return 0;
943  }
944  
945  
rate_match(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid,struct wpa_bss * bss,int debug_print)946  static int rate_match(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
947  		      struct wpa_bss *bss, int debug_print)
948  {
949  	const struct hostapd_hw_modes *mode = NULL, *modes;
950  	const u8 scan_ie[2] = { WLAN_EID_SUPP_RATES, WLAN_EID_EXT_SUPP_RATES };
951  	const u8 *rate_ie;
952  	int i, j, k;
953  
954  	if (bss->freq == 0)
955  		return 1; /* Cannot do matching without knowing band */
956  
957  	modes = wpa_s->hw.modes;
958  	if (modes == NULL) {
959  		/*
960  		 * The driver does not provide any additional information
961  		 * about the utilized hardware, so allow the connection attempt
962  		 * to continue.
963  		 */
964  		return 1;
965  	}
966  
967  	for (i = 0; i < wpa_s->hw.num_modes; i++) {
968  		for (j = 0; j < modes[i].num_channels; j++) {
969  			int freq = modes[i].channels[j].freq;
970  			if (freq == bss->freq) {
971  				if (mode &&
972  				    mode->mode == HOSTAPD_MODE_IEEE80211G)
973  					break; /* do not allow 802.11b replace
974  						* 802.11g */
975  				mode = &modes[i];
976  				break;
977  			}
978  		}
979  	}
980  
981  	if (mode == NULL)
982  		return 0;
983  
984  	for (i = 0; i < (int) sizeof(scan_ie); i++) {
985  		rate_ie = wpa_bss_get_ie(bss, scan_ie[i]);
986  		if (rate_ie == NULL)
987  			continue;
988  
989  		for (j = 2; j < rate_ie[1] + 2; j++) {
990  			int flagged = !!(rate_ie[j] & 0x80);
991  			int r = (rate_ie[j] & 0x7f) * 5;
992  
993  			/*
994  			 * IEEE Std 802.11n-2009 7.3.2.2:
995  			 * The new BSS Membership selector value is encoded
996  			 * like a legacy basic rate, but it is not a rate and
997  			 * only indicates if the BSS members are required to
998  			 * support the mandatory features of Clause 20 [HT PHY]
999  			 * in order to join the BSS.
1000  			 */
1001  			if (flagged && ((rate_ie[j] & 0x7f) ==
1002  					BSS_MEMBERSHIP_SELECTOR_HT_PHY)) {
1003  				if (!ht_supported(mode)) {
1004  					if (debug_print)
1005  						wpa_dbg(wpa_s, MSG_DEBUG,
1006  							"   hardware does not support HT PHY");
1007  					return 0;
1008  				}
1009  				continue;
1010  			}
1011  
1012  			/* There's also a VHT selector for 802.11ac */
1013  			if (flagged && ((rate_ie[j] & 0x7f) ==
1014  					BSS_MEMBERSHIP_SELECTOR_VHT_PHY)) {
1015  				if (!vht_supported(mode)) {
1016  					if (debug_print)
1017  						wpa_dbg(wpa_s, MSG_DEBUG,
1018  							"   hardware does not support VHT PHY");
1019  					return 0;
1020  				}
1021  				continue;
1022  			}
1023  
1024  			if (flagged && ((rate_ie[j] & 0x7f) ==
1025  					BSS_MEMBERSHIP_SELECTOR_HE_PHY)) {
1026  				if (!he_supported(mode, IEEE80211_MODE_INFRA)) {
1027  					if (debug_print)
1028  						wpa_dbg(wpa_s, MSG_DEBUG,
1029  							"   hardware does not support HE PHY");
1030  					return 0;
1031  				}
1032  				continue;
1033  			}
1034  
1035  #ifdef CONFIG_SAE
1036  			if (flagged && ((rate_ie[j] & 0x7f) ==
1037  					BSS_MEMBERSHIP_SELECTOR_SAE_H2E_ONLY)) {
1038  				if (wpas_get_ssid_sae_pwe(wpa_s, ssid) ==
1039  				    SAE_PWE_HUNT_AND_PECK &&
1040  				    !ssid->sae_password_id &&
1041  				    !is_6ghz_freq(bss->freq) &&
1042  				    wpa_key_mgmt_sae(ssid->key_mgmt)) {
1043  					if (debug_print)
1044  						wpa_dbg(wpa_s, MSG_DEBUG,
1045  							"   SAE H2E disabled");
1046  #ifdef CONFIG_TESTING_OPTIONS
1047  					if (wpa_s->ignore_sae_h2e_only) {
1048  						wpa_dbg(wpa_s, MSG_DEBUG,
1049  							"TESTING: Ignore SAE H2E requirement mismatch");
1050  						continue;
1051  					}
1052  #endif /* CONFIG_TESTING_OPTIONS */
1053  					return 0;
1054  				}
1055  				continue;
1056  			}
1057  #endif /* CONFIG_SAE */
1058  
1059  			if (!flagged)
1060  				continue;
1061  
1062  			/* check for legacy basic rates */
1063  			for (k = 0; k < mode->num_rates; k++) {
1064  				if (mode->rates[k] == r)
1065  					break;
1066  			}
1067  			if (k == mode->num_rates) {
1068  				/*
1069  				 * IEEE Std 802.11-2007 7.3.2.2 demands that in
1070  				 * order to join a BSS all required rates
1071  				 * have to be supported by the hardware.
1072  				 */
1073  				if (debug_print)
1074  					wpa_dbg(wpa_s, MSG_DEBUG,
1075  						"   hardware does not support required rate %d.%d Mbps (freq=%d mode==%d num_rates=%d)",
1076  						r / 10, r % 10,
1077  						bss->freq, mode->mode, mode->num_rates);
1078  				return 0;
1079  			}
1080  		}
1081  	}
1082  
1083  	return 1;
1084  }
1085  
1086  
1087  /*
1088   * Test whether BSS is in an ESS.
1089   * This is done differently in DMG (60 GHz) and non-DMG bands
1090   */
bss_is_ess(struct wpa_bss * bss)1091  static int bss_is_ess(struct wpa_bss *bss)
1092  {
1093  	if (bss_is_dmg(bss)) {
1094  		return (bss->caps & IEEE80211_CAP_DMG_MASK) ==
1095  			IEEE80211_CAP_DMG_AP;
1096  	}
1097  
1098  	return ((bss->caps & (IEEE80211_CAP_ESS | IEEE80211_CAP_IBSS)) ==
1099  		IEEE80211_CAP_ESS);
1100  }
1101  
1102  
match_mac_mask(const u8 * addr_a,const u8 * addr_b,const u8 * mask)1103  static int match_mac_mask(const u8 *addr_a, const u8 *addr_b, const u8 *mask)
1104  {
1105  	size_t i;
1106  
1107  	for (i = 0; i < ETH_ALEN; i++) {
1108  		if ((addr_a[i] & mask[i]) != (addr_b[i] & mask[i]))
1109  			return 0;
1110  	}
1111  	return 1;
1112  }
1113  
1114  
addr_in_list(const u8 * addr,const u8 * list,size_t num)1115  static int addr_in_list(const u8 *addr, const u8 *list, size_t num)
1116  {
1117  	size_t i;
1118  
1119  	for (i = 0; i < num; i++) {
1120  		const u8 *a = list + i * ETH_ALEN * 2;
1121  		const u8 *m = a + ETH_ALEN;
1122  
1123  		if (match_mac_mask(a, addr, m))
1124  			return 1;
1125  	}
1126  	return 0;
1127  }
1128  
1129  
owe_trans_ssid(struct wpa_supplicant * wpa_s,struct wpa_bss * bss,const u8 ** ret_ssid,size_t * ret_ssid_len)1130  static void owe_trans_ssid(struct wpa_supplicant *wpa_s, struct wpa_bss *bss,
1131  			   const u8 **ret_ssid, size_t *ret_ssid_len)
1132  {
1133  #ifdef CONFIG_OWE
1134  	const u8 *owe, *bssid;
1135  
1136  	owe = wpa_bss_get_vendor_ie(bss, OWE_IE_VENDOR_TYPE);
1137  	if (!owe || !wpa_bss_get_rsne(wpa_s, bss, NULL, false))
1138  		return;
1139  
1140  	if (wpas_get_owe_trans_network(owe, &bssid, ret_ssid, ret_ssid_len))
1141  		return;
1142  
1143  	/* Match the profile SSID against the OWE transition mode SSID on the
1144  	 * open network. */
1145  	wpa_dbg(wpa_s, MSG_DEBUG, "OWE: transition mode BSSID: " MACSTR
1146  		" SSID: %s", MAC2STR(bssid),
1147  		wpa_ssid_txt(*ret_ssid, *ret_ssid_len));
1148  
1149  	if (!(bss->flags & WPA_BSS_OWE_TRANSITION)) {
1150  		struct wpa_ssid *ssid;
1151  
1152  		for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) {
1153  			if (wpas_network_disabled(wpa_s, ssid))
1154  				continue;
1155  			if (ssid->ssid_len == *ret_ssid_len &&
1156  			    os_memcmp(ssid->ssid, *ret_ssid, *ret_ssid_len) ==
1157  			    0) {
1158  				/* OWE BSS in transition mode for a currently
1159  				 * enabled OWE network. */
1160  				wpa_dbg(wpa_s, MSG_DEBUG,
1161  					"OWE: transition mode OWE SSID for active OWE profile");
1162  				bss->flags |= WPA_BSS_OWE_TRANSITION;
1163  				break;
1164  			}
1165  		}
1166  	}
1167  #endif /* CONFIG_OWE */
1168  }
1169  
1170  
wpas_valid_ml_bss(struct wpa_supplicant * wpa_s,struct wpa_bss * bss)1171  static bool wpas_valid_ml_bss(struct wpa_supplicant *wpa_s, struct wpa_bss *bss)
1172  {
1173  	u16 removed_links;
1174  
1175  	if (wpa_bss_parse_basic_ml_element(wpa_s, bss, NULL, NULL, NULL, NULL))
1176  		return true;
1177  
1178  	if (!bss->valid_links)
1179  		return true;
1180  
1181  	/* Check if the current BSS is going to be removed */
1182  	removed_links = wpa_bss_parse_reconf_ml_element(wpa_s, bss);
1183  	if (BIT(bss->mld_link_id) & removed_links)
1184  		return false;
1185  
1186  	return true;
1187  }
1188  
1189  
disabled_freq(struct wpa_supplicant * wpa_s,int freq)1190  int disabled_freq(struct wpa_supplicant *wpa_s, int freq)
1191  {
1192  	int i, j;
1193  
1194  	if (!wpa_s->hw.modes || !wpa_s->hw.num_modes)
1195  		return 0;
1196  
1197  	for (j = 0; j < wpa_s->hw.num_modes; j++) {
1198  		struct hostapd_hw_modes *mode = &wpa_s->hw.modes[j];
1199  
1200  		for (i = 0; i < mode->num_channels; i++) {
1201  			struct hostapd_channel_data *chan = &mode->channels[i];
1202  
1203  			if (chan->freq == freq)
1204  				return !!(chan->flag & HOSTAPD_CHAN_DISABLED);
1205  		}
1206  	}
1207  
1208  	return 1;
1209  }
1210  
1211  
1212  static bool wpa_scan_res_ok(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
1213  			    const u8 *match_ssid, size_t match_ssid_len,
1214  			    struct wpa_bss *bss, int bssid_ignore_count,
1215  			    bool debug_print, bool link);
1216  
1217  
1218  #ifdef CONFIG_SAE_PK
sae_pk_acceptable_bss_with_pk(struct wpa_supplicant * wpa_s,struct wpa_bss * orig_bss,struct wpa_ssid * ssid,const u8 * match_ssid,size_t match_ssid_len)1219  static bool sae_pk_acceptable_bss_with_pk(struct wpa_supplicant *wpa_s,
1220  					  struct wpa_bss *orig_bss,
1221  					  struct wpa_ssid *ssid,
1222  					  const u8 *match_ssid,
1223  					  size_t match_ssid_len)
1224  {
1225  	struct wpa_bss *bss;
1226  
1227  	dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
1228  		int count;
1229  		const u8 *ie;
1230  
1231  		if (bss == orig_bss)
1232  			continue;
1233  		ie = wpa_bss_get_rsnxe(wpa_s, bss, ssid, false);
1234  		if (!(ieee802_11_rsnx_capab(ie, WLAN_RSNX_CAPAB_SAE_PK)))
1235  			continue;
1236  
1237  		/* TODO: Could be more thorough in checking what kind of
1238  		 * signal strength or throughput estimate would be acceptable
1239  		 * compared to the originally selected BSS. */
1240  		if (bss->est_throughput < 2000)
1241  			return false;
1242  
1243  		count = wpa_bssid_ignore_is_listed(wpa_s, bss->bssid);
1244  		if (wpa_scan_res_ok(wpa_s, ssid, match_ssid, match_ssid_len,
1245  				    bss, count, false, false))
1246  			return true;
1247  	}
1248  
1249  	return false;
1250  }
1251  #endif /* CONFIG_SAE_PK */
1252  
1253  
wpa_scan_res_ok(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid,const u8 * match_ssid,size_t match_ssid_len,struct wpa_bss * bss,int bssid_ignore_count,bool debug_print,bool link)1254  static bool wpa_scan_res_ok(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
1255  			    const u8 *match_ssid, size_t match_ssid_len,
1256  			    struct wpa_bss *bss, int bssid_ignore_count,
1257  			    bool debug_print, bool link)
1258  {
1259  	int res;
1260  	bool wpa, check_ssid = false;
1261  #ifdef CONFIG_MBO
1262  	const u8 *assoc_disallow;
1263  #endif /* CONFIG_MBO */
1264  #ifdef CONFIG_SAE
1265  	u8 rsnxe_capa = 0;
1266  	enum sae_pwe sae_pwe;
1267  #endif /* CONFIG_SAE */
1268  	const u8 *ie;
1269  
1270  	ie = wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE);
1271  	wpa = ie && ie[1];
1272  	ie = wpa_bss_get_rsne(wpa_s, bss, ssid, false);
1273  	wpa |= ie && ie[1];
1274  
1275  #ifdef CONFIG_SAE
1276  	ie = wpa_bss_get_rsnxe(wpa_s, bss, ssid, false);
1277  	if (ie && ie[0] == WLAN_EID_VENDOR_SPECIFIC && ie[1] >= 4 + 1)
1278  		rsnxe_capa = ie[4 + 2];
1279  	else if (ie && ie[1] >= 1)
1280  		rsnxe_capa = ie[2];
1281  #endif /* CONFIG_SAE */
1282  
1283  	check_ssid = wpa || ssid->ssid_len > 0;
1284  
1285  	if (wpas_network_disabled(wpa_s, ssid)) {
1286  		if (debug_print)
1287  			wpa_dbg(wpa_s, MSG_DEBUG, "   skip - disabled");
1288  		return false;
1289  	}
1290  
1291  	res = wpas_temp_disabled(wpa_s, ssid);
1292  	if (res > 0) {
1293  		if (debug_print)
1294  			wpa_dbg(wpa_s, MSG_DEBUG,
1295  				"   skip - disabled temporarily for %d second(s)",
1296  				res);
1297  		return false;
1298  	}
1299  
1300  #ifdef CONFIG_WPS
1301  	if ((ssid->key_mgmt & WPA_KEY_MGMT_WPS) && bssid_ignore_count) {
1302  		if (debug_print)
1303  			wpa_dbg(wpa_s, MSG_DEBUG,
1304  				"   skip - BSSID ignored (WPS)");
1305  		return false;
1306  	}
1307  
1308  	if (wpa && ssid->ssid_len == 0 &&
1309  	    wpas_wps_ssid_wildcard_ok(wpa_s, ssid, bss))
1310  		check_ssid = false;
1311  
1312  	if (!wpa && (ssid->key_mgmt & WPA_KEY_MGMT_WPS)) {
1313  		/* Only allow wildcard SSID match if an AP advertises active
1314  		 * WPS operation that matches our mode. */
1315  		check_ssid = ssid->ssid_len > 0 ||
1316  			!wpas_wps_ssid_wildcard_ok(wpa_s, ssid, bss);
1317  	}
1318  #endif /* CONFIG_WPS */
1319  
1320  	if (ssid->bssid_set && ssid->ssid_len == 0 &&
1321  	    ether_addr_equal(bss->bssid, ssid->bssid))
1322  		check_ssid = false;
1323  
1324  	if (check_ssid &&
1325  	    (match_ssid_len != ssid->ssid_len ||
1326  	     os_memcmp(match_ssid, ssid->ssid, match_ssid_len) != 0)) {
1327  		if (debug_print)
1328  			wpa_dbg(wpa_s, MSG_DEBUG, "   skip - SSID mismatch");
1329  		return false;
1330  	}
1331  
1332  	if (!link && ssid->bssid_set &&
1333  	    !ether_addr_equal(bss->bssid, ssid->bssid)) {
1334  		if (debug_print)
1335  			wpa_dbg(wpa_s, MSG_DEBUG, "   skip - BSSID mismatch");
1336  		return false;
1337  	}
1338  
1339  	/* check the list of BSSIDs to ignore */
1340  	if (ssid->num_bssid_ignore &&
1341  	    addr_in_list(bss->bssid, ssid->bssid_ignore,
1342  			 ssid->num_bssid_ignore)) {
1343  		if (debug_print)
1344  			wpa_dbg(wpa_s, MSG_DEBUG,
1345  				"   skip - BSSID configured to be ignored");
1346  		return false;
1347  	}
1348  
1349  	/* if there is a list of accepted BSSIDs, only accept those APs */
1350  	if (ssid->num_bssid_accept &&
1351  	    !addr_in_list(bss->bssid, ssid->bssid_accept,
1352  			  ssid->num_bssid_accept)) {
1353  		if (debug_print)
1354  			wpa_dbg(wpa_s, MSG_DEBUG,
1355  				"   skip - BSSID not in list of accepted values");
1356  		return false;
1357  	}
1358  
1359  	if (!wpa_supplicant_ssid_bss_match(wpa_s, ssid, bss, debug_print))
1360  		return false;
1361  
1362  	if (!wpa &&
1363  	    !(ssid->key_mgmt & WPA_KEY_MGMT_NONE) &&
1364  	    !(ssid->key_mgmt & WPA_KEY_MGMT_WPS) &&
1365  	    !(ssid->key_mgmt & WPA_KEY_MGMT_OWE) &&
1366  	    !(ssid->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA)) {
1367  		if (debug_print)
1368  			wpa_dbg(wpa_s, MSG_DEBUG,
1369  				"   skip - non-WPA network not allowed");
1370  		return false;
1371  	}
1372  
1373  #ifdef CONFIG_WEP
1374  	if (wpa && !wpa_key_mgmt_wpa(ssid->key_mgmt) && has_wep_key(ssid)) {
1375  		if (debug_print)
1376  			wpa_dbg(wpa_s, MSG_DEBUG,
1377  				"   skip - ignore WPA/WPA2 AP for WEP network block");
1378  		return false;
1379  	}
1380  #endif /* CONFIG_WEP */
1381  
1382  	if (!wpa_supplicant_match_privacy(bss, ssid)) {
1383  		if (debug_print)
1384  			wpa_dbg(wpa_s, MSG_DEBUG, "   skip - privacy mismatch");
1385  		return false;
1386  	}
1387  
1388  	if (ssid->mode != WPAS_MODE_MESH && !bss_is_ess(bss) &&
1389  	    !bss_is_pbss(bss)) {
1390  		if (debug_print)
1391  			wpa_dbg(wpa_s, MSG_DEBUG,
1392  				"   skip - not ESS, PBSS, or MBSS");
1393  		return false;
1394  	}
1395  
1396  	if (ssid->pbss != 2 && ssid->pbss != bss_is_pbss(bss)) {
1397  		if (debug_print)
1398  			wpa_dbg(wpa_s, MSG_DEBUG,
1399  				"   skip - PBSS mismatch (ssid %d bss %d)",
1400  				ssid->pbss, bss_is_pbss(bss));
1401  		return false;
1402  	}
1403  
1404  	if (!freq_allowed(ssid->freq_list, bss->freq)) {
1405  		if (debug_print)
1406  			wpa_dbg(wpa_s, MSG_DEBUG,
1407  				"   skip - frequency not allowed");
1408  		return false;
1409  	}
1410  
1411  #ifdef CONFIG_MESH
1412  	if (ssid->mode == WPAS_MODE_MESH && ssid->frequency > 0 &&
1413  	    ssid->frequency != bss->freq) {
1414  		if (debug_print)
1415  			wpa_dbg(wpa_s, MSG_DEBUG,
1416  				"   skip - frequency not allowed (mesh)");
1417  		return false;
1418  	}
1419  #endif /* CONFIG_MESH */
1420  
1421  	if (!rate_match(wpa_s, ssid, bss, debug_print)) {
1422  		if (debug_print)
1423  			wpa_dbg(wpa_s, MSG_DEBUG,
1424  				"   skip - rate sets do not match");
1425  		return false;
1426  	}
1427  
1428  #ifdef CONFIG_SAE
1429  	/* When using SAE Password Identifier and when operationg on the 6 GHz
1430  	 * band, only H2E is allowed. */
1431  	sae_pwe = wpas_get_ssid_sae_pwe(wpa_s, ssid);
1432  	if ((sae_pwe == SAE_PWE_HASH_TO_ELEMENT ||
1433  	     is_6ghz_freq(bss->freq) || ssid->sae_password_id) &&
1434  	    sae_pwe != SAE_PWE_FORCE_HUNT_AND_PECK &&
1435  	    wpa_key_mgmt_sae(ssid->key_mgmt) &&
1436  	    !(rsnxe_capa & BIT(WLAN_RSNX_CAPAB_SAE_H2E))) {
1437  		if (debug_print)
1438  			wpa_dbg(wpa_s, MSG_DEBUG,
1439  				"   skip - SAE H2E required, but not supported by the AP");
1440  		return false;
1441  	}
1442  #endif /* CONFIG_SAE */
1443  
1444  #ifdef CONFIG_SAE_PK
1445  	if (ssid->sae_pk == SAE_PK_MODE_ONLY &&
1446  	    !(rsnxe_capa & BIT(WLAN_RSNX_CAPAB_SAE_PK))) {
1447  		if (debug_print)
1448  			wpa_dbg(wpa_s, MSG_DEBUG,
1449  				"   skip - SAE-PK required, but not supported by the AP");
1450  		return false;
1451  	}
1452  #endif /* CONFIG_SAE_PK */
1453  
1454  #ifndef CONFIG_IBSS_RSN
1455  	if (ssid->mode == WPAS_MODE_IBSS &&
1456  	    !(ssid->key_mgmt & (WPA_KEY_MGMT_NONE | WPA_KEY_MGMT_WPA_NONE))) {
1457  		if (debug_print)
1458  			wpa_dbg(wpa_s, MSG_DEBUG,
1459  				"   skip - IBSS RSN not supported in the build");
1460  		return false;
1461  	}
1462  #endif /* !CONFIG_IBSS_RSN */
1463  
1464  #ifdef CONFIG_P2P
1465  	if (ssid->p2p_group &&
1466  	    !wpa_bss_get_vendor_ie(bss, P2P_IE_VENDOR_TYPE) &&
1467  	    !wpa_bss_get_vendor_ie_beacon(bss, P2P_IE_VENDOR_TYPE)) {
1468  		if (debug_print)
1469  			wpa_dbg(wpa_s, MSG_DEBUG, "   skip - no P2P IE seen");
1470  		return false;
1471  	}
1472  
1473  	if (!is_zero_ether_addr(ssid->go_p2p_dev_addr)) {
1474  		struct wpabuf *p2p_ie;
1475  		u8 dev_addr[ETH_ALEN];
1476  
1477  		ie = wpa_bss_get_vendor_ie(bss, P2P_IE_VENDOR_TYPE);
1478  		if (!ie) {
1479  			if (debug_print)
1480  				wpa_dbg(wpa_s, MSG_DEBUG,
1481  					"   skip - no P2P element");
1482  			return false;
1483  		}
1484  		p2p_ie = wpa_bss_get_vendor_ie_multi(bss, P2P_IE_VENDOR_TYPE);
1485  		if (!p2p_ie) {
1486  			if (debug_print)
1487  				wpa_dbg(wpa_s, MSG_DEBUG,
1488  					"   skip - could not fetch P2P element");
1489  			return false;
1490  		}
1491  
1492  		if (p2p_parse_dev_addr_in_p2p_ie(p2p_ie, dev_addr) < 0 ||
1493  		    !ether_addr_equal(dev_addr, ssid->go_p2p_dev_addr)) {
1494  			if (debug_print)
1495  				wpa_dbg(wpa_s, MSG_DEBUG,
1496  					"   skip - no matching GO P2P Device Address in P2P element");
1497  			wpabuf_free(p2p_ie);
1498  			return false;
1499  		}
1500  		wpabuf_free(p2p_ie);
1501  	}
1502  
1503  	/*
1504  	 * TODO: skip the AP if its P2P IE has Group Formation bit set in the
1505  	 * P2P Group Capability Bitmap and we are not in Group Formation with
1506  	 * that device.
1507  	 */
1508  #endif /* CONFIG_P2P */
1509  
1510  	if (os_reltime_before(&bss->last_update, &wpa_s->scan_min_time)) {
1511  		struct os_reltime diff;
1512  
1513  		os_reltime_sub(&wpa_s->scan_min_time, &bss->last_update, &diff);
1514  		if (debug_print)
1515  			wpa_dbg(wpa_s, MSG_DEBUG,
1516  				"   skip - scan result not recent enough (%u.%06u seconds too old)",
1517  				(unsigned int) diff.sec,
1518  				(unsigned int) diff.usec);
1519  		return false;
1520  	}
1521  #ifdef CONFIG_MBO
1522  #ifdef CONFIG_TESTING_OPTIONS
1523  	if (wpa_s->ignore_assoc_disallow)
1524  		goto skip_assoc_disallow;
1525  #endif /* CONFIG_TESTING_OPTIONS */
1526  	assoc_disallow = wpas_mbo_check_assoc_disallow(bss);
1527  	if (assoc_disallow && assoc_disallow[1] >= 1) {
1528  		if (debug_print)
1529  			wpa_dbg(wpa_s, MSG_DEBUG,
1530  				"   skip - MBO association disallowed (reason %u)",
1531  				assoc_disallow[2]);
1532  		return false;
1533  	}
1534  
1535  	if (wpa_is_bss_tmp_disallowed(wpa_s, bss)) {
1536  		if (debug_print)
1537  			wpa_dbg(wpa_s, MSG_DEBUG,
1538  				"   skip - AP temporarily disallowed");
1539  		return false;
1540  	}
1541  #ifdef CONFIG_TESTING_OPTIONS
1542  skip_assoc_disallow:
1543  #endif /* CONFIG_TESTING_OPTIONS */
1544  #endif /* CONFIG_MBO */
1545  
1546  #ifdef CONFIG_DPP
1547  	if ((ssid->key_mgmt & WPA_KEY_MGMT_DPP) &&
1548  	    !wpa_sm_pmksa_exists(wpa_s->wpa, bss->bssid, wpa_s->own_addr,
1549  				 ssid) &&
1550  	    (!ssid->dpp_connector || !ssid->dpp_netaccesskey ||
1551  	     !ssid->dpp_csign)) {
1552  		if (debug_print)
1553  			wpa_dbg(wpa_s, MSG_DEBUG,
1554  				"   skip - no PMKSA entry for DPP");
1555  		return false;
1556  	}
1557  #endif /* CONFIG_DPP */
1558  
1559  #ifdef CONFIG_SAE_PK
1560  	if (ssid->sae_pk == SAE_PK_MODE_AUTOMATIC &&
1561  	    wpa_key_mgmt_sae(ssid->key_mgmt) &&
1562  	    ((ssid->sae_password &&
1563  	      sae_pk_valid_password(ssid->sae_password)) ||
1564  	     (!ssid->sae_password && ssid->passphrase &&
1565  	      sae_pk_valid_password(ssid->passphrase))) &&
1566  	    !(rsnxe_capa & BIT(WLAN_RSNX_CAPAB_SAE_PK)) &&
1567  	    sae_pk_acceptable_bss_with_pk(wpa_s, bss, ssid, match_ssid,
1568  					  match_ssid_len)) {
1569  		if (debug_print)
1570  			wpa_dbg(wpa_s, MSG_DEBUG,
1571  				"   skip - another acceptable BSS with SAE-PK in the same ESS");
1572  		return false;
1573  	}
1574  #endif /* CONFIG_SAE_PK */
1575  
1576  	if (bss->ssid_len == 0) {
1577  #ifdef CONFIG_OWE
1578  		const u8 *owe_ssid = NULL;
1579  		size_t owe_ssid_len = 0;
1580  
1581  		owe_trans_ssid(wpa_s, bss, &owe_ssid, &owe_ssid_len);
1582  		if (owe_ssid && owe_ssid_len &&
1583  		    owe_ssid_len == ssid->ssid_len &&
1584  		    os_memcmp(owe_ssid, ssid->ssid, owe_ssid_len) == 0) {
1585  			if (debug_print)
1586  				wpa_dbg(wpa_s, MSG_DEBUG,
1587  					"   skip - no SSID in BSS entry for a possible OWE transition mode BSS");
1588  			int_array_add_unique(&wpa_s->owe_trans_scan_freq,
1589  					     bss->freq);
1590  			return false;
1591  		}
1592  #endif /* CONFIG_OWE */
1593  		if (debug_print)
1594  			wpa_dbg(wpa_s, MSG_DEBUG,
1595  				"   skip - no SSID known for the BSS");
1596  		return false;
1597  	}
1598  
1599  	if (!link && !wpas_valid_ml_bss(wpa_s, bss)) {
1600  		if (debug_print)
1601  			wpa_dbg(wpa_s, MSG_DEBUG,
1602  				"   skip - ML BSS going to be removed");
1603  		return false;
1604  	}
1605  
1606  	/* Matching configuration found */
1607  	return true;
1608  }
1609  
1610  
wpa_scan_res_match(struct wpa_supplicant * wpa_s,int i,struct wpa_bss * bss,struct wpa_ssid * group,int only_first_ssid,int debug_print,bool link)1611  struct wpa_ssid * wpa_scan_res_match(struct wpa_supplicant *wpa_s,
1612  				     int i, struct wpa_bss *bss,
1613  				     struct wpa_ssid *group,
1614  				     int only_first_ssid, int debug_print,
1615  				     bool link)
1616  {
1617  	u8 wpa_ie_len, rsn_ie_len;
1618  	const u8 *ie;
1619  	struct wpa_ssid *ssid;
1620  	const u8 *match_ssid;
1621  	size_t match_ssid_len;
1622  	int bssid_ignore_count;
1623  
1624  	ie = wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE);
1625  	wpa_ie_len = ie ? ie[1] : 0;
1626  
1627  	ie = wpa_bss_get_rsne(wpa_s, bss, NULL, false);
1628  	rsn_ie_len = ie ? ie[1] : 0;
1629  
1630  	if (debug_print) {
1631  		wpa_dbg(wpa_s, MSG_DEBUG, "%d: " MACSTR
1632  			" ssid='%s' wpa_ie_len=%u rsn_ie_len=%u caps=0x%x level=%d freq=%d %s%s",
1633  			i, MAC2STR(bss->bssid),
1634  			wpa_ssid_txt(bss->ssid, bss->ssid_len),
1635  			wpa_ie_len, rsn_ie_len, bss->caps, bss->level,
1636  			bss->freq,
1637  			wpa_bss_get_vendor_ie(bss, WPS_IE_VENDOR_TYPE) ?
1638  			" wps" : "",
1639  			(wpa_bss_get_vendor_ie(bss, P2P_IE_VENDOR_TYPE) ||
1640  			 wpa_bss_get_vendor_ie_beacon(bss, P2P_IE_VENDOR_TYPE))
1641  			? " p2p" : "");
1642  	}
1643  
1644  	bssid_ignore_count = wpa_bssid_ignore_is_listed(wpa_s, bss->bssid);
1645  	if (bssid_ignore_count) {
1646  		int limit = 1;
1647  		if (wpa_supplicant_enabled_networks(wpa_s) == 1) {
1648  			/*
1649  			 * When only a single network is enabled, we can
1650  			 * trigger BSSID ignoring on the first failure. This
1651  			 * should not be done with multiple enabled networks to
1652  			 * avoid getting forced to move into a worse ESS on
1653  			 * single error if there are no other BSSes of the
1654  			 * current ESS.
1655  			 */
1656  			limit = 0;
1657  		}
1658  		if (bssid_ignore_count > limit) {
1659  			if (debug_print) {
1660  				wpa_dbg(wpa_s, MSG_DEBUG,
1661  					"   skip - BSSID ignored (count=%d limit=%d)",
1662  					bssid_ignore_count, limit);
1663  			}
1664  			return NULL;
1665  		}
1666  	}
1667  
1668  	match_ssid = bss->ssid;
1669  	match_ssid_len = bss->ssid_len;
1670  	owe_trans_ssid(wpa_s, bss, &match_ssid, &match_ssid_len);
1671  
1672  	if (match_ssid_len == 0) {
1673  		if (debug_print)
1674  			wpa_dbg(wpa_s, MSG_DEBUG, "   skip - SSID not known");
1675  		return NULL;
1676  	}
1677  
1678  	if (disallowed_bssid(wpa_s, bss->bssid)) {
1679  		if (debug_print)
1680  			wpa_dbg(wpa_s, MSG_DEBUG, "   skip - BSSID disallowed");
1681  		return NULL;
1682  	}
1683  
1684  	if (disallowed_ssid(wpa_s, match_ssid, match_ssid_len)) {
1685  		if (debug_print)
1686  			wpa_dbg(wpa_s, MSG_DEBUG, "   skip - SSID disallowed");
1687  		return NULL;
1688  	}
1689  
1690  	if (disabled_freq(wpa_s, bss->freq)) {
1691  		if (debug_print)
1692  			wpa_dbg(wpa_s, MSG_DEBUG, "   skip - channel disabled");
1693  		return NULL;
1694  	}
1695  
1696  	if (wnm_is_bss_excluded(wpa_s, bss)) {
1697  		if (debug_print)
1698  			wpa_dbg(wpa_s, MSG_DEBUG, "   skip - BSSID excluded");
1699  		return NULL;
1700  	}
1701  
1702  	for (ssid = group; ssid; ssid = only_first_ssid ? NULL : ssid->pnext) {
1703  		if (wpa_scan_res_ok(wpa_s, ssid, match_ssid, match_ssid_len,
1704  				    bss, bssid_ignore_count, debug_print, link))
1705  			return ssid;
1706  	}
1707  
1708  	/* No matching configuration found */
1709  	return NULL;
1710  }
1711  
1712  
1713  struct wpa_bss *
wpa_supplicant_select_bss(struct wpa_supplicant * wpa_s,struct wpa_ssid * group,struct wpa_ssid ** selected_ssid,int only_first_ssid)1714  wpa_supplicant_select_bss(struct wpa_supplicant *wpa_s,
1715  			  struct wpa_ssid *group,
1716  			  struct wpa_ssid **selected_ssid,
1717  			  int only_first_ssid)
1718  {
1719  	unsigned int i;
1720  
1721  	if (wpa_s->current_ssid) {
1722  		struct wpa_ssid *ssid;
1723  
1724  		wpa_dbg(wpa_s, MSG_DEBUG,
1725  			"Scan results matching the currently selected network");
1726  		for (i = 0; i < wpa_s->last_scan_res_used; i++) {
1727  			struct wpa_bss *bss = wpa_s->last_scan_res[i];
1728  
1729  			ssid = wpa_scan_res_match(wpa_s, i, bss, group,
1730  						  only_first_ssid, 0, false);
1731  			if (ssid != wpa_s->current_ssid)
1732  				continue;
1733  			wpa_dbg(wpa_s, MSG_DEBUG, "%u: " MACSTR
1734  				" freq=%d level=%d snr=%d est_throughput=%u",
1735  				i, MAC2STR(bss->bssid), bss->freq, bss->level,
1736  				bss->snr, bss->est_throughput);
1737  		}
1738  	}
1739  
1740  	if (only_first_ssid)
1741  		wpa_dbg(wpa_s, MSG_DEBUG, "Try to find BSS matching pre-selected network id=%d",
1742  			group->id);
1743  	else
1744  		wpa_dbg(wpa_s, MSG_DEBUG, "Selecting BSS from priority group %d",
1745  			group->priority);
1746  
1747  	for (i = 0; i < wpa_s->last_scan_res_used; i++) {
1748  		struct wpa_bss *bss = wpa_s->last_scan_res[i];
1749  
1750  		wpa_s->owe_transition_select = 1;
1751  		*selected_ssid = wpa_scan_res_match(wpa_s, i, bss, group,
1752  						    only_first_ssid, 1, false);
1753  		wpa_s->owe_transition_select = 0;
1754  		if (!*selected_ssid)
1755  			continue;
1756  		wpa_dbg(wpa_s, MSG_DEBUG, "   selected %sBSS " MACSTR
1757  			" ssid='%s'",
1758  			bss == wpa_s->current_bss ? "current ": "",
1759  			MAC2STR(bss->bssid),
1760  			wpa_ssid_txt(bss->ssid, bss->ssid_len));
1761  		return bss;
1762  	}
1763  
1764  	return NULL;
1765  }
1766  
1767  
wpa_supplicant_pick_network(struct wpa_supplicant * wpa_s,struct wpa_ssid ** selected_ssid)1768  struct wpa_bss * wpa_supplicant_pick_network(struct wpa_supplicant *wpa_s,
1769  					     struct wpa_ssid **selected_ssid)
1770  {
1771  	struct wpa_bss *selected = NULL;
1772  	size_t prio;
1773  	struct wpa_ssid *next_ssid = NULL;
1774  	struct wpa_ssid *ssid;
1775  
1776  	if (wpa_s->last_scan_res == NULL ||
1777  	    wpa_s->last_scan_res_used == 0)
1778  		return NULL; /* no scan results from last update */
1779  
1780  	if (wpa_s->next_ssid) {
1781  		/* check that next_ssid is still valid */
1782  		for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) {
1783  			if (ssid == wpa_s->next_ssid)
1784  				break;
1785  		}
1786  		next_ssid = ssid;
1787  		wpa_s->next_ssid = NULL;
1788  	}
1789  
1790  	while (selected == NULL) {
1791  		for (prio = 0; prio < wpa_s->conf->num_prio; prio++) {
1792  			if (next_ssid && next_ssid->priority ==
1793  			    wpa_s->conf->pssid[prio]->priority) {
1794  				selected = wpa_supplicant_select_bss(
1795  					wpa_s, next_ssid, selected_ssid, 1);
1796  				if (selected)
1797  					break;
1798  			}
1799  			selected = wpa_supplicant_select_bss(
1800  				wpa_s, wpa_s->conf->pssid[prio],
1801  				selected_ssid, 0);
1802  			if (selected)
1803  				break;
1804  		}
1805  
1806  		if (!selected &&
1807  		    (wpa_s->bssid_ignore || wnm_active_bss_trans_mgmt(wpa_s)) &&
1808  		    !wpa_s->countermeasures) {
1809  			wpa_dbg(wpa_s, MSG_DEBUG,
1810  				"No APs found - clear BSSID ignore list and try again");
1811  			wnm_btm_reset(wpa_s);
1812  			wpa_bssid_ignore_clear(wpa_s);
1813  			wpa_s->bssid_ignore_cleared = true;
1814  		} else if (selected == NULL)
1815  			break;
1816  	}
1817  
1818  	ssid = *selected_ssid;
1819  	if (selected && ssid && ssid->mem_only_psk && !ssid->psk_set &&
1820  	    !ssid->passphrase && !ssid->ext_psk) {
1821  		const char *field_name, *txt = NULL;
1822  
1823  		wpa_dbg(wpa_s, MSG_DEBUG,
1824  			"PSK/passphrase not yet available for the selected network");
1825  
1826  		wpas_notify_network_request(wpa_s, ssid,
1827  					    WPA_CTRL_REQ_PSK_PASSPHRASE, NULL);
1828  
1829  		field_name = wpa_supplicant_ctrl_req_to_string(
1830  			WPA_CTRL_REQ_PSK_PASSPHRASE, NULL, &txt);
1831  		if (field_name == NULL)
1832  			return NULL;
1833  
1834  		wpas_send_ctrl_req(wpa_s, ssid, field_name, txt);
1835  
1836  		selected = NULL;
1837  	}
1838  
1839  	return selected;
1840  }
1841  
1842  
wpa_supplicant_req_new_scan(struct wpa_supplicant * wpa_s,int timeout_sec,int timeout_usec)1843  static void wpa_supplicant_req_new_scan(struct wpa_supplicant *wpa_s,
1844  					int timeout_sec, int timeout_usec)
1845  {
1846  	if (!wpa_supplicant_enabled_networks(wpa_s)) {
1847  		/*
1848  		 * No networks are enabled; short-circuit request so
1849  		 * we don't wait timeout seconds before transitioning
1850  		 * to INACTIVE state.
1851  		 */
1852  		wpa_dbg(wpa_s, MSG_DEBUG, "Short-circuit new scan request "
1853  			"since there are no enabled networks");
1854  		wpa_supplicant_set_state(wpa_s, WPA_INACTIVE);
1855  		return;
1856  	}
1857  
1858  	wpa_s->scan_for_connection = 1;
1859  	wpa_supplicant_req_scan(wpa_s, timeout_sec, timeout_usec);
1860  }
1861  
1862  
ml_link_probe_scan(struct wpa_supplicant * wpa_s)1863  static bool ml_link_probe_scan(struct wpa_supplicant *wpa_s)
1864  {
1865  	if (!wpa_s->ml_connect_probe_ssid || !wpa_s->ml_connect_probe_bss)
1866  		return false;
1867  
1868  	wpa_msg(wpa_s, MSG_DEBUG,
1869  		"Request association with " MACSTR " after ML probe",
1870  		MAC2STR(wpa_s->ml_connect_probe_bss->bssid));
1871  
1872  	wpa_supplicant_associate(wpa_s, wpa_s->ml_connect_probe_bss,
1873  				 wpa_s->ml_connect_probe_ssid);
1874  
1875  	wpa_s->ml_connect_probe_ssid = NULL;
1876  	wpa_s->ml_connect_probe_bss = NULL;
1877  
1878  	return true;
1879  }
1880  
1881  
wpa_supplicant_connect_ml_missing(struct wpa_supplicant * wpa_s,struct wpa_bss * selected,struct wpa_ssid * ssid)1882  static int wpa_supplicant_connect_ml_missing(struct wpa_supplicant *wpa_s,
1883  					     struct wpa_bss *selected,
1884  					     struct wpa_ssid *ssid)
1885  {
1886  	int *freqs;
1887  	u16 missing_links = 0, removed_links;
1888  	u8 ap_mld_id;
1889  
1890  	if (!((wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_MLO) &&
1891  	      (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME)))
1892  		return 0;
1893  
1894  	if (wpa_bss_parse_basic_ml_element(wpa_s, selected, NULL,
1895  					   &missing_links, ssid,
1896  					   &ap_mld_id) ||
1897  	    !missing_links)
1898  		return 0;
1899  
1900  	removed_links = wpa_bss_parse_reconf_ml_element(wpa_s, selected);
1901  	missing_links &= ~removed_links;
1902  
1903  	if (!missing_links)
1904  		return 0;
1905  
1906  	wpa_dbg(wpa_s, MSG_DEBUG,
1907  		"MLD: Doing an ML probe for missing links 0x%04x",
1908  		missing_links);
1909  
1910  	freqs = os_malloc(sizeof(int) * 2);
1911  	if (!freqs)
1912  		return 0;
1913  
1914  	wpa_s->ml_connect_probe_ssid = ssid;
1915  	wpa_s->ml_connect_probe_bss = selected;
1916  
1917  	freqs[0] = selected->freq;
1918  	freqs[1] = 0;
1919  
1920  	wpa_s->manual_scan_passive = 0;
1921  	wpa_s->manual_scan_use_id = 0;
1922  	wpa_s->manual_scan_only_new = 0;
1923  	wpa_s->scan_id_count = 0;
1924  	os_free(wpa_s->manual_scan_freqs);
1925  	wpa_s->manual_scan_freqs = freqs;
1926  
1927  	os_memcpy(wpa_s->ml_probe_bssid, selected->bssid, ETH_ALEN);
1928  
1929  	/*
1930  	 * In case the ML probe request is intended to retrieve information from
1931  	 * the transmitted BSS, the AP MLD ID should be included and should be
1932  	 * set to zero.
1933  	 * In case the ML probe requested is intended to retrieve information
1934  	 * from a non-transmitted BSS, the AP MLD ID should not be included.
1935  	 */
1936  	if (ap_mld_id)
1937  		wpa_s->ml_probe_mld_id = -1;
1938  	else
1939  		wpa_s->ml_probe_mld_id = 0;
1940  
1941  	if (ssid && ssid->ssid_len) {
1942  		os_free(wpa_s->ssids_from_scan_req);
1943  		wpa_s->num_ssids_from_scan_req = 0;
1944  
1945  		wpa_s->ssids_from_scan_req =
1946  			os_zalloc(sizeof(struct wpa_ssid_value));
1947  		if (wpa_s->ssids_from_scan_req) {
1948  			wpa_printf(MSG_DEBUG,
1949  				   "MLD: ML probe: With direct SSID");
1950  
1951  			wpa_s->num_ssids_from_scan_req = 1;
1952  			wpa_s->ssids_from_scan_req[0].ssid_len = ssid->ssid_len;
1953  			os_memcpy(wpa_s->ssids_from_scan_req[0].ssid,
1954  				  ssid->ssid, ssid->ssid_len);
1955  		}
1956  	}
1957  
1958  	wpa_s->ml_probe_links = missing_links;
1959  
1960  	wpa_s->normal_scans = 0;
1961  	wpa_s->scan_req = MANUAL_SCAN_REQ;
1962  	wpa_s->after_wps = 0;
1963  	wpa_s->known_wps_freq = 0;
1964  	wpa_supplicant_req_scan(wpa_s, 0, 0);
1965  
1966  	return 1;
1967  }
1968  
1969  
wpa_supplicant_connect(struct wpa_supplicant * wpa_s,struct wpa_bss * selected,struct wpa_ssid * ssid)1970  int wpa_supplicant_connect(struct wpa_supplicant *wpa_s,
1971  			   struct wpa_bss *selected,
1972  			   struct wpa_ssid *ssid)
1973  {
1974  #ifdef IEEE8021X_EAPOL
1975  	if ((eap_is_wps_pbc_enrollee(&ssid->eap) &&
1976  	     wpas_wps_partner_link_overlap_detect(wpa_s)) ||
1977  	    wpas_wps_scan_pbc_overlap(wpa_s, selected, ssid)) {
1978  		wpa_msg(wpa_s, MSG_INFO, WPS_EVENT_OVERLAP
1979  			"PBC session overlap");
1980  		wpas_notify_wps_event_pbc_overlap(wpa_s);
1981  		wpa_s->wps_overlap = true;
1982  #ifdef CONFIG_P2P
1983  		if (wpa_s->p2p_group_interface == P2P_GROUP_INTERFACE_CLIENT ||
1984  		    wpa_s->p2p_in_provisioning) {
1985  			eloop_register_timeout(0, 0, wpas_p2p_pbc_overlap_cb,
1986  					       wpa_s, NULL);
1987  			return -1;
1988  		}
1989  #endif /* CONFIG_P2P */
1990  
1991  #ifdef CONFIG_WPS
1992  		wpas_wps_pbc_overlap(wpa_s);
1993  		wpas_wps_cancel(wpa_s);
1994  #endif /* CONFIG_WPS */
1995  		return -1;
1996  	}
1997  #endif /* IEEE8021X_EAPOL */
1998  
1999  	wpa_msg(wpa_s, MSG_DEBUG,
2000  		"Considering connect request: reassociate: %d  selected: "
2001  		MACSTR "  bssid: " MACSTR "  pending: " MACSTR
2002  		"  wpa_state: %s  ssid=%p  current_ssid=%p",
2003  		wpa_s->reassociate, MAC2STR(selected->bssid),
2004  		MAC2STR(wpa_s->bssid), MAC2STR(wpa_s->pending_bssid),
2005  		wpa_supplicant_state_txt(wpa_s->wpa_state),
2006  		ssid, wpa_s->current_ssid);
2007  
2008  	/*
2009  	 * Do not trigger new association unless the BSSID has changed or if
2010  	 * reassociation is requested. If we are in process of associating with
2011  	 * the selected BSSID, do not trigger new attempt.
2012  	 */
2013  	if (wpa_s->reassociate ||
2014  	    (!ether_addr_equal(selected->bssid, wpa_s->bssid) &&
2015  	     ((wpa_s->wpa_state != WPA_ASSOCIATING &&
2016  	       wpa_s->wpa_state != WPA_AUTHENTICATING) ||
2017  	      (!is_zero_ether_addr(wpa_s->pending_bssid) &&
2018  	       !ether_addr_equal(selected->bssid, wpa_s->pending_bssid)) ||
2019  	      (is_zero_ether_addr(wpa_s->pending_bssid) &&
2020  	       ssid != wpa_s->current_ssid)))) {
2021  		if (wpa_supplicant_scard_init(wpa_s, ssid)) {
2022  			wpa_supplicant_req_new_scan(wpa_s, 10, 0);
2023  			return 0;
2024  		}
2025  
2026  		if (wpa_supplicant_connect_ml_missing(wpa_s, selected, ssid))
2027  			return 0;
2028  
2029  		wpa_msg(wpa_s, MSG_DEBUG, "Request association with " MACSTR,
2030  			MAC2STR(selected->bssid));
2031  		wpa_supplicant_associate(wpa_s, selected, ssid);
2032  	} else {
2033  		wpa_dbg(wpa_s, MSG_DEBUG, "Already associated or trying to "
2034  			"connect with the selected AP");
2035  	}
2036  
2037  	return 0;
2038  }
2039  
2040  
2041  static struct wpa_ssid *
wpa_supplicant_pick_new_network(struct wpa_supplicant * wpa_s)2042  wpa_supplicant_pick_new_network(struct wpa_supplicant *wpa_s)
2043  {
2044  	size_t prio;
2045  	struct wpa_ssid *ssid;
2046  
2047  	for (prio = 0; prio < wpa_s->conf->num_prio; prio++) {
2048  		for (ssid = wpa_s->conf->pssid[prio]; ssid; ssid = ssid->pnext)
2049  		{
2050  			if (wpas_network_disabled(wpa_s, ssid))
2051  				continue;
2052  #ifndef CONFIG_IBSS_RSN
2053  			if (ssid->mode == WPAS_MODE_IBSS &&
2054  			    !(ssid->key_mgmt & (WPA_KEY_MGMT_NONE |
2055  						WPA_KEY_MGMT_WPA_NONE))) {
2056  				wpa_msg(wpa_s, MSG_INFO,
2057  					"IBSS RSN not supported in the build - cannot use the profile for SSID '%s'",
2058  					wpa_ssid_txt(ssid->ssid,
2059  						     ssid->ssid_len));
2060  				continue;
2061  			}
2062  #endif /* !CONFIG_IBSS_RSN */
2063  			if (ssid->mode == WPAS_MODE_IBSS ||
2064  			    ssid->mode == WPAS_MODE_AP ||
2065  			    ssid->mode == WPAS_MODE_MESH)
2066  				return ssid;
2067  		}
2068  	}
2069  	return NULL;
2070  }
2071  
2072  
2073  /* TODO: move the rsn_preauth_scan_result*() to be called from notify.c based
2074   * on BSS added and BSS changed events */
wpa_supplicant_rsn_preauth_scan_results(struct wpa_supplicant * wpa_s)2075  static void wpa_supplicant_rsn_preauth_scan_results(
2076  	struct wpa_supplicant *wpa_s)
2077  {
2078  	struct wpa_bss *bss;
2079  
2080  	if (rsn_preauth_scan_results(wpa_s->wpa) < 0)
2081  		return;
2082  
2083  	dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
2084  		const u8 *ssid, *rsn;
2085  
2086  		ssid = wpa_bss_get_ie(bss, WLAN_EID_SSID);
2087  		if (ssid == NULL)
2088  			continue;
2089  
2090  		rsn = wpa_bss_get_rsne(wpa_s, bss, NULL, false);
2091  		if (rsn == NULL)
2092  			continue;
2093  
2094  		rsn_preauth_scan_result(wpa_s->wpa, bss->bssid, ssid, rsn);
2095  	}
2096  
2097  }
2098  
2099  
2100  #ifndef CONFIG_NO_ROAMING
2101  
wpas_get_snr_signal_info(u32 frequency,int avg_signal,int noise)2102  static int wpas_get_snr_signal_info(u32 frequency, int avg_signal, int noise)
2103  {
2104  	if (noise == WPA_INVALID_NOISE) {
2105  		if (IS_5GHZ(frequency)) {
2106  			noise = DEFAULT_NOISE_FLOOR_5GHZ;
2107  		} else if (is_6ghz_freq(frequency)) {
2108  			noise = DEFAULT_NOISE_FLOOR_6GHZ;
2109  		} else {
2110  			noise = DEFAULT_NOISE_FLOOR_2GHZ;
2111  		}
2112  	}
2113  	return avg_signal - noise;
2114  }
2115  
2116  
2117  static unsigned int
wpas_get_est_throughput_from_bss_snr(const struct wpa_supplicant * wpa_s,const struct wpa_bss * bss,int snr)2118  wpas_get_est_throughput_from_bss_snr(const struct wpa_supplicant *wpa_s,
2119  				     const struct wpa_bss *bss, int snr)
2120  {
2121  	int rate = wpa_bss_get_max_rate(bss);
2122  	const u8 *ies = wpa_bss_ie_ptr(bss);
2123  	size_t ie_len = bss->ie_len ? bss->ie_len : bss->beacon_ie_len;
2124  	enum chan_width max_cw = CHAN_WIDTH_UNKNOWN;
2125  
2126  	return wpas_get_est_tpt(wpa_s, ies, ie_len, rate, snr, bss->freq,
2127  				&max_cw);
2128  }
2129  
2130  
wpas_evaluate_band_score(int frequency)2131  static int wpas_evaluate_band_score(int frequency)
2132  {
2133  	if (is_6ghz_freq(frequency))
2134  		return 2;
2135  	if (IS_5GHZ(frequency))
2136  		return 1;
2137  	return 0;
2138  }
2139  
2140  
wpa_supplicant_need_to_roam_within_ess(struct wpa_supplicant * wpa_s,struct wpa_bss * current_bss,struct wpa_bss * selected,bool poll_current)2141  int wpa_supplicant_need_to_roam_within_ess(struct wpa_supplicant *wpa_s,
2142  					   struct wpa_bss *current_bss,
2143  					   struct wpa_bss *selected,
2144  					   bool poll_current)
2145  {
2146  	int min_diff, diff;
2147  	int cur_band_score, sel_band_score;
2148  	int to_5ghz, to_6ghz;
2149  	int cur_level, sel_level;
2150  	unsigned int cur_est, sel_est;
2151  	struct wpa_signal_info si;
2152  	int cur_snr = 0;
2153  	int ret = 0;
2154  	const u8 *cur_ies = wpa_bss_ie_ptr(current_bss);
2155  	const u8 *sel_ies = wpa_bss_ie_ptr(selected);
2156  	size_t cur_ie_len = current_bss->ie_len ? current_bss->ie_len :
2157  		current_bss->beacon_ie_len;
2158  	size_t sel_ie_len = selected->ie_len ? selected->ie_len :
2159  		selected->beacon_ie_len;
2160  
2161  	wpa_dbg(wpa_s, MSG_DEBUG, "Considering within-ESS reassociation");
2162  	wpa_dbg(wpa_s, MSG_DEBUG, "Current BSS: " MACSTR
2163  		" freq=%d level=%d snr=%d est_throughput=%u",
2164  		MAC2STR(current_bss->bssid),
2165  		current_bss->freq, current_bss->level,
2166  		current_bss->snr, current_bss->est_throughput);
2167  	wpa_dbg(wpa_s, MSG_DEBUG, "Selected BSS: " MACSTR
2168  		" freq=%d level=%d snr=%d est_throughput=%u",
2169  		MAC2STR(selected->bssid), selected->freq, selected->level,
2170  		selected->snr, selected->est_throughput);
2171  
2172  	if (wpas_ap_link_address(wpa_s, selected->bssid)) {
2173  		wpa_dbg(wpa_s, MSG_DEBUG, "MLD: associated to selected BSS");
2174  		return 0;
2175  	}
2176  
2177  	if (wpa_s->current_ssid->bssid_set &&
2178  	    ether_addr_equal(selected->bssid, wpa_s->current_ssid->bssid)) {
2179  		wpa_dbg(wpa_s, MSG_DEBUG, "Allow reassociation - selected BSS "
2180  			"has preferred BSSID");
2181  		return 1;
2182  	}
2183  
2184  	/*
2185  	 * Try to poll the signal from the driver since this will allow to get
2186  	 * more accurate values. In some cases, there can be big differences
2187  	 * between the RSSI of the Probe Response frames of the AP we are
2188  	 * associated with and the Beacon frames we hear from the same AP after
2189  	 * association. This can happen, e.g., when there are two antennas that
2190  	 * hear the AP very differently. If the driver chooses to hear the
2191  	 * Probe Response frames during the scan on the "bad" antenna because
2192  	 * it wants to save power, but knows to choose the other antenna after
2193  	 * association, we will hear our AP with a low RSSI as part of the
2194  	 * scan even when we can hear it decently on the other antenna. To cope
2195  	 * with this, ask the driver to teach us how it hears the AP. Also, the
2196  	 * scan results may be a bit old, since we can very quickly get fresh
2197  	 * information about our currently associated AP.
2198  	 */
2199  	if (poll_current && wpa_drv_signal_poll(wpa_s, &si) == 0 &&
2200  	    (si.data.avg_beacon_signal || si.data.avg_signal)) {
2201  		/*
2202  		 * Normalize avg_signal to the RSSI over 20 MHz, as the
2203  		 * throughput is estimated based on the RSSI over 20 MHz
2204  		 */
2205  		cur_level = si.data.avg_beacon_signal ?
2206  			si.data.avg_beacon_signal :
2207  			(si.data.avg_signal -
2208  			 wpas_channel_width_rssi_bump(cur_ies, cur_ie_len,
2209  						      si.chanwidth));
2210  		cur_snr = wpas_get_snr_signal_info(si.frequency, cur_level,
2211  						   si.current_noise);
2212  
2213  		cur_est = wpas_get_est_throughput_from_bss_snr(wpa_s,
2214  							       current_bss,
2215  							       cur_snr);
2216  		wpa_dbg(wpa_s, MSG_DEBUG,
2217  			"Using signal poll values for the current BSS: level=%d snr=%d est_throughput=%u",
2218  			cur_level, cur_snr, cur_est);
2219  	} else {
2220  		/* Level and SNR are measured over 20 MHz channel */
2221  		cur_level = current_bss->level;
2222  		cur_snr = current_bss->snr;
2223  		cur_est = current_bss->est_throughput;
2224  	}
2225  
2226  	/* Adjust the SNR of BSSes based on the channel width. */
2227  	cur_level += wpas_channel_width_rssi_bump(cur_ies, cur_ie_len,
2228  						  current_bss->max_cw);
2229  	cur_snr = wpas_adjust_snr_by_chanwidth(cur_ies, cur_ie_len,
2230  					       current_bss->max_cw, cur_snr);
2231  
2232  	sel_est = selected->est_throughput;
2233  	sel_level = selected->level +
2234  		wpas_channel_width_rssi_bump(sel_ies, sel_ie_len,
2235  					     selected->max_cw);
2236  
2237  	if (sel_est > cur_est + 5000) {
2238  		wpa_dbg(wpa_s, MSG_DEBUG,
2239  			"Allow reassociation - selected BSS has better estimated throughput");
2240  		return 1;
2241  	}
2242  
2243  	to_5ghz = selected->freq > 4000 && current_bss->freq < 4000;
2244  	to_6ghz = is_6ghz_freq(selected->freq) &&
2245  		!is_6ghz_freq(current_bss->freq);
2246  
2247  	if (cur_level < 0 &&
2248  	    cur_level > sel_level + to_5ghz * 2 + to_6ghz * 2 &&
2249  	    sel_est < cur_est * 1.2) {
2250  		wpa_dbg(wpa_s, MSG_DEBUG, "Skip roam - Current BSS has better "
2251  			"signal level");
2252  		return 0;
2253  	}
2254  
2255  	if (cur_est > sel_est + 5000) {
2256  		wpa_dbg(wpa_s, MSG_DEBUG,
2257  			"Skip roam - Current BSS has better estimated throughput");
2258  		return 0;
2259  	}
2260  
2261  	if (cur_snr > GREAT_SNR) {
2262  		wpa_dbg(wpa_s, MSG_DEBUG,
2263  			"Skip roam - Current BSS has good SNR (%u > %u)",
2264  			cur_snr, GREAT_SNR);
2265  		return 0;
2266  	}
2267  
2268  	if (cur_level < -85) /* ..-86 dBm */
2269  		min_diff = 1;
2270  	else if (cur_level < -80) /* -85..-81 dBm */
2271  		min_diff = 2;
2272  	else if (cur_level < -75) /* -80..-76 dBm */
2273  		min_diff = 3;
2274  	else if (cur_level < -70) /* -75..-71 dBm */
2275  		min_diff = 4;
2276  	else if (cur_level < 0) /* -70..-1 dBm */
2277  		min_diff = 5;
2278  	else /* unspecified units (not in dBm) */
2279  		min_diff = 2;
2280  
2281  	if (cur_est > sel_est * 1.5)
2282  		min_diff += 10;
2283  	else if (cur_est > sel_est * 1.2)
2284  		min_diff += 5;
2285  	else if (cur_est > sel_est * 1.1)
2286  		min_diff += 2;
2287  	else if (cur_est > sel_est)
2288  		min_diff++;
2289  	else if (sel_est > cur_est * 1.5)
2290  		min_diff -= 10;
2291  	else if (sel_est > cur_est * 1.2)
2292  		min_diff -= 5;
2293  	else if (sel_est > cur_est * 1.1)
2294  		min_diff -= 2;
2295  	else if (sel_est > cur_est)
2296  		min_diff--;
2297  
2298  	cur_band_score = wpas_evaluate_band_score(current_bss->freq);
2299  	sel_band_score = wpas_evaluate_band_score(selected->freq);
2300  	min_diff += (cur_band_score - sel_band_score) * 2;
2301  	if (wpa_s->signal_threshold && cur_level <= wpa_s->signal_threshold &&
2302  	    sel_level > wpa_s->signal_threshold)
2303  		min_diff -= 2;
2304  	diff = sel_level - cur_level;
2305  	if (diff < min_diff) {
2306  		wpa_dbg(wpa_s, MSG_DEBUG,
2307  			"Skip roam - too small difference in signal level (%d < %d)",
2308  			diff, min_diff);
2309  		ret = 0;
2310  	} else {
2311  		wpa_dbg(wpa_s, MSG_DEBUG,
2312  			"Allow reassociation due to difference in signal level (%d >= %d)",
2313  			diff, min_diff);
2314  		ret = 1;
2315  	}
2316  	wpa_msg_ctrl(wpa_s, MSG_INFO, "%scur_bssid=" MACSTR
2317  		     " cur_freq=%d cur_level=%d cur_est=%d sel_bssid=" MACSTR
2318  		     " sel_freq=%d sel_level=%d sel_est=%d",
2319  		     ret ? WPA_EVENT_DO_ROAM : WPA_EVENT_SKIP_ROAM,
2320  		     MAC2STR(current_bss->bssid),
2321  		     current_bss->freq, cur_level, cur_est,
2322  		     MAC2STR(selected->bssid),
2323  		     selected->freq, sel_level, sel_est);
2324  	return ret;
2325  }
2326  
2327  #endif /* CONFIG_NO_ROAMING */
2328  
2329  
wpa_supplicant_need_to_roam(struct wpa_supplicant * wpa_s,struct wpa_bss * selected,struct wpa_ssid * ssid)2330  static int wpa_supplicant_need_to_roam(struct wpa_supplicant *wpa_s,
2331  				       struct wpa_bss *selected,
2332  				       struct wpa_ssid *ssid)
2333  {
2334  	struct wpa_bss *current_bss = NULL;
2335  	const u8 *bssid;
2336  
2337  	if (wpa_s->reassociate)
2338  		return 1; /* explicit request to reassociate */
2339  	if (wpa_s->wpa_state < WPA_ASSOCIATED)
2340  		return 1; /* we are not associated; continue */
2341  	if (wpa_s->current_ssid == NULL)
2342  		return 1; /* unknown current SSID */
2343  	if (wpa_s->current_ssid != ssid)
2344  		return 1; /* different network block */
2345  
2346  	if (wpas_driver_bss_selection(wpa_s))
2347  		return 0; /* Driver-based roaming */
2348  
2349  	if (wpa_s->valid_links)
2350  		bssid = wpa_s->links[wpa_s->mlo_assoc_link_id].bssid;
2351  	else
2352  		bssid = wpa_s->bssid;
2353  
2354  	if (wpa_s->current_ssid->ssid)
2355  		current_bss = wpa_bss_get(wpa_s, bssid,
2356  					  wpa_s->current_ssid->ssid,
2357  					  wpa_s->current_ssid->ssid_len);
2358  	if (!current_bss)
2359  		current_bss = wpa_bss_get_bssid(wpa_s, bssid);
2360  
2361  	if (!current_bss)
2362  		return 1; /* current BSS not seen in scan results */
2363  
2364  	if (current_bss == selected)
2365  		return 0;
2366  
2367  	if (selected->last_update_idx > current_bss->last_update_idx)
2368  		return 1; /* current BSS not seen in the last scan */
2369  
2370  #ifndef CONFIG_NO_ROAMING
2371  	return wpa_supplicant_need_to_roam_within_ess(wpa_s, current_bss,
2372  						      selected, true);
2373  #else /* CONFIG_NO_ROAMING */
2374  	return 0;
2375  #endif /* CONFIG_NO_ROAMING */
2376  }
2377  
2378  
wpas_trigger_6ghz_scan(struct wpa_supplicant * wpa_s,union wpa_event_data * data)2379  static int wpas_trigger_6ghz_scan(struct wpa_supplicant *wpa_s,
2380  				  union wpa_event_data *data)
2381  {
2382  	struct wpa_driver_scan_params params;
2383  	unsigned int j;
2384  
2385  	wpa_dbg(wpa_s, MSG_INFO, "Triggering 6GHz-only scan");
2386  	os_memset(&params, 0, sizeof(params));
2387  	params.non_coloc_6ghz = wpa_s->last_scan_non_coloc_6ghz;
2388  	for (j = 0; j < data->scan_info.num_ssids; j++)
2389  		params.ssids[j] = data->scan_info.ssids[j];
2390  	params.num_ssids = data->scan_info.num_ssids;
2391  	wpa_add_scan_freqs_list(wpa_s, HOSTAPD_MODE_IEEE80211A, &params,
2392  				true, false, false);
2393  	if (!wpa_supplicant_trigger_scan(wpa_s, &params, true, true)) {
2394  		wpa_s->scan_in_progress_6ghz = true;
2395  		wpas_notify_scan_in_progress_6ghz(wpa_s);
2396  		os_free(params.freqs);
2397  		return 1;
2398  	}
2399  	wpa_dbg(wpa_s, MSG_INFO, "Failed to trigger 6GHz-only scan");
2400  	os_free(params.freqs);
2401  	return 0;
2402  }
2403  
2404  
wpas_short_ssid_match(struct wpa_supplicant * wpa_s,struct wpa_scan_results * scan_res)2405  static bool wpas_short_ssid_match(struct wpa_supplicant *wpa_s,
2406  				  struct wpa_scan_results *scan_res)
2407  {
2408  	size_t i;
2409  	struct wpa_ssid *ssid = wpa_s->current_ssid;
2410  	u32 current_ssid_short = ieee80211_crc32(ssid->ssid, ssid->ssid_len);
2411  
2412  	for (i = 0; i < scan_res->num; i++) {
2413  		struct wpa_scan_res *res = scan_res->res[i];
2414  		const u8 *rnr_ie, *ie_end;
2415  		const struct ieee80211_neighbor_ap_info *info;
2416  		size_t left;
2417  
2418  		rnr_ie = wpa_scan_get_ie(res, WLAN_EID_REDUCED_NEIGHBOR_REPORT);
2419  		if (!rnr_ie)
2420  			continue;
2421  
2422  		ie_end = rnr_ie + 2 + rnr_ie[1];
2423  		rnr_ie += 2;
2424  
2425  		left = ie_end - rnr_ie;
2426  		if (left < sizeof(struct ieee80211_neighbor_ap_info))
2427  			continue;
2428  
2429  		info = (const struct ieee80211_neighbor_ap_info *) rnr_ie;
2430  		if (info->tbtt_info_len < 11)
2431  			continue; /* short SSID not included */
2432  		left -= sizeof(struct ieee80211_neighbor_ap_info);
2433  		rnr_ie += sizeof(struct ieee80211_neighbor_ap_info);
2434  
2435  		while (left >= info->tbtt_info_len && rnr_ie + 11 <= ie_end) {
2436  			/* Skip TBTT offset and BSSID */
2437  			u32 short_ssid = WPA_GET_LE32(rnr_ie + 1 + ETH_ALEN);
2438  
2439  			if (short_ssid == current_ssid_short)
2440  				return true;
2441  
2442  			left -= info->tbtt_info_len;
2443  			rnr_ie += info->tbtt_info_len;
2444  		}
2445  	}
2446  
2447  	return false;
2448  }
2449  
2450  
2451  /*
2452   * Return a negative value if no scan results could be fetched or if scan
2453   * results should not be shared with other virtual interfaces.
2454   * Return 0 if scan results were fetched and may be shared with other
2455   * interfaces.
2456   * Return 1 if scan results may be shared with other virtual interfaces but may
2457   * not trigger any operations.
2458   * Return 2 if the interface was removed and cannot be used.
2459   */
_wpa_supplicant_event_scan_results(struct wpa_supplicant * wpa_s,union wpa_event_data * data,int own_request,int update_only)2460  static int _wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s,
2461  					      union wpa_event_data *data,
2462  					      int own_request, int update_only)
2463  {
2464  	struct wpa_scan_results *scan_res = NULL;
2465  	int ret = 0;
2466  	int ap = 0;
2467  	bool trigger_6ghz_scan;
2468  	bool short_ssid_match_found = false;
2469  #ifndef CONFIG_NO_RANDOM_POOL
2470  	size_t i, num;
2471  #endif /* CONFIG_NO_RANDOM_POOL */
2472  
2473  #ifdef CONFIG_AP
2474  	if (wpa_s->ap_iface)
2475  		ap = 1;
2476  #endif /* CONFIG_AP */
2477  
2478  	trigger_6ghz_scan = wpa_s->crossed_6ghz_dom &&
2479  		wpa_s->last_scan_all_chan;
2480  	wpa_s->crossed_6ghz_dom = false;
2481  	wpa_s->last_scan_all_chan = false;
2482  
2483  	wpa_supplicant_notify_scanning(wpa_s, 0);
2484  
2485  	scan_res = wpa_supplicant_get_scan_results(wpa_s,
2486  						   data ? &data->scan_info :
2487  						   NULL, 1, NULL);
2488  
2489  	if (wpa_s->scan_in_progress_6ghz) {
2490  		wpa_s->scan_in_progress_6ghz = false;
2491  		wpas_notify_scan_in_progress_6ghz(wpa_s);
2492  	}
2493  
2494  	if (scan_res == NULL) {
2495  		if (wpa_s->conf->ap_scan == 2 || ap ||
2496  		    wpa_s->scan_res_handler == scan_only_handler)
2497  			return -1;
2498  		if (!own_request)
2499  			return -1;
2500  		if (data && data->scan_info.external_scan)
2501  			return -1;
2502  		if (wpa_s->scan_res_fail_handler) {
2503  			void (*handler)(struct wpa_supplicant *wpa_s);
2504  
2505  			handler = wpa_s->scan_res_fail_handler;
2506  			wpa_s->scan_res_fail_handler = NULL;
2507  			handler(wpa_s);
2508  		} else {
2509  			wpa_dbg(wpa_s, MSG_DEBUG,
2510  				"Failed to get scan results - try scanning again");
2511  			wpa_supplicant_req_new_scan(wpa_s, 1, 0);
2512  		}
2513  
2514  		ret = -1;
2515  		goto scan_work_done;
2516  	}
2517  
2518  #ifndef CONFIG_NO_RANDOM_POOL
2519  	num = scan_res->num;
2520  	if (num > 10)
2521  		num = 10;
2522  	for (i = 0; i < num; i++) {
2523  		u8 buf[5];
2524  		struct wpa_scan_res *res = scan_res->res[i];
2525  		buf[0] = res->bssid[5];
2526  		buf[1] = res->qual & 0xff;
2527  		buf[2] = res->noise & 0xff;
2528  		buf[3] = res->level & 0xff;
2529  		buf[4] = res->tsf & 0xff;
2530  		random_add_randomness(buf, sizeof(buf));
2531  	}
2532  #endif /* CONFIG_NO_RANDOM_POOL */
2533  
2534  	if (data) {
2535  		size_t idx;
2536  
2537  		wpa_s->last_scan_external = data->scan_info.external_scan;
2538  		wpa_s->last_scan_num_ssids = data->scan_info.num_ssids;
2539  		for (idx = 0; idx < wpa_s->last_scan_num_ssids; idx++) {
2540  			/* Copy the SSID and its length */
2541  			if (idx >= WPAS_MAX_SCAN_SSIDS ||
2542  			    data->scan_info.ssids[idx].ssid_len > SSID_MAX_LEN)
2543  				continue;
2544  
2545  			os_memcpy(wpa_s->last_scan_ssids[idx].ssid,
2546  				  data->scan_info.ssids[idx].ssid,
2547  				  data->scan_info.ssids[idx].ssid_len);
2548  			wpa_s->last_scan_ssids[idx].ssid_len =
2549  				data->scan_info.ssids[idx].ssid_len;
2550  		}
2551  	} else {
2552  		wpa_s->last_scan_external = false;
2553  		wpa_s->last_scan_num_ssids = 0;
2554  	}
2555  
2556  	if (update_only) {
2557  		ret = 1;
2558  		goto scan_work_done;
2559  	}
2560  
2561  	if (own_request && wpa_s->scan_res_handler &&
2562  	    !(data && data->scan_info.external_scan)) {
2563  		void (*scan_res_handler)(struct wpa_supplicant *wpa_s,
2564  					 struct wpa_scan_results *scan_res);
2565  
2566  		scan_res_handler = wpa_s->scan_res_handler;
2567  		wpa_s->scan_res_handler = NULL;
2568  		scan_res_handler(wpa_s, scan_res);
2569  		ret = 1;
2570  		goto scan_work_done;
2571  	}
2572  
2573  	wpa_dbg(wpa_s, MSG_DEBUG, "New scan results available (own=%u ext=%u)",
2574  		wpa_s->own_scan_running,
2575  		data ? data->scan_info.external_scan : 0);
2576  	if (wpa_s->last_scan_req == MANUAL_SCAN_REQ &&
2577  	    wpa_s->manual_scan_use_id && wpa_s->own_scan_running &&
2578  	    own_request && !(data && data->scan_info.external_scan)) {
2579  		wpa_msg_ctrl(wpa_s, MSG_INFO, WPA_EVENT_SCAN_RESULTS "id=%u",
2580  			     wpa_s->manual_scan_id);
2581  		wpa_s->manual_scan_use_id = 0;
2582  	} else {
2583  		wpa_msg_ctrl(wpa_s, MSG_INFO, WPA_EVENT_SCAN_RESULTS);
2584  	}
2585  	wpas_notify_scan_results(wpa_s);
2586  
2587  	wpas_notify_scan_done(wpa_s, 1);
2588  
2589  	if (ap) {
2590  		wpa_dbg(wpa_s, MSG_DEBUG, "Ignore scan results in AP mode");
2591  #ifdef CONFIG_AP
2592  		if (wpa_s->ap_iface->scan_cb)
2593  			wpa_s->ap_iface->scan_cb(wpa_s->ap_iface);
2594  #endif /* CONFIG_AP */
2595  		goto scan_work_done;
2596  	}
2597  
2598  	if (data && data->scan_info.external_scan) {
2599  		wpa_dbg(wpa_s, MSG_DEBUG, "Do not use results from externally requested scan operation for network selection");
2600  		wpa_scan_results_free(scan_res);
2601  		return 0;
2602  	}
2603  
2604  	if (sme_proc_obss_scan(wpa_s) > 0)
2605  		goto scan_work_done;
2606  
2607  #ifndef CONFIG_NO_RRM
2608  	if (own_request && data &&
2609  	    wpas_beacon_rep_scan_process(wpa_s, scan_res, &data->scan_info) > 0)
2610  		goto scan_work_done;
2611  #endif /* CONFIG_NO_RRM */
2612  
2613  	if (ml_link_probe_scan(wpa_s))
2614  		goto scan_work_done;
2615  
2616  	if ((wpa_s->conf->ap_scan == 2 && !wpas_wps_searching(wpa_s)))
2617  		goto scan_work_done;
2618  
2619  	if (autoscan_notify_scan(wpa_s, scan_res))
2620  		goto scan_work_done;
2621  
2622  	if (wpa_s->disconnected) {
2623  		wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
2624  		goto scan_work_done;
2625  	}
2626  
2627  	if (!wpas_driver_bss_selection(wpa_s) &&
2628  	    bgscan_notify_scan(wpa_s, scan_res) == 1)
2629  		goto scan_work_done;
2630  
2631  	wpas_wps_update_ap_info(wpa_s, scan_res);
2632  
2633  	if (wnm_scan_process(wpa_s, false) > 0)
2634  		goto scan_work_done;
2635  
2636  	if (wpa_s->wpa_state >= WPA_AUTHENTICATING &&
2637  	    wpa_s->wpa_state < WPA_COMPLETED)
2638  		goto scan_work_done;
2639  
2640  	if (wpa_s->current_ssid && trigger_6ghz_scan && own_request && data &&
2641  	    wpas_short_ssid_match(wpa_s, scan_res)) {
2642  		wpa_dbg(wpa_s, MSG_INFO, "Short SSID match in scan results");
2643  		short_ssid_match_found = true;
2644  	}
2645  
2646  	wpa_scan_results_free(scan_res);
2647  
2648  	if (own_request && wpa_s->scan_work) {
2649  		struct wpa_radio_work *work = wpa_s->scan_work;
2650  		wpa_s->scan_work = NULL;
2651  		radio_work_done(work);
2652  	}
2653  
2654  	os_free(wpa_s->last_scan_freqs);
2655  	wpa_s->last_scan_freqs = NULL;
2656  	wpa_s->num_last_scan_freqs = 0;
2657  	if (own_request && data &&
2658  	    data->scan_info.freqs && data->scan_info.num_freqs) {
2659  		wpa_s->last_scan_freqs = os_malloc(sizeof(int) *
2660  						   data->scan_info.num_freqs);
2661  		if (wpa_s->last_scan_freqs) {
2662  			os_memcpy(wpa_s->last_scan_freqs,
2663  				  data->scan_info.freqs,
2664  				  sizeof(int) * data->scan_info.num_freqs);
2665  			wpa_s->num_last_scan_freqs = data->scan_info.num_freqs;
2666  		}
2667  	}
2668  
2669  	if (wpa_s->supp_pbc_active && !wpas_wps_partner_link_scan_done(wpa_s))
2670  		return ret;
2671  
2672  	if (short_ssid_match_found && wpas_trigger_6ghz_scan(wpa_s, data) > 0)
2673  		return 1;
2674  
2675  	return wpas_select_network_from_last_scan(wpa_s, 1, own_request,
2676  						  trigger_6ghz_scan, data);
2677  
2678  scan_work_done:
2679  	wpa_scan_results_free(scan_res);
2680  	if (own_request && wpa_s->scan_work) {
2681  		struct wpa_radio_work *work = wpa_s->scan_work;
2682  		wpa_s->scan_work = NULL;
2683  		radio_work_done(work);
2684  	}
2685  	return ret;
2686  }
2687  
2688  
2689  /**
2690   * Select a network from the last scan
2691   * @wpa_s: Pointer to wpa_supplicant data
2692   * @new_scan: Whether this function was called right after a scan has finished
2693   * @own_request: Whether the scan was requested by this interface
2694   * @trigger_6ghz_scan: Whether to trigger a 6ghz-only scan when applicable
2695   * @data: Scan data from scan that finished if applicable
2696   *
2697   * See _wpa_supplicant_event_scan_results() for return values.
2698   */
wpas_select_network_from_last_scan(struct wpa_supplicant * wpa_s,int new_scan,int own_request,bool trigger_6ghz_scan,union wpa_event_data * data)2699  static int wpas_select_network_from_last_scan(struct wpa_supplicant *wpa_s,
2700  					      int new_scan, int own_request,
2701  					      bool trigger_6ghz_scan,
2702  					      union wpa_event_data *data)
2703  {
2704  	struct wpa_bss *selected;
2705  	struct wpa_ssid *ssid = NULL;
2706  	int time_to_reenable = wpas_reenabled_network_time(wpa_s);
2707  
2708  	if (time_to_reenable > 0) {
2709  		wpa_dbg(wpa_s, MSG_DEBUG,
2710  			"Postpone network selection by %d seconds since all networks are disabled",
2711  			time_to_reenable);
2712  		eloop_cancel_timeout(wpas_network_reenabled, wpa_s, NULL);
2713  		eloop_register_timeout(time_to_reenable, 0,
2714  				       wpas_network_reenabled, wpa_s, NULL);
2715  		return 0;
2716  	}
2717  
2718  	if (wpa_s->p2p_mgmt)
2719  		return 0; /* no normal connection on p2p_mgmt interface */
2720  
2721  	wpa_s->owe_transition_search = 0;
2722  #ifdef CONFIG_OWE
2723  	os_free(wpa_s->owe_trans_scan_freq);
2724  	wpa_s->owe_trans_scan_freq = NULL;
2725  #endif /* CONFIG_OWE */
2726  	selected = wpa_supplicant_pick_network(wpa_s, &ssid);
2727  
2728  #ifdef CONFIG_MESH
2729  	if (wpa_s->ifmsh) {
2730  		wpa_msg(wpa_s, MSG_INFO,
2731  			"Avoiding join because we already joined a mesh group");
2732  		return 0;
2733  	}
2734  #endif /* CONFIG_MESH */
2735  
2736  	if (selected) {
2737  		int skip;
2738  		skip = !wpa_supplicant_need_to_roam(wpa_s, selected, ssid);
2739  		if (skip) {
2740  			if (new_scan)
2741  				wpa_supplicant_rsn_preauth_scan_results(wpa_s);
2742  			return 0;
2743  		}
2744  
2745  		wpa_s->suitable_network++;
2746  
2747  		if (ssid != wpa_s->current_ssid &&
2748  		    wpa_s->wpa_state >= WPA_AUTHENTICATING) {
2749  			wpa_s->own_disconnect_req = 1;
2750  			wpa_supplicant_deauthenticate(
2751  				wpa_s, WLAN_REASON_DEAUTH_LEAVING);
2752  		}
2753  
2754  		if (wpa_supplicant_connect(wpa_s, selected, ssid) < 0) {
2755  			wpa_dbg(wpa_s, MSG_DEBUG, "Connect failed");
2756  			return -1;
2757  		}
2758  		wpa_s->supp_pbc_active = false;
2759  
2760  		if (new_scan)
2761  			wpa_supplicant_rsn_preauth_scan_results(wpa_s);
2762  		/*
2763  		 * Do not allow other virtual radios to trigger operations based
2764  		 * on these scan results since we do not want them to start
2765  		 * other associations at the same time.
2766  		 */
2767  		return 1;
2768  	} else {
2769  		wpa_s->no_suitable_network++;
2770  		wpa_dbg(wpa_s, MSG_DEBUG, "No suitable network found");
2771  		ssid = wpa_supplicant_pick_new_network(wpa_s);
2772  		if (ssid) {
2773  			wpa_dbg(wpa_s, MSG_DEBUG, "Setup a new network");
2774  			wpa_supplicant_associate(wpa_s, NULL, ssid);
2775  			if (new_scan)
2776  				wpa_supplicant_rsn_preauth_scan_results(wpa_s);
2777  		} else if (own_request) {
2778  			if (wpa_s->support_6ghz && trigger_6ghz_scan && data &&
2779  			    wpas_trigger_6ghz_scan(wpa_s, data) > 0)
2780  				return 1;
2781  
2782  			/*
2783  			 * No SSID found. If SCAN results are as a result of
2784  			 * own scan request and not due to a scan request on
2785  			 * another shared interface, try another scan.
2786  			 */
2787  			int timeout_sec = wpa_s->scan_interval;
2788  			int timeout_usec = 0;
2789  #ifdef CONFIG_P2P
2790  			int res;
2791  
2792  			res = wpas_p2p_scan_no_go_seen(wpa_s);
2793  			if (res == 2)
2794  				return 2;
2795  			if (res == 1)
2796  				return 0;
2797  
2798  			if (wpas_p2p_retry_limit_exceeded(wpa_s))
2799  				return 0;
2800  
2801  			if (wpa_s->p2p_in_provisioning ||
2802  			    wpa_s->show_group_started ||
2803  			    wpa_s->p2p_in_invitation) {
2804  				/*
2805  				 * Use shorter wait during P2P Provisioning
2806  				 * state and during P2P join-a-group operation
2807  				 * to speed up group formation.
2808  				 */
2809  				timeout_sec = 0;
2810  				timeout_usec = 250000;
2811  				wpa_supplicant_req_new_scan(wpa_s, timeout_sec,
2812  							    timeout_usec);
2813  				return 0;
2814  			}
2815  #endif /* CONFIG_P2P */
2816  #ifdef CONFIG_INTERWORKING
2817  			if (wpa_s->conf->auto_interworking &&
2818  			    wpa_s->conf->interworking &&
2819  			    wpa_s->conf->cred) {
2820  				wpa_dbg(wpa_s, MSG_DEBUG, "Interworking: "
2821  					"start ANQP fetch since no matching "
2822  					"networks found");
2823  				wpa_s->network_select = 1;
2824  				wpa_s->auto_network_select = 1;
2825  				interworking_start_fetch_anqp(wpa_s);
2826  				return 1;
2827  			}
2828  #endif /* CONFIG_INTERWORKING */
2829  #ifdef CONFIG_WPS
2830  			if (wpa_s->after_wps > 0 || wpas_wps_searching(wpa_s)) {
2831  				wpa_dbg(wpa_s, MSG_DEBUG, "Use shorter wait during WPS processing");
2832  				timeout_sec = 0;
2833  				timeout_usec = 500000;
2834  				wpa_supplicant_req_new_scan(wpa_s, timeout_sec,
2835  							    timeout_usec);
2836  				return 0;
2837  			}
2838  #endif /* CONFIG_WPS */
2839  #ifdef CONFIG_OWE
2840  			if (wpa_s->owe_transition_search) {
2841  				wpa_dbg(wpa_s, MSG_DEBUG,
2842  					"OWE: Use shorter wait during transition mode search");
2843  				timeout_sec = 0;
2844  				timeout_usec = 500000;
2845  				if (wpa_s->owe_trans_scan_freq) {
2846  					os_free(wpa_s->next_scan_freqs);
2847  					wpa_s->next_scan_freqs =
2848  						wpa_s->owe_trans_scan_freq;
2849  					wpa_s->owe_trans_scan_freq = NULL;
2850  					timeout_usec = 100000;
2851  				}
2852  				wpa_supplicant_req_new_scan(wpa_s, timeout_sec,
2853  							    timeout_usec);
2854  				return 0;
2855  			}
2856  #endif /* CONFIG_OWE */
2857  			if (wpa_supplicant_req_sched_scan(wpa_s))
2858  				wpa_supplicant_req_new_scan(wpa_s, timeout_sec,
2859  							    timeout_usec);
2860  
2861  			wpa_msg_ctrl(wpa_s, MSG_INFO,
2862  				     WPA_EVENT_NETWORK_NOT_FOUND);
2863  		}
2864  	}
2865  	return 0;
2866  }
2867  
2868  
wpa_supplicant_event_scan_results(struct wpa_supplicant * wpa_s,union wpa_event_data * data)2869  static int wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s,
2870  					     union wpa_event_data *data)
2871  {
2872  	struct wpa_supplicant *ifs;
2873  	int res;
2874  
2875  	res = _wpa_supplicant_event_scan_results(wpa_s, data, 1, 0);
2876  	if (res == 2) {
2877  		/*
2878  		 * Interface may have been removed, so must not dereference
2879  		 * wpa_s after this.
2880  		 */
2881  		return 1;
2882  	}
2883  
2884  	if (res < 0) {
2885  		/*
2886  		 * If no scan results could be fetched, then no need to
2887  		 * notify those interfaces that did not actually request
2888  		 * this scan. Similarly, if scan results started a new operation on this
2889  		 * interface, do not notify other interfaces to avoid concurrent
2890  		 * operations during a connection attempt.
2891  		 */
2892  		return 0;
2893  	}
2894  
2895  	/*
2896  	 * Check other interfaces to see if they share the same radio. If
2897  	 * so, they get updated with this same scan info.
2898  	 */
2899  	dl_list_for_each(ifs, &wpa_s->radio->ifaces, struct wpa_supplicant,
2900  			 radio_list) {
2901  		if (ifs != wpa_s) {
2902  			wpa_printf(MSG_DEBUG, "%s: Updating scan results from "
2903  				   "sibling", ifs->ifname);
2904  			res = _wpa_supplicant_event_scan_results(ifs, data, 0,
2905  								 res > 0);
2906  			if (res < 0)
2907  				return 0;
2908  		}
2909  	}
2910  
2911  	return 0;
2912  }
2913  
2914  #endif /* CONFIG_NO_SCAN_PROCESSING */
2915  
2916  
wpa_supplicant_fast_associate(struct wpa_supplicant * wpa_s)2917  int wpa_supplicant_fast_associate(struct wpa_supplicant *wpa_s)
2918  {
2919  #ifdef CONFIG_NO_SCAN_PROCESSING
2920  	return -1;
2921  #else /* CONFIG_NO_SCAN_PROCESSING */
2922  	struct os_reltime now;
2923  
2924  	wpa_s->ignore_post_flush_scan_res = 0;
2925  
2926  	if (wpa_s->last_scan_res_used == 0)
2927  		return -1;
2928  
2929  	os_get_reltime(&now);
2930  	if (os_reltime_expired(&now, &wpa_s->last_scan,
2931  			       wpa_s->conf->scan_res_valid_for_connect)) {
2932  		wpa_printf(MSG_DEBUG, "Fast associate: Old scan results");
2933  		return -1;
2934  	} else if (wpa_s->crossed_6ghz_dom) {
2935  		wpa_printf(MSG_DEBUG, "Fast associate: Crossed 6 GHz domain");
2936  		return -1;
2937  	}
2938  
2939  	return wpas_select_network_from_last_scan(wpa_s, 0, 1, false, NULL);
2940  #endif /* CONFIG_NO_SCAN_PROCESSING */
2941  }
2942  
2943  
wpa_wps_supplicant_fast_associate(struct wpa_supplicant * wpa_s)2944  int wpa_wps_supplicant_fast_associate(struct wpa_supplicant *wpa_s)
2945  {
2946  #ifdef CONFIG_NO_SCAN_PROCESSING
2947  	return -1;
2948  #else /* CONFIG_NO_SCAN_PROCESSING */
2949  	return wpas_select_network_from_last_scan(wpa_s, 1, 1, false, NULL);
2950  #endif /* CONFIG_NO_SCAN_PROCESSING */
2951  }
2952  
2953  
2954  #ifdef CONFIG_WNM
2955  
wnm_bss_keep_alive(void * eloop_ctx,void * sock_ctx)2956  static void wnm_bss_keep_alive(void *eloop_ctx, void *sock_ctx)
2957  {
2958  	struct wpa_supplicant *wpa_s = eloop_ctx;
2959  
2960  	if (wpa_s->wpa_state < WPA_ASSOCIATED)
2961  		return;
2962  
2963  	if (!wpa_s->no_keep_alive) {
2964  		wpa_printf(MSG_DEBUG, "WNM: Send keep-alive to AP " MACSTR,
2965  			   MAC2STR(wpa_s->bssid));
2966  		/* TODO: could skip this if normal data traffic has been sent */
2967  		/* TODO: Consider using some more appropriate data frame for
2968  		 * this */
2969  		if (wpa_s->l2)
2970  			l2_packet_send(wpa_s->l2, wpa_s->bssid, 0x0800,
2971  				       (u8 *) "", 0);
2972  	}
2973  
2974  #ifdef CONFIG_SME
2975  	if (wpa_s->sme.bss_max_idle_period) {
2976  		unsigned int msec;
2977  		msec = wpa_s->sme.bss_max_idle_period * 1024; /* times 1000 */
2978  		if (msec > 100)
2979  			msec -= 100;
2980  		eloop_register_timeout(msec / 1000, msec % 1000 * 1000,
2981  				       wnm_bss_keep_alive, wpa_s, NULL);
2982  	}
2983  #endif /* CONFIG_SME */
2984  }
2985  
2986  
wnm_process_assoc_resp(struct wpa_supplicant * wpa_s,const u8 * ies,size_t ies_len)2987  static void wnm_process_assoc_resp(struct wpa_supplicant *wpa_s,
2988  				   const u8 *ies, size_t ies_len)
2989  {
2990  	struct ieee802_11_elems elems;
2991  
2992  	if (ies == NULL)
2993  		return;
2994  
2995  	if (ieee802_11_parse_elems(ies, ies_len, &elems, 1) == ParseFailed)
2996  		return;
2997  
2998  #ifdef CONFIG_SME
2999  	if (elems.bss_max_idle_period) {
3000  		unsigned int msec;
3001  		wpa_s->sme.bss_max_idle_period =
3002  			WPA_GET_LE16(elems.bss_max_idle_period);
3003  		wpa_printf(MSG_DEBUG, "WNM: BSS Max Idle Period: %u (* 1000 "
3004  			   "TU)%s", wpa_s->sme.bss_max_idle_period,
3005  			   (elems.bss_max_idle_period[2] & 0x01) ?
3006  			   " (protected keep-live required)" : "");
3007  		if (wpa_s->sme.bss_max_idle_period == 0)
3008  			wpa_s->sme.bss_max_idle_period = 1;
3009  		if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) {
3010  			eloop_cancel_timeout(wnm_bss_keep_alive, wpa_s, NULL);
3011  			 /* msec times 1000 */
3012  			msec = wpa_s->sme.bss_max_idle_period * 1024;
3013  			if (msec > 100)
3014  				msec -= 100;
3015  			eloop_register_timeout(msec / 1000, msec % 1000 * 1000,
3016  					       wnm_bss_keep_alive, wpa_s,
3017  					       NULL);
3018  		}
3019  	} else {
3020  		wpa_s->sme.bss_max_idle_period = 0;
3021  	}
3022  #endif /* CONFIG_SME */
3023  }
3024  
3025  #endif /* CONFIG_WNM */
3026  
3027  
wnm_bss_keep_alive_deinit(struct wpa_supplicant * wpa_s)3028  void wnm_bss_keep_alive_deinit(struct wpa_supplicant *wpa_s)
3029  {
3030  #ifdef CONFIG_WNM
3031  	eloop_cancel_timeout(wnm_bss_keep_alive, wpa_s, NULL);
3032  #endif /* CONFIG_WNM */
3033  }
3034  
3035  
wpas_qos_map_set(struct wpa_supplicant * wpa_s,const u8 * qos_map,size_t len)3036  static int wpas_qos_map_set(struct wpa_supplicant *wpa_s, const u8 *qos_map,
3037  			    size_t len)
3038  {
3039  	int res;
3040  
3041  	wpa_hexdump(MSG_DEBUG, "Interworking: QoS Map Set", qos_map, len);
3042  	res = wpa_drv_set_qos_map(wpa_s, qos_map, len);
3043  	if (res) {
3044  		wpa_printf(MSG_DEBUG, "Interworking: Failed to configure QoS Map Set to the driver");
3045  	}
3046  
3047  	return res;
3048  }
3049  
3050  
interworking_process_assoc_resp(struct wpa_supplicant * wpa_s,const u8 * ies,size_t ies_len)3051  static void interworking_process_assoc_resp(struct wpa_supplicant *wpa_s,
3052  					    const u8 *ies, size_t ies_len)
3053  {
3054  	struct ieee802_11_elems elems;
3055  
3056  	if (ies == NULL)
3057  		return;
3058  
3059  	if (ieee802_11_parse_elems(ies, ies_len, &elems, 1) == ParseFailed)
3060  		return;
3061  
3062  	if (elems.qos_map_set) {
3063  		wpas_qos_map_set(wpa_s, elems.qos_map_set,
3064  				 elems.qos_map_set_len);
3065  	}
3066  }
3067  
3068  
wpa_supplicant_set_4addr_mode(struct wpa_supplicant * wpa_s)3069  static void wpa_supplicant_set_4addr_mode(struct wpa_supplicant *wpa_s)
3070  {
3071  	if (wpa_s->enabled_4addr_mode) {
3072  		wpa_printf(MSG_DEBUG, "4addr mode already set");
3073  		return;
3074  	}
3075  
3076  	if (wpa_drv_set_4addr_mode(wpa_s, 1) < 0) {
3077  		wpa_msg(wpa_s, MSG_ERROR, "Failed to set 4addr mode");
3078  		goto fail;
3079  	}
3080  	wpa_s->enabled_4addr_mode = 1;
3081  	wpa_dbg(wpa_s, MSG_DEBUG, "Successfully set 4addr mode");
3082  	return;
3083  
3084  fail:
3085  	wpa_supplicant_deauthenticate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
3086  }
3087  
3088  
multi_ap_process_assoc_resp(struct wpa_supplicant * wpa_s,const u8 * ies,size_t ies_len)3089  static void multi_ap_process_assoc_resp(struct wpa_supplicant *wpa_s,
3090  					const u8 *ies, size_t ies_len)
3091  {
3092  	struct ieee802_11_elems elems;
3093  	struct multi_ap_params multi_ap;
3094  	u16 status;
3095  
3096  	wpa_s->multi_ap_ie = 0;
3097  
3098  	if (!ies ||
3099  	    ieee802_11_parse_elems(ies, ies_len, &elems, 1) == ParseFailed ||
3100  	    !elems.multi_ap)
3101  		return;
3102  
3103  	status = check_multi_ap_ie(elems.multi_ap + 4, elems.multi_ap_len - 4,
3104  				   &multi_ap);
3105  	if (status != WLAN_STATUS_SUCCESS)
3106  		return;
3107  
3108  	wpa_s->multi_ap_backhaul = !!(multi_ap.capability &
3109  				      MULTI_AP_BACKHAUL_BSS);
3110  	wpa_s->multi_ap_fronthaul = !!(multi_ap.capability &
3111  				       MULTI_AP_FRONTHAUL_BSS);
3112  	wpa_s->multi_ap_ie = 1;
3113  }
3114  
3115  
multi_ap_set_4addr_mode(struct wpa_supplicant * wpa_s)3116  static void multi_ap_set_4addr_mode(struct wpa_supplicant *wpa_s)
3117  {
3118  	if (!wpa_s->current_ssid ||
3119  	    !wpa_s->current_ssid->multi_ap_backhaul_sta)
3120  		return;
3121  
3122  	if (!wpa_s->multi_ap_ie) {
3123  		wpa_printf(MSG_INFO,
3124  			   "AP does not include valid Multi-AP element");
3125  		goto fail;
3126  	}
3127  
3128  	if (!wpa_s->multi_ap_backhaul) {
3129  		if (wpa_s->multi_ap_fronthaul &&
3130  		    wpa_s->current_ssid->key_mgmt & WPA_KEY_MGMT_WPS) {
3131  			wpa_printf(MSG_INFO,
3132  				   "WPS active, accepting fronthaul-only BSS");
3133  			/* Don't set 4addr mode in this case, so just return */
3134  			return;
3135  		}
3136  		wpa_printf(MSG_INFO, "AP doesn't support backhaul BSS");
3137  		goto fail;
3138  	}
3139  
3140  	wpa_supplicant_set_4addr_mode(wpa_s);
3141  	return;
3142  
3143  fail:
3144  	wpa_supplicant_deauthenticate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
3145  }
3146  
3147  
3148  #ifdef CONFIG_FST
wpas_fst_update_mbie(struct wpa_supplicant * wpa_s,const u8 * ie,size_t ie_len)3149  static int wpas_fst_update_mbie(struct wpa_supplicant *wpa_s,
3150  				const u8 *ie, size_t ie_len)
3151  {
3152  	struct mb_ies_info mb_ies;
3153  
3154  	if (!ie || !ie_len || !wpa_s->fst)
3155  	    return -ENOENT;
3156  
3157  	os_memset(&mb_ies, 0, sizeof(mb_ies));
3158  
3159  	while (ie_len >= 2 && mb_ies.nof_ies < MAX_NOF_MB_IES_SUPPORTED) {
3160  		size_t len;
3161  
3162  		len = 2 + ie[1];
3163  		if (len > ie_len) {
3164  			wpa_hexdump(MSG_DEBUG, "FST: Truncated IE found",
3165  				    ie, ie_len);
3166  			break;
3167  		}
3168  
3169  		if (ie[0] == WLAN_EID_MULTI_BAND) {
3170  			wpa_printf(MSG_DEBUG, "MB IE of %u bytes found",
3171  				   (unsigned int) len);
3172  			mb_ies.ies[mb_ies.nof_ies].ie = ie + 2;
3173  			mb_ies.ies[mb_ies.nof_ies].ie_len = len - 2;
3174  			mb_ies.nof_ies++;
3175  		}
3176  
3177  		ie_len -= len;
3178  		ie += len;
3179  	}
3180  
3181  	if (mb_ies.nof_ies > 0) {
3182  		wpabuf_free(wpa_s->received_mb_ies);
3183  		wpa_s->received_mb_ies = mb_ies_by_info(&mb_ies);
3184  		return 0;
3185  	}
3186  
3187  	return -ENOENT;
3188  }
3189  #endif /* CONFIG_FST */
3190  
3191  
wpa_supplicant_use_own_rsne_params(struct wpa_supplicant * wpa_s,union wpa_event_data * data)3192  static int wpa_supplicant_use_own_rsne_params(struct wpa_supplicant *wpa_s,
3193  					      union wpa_event_data *data)
3194  {
3195  	int sel;
3196  	const u8 *p;
3197  	int l, len;
3198  	bool found = false;
3199  	struct wpa_ie_data ie;
3200  	struct wpa_ssid *ssid = wpa_s->current_ssid;
3201  	struct wpa_bss *bss = wpa_s->current_bss;
3202  	int pmf;
3203  
3204  	if (!ssid)
3205  		return 0;
3206  
3207  	p = data->assoc_info.req_ies;
3208  	l = data->assoc_info.req_ies_len;
3209  
3210  	while (p && l >= 2) {
3211  		len = p[1] + 2;
3212  		if (len > l) {
3213  			wpa_hexdump(MSG_DEBUG, "Truncated IE in assoc_info",
3214  				    p, l);
3215  			break;
3216  		}
3217  		if (((p[0] == WLAN_EID_VENDOR_SPECIFIC && p[1] >= 6 &&
3218  		      (os_memcmp(&p[2], "\x00\x50\xF2\x01\x01\x00", 6) == 0)) ||
3219  		     (p[0] == WLAN_EID_VENDOR_SPECIFIC && p[1] >= 4 &&
3220  		      (os_memcmp(&p[2], "\x50\x6F\x9A\x12", 4) == 0)) ||
3221  		     (p[0] == WLAN_EID_RSN && p[1] >= 2))) {
3222  			found = true;
3223  			break;
3224  		}
3225  		l -= len;
3226  		p += len;
3227  	}
3228  
3229  	if (!found || wpa_parse_wpa_ie(p, len, &ie) < 0) {
3230  		wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_OCV, 0);
3231  		return 0;
3232  	}
3233  
3234  	wpa_hexdump(MSG_DEBUG,
3235  		    "WPA: Update cipher suite selection based on IEs in driver-generated WPA/RSNE in AssocReq",
3236  		    p, l);
3237  
3238  	/* Update proto from (Re)Association Request frame info */
3239  	wpa_s->wpa_proto = ie.proto;
3240  	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PROTO, wpa_s->wpa_proto);
3241  	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_ENABLED,
3242  			 !!(wpa_s->wpa_proto & WPA_PROTO_RSN));
3243  
3244  	/* Update AKMP suite from (Re)Association Request frame info */
3245  	sel = ie.key_mgmt;
3246  	if (ssid->key_mgmt)
3247  		sel &= ssid->key_mgmt;
3248  
3249  	wpa_dbg(wpa_s, MSG_DEBUG,
3250  		"WPA: AP key_mgmt 0x%x network key_mgmt 0x%x; available key_mgmt 0x%x",
3251  		ie.key_mgmt, ssid->key_mgmt, sel);
3252  	if (ie.key_mgmt && !sel) {
3253  		wpa_supplicant_deauthenticate(
3254  			wpa_s, WLAN_REASON_AKMP_NOT_VALID);
3255  		return -1;
3256  	}
3257  
3258  #ifdef CONFIG_OCV
3259  	if (((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) ||
3260  	     (wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_OCV)) && ssid->ocv)
3261  		wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_OCV,
3262  				 !!(ie.capabilities & WPA_CAPABILITY_OCVC));
3263  #endif /* CONFIG_OCV */
3264  
3265  	/*
3266  	 * Update PMK in wpa_sm and the driver if roamed to WPA/WPA2 PSK from a
3267  	 * different AKM.
3268  	 */
3269  	if (wpa_s->key_mgmt != ie.key_mgmt &&
3270  	    wpa_key_mgmt_wpa_psk_no_sae(ie.key_mgmt)) {
3271  		if (!ssid->psk_set) {
3272  			wpa_dbg(wpa_s, MSG_INFO,
3273  				"No PSK available for association");
3274  			wpas_auth_failed(wpa_s, "NO_PSK_AVAILABLE", NULL);
3275  			return -1;
3276  		}
3277  
3278  		wpa_sm_set_pmk(wpa_s->wpa, ssid->psk, PMK_LEN, NULL, NULL);
3279  		if (wpa_s->conf->key_mgmt_offload &&
3280  		    (wpa_s->drv_flags & WPA_DRIVER_FLAGS_KEY_MGMT_OFFLOAD) &&
3281  		    wpa_drv_set_key(wpa_s, -1, 0, NULL, 0, 0, NULL, 0,
3282  				    ssid->psk, PMK_LEN, KEY_FLAG_PMK))
3283  			wpa_dbg(wpa_s, MSG_ERROR,
3284  				"WPA: Cannot set PMK for key management offload");
3285  	}
3286  
3287  	wpa_s->key_mgmt = ie.key_mgmt;
3288  	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_KEY_MGMT, wpa_s->key_mgmt);
3289  	wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using KEY_MGMT %s and proto %d",
3290  		wpa_key_mgmt_txt(wpa_s->key_mgmt, wpa_s->wpa_proto),
3291  		wpa_s->wpa_proto);
3292  
3293  	/* Update pairwise cipher from (Re)Association Request frame info */
3294  	sel = ie.pairwise_cipher;
3295  	if (ssid->pairwise_cipher)
3296  		sel &= ssid->pairwise_cipher;
3297  
3298  	wpa_dbg(wpa_s, MSG_DEBUG,
3299  		"WPA: AP pairwise cipher 0x%x network pairwise cipher 0x%x; available pairwise cipher 0x%x",
3300  		ie.pairwise_cipher, ssid->pairwise_cipher, sel);
3301  	if (ie.pairwise_cipher && !sel) {
3302  		wpa_supplicant_deauthenticate(
3303  			wpa_s, WLAN_REASON_PAIRWISE_CIPHER_NOT_VALID);
3304  		return -1;
3305  	}
3306  
3307  	wpa_s->pairwise_cipher = ie.pairwise_cipher;
3308  	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_PAIRWISE,
3309  			 wpa_s->pairwise_cipher);
3310  	wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using PTK %s",
3311  		wpa_cipher_txt(wpa_s->pairwise_cipher));
3312  
3313  	/* Update other parameters based on AP's WPA IE/RSNE, if available */
3314  	if (!bss) {
3315  		wpa_dbg(wpa_s, MSG_DEBUG,
3316  			"WPA: current_bss == NULL - skip AP IE check");
3317  		return 0;
3318  	}
3319  
3320  	/* Update GTK and IGTK from AP's RSNE */
3321  	found = false;
3322  
3323  	if (wpa_s->wpa_proto & WPA_PROTO_RSN) {
3324  		const u8 *bss_rsn;
3325  
3326  		bss_rsn = wpa_bss_get_rsne(wpa_s, bss, ssid,
3327  					   wpa_s->valid_links);
3328  		if (bss_rsn) {
3329  			p = bss_rsn;
3330  			len = 2 + bss_rsn[1];
3331  			found = true;
3332  		}
3333  	} else if (wpa_s->wpa_proto & WPA_PROTO_WPA) {
3334  		const u8 *bss_wpa;
3335  
3336  		bss_wpa = wpa_bss_get_vendor_ie(bss, WPA_IE_VENDOR_TYPE);
3337  		if (bss_wpa) {
3338  			p = bss_wpa;
3339  			len = 2 + bss_wpa[1];
3340  			found = true;
3341  		}
3342  	}
3343  
3344  	if (!found || wpa_parse_wpa_ie(p, len, &ie) < 0)
3345  		return 0;
3346  
3347  	pmf = wpas_get_ssid_pmf(wpa_s, ssid);
3348  	if (!(ie.capabilities & WPA_CAPABILITY_MFPC) &&
3349  	    pmf == MGMT_FRAME_PROTECTION_REQUIRED) {
3350  		/* AP does not support MFP, local configuration requires it */
3351  		wpa_supplicant_deauthenticate(
3352  			wpa_s, WLAN_REASON_INVALID_RSN_IE_CAPAB);
3353  		return -1;
3354  	}
3355  	if ((ie.capabilities & WPA_CAPABILITY_MFPR) &&
3356  	    pmf == NO_MGMT_FRAME_PROTECTION) {
3357  		/* AP requires MFP, local configuration disables it */
3358  		wpa_supplicant_deauthenticate(
3359  			wpa_s, WLAN_REASON_INVALID_RSN_IE_CAPAB);
3360  		return -1;
3361  	}
3362  
3363  	/* Update PMF from local configuration now that MFP validation was done
3364  	 * above */
3365  	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MFP, pmf);
3366  
3367  	/* Update GTK from AP's RSNE */
3368  	sel = ie.group_cipher;
3369  	if (ssid->group_cipher)
3370  		sel &= ssid->group_cipher;
3371  
3372  	wpa_dbg(wpa_s, MSG_DEBUG,
3373  		"WPA: AP group cipher 0x%x network group cipher 0x%x; available group cipher 0x%x",
3374  		ie.group_cipher, ssid->group_cipher, sel);
3375  	if (ie.group_cipher && !sel) {
3376  		wpa_supplicant_deauthenticate(
3377  			wpa_s, WLAN_REASON_GROUP_CIPHER_NOT_VALID);
3378  		return -1;
3379  	}
3380  
3381  	wpa_s->group_cipher = ie.group_cipher;
3382  	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_GROUP, wpa_s->group_cipher);
3383  	wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using GTK %s",
3384  		wpa_cipher_txt(wpa_s->group_cipher));
3385  
3386  	/* Update IGTK from AP RSN IE */
3387  	sel = ie.mgmt_group_cipher;
3388  	if (ssid->group_mgmt_cipher)
3389  		sel &= ssid->group_mgmt_cipher;
3390  
3391  	wpa_dbg(wpa_s, MSG_DEBUG,
3392  		"WPA: AP mgmt_group_cipher 0x%x network mgmt_group_cipher 0x%x; available mgmt_group_cipher 0x%x",
3393  		ie.mgmt_group_cipher, ssid->group_mgmt_cipher, sel);
3394  
3395  	if (pmf == NO_MGMT_FRAME_PROTECTION ||
3396  	    !(ie.capabilities & WPA_CAPABILITY_MFPC)) {
3397  		wpa_dbg(wpa_s, MSG_DEBUG,
3398  			"WPA: STA/AP is not MFP capable; AP RSNE caps 0x%x",
3399  			ie.capabilities);
3400  		ie.mgmt_group_cipher = 0;
3401  	}
3402  
3403  	if (ie.mgmt_group_cipher && !sel) {
3404  		wpa_supplicant_deauthenticate(
3405  			wpa_s, WLAN_REASON_CIPHER_SUITE_REJECTED);
3406  		return -1;
3407  	}
3408  
3409  	wpa_s->mgmt_group_cipher = ie.mgmt_group_cipher;
3410  	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_MGMT_GROUP,
3411  			 wpa_s->mgmt_group_cipher);
3412  	if (wpa_s->mgmt_group_cipher)
3413  		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: using MGMT group cipher %s",
3414  			wpa_cipher_txt(wpa_s->mgmt_group_cipher));
3415  	else
3416  		wpa_dbg(wpa_s, MSG_DEBUG, "WPA: not using MGMT group cipher");
3417  
3418  	return 0;
3419  }
3420  
3421  
wpa_supplicant_event_associnfo(struct wpa_supplicant * wpa_s,union wpa_event_data * data)3422  static int wpa_supplicant_event_associnfo(struct wpa_supplicant *wpa_s,
3423  					  union wpa_event_data *data)
3424  {
3425  	int l, len, found = 0, wpa_found, rsn_found;
3426  #ifndef CONFIG_NO_WPA
3427  	int found_x = 0;
3428  #endif /* CONFIG_NO_WPA */
3429  	const u8 *p, *ie;
3430  	u8 bssid[ETH_ALEN];
3431  	bool bssid_known;
3432  	enum wpa_rsn_override rsn_override;
3433  
3434  	wpa_dbg(wpa_s, MSG_DEBUG, "Association info event");
3435  	wpa_s->ssid_verified = false;
3436  	wpa_s->bigtk_set = false;
3437  #ifdef CONFIG_SAE
3438  #ifdef CONFIG_SME
3439  	/* SAE H2E binds the SSID into PT and that verifies the SSID
3440  	 * implicitly. */
3441  	if (wpa_s->sme.sae.state == SAE_ACCEPTED && wpa_s->sme.sae.h2e)
3442  		wpa_s->ssid_verified = true;
3443  #endif /* CONFIG_SME */
3444  #endif /* CONFIG_SAE */
3445  	bssid_known = wpa_drv_get_bssid(wpa_s, bssid) == 0;
3446  	if (data->assoc_info.req_ies)
3447  		wpa_hexdump(MSG_DEBUG, "req_ies", data->assoc_info.req_ies,
3448  			    data->assoc_info.req_ies_len);
3449  	if (data->assoc_info.resp_ies) {
3450  		wpa_hexdump(MSG_DEBUG, "resp_ies", data->assoc_info.resp_ies,
3451  			    data->assoc_info.resp_ies_len);
3452  #ifdef CONFIG_TDLS
3453  		wpa_tdls_assoc_resp_ies(wpa_s->wpa, data->assoc_info.resp_ies,
3454  					data->assoc_info.resp_ies_len);
3455  #endif /* CONFIG_TDLS */
3456  #ifdef CONFIG_WNM
3457  		wnm_process_assoc_resp(wpa_s, data->assoc_info.resp_ies,
3458  				       data->assoc_info.resp_ies_len);
3459  #endif /* CONFIG_WNM */
3460  		interworking_process_assoc_resp(wpa_s, data->assoc_info.resp_ies,
3461  						data->assoc_info.resp_ies_len);
3462  		if ((wpa_s->hw_capab & BIT(CAPAB_VHT)) &&
3463  		    get_ie(data->assoc_info.resp_ies,
3464  			   data->assoc_info.resp_ies_len, WLAN_EID_VHT_CAP))
3465  			wpa_s->ieee80211ac = 1;
3466  
3467  		multi_ap_process_assoc_resp(wpa_s, data->assoc_info.resp_ies,
3468  					    data->assoc_info.resp_ies_len);
3469  	}
3470  	if (data->assoc_info.beacon_ies)
3471  		wpa_hexdump(MSG_DEBUG, "beacon_ies",
3472  			    data->assoc_info.beacon_ies,
3473  			    data->assoc_info.beacon_ies_len);
3474  	if (data->assoc_info.freq)
3475  		wpa_dbg(wpa_s, MSG_DEBUG, "freq=%u MHz",
3476  			data->assoc_info.freq);
3477  
3478  	wpa_s->connection_set = 0;
3479  	if (data->assoc_info.req_ies && data->assoc_info.resp_ies) {
3480  		struct ieee802_11_elems req_elems, resp_elems;
3481  
3482  		if (ieee802_11_parse_elems(data->assoc_info.req_ies,
3483  					   data->assoc_info.req_ies_len,
3484  					   &req_elems, 0) != ParseFailed &&
3485  		    ieee802_11_parse_elems(data->assoc_info.resp_ies,
3486  					   data->assoc_info.resp_ies_len,
3487  					   &resp_elems, 0) != ParseFailed) {
3488  			wpa_s->connection_set = 1;
3489  			wpa_s->connection_ht = req_elems.ht_capabilities &&
3490  				resp_elems.ht_capabilities;
3491  			/* Do not include subset of VHT on 2.4 GHz vendor
3492  			 * extension in consideration for reporting VHT
3493  			 * association. */
3494  			wpa_s->connection_vht = req_elems.vht_capabilities &&
3495  				resp_elems.vht_capabilities &&
3496  				(!data->assoc_info.freq ||
3497  				 wpas_freq_to_band(data->assoc_info.freq) !=
3498  				 BAND_2_4_GHZ);
3499  			wpa_s->connection_he = req_elems.he_capabilities &&
3500  				resp_elems.he_capabilities;
3501  			wpa_s->connection_eht = req_elems.eht_capabilities &&
3502  				resp_elems.eht_capabilities;
3503  			if (req_elems.rrm_enabled)
3504  				wpa_s->rrm.rrm_used = 1;
3505  		}
3506  	}
3507  
3508  	p = data->assoc_info.req_ies;
3509  	l = data->assoc_info.req_ies_len;
3510  
3511  	/* Go through the IEs and make a copy of the WPA/RSN IE, if present. */
3512  	while (p && l >= 2) {
3513  		len = p[1] + 2;
3514  		if (len > l) {
3515  			wpa_hexdump(MSG_DEBUG, "Truncated IE in assoc_info",
3516  				    p, l);
3517  			break;
3518  		}
3519  		if (!found &&
3520  		    ((p[0] == WLAN_EID_VENDOR_SPECIFIC && p[1] >= 6 &&
3521  		      (os_memcmp(&p[2], "\x00\x50\xF2\x01\x01\x00", 6) == 0)) ||
3522  		     (p[0] == WLAN_EID_VENDOR_SPECIFIC && p[1] >= 4 &&
3523  		      (os_memcmp(&p[2], "\x50\x6F\x9A\x12", 4) == 0)) ||
3524  		     (p[0] == WLAN_EID_RSN && p[1] >= 2))) {
3525  			if (wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, p, len))
3526  				break;
3527  			found = 1;
3528  			wpa_find_assoc_pmkid(wpa_s);
3529  		}
3530  #ifndef CONFIG_NO_WPA
3531  		if (!found_x && p[0] == WLAN_EID_RSNX) {
3532  			if (wpa_sm_set_assoc_rsnxe(wpa_s->wpa, p, len))
3533  				break;
3534  			found_x = 1;
3535  		}
3536  #endif /* CONFIG_NO_WPA */
3537  		l -= len;
3538  		p += len;
3539  	}
3540  	if (!found && data->assoc_info.req_ies)
3541  		wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
3542  #ifndef CONFIG_NO_WPA
3543  	if (!found_x && data->assoc_info.req_ies)
3544  		wpa_sm_set_assoc_rsnxe(wpa_s->wpa, NULL, 0);
3545  #endif /* CONFIG_NO_WPA */
3546  
3547  	rsn_override = RSN_OVERRIDE_NOT_USED;
3548  	ie = get_vendor_ie(data->assoc_info.req_ies,
3549  			   data->assoc_info.req_ies_len,
3550  			   RSN_SELECTION_IE_VENDOR_TYPE);
3551  	if (ie && ie[1] >= 4 + 1) {
3552  		switch (ie[2 + 4]) {
3553  		case RSN_SELECTION_RSNE:
3554  			rsn_override = RSN_OVERRIDE_RSNE;
3555  			break;
3556  		case RSN_SELECTION_RSNE_OVERRIDE:
3557  			rsn_override = RSN_OVERRIDE_RSNE_OVERRIDE;
3558  			break;
3559  		case RSN_SELECTION_RSNE_OVERRIDE_2:
3560  			rsn_override = RSN_OVERRIDE_RSNE_OVERRIDE_2;
3561  			break;
3562  		}
3563  	}
3564  	wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_OVERRIDE, rsn_override);
3565  
3566  #ifdef CONFIG_FILS
3567  #ifdef CONFIG_SME
3568  	if (wpa_s->sme.auth_alg == WPA_AUTH_ALG_FILS ||
3569  	    wpa_s->sme.auth_alg == WPA_AUTH_ALG_FILS_SK_PFS) {
3570  		if (!data->assoc_info.resp_frame ||
3571  		    fils_process_assoc_resp(wpa_s->wpa,
3572  					    data->assoc_info.resp_frame,
3573  					    data->assoc_info.resp_frame_len) <
3574  		    0) {
3575  			wpa_supplicant_deauthenticate(wpa_s,
3576  						      WLAN_REASON_UNSPECIFIED);
3577  			return -1;
3578  		}
3579  
3580  		/* FILS use of an AEAD cipher include the SSID element in
3581  		 * (Re)Association Request frame in the AAD and since the AP
3582  		 * accepted that, the SSID was verified. */
3583  		wpa_s->ssid_verified = true;
3584  	}
3585  #endif /* CONFIG_SME */
3586  
3587  	/* Additional processing for FILS when SME is in driver */
3588  	if (wpa_s->auth_alg == WPA_AUTH_ALG_FILS &&
3589  	    !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME))
3590  		wpa_sm_set_reset_fils_completed(wpa_s->wpa, 1);
3591  #endif /* CONFIG_FILS */
3592  
3593  #ifdef CONFIG_OWE
3594  	if (wpa_s->key_mgmt == WPA_KEY_MGMT_OWE &&
3595  	    !(wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_OWE_OFFLOAD_STA) &&
3596  	    (!bssid_known ||
3597  	     owe_process_assoc_resp(wpa_s->wpa,
3598  				    wpa_s->valid_links ?
3599  				    wpa_s->ap_mld_addr : bssid,
3600  				    data->assoc_info.resp_ies,
3601  				    data->assoc_info.resp_ies_len) < 0)) {
3602  		wpa_supplicant_deauthenticate(wpa_s, WLAN_REASON_UNSPECIFIED);
3603  		return -1;
3604  	}
3605  #endif /* CONFIG_OWE */
3606  
3607  #ifdef CONFIG_DPP2
3608  	wpa_sm_set_dpp_z(wpa_s->wpa, NULL);
3609  	if (DPP_VERSION > 1 && wpa_s->key_mgmt == WPA_KEY_MGMT_DPP &&
3610  	    wpa_s->dpp_pfs) {
3611  		struct ieee802_11_elems elems;
3612  
3613  		if (ieee802_11_parse_elems(data->assoc_info.resp_ies,
3614  					   data->assoc_info.resp_ies_len,
3615  					   &elems, 0) == ParseFailed ||
3616  		    !elems.owe_dh)
3617  			goto no_pfs;
3618  		if (dpp_pfs_process(wpa_s->dpp_pfs, elems.owe_dh,
3619  				    elems.owe_dh_len) < 0) {
3620  			wpa_supplicant_deauthenticate(wpa_s,
3621  						      WLAN_REASON_UNSPECIFIED);
3622  			return -1;
3623  		}
3624  
3625  		wpa_sm_set_dpp_z(wpa_s->wpa, wpa_s->dpp_pfs->secret);
3626  	}
3627  no_pfs:
3628  #endif /* CONFIG_DPP2 */
3629  
3630  #ifdef CONFIG_IEEE80211R
3631  #ifdef CONFIG_SME
3632  	if (wpa_s->sme.auth_alg == WPA_AUTH_ALG_FT) {
3633  		if (!bssid_known ||
3634  		    wpa_ft_validate_reassoc_resp(wpa_s->wpa,
3635  						 data->assoc_info.resp_ies,
3636  						 data->assoc_info.resp_ies_len,
3637  						 bssid) < 0) {
3638  			wpa_dbg(wpa_s, MSG_DEBUG, "FT: Validation of "
3639  				"Reassociation Response failed");
3640  			wpa_supplicant_deauthenticate(
3641  				wpa_s, WLAN_REASON_INVALID_IE);
3642  			return -1;
3643  		}
3644  		/* SSID is included in PMK-R0 derivation, so it is verified
3645  		 * implicitly. */
3646  		wpa_s->ssid_verified = true;
3647  	}
3648  
3649  	p = data->assoc_info.resp_ies;
3650  	l = data->assoc_info.resp_ies_len;
3651  
3652  #ifdef CONFIG_WPS_STRICT
3653  	if (p && wpa_s->current_ssid &&
3654  	    wpa_s->current_ssid->key_mgmt == WPA_KEY_MGMT_WPS) {
3655  		struct wpabuf *wps;
3656  		wps = ieee802_11_vendor_ie_concat(p, l, WPS_IE_VENDOR_TYPE);
3657  		if (wps == NULL) {
3658  			wpa_msg(wpa_s, MSG_INFO, "WPS-STRICT: AP did not "
3659  				"include WPS IE in (Re)Association Response");
3660  			return -1;
3661  		}
3662  
3663  		if (wps_validate_assoc_resp(wps) < 0) {
3664  			wpabuf_free(wps);
3665  			wpa_supplicant_deauthenticate(
3666  				wpa_s, WLAN_REASON_INVALID_IE);
3667  			return -1;
3668  		}
3669  		wpabuf_free(wps);
3670  	}
3671  #endif /* CONFIG_WPS_STRICT */
3672  
3673  	/* Go through the IEs and make a copy of the MDIE, if present. */
3674  	while (p && l >= 2) {
3675  		len = p[1] + 2;
3676  		if (len > l) {
3677  			wpa_hexdump(MSG_DEBUG, "Truncated IE in assoc_info",
3678  				    p, l);
3679  			break;
3680  		}
3681  		if (p[0] == WLAN_EID_MOBILITY_DOMAIN &&
3682  		    p[1] >= MOBILITY_DOMAIN_ID_LEN) {
3683  			wpa_s->sme.ft_used = 1;
3684  			os_memcpy(wpa_s->sme.mobility_domain, p + 2,
3685  				  MOBILITY_DOMAIN_ID_LEN);
3686  			break;
3687  		}
3688  		l -= len;
3689  		p += len;
3690  	}
3691  #endif /* CONFIG_SME */
3692  
3693  	/* Process FT when SME is in the driver */
3694  	if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) &&
3695  	    wpa_ft_is_completed(wpa_s->wpa)) {
3696  		if (!bssid_known ||
3697  		    wpa_ft_validate_reassoc_resp(wpa_s->wpa,
3698  						 data->assoc_info.resp_ies,
3699  						 data->assoc_info.resp_ies_len,
3700  						 bssid) < 0) {
3701  			wpa_dbg(wpa_s, MSG_DEBUG, "FT: Validation of "
3702  				"Reassociation Response failed");
3703  			wpa_supplicant_deauthenticate(
3704  				wpa_s, WLAN_REASON_INVALID_IE);
3705  			return -1;
3706  		}
3707  		wpa_dbg(wpa_s, MSG_DEBUG, "FT: Reassociation Response done");
3708  		/* SSID is included in PMK-R0 derivation, so it is verified
3709  		 * implicitly. */
3710  		wpa_s->ssid_verified = true;
3711  	}
3712  
3713  	wpa_sm_set_ft_params(wpa_s->wpa, data->assoc_info.resp_ies,
3714  			     data->assoc_info.resp_ies_len);
3715  #endif /* CONFIG_IEEE80211R */
3716  
3717  #ifndef CONFIG_NO_ROBUST_AV
3718  	if (bssid_known)
3719  		wpas_handle_assoc_resp_mscs(wpa_s, bssid,
3720  					    data->assoc_info.resp_ies,
3721  					    data->assoc_info.resp_ies_len);
3722  #endif /* CONFIG_NO_ROBUST_AV */
3723  
3724  	/* WPA/RSN IE from Beacon/ProbeResp */
3725  	p = data->assoc_info.beacon_ies;
3726  	l = data->assoc_info.beacon_ies_len;
3727  
3728  	/* Go through the IEs and make a copy of the WPA/RSN IEs, if present.
3729  	 */
3730  	wpa_found = rsn_found = 0;
3731  	while (p && l >= 2) {
3732  		len = p[1] + 2;
3733  		if (len > l) {
3734  			wpa_hexdump(MSG_DEBUG, "Truncated IE in beacon_ies",
3735  				    p, l);
3736  			break;
3737  		}
3738  		if (!wpa_found &&
3739  		    p[0] == WLAN_EID_VENDOR_SPECIFIC && p[1] >= 6 &&
3740  		    os_memcmp(&p[2], "\x00\x50\xF2\x01\x01\x00", 6) == 0) {
3741  			wpa_found = 1;
3742  			wpa_sm_set_ap_wpa_ie(wpa_s->wpa, p, len);
3743  		}
3744  
3745  		if (!rsn_found &&
3746  		    p[0] == WLAN_EID_RSN && p[1] >= 2) {
3747  			rsn_found = 1;
3748  			wpa_sm_set_ap_rsn_ie(wpa_s->wpa, p, len);
3749  		}
3750  
3751  		if (p[0] == WLAN_EID_VENDOR_SPECIFIC && p[1] >= 6 &&
3752  		    WPA_GET_BE32(&p[2]) == RSNE_OVERRIDE_2_IE_VENDOR_TYPE)
3753  			wpa_sm_set_ap_rsne_override_2(wpa_s->wpa, p, len);
3754  
3755  		if (p[0] == WLAN_EID_VENDOR_SPECIFIC && p[1] >= 6 &&
3756  		    WPA_GET_BE32(&p[2]) == RSNE_OVERRIDE_IE_VENDOR_TYPE)
3757  			wpa_sm_set_ap_rsne_override(wpa_s->wpa, p, len);
3758  
3759  		if (p[0] == WLAN_EID_RSNX && p[1] >= 1)
3760  			wpa_sm_set_ap_rsnxe(wpa_s->wpa, p, len);
3761  
3762  		if (p[0] == WLAN_EID_VENDOR_SPECIFIC && p[1] >= 6 &&
3763  		    WPA_GET_BE32(&p[2]) == RSNXE_OVERRIDE_IE_VENDOR_TYPE)
3764  			wpa_sm_set_ap_rsnxe_override(wpa_s->wpa, p, len);
3765  
3766  		l -= len;
3767  		p += len;
3768  	}
3769  
3770  	if (!wpa_found && data->assoc_info.beacon_ies)
3771  		wpa_sm_set_ap_wpa_ie(wpa_s->wpa, NULL, 0);
3772  	if (!rsn_found && data->assoc_info.beacon_ies) {
3773  		wpa_sm_set_ap_rsn_ie(wpa_s->wpa, NULL, 0);
3774  		wpa_sm_set_ap_rsnxe(wpa_s->wpa, NULL, 0);
3775  		wpa_sm_set_ap_rsne_override(wpa_s->wpa, NULL, 0);
3776  		wpa_sm_set_ap_rsne_override_2(wpa_s->wpa, NULL, 0);
3777  		wpa_sm_set_ap_rsnxe_override(wpa_s->wpa, NULL, 0);
3778  	}
3779  	if (wpa_found || rsn_found)
3780  		wpa_s->ap_ies_from_associnfo = 1;
3781  
3782  	if (wpa_s->assoc_freq && data->assoc_info.freq) {
3783  		struct wpa_bss *bss;
3784  		unsigned int freq = 0;
3785  
3786  		if (bssid_known) {
3787  			bss = wpa_bss_get_bssid_latest(wpa_s, bssid);
3788  			if (bss)
3789  				freq = bss->freq;
3790  		}
3791  		if (freq != data->assoc_info.freq) {
3792  			wpa_printf(MSG_DEBUG,
3793  				   "Operating frequency changed from %u to %u MHz",
3794  				   wpa_s->assoc_freq, data->assoc_info.freq);
3795  			wpa_supplicant_update_scan_results(wpa_s, bssid);
3796  		}
3797  	}
3798  
3799  	wpa_s->assoc_freq = data->assoc_info.freq;
3800  
3801  #ifndef CONFIG_NO_ROBUST_AV
3802  	wpas_handle_assoc_resp_qos_mgmt(wpa_s, data->assoc_info.resp_ies,
3803  					data->assoc_info.resp_ies_len);
3804  #endif /* CONFIG_NO_ROBUST_AV */
3805  
3806  	return 0;
3807  }
3808  
3809  
wpa_supplicant_assoc_update_ie(struct wpa_supplicant * wpa_s)3810  static int wpa_supplicant_assoc_update_ie(struct wpa_supplicant *wpa_s)
3811  {
3812  	const u8 *bss_wpa = NULL, *bss_rsn = NULL, *bss_rsnx = NULL;
3813  	const u8 *rsnoe, *rsno2e, *rsnxoe;
3814  
3815  	if (!wpa_s->current_bss || !wpa_s->current_ssid)
3816  		return -1;
3817  
3818  	if (!wpa_key_mgmt_wpa_any(wpa_s->current_ssid->key_mgmt))
3819  		return 0;
3820  
3821  	bss_wpa = wpa_bss_get_vendor_ie(wpa_s->current_bss,
3822  					WPA_IE_VENDOR_TYPE);
3823  	bss_rsn = wpa_bss_get_ie(wpa_s->current_bss, WLAN_EID_RSN);
3824  	bss_rsnx = wpa_bss_get_ie(wpa_s->current_bss, WLAN_EID_RSNX);
3825  	rsnoe = wpa_bss_get_vendor_ie(wpa_s->current_bss,
3826  				      RSNE_OVERRIDE_IE_VENDOR_TYPE);
3827  	rsno2e = wpa_bss_get_vendor_ie(wpa_s->current_bss,
3828  				       RSNE_OVERRIDE_2_IE_VENDOR_TYPE);
3829  	rsnxoe = wpa_bss_get_vendor_ie(wpa_s->current_bss,
3830  				       RSNXE_OVERRIDE_IE_VENDOR_TYPE);
3831  
3832  	if (wpa_sm_set_ap_wpa_ie(wpa_s->wpa, bss_wpa,
3833  				 bss_wpa ? 2 + bss_wpa[1] : 0) ||
3834  	    wpa_sm_set_ap_rsn_ie(wpa_s->wpa, bss_rsn,
3835  				 bss_rsn ? 2 + bss_rsn[1] : 0) ||
3836  	    wpa_sm_set_ap_rsnxe(wpa_s->wpa, bss_rsnx,
3837  				 bss_rsnx ? 2 + bss_rsnx[1] : 0) ||
3838  	    wpa_sm_set_ap_rsne_override(wpa_s->wpa, rsnoe,
3839  					rsnoe ? 2 + rsnoe[1] : 0) ||
3840  	    wpa_sm_set_ap_rsne_override_2(wpa_s->wpa, rsno2e,
3841  					  rsno2e ? 2 + rsno2e[1] : 0) ||
3842  	    wpa_sm_set_ap_rsnxe_override(wpa_s->wpa, rsnxoe,
3843  					 rsnxoe ? 2 + rsnxoe[1] : 0))
3844  		return -1;
3845  
3846  	return 0;
3847  }
3848  
3849  
wpas_fst_update_mb_assoc(struct wpa_supplicant * wpa_s,union wpa_event_data * data)3850  static void wpas_fst_update_mb_assoc(struct wpa_supplicant *wpa_s,
3851  				     union wpa_event_data *data)
3852  {
3853  #ifdef CONFIG_FST
3854  	struct assoc_info *ai = data ? &data->assoc_info : NULL;
3855  	struct wpa_bss *bss = wpa_s->current_bss;
3856  	const u8 *ieprb, *iebcn;
3857  
3858  	wpabuf_free(wpa_s->received_mb_ies);
3859  	wpa_s->received_mb_ies = NULL;
3860  
3861  	if (ai &&
3862  	    !wpas_fst_update_mbie(wpa_s, ai->resp_ies, ai->resp_ies_len)) {
3863  		wpa_printf(MSG_DEBUG,
3864  			   "FST: MB IEs updated from Association Response frame");
3865  		return;
3866  	}
3867  
3868  	if (ai &&
3869  	    !wpas_fst_update_mbie(wpa_s, ai->beacon_ies, ai->beacon_ies_len)) {
3870  		wpa_printf(MSG_DEBUG,
3871  			   "FST: MB IEs updated from association event Beacon IEs");
3872  		return;
3873  	}
3874  
3875  	if (!bss)
3876  		return;
3877  
3878  	ieprb = wpa_bss_ie_ptr(bss);
3879  	iebcn = ieprb + bss->ie_len;
3880  
3881  	if (!wpas_fst_update_mbie(wpa_s, ieprb, bss->ie_len))
3882  		wpa_printf(MSG_DEBUG, "FST: MB IEs updated from bss IE");
3883  	else if (!wpas_fst_update_mbie(wpa_s, iebcn, bss->beacon_ie_len))
3884  		wpa_printf(MSG_DEBUG, "FST: MB IEs updated from bss beacon IE");
3885  #endif /* CONFIG_FST */
3886  }
3887  
3888  
wpas_ml_parse_assoc(struct wpa_supplicant * wpa_s,struct ieee802_11_elems * elems,struct ml_sta_link_info * ml_info)3889  static unsigned int wpas_ml_parse_assoc(struct wpa_supplicant *wpa_s,
3890  					struct ieee802_11_elems *elems,
3891  					struct ml_sta_link_info *ml_info)
3892  {
3893  	struct wpabuf *mlbuf;
3894  	struct ieee80211_eht_ml *ml;
3895  	size_t ml_len;
3896  	struct eht_ml_basic_common_info *common_info;
3897  	const u8 *pos;
3898  	u16 eml_capa = 0, mld_capa = 0;
3899  	const u16 control = MULTI_LINK_CONTROL_TYPE_BASIC |
3900  		BASIC_MULTI_LINK_CTRL_PRES_LINK_ID |
3901  		BASIC_MULTI_LINK_CTRL_PRES_BSS_PARAM_CH_COUNT;
3902  	u8 expected_common_info_len = 9;
3903  	unsigned int i = 0;
3904  	u16 ml_control;
3905  
3906  	if (!wpa_s->valid_links || !elems->basic_mle || !elems->basic_mle_len)
3907  		return 0;
3908  
3909  	mlbuf = ieee802_11_defrag(elems->basic_mle, elems->basic_mle_len, true);
3910  	if (!mlbuf)
3911  		return 0;
3912  
3913  	ml = (struct ieee80211_eht_ml *) wpabuf_head(mlbuf);
3914  	ml_len = wpabuf_len(mlbuf);
3915  	if (ml_len < sizeof(*ml))
3916  		goto out;
3917  
3918  	os_memset(ml_info, 0, sizeof(*ml_info) * MAX_NUM_MLD_LINKS);
3919  
3920  	ml_control = le_to_host16(ml->ml_control);
3921  
3922  	if ((ml_control & control) != control) {
3923  		wpa_printf(MSG_DEBUG, "MLD: Invalid presence BM=0x%x",
3924  			   ml_control);
3925  		goto out;
3926  	}
3927  
3928  	if (ml_control & BASIC_MULTI_LINK_CTRL_PRES_EML_CAPA) {
3929  		wpa_printf(MSG_DEBUG, "MLD: EML capabilities included");
3930  		expected_common_info_len += 2;
3931  	}
3932  
3933  	if (ml_control & BASIC_MULTI_LINK_CTRL_PRES_MLD_CAPA) {
3934  		wpa_printf(MSG_DEBUG, "MLD: MLD capabilities included");
3935  		expected_common_info_len += 2;
3936  	}
3937  
3938  	if (ml_control & BASIC_MULTI_LINK_CTRL_PRES_MSD_INFO) {
3939  		wpa_printf(MSG_DEBUG,
3940  			   "MLD: Unexpected: medium sync delay info present");
3941  		expected_common_info_len += 2;
3942  	}
3943  
3944  	if (ml_control & BASIC_MULTI_LINK_CTRL_PRES_AP_MLD_ID) {
3945  		wpa_printf(MSG_DEBUG,
3946  			   "MLD: Unexpected: MLD ID present");
3947  		expected_common_info_len++;
3948  	}
3949  
3950  	if (sizeof(*ml) + expected_common_info_len > ml_len) {
3951  		wpa_printf(MSG_DEBUG,
3952  			   "MLD: Not enough bytes for common info. ml_len=%zu",
3953  			   ml_len);
3954  		goto out;
3955  	}
3956  
3957  	common_info = (struct eht_ml_basic_common_info *) ml->variable;
3958  	if (common_info->len < expected_common_info_len) {
3959  		wpa_printf(MSG_DEBUG,
3960  			   "MLD: Invalid common info len=%u. expected=%u",
3961  			   common_info->len, expected_common_info_len);
3962  		goto out;
3963  	}
3964  
3965  	wpa_printf(MSG_DEBUG, "MLD: address: " MACSTR,
3966  		   MAC2STR(common_info->mld_addr));
3967  
3968  	if (!ether_addr_equal(wpa_s->ap_mld_addr, common_info->mld_addr)) {
3969  		wpa_printf(MSG_DEBUG, "MLD: Mismatching MLD address (expected "
3970  			   MACSTR ")", MAC2STR(wpa_s->ap_mld_addr));
3971  		goto out;
3972  	}
3973  
3974  	pos = common_info->variable;
3975  
3976  	/* Store the information for the association link */
3977  	ml_info[i].link_id = *pos;
3978  	pos++;
3979  
3980  	/* Skip the BSS Parameters Change Count */
3981  	pos++;
3982  
3983  	/* Skip the Medium Synchronization Delay Information if present  */
3984  	if (ml_control & BASIC_MULTI_LINK_CTRL_PRES_MSD_INFO)
3985  		pos += 2;
3986  
3987  	if (ml_control & BASIC_MULTI_LINK_CTRL_PRES_EML_CAPA) {
3988  		eml_capa = WPA_GET_LE16(pos);
3989  		pos += 2;
3990  	}
3991  
3992  	if (ml_control & BASIC_MULTI_LINK_CTRL_PRES_MLD_CAPA) {
3993  		mld_capa = WPA_GET_LE16(pos);
3994  		pos += 2;
3995  	}
3996  
3997  	wpa_printf(MSG_DEBUG,
3998  		   "MLD: link_id=%u, eml=0x%x, mld=0x%x",
3999  		   ml_info[i].link_id, eml_capa, mld_capa);
4000  
4001  	i++;
4002  
4003  	pos = ((u8 *) common_info) + common_info->len;
4004  	ml_len -= sizeof(*ml) + common_info->len;
4005  	while (ml_len > 2 && i < MAX_NUM_MLD_LINKS) {
4006  		u8 sub_elem_len = pos[1];
4007  		u8 sta_info_len, sta_info_len_min;
4008  		u8 nstr_bitmap_len = 0;
4009  		u16 ctrl;
4010  		const u8 *end;
4011  
4012  		wpa_printf(MSG_DEBUG, "MLD: Subelement len=%u", sub_elem_len);
4013  
4014  		if (sub_elem_len > ml_len - 2) {
4015  			wpa_printf(MSG_DEBUG,
4016  				   "MLD: Invalid link info len: %u > %zu",
4017  				   2 + sub_elem_len, ml_len);
4018  			goto out;
4019  		}
4020  
4021  		switch (*pos) {
4022  		case EHT_ML_SUB_ELEM_PER_STA_PROFILE:
4023  			break;
4024  		case EHT_ML_SUB_ELEM_FRAGMENT:
4025  		case EHT_ML_SUB_ELEM_VENDOR:
4026  			wpa_printf(MSG_DEBUG,
4027  				   "MLD: Skip subelement id=%u, len=%u",
4028  				   *pos, sub_elem_len);
4029  			pos += 2 + sub_elem_len;
4030  			ml_len -= 2 + sub_elem_len;
4031  			continue;
4032  		default:
4033  			wpa_printf(MSG_DEBUG, "MLD: Unknown subelement ID=%u",
4034  				   *pos);
4035  			goto out;
4036  		}
4037  
4038  		end = pos + 2 + sub_elem_len;
4039  
4040  		/* Skip the subelement ID and the length */
4041  		pos += 2;
4042  		ml_len -= 2;
4043  
4044  		if (end - pos < 2)
4045  			goto out;
4046  
4047  		/* Get the station control field */
4048  		ctrl = WPA_GET_LE16(pos);
4049  
4050  		pos += 2;
4051  		ml_len -= 2;
4052  
4053  		if (!(ctrl & EHT_PER_STA_CTRL_COMPLETE_PROFILE_MSK)) {
4054  			wpa_printf(MSG_DEBUG,
4055  				   "MLD: Per STA complete profile expected");
4056  			goto out;
4057  		}
4058  
4059  		if (!(ctrl & EHT_PER_STA_CTRL_MAC_ADDR_PRESENT_MSK)) {
4060  			wpa_printf(MSG_DEBUG,
4061  				   "MLD: Per STA MAC address not present");
4062  			goto out;
4063  		}
4064  
4065  		if (!(ctrl & EHT_PER_STA_CTRL_TSF_OFFSET_PRESENT_MSK)) {
4066  			wpa_printf(MSG_DEBUG,
4067  				   "MLD: Per STA TSF offset not present");
4068  			goto out;
4069  		}
4070  
4071  		if (!(ctrl & EHT_PER_STA_CTRL_BEACON_INTERVAL_PRESENT_MSK)) {
4072  			wpa_printf(MSG_DEBUG,
4073  				   "MLD: Beacon interval not present");
4074  			goto out;
4075  		}
4076  
4077  		if (!(ctrl & EHT_PER_STA_CTRL_DTIM_INFO_PRESENT_MSK)) {
4078  			wpa_printf(MSG_DEBUG,
4079  				   "MLD:  DTIM information not present");
4080  			goto out;
4081  		}
4082  
4083  		if (ctrl & EHT_PER_STA_CTRL_NSTR_LINK_PAIR_PRESENT_MSK) {
4084  			if (ctrl & EHT_PER_STA_CTRL_NSTR_BM_SIZE_MSK)
4085  				nstr_bitmap_len = 2;
4086  			else
4087  				nstr_bitmap_len = 1;
4088  		}
4089  
4090  		if (!(ctrl & EHT_PER_STA_CTRL_BSS_PARAM_CNT_PRESENT_MSK)) {
4091  			wpa_printf(MSG_DEBUG,
4092  				   "MLD:  BSS params change count not present");
4093  			goto out;
4094  		}
4095  
4096  		sta_info_len_min = 1 + ETH_ALEN + 8 + 2 + 2 + 1 +
4097  			nstr_bitmap_len;
4098  		if (sta_info_len_min > ml_len || sta_info_len_min > end - pos ||
4099  		    sta_info_len_min + 2 > sub_elem_len ||
4100  		    sta_info_len_min > *pos) {
4101  			wpa_printf(MSG_DEBUG,
4102  				   "MLD: Invalid STA info min len=%u, len=%u",
4103  				   sta_info_len_min, *pos);
4104  			goto out;
4105  		}
4106  		sta_info_len = *pos;
4107  		/* Make static analyzers happier with an explicit check even
4108  		 * though this was already checked above with *pos.. */
4109  		if (sta_info_len < sta_info_len_min)
4110  			goto out;
4111  
4112  		/* Get the link address */
4113  		wpa_printf(MSG_DEBUG,
4114  			   "MLD: link addr: " MACSTR " nstr BM len=%u",
4115  			   MAC2STR(pos + 1), nstr_bitmap_len);
4116  
4117  		ml_info[i].link_id = ctrl & EHT_PER_STA_CTRL_LINK_ID_MSK;
4118  		os_memcpy(ml_info[i].bssid, pos + 1, ETH_ALEN);
4119  
4120  		pos += sta_info_len;
4121  		ml_len -= sta_info_len;
4122  
4123  		wpa_printf(MSG_DEBUG, "MLD: sub_elem_len=%u, sta_info_len=%u",
4124  			   sub_elem_len, sta_info_len);
4125  
4126  		sub_elem_len -= sta_info_len + 2;
4127  		if (sub_elem_len < 4) {
4128  			wpa_printf(MSG_DEBUG, "MLD: Per STA profile too short");
4129  			goto out;
4130  		}
4131  
4132  		wpa_hexdump(MSG_MSGDUMP, "MLD: STA profile", pos, sub_elem_len);
4133  		ml_info[i].status = WPA_GET_LE16(pos + 2);
4134  
4135  		pos += sub_elem_len;
4136  		ml_len -= sub_elem_len;
4137  
4138  		i++;
4139  	}
4140  
4141  	wpabuf_free(mlbuf);
4142  	return i;
4143  out:
4144  	wpabuf_free(mlbuf);
4145  	return 0;
4146  }
4147  
4148  
wpa_drv_get_mlo_info(struct wpa_supplicant * wpa_s)4149  static int wpa_drv_get_mlo_info(struct wpa_supplicant *wpa_s)
4150  {
4151  	struct driver_sta_mlo_info mlo;
4152  	int i;
4153  
4154  	os_memset(&mlo, 0, sizeof(mlo));
4155  	if (wpas_drv_get_sta_mlo_info(wpa_s, &mlo)) {
4156  		wpa_dbg(wpa_s, MSG_ERROR, "Failed to get MLO link info");
4157  		wpa_supplicant_deauthenticate(wpa_s,
4158  					      WLAN_REASON_DEAUTH_LEAVING);
4159  		return -1;
4160  	}
4161  
4162  	if (wpa_s->valid_links == mlo.valid_links) {
4163  		bool match = true;
4164  
4165  		if (!mlo.valid_links)
4166  			return 0;
4167  
4168  		for_each_link(mlo.valid_links, i) {
4169  			if (!ether_addr_equal(wpa_s->links[i].addr,
4170  					      mlo.links[i].addr) ||
4171  			    !ether_addr_equal(wpa_s->links[i].bssid,
4172  					      mlo.links[i].bssid)) {
4173  				match = false;
4174  				break;
4175  			}
4176  		}
4177  
4178  		if (match && wpa_s->mlo_assoc_link_id == mlo.assoc_link_id &&
4179  		    ether_addr_equal(wpa_s->ap_mld_addr, mlo.ap_mld_addr))
4180  			return 0;
4181  	}
4182  
4183  	wpa_s->valid_links = mlo.valid_links;
4184  	wpa_s->mlo_assoc_link_id = mlo.assoc_link_id;
4185  	os_memcpy(wpa_s->ap_mld_addr, mlo.ap_mld_addr, ETH_ALEN);
4186  	for_each_link(wpa_s->valid_links, i) {
4187  		os_memcpy(wpa_s->links[i].addr, mlo.links[i].addr, ETH_ALEN);
4188  		os_memcpy(wpa_s->links[i].bssid, mlo.links[i].bssid, ETH_ALEN);
4189  		wpa_s->links[i].freq = mlo.links[i].freq;
4190  		wpa_supplicant_update_link_bss(wpa_s, i, mlo.links[i].bssid);
4191  	}
4192  
4193  	return 0;
4194  }
4195  
4196  
wpa_sm_set_ml_info(struct wpa_supplicant * wpa_s)4197  static int wpa_sm_set_ml_info(struct wpa_supplicant *wpa_s)
4198  {
4199  	struct driver_sta_mlo_info drv_mlo;
4200  	struct wpa_sm_mlo wpa_mlo;
4201  	int i;
4202  
4203  	os_memset(&drv_mlo, 0, sizeof(drv_mlo));
4204  	if (wpas_drv_get_sta_mlo_info(wpa_s, &drv_mlo)) {
4205  		wpa_dbg(wpa_s, MSG_INFO, "Failed to get MLO link info");
4206  		return -1;
4207  	}
4208  
4209  	os_memset(&wpa_mlo, 0, sizeof(wpa_mlo));
4210  	if (!drv_mlo.valid_links)
4211  		goto out;
4212  
4213  	os_memcpy(wpa_mlo.ap_mld_addr, drv_mlo.ap_mld_addr, ETH_ALEN);
4214  	wpa_mlo.assoc_link_id = drv_mlo.assoc_link_id;
4215  	wpa_mlo.valid_links = drv_mlo.valid_links;
4216  	wpa_mlo.req_links = drv_mlo.req_links;
4217  
4218  	for_each_link(drv_mlo.req_links, i) {
4219  		struct wpa_bss *bss;
4220  		const u8 *rsne, *rsnxe, *rsnoe, *rsno2e, *rsnxoe;
4221  
4222  		bss = wpa_supplicant_get_new_bss(wpa_s, drv_mlo.links[i].bssid);
4223  		if (!bss) {
4224  			wpa_dbg(wpa_s, MSG_INFO,
4225  				"Failed to get MLO link %d BSS", i);
4226  			return -1;
4227  		}
4228  
4229  		rsne = wpa_bss_get_ie(bss, WLAN_EID_RSN);
4230  		rsnxe = wpa_bss_get_ie(bss, WLAN_EID_RSNX);
4231  		rsnoe = wpa_bss_get_vendor_ie(bss,
4232  					      RSNE_OVERRIDE_IE_VENDOR_TYPE);
4233  		rsno2e = wpa_bss_get_vendor_ie(bss,
4234  					       RSNE_OVERRIDE_2_IE_VENDOR_TYPE);
4235  		rsnxoe = wpa_bss_get_vendor_ie(bss,
4236  					       RSNXE_OVERRIDE_IE_VENDOR_TYPE);
4237  
4238  		wpa_mlo.links[i].ap_rsne = rsne ? (u8 *) rsne : NULL;
4239  		wpa_mlo.links[i].ap_rsne_len = rsne ? 2 + rsne[1] : 0;
4240  		wpa_mlo.links[i].ap_rsnxe = rsnxe ? (u8 *) rsnxe : NULL;
4241  		wpa_mlo.links[i].ap_rsnxe_len = rsnxe ? 2 + rsnxe[1] : 0;
4242  		wpa_mlo.links[i].ap_rsnoe = rsnoe ? (u8 *) rsnoe : NULL;
4243  		wpa_mlo.links[i].ap_rsnoe_len = rsnoe ? 2 + rsnoe[1] : 0;
4244  		wpa_mlo.links[i].ap_rsno2e = rsno2e ? (u8 *) rsno2e : NULL;
4245  		wpa_mlo.links[i].ap_rsno2e_len = rsno2e ? 2 + rsno2e[1] : 0;
4246  		wpa_mlo.links[i].ap_rsnxoe = rsnxoe ? (u8 *) rsnxoe : NULL;
4247  		wpa_mlo.links[i].ap_rsnxoe_len = rsnxoe ? 2 + rsnxoe[1] : 0;
4248  
4249  		os_memcpy(wpa_mlo.links[i].bssid, drv_mlo.links[i].bssid,
4250  			  ETH_ALEN);
4251  		os_memcpy(wpa_mlo.links[i].addr, drv_mlo.links[i].addr,
4252  			  ETH_ALEN);
4253  	}
4254  
4255  out:
4256  	return wpa_sm_set_mlo_params(wpa_s->wpa, &wpa_mlo);
4257  }
4258  
4259  
wpa_supplicant_event_assoc(struct wpa_supplicant * wpa_s,union wpa_event_data * data)4260  static void wpa_supplicant_event_assoc(struct wpa_supplicant *wpa_s,
4261  				       union wpa_event_data *data)
4262  {
4263  	u8 bssid[ETH_ALEN];
4264  	int ft_completed, already_authorized;
4265  	int new_bss = 0;
4266  #if defined(CONFIG_FILS) || defined(CONFIG_MBO)
4267  	struct wpa_bss *bss;
4268  #endif /* CONFIG_FILS || CONFIG_MBO */
4269  
4270  #ifdef CONFIG_AP
4271  	if (wpa_s->ap_iface) {
4272  		if (!data)
4273  			return;
4274  		hostapd_notif_assoc(wpa_s->ap_iface->bss[0],
4275  				    data->assoc_info.addr,
4276  				    data->assoc_info.req_ies,
4277  				    data->assoc_info.req_ies_len, NULL, 0,
4278  				    NULL, data->assoc_info.reassoc);
4279  		return;
4280  	}
4281  #endif /* CONFIG_AP */
4282  
4283  	eloop_cancel_timeout(wpas_network_reenabled, wpa_s, NULL);
4284  	wpa_s->own_reconnect_req = 0;
4285  
4286  	ft_completed = wpa_ft_is_completed(wpa_s->wpa);
4287  
4288  	if (wpa_drv_get_bssid(wpa_s, bssid) < 0) {
4289  		wpa_dbg(wpa_s, MSG_ERROR, "Failed to get BSSID");
4290  		wpa_supplicant_deauthenticate(
4291  			wpa_s, WLAN_REASON_DEAUTH_LEAVING);
4292  		return;
4293  	}
4294  
4295  	if (wpa_drv_get_mlo_info(wpa_s) < 0) {
4296  		wpa_dbg(wpa_s, MSG_ERROR, "Failed to get MLO connection info");
4297  		wpa_supplicant_deauthenticate(wpa_s,
4298  					      WLAN_REASON_DEAUTH_LEAVING);
4299  		return;
4300  	}
4301  
4302  	if (ft_completed &&
4303  	    (wpa_s->drv_flags & WPA_DRIVER_FLAGS_BSS_SELECTION)) {
4304  		wpa_msg(wpa_s, MSG_INFO, "Attempt to roam to " MACSTR,
4305  			MAC2STR(bssid));
4306  		if (!wpa_supplicant_update_current_bss(wpa_s, bssid)) {
4307  			wpa_printf(MSG_ERROR,
4308  				   "Can't find target AP's information!");
4309  			return;
4310  		}
4311  		wpa_supplicant_assoc_update_ie(wpa_s);
4312  	}
4313  
4314  	if (data && wpa_supplicant_event_associnfo(wpa_s, data) < 0)
4315  		return;
4316  	/*
4317  	 * FILS authentication can share the same mechanism to mark the
4318  	 * connection fully authenticated, so set ft_completed also based on
4319  	 * FILS result.
4320  	 */
4321  	if (!ft_completed)
4322  		ft_completed = wpa_fils_is_completed(wpa_s->wpa);
4323  
4324  	wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATED);
4325  	if (!ether_addr_equal(bssid, wpa_s->bssid)) {
4326  		if (os_reltime_initialized(&wpa_s->session_start)) {
4327  			os_reltime_age(&wpa_s->session_start,
4328  				       &wpa_s->session_length);
4329  			wpa_s->session_start.sec = 0;
4330  			wpa_s->session_start.usec = 0;
4331  			wpas_notify_session_length(wpa_s);
4332  		} else {
4333  			wpas_notify_auth_changed(wpa_s);
4334  			os_get_reltime(&wpa_s->session_start);
4335  		}
4336  		wpa_dbg(wpa_s, MSG_DEBUG, "Associated to a new BSS: BSSID="
4337  			MACSTR, MAC2STR(bssid));
4338  		new_bss = 1;
4339  		random_add_randomness(bssid, ETH_ALEN);
4340  		os_memcpy(wpa_s->bssid, bssid, ETH_ALEN);
4341  		os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
4342  		wpas_notify_bssid_changed(wpa_s);
4343  
4344  		if (wpa_supplicant_dynamic_keys(wpa_s) && !ft_completed) {
4345  			wpa_clear_keys(wpa_s, bssid);
4346  		}
4347  		if (wpa_supplicant_select_config(wpa_s, data) < 0) {
4348  			wpa_supplicant_deauthenticate(
4349  				wpa_s, WLAN_REASON_DEAUTH_LEAVING);
4350  			return;
4351  		}
4352  	}
4353  
4354  	if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) &&
4355  	    data && wpa_supplicant_use_own_rsne_params(wpa_s, data) < 0)
4356  		return;
4357  
4358  	multi_ap_set_4addr_mode(wpa_s);
4359  
4360  	if (wpa_s->conf->ap_scan == 1 &&
4361  	    wpa_s->drv_flags & WPA_DRIVER_FLAGS_BSS_SELECTION) {
4362  		if (wpa_supplicant_assoc_update_ie(wpa_s) < 0 && new_bss)
4363  			wpa_msg(wpa_s, MSG_WARNING,
4364  				"WPA/RSN IEs not updated");
4365  	}
4366  
4367  	wpas_fst_update_mb_assoc(wpa_s, data);
4368  
4369  #ifdef CONFIG_SME
4370  	/*
4371  	 * Cache the current AP's BSSID (for non-MLO connection) or MLD address
4372  	 * (for MLO connection) as the previous BSSID for subsequent
4373  	 * reassociation requests handled by SME-in-wpa_supplicant.
4374  	 */
4375  	os_memcpy(wpa_s->sme.prev_bssid,
4376  		  wpa_s->valid_links ? wpa_s->ap_mld_addr : bssid, ETH_ALEN);
4377  	wpa_s->sme.prev_bssid_set = 1;
4378  	wpa_s->sme.last_unprot_disconnect.sec = 0;
4379  #endif /* CONFIG_SME */
4380  
4381  	wpa_msg(wpa_s, MSG_INFO, "Associated with " MACSTR, MAC2STR(bssid));
4382  	if (wpa_s->current_ssid) {
4383  		/* When using scanning (ap_scan=1), SIM PC/SC interface can be
4384  		 * initialized before association, but for other modes,
4385  		 * initialize PC/SC here, if the current configuration needs
4386  		 * smartcard or SIM/USIM. */
4387  		wpa_supplicant_scard_init(wpa_s, wpa_s->current_ssid);
4388  	}
4389  	wpa_sm_notify_assoc(wpa_s->wpa, bssid);
4390  
4391  	if (wpa_sm_set_ml_info(wpa_s)) {
4392  		wpa_dbg(wpa_s, MSG_INFO,
4393  			"Failed to set MLO connection info to wpa_sm");
4394  		wpa_supplicant_deauthenticate(wpa_s,
4395  					      WLAN_REASON_DEAUTH_LEAVING);
4396  		return;
4397  	}
4398  
4399  	if (wpa_s->l2)
4400  		l2_packet_notify_auth_start(wpa_s->l2);
4401  
4402  	already_authorized = data && data->assoc_info.authorized;
4403  
4404  	/*
4405  	 * Set portEnabled first to false in order to get EAP state machine out
4406  	 * of the SUCCESS state and eapSuccess cleared. Without this, EAPOL PAE
4407  	 * state machine may transit to AUTHENTICATING state based on obsolete
4408  	 * eapSuccess and then trigger BE_AUTH to SUCCESS and PAE to
4409  	 * AUTHENTICATED without ever giving chance to EAP state machine to
4410  	 * reset the state.
4411  	 */
4412  	if (!ft_completed && !already_authorized) {
4413  		eapol_sm_notify_portEnabled(wpa_s->eapol, false);
4414  		eapol_sm_notify_portValid(wpa_s->eapol, false);
4415  	}
4416  	if (wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) ||
4417  	    wpa_s->key_mgmt == WPA_KEY_MGMT_DPP ||
4418  	    wpa_s->key_mgmt == WPA_KEY_MGMT_OWE || ft_completed ||
4419  	    already_authorized || wpa_s->drv_authorized_port)
4420  		eapol_sm_notify_eap_success(wpa_s->eapol, false);
4421  	/* 802.1X::portControl = Auto */
4422  	eapol_sm_notify_portEnabled(wpa_s->eapol, true);
4423  	wpa_s->eapol_received = 0;
4424  	if (wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
4425  	    wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE ||
4426  	    (wpa_s->current_ssid &&
4427  	     wpa_s->current_ssid->mode == WPAS_MODE_IBSS)) {
4428  		if (wpa_s->current_ssid &&
4429  		    wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE &&
4430  		    (wpa_s->drv_flags &
4431  		     WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC_DONE)) {
4432  			/*
4433  			 * Set the key after having received joined-IBSS event
4434  			 * from the driver.
4435  			 */
4436  			wpa_supplicant_set_wpa_none_key(wpa_s,
4437  							wpa_s->current_ssid);
4438  		}
4439  		wpa_supplicant_cancel_auth_timeout(wpa_s);
4440  		wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
4441  	} else if (!ft_completed) {
4442  		/* Timeout for receiving the first EAPOL packet */
4443  		wpa_supplicant_req_auth_timeout(wpa_s, 10, 0);
4444  	}
4445  	wpa_supplicant_cancel_scan(wpa_s);
4446  
4447  	if (ft_completed) {
4448  		/*
4449  		 * FT protocol completed - make sure EAPOL state machine ends
4450  		 * up in authenticated.
4451  		 */
4452  		wpa_supplicant_cancel_auth_timeout(wpa_s);
4453  		wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
4454  		eapol_sm_notify_portValid(wpa_s->eapol, true);
4455  		eapol_sm_notify_eap_success(wpa_s->eapol, true);
4456  	} else if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_PSK) &&
4457  		   wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt)) {
4458  		if (already_authorized) {
4459  			/*
4460  			 * We are done; the driver will take care of RSN 4-way
4461  			 * handshake.
4462  			 */
4463  			wpa_supplicant_cancel_auth_timeout(wpa_s);
4464  			wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
4465  			eapol_sm_notify_portValid(wpa_s->eapol, true);
4466  			eapol_sm_notify_eap_success(wpa_s->eapol, true);
4467  		} else {
4468  			/* Update port, WPA_COMPLETED state from the
4469  			 * EVENT_PORT_AUTHORIZED handler when the driver is done
4470  			 * with the 4-way handshake.
4471  			 */
4472  			wpa_msg(wpa_s, MSG_DEBUG,
4473  				"ASSOC INFO: wait for driver port authorized indication");
4474  		}
4475  	} else if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_8021X) &&
4476  		   wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt)) {
4477  		/*
4478  		 * The driver will take care of RSN 4-way handshake, so we need
4479  		 * to allow EAPOL supplicant to complete its work without
4480  		 * waiting for WPA supplicant.
4481  		 */
4482  		eapol_sm_notify_portValid(wpa_s->eapol, true);
4483  	}
4484  
4485  	wpa_s->last_eapol_matches_bssid = 0;
4486  
4487  #ifdef CONFIG_TESTING_OPTIONS
4488  	if (wpa_s->rsne_override_eapol) {
4489  		wpa_printf(MSG_DEBUG,
4490  			   "TESTING: RSNE EAPOL-Key msg 2/4 override");
4491  		wpa_sm_set_assoc_wpa_ie(wpa_s->wpa,
4492  					wpabuf_head(wpa_s->rsne_override_eapol),
4493  					wpabuf_len(wpa_s->rsne_override_eapol));
4494  	}
4495  	if (wpa_s->rsnxe_override_eapol) {
4496  		wpa_printf(MSG_DEBUG,
4497  			   "TESTING: RSNXE EAPOL-Key msg 2/4 override");
4498  		wpa_sm_set_assoc_rsnxe(wpa_s->wpa,
4499  				       wpabuf_head(wpa_s->rsnxe_override_eapol),
4500  				       wpabuf_len(wpa_s->rsnxe_override_eapol));
4501  	}
4502  #endif /* CONFIG_TESTING_OPTIONS */
4503  
4504  	if (wpa_s->pending_eapol_rx) {
4505  		struct os_reltime now, age;
4506  		os_get_reltime(&now);
4507  		os_reltime_sub(&now, &wpa_s->pending_eapol_rx_time, &age);
4508  		if (age.sec == 0 && age.usec < 200000 &&
4509  		    ether_addr_equal(wpa_s->pending_eapol_rx_src,
4510  				     wpa_s->valid_links ? wpa_s->ap_mld_addr :
4511  				     bssid)) {
4512  			wpa_dbg(wpa_s, MSG_DEBUG, "Process pending EAPOL "
4513  				"frame that was received just before "
4514  				"association notification");
4515  			wpa_supplicant_rx_eapol(
4516  				wpa_s, wpa_s->pending_eapol_rx_src,
4517  				wpabuf_head(wpa_s->pending_eapol_rx),
4518  				wpabuf_len(wpa_s->pending_eapol_rx),
4519  				wpa_s->pending_eapol_encrypted);
4520  		}
4521  		wpabuf_free(wpa_s->pending_eapol_rx);
4522  		wpa_s->pending_eapol_rx = NULL;
4523  	}
4524  
4525  #ifdef CONFIG_WEP
4526  	if ((wpa_s->key_mgmt == WPA_KEY_MGMT_NONE ||
4527  	     wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X_NO_WPA) &&
4528  	    wpa_s->current_ssid &&
4529  	    (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC_DONE)) {
4530  		/* Set static WEP keys again */
4531  		wpa_set_wep_keys(wpa_s, wpa_s->current_ssid);
4532  	}
4533  #endif /* CONFIG_WEP */
4534  
4535  #ifdef CONFIG_IBSS_RSN
4536  	if (wpa_s->current_ssid &&
4537  	    wpa_s->current_ssid->mode == WPAS_MODE_IBSS &&
4538  	    wpa_s->key_mgmt != WPA_KEY_MGMT_NONE &&
4539  	    wpa_s->key_mgmt != WPA_KEY_MGMT_WPA_NONE &&
4540  	    wpa_s->ibss_rsn == NULL) {
4541  		wpa_s->ibss_rsn = ibss_rsn_init(wpa_s, wpa_s->current_ssid);
4542  		if (!wpa_s->ibss_rsn) {
4543  			wpa_msg(wpa_s, MSG_INFO, "Failed to init IBSS RSN");
4544  			wpa_supplicant_deauthenticate(
4545  				wpa_s, WLAN_REASON_DEAUTH_LEAVING);
4546  			return;
4547  		}
4548  
4549  		ibss_rsn_set_psk(wpa_s->ibss_rsn, wpa_s->current_ssid->psk);
4550  	}
4551  #endif /* CONFIG_IBSS_RSN */
4552  
4553  	wpas_wps_notify_assoc(wpa_s, bssid);
4554  
4555  #ifndef CONFIG_NO_WMM_AC
4556  	if (data) {
4557  		wmm_ac_notify_assoc(wpa_s, data->assoc_info.resp_ies,
4558  				    data->assoc_info.resp_ies_len,
4559  				    &data->assoc_info.wmm_params);
4560  
4561  		if (wpa_s->reassoc_same_bss)
4562  			wmm_ac_restore_tspecs(wpa_s);
4563  	}
4564  #endif /* CONFIG_NO_WMM_AC */
4565  
4566  #if defined(CONFIG_FILS) || defined(CONFIG_MBO)
4567  	bss = wpa_bss_get_bssid(wpa_s, bssid);
4568  #endif /* CONFIG_FILS || CONFIG_MBO */
4569  #ifdef CONFIG_FILS
4570  	if (wpa_key_mgmt_fils(wpa_s->key_mgmt)) {
4571  		const u8 *fils_cache_id = wpa_bss_get_fils_cache_id(bss);
4572  
4573  		if (fils_cache_id)
4574  			wpa_sm_set_fils_cache_id(wpa_s->wpa, fils_cache_id);
4575  	}
4576  #endif /* CONFIG_FILS */
4577  
4578  #ifdef CONFIG_MBO
4579  	wpas_mbo_check_pmf(wpa_s, bss, wpa_s->current_ssid);
4580  #endif /* CONFIG_MBO */
4581  
4582  #ifdef CONFIG_DPP2
4583  	wpa_s->dpp_pfs_fallback = 0;
4584  #endif /* CONFIG_DPP2 */
4585  
4586  	if (wpa_s->current_ssid && wpa_s->current_ssid->enable_4addr_mode)
4587  		wpa_supplicant_set_4addr_mode(wpa_s);
4588  }
4589  
4590  
disconnect_reason_recoverable(u16 reason_code)4591  static int disconnect_reason_recoverable(u16 reason_code)
4592  {
4593  	return reason_code == WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY ||
4594  		reason_code == WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA ||
4595  		reason_code == WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA;
4596  }
4597  
4598  
wpa_supplicant_event_disassoc(struct wpa_supplicant * wpa_s,u16 reason_code,int locally_generated)4599  static void wpa_supplicant_event_disassoc(struct wpa_supplicant *wpa_s,
4600  					  u16 reason_code,
4601  					  int locally_generated)
4602  {
4603  	const u8 *bssid;
4604  
4605  	if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
4606  		/*
4607  		 * At least Host AP driver and a Prism3 card seemed to be
4608  		 * generating streams of disconnected events when configuring
4609  		 * IBSS for WPA-None. Ignore them for now.
4610  		 */
4611  		return;
4612  	}
4613  
4614  	bssid = wpa_s->bssid;
4615  	if (is_zero_ether_addr(bssid))
4616  		bssid = wpa_s->pending_bssid;
4617  
4618  	if (!is_zero_ether_addr(bssid) ||
4619  	    wpa_s->wpa_state >= WPA_AUTHENTICATING) {
4620  		wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_DISCONNECTED "bssid=" MACSTR
4621  			" reason=%d%s",
4622  			MAC2STR(bssid), reason_code,
4623  			locally_generated ? " locally_generated=1" : "");
4624  	}
4625  }
4626  
4627  
could_be_psk_mismatch(struct wpa_supplicant * wpa_s,u16 reason_code,int locally_generated)4628  static int could_be_psk_mismatch(struct wpa_supplicant *wpa_s, u16 reason_code,
4629  				 int locally_generated)
4630  {
4631  	if (wpa_s->wpa_state != WPA_4WAY_HANDSHAKE ||
4632  	    !wpa_s->new_connection ||
4633  	    !wpa_key_mgmt_wpa_psk(wpa_s->key_mgmt) ||
4634  	    wpa_key_mgmt_sae(wpa_s->key_mgmt))
4635  		return 0; /* Not in initial 4-way handshake with PSK */
4636  
4637  	/*
4638  	 * It looks like connection was lost while trying to go through PSK
4639  	 * 4-way handshake. Filter out known disconnection cases that are caused
4640  	 * by something else than PSK mismatch to avoid confusing reports.
4641  	 */
4642  
4643  	if (locally_generated) {
4644  		if (reason_code == WLAN_REASON_IE_IN_4WAY_DIFFERS)
4645  			return 0;
4646  	}
4647  
4648  	return 1;
4649  }
4650  
4651  
wpa_supplicant_event_disassoc_finish(struct wpa_supplicant * wpa_s,u16 reason_code,int locally_generated)4652  static void wpa_supplicant_event_disassoc_finish(struct wpa_supplicant *wpa_s,
4653  						 u16 reason_code,
4654  						 int locally_generated)
4655  {
4656  	const u8 *bssid;
4657  	struct wpa_bss *fast_reconnect = NULL;
4658  	struct wpa_ssid *fast_reconnect_ssid = NULL;
4659  	struct wpa_bss *curr = NULL;
4660  
4661  	if (wpa_s->key_mgmt == WPA_KEY_MGMT_WPA_NONE) {
4662  		/*
4663  		 * At least Host AP driver and a Prism3 card seemed to be
4664  		 * generating streams of disconnected events when configuring
4665  		 * IBSS for WPA-None. Ignore them for now.
4666  		 */
4667  		wpa_dbg(wpa_s, MSG_DEBUG, "Disconnect event - ignore in "
4668  			"IBSS/WPA-None mode");
4669  		return;
4670  	}
4671  
4672  	if (!wpa_s->disconnected && wpa_s->wpa_state >= WPA_AUTHENTICATING &&
4673  	    reason_code == WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY &&
4674  	    locally_generated)
4675  		/*
4676  		 * Remove the inactive AP (which is probably out of range) from
4677  		 * the BSS list after marking disassociation. In particular
4678  		 * mac80211-based drivers use the
4679  		 * WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY reason code in
4680  		 * locally generated disconnection events for cases where the
4681  		 * AP does not reply anymore.
4682  		 */
4683  		curr = wpa_s->current_bss;
4684  
4685  	if (could_be_psk_mismatch(wpa_s, reason_code, locally_generated)) {
4686  		wpa_msg(wpa_s, MSG_INFO, "WPA: 4-Way Handshake failed - "
4687  			"pre-shared key may be incorrect");
4688  		if (wpas_p2p_4way_hs_failed(wpa_s) > 0)
4689  			return; /* P2P group removed */
4690  		wpas_auth_failed(wpa_s, "WRONG_KEY", wpa_s->pending_bssid);
4691  		wpas_notify_psk_mismatch(wpa_s);
4692  	}
4693  	if (!wpa_s->disconnected &&
4694  	    (!wpa_s->auto_reconnect_disabled ||
4695  	     wpa_s->key_mgmt == WPA_KEY_MGMT_WPS ||
4696  	     wpas_wps_searching(wpa_s) ||
4697  	     wpas_wps_reenable_networks_pending(wpa_s))) {
4698  		wpa_dbg(wpa_s, MSG_DEBUG, "Auto connect enabled: try to "
4699  			"reconnect (wps=%d/%d wpa_state=%d)",
4700  			wpa_s->key_mgmt == WPA_KEY_MGMT_WPS,
4701  			wpas_wps_searching(wpa_s),
4702  			wpa_s->wpa_state);
4703  		if (wpa_s->wpa_state == WPA_COMPLETED &&
4704  		    wpa_s->current_ssid &&
4705  		    wpa_s->current_ssid->mode == WPAS_MODE_INFRA &&
4706  		    (wpa_s->own_reconnect_req ||
4707  		     (!locally_generated &&
4708  		      disconnect_reason_recoverable(reason_code)))) {
4709  			/*
4710  			 * It looks like the AP has dropped association with
4711  			 * us, but could allow us to get back in. This is also
4712  			 * triggered for cases where local reconnection request
4713  			 * is used to force reassociation with the same BSS.
4714  			 * Try to reconnect to the same BSS without a full scan
4715  			 * to save time for some common cases.
4716  			 */
4717  			fast_reconnect = wpa_s->current_bss;
4718  			fast_reconnect_ssid = wpa_s->current_ssid;
4719  		} else if (wpa_s->wpa_state >= WPA_ASSOCIATING) {
4720  			wpa_supplicant_req_scan(wpa_s, 0, 100000);
4721  		} else {
4722  			wpa_dbg(wpa_s, MSG_DEBUG, "Do not request new "
4723  				"immediate scan");
4724  		}
4725  	} else {
4726  		wpa_dbg(wpa_s, MSG_DEBUG, "Auto connect disabled: do not "
4727  			"try to re-connect");
4728  		wpa_s->reassociate = 0;
4729  		wpa_s->disconnected = 1;
4730  		if (!wpa_s->pno)
4731  			wpa_supplicant_cancel_sched_scan(wpa_s);
4732  	}
4733  	bssid = wpa_s->bssid;
4734  	if (is_zero_ether_addr(bssid))
4735  		bssid = wpa_s->pending_bssid;
4736  	if (wpa_s->wpa_state >= WPA_AUTHENTICATING)
4737  		wpas_connection_failed(wpa_s, bssid, NULL);
4738  	wpa_sm_notify_disassoc(wpa_s->wpa);
4739  	ptksa_cache_flush(wpa_s->ptksa, wpa_s->bssid, WPA_CIPHER_NONE);
4740  
4741  	if (locally_generated)
4742  		wpa_s->disconnect_reason = -reason_code;
4743  	else
4744  		wpa_s->disconnect_reason = reason_code;
4745  	wpas_notify_disconnect_reason(wpa_s);
4746  #ifdef CONFIG_DPP2
4747  	wpas_dpp_send_conn_status_result(wpa_s, DPP_STATUS_AUTH_FAILURE);
4748  #endif /* CONFIG_DPP2 */
4749  	if (wpa_supplicant_dynamic_keys(wpa_s)) {
4750  		wpa_dbg(wpa_s, MSG_DEBUG, "Disconnect event - remove keys");
4751  		wpa_clear_keys(wpa_s, wpa_s->bssid);
4752  	}
4753  	wpa_supplicant_mark_disassoc(wpa_s);
4754  
4755  	if (curr)
4756  		wpa_bss_remove(wpa_s, curr, "Connection to AP lost");
4757  
4758  	if (fast_reconnect &&
4759  	    !wpas_network_disabled(wpa_s, fast_reconnect_ssid) &&
4760  	    !disallowed_bssid(wpa_s, fast_reconnect->bssid) &&
4761  	    !disallowed_ssid(wpa_s, fast_reconnect->ssid,
4762  			     fast_reconnect->ssid_len) &&
4763  	    !wpas_temp_disabled(wpa_s, fast_reconnect_ssid) &&
4764  	    !wpa_is_bss_tmp_disallowed(wpa_s, fast_reconnect)) {
4765  #ifndef CONFIG_NO_SCAN_PROCESSING
4766  		wpa_dbg(wpa_s, MSG_DEBUG, "Try to reconnect to the same BSS");
4767  		if (wpa_supplicant_connect(wpa_s, fast_reconnect,
4768  					   fast_reconnect_ssid) < 0) {
4769  			/* Recover through full scan */
4770  			wpa_supplicant_req_scan(wpa_s, 0, 100000);
4771  		}
4772  #endif /* CONFIG_NO_SCAN_PROCESSING */
4773  	} else if (fast_reconnect) {
4774  		/*
4775  		 * Could not reconnect to the same BSS due to network being
4776  		 * disabled. Use a new scan to match the alternative behavior
4777  		 * above, i.e., to continue automatic reconnection attempt in a
4778  		 * way that enforces disabled network rules.
4779  		 */
4780  		wpa_supplicant_req_scan(wpa_s, 0, 100000);
4781  	}
4782  }
4783  
4784  
4785  #ifdef CONFIG_DELAYED_MIC_ERROR_REPORT
wpa_supplicant_delayed_mic_error_report(void * eloop_ctx,void * sock_ctx)4786  void wpa_supplicant_delayed_mic_error_report(void *eloop_ctx, void *sock_ctx)
4787  {
4788  	struct wpa_supplicant *wpa_s = eloop_ctx;
4789  
4790  	if (!wpa_s->pending_mic_error_report)
4791  		return;
4792  
4793  	wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Sending pending MIC error report");
4794  	wpa_sm_key_request(wpa_s->wpa, 1, wpa_s->pending_mic_error_pairwise);
4795  	wpa_s->pending_mic_error_report = 0;
4796  }
4797  #endif /* CONFIG_DELAYED_MIC_ERROR_REPORT */
4798  
4799  
4800  static void
wpa_supplicant_event_michael_mic_failure(struct wpa_supplicant * wpa_s,union wpa_event_data * data)4801  wpa_supplicant_event_michael_mic_failure(struct wpa_supplicant *wpa_s,
4802  					 union wpa_event_data *data)
4803  {
4804  	int pairwise;
4805  	struct os_reltime t;
4806  
4807  	wpa_msg(wpa_s, MSG_WARNING, "Michael MIC failure detected");
4808  	pairwise = (data && data->michael_mic_failure.unicast);
4809  	os_get_reltime(&t);
4810  	if ((os_reltime_initialized(&wpa_s->last_michael_mic_error) &&
4811  	     !os_reltime_expired(&t, &wpa_s->last_michael_mic_error, 60)) ||
4812  	    wpa_s->pending_mic_error_report) {
4813  		if (wpa_s->pending_mic_error_report) {
4814  			/*
4815  			 * Send the pending MIC error report immediately since
4816  			 * we are going to start countermeasures and AP better
4817  			 * do the same.
4818  			 */
4819  			wpa_sm_key_request(wpa_s->wpa, 1,
4820  					   wpa_s->pending_mic_error_pairwise);
4821  		}
4822  
4823  		/* Send the new MIC error report immediately since we are going
4824  		 * to start countermeasures and AP better do the same.
4825  		 */
4826  		wpa_sm_key_request(wpa_s->wpa, 1, pairwise);
4827  
4828  		/* initialize countermeasures */
4829  		wpa_s->countermeasures = 1;
4830  
4831  		wpa_bssid_ignore_add(wpa_s, wpa_s->bssid);
4832  
4833  		wpa_msg(wpa_s, MSG_WARNING, "TKIP countermeasures started");
4834  
4835  		/*
4836  		 * Need to wait for completion of request frame. We do not get
4837  		 * any callback for the message completion, so just wait a
4838  		 * short while and hope for the best. */
4839  		os_sleep(0, 10000);
4840  
4841  		wpa_drv_set_countermeasures(wpa_s, 1);
4842  		wpa_supplicant_deauthenticate(wpa_s,
4843  					      WLAN_REASON_MICHAEL_MIC_FAILURE);
4844  		eloop_cancel_timeout(wpa_supplicant_stop_countermeasures,
4845  				     wpa_s, NULL);
4846  		eloop_register_timeout(60, 0,
4847  				       wpa_supplicant_stop_countermeasures,
4848  				       wpa_s, NULL);
4849  		/* TODO: mark the AP rejected for 60 second. STA is
4850  		 * allowed to associate with another AP.. */
4851  	} else {
4852  #ifdef CONFIG_DELAYED_MIC_ERROR_REPORT
4853  		if (wpa_s->mic_errors_seen) {
4854  			/*
4855  			 * Reduce the effectiveness of Michael MIC error
4856  			 * reports as a means for attacking against TKIP if
4857  			 * more than one MIC failure is noticed with the same
4858  			 * PTK. We delay the transmission of the reports by a
4859  			 * random time between 0 and 60 seconds in order to
4860  			 * force the attacker wait 60 seconds before getting
4861  			 * the information on whether a frame resulted in a MIC
4862  			 * failure.
4863  			 */
4864  			u8 rval[4];
4865  			int sec;
4866  
4867  			if (os_get_random(rval, sizeof(rval)) < 0)
4868  				sec = os_random() % 60;
4869  			else
4870  				sec = WPA_GET_BE32(rval) % 60;
4871  			wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Delay MIC error "
4872  				"report %d seconds", sec);
4873  			wpa_s->pending_mic_error_report = 1;
4874  			wpa_s->pending_mic_error_pairwise = pairwise;
4875  			eloop_cancel_timeout(
4876  				wpa_supplicant_delayed_mic_error_report,
4877  				wpa_s, NULL);
4878  			eloop_register_timeout(
4879  				sec, os_random() % 1000000,
4880  				wpa_supplicant_delayed_mic_error_report,
4881  				wpa_s, NULL);
4882  		} else {
4883  			wpa_sm_key_request(wpa_s->wpa, 1, pairwise);
4884  		}
4885  #else /* CONFIG_DELAYED_MIC_ERROR_REPORT */
4886  		wpa_sm_key_request(wpa_s->wpa, 1, pairwise);
4887  #endif /* CONFIG_DELAYED_MIC_ERROR_REPORT */
4888  	}
4889  	wpa_s->last_michael_mic_error = t;
4890  	wpa_s->mic_errors_seen++;
4891  }
4892  
4893  
4894  #ifdef CONFIG_TERMINATE_ONLASTIF
any_interfaces(struct wpa_supplicant * head)4895  static int any_interfaces(struct wpa_supplicant *head)
4896  {
4897  	struct wpa_supplicant *wpa_s;
4898  
4899  	for (wpa_s = head; wpa_s != NULL; wpa_s = wpa_s->next)
4900  		if (!wpa_s->interface_removed)
4901  			return 1;
4902  	return 0;
4903  }
4904  #endif /* CONFIG_TERMINATE_ONLASTIF */
4905  
4906  
4907  static void
wpa_supplicant_event_interface_status(struct wpa_supplicant * wpa_s,union wpa_event_data * data)4908  wpa_supplicant_event_interface_status(struct wpa_supplicant *wpa_s,
4909  				      union wpa_event_data *data)
4910  {
4911  	if (os_strcmp(wpa_s->ifname, data->interface_status.ifname) != 0)
4912  		return;
4913  
4914  	switch (data->interface_status.ievent) {
4915  	case EVENT_INTERFACE_ADDED:
4916  		if (!wpa_s->interface_removed)
4917  			break;
4918  		wpa_s->interface_removed = 0;
4919  		wpa_dbg(wpa_s, MSG_DEBUG, "Configured interface was added");
4920  		if (wpa_supplicant_driver_init(wpa_s) < 0) {
4921  			wpa_msg(wpa_s, MSG_INFO, "Failed to initialize the "
4922  				"driver after interface was added");
4923  		}
4924  
4925  #ifdef CONFIG_P2P
4926  		if (!wpa_s->global->p2p &&
4927  		    !wpa_s->global->p2p_disabled &&
4928  		    !wpa_s->conf->p2p_disabled &&
4929  		    (wpa_s->drv_flags &
4930  		     WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE) &&
4931  		    wpas_p2p_add_p2pdev_interface(
4932  			    wpa_s, wpa_s->global->params.conf_p2p_dev) < 0) {
4933  			wpa_printf(MSG_INFO,
4934  				   "P2P: Failed to enable P2P Device interface");
4935  			/* Try to continue without. P2P will be disabled. */
4936  		}
4937  #endif /* CONFIG_P2P */
4938  
4939  		break;
4940  	case EVENT_INTERFACE_REMOVED:
4941  		wpa_dbg(wpa_s, MSG_DEBUG, "Configured interface was removed");
4942  		wpa_s->interface_removed = 1;
4943  		wpa_supplicant_mark_disassoc(wpa_s);
4944  		wpa_supplicant_set_state(wpa_s, WPA_INTERFACE_DISABLED);
4945  		l2_packet_deinit(wpa_s->l2);
4946  		wpa_s->l2 = NULL;
4947  
4948  #ifdef CONFIG_P2P
4949  		if (wpa_s->global->p2p &&
4950  		    wpa_s->global->p2p_init_wpa_s->parent == wpa_s &&
4951  		    (wpa_s->drv_flags &
4952  		     WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)) {
4953  			wpa_dbg(wpa_s, MSG_DEBUG,
4954  				"Removing P2P Device interface");
4955  			wpa_supplicant_remove_iface(
4956  				wpa_s->global, wpa_s->global->p2p_init_wpa_s,
4957  				0);
4958  			wpa_s->global->p2p_init_wpa_s = NULL;
4959  		}
4960  #endif /* CONFIG_P2P */
4961  
4962  #ifdef CONFIG_MATCH_IFACE
4963  		if (wpa_s->matched) {
4964  			wpa_supplicant_remove_iface(wpa_s->global, wpa_s, 0);
4965  			break;
4966  		}
4967  #endif /* CONFIG_MATCH_IFACE */
4968  
4969  #ifdef CONFIG_TERMINATE_ONLASTIF
4970  		/* check if last interface */
4971  		if (!any_interfaces(wpa_s->global->ifaces))
4972  			eloop_terminate();
4973  #endif /* CONFIG_TERMINATE_ONLASTIF */
4974  		break;
4975  	}
4976  }
4977  
4978  
4979  #ifdef CONFIG_TDLS
wpa_supplicant_event_tdls(struct wpa_supplicant * wpa_s,union wpa_event_data * data)4980  static void wpa_supplicant_event_tdls(struct wpa_supplicant *wpa_s,
4981  				      union wpa_event_data *data)
4982  {
4983  	if (data == NULL)
4984  		return;
4985  	switch (data->tdls.oper) {
4986  	case TDLS_REQUEST_SETUP:
4987  		wpa_tdls_remove(wpa_s->wpa, data->tdls.peer);
4988  		if (wpa_tdls_is_external_setup(wpa_s->wpa))
4989  			wpa_tdls_start(wpa_s->wpa, data->tdls.peer);
4990  		else
4991  			wpa_drv_tdls_oper(wpa_s, TDLS_SETUP, data->tdls.peer);
4992  		break;
4993  	case TDLS_REQUEST_TEARDOWN:
4994  		if (wpa_tdls_is_external_setup(wpa_s->wpa))
4995  			wpa_tdls_teardown_link(wpa_s->wpa, data->tdls.peer,
4996  					       data->tdls.reason_code);
4997  		else
4998  			wpa_drv_tdls_oper(wpa_s, TDLS_TEARDOWN,
4999  					  data->tdls.peer);
5000  		break;
5001  	case TDLS_REQUEST_DISCOVER:
5002  			wpa_tdls_send_discovery_request(wpa_s->wpa,
5003  							data->tdls.peer);
5004  		break;
5005  	}
5006  }
5007  #endif /* CONFIG_TDLS */
5008  
5009  
5010  #ifdef CONFIG_WNM
wpa_supplicant_event_wnm(struct wpa_supplicant * wpa_s,union wpa_event_data * data)5011  static void wpa_supplicant_event_wnm(struct wpa_supplicant *wpa_s,
5012  				     union wpa_event_data *data)
5013  {
5014  	if (data == NULL)
5015  		return;
5016  	switch (data->wnm.oper) {
5017  	case WNM_OPER_SLEEP:
5018  		wpa_printf(MSG_DEBUG, "Start sending WNM-Sleep Request "
5019  			   "(action=%d, intval=%d)",
5020  			   data->wnm.sleep_action, data->wnm.sleep_intval);
5021  		ieee802_11_send_wnmsleep_req(wpa_s, data->wnm.sleep_action,
5022  					     data->wnm.sleep_intval, NULL);
5023  		break;
5024  	}
5025  }
5026  #endif /* CONFIG_WNM */
5027  
5028  
5029  #ifdef CONFIG_IEEE80211R
5030  static void
wpa_supplicant_event_ft_response(struct wpa_supplicant * wpa_s,union wpa_event_data * data)5031  wpa_supplicant_event_ft_response(struct wpa_supplicant *wpa_s,
5032  				 union wpa_event_data *data)
5033  {
5034  	if (data == NULL)
5035  		return;
5036  
5037  	if (wpa_ft_process_response(wpa_s->wpa, data->ft_ies.ies,
5038  				    data->ft_ies.ies_len,
5039  				    data->ft_ies.ft_action,
5040  				    data->ft_ies.target_ap,
5041  				    data->ft_ies.ric_ies,
5042  				    data->ft_ies.ric_ies_len) < 0) {
5043  		/* TODO: prevent MLME/driver from trying to associate? */
5044  	}
5045  }
5046  #endif /* CONFIG_IEEE80211R */
5047  
5048  
5049  #ifdef CONFIG_IBSS_RSN
wpa_supplicant_event_ibss_rsn_start(struct wpa_supplicant * wpa_s,union wpa_event_data * data)5050  static void wpa_supplicant_event_ibss_rsn_start(struct wpa_supplicant *wpa_s,
5051  						union wpa_event_data *data)
5052  {
5053  	struct wpa_ssid *ssid;
5054  	if (wpa_s->wpa_state < WPA_ASSOCIATED)
5055  		return;
5056  	if (data == NULL)
5057  		return;
5058  	ssid = wpa_s->current_ssid;
5059  	if (ssid == NULL)
5060  		return;
5061  	if (ssid->mode != WPAS_MODE_IBSS || !wpa_key_mgmt_wpa(ssid->key_mgmt))
5062  		return;
5063  
5064  	ibss_rsn_start(wpa_s->ibss_rsn, data->ibss_rsn_start.peer);
5065  }
5066  
5067  
wpa_supplicant_event_ibss_auth(struct wpa_supplicant * wpa_s,union wpa_event_data * data)5068  static void wpa_supplicant_event_ibss_auth(struct wpa_supplicant *wpa_s,
5069  					   union wpa_event_data *data)
5070  {
5071  	struct wpa_ssid *ssid = wpa_s->current_ssid;
5072  
5073  	if (ssid == NULL)
5074  		return;
5075  
5076  	/* check if the ssid is correctly configured as IBSS/RSN */
5077  	if (ssid->mode != WPAS_MODE_IBSS || !wpa_key_mgmt_wpa(ssid->key_mgmt))
5078  		return;
5079  
5080  	ibss_rsn_handle_auth(wpa_s->ibss_rsn, data->rx_mgmt.frame,
5081  			     data->rx_mgmt.frame_len);
5082  }
5083  #endif /* CONFIG_IBSS_RSN */
5084  
5085  
5086  #ifdef CONFIG_IEEE80211R
ft_rx_action(struct wpa_supplicant * wpa_s,const u8 * data,size_t len)5087  static void ft_rx_action(struct wpa_supplicant *wpa_s, const u8 *data,
5088  			 size_t len)
5089  {
5090  	const u8 *sta_addr, *target_ap_addr;
5091  	u16 status;
5092  
5093  	wpa_hexdump(MSG_MSGDUMP, "FT: RX Action", data, len);
5094  	if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME))
5095  		return; /* only SME case supported for now */
5096  	if (len < 1 + 2 * ETH_ALEN + 2)
5097  		return;
5098  	if (data[0] != 2)
5099  		return; /* Only FT Action Response is supported for now */
5100  	sta_addr = data + 1;
5101  	target_ap_addr = data + 1 + ETH_ALEN;
5102  	status = WPA_GET_LE16(data + 1 + 2 * ETH_ALEN);
5103  	wpa_dbg(wpa_s, MSG_DEBUG, "FT: Received FT Action Response: STA "
5104  		MACSTR " TargetAP " MACSTR " status %u",
5105  		MAC2STR(sta_addr), MAC2STR(target_ap_addr), status);
5106  
5107  	if (!ether_addr_equal(sta_addr, wpa_s->own_addr)) {
5108  		wpa_dbg(wpa_s, MSG_DEBUG, "FT: Foreign STA Address " MACSTR
5109  			" in FT Action Response", MAC2STR(sta_addr));
5110  		return;
5111  	}
5112  
5113  	if (status) {
5114  		wpa_dbg(wpa_s, MSG_DEBUG, "FT: FT Action Response indicates "
5115  			"failure (status code %d)", status);
5116  		/* TODO: report error to FT code(?) */
5117  		return;
5118  	}
5119  
5120  	if (wpa_ft_process_response(wpa_s->wpa, data + 1 + 2 * ETH_ALEN + 2,
5121  				    len - (1 + 2 * ETH_ALEN + 2), 1,
5122  				    target_ap_addr, NULL, 0) < 0)
5123  		return;
5124  
5125  #ifdef CONFIG_SME
5126  	{
5127  		struct wpa_bss *bss;
5128  		bss = wpa_bss_get_bssid(wpa_s, target_ap_addr);
5129  		if (bss)
5130  			wpa_s->sme.freq = bss->freq;
5131  		wpa_s->sme.auth_alg = WPA_AUTH_ALG_FT;
5132  		sme_associate(wpa_s, WPAS_MODE_INFRA, target_ap_addr,
5133  			      WLAN_AUTH_FT);
5134  	}
5135  #endif /* CONFIG_SME */
5136  }
5137  #endif /* CONFIG_IEEE80211R */
5138  
5139  
wpa_supplicant_event_unprot_deauth(struct wpa_supplicant * wpa_s,struct unprot_deauth * e)5140  static void wpa_supplicant_event_unprot_deauth(struct wpa_supplicant *wpa_s,
5141  					       struct unprot_deauth *e)
5142  {
5143  	wpa_printf(MSG_DEBUG, "Unprotected Deauthentication frame "
5144  		   "dropped: " MACSTR " -> " MACSTR
5145  		   " (reason code %u)",
5146  		   MAC2STR(e->sa), MAC2STR(e->da), e->reason_code);
5147  	sme_event_unprot_disconnect(wpa_s, e->sa, e->da, e->reason_code);
5148  }
5149  
5150  
wpa_supplicant_event_unprot_disassoc(struct wpa_supplicant * wpa_s,struct unprot_disassoc * e)5151  static void wpa_supplicant_event_unprot_disassoc(struct wpa_supplicant *wpa_s,
5152  						 struct unprot_disassoc *e)
5153  {
5154  	wpa_printf(MSG_DEBUG, "Unprotected Disassociation frame "
5155  		   "dropped: " MACSTR " -> " MACSTR
5156  		   " (reason code %u)",
5157  		   MAC2STR(e->sa), MAC2STR(e->da), e->reason_code);
5158  	sme_event_unprot_disconnect(wpa_s, e->sa, e->da, e->reason_code);
5159  }
5160  
5161  
wpas_event_disconnect(struct wpa_supplicant * wpa_s,const u8 * addr,u16 reason_code,int locally_generated,const u8 * ie,size_t ie_len,int deauth)5162  static void wpas_event_disconnect(struct wpa_supplicant *wpa_s, const u8 *addr,
5163  				  u16 reason_code, int locally_generated,
5164  				  const u8 *ie, size_t ie_len, int deauth)
5165  {
5166  #ifdef CONFIG_AP
5167  	if (wpa_s->ap_iface && addr) {
5168  		hostapd_notif_disassoc(wpa_s->ap_iface->bss[0], addr);
5169  		return;
5170  	}
5171  
5172  	if (wpa_s->ap_iface) {
5173  		wpa_dbg(wpa_s, MSG_DEBUG, "Ignore deauth event in AP mode");
5174  		return;
5175  	}
5176  #endif /* CONFIG_AP */
5177  
5178  	if (!locally_generated)
5179  		wpa_s->own_disconnect_req = 0;
5180  
5181  	wpa_supplicant_event_disassoc(wpa_s, reason_code, locally_generated);
5182  
5183  	if (((reason_code == WLAN_REASON_IEEE_802_1X_AUTH_FAILED ||
5184  	      ((wpa_key_mgmt_wpa_ieee8021x(wpa_s->key_mgmt) ||
5185  		(wpa_s->key_mgmt & WPA_KEY_MGMT_IEEE8021X_NO_WPA)) &&
5186  	       eapol_sm_failed(wpa_s->eapol))) &&
5187  	     !wpa_s->eap_expected_failure))
5188  		wpas_auth_failed(wpa_s, "AUTH_FAILED", addr);
5189  
5190  #ifdef CONFIG_P2P
5191  	if (deauth && reason_code > 0) {
5192  		if (wpas_p2p_deauth_notif(wpa_s, addr, reason_code, ie, ie_len,
5193  					  locally_generated) > 0) {
5194  			/*
5195  			 * The interface was removed, so cannot continue
5196  			 * processing any additional operations after this.
5197  			 */
5198  			return;
5199  		}
5200  	}
5201  #endif /* CONFIG_P2P */
5202  
5203  	wpa_supplicant_event_disassoc_finish(wpa_s, reason_code,
5204  					     locally_generated);
5205  }
5206  
5207  
wpas_event_disassoc(struct wpa_supplicant * wpa_s,struct disassoc_info * info)5208  static void wpas_event_disassoc(struct wpa_supplicant *wpa_s,
5209  				struct disassoc_info *info)
5210  {
5211  	u16 reason_code = 0;
5212  	int locally_generated = 0;
5213  	const u8 *addr = NULL;
5214  	const u8 *ie = NULL;
5215  	size_t ie_len = 0;
5216  
5217  	wpa_dbg(wpa_s, MSG_DEBUG, "Disassociation notification");
5218  
5219  	if (info) {
5220  		addr = info->addr;
5221  		ie = info->ie;
5222  		ie_len = info->ie_len;
5223  		reason_code = info->reason_code;
5224  		locally_generated = info->locally_generated;
5225  		wpa_dbg(wpa_s, MSG_DEBUG, " * reason %u (%s)%s", reason_code,
5226  			reason2str(reason_code),
5227  			locally_generated ? " locally_generated=1" : "");
5228  		if (addr)
5229  			wpa_dbg(wpa_s, MSG_DEBUG, " * address " MACSTR,
5230  				MAC2STR(addr));
5231  		wpa_hexdump(MSG_DEBUG, "Disassociation frame IE(s)",
5232  			    ie, ie_len);
5233  	}
5234  
5235  #ifdef CONFIG_AP
5236  	if (wpa_s->ap_iface && info && info->addr) {
5237  		hostapd_notif_disassoc(wpa_s->ap_iface->bss[0], info->addr);
5238  		return;
5239  	}
5240  
5241  	if (wpa_s->ap_iface) {
5242  		wpa_dbg(wpa_s, MSG_DEBUG, "Ignore disassoc event in AP mode");
5243  		return;
5244  	}
5245  #endif /* CONFIG_AP */
5246  
5247  #ifdef CONFIG_P2P
5248  	if (info) {
5249  		wpas_p2p_disassoc_notif(
5250  			wpa_s, info->addr, reason_code, info->ie, info->ie_len,
5251  			locally_generated);
5252  	}
5253  #endif /* CONFIG_P2P */
5254  
5255  	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME)
5256  		sme_event_disassoc(wpa_s, info);
5257  
5258  	wpas_event_disconnect(wpa_s, addr, reason_code, locally_generated,
5259  			      ie, ie_len, 0);
5260  }
5261  
5262  
wpas_event_deauth(struct wpa_supplicant * wpa_s,struct deauth_info * info)5263  static void wpas_event_deauth(struct wpa_supplicant *wpa_s,
5264  			      struct deauth_info *info)
5265  {
5266  	u16 reason_code = 0;
5267  	int locally_generated = 0;
5268  	const u8 *addr = NULL;
5269  	const u8 *ie = NULL;
5270  	size_t ie_len = 0;
5271  
5272  	wpa_dbg(wpa_s, MSG_DEBUG, "Deauthentication notification");
5273  
5274  	if (info) {
5275  		addr = info->addr;
5276  		ie = info->ie;
5277  		ie_len = info->ie_len;
5278  		reason_code = info->reason_code;
5279  		locally_generated = info->locally_generated;
5280  		wpa_dbg(wpa_s, MSG_DEBUG, " * reason %u (%s)%s",
5281  			reason_code, reason2str(reason_code),
5282  			locally_generated ? " locally_generated=1" : "");
5283  		if (addr) {
5284  			wpa_dbg(wpa_s, MSG_DEBUG, " * address " MACSTR,
5285  				MAC2STR(addr));
5286  		}
5287  		wpa_hexdump(MSG_DEBUG, "Deauthentication frame IE(s)",
5288  			    ie, ie_len);
5289  	}
5290  
5291  	wpa_reset_ft_completed(wpa_s->wpa);
5292  
5293  	wpas_event_disconnect(wpa_s, addr, reason_code,
5294  			      locally_generated, ie, ie_len, 1);
5295  }
5296  
5297  
reg_init_str(enum reg_change_initiator init)5298  static const char * reg_init_str(enum reg_change_initiator init)
5299  {
5300  	switch (init) {
5301  	case REGDOM_SET_BY_CORE:
5302  		return "CORE";
5303  	case REGDOM_SET_BY_USER:
5304  		return "USER";
5305  	case REGDOM_SET_BY_DRIVER:
5306  		return "DRIVER";
5307  	case REGDOM_SET_BY_COUNTRY_IE:
5308  		return "COUNTRY_IE";
5309  	case REGDOM_BEACON_HINT:
5310  		return "BEACON_HINT";
5311  	}
5312  	return "?";
5313  }
5314  
5315  
reg_type_str(enum reg_type type)5316  static const char * reg_type_str(enum reg_type type)
5317  {
5318  	switch (type) {
5319  	case REGDOM_TYPE_UNKNOWN:
5320  		return "UNKNOWN";
5321  	case REGDOM_TYPE_COUNTRY:
5322  		return "COUNTRY";
5323  	case REGDOM_TYPE_WORLD:
5324  		return "WORLD";
5325  	case REGDOM_TYPE_CUSTOM_WORLD:
5326  		return "CUSTOM_WORLD";
5327  	case REGDOM_TYPE_INTERSECTION:
5328  		return "INTERSECTION";
5329  	}
5330  	return "?";
5331  }
5332  
5333  
wpas_beacon_hint(struct wpa_supplicant * wpa_s,const char * title,struct frequency_attrs * attrs)5334  static void wpas_beacon_hint(struct wpa_supplicant *wpa_s, const char *title,
5335  			     struct frequency_attrs *attrs)
5336  {
5337  	if (!attrs->freq)
5338  		return;
5339  	wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_REGDOM_BEACON_HINT
5340  		"%s freq=%u max_tx_power=%u%s%s%s",
5341  		title, attrs->freq, attrs->max_tx_power,
5342  		attrs->disabled ? " disabled=1" : "",
5343  		attrs->no_ir ? " no_ir=1" : "",
5344  		attrs->radar ? " radar=1" : "");
5345  }
5346  
5347  
wpa_supplicant_update_channel_list(struct wpa_supplicant * wpa_s,struct channel_list_changed * info)5348  void wpa_supplicant_update_channel_list(struct wpa_supplicant *wpa_s,
5349  					struct channel_list_changed *info)
5350  {
5351  	struct wpa_supplicant *ifs;
5352  	u8 dfs_domain;
5353  
5354  	/*
5355  	 * To allow backwards compatibility with higher level layers that
5356  	 * assumed the REGDOM_CHANGE event is sent over the initially added
5357  	 * interface. Find the highest parent of this interface and use it to
5358  	 * send the event.
5359  	 */
5360  	for (ifs = wpa_s; ifs->parent && ifs != ifs->parent; ifs = ifs->parent)
5361  		;
5362  
5363  	if (info) {
5364  		wpa_msg(ifs, MSG_INFO,
5365  			WPA_EVENT_REGDOM_CHANGE "init=%s type=%s%s%s",
5366  			reg_init_str(info->initiator), reg_type_str(info->type),
5367  			info->alpha2[0] ? " alpha2=" : "",
5368  			info->alpha2[0] ? info->alpha2 : "");
5369  
5370  		if (info->initiator == REGDOM_BEACON_HINT) {
5371  			wpas_beacon_hint(ifs, "before",
5372  					 &info->beacon_hint_before);
5373  			wpas_beacon_hint(ifs, "after",
5374  					 &info->beacon_hint_after);
5375  		}
5376  	}
5377  
5378  	if (wpa_s->drv_priv == NULL)
5379  		return; /* Ignore event during drv initialization */
5380  
5381  	dl_list_for_each(ifs, &wpa_s->radio->ifaces, struct wpa_supplicant,
5382  			 radio_list) {
5383  		bool was_6ghz_enabled;
5384  
5385  		wpa_printf(MSG_DEBUG, "%s: Updating hw mode",
5386  			   ifs->ifname);
5387  		free_hw_features(ifs);
5388  		ifs->hw.modes = wpa_drv_get_hw_feature_data(
5389  			ifs, &ifs->hw.num_modes, &ifs->hw.flags, &dfs_domain);
5390  
5391  		was_6ghz_enabled = ifs->is_6ghz_enabled;
5392  		ifs->is_6ghz_enabled = wpas_is_6ghz_supported(ifs, true);
5393  
5394  		/* Restart PNO/sched_scan with updated channel list */
5395  		if (ifs->pno) {
5396  			wpas_stop_pno(ifs);
5397  			wpas_start_pno(ifs);
5398  		} else if (ifs->sched_scanning && !ifs->pno_sched_pending) {
5399  			wpa_dbg(ifs, MSG_DEBUG,
5400  				"Channel list changed - restart sched_scan");
5401  			wpas_scan_restart_sched_scan(ifs);
5402  		} else if (!was_6ghz_enabled && ifs->is_6ghz_enabled) {
5403  			wpa_dbg(ifs, MSG_INFO,
5404  				"Channel list changed: 6 GHz was enabled");
5405  
5406  			ifs->crossed_6ghz_dom = true;
5407  		}
5408  	}
5409  
5410  	wpas_p2p_update_channel_list(wpa_s, WPAS_P2P_CHANNEL_UPDATE_DRIVER);
5411  }
5412  
5413  
wpas_event_rx_mgmt_action(struct wpa_supplicant * wpa_s,const u8 * frame,size_t len,int freq,int rssi)5414  static void wpas_event_rx_mgmt_action(struct wpa_supplicant *wpa_s,
5415  				      const u8 *frame, size_t len, int freq,
5416  				      int rssi)
5417  {
5418  	const struct ieee80211_mgmt *mgmt;
5419  	const u8 *payload;
5420  	size_t plen;
5421  	u8 category;
5422  
5423  	if (len < IEEE80211_HDRLEN + 2)
5424  		return;
5425  
5426  	mgmt = (const struct ieee80211_mgmt *) frame;
5427  	payload = frame + IEEE80211_HDRLEN;
5428  	category = *payload++;
5429  	plen = len - IEEE80211_HDRLEN - 1;
5430  
5431  	wpa_dbg(wpa_s, MSG_DEBUG, "Received Action frame: SA=" MACSTR
5432  		" Category=%u DataLen=%d freq=%d MHz",
5433  		MAC2STR(mgmt->sa), category, (int) plen, freq);
5434  
5435  #ifndef CONFIG_NO_WMM_AC
5436  	if (category == WLAN_ACTION_WMM) {
5437  		wmm_ac_rx_action(wpa_s, mgmt->da, mgmt->sa, payload, plen);
5438  		return;
5439  	}
5440  #endif /* CONFIG_NO_WMM_AC */
5441  
5442  #ifdef CONFIG_IEEE80211R
5443  	if (category == WLAN_ACTION_FT) {
5444  		ft_rx_action(wpa_s, payload, plen);
5445  		return;
5446  	}
5447  #endif /* CONFIG_IEEE80211R */
5448  
5449  #ifdef CONFIG_SME
5450  	if (category == WLAN_ACTION_SA_QUERY) {
5451  		sme_sa_query_rx(wpa_s, mgmt->da, mgmt->sa, payload, plen);
5452  		return;
5453  	}
5454  #endif /* CONFIG_SME */
5455  
5456  #ifdef CONFIG_WNM
5457  	if (mgmt->u.action.category == WLAN_ACTION_WNM) {
5458  		ieee802_11_rx_wnm_action(wpa_s, mgmt, len);
5459  		return;
5460  	}
5461  #endif /* CONFIG_WNM */
5462  
5463  #ifdef CONFIG_GAS
5464  	if ((mgmt->u.action.category == WLAN_ACTION_PUBLIC ||
5465  	     mgmt->u.action.category == WLAN_ACTION_PROTECTED_DUAL) &&
5466  	    gas_query_rx(wpa_s->gas, mgmt->da, mgmt->sa, mgmt->bssid,
5467  			 mgmt->u.action.category,
5468  			 payload, plen, freq) == 0)
5469  		return;
5470  #endif /* CONFIG_GAS */
5471  
5472  #ifdef CONFIG_GAS_SERVER
5473  	if ((mgmt->u.action.category == WLAN_ACTION_PUBLIC ||
5474  	     mgmt->u.action.category == WLAN_ACTION_PROTECTED_DUAL) &&
5475  	    gas_server_rx(wpa_s->gas_server, mgmt->da, mgmt->sa, mgmt->bssid,
5476  			  mgmt->u.action.category,
5477  			  payload, plen, freq) == 0)
5478  		return;
5479  #endif /* CONFIG_GAS_SERVER */
5480  
5481  #ifdef CONFIG_TDLS
5482  	if (category == WLAN_ACTION_PUBLIC && plen >= 4 &&
5483  	    payload[0] == WLAN_TDLS_DISCOVERY_RESPONSE) {
5484  		wpa_dbg(wpa_s, MSG_DEBUG,
5485  			"TDLS: Received Discovery Response from " MACSTR,
5486  			MAC2STR(mgmt->sa));
5487  		if (wpa_s->valid_links &&
5488  		    wpa_tdls_process_discovery_response(wpa_s->wpa, mgmt->sa,
5489  							&payload[1], plen - 1))
5490  			wpa_dbg(wpa_s, MSG_ERROR,
5491  				"TDLS: Discovery Response process failed for "
5492  				MACSTR, MAC2STR(mgmt->sa));
5493  		return;
5494  	}
5495  #endif /* CONFIG_TDLS */
5496  
5497  #ifdef CONFIG_INTERWORKING
5498  	if (category == WLAN_ACTION_QOS && plen >= 1 &&
5499  	    payload[0] == QOS_QOS_MAP_CONFIG) {
5500  		const u8 *pos = payload + 1;
5501  		size_t qlen = plen - 1;
5502  		wpa_dbg(wpa_s, MSG_DEBUG, "Interworking: Received QoS Map Configure frame from "
5503  			MACSTR, MAC2STR(mgmt->sa));
5504  		if (ether_addr_equal(mgmt->sa, wpa_s->bssid) &&
5505  		    qlen > 2 && pos[0] == WLAN_EID_QOS_MAP_SET &&
5506  		    pos[1] <= qlen - 2 && pos[1] >= 16)
5507  			wpas_qos_map_set(wpa_s, pos + 2, pos[1]);
5508  		return;
5509  	}
5510  #endif /* CONFIG_INTERWORKING */
5511  
5512  #ifndef CONFIG_NO_RRM
5513  	if (category == WLAN_ACTION_RADIO_MEASUREMENT &&
5514  	    payload[0] == WLAN_RRM_RADIO_MEASUREMENT_REQUEST) {
5515  		wpas_rrm_handle_radio_measurement_request(wpa_s, mgmt->sa,
5516  							  mgmt->da,
5517  							  payload + 1,
5518  							  plen - 1);
5519  		return;
5520  	}
5521  
5522  	if (category == WLAN_ACTION_RADIO_MEASUREMENT &&
5523  	    payload[0] == WLAN_RRM_NEIGHBOR_REPORT_RESPONSE) {
5524  		wpas_rrm_process_neighbor_rep(wpa_s, payload + 1, plen - 1);
5525  		return;
5526  	}
5527  
5528  	if (category == WLAN_ACTION_RADIO_MEASUREMENT &&
5529  	    payload[0] == WLAN_RRM_LINK_MEASUREMENT_REQUEST) {
5530  		wpas_rrm_handle_link_measurement_request(wpa_s, mgmt->sa,
5531  							 payload + 1, plen - 1,
5532  							 rssi);
5533  		return;
5534  	}
5535  #endif /* CONFIG_NO_RRM */
5536  
5537  #ifdef CONFIG_FST
5538  	if (mgmt->u.action.category == WLAN_ACTION_FST && wpa_s->fst) {
5539  		fst_rx_action(wpa_s->fst, mgmt, len);
5540  		return;
5541  	}
5542  #endif /* CONFIG_FST */
5543  
5544  #ifdef CONFIG_NAN_USD
5545  	if (category == WLAN_ACTION_PUBLIC && plen >= 5 &&
5546  	    payload[0] == WLAN_PA_VENDOR_SPECIFIC &&
5547  	    WPA_GET_BE32(&payload[1]) == NAN_SDF_VENDOR_TYPE) {
5548  		payload += 5;
5549  		plen -= 5;
5550  		wpas_nan_usd_rx_sdf(wpa_s, mgmt->sa, mgmt->bssid, freq,
5551  				    payload, plen);
5552  		return;
5553  	}
5554  #endif /* CONFIG_NAN_USD */
5555  
5556  #ifdef CONFIG_DPP
5557  	if (category == WLAN_ACTION_PUBLIC && plen >= 5 &&
5558  	    payload[0] == WLAN_PA_VENDOR_SPECIFIC &&
5559  	    WPA_GET_BE24(&payload[1]) == OUI_WFA &&
5560  	    payload[4] == DPP_OUI_TYPE) {
5561  		payload++;
5562  		plen--;
5563  		wpas_dpp_rx_action(wpa_s, mgmt->sa, payload, plen, freq);
5564  		return;
5565  	}
5566  #endif /* CONFIG_DPP */
5567  
5568  #ifndef CONFIG_NO_ROBUST_AV
5569  	if (category == WLAN_ACTION_ROBUST_AV_STREAMING &&
5570  	    payload[0] == ROBUST_AV_SCS_RESP) {
5571  		wpas_handle_robust_av_scs_recv_action(wpa_s, mgmt->sa,
5572  						      payload + 1, plen - 1);
5573  		return;
5574  	}
5575  
5576  	if (category == WLAN_ACTION_ROBUST_AV_STREAMING &&
5577  	    payload[0] == ROBUST_AV_MSCS_RESP) {
5578  		wpas_handle_robust_av_recv_action(wpa_s, mgmt->sa,
5579  						  payload + 1, plen - 1);
5580  		return;
5581  	}
5582  
5583  	if (category == WLAN_ACTION_VENDOR_SPECIFIC_PROTECTED && plen > 4 &&
5584  	    WPA_GET_BE32(payload) == QM_ACTION_VENDOR_TYPE) {
5585  		wpas_handle_qos_mgmt_recv_action(wpa_s, mgmt->sa,
5586  						 payload + 4, plen - 4);
5587  		return;
5588  	}
5589  #endif /* CONFIG_NO_ROBUST_AV */
5590  
5591  	wpas_p2p_rx_action(wpa_s, mgmt->da, mgmt->sa, mgmt->bssid,
5592  			   category, payload, plen, freq);
5593  	if (wpa_s->ifmsh)
5594  		mesh_mpm_action_rx(wpa_s, mgmt, len);
5595  }
5596  
5597  
wpa_supplicant_notify_avoid_freq(struct wpa_supplicant * wpa_s,union wpa_event_data * event)5598  static void wpa_supplicant_notify_avoid_freq(struct wpa_supplicant *wpa_s,
5599  					     union wpa_event_data *event)
5600  {
5601  	struct wpa_freq_range_list *list;
5602  	char *str = NULL;
5603  
5604  	list = &event->freq_range;
5605  
5606  	if (list->num)
5607  		str = freq_range_list_str(list);
5608  	wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_AVOID_FREQ "ranges=%s",
5609  		str ? str : "");
5610  
5611  #ifdef CONFIG_P2P
5612  	if (freq_range_list_parse(&wpa_s->global->p2p_go_avoid_freq, str)) {
5613  		wpa_dbg(wpa_s, MSG_ERROR, "%s: Failed to parse freq range",
5614  			__func__);
5615  	} else {
5616  		wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Update channel list based on frequency avoid event");
5617  
5618  		/*
5619  		 * The update channel flow will also take care of moving a GO
5620  		 * from the unsafe frequency if needed.
5621  		 */
5622  		wpas_p2p_update_channel_list(wpa_s,
5623  					     WPAS_P2P_CHANNEL_UPDATE_AVOID);
5624  	}
5625  #endif /* CONFIG_P2P */
5626  
5627  	os_free(str);
5628  }
5629  
5630  
wpa_supplicant_event_port_authorized(struct wpa_supplicant * wpa_s)5631  static void wpa_supplicant_event_port_authorized(struct wpa_supplicant *wpa_s)
5632  {
5633  	if (wpa_s->wpa_state == WPA_ASSOCIATED) {
5634  		wpa_supplicant_cancel_auth_timeout(wpa_s);
5635  		wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
5636  		eapol_sm_notify_portValid(wpa_s->eapol, true);
5637  		eapol_sm_notify_eap_success(wpa_s->eapol, true);
5638  		wpa_s->drv_authorized_port = 1;
5639  	}
5640  }
5641  
5642  
wpas_event_cac_ms(const struct wpa_supplicant * wpa_s,int freq)5643  static unsigned int wpas_event_cac_ms(const struct wpa_supplicant *wpa_s,
5644  				      int freq)
5645  {
5646  	size_t i;
5647  	int j;
5648  
5649  	for (i = 0; i < wpa_s->hw.num_modes; i++) {
5650  		const struct hostapd_hw_modes *mode = &wpa_s->hw.modes[i];
5651  
5652  		for (j = 0; j < mode->num_channels; j++) {
5653  			const struct hostapd_channel_data *chan;
5654  
5655  			chan = &mode->channels[j];
5656  			if (chan->freq == freq)
5657  				return chan->dfs_cac_ms;
5658  		}
5659  	}
5660  
5661  	return 0;
5662  }
5663  
5664  
wpas_event_dfs_cac_started(struct wpa_supplicant * wpa_s,struct dfs_event * radar)5665  static void wpas_event_dfs_cac_started(struct wpa_supplicant *wpa_s,
5666  				       struct dfs_event *radar)
5667  {
5668  #if defined(NEED_AP_MLME) && defined(CONFIG_AP)
5669  	if (wpa_s->ap_iface || wpa_s->ifmsh) {
5670  		wpas_ap_event_dfs_cac_started(wpa_s, radar);
5671  	} else
5672  #endif /* NEED_AP_MLME && CONFIG_AP */
5673  	{
5674  		unsigned int cac_time = wpas_event_cac_ms(wpa_s, radar->freq);
5675  
5676  		cac_time /= 1000; /* convert from ms to sec */
5677  		if (!cac_time)
5678  			cac_time = 10 * 60; /* max timeout: 10 minutes */
5679  
5680  		/* Restart auth timeout: CAC time added to initial timeout */
5681  		wpas_auth_timeout_restart(wpa_s, cac_time);
5682  	}
5683  }
5684  
5685  
wpas_event_dfs_cac_finished(struct wpa_supplicant * wpa_s,struct dfs_event * radar)5686  static void wpas_event_dfs_cac_finished(struct wpa_supplicant *wpa_s,
5687  					struct dfs_event *radar)
5688  {
5689  #if defined(NEED_AP_MLME) && defined(CONFIG_AP)
5690  	if (wpa_s->ap_iface || wpa_s->ifmsh) {
5691  		wpas_ap_event_dfs_cac_finished(wpa_s, radar);
5692  	} else
5693  #endif /* NEED_AP_MLME && CONFIG_AP */
5694  	{
5695  		/* Restart auth timeout with original value after CAC is
5696  		 * finished */
5697  		wpas_auth_timeout_restart(wpa_s, 0);
5698  	}
5699  }
5700  
5701  
wpas_event_dfs_cac_aborted(struct wpa_supplicant * wpa_s,struct dfs_event * radar)5702  static void wpas_event_dfs_cac_aborted(struct wpa_supplicant *wpa_s,
5703  				       struct dfs_event *radar)
5704  {
5705  #if defined(NEED_AP_MLME) && defined(CONFIG_AP)
5706  	if (wpa_s->ap_iface || wpa_s->ifmsh) {
5707  		wpas_ap_event_dfs_cac_aborted(wpa_s, radar);
5708  	} else
5709  #endif /* NEED_AP_MLME && CONFIG_AP */
5710  	{
5711  		/* Restart auth timeout with original value after CAC is
5712  		 * aborted */
5713  		wpas_auth_timeout_restart(wpa_s, 0);
5714  	}
5715  }
5716  
5717  
wpa_supplicant_event_assoc_auth(struct wpa_supplicant * wpa_s,union wpa_event_data * data)5718  static void wpa_supplicant_event_assoc_auth(struct wpa_supplicant *wpa_s,
5719  					    union wpa_event_data *data)
5720  {
5721  	wpa_dbg(wpa_s, MSG_DEBUG,
5722  		"Connection authorized by device, previous state %d",
5723  		wpa_s->wpa_state);
5724  
5725  	wpa_supplicant_event_port_authorized(wpa_s);
5726  
5727  	wpa_s->last_eapol_matches_bssid = 1;
5728  
5729  	wpa_sm_set_rx_replay_ctr(wpa_s->wpa, data->assoc_info.key_replay_ctr);
5730  	wpa_sm_set_ptk_kck_kek(wpa_s->wpa, data->assoc_info.ptk_kck,
5731  			       data->assoc_info.ptk_kck_len,
5732  			       data->assoc_info.ptk_kek,
5733  			       data->assoc_info.ptk_kek_len);
5734  #ifdef CONFIG_FILS
5735  	if (wpa_s->auth_alg == WPA_AUTH_ALG_FILS) {
5736  		struct wpa_bss *bss = wpa_bss_get_bssid(wpa_s, wpa_s->bssid);
5737  		const u8 *fils_cache_id = wpa_bss_get_fils_cache_id(bss);
5738  
5739  		/* Update ERP next sequence number */
5740  		eapol_sm_update_erp_next_seq_num(
5741  			wpa_s->eapol, data->assoc_info.fils_erp_next_seq_num);
5742  
5743  		if (data->assoc_info.fils_pmk && data->assoc_info.fils_pmkid) {
5744  			/* Add the new PMK and PMKID to the PMKSA cache */
5745  			wpa_sm_pmksa_cache_add(wpa_s->wpa,
5746  					       data->assoc_info.fils_pmk,
5747  					       data->assoc_info.fils_pmk_len,
5748  					       data->assoc_info.fils_pmkid,
5749  					       wpa_s->valid_links ?
5750  					       wpa_s->ap_mld_addr :
5751  					       wpa_s->bssid,
5752  					       fils_cache_id);
5753  		} else if (data->assoc_info.fils_pmkid) {
5754  			/* Update the current PMKSA used for this connection */
5755  			pmksa_cache_set_current(wpa_s->wpa,
5756  						data->assoc_info.fils_pmkid,
5757  						NULL, NULL, 0, NULL, 0, true);
5758  		}
5759  	}
5760  #endif /* CONFIG_FILS */
5761  }
5762  
5763  
connect_fail_reason(enum sta_connect_fail_reason_codes code)5764  static const char * connect_fail_reason(enum sta_connect_fail_reason_codes code)
5765  {
5766  	switch (code) {
5767  	case STA_CONNECT_FAIL_REASON_UNSPECIFIED:
5768  		return "";
5769  	case STA_CONNECT_FAIL_REASON_NO_BSS_FOUND:
5770  		return "no_bss_found";
5771  	case STA_CONNECT_FAIL_REASON_AUTH_TX_FAIL:
5772  		return "auth_tx_fail";
5773  	case STA_CONNECT_FAIL_REASON_AUTH_NO_ACK_RECEIVED:
5774  		return "auth_no_ack_received";
5775  	case STA_CONNECT_FAIL_REASON_AUTH_NO_RESP_RECEIVED:
5776  		return "auth_no_resp_received";
5777  	case STA_CONNECT_FAIL_REASON_ASSOC_REQ_TX_FAIL:
5778  		return "assoc_req_tx_fail";
5779  	case STA_CONNECT_FAIL_REASON_ASSOC_NO_ACK_RECEIVED:
5780  		return "assoc_no_ack_received";
5781  	case STA_CONNECT_FAIL_REASON_ASSOC_NO_RESP_RECEIVED:
5782  		return "assoc_no_resp_received";
5783  	default:
5784  		return "unknown_reason";
5785  	}
5786  }
5787  
5788  
wpas_event_assoc_reject(struct wpa_supplicant * wpa_s,union wpa_event_data * data)5789  static void wpas_event_assoc_reject(struct wpa_supplicant *wpa_s,
5790  				    union wpa_event_data *data)
5791  {
5792  	const u8 *bssid = data->assoc_reject.bssid;
5793  	struct ieee802_11_elems elems;
5794  	struct ml_sta_link_info ml_info[MAX_NUM_MLD_LINKS];
5795  	const u8 *link_bssids[MAX_NUM_MLD_LINKS + 1];
5796  #ifdef CONFIG_MBO
5797  	struct wpa_bss *reject_bss;
5798  #endif /* CONFIG_MBO */
5799  
5800  	if (!bssid || is_zero_ether_addr(bssid))
5801  		bssid = wpa_s->pending_bssid;
5802  #ifdef CONFIG_MBO
5803  	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME)
5804  		reject_bss = wpa_s->current_bss;
5805  	else
5806  		reject_bss = wpa_bss_get_bssid(wpa_s, bssid);
5807  #endif /* CONFIG_MBO */
5808  
5809  	if (data->assoc_reject.bssid)
5810  		wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_ASSOC_REJECT
5811  			"bssid=" MACSTR	" status_code=%u%s%s%s%s%s",
5812  			MAC2STR(data->assoc_reject.bssid),
5813  			data->assoc_reject.status_code,
5814  			data->assoc_reject.timed_out ? " timeout" : "",
5815  			data->assoc_reject.timeout_reason ? "=" : "",
5816  			data->assoc_reject.timeout_reason ?
5817  			data->assoc_reject.timeout_reason : "",
5818  			data->assoc_reject.reason_code !=
5819  			STA_CONNECT_FAIL_REASON_UNSPECIFIED ?
5820  			" qca_driver_reason=" : "",
5821  			connect_fail_reason(data->assoc_reject.reason_code));
5822  	else
5823  		wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_ASSOC_REJECT
5824  			"status_code=%u%s%s%s%s%s",
5825  			data->assoc_reject.status_code,
5826  			data->assoc_reject.timed_out ? " timeout" : "",
5827  			data->assoc_reject.timeout_reason ? "=" : "",
5828  			data->assoc_reject.timeout_reason ?
5829  			data->assoc_reject.timeout_reason : "",
5830  			data->assoc_reject.reason_code !=
5831  			STA_CONNECT_FAIL_REASON_UNSPECIFIED ?
5832  			" qca_driver_reason=" : "",
5833  			connect_fail_reason(data->assoc_reject.reason_code));
5834  	wpa_s->assoc_status_code = data->assoc_reject.status_code;
5835  	wpas_notify_assoc_status_code(wpa_s);
5836  
5837  #ifdef CONFIG_OWE
5838  	if (data->assoc_reject.status_code ==
5839  	    WLAN_STATUS_FINITE_CYCLIC_GROUP_NOT_SUPPORTED &&
5840  	    wpa_s->key_mgmt == WPA_KEY_MGMT_OWE &&
5841  	    wpa_s->current_ssid &&
5842  	    wpa_s->current_ssid->owe_group == 0 &&
5843  	    wpa_s->last_owe_group != 21) {
5844  		struct wpa_ssid *ssid = wpa_s->current_ssid;
5845  		struct wpa_bss *bss = wpa_s->current_bss;
5846  
5847  		if (!bss) {
5848  			bss = wpa_supplicant_get_new_bss(wpa_s, bssid);
5849  			if (!bss) {
5850  				wpas_connection_failed(wpa_s, bssid, NULL);
5851  				wpa_supplicant_mark_disassoc(wpa_s);
5852  				return;
5853  			}
5854  		}
5855  		wpa_printf(MSG_DEBUG, "OWE: Try next supported DH group");
5856  		wpas_connect_work_done(wpa_s);
5857  		wpa_supplicant_mark_disassoc(wpa_s);
5858  		wpa_supplicant_connect(wpa_s, bss, ssid);
5859  		return;
5860  	}
5861  #endif /* CONFIG_OWE */
5862  
5863  #ifdef CONFIG_DPP2
5864  	/* Try to follow AP's PFS policy. WLAN_STATUS_ASSOC_DENIED_UNSPEC is
5865  	 * the status code defined in the DPP R2 tech spec.
5866  	 * WLAN_STATUS_AKMP_NOT_VALID is addressed in the same manner as an
5867  	 * interoperability workaround with older hostapd implementation. */
5868  	if (DPP_VERSION > 1 && wpa_s->current_ssid &&
5869  	    (wpa_s->current_ssid->key_mgmt == WPA_KEY_MGMT_DPP ||
5870  	     ((wpa_s->current_ssid->key_mgmt & WPA_KEY_MGMT_DPP) &&
5871  	      wpa_s->key_mgmt == WPA_KEY_MGMT_DPP)) &&
5872  	    wpa_s->current_ssid->dpp_pfs == 0 &&
5873  	    (data->assoc_reject.status_code ==
5874  	     WLAN_STATUS_ASSOC_DENIED_UNSPEC ||
5875  	     data->assoc_reject.status_code == WLAN_STATUS_AKMP_NOT_VALID)) {
5876  		struct wpa_ssid *ssid = wpa_s->current_ssid;
5877  		struct wpa_bss *bss = wpa_s->current_bss;
5878  
5879  		wpa_s->current_ssid->dpp_pfs_fallback ^= 1;
5880  		if (!bss)
5881  			bss = wpa_supplicant_get_new_bss(wpa_s, bssid);
5882  		if (!bss || wpa_s->dpp_pfs_fallback) {
5883  			wpa_printf(MSG_DEBUG,
5884  				   "DPP: Updated PFS policy for next try");
5885  			wpas_connection_failed(wpa_s, bssid, NULL);
5886  			wpa_supplicant_mark_disassoc(wpa_s);
5887  			return;
5888  		}
5889  		wpa_printf(MSG_DEBUG, "DPP: Try again with updated PFS policy");
5890  		wpa_s->dpp_pfs_fallback = 1;
5891  		wpas_connect_work_done(wpa_s);
5892  		wpa_supplicant_mark_disassoc(wpa_s);
5893  		wpa_supplicant_connect(wpa_s, bss, ssid);
5894  		return;
5895  	}
5896  #endif /* CONFIG_DPP2 */
5897  
5898  #ifdef CONFIG_MBO
5899  	if (data->assoc_reject.status_code ==
5900  	    WLAN_STATUS_DENIED_POOR_CHANNEL_CONDITIONS &&
5901  	    reject_bss && data->assoc_reject.resp_ies) {
5902  		const u8 *rssi_rej;
5903  
5904  		rssi_rej = mbo_get_attr_from_ies(
5905  			data->assoc_reject.resp_ies,
5906  			data->assoc_reject.resp_ies_len,
5907  			OCE_ATTR_ID_RSSI_BASED_ASSOC_REJECT);
5908  		if (rssi_rej && rssi_rej[1] == 2) {
5909  			wpa_printf(MSG_DEBUG,
5910  				   "OCE: RSSI-based association rejection from "
5911  				   MACSTR " (Delta RSSI: %u, Retry Delay: %u)",
5912  				   MAC2STR(reject_bss->bssid),
5913  				   rssi_rej[2], rssi_rej[3]);
5914  			wpa_bss_tmp_disallow(wpa_s,
5915  					     reject_bss->bssid,
5916  					     rssi_rej[3],
5917  					     rssi_rej[2] + reject_bss->level);
5918  		}
5919  	}
5920  #endif /* CONFIG_MBO */
5921  
5922  	/* Check for other failed links in the response */
5923  	os_memset(link_bssids, 0, sizeof(link_bssids));
5924  	if (ieee802_11_parse_elems(data->assoc_reject.resp_ies,
5925  				   data->assoc_reject.resp_ies_len,
5926  				   &elems, 1) != ParseFailed) {
5927  		unsigned int n_links, i, idx;
5928  
5929  		idx = 0;
5930  		n_links = wpas_ml_parse_assoc(wpa_s, &elems, ml_info);
5931  
5932  		for (i = 1; i < n_links; i++) {
5933  			/* The status cannot be success here.
5934  			 * Add the link to the failed list if it is reporting
5935  			 * an error. The only valid "non-error" status is
5936  			 * TX_LINK_NOT_ACCEPTED as that means this link may
5937  			 * still accept an association from us.
5938  			 */
5939  			if (ml_info[i].status !=
5940  			    WLAN_STATUS_DENIED_TX_LINK_NOT_ACCEPTED) {
5941  				link_bssids[idx] = ml_info[i].bssid;
5942  				idx++;
5943  			}
5944  		}
5945  	}
5946  
5947  	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) {
5948  		sme_event_assoc_reject(wpa_s, data, link_bssids);
5949  		return;
5950  	}
5951  
5952  	/* Driver-based SME cases */
5953  
5954  #ifdef CONFIG_SAE
5955  	if (wpa_s->current_ssid &&
5956  	    wpa_key_mgmt_sae(wpa_s->current_ssid->key_mgmt) &&
5957  	    !data->assoc_reject.timed_out) {
5958  		wpa_dbg(wpa_s, MSG_DEBUG, "SAE: Drop PMKSA cache entry");
5959  		wpa_sm_aborted_cached(wpa_s->wpa);
5960  		wpa_sm_pmksa_cache_flush(wpa_s->wpa, wpa_s->current_ssid);
5961  	}
5962  #endif /* CONFIG_SAE */
5963  
5964  #ifdef CONFIG_DPP
5965  	if (wpa_s->current_ssid &&
5966  	    wpa_s->current_ssid->key_mgmt == WPA_KEY_MGMT_DPP &&
5967  	    !data->assoc_reject.timed_out) {
5968  		wpa_dbg(wpa_s, MSG_DEBUG, "DPP: Drop PMKSA cache entry");
5969  		wpa_sm_aborted_cached(wpa_s->wpa);
5970  		wpa_sm_pmksa_cache_flush(wpa_s->wpa, wpa_s->current_ssid);
5971  	}
5972  #endif /* CONFIG_DPP */
5973  
5974  #ifdef CONFIG_FILS
5975  	/* Update ERP next sequence number */
5976  	if (wpa_s->auth_alg == WPA_AUTH_ALG_FILS) {
5977  		fils_pmksa_cache_flush(wpa_s);
5978  		eapol_sm_update_erp_next_seq_num(
5979  			wpa_s->eapol,
5980  			data->assoc_reject.fils_erp_next_seq_num);
5981  		fils_connection_failure(wpa_s);
5982  	}
5983  #endif /* CONFIG_FILS */
5984  
5985  	wpas_connection_failed(wpa_s, bssid, link_bssids);
5986  	wpa_supplicant_mark_disassoc(wpa_s);
5987  }
5988  
5989  
wpas_event_unprot_beacon(struct wpa_supplicant * wpa_s,struct unprot_beacon * data)5990  static void wpas_event_unprot_beacon(struct wpa_supplicant *wpa_s,
5991  				     struct unprot_beacon *data)
5992  {
5993  	struct wpabuf *buf;
5994  	int res;
5995  
5996  	if (!data || wpa_s->wpa_state != WPA_COMPLETED ||
5997  	    !ether_addr_equal(data->sa, wpa_s->bssid))
5998  		return;
5999  	wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_UNPROT_BEACON MACSTR,
6000  		MAC2STR(data->sa));
6001  
6002  	buf = wpabuf_alloc(4);
6003  	if (!buf)
6004  		return;
6005  
6006  	wpabuf_put_u8(buf, WLAN_ACTION_WNM);
6007  	wpabuf_put_u8(buf, WNM_NOTIFICATION_REQ);
6008  	wpabuf_put_u8(buf, 1); /* Dialog Token */
6009  	wpabuf_put_u8(buf, WNM_NOTIF_TYPE_BEACON_PROTECTION_FAILURE);
6010  
6011  	res = wpa_drv_send_action(wpa_s, wpa_s->assoc_freq, 0, wpa_s->bssid,
6012  				  wpa_s->own_addr, wpa_s->bssid,
6013  				  wpabuf_head(buf), wpabuf_len(buf), 0);
6014  	if (res < 0)
6015  		wpa_printf(MSG_DEBUG,
6016  			   "Failed to send WNM-Notification Request frame");
6017  
6018  	wpabuf_free(buf);
6019  }
6020  
6021  
bitmap_to_str(u8 value,char * buf)6022  static const char * bitmap_to_str(u8 value, char *buf)
6023  {
6024  	char *pos = buf;
6025  	int i, k = 0;
6026  
6027  	for (i = 7; i >= 0; i--)
6028  		pos[k++] = (value & BIT(i)) ? '1' : '0';
6029  
6030  	pos[8] = '\0';
6031  	return pos;
6032  }
6033  
6034  
wpas_tid_link_map(struct wpa_supplicant * wpa_s,struct tid_link_map_info * info)6035  static void wpas_tid_link_map(struct wpa_supplicant *wpa_s,
6036  			      struct tid_link_map_info *info)
6037  {
6038  	char map_info[1000], *pos, *end;
6039  	int res, i;
6040  
6041  	pos = map_info;
6042  	end = pos + sizeof(map_info);
6043  	res = os_snprintf(map_info, sizeof(map_info), "default=%d",
6044  			  info->default_map);
6045  	if (os_snprintf_error(end - pos, res))
6046  		return;
6047  	pos += res;
6048  
6049  	if (!info->default_map) {
6050  		for_each_link(info->valid_links, i) {
6051  			char uplink_map_str[9];
6052  			char downlink_map_str[9];
6053  
6054  			bitmap_to_str(info->t2lmap[i].uplink, uplink_map_str);
6055  			bitmap_to_str(info->t2lmap[i].downlink,
6056  				      downlink_map_str);
6057  
6058  			res = os_snprintf(pos, end - pos,
6059  					  " link_id=%d up_link=%s down_link=%s",
6060  					  i, uplink_map_str,
6061  					  downlink_map_str);
6062  			if (os_snprintf_error(end - pos, res))
6063  				return;
6064  			pos += res;
6065  		}
6066  	}
6067  
6068  	wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_T2LM_UPDATE "%s", map_info);
6069  }
6070  
6071  
wpas_link_reconfig(struct wpa_supplicant * wpa_s)6072  static void wpas_link_reconfig(struct wpa_supplicant *wpa_s)
6073  {
6074  	u8 bssid[ETH_ALEN];
6075  
6076  	if (wpa_drv_get_bssid(wpa_s, bssid) < 0) {
6077  		wpa_printf(MSG_ERROR, "LINK_RECONFIG: Failed to get BSSID");
6078  		wpa_supplicant_deauthenticate(wpa_s,
6079  					      WLAN_REASON_DEAUTH_LEAVING);
6080  		return;
6081  	}
6082  
6083  	if (!ether_addr_equal(bssid, wpa_s->bssid)) {
6084  		os_memcpy(wpa_s->bssid, bssid, ETH_ALEN);
6085  		wpa_supplicant_update_current_bss(wpa_s, wpa_s->bssid);
6086  		wpas_notify_bssid_changed(wpa_s);
6087  	}
6088  
6089  	if (wpa_drv_get_mlo_info(wpa_s) < 0) {
6090  		wpa_printf(MSG_ERROR,
6091  			   "LINK_RECONFIG: Failed to get MLO connection info");
6092  		wpa_supplicant_deauthenticate(wpa_s,
6093  					      WLAN_REASON_DEAUTH_LEAVING);
6094  		return;
6095  	}
6096  
6097  	if (wpa_sm_set_ml_info(wpa_s)) {
6098  		wpa_printf(MSG_ERROR,
6099  			   "LINK_RECONFIG: Failed to set MLO connection info to wpa_sm");
6100  		wpa_supplicant_deauthenticate(wpa_s,
6101  					      WLAN_REASON_DEAUTH_LEAVING);
6102  		return;
6103  	}
6104  
6105  	wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_LINK_RECONFIG "valid_links=0x%x",
6106  		wpa_s->valid_links);
6107  }
6108  
6109  
6110  #ifdef CONFIG_PASN
wpas_pasn_auth(struct wpa_supplicant * wpa_s,const struct ieee80211_mgmt * mgmt,size_t len,int freq)6111  static int wpas_pasn_auth(struct wpa_supplicant *wpa_s,
6112  			  const struct ieee80211_mgmt *mgmt, size_t len,
6113  			  int freq)
6114  {
6115  #ifdef CONFIG_P2P
6116  	struct ieee802_11_elems elems;
6117  
6118  	if (len < 24) {
6119  		wpa_printf(MSG_DEBUG, "nl80211: Too short Management frame");
6120  		return -2;
6121  	}
6122  
6123  	if (ieee802_11_parse_elems(mgmt->u.auth.variable,
6124  				   len - offsetof(struct ieee80211_mgmt,
6125  						  u.auth.variable),
6126  				   &elems, 1) == ParseFailed) {
6127  		wpa_printf(MSG_DEBUG,
6128  			   "PASN: Failed parsing Authentication frame");
6129  		return -2;
6130  	}
6131  
6132  	if (elems.p2p2_ie && elems.p2p2_ie_len)
6133  		return wpas_p2p_pasn_auth_rx(wpa_s, mgmt, len, freq);
6134  #endif /* CONFIG_P2P */
6135  
6136  	return wpas_pasn_auth_rx(wpa_s, mgmt, len);
6137  }
6138  #endif /* CONFIG_PASN */
6139  
6140  
wpa_supplicant_event(void * ctx,enum wpa_event_type event,union wpa_event_data * data)6141  void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
6142  			  union wpa_event_data *data)
6143  {
6144  	struct wpa_supplicant *wpa_s = ctx;
6145  	int resched;
6146  	struct os_reltime age, clear_at;
6147  #ifndef CONFIG_NO_STDOUT_DEBUG
6148  	int level = MSG_DEBUG;
6149  #endif /* CONFIG_NO_STDOUT_DEBUG */
6150  
6151  	if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED &&
6152  	    event != EVENT_INTERFACE_ENABLED &&
6153  	    event != EVENT_INTERFACE_STATUS &&
6154  	    event != EVENT_SCAN_RESULTS &&
6155  	    event != EVENT_SCHED_SCAN_STOPPED) {
6156  		wpa_dbg(wpa_s, MSG_DEBUG,
6157  			"Ignore event %s (%d) while interface is disabled",
6158  			event_to_string(event), event);
6159  		return;
6160  	}
6161  
6162  #ifndef CONFIG_NO_STDOUT_DEBUG
6163  	if (event == EVENT_RX_MGMT && data->rx_mgmt.frame_len >= 24) {
6164  		const struct ieee80211_hdr *hdr;
6165  		u16 fc;
6166  		hdr = (const struct ieee80211_hdr *) data->rx_mgmt.frame;
6167  		fc = le_to_host16(hdr->frame_control);
6168  		if (WLAN_FC_GET_TYPE(fc) == WLAN_FC_TYPE_MGMT &&
6169  		    WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_BEACON)
6170  			level = MSG_EXCESSIVE;
6171  	}
6172  
6173  	wpa_dbg(wpa_s, level, "Event %s (%d) received",
6174  		event_to_string(event), event);
6175  #endif /* CONFIG_NO_STDOUT_DEBUG */
6176  
6177  	switch (event) {
6178  	case EVENT_AUTH:
6179  #ifdef CONFIG_FST
6180  		if (!wpas_fst_update_mbie(wpa_s, data->auth.ies,
6181  					  data->auth.ies_len))
6182  			wpa_printf(MSG_DEBUG,
6183  				   "FST: MB IEs updated from auth IE");
6184  #endif /* CONFIG_FST */
6185  		sme_event_auth(wpa_s, data);
6186  		wpa_s->auth_status_code = data->auth.status_code;
6187  		wpas_notify_auth_status_code(wpa_s);
6188  		break;
6189  	case EVENT_ASSOC:
6190  #ifdef CONFIG_TESTING_OPTIONS
6191  		if (wpa_s->ignore_auth_resp) {
6192  			wpa_printf(MSG_INFO,
6193  				   "EVENT_ASSOC - ignore_auth_resp active!");
6194  			break;
6195  		}
6196  		if (wpa_s->testing_resend_assoc) {
6197  			wpa_printf(MSG_INFO,
6198  				   "EVENT_DEAUTH - testing_resend_assoc");
6199  			break;
6200  		}
6201  #endif /* CONFIG_TESTING_OPTIONS */
6202  		if (wpa_s->disconnected) {
6203  			wpa_printf(MSG_INFO,
6204  				   "Ignore unexpected EVENT_ASSOC in disconnected state");
6205  			break;
6206  		}
6207  		wpa_supplicant_event_assoc(wpa_s, data);
6208  		wpa_s->assoc_status_code = WLAN_STATUS_SUCCESS;
6209  		if (data &&
6210  		    (data->assoc_info.authorized ||
6211  		     (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) &&
6212  		      wpa_fils_is_completed(wpa_s->wpa))))
6213  			wpa_supplicant_event_assoc_auth(wpa_s, data);
6214  		if (data) {
6215  			wpa_msg(wpa_s, MSG_INFO,
6216  				WPA_EVENT_SUBNET_STATUS_UPDATE "status=%u",
6217  				data->assoc_info.subnet_status);
6218  		}
6219  		break;
6220  	case EVENT_DISASSOC:
6221  		wpas_event_disassoc(wpa_s,
6222  				    data ? &data->disassoc_info : NULL);
6223  		break;
6224  	case EVENT_DEAUTH:
6225  #ifdef CONFIG_TESTING_OPTIONS
6226  		if (wpa_s->ignore_auth_resp) {
6227  			wpa_printf(MSG_INFO,
6228  				   "EVENT_DEAUTH - ignore_auth_resp active!");
6229  			break;
6230  		}
6231  		if (wpa_s->testing_resend_assoc) {
6232  			wpa_printf(MSG_INFO,
6233  				   "EVENT_DEAUTH - testing_resend_assoc");
6234  			break;
6235  		}
6236  #endif /* CONFIG_TESTING_OPTIONS */
6237  		wpas_event_deauth(wpa_s,
6238  				  data ? &data->deauth_info : NULL);
6239  		break;
6240  	case EVENT_LINK_RECONFIG:
6241  		wpas_link_reconfig(wpa_s);
6242  		break;
6243  	case EVENT_MICHAEL_MIC_FAILURE:
6244  		wpa_supplicant_event_michael_mic_failure(wpa_s, data);
6245  		break;
6246  #ifndef CONFIG_NO_SCAN_PROCESSING
6247  	case EVENT_SCAN_STARTED:
6248  		if (wpa_s->own_scan_requested ||
6249  		    (data && !data->scan_info.external_scan)) {
6250  			struct os_reltime diff;
6251  
6252  			os_get_reltime(&wpa_s->scan_start_time);
6253  			os_reltime_sub(&wpa_s->scan_start_time,
6254  				       &wpa_s->scan_trigger_time, &diff);
6255  			wpa_dbg(wpa_s, MSG_DEBUG, "Own scan request started a scan in %ld.%06ld seconds",
6256  				diff.sec, diff.usec);
6257  			wpa_s->own_scan_requested = 0;
6258  			wpa_s->own_scan_running = 1;
6259  			if (wpa_s->last_scan_req == MANUAL_SCAN_REQ &&
6260  			    wpa_s->manual_scan_use_id) {
6261  				wpa_msg_ctrl(wpa_s, MSG_INFO,
6262  					     WPA_EVENT_SCAN_STARTED "id=%u",
6263  					     wpa_s->manual_scan_id);
6264  			} else {
6265  				wpa_msg_ctrl(wpa_s, MSG_INFO,
6266  					     WPA_EVENT_SCAN_STARTED);
6267  			}
6268  		} else {
6269  			wpa_dbg(wpa_s, MSG_DEBUG, "External program started a scan");
6270  			wpa_s->radio->external_scan_req_interface = wpa_s;
6271  			wpa_msg_ctrl(wpa_s, MSG_INFO, WPA_EVENT_SCAN_STARTED);
6272  		}
6273  		break;
6274  	case EVENT_SCAN_RESULTS:
6275  		if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
6276  			wpa_s->scan_res_handler = NULL;
6277  			wpa_s->own_scan_running = 0;
6278  			wpa_s->radio->external_scan_req_interface = NULL;
6279  			wpa_s->last_scan_req = NORMAL_SCAN_REQ;
6280  			break;
6281  		}
6282  
6283  		if (!(data && data->scan_info.external_scan) &&
6284  		    os_reltime_initialized(&wpa_s->scan_start_time)) {
6285  			struct os_reltime now, diff;
6286  			os_get_reltime(&now);
6287  			os_reltime_sub(&now, &wpa_s->scan_start_time, &diff);
6288  			wpa_s->scan_start_time.sec = 0;
6289  			wpa_s->scan_start_time.usec = 0;
6290  			wpa_s->wps_scan_done = true;
6291  			wpa_dbg(wpa_s, MSG_DEBUG, "Scan completed in %ld.%06ld seconds",
6292  				diff.sec, diff.usec);
6293  		}
6294  		if (wpa_supplicant_event_scan_results(wpa_s, data))
6295  			break; /* interface may have been removed */
6296  		if (!(data && data->scan_info.external_scan))
6297  			wpa_s->own_scan_running = 0;
6298  		if (data && data->scan_info.nl_scan_event)
6299  			wpa_s->radio->external_scan_req_interface = NULL;
6300  		radio_work_check_next(wpa_s);
6301  		break;
6302  #endif /* CONFIG_NO_SCAN_PROCESSING */
6303  	case EVENT_ASSOCINFO:
6304  		wpa_supplicant_event_associnfo(wpa_s, data);
6305  		break;
6306  	case EVENT_INTERFACE_STATUS:
6307  		wpa_supplicant_event_interface_status(wpa_s, data);
6308  		break;
6309  	case EVENT_PMKID_CANDIDATE:
6310  		wpa_supplicant_event_pmkid_candidate(wpa_s, data);
6311  		break;
6312  #ifdef CONFIG_TDLS
6313  	case EVENT_TDLS:
6314  		wpa_supplicant_event_tdls(wpa_s, data);
6315  		break;
6316  #endif /* CONFIG_TDLS */
6317  #ifdef CONFIG_WNM
6318  	case EVENT_WNM:
6319  		wpa_supplicant_event_wnm(wpa_s, data);
6320  		break;
6321  #endif /* CONFIG_WNM */
6322  #ifdef CONFIG_IEEE80211R
6323  	case EVENT_FT_RESPONSE:
6324  		wpa_supplicant_event_ft_response(wpa_s, data);
6325  		break;
6326  #endif /* CONFIG_IEEE80211R */
6327  #ifdef CONFIG_IBSS_RSN
6328  	case EVENT_IBSS_RSN_START:
6329  		wpa_supplicant_event_ibss_rsn_start(wpa_s, data);
6330  		break;
6331  #endif /* CONFIG_IBSS_RSN */
6332  	case EVENT_ASSOC_REJECT:
6333  		wpas_event_assoc_reject(wpa_s, data);
6334  		break;
6335  	case EVENT_AUTH_TIMED_OUT:
6336  		/* It is possible to get this event from earlier connection */
6337  		if (wpa_s->current_ssid &&
6338  		    wpa_s->current_ssid->mode == WPAS_MODE_MESH) {
6339  			wpa_dbg(wpa_s, MSG_DEBUG,
6340  				"Ignore AUTH_TIMED_OUT in mesh configuration");
6341  			break;
6342  		}
6343  		if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME)
6344  			sme_event_auth_timed_out(wpa_s, data);
6345  		break;
6346  	case EVENT_ASSOC_TIMED_OUT:
6347  		/* It is possible to get this event from earlier connection */
6348  		if (wpa_s->current_ssid &&
6349  		    wpa_s->current_ssid->mode == WPAS_MODE_MESH) {
6350  			wpa_dbg(wpa_s, MSG_DEBUG,
6351  				"Ignore ASSOC_TIMED_OUT in mesh configuration");
6352  			break;
6353  		}
6354  		if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME)
6355  			sme_event_assoc_timed_out(wpa_s, data);
6356  		break;
6357  	case EVENT_TX_STATUS:
6358  		wpa_dbg(wpa_s, MSG_DEBUG, "EVENT_TX_STATUS dst=" MACSTR
6359  			" type=%d stype=%d",
6360  			MAC2STR(data->tx_status.dst),
6361  			data->tx_status.type, data->tx_status.stype);
6362  #ifdef CONFIG_WNM
6363  		if (data->tx_status.type == WLAN_FC_TYPE_MGMT &&
6364  		    data->tx_status.stype == WLAN_FC_STYPE_ACTION &&
6365  		    wnm_btm_resp_tx_status(wpa_s, data->tx_status.data,
6366  					   data->tx_status.data_len) == 0)
6367  			break;
6368  #endif /* CONFIG_WNM */
6369  #ifdef CONFIG_PASN
6370  #ifdef CONFIG_P2P
6371  		if (data->tx_status.type == WLAN_FC_TYPE_MGMT &&
6372  		    data->tx_status.stype == WLAN_FC_STYPE_AUTH &&
6373  		    !wpa_s->pasn_auth_work &&
6374  		    wpa_s->p2p_pasn_auth_work &&
6375  		    wpas_p2p_pasn_auth_tx_status(wpa_s,
6376  						 data->tx_status.data,
6377  						 data->tx_status.data_len,
6378  						 data->tx_status.ack) == 0)
6379  			break;
6380  #endif /* CONFIG_P2P */
6381  		if (data->tx_status.type == WLAN_FC_TYPE_MGMT &&
6382  		    data->tx_status.stype == WLAN_FC_STYPE_AUTH &&
6383  		    wpas_pasn_auth_tx_status(wpa_s, data->tx_status.data,
6384  					     data->tx_status.data_len,
6385  					     data->tx_status.ack) == 0)
6386  			break;
6387  #endif /* CONFIG_PASN */
6388  #ifdef CONFIG_AP
6389  		if (wpa_s->ap_iface == NULL) {
6390  #ifdef CONFIG_OFFCHANNEL
6391  			if (data->tx_status.type == WLAN_FC_TYPE_MGMT &&
6392  			    data->tx_status.stype == WLAN_FC_STYPE_ACTION)
6393  				offchannel_send_action_tx_status(
6394  					wpa_s, data->tx_status.dst,
6395  					data->tx_status.data,
6396  					data->tx_status.data_len,
6397  					data->tx_status.ack ?
6398  					OFFCHANNEL_SEND_ACTION_SUCCESS :
6399  					OFFCHANNEL_SEND_ACTION_NO_ACK);
6400  #endif /* CONFIG_OFFCHANNEL */
6401  			break;
6402  		}
6403  #endif /* CONFIG_AP */
6404  #ifdef CONFIG_OFFCHANNEL
6405  		wpa_dbg(wpa_s, MSG_DEBUG, "EVENT_TX_STATUS pending_dst="
6406  			MACSTR, MAC2STR(wpa_s->p2pdev->pending_action_dst));
6407  		/*
6408  		 * Catch TX status events for Action frames we sent via group
6409  		 * interface in GO mode, or via standalone AP interface.
6410  		 * Note, wpa_s->p2pdev will be the same as wpa_s->parent,
6411  		 * except when the primary interface is used as a GO interface
6412  		 * (for drivers which do not have group interface concurrency)
6413  		 */
6414  		if (data->tx_status.type == WLAN_FC_TYPE_MGMT &&
6415  		    data->tx_status.stype == WLAN_FC_STYPE_ACTION &&
6416  		    ether_addr_equal(wpa_s->p2pdev->pending_action_dst,
6417  				     data->tx_status.dst)) {
6418  			offchannel_send_action_tx_status(
6419  				wpa_s->p2pdev, data->tx_status.dst,
6420  				data->tx_status.data,
6421  				data->tx_status.data_len,
6422  				data->tx_status.ack ?
6423  				OFFCHANNEL_SEND_ACTION_SUCCESS :
6424  				OFFCHANNEL_SEND_ACTION_NO_ACK);
6425  			break;
6426  		}
6427  #endif /* CONFIG_OFFCHANNEL */
6428  #ifdef CONFIG_AP
6429  		switch (data->tx_status.type) {
6430  		case WLAN_FC_TYPE_MGMT:
6431  			ap_mgmt_tx_cb(wpa_s, data->tx_status.data,
6432  				      data->tx_status.data_len,
6433  				      data->tx_status.stype,
6434  				      data->tx_status.ack);
6435  			break;
6436  		case WLAN_FC_TYPE_DATA:
6437  			ap_tx_status(wpa_s, data->tx_status.dst,
6438  				     data->tx_status.data,
6439  				     data->tx_status.data_len,
6440  				     data->tx_status.ack);
6441  			break;
6442  		}
6443  #endif /* CONFIG_AP */
6444  		break;
6445  #ifdef CONFIG_AP
6446  	case EVENT_EAPOL_TX_STATUS:
6447  		ap_eapol_tx_status(wpa_s, data->eapol_tx_status.dst,
6448  				   data->eapol_tx_status.data,
6449  				   data->eapol_tx_status.data_len,
6450  				   data->eapol_tx_status.ack);
6451  		break;
6452  	case EVENT_DRIVER_CLIENT_POLL_OK:
6453  		ap_client_poll_ok(wpa_s, data->client_poll.addr);
6454  		break;
6455  	case EVENT_RX_FROM_UNKNOWN:
6456  		if (wpa_s->ap_iface == NULL)
6457  			break;
6458  		ap_rx_from_unknown_sta(wpa_s, data->rx_from_unknown.addr,
6459  				       data->rx_from_unknown.wds);
6460  		break;
6461  #endif /* CONFIG_AP */
6462  
6463  	case EVENT_LINK_CH_SWITCH_STARTED:
6464  	case EVENT_LINK_CH_SWITCH:
6465  		if (!data || !wpa_s->current_ssid ||
6466  		    !(wpa_s->valid_links & BIT(data->ch_switch.link_id)))
6467  			break;
6468  
6469  		wpa_msg(wpa_s, MSG_INFO,
6470  			"%sfreq=%d link_id=%d ht_enabled=%d ch_offset=%d ch_width=%s cf1=%d cf2=%d",
6471  			event == EVENT_LINK_CH_SWITCH ?
6472  			WPA_EVENT_LINK_CHANNEL_SWITCH :
6473  			WPA_EVENT_LINK_CHANNEL_SWITCH_STARTED,
6474  			data->ch_switch.freq,
6475  			data->ch_switch.link_id,
6476  			data->ch_switch.ht_enabled,
6477  			data->ch_switch.ch_offset,
6478  			channel_width_to_string(data->ch_switch.ch_width),
6479  			data->ch_switch.cf1,
6480  			data->ch_switch.cf2);
6481  		if (event == EVENT_LINK_CH_SWITCH_STARTED)
6482  			break;
6483  
6484  		wpa_s->links[data->ch_switch.link_id].freq =
6485  			data->ch_switch.freq;
6486  		if (wpa_s->links[data->ch_switch.link_id].bss &&
6487  		    wpa_s->links[data->ch_switch.link_id].bss->freq !=
6488  		    data->ch_switch.freq) {
6489  			wpa_s->links[data->ch_switch.link_id].bss->freq =
6490  				data->ch_switch.freq;
6491  			notify_bss_changes(
6492  				wpa_s, WPA_BSS_FREQ_CHANGED_FLAG,
6493  				wpa_s->links[data->ch_switch.link_id].bss);
6494  		}
6495  		break;
6496  	case EVENT_CH_SWITCH_STARTED:
6497  	case EVENT_CH_SWITCH:
6498  		if (!data || !wpa_s->current_ssid)
6499  			break;
6500  
6501  		wpa_msg(wpa_s, MSG_INFO,
6502  			"%sfreq=%d ht_enabled=%d ch_offset=%d ch_width=%s cf1=%d cf2=%d",
6503  			event == EVENT_CH_SWITCH ? WPA_EVENT_CHANNEL_SWITCH :
6504  			WPA_EVENT_CHANNEL_SWITCH_STARTED,
6505  			data->ch_switch.freq,
6506  			data->ch_switch.ht_enabled,
6507  			data->ch_switch.ch_offset,
6508  			channel_width_to_string(data->ch_switch.ch_width),
6509  			data->ch_switch.cf1,
6510  			data->ch_switch.cf2);
6511  		if (event == EVENT_CH_SWITCH_STARTED)
6512  			break;
6513  
6514  		wpa_s->assoc_freq = data->ch_switch.freq;
6515  		wpa_s->current_ssid->frequency = data->ch_switch.freq;
6516  		if (wpa_s->current_bss &&
6517  		    wpa_s->current_bss->freq != data->ch_switch.freq) {
6518  			wpa_s->current_bss->freq = data->ch_switch.freq;
6519  			notify_bss_changes(wpa_s, WPA_BSS_FREQ_CHANGED_FLAG,
6520  					   wpa_s->current_bss);
6521  		}
6522  
6523  #ifdef CONFIG_SME
6524  		switch (data->ch_switch.ch_offset) {
6525  		case 1:
6526  			wpa_s->sme.ht_sec_chan = HT_SEC_CHAN_ABOVE;
6527  			break;
6528  		case -1:
6529  			wpa_s->sme.ht_sec_chan = HT_SEC_CHAN_BELOW;
6530  			break;
6531  		default:
6532  			wpa_s->sme.ht_sec_chan = HT_SEC_CHAN_UNKNOWN;
6533  			break;
6534  		}
6535  #endif /* CONFIG_SME */
6536  
6537  #ifdef CONFIG_AP
6538  		if (wpa_s->current_ssid->mode == WPAS_MODE_AP ||
6539  		    wpa_s->current_ssid->mode == WPAS_MODE_P2P_GO ||
6540  		    wpa_s->current_ssid->mode == WPAS_MODE_MESH ||
6541  		    wpa_s->current_ssid->mode ==
6542  		    WPAS_MODE_P2P_GROUP_FORMATION) {
6543  			wpas_ap_ch_switch(wpa_s, data->ch_switch.freq,
6544  					  data->ch_switch.ht_enabled,
6545  					  data->ch_switch.ch_offset,
6546  					  data->ch_switch.ch_width,
6547  					  data->ch_switch.cf1,
6548  					  data->ch_switch.cf2,
6549  					  data->ch_switch.punct_bitmap,
6550  					  1);
6551  		}
6552  #endif /* CONFIG_AP */
6553  
6554  		if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME)
6555  			sme_event_ch_switch(wpa_s);
6556  
6557  		wpas_p2p_update_channel_list(wpa_s, WPAS_P2P_CHANNEL_UPDATE_CS);
6558  		wnm_clear_coloc_intf_reporting(wpa_s);
6559  		break;
6560  #ifdef CONFIG_AP
6561  #ifdef NEED_AP_MLME
6562  	case EVENT_DFS_RADAR_DETECTED:
6563  		if (data)
6564  			wpas_ap_event_dfs_radar_detected(wpa_s,
6565  							 &data->dfs_event);
6566  		break;
6567  	case EVENT_DFS_NOP_FINISHED:
6568  		if (data)
6569  			wpas_ap_event_dfs_cac_nop_finished(wpa_s,
6570  							   &data->dfs_event);
6571  		break;
6572  #endif /* NEED_AP_MLME */
6573  #endif /* CONFIG_AP */
6574  	case EVENT_DFS_CAC_STARTED:
6575  		if (data)
6576  			wpas_event_dfs_cac_started(wpa_s, &data->dfs_event);
6577  		break;
6578  	case EVENT_DFS_CAC_FINISHED:
6579  		if (data)
6580  			wpas_event_dfs_cac_finished(wpa_s, &data->dfs_event);
6581  		break;
6582  	case EVENT_DFS_CAC_ABORTED:
6583  		if (data)
6584  			wpas_event_dfs_cac_aborted(wpa_s, &data->dfs_event);
6585  		break;
6586  	case EVENT_RX_MGMT: {
6587  		u16 fc, stype;
6588  		const struct ieee80211_mgmt *mgmt;
6589  
6590  #ifdef CONFIG_TESTING_OPTIONS
6591  		if (wpa_s->ext_mgmt_frame_handling) {
6592  			struct rx_mgmt *rx = &data->rx_mgmt;
6593  			size_t hex_len = 2 * rx->frame_len + 1;
6594  			char *hex = os_malloc(hex_len);
6595  			if (hex) {
6596  				wpa_snprintf_hex(hex, hex_len,
6597  						 rx->frame, rx->frame_len);
6598  				wpa_msg(wpa_s, MSG_INFO, "MGMT-RX freq=%d datarate=%u ssi_signal=%d %s",
6599  					rx->freq, rx->datarate, rx->ssi_signal,
6600  					hex);
6601  				os_free(hex);
6602  			}
6603  			break;
6604  		}
6605  #endif /* CONFIG_TESTING_OPTIONS */
6606  
6607  		mgmt = (const struct ieee80211_mgmt *)
6608  			data->rx_mgmt.frame;
6609  		fc = le_to_host16(mgmt->frame_control);
6610  		stype = WLAN_FC_GET_STYPE(fc);
6611  
6612  #ifdef CONFIG_AP
6613  		if (wpa_s->ap_iface == NULL) {
6614  #endif /* CONFIG_AP */
6615  #ifdef CONFIG_P2P
6616  			if (stype == WLAN_FC_STYPE_PROBE_REQ &&
6617  			    data->rx_mgmt.frame_len > IEEE80211_HDRLEN) {
6618  				const u8 *src = mgmt->sa;
6619  				const u8 *ie;
6620  				size_t ie_len;
6621  
6622  				ie = data->rx_mgmt.frame + IEEE80211_HDRLEN;
6623  				ie_len = data->rx_mgmt.frame_len -
6624  					IEEE80211_HDRLEN;
6625  				wpas_p2p_probe_req_rx(
6626  					wpa_s, src, mgmt->da,
6627  					mgmt->bssid, ie, ie_len,
6628  					data->rx_mgmt.freq,
6629  					data->rx_mgmt.ssi_signal);
6630  				break;
6631  			}
6632  #endif /* CONFIG_P2P */
6633  #ifdef CONFIG_IBSS_RSN
6634  			if (wpa_s->current_ssid &&
6635  			    wpa_s->current_ssid->mode == WPAS_MODE_IBSS &&
6636  			    stype == WLAN_FC_STYPE_AUTH &&
6637  			    data->rx_mgmt.frame_len >= 30) {
6638  				wpa_supplicant_event_ibss_auth(wpa_s, data);
6639  				break;
6640  			}
6641  #endif /* CONFIG_IBSS_RSN */
6642  
6643  			if (stype == WLAN_FC_STYPE_ACTION) {
6644  				wpas_event_rx_mgmt_action(
6645  					wpa_s, data->rx_mgmt.frame,
6646  					data->rx_mgmt.frame_len,
6647  					data->rx_mgmt.freq,
6648  					data->rx_mgmt.ssi_signal);
6649  				break;
6650  			}
6651  
6652  			if (wpa_s->ifmsh) {
6653  				mesh_mpm_mgmt_rx(wpa_s, &data->rx_mgmt);
6654  				break;
6655  			}
6656  #ifdef CONFIG_PASN
6657  			if (stype == WLAN_FC_STYPE_AUTH &&
6658  			    wpas_pasn_auth(wpa_s, mgmt, data->rx_mgmt.frame_len,
6659  					   data->rx_mgmt.freq) != -2)
6660  				break;
6661  #endif /* CONFIG_PASN */
6662  
6663  #ifdef CONFIG_SAE
6664  			if (stype == WLAN_FC_STYPE_AUTH &&
6665  			    !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) &&
6666  			    (wpa_s->drv_flags & WPA_DRIVER_FLAGS_SAE)) {
6667  				sme_external_auth_mgmt_rx(
6668  					wpa_s, data->rx_mgmt.frame,
6669  					data->rx_mgmt.frame_len);
6670  				break;
6671  			}
6672  #endif /* CONFIG_SAE */
6673  			wpa_dbg(wpa_s, MSG_DEBUG, "AP: ignore received "
6674  				"management frame in non-AP mode");
6675  			break;
6676  #ifdef CONFIG_AP
6677  		}
6678  
6679  		if (stype == WLAN_FC_STYPE_PROBE_REQ &&
6680  		    data->rx_mgmt.frame_len > IEEE80211_HDRLEN) {
6681  			const u8 *ie;
6682  			size_t ie_len;
6683  
6684  			ie = data->rx_mgmt.frame + IEEE80211_HDRLEN;
6685  			ie_len = data->rx_mgmt.frame_len - IEEE80211_HDRLEN;
6686  
6687  			wpas_notify_preq(wpa_s, mgmt->sa, mgmt->da,
6688  					 mgmt->bssid, ie, ie_len,
6689  					 data->rx_mgmt.ssi_signal);
6690  		}
6691  
6692  		ap_mgmt_rx(wpa_s, &data->rx_mgmt);
6693  #endif /* CONFIG_AP */
6694  		break;
6695  		}
6696  	case EVENT_RX_PROBE_REQ:
6697  		if (data->rx_probe_req.sa == NULL ||
6698  		    data->rx_probe_req.ie == NULL)
6699  			break;
6700  #ifdef CONFIG_AP
6701  		if (wpa_s->ap_iface) {
6702  			hostapd_probe_req_rx(wpa_s->ap_iface->bss[0],
6703  					     data->rx_probe_req.sa,
6704  					     data->rx_probe_req.da,
6705  					     data->rx_probe_req.bssid,
6706  					     data->rx_probe_req.ie,
6707  					     data->rx_probe_req.ie_len,
6708  					     data->rx_probe_req.ssi_signal);
6709  			break;
6710  		}
6711  #endif /* CONFIG_AP */
6712  		wpas_p2p_probe_req_rx(wpa_s, data->rx_probe_req.sa,
6713  				      data->rx_probe_req.da,
6714  				      data->rx_probe_req.bssid,
6715  				      data->rx_probe_req.ie,
6716  				      data->rx_probe_req.ie_len,
6717  				      0,
6718  				      data->rx_probe_req.ssi_signal);
6719  		break;
6720  	case EVENT_REMAIN_ON_CHANNEL:
6721  #ifdef CONFIG_OFFCHANNEL
6722  		offchannel_remain_on_channel_cb(
6723  			wpa_s, data->remain_on_channel.freq,
6724  			data->remain_on_channel.duration);
6725  #endif /* CONFIG_OFFCHANNEL */
6726  		wpas_p2p_remain_on_channel_cb(
6727  			wpa_s, data->remain_on_channel.freq,
6728  			data->remain_on_channel.duration);
6729  #ifdef CONFIG_DPP
6730  		wpas_dpp_remain_on_channel_cb(
6731  			wpa_s, data->remain_on_channel.freq,
6732  			data->remain_on_channel.duration);
6733  #endif /* CONFIG_DPP */
6734  #ifdef CONFIG_NAN_USD
6735  		wpas_nan_usd_remain_on_channel_cb(
6736  			wpa_s, data->remain_on_channel.freq,
6737  			data->remain_on_channel.duration);
6738  #endif /* CONFIG_NAN_USD */
6739  		break;
6740  	case EVENT_CANCEL_REMAIN_ON_CHANNEL:
6741  #ifdef CONFIG_OFFCHANNEL
6742  		offchannel_cancel_remain_on_channel_cb(
6743  			wpa_s, data->remain_on_channel.freq);
6744  #endif /* CONFIG_OFFCHANNEL */
6745  		wpas_p2p_cancel_remain_on_channel_cb(
6746  			wpa_s, data->remain_on_channel.freq);
6747  #ifdef CONFIG_DPP
6748  		wpas_dpp_cancel_remain_on_channel_cb(
6749  			wpa_s, data->remain_on_channel.freq);
6750  #endif /* CONFIG_DPP */
6751  #ifdef CONFIG_NAN_USD
6752  		wpas_nan_usd_cancel_remain_on_channel_cb(
6753  			wpa_s, data->remain_on_channel.freq);
6754  #endif /* CONFIG_NAN_USD */
6755  		break;
6756  	case EVENT_EAPOL_RX:
6757  		wpa_supplicant_rx_eapol(wpa_s, data->eapol_rx.src,
6758  					data->eapol_rx.data,
6759  					data->eapol_rx.data_len,
6760  					data->eapol_rx.encrypted);
6761  		break;
6762  	case EVENT_SIGNAL_CHANGE:
6763  		wpa_msg_ctrl(wpa_s, MSG_INFO, WPA_EVENT_SIGNAL_CHANGE
6764  			     "above=%d signal=%d noise=%d txrate=%lu",
6765  			     data->signal_change.above_threshold,
6766  			     data->signal_change.data.signal,
6767  			     data->signal_change.current_noise,
6768  			     data->signal_change.data.current_tx_rate);
6769  		wpa_bss_update_level(wpa_s->current_bss,
6770  				     data->signal_change.data.signal);
6771  		bgscan_notify_signal_change(
6772  			wpa_s, data->signal_change.above_threshold,
6773  			data->signal_change.data.signal,
6774  			data->signal_change.current_noise,
6775  			data->signal_change.data.current_tx_rate);
6776  		os_memcpy(&wpa_s->last_signal_info, data,
6777  			  sizeof(struct wpa_signal_info));
6778  		wpas_notify_signal_change(wpa_s);
6779  		break;
6780  	case EVENT_INTERFACE_MAC_CHANGED:
6781  		wpa_supplicant_update_mac_addr(wpa_s);
6782  		wpa_sm_pmksa_cache_flush(wpa_s->wpa, NULL);
6783  		break;
6784  	case EVENT_INTERFACE_ENABLED:
6785  		wpa_dbg(wpa_s, MSG_DEBUG, "Interface was enabled");
6786  		if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
6787  			u8 addr[ETH_ALEN];
6788  
6789  			eloop_cancel_timeout(wpas_clear_disabled_interface,
6790  					     wpa_s, NULL);
6791  			os_memcpy(addr, wpa_s->own_addr, ETH_ALEN);
6792  			wpa_supplicant_update_mac_addr(wpa_s);
6793  			if (!ether_addr_equal(addr, wpa_s->own_addr))
6794  				wpa_sm_pmksa_cache_flush(wpa_s->wpa, NULL);
6795  			else
6796  				wpa_sm_pmksa_cache_reconfig(wpa_s->wpa);
6797  			wpa_supplicant_set_default_scan_ies(wpa_s);
6798  			if (wpa_s->p2p_mgmt) {
6799  				wpa_supplicant_set_state(wpa_s,
6800  							 WPA_DISCONNECTED);
6801  				break;
6802  			}
6803  
6804  #ifdef CONFIG_AP
6805  			if (!wpa_s->ap_iface) {
6806  				wpa_supplicant_set_state(wpa_s,
6807  							 WPA_DISCONNECTED);
6808  				wpa_s->scan_req = NORMAL_SCAN_REQ;
6809  				wpa_supplicant_req_scan(wpa_s, 0, 0);
6810  			} else
6811  				wpa_supplicant_set_state(wpa_s,
6812  							 WPA_COMPLETED);
6813  #else /* CONFIG_AP */
6814  			wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
6815  			wpa_supplicant_req_scan(wpa_s, 0, 0);
6816  #endif /* CONFIG_AP */
6817  		}
6818  		break;
6819  	case EVENT_INTERFACE_DISABLED:
6820  		wpa_dbg(wpa_s, MSG_DEBUG, "Interface was disabled");
6821  #ifdef CONFIG_P2P
6822  		if (wpa_s->p2p_group_interface == P2P_GROUP_INTERFACE_GO ||
6823  		    (wpa_s->current_ssid && wpa_s->current_ssid->p2p_group &&
6824  		     wpa_s->current_ssid->mode == WPAS_MODE_P2P_GO)) {
6825  			/*
6826  			 * Mark interface disabled if this happens to end up not
6827  			 * being removed as a separate P2P group interface.
6828  			 */
6829  			wpa_supplicant_set_state(wpa_s, WPA_INTERFACE_DISABLED);
6830  			/*
6831  			 * The interface was externally disabled. Remove
6832  			 * it assuming an external entity will start a
6833  			 * new session if needed.
6834  			 */
6835  			if (wpa_s->current_ssid &&
6836  			    wpa_s->current_ssid->p2p_group)
6837  				wpas_p2p_interface_unavailable(wpa_s);
6838  			else
6839  				wpas_p2p_disconnect(wpa_s);
6840  			/*
6841  			 * wpa_s instance may have been freed, so must not use
6842  			 * it here anymore.
6843  			 */
6844  			break;
6845  		}
6846  		if (wpa_s->p2p_scan_work && wpa_s->global->p2p &&
6847  		    p2p_in_progress(wpa_s->global->p2p) > 1) {
6848  			/* This radio work will be cancelled, so clear P2P
6849  			 * state as well.
6850  			 */
6851  			p2p_stop_find(wpa_s->global->p2p);
6852  		}
6853  #endif /* CONFIG_P2P */
6854  
6855  		if (wpa_s->wpa_state >= WPA_AUTHENTICATING) {
6856  			/*
6857  			 * Indicate disconnection to keep ctrl_iface events
6858  			 * consistent.
6859  			 */
6860  			wpa_supplicant_event_disassoc(
6861  				wpa_s, WLAN_REASON_DEAUTH_LEAVING, 1);
6862  		}
6863  		wpa_supplicant_mark_disassoc(wpa_s);
6864  		os_reltime_age(&wpa_s->last_scan, &age);
6865  		if (age.sec >= wpa_s->conf->scan_res_valid_for_connect) {
6866  			clear_at.sec = wpa_s->conf->scan_res_valid_for_connect;
6867  			clear_at.usec = 0;
6868  		} else {
6869  			struct os_reltime tmp;
6870  
6871  			tmp.sec = wpa_s->conf->scan_res_valid_for_connect;
6872  			tmp.usec = 0;
6873  			os_reltime_sub(&tmp, &age, &clear_at);
6874  		}
6875  		eloop_register_timeout(clear_at.sec, clear_at.usec,
6876  				       wpas_clear_disabled_interface,
6877  				       wpa_s, NULL);
6878  		radio_remove_works(wpa_s, NULL, 0);
6879  
6880  		wpa_supplicant_set_state(wpa_s, WPA_INTERFACE_DISABLED);
6881  		break;
6882  	case EVENT_CHANNEL_LIST_CHANGED:
6883  		wpa_supplicant_update_channel_list(
6884  			wpa_s, &data->channel_list_changed);
6885  		break;
6886  	case EVENT_INTERFACE_UNAVAILABLE:
6887  		wpas_p2p_interface_unavailable(wpa_s);
6888  		break;
6889  	case EVENT_BEST_CHANNEL:
6890  		wpa_dbg(wpa_s, MSG_DEBUG, "Best channel event received "
6891  			"(%d %d %d)",
6892  			data->best_chan.freq_24, data->best_chan.freq_5,
6893  			data->best_chan.freq_overall);
6894  		wpa_s->best_24_freq = data->best_chan.freq_24;
6895  		wpa_s->best_5_freq = data->best_chan.freq_5;
6896  		wpa_s->best_overall_freq = data->best_chan.freq_overall;
6897  		wpas_p2p_update_best_channels(wpa_s, data->best_chan.freq_24,
6898  					      data->best_chan.freq_5,
6899  					      data->best_chan.freq_overall);
6900  		break;
6901  	case EVENT_UNPROT_DEAUTH:
6902  		wpa_supplicant_event_unprot_deauth(wpa_s,
6903  						   &data->unprot_deauth);
6904  		break;
6905  	case EVENT_UNPROT_DISASSOC:
6906  		wpa_supplicant_event_unprot_disassoc(wpa_s,
6907  						     &data->unprot_disassoc);
6908  		break;
6909  	case EVENT_STATION_LOW_ACK:
6910  #ifdef CONFIG_AP
6911  		if (wpa_s->ap_iface && data)
6912  			hostapd_event_sta_low_ack(wpa_s->ap_iface->bss[0],
6913  						  data->low_ack.addr);
6914  #endif /* CONFIG_AP */
6915  #ifdef CONFIG_TDLS
6916  		if (data)
6917  			wpa_tdls_disable_unreachable_link(wpa_s->wpa,
6918  							  data->low_ack.addr);
6919  #endif /* CONFIG_TDLS */
6920  		break;
6921  	case EVENT_IBSS_PEER_LOST:
6922  #ifdef CONFIG_IBSS_RSN
6923  		ibss_rsn_stop(wpa_s->ibss_rsn, data->ibss_peer_lost.peer);
6924  #endif /* CONFIG_IBSS_RSN */
6925  		break;
6926  	case EVENT_DRIVER_GTK_REKEY:
6927  		if (!ether_addr_equal(data->driver_gtk_rekey.bssid,
6928  				      wpa_s->bssid))
6929  			break;
6930  		if (!wpa_s->wpa)
6931  			break;
6932  		wpa_sm_update_replay_ctr(wpa_s->wpa,
6933  					 data->driver_gtk_rekey.replay_ctr);
6934  		break;
6935  	case EVENT_SCHED_SCAN_STOPPED:
6936  		wpa_s->sched_scanning = 0;
6937  		resched = wpa_s->scanning && wpas_scan_scheduled(wpa_s);
6938  		wpa_supplicant_notify_scanning(wpa_s, 0);
6939  
6940  		if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED)
6941  			break;
6942  
6943  		/*
6944  		 * If the driver stopped scanning without being requested to,
6945  		 * request a new scan to continue scanning for networks.
6946  		 */
6947  		if (!wpa_s->sched_scan_stop_req &&
6948  		    wpa_s->wpa_state == WPA_SCANNING) {
6949  			wpa_dbg(wpa_s, MSG_DEBUG,
6950  				"Restart scanning after unexpected sched_scan stop event");
6951  			wpa_supplicant_req_scan(wpa_s, 1, 0);
6952  			break;
6953  		}
6954  
6955  		wpa_s->sched_scan_stop_req = 0;
6956  
6957  		/*
6958  		 * Start a new sched scan to continue searching for more SSIDs
6959  		 * either if timed out or PNO schedule scan is pending.
6960  		 */
6961  		if (wpa_s->sched_scan_timed_out) {
6962  			wpa_supplicant_req_sched_scan(wpa_s);
6963  		} else if (wpa_s->pno_sched_pending) {
6964  			wpa_s->pno_sched_pending = 0;
6965  			wpas_start_pno(wpa_s);
6966  		} else if (resched) {
6967  			wpa_supplicant_req_scan(wpa_s, 0, 0);
6968  		}
6969  
6970  		break;
6971  	case EVENT_WPS_BUTTON_PUSHED:
6972  #ifdef CONFIG_WPS
6973  		wpas_wps_start_pbc(wpa_s, NULL, 0, 0);
6974  #endif /* CONFIG_WPS */
6975  		break;
6976  	case EVENT_AVOID_FREQUENCIES:
6977  		wpa_supplicant_notify_avoid_freq(wpa_s, data);
6978  		break;
6979  	case EVENT_CONNECT_FAILED_REASON:
6980  #ifdef CONFIG_AP
6981  		if (!wpa_s->ap_iface || !data)
6982  			break;
6983  		hostapd_event_connect_failed_reason(
6984  			wpa_s->ap_iface->bss[0],
6985  			data->connect_failed_reason.addr,
6986  			data->connect_failed_reason.code);
6987  #endif /* CONFIG_AP */
6988  		break;
6989  	case EVENT_NEW_PEER_CANDIDATE:
6990  #ifdef CONFIG_MESH
6991  		if (!wpa_s->ifmsh || !data)
6992  			break;
6993  		wpa_mesh_notify_peer(wpa_s, data->mesh_peer.peer,
6994  				     data->mesh_peer.ies,
6995  				     data->mesh_peer.ie_len);
6996  #endif /* CONFIG_MESH */
6997  		break;
6998  	case EVENT_SURVEY:
6999  #ifdef CONFIG_AP
7000  		if (!wpa_s->ap_iface)
7001  			break;
7002  		hostapd_event_get_survey(wpa_s->ap_iface,
7003  					 &data->survey_results);
7004  #endif /* CONFIG_AP */
7005  		break;
7006  	case EVENT_ACS_CHANNEL_SELECTED:
7007  #ifdef CONFIG_AP
7008  #ifdef CONFIG_ACS
7009  		if (!wpa_s->ap_iface)
7010  			break;
7011  		hostapd_acs_channel_selected(wpa_s->ap_iface->bss[0],
7012  					     &data->acs_selected_channels);
7013  #endif /* CONFIG_ACS */
7014  #endif /* CONFIG_AP */
7015  		break;
7016  	case EVENT_P2P_LO_STOP:
7017  #ifdef CONFIG_P2P
7018  		wpa_s->p2p_lo_started = 0;
7019  		wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_LISTEN_OFFLOAD_STOP
7020  			P2P_LISTEN_OFFLOAD_STOP_REASON "reason=%d",
7021  			data->p2p_lo_stop.reason_code);
7022  #endif /* CONFIG_P2P */
7023  		break;
7024  	case EVENT_BEACON_LOSS:
7025  		if (!wpa_s->current_bss || !wpa_s->current_ssid)
7026  			break;
7027  		wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_BEACON_LOSS);
7028  		bgscan_notify_beacon_loss(wpa_s);
7029  		break;
7030  	case EVENT_EXTERNAL_AUTH:
7031  #ifdef CONFIG_SAE
7032  		if (!wpa_s->current_ssid) {
7033  			wpa_printf(MSG_DEBUG, "SAE: current_ssid is NULL");
7034  			break;
7035  		}
7036  		sme_external_auth_trigger(wpa_s, data);
7037  #endif /* CONFIG_SAE */
7038  		break;
7039  #ifdef CONFIG_PASN
7040  	case EVENT_PASN_AUTH:
7041  		wpas_pasn_auth_trigger(wpa_s, &data->pasn_auth);
7042  		break;
7043  #endif /* CONFIG_PASN */
7044  	case EVENT_PORT_AUTHORIZED:
7045  #ifdef CONFIG_AP
7046  		if (wpa_s->ap_iface && wpa_s->ap_iface->bss[0]) {
7047  			struct sta_info *sta;
7048  
7049  			sta = ap_get_sta(wpa_s->ap_iface->bss[0],
7050  					 data->port_authorized.sta_addr);
7051  			if (sta)
7052  				ap_sta_set_authorized(wpa_s->ap_iface->bss[0],
7053  						      sta, 1);
7054  			else
7055  				wpa_printf(MSG_DEBUG,
7056  					   "No STA info matching port authorized event found");
7057  			break;
7058  		}
7059  #endif /* CONFIG_AP */
7060  #ifndef CONFIG_NO_WPA
7061  		if (data->port_authorized.td_bitmap_len) {
7062  			wpa_printf(MSG_DEBUG,
7063  				   "WPA3: Transition Disable bitmap from the driver event: 0x%x",
7064  				   data->port_authorized.td_bitmap[0]);
7065  			wpas_transition_disable(
7066  				wpa_s, data->port_authorized.td_bitmap[0]);
7067  		}
7068  #endif /* CONFIG_NO_WPA */
7069  		wpa_supplicant_event_port_authorized(wpa_s);
7070  		break;
7071  	case EVENT_STATION_OPMODE_CHANGED:
7072  #ifdef CONFIG_AP
7073  		if (!wpa_s->ap_iface || !data)
7074  			break;
7075  
7076  		hostapd_event_sta_opmode_changed(wpa_s->ap_iface->bss[0],
7077  						 data->sta_opmode.addr,
7078  						 data->sta_opmode.smps_mode,
7079  						 data->sta_opmode.chan_width,
7080  						 data->sta_opmode.rx_nss);
7081  #endif /* CONFIG_AP */
7082  		break;
7083  	case EVENT_UNPROT_BEACON:
7084  		wpas_event_unprot_beacon(wpa_s, &data->unprot_beacon);
7085  		break;
7086  	case EVENT_TX_WAIT_EXPIRE:
7087  #ifdef CONFIG_DPP
7088  		wpas_dpp_tx_wait_expire(wpa_s);
7089  #endif /* CONFIG_DPP */
7090  #ifdef CONFIG_NAN_USD
7091  		wpas_nan_usd_tx_wait_expire(wpa_s);
7092  #endif /* CONFIG_NAN_USD */
7093  		break;
7094  	case EVENT_TID_LINK_MAP:
7095  		if (data)
7096  			wpas_tid_link_map(wpa_s, &data->t2l_map_info);
7097  		break;
7098  	default:
7099  		wpa_msg(wpa_s, MSG_INFO, "Unknown event %d", event);
7100  		break;
7101  	}
7102  }
7103  
7104  
wpa_supplicant_event_global(void * ctx,enum wpa_event_type event,union wpa_event_data * data)7105  void wpa_supplicant_event_global(void *ctx, enum wpa_event_type event,
7106  				 union wpa_event_data *data)
7107  {
7108  	struct wpa_supplicant *wpa_s;
7109  
7110  	if (event != EVENT_INTERFACE_STATUS)
7111  		return;
7112  
7113  	wpa_s = wpa_supplicant_get_iface(ctx, data->interface_status.ifname);
7114  	if (wpa_s && wpa_s->driver->get_ifindex) {
7115  		unsigned int ifindex;
7116  
7117  		ifindex = wpa_s->driver->get_ifindex(wpa_s->drv_priv);
7118  		if (ifindex != data->interface_status.ifindex) {
7119  			wpa_dbg(wpa_s, MSG_DEBUG,
7120  				"interface status ifindex %d mismatch (%d)",
7121  				ifindex, data->interface_status.ifindex);
7122  			return;
7123  		}
7124  	}
7125  #ifdef CONFIG_MATCH_IFACE
7126  	else if (data->interface_status.ievent == EVENT_INTERFACE_ADDED) {
7127  		struct wpa_interface *wpa_i;
7128  
7129  		wpa_i = wpa_supplicant_match_iface(
7130  			ctx, data->interface_status.ifname);
7131  		if (!wpa_i)
7132  			return;
7133  		wpa_s = wpa_supplicant_add_iface(ctx, wpa_i, NULL);
7134  		os_free(wpa_i);
7135  	}
7136  #endif /* CONFIG_MATCH_IFACE */
7137  
7138  	if (wpa_s)
7139  		wpa_supplicant_event(wpa_s, event, data);
7140  }
7141