mirror of
https://github.com/Ysurac/openmptcprouter.git
synced 2025-02-15 04:42:02 +00:00
137 lines
5 KiB
Diff
137 lines
5 KiB
Diff
From 20b81d1945a11e2e5f5abe7bdc73ac92dc8bbe9a Mon Sep 17 00:00:00 2001
|
|
From: Kurt Lee <kurt.lee@cypress.com>
|
|
Date: Thu, 20 Aug 2020 03:07:02 -0500
|
|
Subject: [PATCH 0897/1002] brcmfmac: Fix interoperating DPP and other
|
|
encryption network access
|
|
|
|
1. If firmware supports 4-way handshake offload but not supports DPP
|
|
4-way offload, when user first connects encryption network, driver will
|
|
set "sup_wpa 1" to firmware, but it will further result in DPP
|
|
connection failure since firmware won't send EAPOL frame to host.
|
|
|
|
2. Fix DPP AP mode handling action frames.
|
|
|
|
3. For some firmware without fwsup support, the join procedure will be
|
|
skipped due to "sup_wpa" iovar returning not-support. Check the fwsup
|
|
feature before do such iovar.
|
|
|
|
Signed-off-by: Kurt Lee <kurt.lee@cypress.com>
|
|
Signed-off-by: Double Lo <double.lo@cypress.com>
|
|
Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
|
|
---
|
|
.../broadcom/brcm80211/brcmfmac/cfg80211.c | 68 ++++++++++---------
|
|
.../broadcom/brcm80211/brcmfmac/p2p.c | 5 ++
|
|
2 files changed, 42 insertions(+), 31 deletions(-)
|
|
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
|
index 77d9790e5d51..dd9778f6727d 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
|
@@ -2475,44 +2475,50 @@ brcmf_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev,
|
|
goto done;
|
|
}
|
|
|
|
- if (sme->crypto.psk &&
|
|
- profile->use_fwsup != BRCMF_PROFILE_FWSUP_SAE) {
|
|
- if (WARN_ON(profile->use_fwsup != BRCMF_PROFILE_FWSUP_NONE)) {
|
|
- err = -EINVAL;
|
|
- goto done;
|
|
+ if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_FWSUP)) {
|
|
+ if (sme->crypto.psk) {
|
|
+ if (profile->use_fwsup != BRCMF_PROFILE_FWSUP_SAE) {
|
|
+ if (WARN_ON(profile->use_fwsup !=
|
|
+ BRCMF_PROFILE_FWSUP_NONE)) {
|
|
+ err = -EINVAL;
|
|
+ goto done;
|
|
+ }
|
|
+ brcmf_dbg(INFO, "using PSK offload\n");
|
|
+ profile->use_fwsup = BRCMF_PROFILE_FWSUP_PSK;
|
|
+ }
|
|
+ } else {
|
|
+ profile->use_fwsup = BRCMF_PROFILE_FWSUP_NONE;
|
|
}
|
|
- brcmf_dbg(INFO, "using PSK offload\n");
|
|
- profile->use_fwsup = BRCMF_PROFILE_FWSUP_PSK;
|
|
- }
|
|
|
|
- if (profile->use_fwsup != BRCMF_PROFILE_FWSUP_NONE) {
|
|
- /* enable firmware supplicant for this interface */
|
|
- err = brcmf_fil_iovar_int_set(ifp, "sup_wpa", 1);
|
|
- if (err < 0) {
|
|
- bphy_err(drvr, "failed to enable fw supplicant\n");
|
|
- goto done;
|
|
+ if (profile->use_fwsup != BRCMF_PROFILE_FWSUP_NONE) {
|
|
+ /* enable firmware supplicant for this interface */
|
|
+ err = brcmf_fil_iovar_int_set(ifp, "sup_wpa", 1);
|
|
+ if (err < 0) {
|
|
+ bphy_err(drvr, "failed to enable fw supplicant\n");
|
|
+ goto done;
|
|
+ }
|
|
+ } else {
|
|
+ err = brcmf_fil_iovar_int_set(ifp, "sup_wpa", 0);
|
|
}
|
|
- }
|
|
|
|
- if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_PSK)
|
|
- err = brcmf_set_pmk(ifp, sme->crypto.psk,
|
|
- BRCMF_WSEC_MAX_PSK_LEN);
|
|
- else if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_SAE) {
|
|
- /* clean up user-space RSNE */
|
|
- err = brcmf_fil_iovar_data_set(ifp, "wpaie", NULL, 0);
|
|
- if (err) {
|
|
- bphy_err(drvr, "failed to clean up user-space RSNE\n");
|
|
- goto done;
|
|
- }
|
|
- err = brcmf_set_sae_password(ifp, sme->crypto.sae_pwd,
|
|
- sme->crypto.sae_pwd_len);
|
|
- if (!err && sme->crypto.psk)
|
|
+ if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_PSK)
|
|
err = brcmf_set_pmk(ifp, sme->crypto.psk,
|
|
BRCMF_WSEC_MAX_PSK_LEN);
|
|
+ else if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_SAE) {
|
|
+ /* clean up user-space RSNE */
|
|
+ if (brcmf_fil_iovar_data_set(ifp, "wpaie", NULL, 0)) {
|
|
+ bphy_err(drvr, "failed to clean up user-space RSNE\n");
|
|
+ goto done;
|
|
+ }
|
|
+ err = brcmf_set_sae_password(ifp, sme->crypto.sae_pwd,
|
|
+ sme->crypto.sae_pwd_len);
|
|
+ if (!err && sme->crypto.psk)
|
|
+ err = brcmf_set_pmk(ifp, sme->crypto.psk,
|
|
+ BRCMF_WSEC_MAX_PSK_LEN);
|
|
+ }
|
|
+ if (err)
|
|
+ goto done;
|
|
}
|
|
- if (err)
|
|
- goto done;
|
|
-
|
|
/* Join with specific BSSID and cached SSID
|
|
* If SSID is zero join based on BSSID only
|
|
*/
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
|
|
index d4492d02e4ea..7376f9f37d07 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
|
|
@@ -1281,6 +1281,10 @@ static s32 brcmf_p2p_abort_action_frame(struct brcmf_cfg80211_info *cfg)
|
|
brcmf_dbg(TRACE, "Enter\n");
|
|
|
|
vif = p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
|
|
+
|
|
+ if (!vif)
|
|
+ vif = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif;
|
|
+
|
|
err = brcmf_fil_bsscfg_data_set(vif->ifp, "actframe_abort", &int_val,
|
|
sizeof(s32));
|
|
if (err)
|
|
@@ -1826,6 +1830,7 @@ bool brcmf_p2p_send_action_frame(struct brcmf_cfg80211_info *cfg,
|
|
/* validate channel and p2p ies */
|
|
if (config_af_params.search_channel &&
|
|
IS_P2P_SOCIAL_CHANNEL(le32_to_cpu(af_params->channel)) &&
|
|
+ p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif &&
|
|
p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif->saved_ie.probe_req_ie_len) {
|
|
afx_hdl = &p2p->afx_hdl;
|
|
afx_hdl->peer_listen_chan = le32_to_cpu(af_params->channel);
|
|
--
|
|
2.44.0
|
|
|