|
@@ -2243,6 +2243,29 @@ static int ath10k_wmi_10_4_op_pull_mgmt_rx_ev(struct ath10k *ar,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static bool ath10k_wmi_rx_is_decrypted(struct ath10k *ar,
|
|
|
+ struct ieee80211_hdr *hdr)
|
|
|
+{
|
|
|
+ if (!ieee80211_has_protected(hdr->frame_control))
|
|
|
+ return false;
|
|
|
+
|
|
|
+ /* FW delivers WEP Shared Auth frame with Protected Bit set and
|
|
|
+ * encrypted payload. However in case of PMF it delivers decrypted
|
|
|
+ * frames with Protected Bit set.
|
|
|
+ */
|
|
|
+ if (ieee80211_is_auth(hdr->frame_control))
|
|
|
+ return false;
|
|
|
+
|
|
|
+ /* qca99x0 based FW delivers broadcast or multicast management frames
|
|
|
+ * (ex: group privacy action frames in mesh) as encrypted payload.
|
|
|
+ */
|
|
|
+ if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) &&
|
|
|
+ ar->hw_params.sw_decrypt_mcast_mgmt)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
int ath10k_wmi_event_mgmt_rx(struct ath10k *ar, struct sk_buff *skb)
|
|
|
{
|
|
|
struct wmi_mgmt_rx_ev_arg arg = {};
|
|
@@ -2329,11 +2352,7 @@ int ath10k_wmi_event_mgmt_rx(struct ath10k *ar, struct sk_buff *skb)
|
|
|
|
|
|
ath10k_wmi_handle_wep_reauth(ar, skb, status);
|
|
|
|
|
|
- /* FW delivers WEP Shared Auth frame with Protected Bit set and
|
|
|
- * encrypted payload. However in case of PMF it delivers decrypted
|
|
|
- * frames with Protected Bit set. */
|
|
|
- if (ieee80211_has_protected(hdr->frame_control) &&
|
|
|
- !ieee80211_is_auth(hdr->frame_control)) {
|
|
|
+ if (ath10k_wmi_rx_is_decrypted(ar, hdr)) {
|
|
|
status->flag |= RX_FLAG_DECRYPTED;
|
|
|
|
|
|
if (!ieee80211_is_action(hdr->frame_control) &&
|