Home | History | Annotate | Download | only in wpa_supplicant

Lines Matching refs:wpa_s

38 static void sme_stop_sa_query(struct wpa_supplicant *wpa_s);
42 void sme_authenticate(struct wpa_supplicant *wpa_s,
56 wpa_msg(wpa_s, MSG_ERROR, "SME: No scan result available for "
61 wpa_s->current_bss = bss;
64 wpa_s->reassociate = 0;
72 if (wpa_s->sme.ssid_len != params.ssid_len ||
73 os_memcmp(wpa_s->sme.ssid, params.ssid, params.ssid_len) != 0)
74 wpa_s->sme.prev_bssid_set = 0;
76 wpa_s->sme.freq = params.freq;
77 os_memcpy(wpa_s->sme.ssid, params.ssid, params.ssid_len);
78 wpa_s->sme.ssid_len = params.ssid_len;
91 wpa_dbg(wpa_s, MSG_DEBUG, "Automatic auth_alg selection: 0x%x",
95 wpa_dbg(wpa_s, MSG_DEBUG, "Overriding auth_alg selection: "
106 bssid_changed = !is_zero_ether_addr(wpa_s->bssid);
107 os_memset(wpa_s->bssid, 0, ETH_ALEN);
108 os_memcpy(wpa_s->pending_bssid, bss->bssid, ETH_ALEN);
110 wpas_notify_bssid_changed(wpa_s);
118 if (pmksa_cache_set_current(wpa_s->wpa, NULL, bss->bssid,
119 wpa_s->current_ssid,
121 eapol_sm_notify_pmkid_attempt(wpa_s->eapol, 1);
122 wpa_s->sme.assoc_req_ie_len = sizeof(wpa_s->sme.assoc_req_ie);
123 if (wpa_supplicant_set_suites(wpa_s, bss, ssid,
124 wpa_s->sme.assoc_req_ie,
125 &wpa_s->sme.assoc_req_ie_len)) {
126 wpa_msg(wpa_s, MSG_WARNING, "SME: Failed to set WPA "
137 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
138 wpa_s->sme.assoc_req_ie_len = 0;
140 wpa_s->sme.assoc_req_ie_len = sizeof(wpa_s->sme.assoc_req_ie);
141 if (wpa_supplicant_set_suites(wpa_s, NULL, ssid,
142 wpa_s->sme.assoc_req_ie,
143 &wpa_s->sme.assoc_req_ie_len)) {
144 wpa_msg(wpa_s, MSG_WARNING, "SME: Failed to set WPA "
154 sizeof(wpa_s->sme.assoc_req_ie)) {
155 wpa_s->sme.assoc_req_ie_len = wpabuf_len(wps_ie);
156 os_memcpy(wpa_s->sme.assoc_req_ie, wpabuf_head(wps_ie),
157 wpa_s->sme.assoc_req_ie_len);
159 wpa_s->sme.assoc_req_ie_len = 0;
161 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
164 wpa_supplicant_set_non_wpa_policy(wpa_s, ssid);
165 wpa_s->sme.assoc_req_ie_len = 0;
172 wpa_sm_set_ft_params(wpa_s->wpa, ie, ie ? 2 + ie[1] : 0);
175 wpa_ft_prepare_auth_request(wpa_s->wpa, ie);
179 if (wpa_s->sme.assoc_req_ie_len + 5 <
180 sizeof(wpa_s->sme.assoc_req_ie)) {
182 u8 *pos = wpa_s->sme.assoc_req_ie +
183 wpa_s->sme.assoc_req_ie_len;
190 wpa_s->sme.assoc_req_ie_len += 5;
193 if (wpa_s->sme.ft_used &&
194 os_memcmp(md, wpa_s->sme.mobility_domain, 2) == 0 &&
195 wpa_sm_has_ptk(wpa_s->wpa)) {
196 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Trying to use FT "
199 params.ie = wpa_s->sme.ft_ies;
200 params.ie_len = wpa_s->sme.ft_ies_len;
206 wpa_s->sme.mfp = ssid->ieee80211w;
213 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Selected AP supports "
215 wpa_s->sme.mfp = MGMT_FRAME_PROTECTION_REQUIRED;
221 if (wpa_s->global->p2p) {
225 pos = wpa_s->sme.assoc_req_ie + wpa_s->sme.assoc_req_ie_len;
226 len = sizeof(wpa_s->sme.assoc_req_ie) -
227 wpa_s->sme.assoc_req_ie_len;
228 res = wpas_p2p_assoc_req_ie(wpa_s, bss, pos, len,
231 wpa_s->sme.assoc_req_ie_len += res;
236 if (wpa_s->conf->hs20) {
241 os_memcpy(wpa_s->sme.assoc_req_ie +
242 wpa_s->sme.assoc_req_ie_len,
244 wpa_s->sme.assoc_req_ie_len += wpabuf_len(hs20);
251 if (wpa_s->conf->interworking) {
252 u8 *pos = wpa_s->sme.assoc_req_ie;
253 if (wpa_s->sme.assoc_req_ie_len > 0 && pos[0] == WLAN_EID_RSN)
256 wpa_s->sme.assoc_req_ie_len -
257 (pos - wpa_s->sme.assoc_req_ie));
258 wpa_s->sme.assoc_req_ie_len += 6;
268 wpa_supplicant_cancel_sched_scan(wpa_s);
269 wpa_supplicant_cancel_scan(wpa_s);
271 wpa_msg(wpa_s, MSG_INFO, "SME: Trying to authenticate with " MACSTR
275 wpa_clear_keys(wpa_s, bss->bssid);
276 wpa_supplicant_set_state(wpa_s, WPA_AUTHENTICATING);
277 old_ssid = wpa_s->current_ssid;
278 wpa_s->current_ssid = ssid;
279 wpa_supplicant_rsn_supp_set_config(wpa_s, wpa_s->current_ssid);
280 wpa_supplicant_initiate_eapol(wpa_s);
281 if (old_ssid != wpa_s->current_ssid)
282 wpas_notify_network_changed(wpa_s);
284 wpa_s->sme.auth_alg = params.auth_alg;
285 if (wpa_drv_authenticate(wpa_s, &params) < 0) {
286 wpa_msg(wpa_s, MSG_INFO, "SME: Authentication request to the "
288 wpas_connection_failed(wpa_s, bss->bssid);
289 wpa_supplicant_mark_disassoc(wpa_s);
293 eloop_register_timeout(SME_AUTH_TIMEOUT, 0, sme_auth_timer, wpa_s,
303 void sme_event_auth(struct wpa_supplicant *wpa_s, union wpa_event_data *data)
305 struct wpa_ssid *ssid = wpa_s->current_ssid;
308 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Ignore authentication event "
313 if (wpa_s->wpa_state != WPA_AUTHENTICATING) {
314 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Ignore authentication event "
319 if (os_memcmp(wpa_s->pending_bssid, data->auth.peer, ETH_ALEN) != 0) {
320 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Ignore authentication with "
326 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Authentication response: peer=" MACSTR
333 eloop_cancel_timeout(sme_auth_timer, wpa_s, NULL);
336 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Authentication failed (status "
341 wpa_s->sme.auth_alg == data->auth.auth_type ||
342 wpa_s->current_ssid->auth_alg == WPA_AUTH_ALG_LEAP) {
343 wpas_connection_failed(wpa_s, wpa_s->pending_bssid);
344 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
350 wpa_s->current_ssid->auth_alg = WPA_AUTH_ALG_SHARED;
352 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Trying SHARED auth");
353 wpa_supplicant_associate(wpa_s, wpa_s->current_bss,
354 wpa_s->current_ssid);
358 wpa_s->current_ssid->auth_alg = WPA_AUTH_ALG_LEAP;
360 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Trying LEAP auth");
361 wpa_supplicant_associate(wpa_s, wpa_s->current_bss,
362 wpa_s->current_ssid);
377 wpa_supplicant_event(wpa_s, EVENT_FT_RESPONSE, &edata);
381 sme_associate(wpa_s, ssid->mode, data->auth.peer,
386 void sme_associate(struct wpa_supplicant *wpa_s, enum wpas_mode mode,
398 params.ssid = wpa_s->sme.ssid;
399 params.ssid_len = wpa_s->sme.ssid_len;
400 params.freq = wpa_s->sme.freq;
401 params.bg_scan_period = wpa_s->current_ssid ?
402 wpa_s->current_ssid->bg_scan_period : -1;
403 params.wpa_ie = wpa_s->sme.assoc_req_ie_len ?
404 wpa_s->sme.assoc_req_ie : NULL;
405 params.wpa_ie_len = wpa_s->sme.assoc_req_ie_len;
406 params.pairwise_suite = cipher_suite2driver(wpa_s->pairwise_cipher);
407 params.group_suite = cipher_suite2driver(wpa_s->group_cipher);
413 wpa_supplicant_apply_ht_overrides(wpa_s, wpa_s->current_ssid, &params);
416 if (auth_type == WLAN_AUTH_FT && wpa_s->sme.ft_ies) {
417 params.wpa_ie = wpa_s->sme.ft_ies;
418 params.wpa_ie_len = wpa_s->sme.ft_ies_len;
422 params.mgmt_frame_protection = wpa_s->sme.mfp;
423 if (wpa_s->sme.prev_bssid_set)
424 params.prev_bssid = wpa_s->sme.prev_bssid;
426 wpa_msg(wpa_s, MSG_INFO, "Trying to associate with " MACSTR
431 wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING);
436 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Could not parse own IEs?!");
441 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, elems.rsn_ie - 2,
445 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, elems.wpa_ie - 2,
448 wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
449 if (wpa_s->current_ssid && wpa_s->current_ssid->p2p_group)
452 if (wpa_s->parent->set_sta_uapsd)
453 params.uapsd = wpa_s->parent->sta_uapsd;
457 if (wpa_drv_associate(wpa_s, &params) < 0) {
458 wpa_msg(wpa_s, MSG_INFO, "SME: Association request to the "
460 wpas_connection_failed(wpa_s, wpa_s->pending_bssid);
461 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
462 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
466 eloop_register_timeout(SME_ASSOC_TIMEOUT, 0, sme_assoc_timer, wpa_s,
471 int sme_update_ft_ies(struct wpa_supplicant *wpa_s, const u8 *md,
475 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Remove mobility domain");
476 os_free(wpa_s->sme.ft_ies);
477 wpa_s->sme.ft_ies = NULL;
478 wpa_s->sme.ft_ies_len = 0;
479 wpa_s->sme.ft_used = 0;
483 os_memcpy(wpa_s->sme.mobility_domain, md, MOBILITY_DOMAIN_ID_LEN);
485 os_free(wpa_s->sme.ft_ies);
486 wpa_s->sme.ft_ies = os_malloc(ies_len);
487 if (wpa_s->sme.ft_ies == NULL)
489 os_memcpy(wpa_s->sme.ft_ies, ies, ies_len);
490 wpa_s->sme.ft_ies_len = ies_len;
495 static void sme_deauth(struct wpa_supplicant *wpa_s)
499 bssid_changed = !is_zero_ether_addr(wpa_s->bssid);
501 if (wpa_drv_deauthenticate(wpa_s, wpa_s->pending_bssid,
503 wpa_msg(wpa_s, MSG_INFO, "SME: Deauth request to the driver "
506 wpa_s->sme.prev_bssid_set = 0;
508 wpas_connection_failed(wpa_s, wpa_s->pending_bssid);
509 wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
510 os_memset(wpa_s->bssid, 0, ETH_ALEN);
511 os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);
513 wpas_notify_bssid_changed(wpa_s);
517 void sme_event_assoc_reject(struct wpa_supplicant *wpa_s,
520 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Association with " MACSTR " failed: "
521 "status code %d", MAC2STR(wpa_s->pending_bssid),
524 eloop_cancel_timeout(sme_assoc_timer, wpa_s, NULL);
533 sme_deauth(wpa_s);
537 wpa_s,
540 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Authentication timed out");
541 wpas_connection_failed(wpa_s, wpa_s->pending_bssid);
542 wpa_supplicant_mark_disassoc(wpa_s);
546 void sme_event_assoc_timed_out(struct wpa_supplicant *wpa_s,
549 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Association timed out");
550 wpas_connection_failed(wpa_s, wpa_s->pending_bssid);
551 wpa_supplicant_mark_disassoc(wpa_s);
555 void sme_event_disassoc(struct wpa_supplicant *wpa_s,
558 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Disassociation event received");
559 if (wpa_s->sme.prev_bssid_set) {
566 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Deauthenticate to clear "
568 wpa_drv_deauthenticate(wpa_s, wpa_s->sme.prev_bssid,
576 struct wpa_supplicant *wpa_s = eloop_ctx;
577 if (wpa_s->wpa_state == WPA_AUTHENTICATING) {
578 wpa_msg(wpa_s, MSG_DEBUG, "SME: Authentication timeout");
579 sme_deauth(wpa_s);
586 struct wpa_supplicant *wpa_s = eloop_ctx;
587 if (wpa_s->wpa_state == WPA_ASSOCIATING) {
588 wpa_msg(wpa_s, MSG_DEBUG, "SME: Association timeout");
589 sme_deauth(wpa_s);
594 void sme_state_changed(struct wpa_supplicant *wpa_s)
597 if (wpa_s->wpa_state != WPA_ASSOCIATING)
598 eloop_cancel_timeout(sme_assoc_timer, wpa_s, NULL);
599 if (wpa_s->wpa_state != WPA_AUTHENTICATING)
600 eloop_cancel_timeout(sme_auth_timer, wpa_s, NULL);
604 void sme_disassoc_while_authenticating(struct wpa_supplicant *wpa_s,
612 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Allow pending authentication "
614 wpa_supplicant_set_state(wpa_s, WPA_AUTHENTICATING);
615 os_memcpy(wpa_s->pending_bssid, prev_pending_bssid, ETH_ALEN);
620 eloop_cancel_timeout(sme_auth_timer, wpa_s, NULL);
621 eloop_register_timeout(SME_AUTH_TIMEOUT, 0, sme_auth_timer, wpa_s,
626 void sme_deinit(struct wpa_supplicant *wpa_s)
628 os_free(wpa_s->sme.ft_ies);
629 wpa_s->sme.ft_ies = NULL;
630 wpa_s->sme.ft_ies_len = 0;
632 sme_stop_sa_query(wpa_s);
635 eloop_cancel_timeout(sme_assoc_timer, wpa_s, NULL);
636 eloop_cancel_timeout(sme_auth_timer, wpa_s, NULL);
637 eloop_cancel_timeout(sme_obss_scan_timeout, wpa_s, NULL);
641 static void sme_send_2040_bss_coex(struct wpa_supplicant *wpa_s,
650 MAC2STR(wpa_s->bssid));
677 if (wpa_drv_send_action(wpa_s, wpa_s->assoc_freq, 0, wpa_s->bssid,
678 wpa_s->own_addr, wpa_s->bssid,
680 wpa_msg(wpa_s, MSG_INFO,
721 int sme_proc_obss_scan(struct wpa_supplicant *wpa_s)
729 if (!wpa_s->sme.sched_obss_scan)
732 wpa_s->sme.sched_obss_scan = 0;
733 if (!wpa_s->current_bss || wpa_s->wpa_state != WPA_COMPLETED)
749 ie = wpa_bss_get_ie(wpa_s->current_bss, WLAN_EID_COUNTRY);
755 dl_list_for_each(bss, &wpa_s->bss, struct wpa_bss, list) {
779 sme_send_2040_bss_coex(wpa_s, chan_list, num_channels, num_intol);
799 static void wpa_setband_scan_freqs_list(struct wpa_supplicant *wpa_s,
807 mode = get_mode(wpa_s->hw.modes, wpa_s->hw.num_modes, band);
827 struct wpa_supplicant *wpa_s = eloop_ctx;
830 if (!wpa_s->current_bss) {
836 wpa_setband_scan_freqs_list(wpa_s, HOSTAPD_MODE_IEEE80211G, &params);
839 if (wpa_supplicant_trigger_scan(wpa_s, &params))
842 wpa_s->sme.sched_obss_scan = 1;
845 eloop_register_timeout(wpa_s->sme.obss_scan_int, 0,
846 sme_obss_scan_timeout, wpa_s, NULL);
850 void sme_sched_obss_scan(struct wpa_supplicant *wpa_s, int enable)
853 struct wpa_bss *bss = wpa_s->current_bss;
854 struct wpa_ssid *ssid = wpa_s->current_ssid;
858 eloop_cancel_timeout(sme_obss_scan_timeout, wpa_s, NULL);
859 wpa_s->sme.sched_obss_scan = 0;
863 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME) || ssid == NULL ||
867 if (!wpa_s->hw.modes)
871 for (i = 0; i < wpa_s->hw.num_modes; i++) {
872 hw_mode = &wpa_s->hw.modes[i];
878 if (i == wpa_s->hw.num_modes || !hw_mode ||
886 ie = wpa_bss_get_ie(wpa_s->current_bss, WLAN_EID_HT_CAP);
891 ie = wpa_bss_get_ie(wpa_s->current_bss,
896 wpa_s->sme.obss_scan_int = WPA_GET_LE16(ie + 6);
897 if (wpa_s->sme.obss_scan_int < 10) {
900 wpa_s->sme.obss_scan_int);
901 wpa_s->sme.obss_scan_int = 10;
904 wpa_s->sme.obss_scan_int);
905 eloop_register_timeout(wpa_s->sme.obss_scan_int, 0,
906 sme_obss_scan_timeout, wpa_s, NULL);
915 static int sme_check_sa_query_timeout(struct wpa_supplicant *wpa_s)
920 os_time_sub(&now, &wpa_s->sme.sa_query_start, &passed);
923 wpa_dbg(wpa_s, MSG_DEBUG, "SME: SA Query timed out");
924 sme_stop_sa_query(wpa_s);
926 wpa_s, WLAN_REASON_PREV_AUTH_NOT_VALID);
934 static void sme_send_sa_query_req(struct wpa_supplicant *wpa_s,
938 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Sending SA Query Request to "
939 MACSTR, MAC2STR(wpa_s->bssid));
945 if (wpa_drv_send_action(wpa_s, wpa_s->assoc_freq, 0, wpa_s->bssid,
946 wpa_s->own_addr, wpa_s->bssid,
948 wpa_msg(wpa_s, MSG_INFO, "SME: Failed to send SA Query "
955 struct wpa_supplicant *wpa_s = eloop_ctx;
959 if (wpa_s->sme.sa_query_count > 0 &&
960 sme_check_sa_query_timeout(wpa_s))
963 nbuf = os_realloc_array(wpa_s->sme.sa_query_trans_id,
964 wpa_s->sme.sa_query_count + 1,
968 if (wpa_s->sme.sa_query_count == 0) {
970 os_get_time(&wpa_s->sme.sa_query_start);
972 trans_id = nbuf + wpa_s->sme.sa_query_count * WLAN_SA_QUERY_TR_ID_LEN;
973 wpa_s->sme.sa_query_trans_id = nbuf;
974 wpa_s->sme.sa_query_count++;
981 eloop_register_timeout(sec, usec, sme_sa_query_timer, wpa_s, NULL);
983 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Association SA Query attempt %d",
984 wpa_s->sme.sa_query_count);
986 sme_send_sa_query_req(wpa_s, trans_id);
990 static void sme_start_sa_query(struct wpa_supplicant *wpa_s)
992 sme_sa_query_timer(wpa_s, NULL);
996 static void sme_stop_sa_query(struct wpa_supplicant *wpa_s)
998 eloop_cancel_timeout(sme_sa_query_timer, wpa_s, NULL);
999 os_free(wpa_s->sme.sa_query_trans_id);
1000 wpa_s->sme.sa_query_trans_id = NULL;
1001 wpa_s->sme.sa_query_count = 0;
1005 void sme_event_unprot_disconnect(struct wpa_supplicant *wpa_s, const u8 *sa,
1010 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SME))
1012 if (wpa_s->wpa_state != WPA_COMPLETED)
1014 ssid = wpa_s->current_ssid;
1017 if (os_memcmp(sa, wpa_s->bssid, ETH_ALEN) != 0)
1022 if (wpa_s->sme.sa_query_count > 0)
1025 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Unprotected disconnect dropped - "
1027 sme_start_sa_query(wpa_s);
1031 void sme_sa_query_rx(struct wpa_supplicant *wpa_s, const u8 *sa,
1036 if (wpa_s->sme.sa_query_trans_id == NULL ||
1040 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Received SA Query response from "
1043 if (os_memcmp(sa, wpa_s->bssid, ETH_ALEN) != 0)
1046 for (i = 0; i < wpa_s->sme.sa_query_count; i++) {
1047 if (os_memcmp(wpa_s->sme.sa_query_trans_id +
1053 if (i >= wpa_s->sme.sa_query_count) {
1054 wpa_dbg(wpa_s, MSG_DEBUG, "SME: No matching SA Query "
1059 wpa_dbg(wpa_s, MSG_DEBUG, "SME: Reply to pending SA Query received "
1061 sme_stop_sa_query(wpa_s);