ath11k: Clear auth flag only for actual association in security mode
authorRameshkumar Sundaram <quic_ramess@quicinc.com>
Mon, 25 Oct 2021 16:03:06 +0000 (21:33 +0530)
committerKalle Valo <kvalo@codeaurora.org>
Fri, 12 Nov 2021 08:01:48 +0000 (10:01 +0200)
AUTH flag is needed when peer assoc command is sent from host in
security mode for non-assoc cases. Firmware will handle AUTH flag
when client is associating as AUTH flag will be set after key exchange.
For internally provided peer assoc commands from host, there won't be
any key exchange, so AUTH flag is expected to be set in host.

Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.4.0.1-01838-QCAHKSWPL_SILICONZ-1

Co-developed-by: Lavanya Suresh <lavaks@codeaurora.org>
Signed-off-by: Lavanya Suresh <lavaks@codeaurora.org>
Signed-off-by: Rameshkumar Sundaram <quic_ramess@quicinc.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/1635177786-20854-1-git-send-email-quic_ramess@quicinc.com
drivers/net/wireless/ath/ath11k/mac.c
drivers/net/wireless/ath/ath11k/wmi.c
drivers/net/wireless/ath/ath11k/wmi.h

index 89810b202a391a6d122ef6880f0205605499bef9..a62c63ffb3cf4b8b42ca99d220fb7c92f5449306 100644 (file)
@@ -2495,6 +2495,7 @@ static void ath11k_bss_assoc(struct ieee80211_hw *hw,
 
        rcu_read_unlock();
 
+       peer_arg.is_assoc = true;
        ret = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
        if (ret) {
                ath11k_warn(ar->ab, "failed to run peer assoc for %pM vdev %i: %d\n",
@@ -3772,6 +3773,7 @@ static int ath11k_station_assoc(struct ath11k *ar,
 
        ath11k_peer_assoc_prepare(ar, vif, sta, &peer_arg, reassoc);
 
+       peer_arg.is_assoc = true;
        ret = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
        if (ret) {
                ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
@@ -3983,6 +3985,7 @@ static void ath11k_sta_rc_update_wk(struct work_struct *wk)
                        ath11k_peer_assoc_prepare(ar, arvif->vif, sta,
                                                  &peer_arg, true);
 
+                       peer_arg.is_assoc = false;
                        err = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
                        if (err)
                                ath11k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
index b9bfe0407cd7c633cfab6d23d45e696e8eb8f940..44057ccd0140ffa2a3eeda1a0fc381bd6e338fcc 100644 (file)
@@ -1763,7 +1763,7 @@ ath11k_wmi_copy_peer_flags(struct wmi_peer_assoc_complete_cmd *cmd,
                cmd->peer_flags |= WMI_PEER_AUTH;
        if (param->need_ptk_4_way) {
                cmd->peer_flags |= WMI_PEER_NEED_PTK_4_WAY;
-               if (!hw_crypto_disabled)
+               if (!hw_crypto_disabled && param->is_assoc)
                        cmd->peer_flags &= ~WMI_PEER_AUTH;
        }
        if (param->need_gtk_2_way)
index 93e2992db86245ad58fc1d65e1bf8a25205ca3d3..81d12405be5412faae8ee25e3e56971ef2bd87de 100644 (file)
@@ -3617,6 +3617,7 @@ struct peer_assoc_params {
        u32 peer_he_tx_mcs_set[WMI_HOST_MAX_HE_RATE_SET];
        bool twt_responder;
        bool twt_requester;
+       bool is_assoc;
        struct ath11k_ppe_threshold peer_ppet;
 };