static void hostapd_notif_auth(struct hostapd_data *hapd, struct auth_info *rx_auth) { struct sta_info *sta; u16 status = WLAN_STATUS_SUCCESS; u8 resp_ies[2 + WLAN_AUTH_CHALLENGE_LEN]; size_t resp_ies_len = 0; sta = ap_get_sta(hapd, rx_auth->peer); if (!sta) { sta = ap_sta_add(hapd, rx_auth->peer); if (sta == NULL) { status = WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA; goto fail; } } sta->flags &= ~WLAN_STA_PREAUTH; ieee802_1x_notify_pre_auth(sta->eapol_sm, 0); #ifdef CONFIG_IEEE80211R_AP if (rx_auth->auth_type == WLAN_AUTH_FT && hapd->wpa_auth) { sta->auth_alg = WLAN_AUTH_FT; if (sta->wpa_sm == NULL) sta->wpa_sm = wpa_auth_sta_init(hapd->wpa_auth, sta->addr, NULL); if (sta->wpa_sm == NULL) { wpa_printf(MSG_DEBUG, "FT: Failed to initialize WPA state machine"); status = WLAN_STATUS_UNSPECIFIED_FAILURE; goto fail; } wpa_ft_process_auth(sta->wpa_sm, rx_auth->bssid, rx_auth->auth_transaction, rx_auth->ies, rx_auth->ies_len, hostapd_notify_auth_ft_finish, hapd); return; } #endif /* CONFIG_IEEE80211R_AP */ #ifdef CONFIG_FILS if (rx_auth->auth_type == WLAN_AUTH_FILS_SK) { sta->auth_alg = WLAN_AUTH_FILS_SK; handle_auth_fils(hapd, sta, rx_auth->ies, rx_auth->ies_len, rx_auth->auth_type, rx_auth->auth_transaction, rx_auth->status_code, hostapd_notify_auth_fils_finish); return; } #endif /* CONFIG_FILS */ fail: hostapd_sta_auth(hapd, rx_auth->peer, rx_auth->auth_transaction + 1, status, resp_ies, resp_ies_len); }
static void hostapd_notify_auth_ft_finish(void *ctx, const u8 *dst, const u8 *bssid, u16 auth_transaction, u16 status, const u8 *ies, size_t ies_len) { struct hostapd_data *hapd = ctx; struct sta_info *sta; sta = ap_get_sta(hapd, dst); if (sta == NULL) return; hostapd_logger(hapd, dst, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_DEBUG, "authentication OK (FT)"); sta->flags |= WLAN_STA_AUTH; hostapd_sta_auth(hapd, dst, auth_transaction, status, ies, ies_len); }
static void hostapd_notif_auth(struct hostapd_data *hapd, struct auth_info *rx_auth) { struct sta_info *sta; u16 resp = WLAN_STATUS_SUCCESS; u8 resp_ies[2 + WLAN_AUTH_CHALLENGE_LEN]; size_t resp_ies_len = 0; sta = ap_get_sta(hapd, rx_auth->peer); if (!sta) { sta = ap_sta_add(hapd, rx_auth->peer); if (sta == NULL) { resp = WLAN_STATUS_UNSPECIFIED_FAILURE; goto fail; } } sta->flags &= ~WLAN_STA_PREAUTH; ieee802_1x_notify_pre_auth(sta->eapol_sm, 0); #ifdef CONFIG_IEEE80211R if (rx_auth->auth_type == WLAN_AUTH_FT) { sta->auth_alg = WLAN_AUTH_FT; if (sta->wpa_sm == NULL) sta->wpa_sm = wpa_auth_sta_init(hapd->wpa_auth, sta->addr); if (sta->wpa_sm == NULL) { wpa_printf(MSG_DEBUG, "FT: Failed to initialize WPA " "state machine"); resp = WLAN_STATUS_UNSPECIFIED_FAILURE; goto fail; } wpa_ft_process_auth(sta->wpa_sm, rx_auth->bssid, rx_auth->auth_transaction, rx_auth->ies, rx_auth->ies_len, hostapd_notify_auth_ft_finish, hapd); return; } #endif /* CONFIG_IEEE80211R */ fail: if (resp_ies_len) hostapd_set_auth_ie(hapd, resp_ies, resp_ies_len); hostapd_sta_auth(hapd, rx_auth->peer, rx_auth->auth_transaction + 1, resp); }
static void hostapd_notify_auth_fils_finish(struct hostapd_data *hapd, struct sta_info *sta, u16 resp, struct wpabuf *data, int pub) { if (resp == WLAN_STATUS_SUCCESS) { hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_DEBUG, "authentication OK (FILS)"); sta->flags |= WLAN_STA_AUTH; wpa_auth_sm_event(sta->wpa_sm, WPA_AUTH); sta->auth_alg = WLAN_AUTH_FILS_SK; mlme_authenticate_indication(hapd, sta); } else { hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211, HOSTAPD_LEVEL_DEBUG, "authentication failed (FILS)"); } hostapd_sta_auth(hapd, sta->addr, 2, resp, data ? wpabuf_head(data) : NULL, data ? wpabuf_len(data) : 0); wpabuf_free(data); }