From e4447fd1b53a18a715a7667ea2f683eb38ec4533 Mon Sep 17 00:00:00 2001 From: avishad verma Date: Thu, 16 Nov 2023 06:43:59 -0600 Subject: [PATCH 285/296] brcmfmac: FT-Cert: FT and FT roam support in driver Support for WPA3 FT AKMs. Reassoc flow changed in driver. wpa_cli roam command initiates reassoc. During reassoc only reassoc IOVAR needs to be sent to FW. Roaming is supposed to be happen across same security type. Hence no need to send additional configuration to FW. Signed-off-by: avishad verma --- .../broadcom/brcm80211/brcmfmac/cfg80211.c | 25 ++++++++++++++++++- .../broadcom/brcm80211/include/brcmu_wifi.h | 12 +++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c index a58576d0a4c2..890e321cb8c3 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c @@ -2249,7 +2249,12 @@ static s32 brcmf_set_wpa_version(struct net_device *ndev, else val = WPA2_AUTH_PSK | WPA2_AUTH_UNSPECIFIED; } else if (sme->crypto.wpa_versions & NL80211_WPA_VERSION_3) { - val = WPA3_AUTH_SAE_PSK; + if (sme->crypto.akm_suites[0] == WLAN_AKM_SUITE_FT_OVER_SAE) + val = WPA3_AUTH_SAE_FBT; + else if (sme->crypto.akm_suites[0] == WLAN_AKM_SUITE_FT_8021X_SHA384) + val = WPA3_AUTH_SAE_FT_1X; + else + val = WPA3_AUTH_SAE_PSK; } else { val = WPA_AUTH_DISABLED; } @@ -2877,6 +2882,24 @@ brcmf_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev, sme->bssid = sme->bssid_hint; } + /* FT Cert: Handling the roam request from supplicant for FT roaming */ + if (sme->prev_bssid && sme->bssid && + brcmf_feat_is_enabled(ifp, BRCMF_FEAT_FBT) && + wpa_akm_ft(sme->crypto.akm_suites[0])) { + /* Only reassoc IOVAR required for Roam skip additional IOVAR */ + struct brcmf_assoc_params_le ext_roam_params; + + brcmf_dbg(CONN, "Trying to REASSOC For FT\n"); + memset(&ext_roam_params, 0, sizeof(ext_roam_params)); + memcpy(&ext_roam_params.bssid, sme->bssid, ETH_ALEN); + set_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state); + + err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_REASSOC, + &ext_roam_params, + sizeof(ext_roam_params)); + goto done; + } + if (ifp->vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif) { /* A normal (non P2P) connection request setup. */ ie = NULL; diff --git a/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h b/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h index f6b019556c5b..8e0f4fb340d5 100644 --- a/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h +++ b/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h @@ -241,6 +241,7 @@ static inline bool ac_bitmap_tst(u8 bitmap, int prec) #define WPA3_AUTH_SAE_PSK 0x40000 /* SAE with 4-way handshake */ #define WPA3_AUTH_SAE_FBT 0x80000 /* FT authentication over SAE */ +#define WPA3_AUTH_SAE_FT_1X 0x2000000 /* SAE with FT 1X */ #define WPA3_AUTH_OWE 0x100000 /* OWE */ #define WFA_AUTH_DPP 0x200000 /* WFA DPP AUTH */ #define WPA3_AUTH_1X_SUITE_B_SHA384 0x400000 /* Suite B-192 SHA384 */ @@ -263,4 +264,15 @@ static inline bool ac_bitmap_tst(u8 bitmap, int prec) #define WPA_PROTO_WPA BIT(0) #define WPA_PROTO_RSN BIT(1) +static inline int wpa_akm_ft(int akm) +{ + return !!((akm == WLAN_AKM_SUITE_FT_PSK) || + (akm == WLAN_AKM_SUITE_FT_8021X) || + (akm == WLAN_AKM_SUITE_FT_8021X_SHA384) || + (akm == WLAN_AKM_SUITE_FT_OVER_SAE) || + (akm == WLAN_AKM_SUITE_FT_FILS_SHA256) || + (akm == WLAN_AKM_SUITE_FT_FILS_SHA384) || + (akm == WLAN_AKM_SUITE_FT_PSK_SHA384)); +} + #endif /* _BRCMU_WIFI_H_ */ -- 2.25.1