From: Chung-Hsien Hsu <[email protected]>

With 4-way handshake offload for 802.1X authentication, a port
authorized event should be sent to user space after the completion of
4-way handshake. It is used to indicate that a connection is authorized
and 802.1X authentication is no longer required.

Signed-off-by: Chung-Hsien Hsu <[email protected]>
Signed-off-by: Chi-Hsien Lin <[email protected]>
---
 .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 23 +++++++++++++++-------
 1 file changed, 16 insertions(+), 7 deletions(-)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c 
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
index 35301237d435..ad0d775a1244 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
@@ -5266,10 +5266,13 @@ static bool brcmf_is_linkup(struct brcmf_cfg80211_vif 
*vif,
        u32 event = e->event_code;
        u32 status = e->status;
 
-       if (vif->profile.use_fwsup == BRCMF_PROFILE_FWSUP_PSK &&
-           event == BRCMF_E_PSK_SUP &&
-           status == BRCMF_E_STATUS_FWSUP_COMPLETED)
+       if (event == BRCMF_E_PSK_SUP &&
+           status == BRCMF_E_STATUS_FWSUP_COMPLETED) {
                set_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &vif->sme_state);
+               if (vif->profile.use_fwsup == BRCMF_PROFILE_FWSUP_1X)
+                       return true;
+       }
+
        if (event == BRCMF_E_SET_SSID && status == BRCMF_E_STATUS_SUCCESS) {
                brcmf_dbg(CONN, "Processing set ssid\n");
                memcpy(vif->profile.bssid, e->addr, ETH_ALEN);
@@ -5280,11 +5283,10 @@ static bool brcmf_is_linkup(struct brcmf_cfg80211_vif 
*vif,
        }
 
        if (test_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &vif->sme_state) &&
-           test_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS, &vif->sme_state)) {
-               clear_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &vif->sme_state);
-               clear_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS, &vif->sme_state);
+           test_and_clear_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS,
+                              &vif->sme_state))
                return true;
-       }
+
        return false;
 }
 
@@ -5501,6 +5503,13 @@ brcmf_bss_connect_done(struct brcmf_cfg80211_info *cfg,
                brcmf_dbg(CONN, "Report connect result - connection %s\n",
                          completed ? "succeeded" : "failed");
        }
+
+       if (test_and_clear_bit(BRCMF_VIF_STATUS_EAP_SUCCESS,
+                              &ifp->vif->sme_state) &&
+           profile->use_fwsup == BRCMF_PROFILE_FWSUP_1X) {
+               cfg80211_port_authorized(ndev, profile->bssid, GFP_KERNEL);
+               brcmf_dbg(CONN, "Report port authorized\n");
+       }
        brcmf_dbg(TRACE, "Exit\n");
        return 0;
 }
-- 
2.1.0

Reply via email to