Lines Matching refs:wpa_s
41 static void sme_stop_sa_query(struct wpa_supplicant *wpa_s);
58 static int sme_set_sae_group(struct wpa_supplicant *wpa_s) in sme_set_sae_group() argument
60 int *groups = wpa_s->conf->sae_groups; in sme_set_sae_group()
67 if (!index_within_array(groups, wpa_s->sme.sae_group_index)) in sme_set_sae_group()
71 int group = groups[wpa_s->sme.sae_group_index]; in sme_set_sae_group()
74 if (sae_set_group(&wpa_s->sme.sae, group) == 0) { in sme_set_sae_group()
75 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Selected SAE group %d", in sme_set_sae_group()
76 wpa_s->sme.sae.group); in sme_set_sae_group()
79 wpa_s->sme.sae_group_index++; in sme_set_sae_group()
86 static struct wpabuf * sme_auth_build_sae_commit(struct wpa_supplicant *wpa_s, in sme_auth_build_sae_commit() argument
96 if (wpa_s->sae_commit_override) { in sme_auth_build_sae_commit()
98 buf = wpabuf_alloc(4 + wpabuf_len(wpa_s->sae_commit_override)); in sme_auth_build_sae_commit()
105 wpabuf_put_buf(buf, wpa_s->sae_commit_override); in sme_auth_build_sae_commit()
118 if (reuse && wpa_s->sme.sae.tmp && in sme_auth_build_sae_commit()
119 os_memcmp(bssid, wpa_s->sme.sae.tmp->bssid, ETH_ALEN) == 0) { in sme_auth_build_sae_commit()
124 if (sme_set_sae_group(wpa_s) < 0) { in sme_auth_build_sae_commit()
129 if (sae_prepare_commit(wpa_s->own_addr, bssid, in sme_auth_build_sae_commit()
132 &wpa_s->sme.sae) < 0) { in sme_auth_build_sae_commit()
136 if (wpa_s->sme.sae.tmp) in sme_auth_build_sae_commit()
137 os_memcpy(wpa_s->sme.sae.tmp->bssid, bssid, ETH_ALEN); in sme_auth_build_sae_commit()
140 len = wpa_s->sme.sae_token ? wpabuf_len(wpa_s->sme.sae_token) : 0; in sme_auth_build_sae_commit()
150 sae_write_commit(&wpa_s->sme.sae, buf, wpa_s->sme.sae_token, in sme_auth_build_sae_commit()
157 static struct wpabuf * sme_auth_build_sae_confirm(struct wpa_supplicant *wpa_s, in sme_auth_build_sae_confirm() argument
170 sae_write_confirm(&wpa_s->sme.sae, buf); in sme_auth_build_sae_confirm()
183 static void sme_auth_handle_rrm(struct wpa_supplicant *wpa_s, in sme_auth_handle_rrm() argument
190 wpa_s->rrm.rrm_used = 0; in sme_auth_handle_rrm()
194 wpa_s->drv_rrm_flags); in sme_auth_handle_rrm()
202 if (!((wpa_s->drv_rrm_flags & in sme_auth_handle_rrm()
204 (wpa_s->drv_rrm_flags & WPA_DRIVER_FLAGS_QUIET)) && in sme_auth_handle_rrm()
205 !(wpa_s->drv_rrm_flags & WPA_DRIVER_FLAGS_SUPPORT_RRM)) { in sme_auth_handle_rrm()
211 if (sizeof(wpa_s->sme.assoc_req_ie) < in sme_auth_handle_rrm()
212 wpa_s->sme.assoc_req_ie_len + rrm_ie_len + 2) { in sme_auth_handle_rrm()
219 pos = wpa_s->sme.assoc_req_ie + wpa_s->sme.assoc_req_ie_len; in sme_auth_handle_rrm()
225 if (wpa_s->drv_rrm_flags & WPA_DRIVER_FLAGS_TX_POWER_INSERTION) in sme_auth_handle_rrm()
232 if (wpa_s->lci) in sme_auth_handle_rrm()
235 wpa_s->sme.assoc_req_ie_len += rrm_ie_len + 2; in sme_auth_handle_rrm()
236 wpa_s->rrm.rrm_used = 1; in sme_auth_handle_rrm()
240 static void sme_send_authentication(struct wpa_supplicant *wpa_s, in sme_send_authentication() argument
264 wpa_msg(wpa_s, MSG_ERROR, "SME: No scan result available for " in sme_send_authentication()
266 wpas_connect_work_done(wpa_s); in sme_send_authentication()
270 skip_auth = wpa_s->conf->reassoc_same_bss_optim && in sme_send_authentication()
271 wpa_s->reassoc_same_bss; in sme_send_authentication()
272 wpa_s->current_bss = bss; in sme_send_authentication()
275 wpa_s->reassociate = 0; in sme_send_authentication()
283 if (wpa_s->sme.ssid_len != params.ssid_len || in sme_send_authentication()
284 os_memcmp(wpa_s->sme.ssid, params.ssid, params.ssid_len) != 0) in sme_send_authentication()
285 wpa_s->sme.prev_bssid_set = 0; in sme_send_authentication()
287 wpa_s->sme.freq = params.freq; in sme_send_authentication()
288 os_memcpy(wpa_s->sme.ssid, params.ssid, params.ssid_len); in sme_send_authentication()
289 wpa_s->sme.ssid_len = params.ssid_len; in sme_send_authentication()
302 wpa_dbg(wpa_s, MSG_DEBUG, "Automatic auth_alg selection: 0x%x", in sme_send_authentication()
306 wpa_dbg(wpa_s, MSG_DEBUG, "Overriding auth_alg selection: " in sme_send_authentication()
310 wpa_s->sme.sae_pmksa_caching = 0; in sme_send_authentication()
317 wpa_dbg(wpa_s, MSG_DEBUG, in sme_send_authentication()
323 wpa_dbg(wpa_s, MSG_DEBUG, "Prefer DPP over SAE when both are enabled"); in sme_send_authentication()
327 wpa_dbg(wpa_s, MSG_DEBUG, "Using SAE auth_alg"); in sme_send_authentication()
330 wpa_dbg(wpa_s, MSG_DEBUG, in sme_send_authentication()
343 bssid_changed = !is_zero_ether_addr(wpa_s->bssid); in sme_send_authentication()
344 os_memset(wpa_s->bssid, 0, ETH_ALEN); in sme_send_authentication()
345 os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN); in sme_send_authentication()
347 wpas_notify_bssid_changed(wpa_s); in sme_send_authentication()
356 wpa_s->conf->okc : in sme_send_authentication()
363 if (pmksa_cache_set_current(wpa_s->wpa, NULL, bss->bssid, in sme_send_authentication()
364 wpa_s->current_ssid, in sme_send_authentication()
367 eapol_sm_notify_pmkid_attempt(wpa_s->eapol); in sme_send_authentication()
368 wpa_s->sme.assoc_req_ie_len = sizeof(wpa_s->sme.assoc_req_ie); in sme_send_authentication()
369 if (wpa_supplicant_set_suites(wpa_s, bss, ssid, in sme_send_authentication()
370 wpa_s->sme.assoc_req_ie, in sme_send_authentication()
371 &wpa_s->sme.assoc_req_ie_len)) { in sme_send_authentication()
372 wpa_msg(wpa_s, MSG_WARNING, "SME: Failed to set WPA " in sme_send_authentication()
374 wpas_connect_work_done(wpa_s); in sme_send_authentication()
381 wpa_s->sme.assoc_req_ie_len = sizeof(wpa_s->sme.assoc_req_ie); in sme_send_authentication()
382 if (wpa_supplicant_set_suites(wpa_s, bss, ssid, in sme_send_authentication()
383 wpa_s->sme.assoc_req_ie, in sme_send_authentication()
384 &wpa_s->sme.assoc_req_ie_len)) { in sme_send_authentication()
385 wpa_msg(wpa_s, MSG_WARNING, "SME: Failed to set WPA " in sme_send_authentication()
387 wpas_connect_work_done(wpa_s); in sme_send_authentication()
398 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid); in sme_send_authentication()
399 wpa_s->sme.assoc_req_ie_len = 0; in sme_send_authentication()
401 wpa_s->sme.assoc_req_ie_len = sizeof(wpa_s->sme.assoc_req_ie); in sme_send_authentication()
402 if (wpa_supplicant_set_suites(wpa_s, NULL, ssid, in sme_send_authentication()
403 wpa_s->sme.assoc_req_ie, in sme_send_authentication()
404 &wpa_s->sme.assoc_req_ie_len)) { in sme_send_authentication()
405 wpa_msg(wpa_s, MSG_WARNING, "SME: Failed to set WPA " in sme_send_authentication()
408 wpas_connect_work_done(wpa_s); in sme_send_authentication()
416 sizeof(wpa_s->sme.assoc_req_ie)) { in sme_send_authentication()
417 wpa_s->sme.assoc_req_ie_len = wpabuf_len(wps_ie); in sme_send_authentication()
418 os_memcpy(wpa_s->sme.assoc_req_ie, wpabuf_head(wps_ie), in sme_send_authentication()
419 wpa_s->sme.assoc_req_ie_len); in sme_send_authentication()
421 wpa_s->sme.assoc_req_ie_len = 0; in sme_send_authentication()
423 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid); in sme_send_authentication()
426 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid); in sme_send_authentication()
427 wpa_s->sme.assoc_req_ie_len = 0; in sme_send_authentication()
437 if (wpa_s->wpa_proto == WPA_PROTO_WPA) { in sme_send_authentication()
438 wpa_ie = os_memdup(wpa_s->sme.assoc_req_ie, in sme_send_authentication()
439 wpa_s->sme.assoc_req_ie_len); in sme_send_authentication()
441 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Storing WPA IE"); in sme_send_authentication()
443 wpa_ie_len = wpa_s->sme.assoc_req_ie_len; in sme_send_authentication()
444 wpa_s->sme.assoc_req_ie_len = 0; in sme_send_authentication()
446 wpa_msg(wpa_s, MSG_WARNING, "WPA: Failed copy WPA IE"); in sme_send_authentication()
447 wpas_connect_work_done(wpa_s); in sme_send_authentication()
456 wpa_sm_set_ft_params(wpa_s->wpa, ie, ie ? 2 + ie[1] : 0); in sme_send_authentication()
458 !wpa_key_mgmt_ft(wpa_s->key_mgmt))) in sme_send_authentication()
462 wpa_ft_prepare_auth_request(wpa_s->wpa, ie); in sme_send_authentication()
466 wpa_dbg(wpa_s, MSG_DEBUG, "SME: FT mobility domain %02x%02x", in sme_send_authentication()
469 if (wpa_s->sme.assoc_req_ie_len + 5 < in sme_send_authentication()
470 sizeof(wpa_s->sme.assoc_req_ie)) { in sme_send_authentication()
472 u8 *pos = wpa_s->sme.assoc_req_ie + in sme_send_authentication()
473 wpa_s->sme.assoc_req_ie_len; in sme_send_authentication()
480 wpa_s->sme.assoc_req_ie_len += 5; in sme_send_authentication()
483 if (wpa_s->sme.prev_bssid_set && wpa_s->sme.ft_used && in sme_send_authentication()
484 os_memcmp(md, wpa_s->sme.mobility_domain, 2) == 0 && in sme_send_authentication()
485 wpa_sm_has_ptk(wpa_s->wpa)) { in sme_send_authentication()
486 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Trying to use FT " in sme_send_authentication()
489 params.ie = wpa_s->sme.ft_ies; in sme_send_authentication()
490 params.ie_len = wpa_s->sme.ft_ies_len; in sme_send_authentication()
496 wpa_s->sme.mfp = wpas_get_ssid_pmf(wpa_s, ssid); in sme_send_authentication()
497 if (wpa_s->sme.mfp != NO_MGMT_FRAME_PROTECTION) { in sme_send_authentication()
503 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Selected AP supports " in sme_send_authentication()
505 wpa_s->sme.mfp = MGMT_FRAME_PROTECTION_REQUIRED; in sme_send_authentication()
511 if (wpa_s->global->p2p) { in sme_send_authentication()
515 pos = wpa_s->sme.assoc_req_ie + wpa_s->sme.assoc_req_ie_len; in sme_send_authentication()
516 len = sizeof(wpa_s->sme.assoc_req_ie) - in sme_send_authentication()
517 wpa_s->sme.assoc_req_ie_len; in sme_send_authentication()
518 res = wpas_p2p_assoc_req_ie(wpa_s, bss, pos, len, in sme_send_authentication()
521 wpa_s->sme.assoc_req_ie_len += res; in sme_send_authentication()
526 if (wpa_s->fst_ies) { in sme_send_authentication()
527 int fst_ies_len = wpabuf_len(wpa_s->fst_ies); in sme_send_authentication()
529 if (wpa_s->sme.assoc_req_ie_len + fst_ies_len <= in sme_send_authentication()
530 sizeof(wpa_s->sme.assoc_req_ie)) { in sme_send_authentication()
531 os_memcpy(wpa_s->sme.assoc_req_ie + in sme_send_authentication()
532 wpa_s->sme.assoc_req_ie_len, in sme_send_authentication()
533 wpabuf_head(wpa_s->fst_ies), in sme_send_authentication()
535 wpa_s->sme.assoc_req_ie_len += fst_ies_len; in sme_send_authentication()
540 sme_auth_handle_rrm(wpa_s, bss); in sme_send_authentication()
542 wpa_s->sme.assoc_req_ie_len += wpas_supp_op_class_ie( in sme_send_authentication()
543 wpa_s, ssid, bss->freq, in sme_send_authentication()
544 wpa_s->sme.assoc_req_ie + wpa_s->sme.assoc_req_ie_len, in sme_send_authentication()
545 sizeof(wpa_s->sme.assoc_req_ie) - wpa_s->sme.assoc_req_ie_len); in sme_send_authentication()
548 wpa_drv_get_ext_capa(wpa_s, WPA_IF_P2P_CLIENT); in sme_send_authentication()
550 wpa_drv_get_ext_capa(wpa_s, WPA_IF_STATION); in sme_send_authentication()
552 ext_capab_len = wpas_build_ext_capab(wpa_s, ext_capab, in sme_send_authentication()
555 u8 *pos = wpa_s->sme.assoc_req_ie; in sme_send_authentication()
556 if (wpa_s->sme.assoc_req_ie_len > 0 && pos[0] == WLAN_EID_RSN) in sme_send_authentication()
559 wpa_s->sme.assoc_req_ie_len - in sme_send_authentication()
560 (pos - wpa_s->sme.assoc_req_ie)); in sme_send_authentication()
561 wpa_s->sme.assoc_req_ie_len += ext_capab_len; in sme_send_authentication()
566 if (is_hs20_network(wpa_s, ssid, bss)) { in sme_send_authentication()
571 int pps_mo_id = hs20_get_pps_mo_id(wpa_s, ssid); in sme_send_authentication()
577 len = sizeof(wpa_s->sme.assoc_req_ie) - in sme_send_authentication()
578 wpa_s->sme.assoc_req_ie_len; in sme_send_authentication()
580 os_memcpy(wpa_s->sme.assoc_req_ie + in sme_send_authentication()
581 wpa_s->sme.assoc_req_ie_len, in sme_send_authentication()
583 wpa_s->sme.assoc_req_ie_len += wpabuf_len(hs20); in sme_send_authentication()
593 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Reinsert WPA IE"); in sme_send_authentication()
595 len = sizeof(wpa_s->sme.assoc_req_ie) - in sme_send_authentication()
596 wpa_s->sme.assoc_req_ie_len; in sme_send_authentication()
599 os_memcpy(wpa_s->sme.assoc_req_ie + in sme_send_authentication()
600 wpa_s->sme.assoc_req_ie_len, in sme_send_authentication()
602 wpa_s->sme.assoc_req_ie_len += wpa_ie_len; in sme_send_authentication()
604 wpa_dbg(wpa_s, MSG_DEBUG, "WPA: Failed to add WPA IE"); in sme_send_authentication()
610 if (wpa_s->vendor_elem[VENDOR_ELEM_ASSOC_REQ]) { in sme_send_authentication()
611 struct wpabuf *buf = wpa_s->vendor_elem[VENDOR_ELEM_ASSOC_REQ]; in sme_send_authentication()
614 len = sizeof(wpa_s->sme.assoc_req_ie) - in sme_send_authentication()
615 wpa_s->sme.assoc_req_ie_len; in sme_send_authentication()
617 os_memcpy(wpa_s->sme.assoc_req_ie + in sme_send_authentication()
618 wpa_s->sme.assoc_req_ie_len, in sme_send_authentication()
620 wpa_s->sme.assoc_req_ie_len += wpabuf_len(buf); in sme_send_authentication()
629 len = wpas_mbo_ie(wpa_s, wpa_s->sme.assoc_req_ie + in sme_send_authentication()
630 wpa_s->sme.assoc_req_ie_len, in sme_send_authentication()
631 sizeof(wpa_s->sme.assoc_req_ie) - in sme_send_authentication()
632 wpa_s->sme.assoc_req_ie_len, in sme_send_authentication()
636 wpa_s->sme.assoc_req_ie_len += len; in sme_send_authentication()
642 pmksa_cache_set_current(wpa_s->wpa, NULL, bss->bssid, ssid, 0, in sme_send_authentication()
644 wpa_s->key_mgmt == WPA_KEY_MGMT_FT_SAE ? in sme_send_authentication()
647 wpa_dbg(wpa_s, MSG_DEBUG, in sme_send_authentication()
649 wpa_sm_set_pmk_from_pmksa(wpa_s->wpa); in sme_send_authentication()
651 wpa_s->sme.sae_pmksa_caching = 1; in sme_send_authentication()
656 resp = sme_auth_build_sae_commit(wpa_s, ssid, in sme_send_authentication()
660 resp = sme_auth_build_sae_confirm(wpa_s, 0); in sme_send_authentication()
662 wpas_connection_failed(wpa_s, bss->bssid); in sme_send_authentication()
667 wpa_s->sme.sae.state = start ? SAE_COMMITTED : SAE_CONFIRMED; in sme_send_authentication()
671 old_ssid = wpa_s->current_ssid; in sme_send_authentication()
672 wpa_s->current_ssid = ssid; in sme_send_authentication()
673 wpa_supplicant_rsn_supp_set_config(wpa_s, wpa_s->current_ssid); in sme_send_authentication()
674 wpa_supplicant_initiate_eapol(wpa_s); in sme_send_authentication()
716 if (wpa_s->last_con_fail_realm && in sme_send_authentication()
717 eapol_sm_get_erp_info(wpa_s->eapol, &ssid->eap, in sme_send_authentication()
721 realm && realm_len == wpa_s->last_con_fail_realm_len && in sme_send_authentication()
722 os_memcmp(realm, wpa_s->last_con_fail_realm, in sme_send_authentication()
729 if (pmksa_cache_set_current(wpa_s->wpa, NULL, bss->bssid, in sme_send_authentication()
735 resp = fils_build_auth(wpa_s->wpa, ssid->fils_dh_group, md); in sme_send_authentication()
751 wpa_s->sme.auth_alg = auth_alg; in sme_send_authentication()
757 wpa_supplicant_cancel_sched_scan(wpa_s); in sme_send_authentication()
758 wpa_supplicant_cancel_scan(wpa_s); in sme_send_authentication()
760 wpa_msg(wpa_s, MSG_INFO, "SME: Trying to authenticate with " MACSTR in sme_send_authentication()
764 eapol_sm_notify_portValid(wpa_s->eapol, FALSE); in sme_send_authentication()
765 wpa_clear_keys(wpa_s, bss->bssid); in sme_send_authentication()
766 wpa_supplicant_set_state(wpa_s, WPA_AUTHENTICATING); in sme_send_authentication()
767 if (old_ssid != wpa_s->current_ssid) in sme_send_authentication()
768 wpas_notify_network_changed(wpa_s); in sme_send_authentication()
771 hs20_configure_frame_filters(wpa_s); in sme_send_authentication()
780 if (wpa_s->num_multichan_concurrent < 2) { in sme_send_authentication()
782 num = get_shared_radio_freqs(wpa_s, &freq, 1); in sme_send_authentication()
787 if (wpas_p2p_handle_frequency_conflicts(wpa_s, in sme_send_authentication()
790 wpas_connection_failed(wpa_s, bss->bssid); in sme_send_authentication()
791 wpa_supplicant_mark_disassoc(wpa_s); in sme_send_authentication()
793 wpas_connect_work_done(wpa_s); in sme_send_authentication()
801 wpa_msg(wpa_s, MSG_DEBUG, in sme_send_authentication()
804 sme_associate(wpa_s, ssid->mode, bss->bssid, WLAN_AUTH_OPEN); in sme_send_authentication()
809 wpa_s->sme.auth_alg = params.auth_alg; in sme_send_authentication()
810 if (wpa_drv_authenticate(wpa_s, ¶ms) < 0) { in sme_send_authentication()
811 wpa_msg(wpa_s, MSG_INFO, "SME: Authentication request to the " in sme_send_authentication()
813 wpas_connection_failed(wpa_s, bss->bssid); in sme_send_authentication()
814 wpa_supplicant_mark_disassoc(wpa_s); in sme_send_authentication()
816 wpas_connect_work_done(wpa_s); in sme_send_authentication()
820 eloop_register_timeout(SME_AUTH_TIMEOUT, 0, sme_auth_timer, wpa_s, in sme_send_authentication()
835 struct wpa_supplicant *wpa_s = work->wpa_s; in sme_auth_start_cb() local
839 wpa_s->connect_work = NULL; in sme_auth_start_cb()
845 wpa_s->connect_work = work; in sme_auth_start_cb()
848 !wpas_valid_bss_ssid(wpa_s, cwork->bss, cwork->ssid) || in sme_auth_start_cb()
849 wpas_network_disabled(wpa_s, cwork->ssid)) { in sme_auth_start_cb()
850 …wpa_dbg(wpa_s, MSG_DEBUG, "SME: BSS/SSID entry for authentication not valid anymore - drop connect… in sme_auth_start_cb()
851 wpas_connect_work_done(wpa_s); in sme_auth_start_cb()
857 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0); in sme_auth_start_cb()
859 sme_send_authentication(wpa_s, cwork->bss, cwork->ssid, 1); in sme_auth_start_cb()
863 void sme_authenticate(struct wpa_supplicant *wpa_s, in sme_authenticate() argument
870 if (wpa_s->connect_work) { in sme_authenticate()
871 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Reject sme_authenticate() call since connect_work exist"); in sme_authenticate()
875 if (radio_work_pending(wpa_s, "sme-connect")) { in sme_authenticate()
881 wpa_dbg(wpa_s, MSG_DEBUG, in sme_authenticate()
883 radio_remove_works(wpa_s, "sme-connect", 0); in sme_authenticate()
886 wpas_abort_ongoing_scan(wpa_s); in sme_authenticate()
896 wpa_s->sme.sae.state = SAE_NOTHING; in sme_authenticate()
897 wpa_s->sme.sae.send_confirm = 0; in sme_authenticate()
898 wpa_s->sme.sae_group_index = 0; in sme_authenticate()
901 if (radio_add_work(wpa_s, bss->freq, "sme-connect", 1, in sme_authenticate()
935 static void sme_external_auth_send_sae_commit(struct wpa_supplicant *wpa_s, in sme_external_auth_send_sae_commit() argument
941 resp = sme_auth_build_sae_commit(wpa_s, ssid, bssid, 1, 0); in sme_external_auth_send_sae_commit()
945 wpa_s->sme.sae.state = SAE_COMMITTED; in sme_external_auth_send_sae_commit()
952 wpa_s->sme.seq_num++; in sme_external_auth_send_sae_commit()
953 sme_external_auth_build_buf(buf, resp, wpa_s->own_addr, in sme_external_auth_send_sae_commit()
954 bssid, 1, wpa_s->sme.seq_num); in sme_external_auth_send_sae_commit()
955 wpa_drv_send_mlme(wpa_s, wpabuf_head(buf), wpabuf_len(buf), 1, 0); in sme_external_auth_send_sae_commit()
961 static void sme_send_external_auth_status(struct wpa_supplicant *wpa_s, in sme_send_external_auth_status() argument
968 params.ssid = wpa_s->sme.ext_auth_ssid; in sme_send_external_auth_status()
969 params.ssid_len = wpa_s->sme.ext_auth_ssid_len; in sme_send_external_auth_status()
970 params.bssid = wpa_s->sme.ext_auth_bssid; in sme_send_external_auth_status()
971 wpa_drv_send_external_auth_status(wpa_s, ¶ms); in sme_send_external_auth_status()
975 static void sme_handle_external_auth_start(struct wpa_supplicant *wpa_s, in sme_handle_external_auth_start() argument
983 for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) { in sme_handle_external_auth_start()
984 if (!wpas_network_disabled(wpa_s, ssid) && in sme_handle_external_auth_start()
991 sme_external_auth_send_sae_commit(wpa_s, in sme_handle_external_auth_start()
995 sme_send_external_auth_status(wpa_s, in sme_handle_external_auth_start()
1000 static void sme_external_auth_send_sae_confirm(struct wpa_supplicant *wpa_s, in sme_external_auth_send_sae_confirm() argument
1005 resp = sme_auth_build_sae_confirm(wpa_s, 1); in sme_external_auth_send_sae_confirm()
1011 wpa_s->sme.sae.state = SAE_CONFIRMED; in sme_external_auth_send_sae_confirm()
1018 wpa_s->sme.seq_num++; in sme_external_auth_send_sae_confirm()
1019 sme_external_auth_build_buf(buf, resp, wpa_s->own_addr, in sme_external_auth_send_sae_confirm()
1020 da, 2, wpa_s->sme.seq_num); in sme_external_auth_send_sae_confirm()
1021 wpa_drv_send_mlme(wpa_s, wpabuf_head(buf), wpabuf_len(buf), 1, 0); in sme_external_auth_send_sae_confirm()
1027 void sme_external_auth_trigger(struct wpa_supplicant *wpa_s, in sme_external_auth_trigger() argument
1037 os_memcpy(wpa_s->sme.ext_auth_bssid, data->external_auth.bssid, in sme_external_auth_trigger()
1039 os_memcpy(wpa_s->sme.ext_auth_ssid, data->external_auth.ssid, in sme_external_auth_trigger()
1041 wpa_s->sme.ext_auth_ssid_len = data->external_auth.ssid_len; in sme_external_auth_trigger()
1042 wpa_s->sme.seq_num = 0; in sme_external_auth_trigger()
1043 wpa_s->sme.sae.state = SAE_NOTHING; in sme_external_auth_trigger()
1044 wpa_s->sme.sae.send_confirm = 0; in sme_external_auth_trigger()
1045 wpa_s->sme.sae_group_index = 0; in sme_external_auth_trigger()
1046 sme_handle_external_auth_start(wpa_s, data); in sme_external_auth_trigger()
1049 sme_send_external_auth_status(wpa_s, in sme_external_auth_trigger()
1055 static int sme_sae_auth(struct wpa_supplicant *wpa_s, u16 auth_transaction, in sme_sae_auth() argument
1061 wpa_dbg(wpa_s, MSG_DEBUG, "SME: SAE authentication transaction %u " in sme_sae_auth()
1066 wpa_s->sme.sae.state == SAE_COMMITTED && in sme_sae_auth()
1067 (external || wpa_s->current_bss) && wpa_s->current_ssid) { in sme_sae_auth()
1071 groups = wpa_s->conf->sae_groups; in sme_sae_auth()
1076 wpa_dbg(wpa_s, MSG_DEBUG, in sme_sae_auth()
1081 wpa_dbg(wpa_s, MSG_DEBUG, in sme_sae_auth()
1084 if (sae_group_allowed(&wpa_s->sme.sae, groups, group) != in sme_sae_auth()
1086 wpa_dbg(wpa_s, MSG_ERROR, in sme_sae_auth()
1091 wpabuf_free(wpa_s->sme.sae_token); in sme_sae_auth()
1092 wpa_s->sme.sae_token = wpabuf_alloc_copy(data + sizeof(le16), in sme_sae_auth()
1095 sme_send_authentication(wpa_s, wpa_s->current_bss, in sme_sae_auth()
1096 wpa_s->current_ssid, 2); in sme_sae_auth()
1099 wpa_s, wpa_s->sme.ext_auth_bssid, in sme_sae_auth()
1100 wpa_s->current_ssid); in sme_sae_auth()
1106 wpa_s->sme.sae.state == SAE_COMMITTED && in sme_sae_auth()
1107 (external || wpa_s->current_bss) && wpa_s->current_ssid) { in sme_sae_auth()
1108 wpa_dbg(wpa_s, MSG_DEBUG, "SME: SAE group not supported"); in sme_sae_auth()
1109 wpa_s->sme.sae_group_index++; in sme_sae_auth()
1110 if (sme_set_sae_group(wpa_s) < 0) in sme_sae_auth()
1112 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Try next enabled SAE group"); in sme_sae_auth()
1114 sme_send_authentication(wpa_s, wpa_s->current_bss, in sme_sae_auth()
1115 wpa_s->current_ssid, 1); in sme_sae_auth()
1118 wpa_s, wpa_s->sme.ext_auth_bssid, in sme_sae_auth()
1119 wpa_s->current_ssid); in sme_sae_auth()
1125 const u8 *bssid = sa ? sa : wpa_s->pending_bssid; in sme_sae_auth()
1127 wpa_msg(wpa_s, MSG_INFO, in sme_sae_auth()
1139 groups = wpa_s->conf->sae_groups; in sme_sae_auth()
1141 wpa_dbg(wpa_s, MSG_DEBUG, "SME SAE commit"); in sme_sae_auth()
1142 if ((!external && wpa_s->current_bss == NULL) || in sme_sae_auth()
1143 wpa_s->current_ssid == NULL) in sme_sae_auth()
1145 if (wpa_s->sme.sae.state != SAE_COMMITTED) in sme_sae_auth()
1149 res = sae_parse_commit(&wpa_s->sme.sae, data, len, NULL, NULL, in sme_sae_auth()
1159 if (sae_process_commit(&wpa_s->sme.sae) < 0) { in sme_sae_auth()
1165 wpabuf_free(wpa_s->sme.sae_token); in sme_sae_auth()
1166 wpa_s->sme.sae_token = NULL; in sme_sae_auth()
1168 sme_send_authentication(wpa_s, wpa_s->current_bss, in sme_sae_auth()
1169 wpa_s->current_ssid, 0); in sme_sae_auth()
1171 sme_external_auth_send_sae_confirm(wpa_s, sa); in sme_sae_auth()
1174 wpa_dbg(wpa_s, MSG_DEBUG, "SME SAE confirm"); in sme_sae_auth()
1175 if (wpa_s->sme.sae.state != SAE_CONFIRMED) in sme_sae_auth()
1177 if (sae_check_confirm(&wpa_s->sme.sae, data, len) < 0) in sme_sae_auth()
1179 wpa_s->sme.sae.state = SAE_ACCEPTED; in sme_sae_auth()
1180 sae_clear_temp_data(&wpa_s->sme.sae); in sme_sae_auth()
1184 sme_send_external_auth_status(wpa_s, in sme_sae_auth()
1195 void sme_external_auth_mgmt_rx(struct wpa_supplicant *wpa_s, in sme_external_auth_mgmt_rx() argument
1206 sme_send_external_auth_status(wpa_s, in sme_external_auth_mgmt_rx()
1215 wpa_s, le_to_host16(header->u.auth.auth_transaction), in sme_external_auth_mgmt_rx()
1222 wpa_s, WLAN_STATUS_UNSPECIFIED_FAILURE); in sme_external_auth_mgmt_rx()
1230 wpa_sm_set_pmk(wpa_s->wpa, wpa_s->sme.sae.pmk, PMK_LEN, in sme_external_auth_mgmt_rx()
1231 wpa_s->sme.sae.pmkid, wpa_s->pending_bssid); in sme_external_auth_mgmt_rx()
1238 void sme_event_auth(struct wpa_supplicant *wpa_s, union wpa_event_data *data) in sme_event_auth() argument
1240 struct wpa_ssid *ssid = wpa_s->current_ssid; in sme_event_auth()
1243 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Ignore authentication event " in sme_event_auth()
1248 if (wpa_s->wpa_state != WPA_AUTHENTICATING) { in sme_event_auth()
1249 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Ignore authentication event " in sme_event_auth()
1254 if (os_memcmp(wpa_s->pending_bssid, data->auth.peer, ETH_ALEN) != 0) { in sme_event_auth()
1255 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Ignore authentication with " in sme_event_auth()
1261 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Authentication response: peer=" MACSTR in sme_event_auth()
1268 eloop_cancel_timeout(sme_auth_timer, wpa_s, NULL); in sme_event_auth()
1273 res = sme_sae_auth(wpa_s, data->auth.auth_transaction, in sme_event_auth()
1277 wpas_connection_failed(wpa_s, wpa_s->pending_bssid); in sme_event_auth()
1278 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED); in sme_event_auth()
1286 wpa_sm_set_pmk(wpa_s->wpa, wpa_s->sme.sae.pmk, PMK_LEN, in sme_event_auth()
1287 wpa_s->sme.sae.pmkid, wpa_s->pending_bssid); in sme_event_auth()
1302 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_AUTH_REJECT MACSTR in sme_event_auth()
1311 if (wpa_s->sme.auth_alg == WPA_AUTH_ALG_FILS || in sme_event_auth()
1312 wpa_s->sme.auth_alg == WPA_AUTH_ALG_FILS_SK_PFS) in sme_event_auth()
1313 fils_connection_failure(wpa_s); in sme_event_auth()
1318 wpa_s->sme.auth_alg == data->auth.auth_type || in sme_event_auth()
1319 wpa_s->current_ssid->auth_alg == WPA_AUTH_ALG_LEAP) { in sme_event_auth()
1320 wpas_connection_failed(wpa_s, wpa_s->pending_bssid); in sme_event_auth()
1321 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED); in sme_event_auth()
1325 wpas_connect_work_done(wpa_s); in sme_event_auth()
1329 wpa_s->current_ssid->auth_alg = WPA_AUTH_ALG_SHARED; in sme_event_auth()
1331 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Trying SHARED auth"); in sme_event_auth()
1332 wpa_supplicant_associate(wpa_s, wpa_s->current_bss, in sme_event_auth()
1333 wpa_s->current_ssid); in sme_event_auth()
1337 wpa_s->current_ssid->auth_alg = WPA_AUTH_ALG_LEAP; in sme_event_auth()
1339 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Trying LEAP auth"); in sme_event_auth()
1340 wpa_supplicant_associate(wpa_s, wpa_s->current_bss, in sme_event_auth()
1341 wpa_s->current_ssid); in sme_event_auth()
1354 if (wpa_s->ric_ies) { in sme_event_auth()
1355 ric_ies = wpabuf_head(wpa_s->ric_ies); in sme_event_auth()
1356 ric_ies_len = wpabuf_len(wpa_s->ric_ies); in sme_event_auth()
1358 if (wpa_ft_process_response(wpa_s->wpa, data->auth.ies, in sme_event_auth()
1362 wpa_dbg(wpa_s, MSG_DEBUG, in sme_event_auth()
1364 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_DISCONNECTED "bssid=" in sme_event_auth()
1367 MAC2STR(wpa_s->pending_bssid), in sme_event_auth()
1369 wpas_connection_failed(wpa_s, wpa_s->pending_bssid); in sme_event_auth()
1370 wpa_supplicant_mark_disassoc(wpa_s); in sme_event_auth()
1381 expect_auth_type = wpa_s->sme.auth_alg == in sme_event_auth()
1385 wpa_dbg(wpa_s, MSG_DEBUG, in sme_event_auth()
1388 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_DISCONNECTED "bssid=" in sme_event_auth()
1391 MAC2STR(wpa_s->pending_bssid), in sme_event_auth()
1393 wpas_connection_failed(wpa_s, wpa_s->pending_bssid); in sme_event_auth()
1394 wpa_supplicant_mark_disassoc(wpa_s); in sme_event_auth()
1398 if (fils_process_auth(wpa_s->wpa, wpa_s->pending_bssid, in sme_event_auth()
1400 wpa_dbg(wpa_s, MSG_DEBUG, in sme_event_auth()
1402 wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_DISCONNECTED "bssid=" in sme_event_auth()
1405 MAC2STR(wpa_s->pending_bssid), in sme_event_auth()
1407 wpas_connection_failed(wpa_s, wpa_s->pending_bssid); in sme_event_auth()
1408 wpa_supplicant_mark_disassoc(wpa_s); in sme_event_auth()
1414 sme_associate(wpa_s, ssid->mode, data->auth.peer, in sme_event_auth()
1435 void sme_associate(struct wpa_supplicant *wpa_s, enum wpas_mode mode, in sme_associate() argument
1464 dl_list_for_each(req, &wpa_s->fils_hlp_req, struct fils_hlp_req, in sme_associate()
1471 wpabuf_put_data(hlp[num_hlp], wpa_s->own_addr, in sme_associate()
1481 buf = fils_build_assoc_req(wpa_s->wpa, ¶ms.fils_kek, in sme_associate()
1491 wpa_s->sme.assoc_req_ie, in sme_associate()
1492 wpa_s->sme.assoc_req_ie_len); in sme_associate()
1494 if (wpa_key_mgmt_ft(wpa_s->key_mgmt)) { in sme_associate()
1498 remove_ie(wpa_s->sme.assoc_req_ie, in sme_associate()
1499 &wpa_s->sme.assoc_req_ie_len, in sme_associate()
1503 wpa_s->sme.assoc_req_ie, in sme_associate()
1504 wpa_s->sme.assoc_req_ie_len); in sme_associate()
1505 remove_ie(wpa_s->sme.assoc_req_ie, in sme_associate()
1506 &wpa_s->sme.assoc_req_ie_len, in sme_associate()
1510 wpa_s->sme.assoc_req_ie, in sme_associate()
1511 wpa_s->sme.assoc_req_ie_len); in sme_associate()
1515 if (wpa_s->sme.assoc_req_ie_len + wpabuf_len(buf) > in sme_associate()
1516 sizeof(wpa_s->sme.assoc_req_ie)) { in sme_associate()
1522 os_memcpy(wpa_s->sme.assoc_req_ie + wpa_s->sme.assoc_req_ie_len, in sme_associate()
1524 wpa_s->sme.assoc_req_ie_len += wpabuf_len(buf); in sme_associate()
1527 wpa_s->sme.assoc_req_ie, in sme_associate()
1528 wpa_s->sme.assoc_req_ie_len); in sme_associate()
1539 if (get_ie_ext(wpa_s->sme.assoc_req_ie, wpa_s->sme.assoc_req_ie_len, in sme_associate()
1545 wpa_s->key_mgmt == WPA_KEY_MGMT_OWE) { in sme_associate()
1549 if (wpa_s->current_ssid && wpa_s->current_ssid->owe_group) { in sme_associate()
1550 group = wpa_s->current_ssid->owe_group; in sme_associate()
1551 } else if (wpa_s->assoc_status_code == in sme_associate()
1553 if (wpa_s->last_owe_group == 19) in sme_associate()
1555 else if (wpa_s->last_owe_group == 20) in sme_associate()
1563 wpa_s->last_owe_group = group; in sme_associate()
1565 owe_ie = owe_build_assoc_req(wpa_s->wpa, group); in sme_associate()
1571 if (wpa_s->sme.assoc_req_ie_len + wpabuf_len(owe_ie) > in sme_associate()
1572 sizeof(wpa_s->sme.assoc_req_ie)) { in sme_associate()
1578 os_memcpy(wpa_s->sme.assoc_req_ie + wpa_s->sme.assoc_req_ie_len, in sme_associate()
1580 wpa_s->sme.assoc_req_ie_len += wpabuf_len(owe_ie); in sme_associate()
1586 if (wpa_s->key_mgmt == WPA_KEY_MGMT_DPP && wpa_s->current_ssid && in sme_associate()
1587 wpa_s->current_ssid->dpp_netaccesskey) { in sme_associate()
1588 struct wpa_ssid *ssid = wpa_s->current_ssid; in sme_associate()
1590 dpp_pfs_free(wpa_s->dpp_pfs); in sme_associate()
1591 wpa_s->dpp_pfs = dpp_pfs_init(ssid->dpp_netaccesskey, in sme_associate()
1593 if (!wpa_s->dpp_pfs) { in sme_associate()
1598 if (wpa_s->sme.assoc_req_ie_len + in sme_associate()
1599 wpabuf_len(wpa_s->dpp_pfs->ie) > in sme_associate()
1600 sizeof(wpa_s->sme.assoc_req_ie)) { in sme_associate()
1603 dpp_pfs_free(wpa_s->dpp_pfs); in sme_associate()
1604 wpa_s->dpp_pfs = NULL; in sme_associate()
1607 os_memcpy(wpa_s->sme.assoc_req_ie + wpa_s->sme.assoc_req_ie_len, in sme_associate()
1608 wpabuf_head(wpa_s->dpp_pfs->ie), in sme_associate()
1609 wpabuf_len(wpa_s->dpp_pfs->ie)); in sme_associate()
1610 wpa_s->sme.assoc_req_ie_len += wpabuf_len(wpa_s->dpp_pfs->ie); in sme_associate()
1615 if (wpa_s->current_ssid && wpa_s->current_ssid->multi_ap_backhaul_sta) { in sme_associate()
1619 wpa_s->sme.assoc_req_ie + wpa_s->sme.assoc_req_ie_len, in sme_associate()
1620 sizeof(wpa_s->sme.assoc_req_ie) - in sme_associate()
1621 wpa_s->sme.assoc_req_ie_len, in sme_associate()
1628 wpa_s->sme.assoc_req_ie_len += multi_ap_ie_len; in sme_associate()
1632 params.ssid = wpa_s->sme.ssid; in sme_associate()
1633 params.ssid_len = wpa_s->sme.ssid_len; in sme_associate()
1634 params.freq.freq = wpa_s->sme.freq; in sme_associate()
1635 params.bg_scan_period = wpa_s->current_ssid ? in sme_associate()
1636 wpa_s->current_ssid->bg_scan_period : -1; in sme_associate()
1637 params.wpa_ie = wpa_s->sme.assoc_req_ie_len ? in sme_associate()
1638 wpa_s->sme.assoc_req_ie : NULL; in sme_associate()
1639 params.wpa_ie_len = wpa_s->sme.assoc_req_ie_len; in sme_associate()
1642 params.pairwise_suite = wpa_s->pairwise_cipher; in sme_associate()
1643 params.group_suite = wpa_s->group_cipher; in sme_associate()
1644 params.mgmt_group_suite = wpa_s->mgmt_group_cipher; in sme_associate()
1645 params.key_mgmt_suite = wpa_s->key_mgmt; in sme_associate()
1646 params.wpa_proto = wpa_s->wpa_proto; in sme_associate()
1652 wpa_supplicant_apply_ht_overrides(wpa_s, wpa_s->current_ssid, ¶ms); in sme_associate()
1659 wpa_supplicant_apply_vht_overrides(wpa_s, wpa_s->current_ssid, ¶ms); in sme_associate()
1662 if (auth_type == WLAN_AUTH_FT && wpa_s->sme.ft_ies && in sme_associate()
1663 get_ie(wpa_s->sme.ft_ies, wpa_s->sme.ft_ies_len, in sme_associate()
1673 params.wpa_ie = wpa_s->sme.ft_ies; in sme_associate()
1674 params.wpa_ie_len = wpa_s->sme.ft_ies_len; in sme_associate()
1675 } else if (auth_type == WLAN_AUTH_FT && wpa_s->sme.ft_ies) { in sme_associate()
1682 remove_ie(wpa_s->sme.assoc_req_ie, in sme_associate()
1683 &wpa_s->sme.assoc_req_ie_len, in sme_associate()
1685 remove_ie(wpa_s->sme.assoc_req_ie, in sme_associate()
1686 &wpa_s->sme.assoc_req_ie_len, in sme_associate()
1688 remove_ie(wpa_s->sme.assoc_req_ie, in sme_associate()
1689 &wpa_s->sme.assoc_req_ie_len, in sme_associate()
1691 rm_en = get_ie(wpa_s->sme.assoc_req_ie, in sme_associate()
1692 wpa_s->sme.assoc_req_ie_len, in sme_associate()
1700 remove_ie(wpa_s->sme.assoc_req_ie, in sme_associate()
1701 &wpa_s->sme.assoc_req_ie_len, in sme_associate()
1706 wpa_s->sme.assoc_req_ie, in sme_associate()
1707 wpa_s->sme.assoc_req_ie_len); in sme_associate()
1708 if (wpa_s->sme.assoc_req_ie_len + wpa_s->sme.ft_ies_len + in sme_associate()
1709 rm_en_len > sizeof(wpa_s->sme.assoc_req_ie)) { in sme_associate()
1716 os_memmove(wpa_s->sme.assoc_req_ie + wpa_s->sme.ft_ies_len + in sme_associate()
1718 wpa_s->sme.assoc_req_ie, in sme_associate()
1719 wpa_s->sme.assoc_req_ie_len); in sme_associate()
1720 pos = wpa_s->sme.ft_ies; in sme_associate()
1721 end = pos + wpa_s->sme.ft_ies_len; in sme_associate()
1722 wpos = wpa_s->sme.assoc_req_ie; in sme_associate()
1734 wpa_s->sme.assoc_req_ie_len += wpa_s->sme.ft_ies_len + in sme_associate()
1736 params.wpa_ie = wpa_s->sme.assoc_req_ie; in sme_associate()
1737 params.wpa_ie_len = wpa_s->sme.assoc_req_ie_len; in sme_associate()
1744 params.mgmt_frame_protection = wpa_s->sme.mfp; in sme_associate()
1745 params.rrm_used = wpa_s->rrm.rrm_used; in sme_associate()
1746 if (wpa_s->sme.prev_bssid_set) in sme_associate()
1747 params.prev_bssid = wpa_s->sme.prev_bssid; in sme_associate()
1749 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with " MACSTR in sme_associate()
1754 wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING); in sme_associate()
1759 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Could not parse own IEs?!"); in sme_associate()
1764 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, elems.rsn_ie - 2, in sme_associate()
1768 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, elems.wpa_ie - 2, in sme_associate()
1772 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, elems.osen - 2, in sme_associate()
1775 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0); in sme_associate()
1776 if (wpa_s->current_ssid && wpa_s->current_ssid->p2p_group) in sme_associate()
1779 if (wpa_s->p2pdev->set_sta_uapsd) in sme_associate()
1780 params.uapsd = wpa_s->p2pdev->sta_uapsd; in sme_associate()
1784 if (wpa_drv_associate(wpa_s, ¶ms) < 0) { in sme_associate()
1785 wpa_msg(wpa_s, MSG_INFO, "SME: Association request to the " in sme_associate()
1787 wpas_connection_failed(wpa_s, wpa_s->pending_bssid); in sme_associate()
1788 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED); in sme_associate()
1789 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN); in sme_associate()
1793 eloop_register_timeout(SME_ASSOC_TIMEOUT, 0, sme_assoc_timer, wpa_s, in sme_associate()
1797 wpabuf_free(wpa_s->last_assoc_req_wpa_ie); in sme_associate()
1798 wpa_s->last_assoc_req_wpa_ie = NULL; in sme_associate()
1800 wpa_s->last_assoc_req_wpa_ie = in sme_associate()
1806 int sme_update_ft_ies(struct wpa_supplicant *wpa_s, const u8 *md, in sme_update_ft_ies() argument
1810 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Remove mobility domain"); in sme_update_ft_ies()
1811 os_free(wpa_s->sme.ft_ies); in sme_update_ft_ies()
1812 wpa_s->sme.ft_ies = NULL; in sme_update_ft_ies()
1813 wpa_s->sme.ft_ies_len = 0; in sme_update_ft_ies()
1814 wpa_s->sme.ft_used = 0; in sme_update_ft_ies()
1818 os_memcpy(wpa_s->sme.mobility_domain, md, MOBILITY_DOMAIN_ID_LEN); in sme_update_ft_ies()
1820 os_free(wpa_s->sme.ft_ies); in sme_update_ft_ies()
1821 wpa_s->sme.ft_ies = os_memdup(ies, ies_len); in sme_update_ft_ies()
1822 if (wpa_s->sme.ft_ies == NULL) in sme_update_ft_ies()
1824 wpa_s->sme.ft_ies_len = ies_len; in sme_update_ft_ies()
1829 static void sme_deauth(struct wpa_supplicant *wpa_s) in sme_deauth() argument
1833 bssid_changed = !is_zero_ether_addr(wpa_s->bssid); in sme_deauth()
1835 if (wpa_drv_deauthenticate(wpa_s, wpa_s->pending_bssid, in sme_deauth()
1837 wpa_msg(wpa_s, MSG_INFO, "SME: Deauth request to the driver " in sme_deauth()
1840 wpa_s->sme.prev_bssid_set = 0; in sme_deauth()
1842 wpas_connection_failed(wpa_s, wpa_s->pending_bssid); in sme_deauth()
1843 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED); in sme_deauth()
1844 os_memset(wpa_s->bssid, 0, ETH_ALEN); in sme_deauth()
1845 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN); in sme_deauth()
1847 wpas_notify_bssid_changed(wpa_s); in sme_deauth()
1851 void sme_event_assoc_reject(struct wpa_supplicant *wpa_s, in sme_event_assoc_reject() argument
1854 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Association with " MACSTR " failed: " in sme_event_assoc_reject()
1855 "status code %d", MAC2STR(wpa_s->pending_bssid), in sme_event_assoc_reject()
1858 eloop_cancel_timeout(sme_assoc_timer, wpa_s, NULL); in sme_event_assoc_reject()
1861 if (wpa_s->sme.sae_pmksa_caching && wpa_s->current_ssid && in sme_event_assoc_reject()
1862 wpa_key_mgmt_sae(wpa_s->current_ssid->key_mgmt)) { in sme_event_assoc_reject()
1863 wpa_dbg(wpa_s, MSG_DEBUG, in sme_event_assoc_reject()
1865 wpa_sm_aborted_cached(wpa_s->wpa); in sme_event_assoc_reject()
1866 wpa_sm_pmksa_cache_flush(wpa_s->wpa, wpa_s->current_ssid); in sme_event_assoc_reject()
1867 if (wpa_s->current_bss) { in sme_event_assoc_reject()
1868 struct wpa_bss *bss = wpa_s->current_bss; in sme_event_assoc_reject()
1869 struct wpa_ssid *ssid = wpa_s->current_ssid; in sme_event_assoc_reject()
1871 wpa_drv_deauthenticate(wpa_s, wpa_s->pending_bssid, in sme_event_assoc_reject()
1873 wpas_connect_work_done(wpa_s); in sme_event_assoc_reject()
1874 wpa_supplicant_mark_disassoc(wpa_s); in sme_event_assoc_reject()
1875 wpa_supplicant_connect(wpa_s, bss, ssid); in sme_event_assoc_reject()
1888 sme_deauth(wpa_s); in sme_event_assoc_reject()
1892 void sme_event_auth_timed_out(struct wpa_supplicant *wpa_s, in sme_event_auth_timed_out() argument
1895 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Authentication timed out"); in sme_event_auth_timed_out()
1896 wpas_connection_failed(wpa_s, wpa_s->pending_bssid); in sme_event_auth_timed_out()
1897 wpa_supplicant_mark_disassoc(wpa_s); in sme_event_auth_timed_out()
1901 void sme_event_assoc_timed_out(struct wpa_supplicant *wpa_s, in sme_event_assoc_timed_out() argument
1904 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Association timed out"); in sme_event_assoc_timed_out()
1905 wpas_connection_failed(wpa_s, wpa_s->pending_bssid); in sme_event_assoc_timed_out()
1906 wpa_supplicant_mark_disassoc(wpa_s); in sme_event_assoc_timed_out()
1910 void sme_event_disassoc(struct wpa_supplicant *wpa_s, in sme_event_disassoc() argument
1913 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Disassociation event received"); in sme_event_disassoc()
1914 if (wpa_s->sme.prev_bssid_set) { in sme_event_disassoc()
1921 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Deauthenticate to clear " in sme_event_disassoc()
1923 wpa_drv_deauthenticate(wpa_s, wpa_s->sme.prev_bssid, in sme_event_disassoc()
1931 struct wpa_supplicant *wpa_s = eloop_ctx; in sme_auth_timer() local
1932 if (wpa_s->wpa_state == WPA_AUTHENTICATING) { in sme_auth_timer()
1933 wpa_msg(wpa_s, MSG_DEBUG, "SME: Authentication timeout"); in sme_auth_timer()
1934 sme_deauth(wpa_s); in sme_auth_timer()
1941 struct wpa_supplicant *wpa_s = eloop_ctx; in sme_assoc_timer() local
1942 if (wpa_s->wpa_state == WPA_ASSOCIATING) { in sme_assoc_timer()
1943 wpa_msg(wpa_s, MSG_DEBUG, "SME: Association timeout"); in sme_assoc_timer()
1944 sme_deauth(wpa_s); in sme_assoc_timer()
1949 void sme_state_changed(struct wpa_supplicant *wpa_s) in sme_state_changed() argument
1952 if (wpa_s->wpa_state != WPA_ASSOCIATING) in sme_state_changed()
1953 eloop_cancel_timeout(sme_assoc_timer, wpa_s, NULL); in sme_state_changed()
1954 if (wpa_s->wpa_state != WPA_AUTHENTICATING) in sme_state_changed()
1955 eloop_cancel_timeout(sme_auth_timer, wpa_s, NULL); in sme_state_changed()
1959 void sme_disassoc_while_authenticating(struct wpa_supplicant *wpa_s, in sme_disassoc_while_authenticating() argument
1967 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Allow pending authentication " in sme_disassoc_while_authenticating()
1969 wpa_supplicant_set_state(wpa_s, WPA_AUTHENTICATING); in sme_disassoc_while_authenticating()
1970 os_memcpy(wpa_s->pending_bssid, prev_pending_bssid, ETH_ALEN); in sme_disassoc_while_authenticating()
1975 eloop_cancel_timeout(sme_auth_timer, wpa_s, NULL); in sme_disassoc_while_authenticating()
1976 eloop_register_timeout(SME_AUTH_TIMEOUT, 0, sme_auth_timer, wpa_s, in sme_disassoc_while_authenticating()
1981 void sme_clear_on_disassoc(struct wpa_supplicant *wpa_s) in sme_clear_on_disassoc() argument
1983 wpa_s->sme.prev_bssid_set = 0; in sme_clear_on_disassoc()
1985 wpabuf_free(wpa_s->sme.sae_token); in sme_clear_on_disassoc()
1986 wpa_s->sme.sae_token = NULL; in sme_clear_on_disassoc()
1987 sae_clear_data(&wpa_s->sme.sae); in sme_clear_on_disassoc()
1990 if (wpa_s->sme.ft_ies || wpa_s->sme.ft_used) in sme_clear_on_disassoc()
1991 sme_update_ft_ies(wpa_s, NULL, NULL, 0); in sme_clear_on_disassoc()
1994 sme_stop_sa_query(wpa_s); in sme_clear_on_disassoc()
1999 void sme_deinit(struct wpa_supplicant *wpa_s) in sme_deinit() argument
2001 sme_clear_on_disassoc(wpa_s); in sme_deinit()
2003 eloop_cancel_timeout(sme_assoc_timer, wpa_s, NULL); in sme_deinit()
2004 eloop_cancel_timeout(sme_auth_timer, wpa_s, NULL); in sme_deinit()
2005 eloop_cancel_timeout(sme_obss_scan_timeout, wpa_s, NULL); in sme_deinit()
2009 static void sme_send_2040_bss_coex(struct wpa_supplicant *wpa_s, in sme_send_2040_bss_coex() argument
2019 MAC2STR(wpa_s->bssid), num_channels, num_intol); in sme_send_2040_bss_coex()
2048 if (wpa_drv_send_action(wpa_s, wpa_s->assoc_freq, 0, wpa_s->bssid, in sme_send_2040_bss_coex()
2049 wpa_s->own_addr, wpa_s->bssid, in sme_send_2040_bss_coex()
2051 wpa_msg(wpa_s, MSG_INFO, in sme_send_2040_bss_coex()
2059 int sme_proc_obss_scan(struct wpa_supplicant *wpa_s) in sme_proc_obss_scan() argument
2067 if (!wpa_s->sme.sched_obss_scan) in sme_proc_obss_scan()
2070 wpa_s->sme.sched_obss_scan = 0; in sme_proc_obss_scan()
2071 if (!wpa_s->current_bss || wpa_s->wpa_state != WPA_COMPLETED) in sme_proc_obss_scan()
2087 ie = wpa_bss_get_ie(wpa_s->current_bss, WLAN_EID_COUNTRY); in sme_proc_obss_scan()
2093 dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) { in sme_proc_obss_scan()
2123 sme_send_2040_bss_coex(wpa_s, chan_list, num_channels, num_intol); in sme_proc_obss_scan()
2128 static void wpa_obss_scan_freqs_list(struct wpa_supplicant *wpa_s, in wpa_obss_scan_freqs_list() argument
2136 mode = get_mode(wpa_s->hw.modes, wpa_s->hw.num_modes, in wpa_obss_scan_freqs_list()
2144 if (wpa_s->sme.ht_sec_chan == HT_SEC_CHAN_UNKNOWN && in wpa_obss_scan_freqs_list()
2145 wpa_s->current_bss) { in wpa_obss_scan_freqs_list()
2148 ie = wpa_bss_get_ie(wpa_s->current_bss, WLAN_EID_HT_OPERATION); in wpa_obss_scan_freqs_list()
2154 wpa_s->sme.ht_sec_chan = HT_SEC_CHAN_ABOVE; in wpa_obss_scan_freqs_list()
2156 wpa_s->sme.ht_sec_chan = HT_SEC_CHAN_BELOW; in wpa_obss_scan_freqs_list()
2160 start = wpa_s->assoc_freq - 10; in wpa_obss_scan_freqs_list()
2161 end = wpa_s->assoc_freq + 10; in wpa_obss_scan_freqs_list()
2162 switch (wpa_s->sme.ht_sec_chan) { in wpa_obss_scan_freqs_list()
2165 if (wpa_s->assoc_freq <= 2452) in wpa_obss_scan_freqs_list()
2168 if (wpa_s->assoc_freq >= 2432) in wpa_obss_scan_freqs_list()
2180 wpa_s->assoc_freq, start, end); in wpa_obss_scan_freqs_list()
2200 struct wpa_supplicant *wpa_s = eloop_ctx; in sme_obss_scan_timeout() local
2203 if (!wpa_s->current_bss) { in sme_obss_scan_timeout()
2209 wpa_obss_scan_freqs_list(wpa_s, ¶ms); in sme_obss_scan_timeout()
2213 if (wpa_supplicant_trigger_scan(wpa_s, ¶ms)) in sme_obss_scan_timeout()
2216 wpa_s->sme.sched_obss_scan = 1; in sme_obss_scan_timeout()
2219 eloop_register_timeout(wpa_s->sme.obss_scan_int, 0, in sme_obss_scan_timeout()
2220 sme_obss_scan_timeout, wpa_s, NULL); in sme_obss_scan_timeout()
2224 void sme_sched_obss_scan(struct wpa_supplicant *wpa_s, int enable) in sme_sched_obss_scan() argument
2227 struct wpa_bss *bss = wpa_s->current_bss; in sme_sched_obss_scan()
2228 struct wpa_ssid *ssid = wpa_s->current_ssid; in sme_sched_obss_scan()
2232 eloop_cancel_timeout(sme_obss_scan_timeout, wpa_s, NULL); in sme_sched_obss_scan()
2233 wpa_s->sme.sched_obss_scan = 0; in sme_sched_obss_scan()
2234 wpa_s->sme.ht_sec_chan = HT_SEC_CHAN_UNKNOWN; in sme_sched_obss_scan()
2242 if (!((wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) || in sme_sched_obss_scan()
2243 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_OBSS_SCAN)) || in sme_sched_obss_scan()
2247 if (!wpa_s->hw.modes) in sme_sched_obss_scan()
2251 for (i = 0; i < wpa_s->hw.num_modes; i++) { in sme_sched_obss_scan()
2252 hw_mode = &wpa_s->hw.modes[i]; in sme_sched_obss_scan()
2258 if (i == wpa_s->hw.num_modes || !hw_mode || in sme_sched_obss_scan()
2266 ie = wpa_bss_get_ie(wpa_s->current_bss, WLAN_EID_HT_CAP); in sme_sched_obss_scan()
2271 ie = wpa_bss_get_ie(wpa_s->current_bss, in sme_sched_obss_scan()
2276 wpa_s->sme.obss_scan_int = WPA_GET_LE16(ie + 6); in sme_sched_obss_scan()
2277 if (wpa_s->sme.obss_scan_int < 10) { in sme_sched_obss_scan()
2280 wpa_s->sme.obss_scan_int); in sme_sched_obss_scan()
2281 wpa_s->sme.obss_scan_int = 10; in sme_sched_obss_scan()
2284 wpa_s->sme.obss_scan_int); in sme_sched_obss_scan()
2285 eloop_register_timeout(wpa_s->sme.obss_scan_int, 0, in sme_sched_obss_scan()
2286 sme_obss_scan_timeout, wpa_s, NULL); in sme_sched_obss_scan()
2296 static int sme_check_sa_query_timeout(struct wpa_supplicant *wpa_s) in sme_check_sa_query_timeout() argument
2301 os_reltime_sub(&now, &wpa_s->sme.sa_query_start, &passed); in sme_check_sa_query_timeout()
2304 wpa_dbg(wpa_s, MSG_DEBUG, "SME: SA Query timed out"); in sme_check_sa_query_timeout()
2305 sme_stop_sa_query(wpa_s); in sme_check_sa_query_timeout()
2307 wpa_s, WLAN_REASON_PREV_AUTH_NOT_VALID); in sme_check_sa_query_timeout()
2315 static void sme_send_sa_query_req(struct wpa_supplicant *wpa_s, in sme_send_sa_query_req() argument
2321 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Sending SA Query Request to " in sme_send_sa_query_req()
2322 MACSTR, MAC2STR(wpa_s->bssid)); in sme_send_sa_query_req()
2330 if (wpa_sm_ocv_enabled(wpa_s->wpa)) { in sme_send_sa_query_req()
2333 if (wpa_drv_channel_info(wpa_s, &ci) != 0) { in sme_send_sa_query_req()
2346 if (wpa_drv_send_action(wpa_s, wpa_s->assoc_freq, 0, wpa_s->bssid, in sme_send_sa_query_req()
2347 wpa_s->own_addr, wpa_s->bssid, in sme_send_sa_query_req()
2349 wpa_msg(wpa_s, MSG_INFO, "SME: Failed to send SA Query " in sme_send_sa_query_req()
2356 struct wpa_supplicant *wpa_s = eloop_ctx; in sme_sa_query_timer() local
2360 if (wpa_s->sme.sa_query_count > 0 && in sme_sa_query_timer()
2361 sme_check_sa_query_timeout(wpa_s)) in sme_sa_query_timer()
2364 nbuf = os_realloc_array(wpa_s->sme.sa_query_trans_id, in sme_sa_query_timer()
2365 wpa_s->sme.sa_query_count + 1, in sme_sa_query_timer()
2368 sme_stop_sa_query(wpa_s); in sme_sa_query_timer()
2371 if (wpa_s->sme.sa_query_count == 0) { in sme_sa_query_timer()
2373 os_get_reltime(&wpa_s->sme.sa_query_start); in sme_sa_query_timer()
2375 trans_id = nbuf + wpa_s->sme.sa_query_count * WLAN_SA_QUERY_TR_ID_LEN; in sme_sa_query_timer()
2376 wpa_s->sme.sa_query_trans_id = nbuf; in sme_sa_query_timer()
2377 wpa_s->sme.sa_query_count++; in sme_sa_query_timer()
2381 sme_stop_sa_query(wpa_s); in sme_sa_query_timer()
2388 eloop_register_timeout(sec, usec, sme_sa_query_timer, wpa_s, NULL); in sme_sa_query_timer()
2390 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Association SA Query attempt %d", in sme_sa_query_timer()
2391 wpa_s->sme.sa_query_count); in sme_sa_query_timer()
2393 sme_send_sa_query_req(wpa_s, trans_id); in sme_sa_query_timer()
2397 static void sme_start_sa_query(struct wpa_supplicant *wpa_s) in sme_start_sa_query() argument
2399 sme_sa_query_timer(wpa_s, NULL); in sme_start_sa_query()
2403 static void sme_stop_sa_query(struct wpa_supplicant *wpa_s) in sme_stop_sa_query() argument
2405 if (wpa_s->sme.sa_query_trans_id) in sme_stop_sa_query()
2406 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Stop SA Query"); in sme_stop_sa_query()
2407 eloop_cancel_timeout(sme_sa_query_timer, wpa_s, NULL); in sme_stop_sa_query()
2408 os_free(wpa_s->sme.sa_query_trans_id); in sme_stop_sa_query()
2409 wpa_s->sme.sa_query_trans_id = NULL; in sme_stop_sa_query()
2410 wpa_s->sme.sa_query_count = 0; in sme_stop_sa_query()
2414 void sme_event_unprot_disconnect(struct wpa_supplicant *wpa_s, const u8 *sa, in sme_event_unprot_disconnect() argument
2420 if (wpa_s->wpa_state != WPA_COMPLETED) in sme_event_unprot_disconnect()
2422 ssid = wpa_s->current_ssid; in sme_event_unprot_disconnect()
2423 if (wpas_get_ssid_pmf(wpa_s, ssid) == NO_MGMT_FRAME_PROTECTION) in sme_event_unprot_disconnect()
2425 if (os_memcmp(sa, wpa_s->bssid, ETH_ALEN) != 0) in sme_event_unprot_disconnect()
2430 if (wpa_s->sme.sa_query_count > 0) in sme_event_unprot_disconnect()
2434 if (wpa_s->sme.last_unprot_disconnect.sec && in sme_event_unprot_disconnect()
2435 !os_reltime_expired(&now, &wpa_s->sme.last_unprot_disconnect, 10)) in sme_event_unprot_disconnect()
2437 wpa_s->sme.last_unprot_disconnect = now; in sme_event_unprot_disconnect()
2439 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Unprotected disconnect dropped - " in sme_event_unprot_disconnect()
2441 sme_start_sa_query(wpa_s); in sme_event_unprot_disconnect()
2445 void sme_event_ch_switch(struct wpa_supplicant *wpa_s) in sme_event_ch_switch() argument
2450 if (wpa_s->wpa_state != WPA_COMPLETED || in sme_event_ch_switch()
2451 !wpa_sm_ocv_enabled(wpa_s->wpa)) in sme_event_ch_switch()
2454 wpa_dbg(wpa_s, MSG_DEBUG, in sme_event_ch_switch()
2456 sme_stop_sa_query(wpa_s); in sme_event_ch_switch()
2461 eloop_register_timeout(0, usec, sme_sa_query_timer, wpa_s, NULL); in sme_event_ch_switch()
2465 static void sme_process_sa_query_request(struct wpa_supplicant *wpa_s, in sme_process_sa_query_request() argument
2472 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Sending SA Query Response to " in sme_process_sa_query_request()
2473 MACSTR, MAC2STR(wpa_s->bssid)); in sme_process_sa_query_request()
2480 if (wpa_sm_ocv_enabled(wpa_s->wpa)) { in sme_process_sa_query_request()
2483 if (wpa_drv_channel_info(wpa_s, &ci) != 0) { in sme_process_sa_query_request()
2496 if (wpa_drv_send_action(wpa_s, wpa_s->assoc_freq, 0, wpa_s->bssid, in sme_process_sa_query_request()
2497 wpa_s->own_addr, wpa_s->bssid, in sme_process_sa_query_request()
2499 wpa_msg(wpa_s, MSG_INFO, in sme_process_sa_query_request()
2504 static void sme_process_sa_query_response(struct wpa_supplicant *wpa_s, in sme_process_sa_query_response() argument
2510 if (!wpa_s->sme.sa_query_trans_id) in sme_process_sa_query_response()
2513 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Received SA Query response from " in sme_process_sa_query_response()
2516 if (os_memcmp(sa, wpa_s->bssid, ETH_ALEN) != 0) in sme_process_sa_query_response()
2519 for (i = 0; i < wpa_s->sme.sa_query_count; i++) { in sme_process_sa_query_response()
2520 if (os_memcmp(wpa_s->sme.sa_query_trans_id + in sme_process_sa_query_response()
2526 if (i >= wpa_s->sme.sa_query_count) { in sme_process_sa_query_response()
2527 wpa_dbg(wpa_s, MSG_DEBUG, "SME: No matching SA Query " in sme_process_sa_query_response()
2532 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Reply to pending SA Query received " in sme_process_sa_query_response()
2534 sme_stop_sa_query(wpa_s); in sme_process_sa_query_response()
2538 void sme_sa_query_rx(struct wpa_supplicant *wpa_s, const u8 *sa, in sme_sa_query_rx() argument
2544 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Received SA Query frame from " in sme_sa_query_rx()
2548 if (wpa_sm_ocv_enabled(wpa_s->wpa)) { in sme_sa_query_rx()
2560 if (wpa_drv_channel_info(wpa_s, &ci) != 0) { in sme_sa_query_rx()
2576 sme_process_sa_query_request(wpa_s, sa, data, len); in sme_sa_query_rx()
2578 sme_process_sa_query_response(wpa_s, sa, data, len); in sme_sa_query_rx()