mirror of
https://github.com/armbian/build
synced 2025-09-24 19:47:06 +07:00
84 lines
2.8 KiB
Diff
84 lines
2.8 KiB
Diff
From 2b58c732ab3d125c6f15d235aea37e9a3a4c9707 Mon Sep 17 00:00:00 2001
|
|
From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
|
|
Date: Sun, 3 Mar 2019 20:30:32 -0600
|
|
Subject: [PATCH 026/179] brcmfmac: set authorized flag in ROAM event for PMK
|
|
caching
|
|
|
|
With 4-way handshake offload for 802.1X authentication, the authorized
|
|
flag in ROAM event should be set for a successful roaming with PMK
|
|
caching. The roaming is identified by checking the existence of PMKID
|
|
within the (Re)Association Request frame with this patch.
|
|
|
|
Signed-off-by: Chung-Hsien Hsu <stanley.hsu@cypress.com>
|
|
Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
|
|
---
|
|
.../broadcom/brcm80211/brcmfmac/cfg80211.c | 45 ++++++++++++++++++-
|
|
1 file changed, 44 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
|
index 35cbee081322..e85f7e138fb4 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
|
@@ -6024,6 +6024,47 @@ static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg,
|
|
return err;
|
|
}
|
|
|
|
+static bool
|
|
+brcmf_has_pmkid(const u8 *parse, u32 len)
|
|
+{
|
|
+ const struct brcmf_tlv *rsn_ie;
|
|
+ const u8 *ie;
|
|
+ u32 ie_len;
|
|
+ u32 offset;
|
|
+ u16 count;
|
|
+
|
|
+ rsn_ie = brcmf_parse_tlvs(parse, len, WLAN_EID_RSN);
|
|
+ if (!rsn_ie)
|
|
+ goto done;
|
|
+ ie = (const u8 *)rsn_ie;
|
|
+ ie_len = rsn_ie->len + TLV_HDR_LEN;
|
|
+ /* Skip group data cipher suite */
|
|
+ offset = TLV_HDR_LEN + WPA_IE_VERSION_LEN + WPA_IE_MIN_OUI_LEN;
|
|
+ if (offset + WPA_IE_SUITE_COUNT_LEN >= ie_len)
|
|
+ goto done;
|
|
+ /* Skip pairwise cipher suite(s) */
|
|
+ count = ie[offset] + (ie[offset + 1] << 8);
|
|
+ offset += WPA_IE_SUITE_COUNT_LEN + (count * WPA_IE_MIN_OUI_LEN);
|
|
+ if (offset + WPA_IE_SUITE_COUNT_LEN >= ie_len)
|
|
+ goto done;
|
|
+ /* Skip auth key management suite(s) */
|
|
+ count = ie[offset] + (ie[offset + 1] << 8);
|
|
+ offset += WPA_IE_SUITE_COUNT_LEN + (count * WPA_IE_MIN_OUI_LEN);
|
|
+ if (offset + RSN_CAP_LEN >= ie_len)
|
|
+ goto done;
|
|
+ /* Skip rsn capabilities */
|
|
+ offset += RSN_CAP_LEN;
|
|
+ if (offset + RSN_PMKID_COUNT_LEN > ie_len)
|
|
+ goto done;
|
|
+ /* Extract PMKID count */
|
|
+ count = ie[offset] + (ie[offset + 1] << 8);
|
|
+ if (count)
|
|
+ return true;
|
|
+
|
|
+done:
|
|
+ return false;
|
|
+}
|
|
+
|
|
static s32
|
|
brcmf_bss_roaming_done(struct brcmf_cfg80211_info *cfg,
|
|
struct net_device *ndev,
|
|
@@ -6084,7 +6125,9 @@ brcmf_bss_roaming_done(struct brcmf_cfg80211_info *cfg,
|
|
roam_info.resp_ie = conn_info->resp_ie;
|
|
roam_info.resp_ie_len = conn_info->resp_ie_len;
|
|
|
|
- if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_1X && profile->is_ft)
|
|
+ if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_1X &&
|
|
+ (brcmf_has_pmkid(roam_info.req_ie, roam_info.req_ie_len) ||
|
|
+ profile->is_ft))
|
|
roam_info.authorized = true;
|
|
|
|
cfg80211_roamed(ndev, &roam_info, GFP_KERNEL);
|
|
--
|
|
2.17.1
|
|
|