diff --git a/hostapd/ap.h b/hostapd/ap.h index b73c5b47a..383ecaf14 100644 --- a/hostapd/ap.h +++ b/hostapd/ap.h @@ -26,6 +26,7 @@ #define WLAN_STA_SHORT_PREAMBLE BIT(7) #define WLAN_STA_PREAUTH BIT(8) #define WLAN_STA_WME BIT(9) +#define WLAN_STA_MFP BIT(10) #define WLAN_STA_NONERP BIT(31) /* Maximum number of supported rates (from both Supported Rates and Extended diff --git a/hostapd/hostapd.c b/hostapd/hostapd.c index e8d846056..631605436 100644 --- a/hostapd/hostapd.c +++ b/hostapd/hostapd.c @@ -398,7 +398,7 @@ static void hostapd_dump_state(struct hostapd_data *hapd) fprintf(f, "\nSTA=" MACSTR "\n", MAC2STR(sta->addr)); fprintf(f, - " AID=%d flags=0x%x %s%s%s%s%s%s%s%s%s%s\n" + " AID=%d flags=0x%x %s%s%s%s%s%s%s%s%s%s%s%s\n" " capability=0x%x listen_interval=%d\n", sta->aid, sta->flags, @@ -414,6 +414,8 @@ static void hostapd_dump_state(struct hostapd_data *hapd) (sta->flags & WLAN_STA_SHORT_PREAMBLE ? "[SHORT_PREAMBLE]" : ""), (sta->flags & WLAN_STA_PREAUTH ? "[PREAUTH]" : ""), + (sta->flags & WLAN_STA_WME ? "[WME]" : ""), + (sta->flags & WLAN_STA_MFP ? "[MFP]" : ""), (sta->flags & WLAN_STA_NONERP ? "[NonERP]" : ""), sta->capability, sta->listen_interval); diff --git a/hostapd/ieee802_11.c b/hostapd/ieee802_11.c index 388b19d03..1ebf98594 100644 --- a/hostapd/ieee802_11.c +++ b/hostapd/ieee802_11.c @@ -996,6 +996,12 @@ static void handle_assoc(struct hostapd_data *hapd, resp = WLAN_STATUS_INVALID_IE; if (resp != WLAN_STATUS_SUCCESS) goto fail; +#ifdef CONFIG_IEEE80211W + if (wpa_auth_uses_mfp(sta->wpa_sm)) + sta->flags |= WLAN_STA_MFP; + else + sta->flags &= ~WLAN_STA_MFP; +#endif /* CONFIG_IEEE80211W */ #ifdef CONFIG_IEEE80211R if (sta->auth_alg == WLAN_AUTH_FT) { diff --git a/hostapd/wpa.h b/hostapd/wpa.h index cec37fe2f..5778bb153 100644 --- a/hostapd/wpa.h +++ b/hostapd/wpa.h @@ -219,6 +219,7 @@ int wpa_validate_wpa_ie(struct wpa_authenticator *wpa_auth, struct wpa_state_machine *sm, const u8 *wpa_ie, size_t wpa_ie_len, const u8 *mdie, size_t mdie_len); +int wpa_auth_uses_mfp(struct wpa_state_machine *sm); struct wpa_state_machine * wpa_auth_sta_init(struct wpa_authenticator *wpa_auth, const u8 *addr); void wpa_auth_sta_associated(struct wpa_authenticator *wpa_auth, diff --git a/hostapd/wpa_auth_ie.c b/hostapd/wpa_auth_ie.c index 3e011b298..1d2caa32a 100644 --- a/hostapd/wpa_auth_ie.c +++ b/hostapd/wpa_auth_ie.c @@ -783,3 +783,9 @@ int wpa_parse_kde_ies(const u8 *buf, size_t len, struct wpa_eapol_ie_parse *ie) return ret; } + + +int wpa_auth_uses_mfp(struct wpa_state_machine *sm) +{ + return sm ? sm->mgmt_frame_prot : 0; +}