]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtl8xxxu: enable MFP support
authorMartin Kaistra <martin.kaistra@linutronix.de>
Thu, 14 Mar 2024 16:48:50 +0000 (17:48 +0100)
committerPing-Ke Shih <pkshih@realtek.com>
Wed, 20 Mar 2024 02:00:19 +0000 (10:00 +0800)
In order to connect to networks which require 802.11w, add the
MFP_CAPABLE flag and let mac80211 do the actual crypto in software.

When a robust management frames is received, rx_dec->swdec is not set,
even though the HW did not decrypt it. Extend the check and don't set
RX_FLAG_DECRYPTED for these frames in order to use SW decryption.

Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://msgid.link/20240314164850.86432-1-martin.kaistra@linutronix.de
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c

index 4a49f8f9d80f2769a56dd56591a7373ea162028f..870bd952f5902029a401d58173149833b309f923 100644 (file)
@@ -6473,7 +6473,9 @@ int rtl8xxxu_parse_rxdesc16(struct rtl8xxxu_priv *priv, struct sk_buff *skb)
                        rx_status->mactime = rx_desc->tsfl;
                        rx_status->flag |= RX_FLAG_MACTIME_START;
 
-                       if (!rx_desc->swdec)
+                       if (!rx_desc->swdec &&
+                           !(_ieee80211_is_robust_mgmt_frame(hdr) &&
+                             ieee80211_has_protected(hdr->frame_control)))
                                rx_status->flag |= RX_FLAG_DECRYPTED;
                        if (rx_desc->crc32)
                                rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
@@ -6578,7 +6580,9 @@ int rtl8xxxu_parse_rxdesc24(struct rtl8xxxu_priv *priv, struct sk_buff *skb)
                        rx_status->mactime = rx_desc->tsfl;
                        rx_status->flag |= RX_FLAG_MACTIME_START;
 
-                       if (!rx_desc->swdec)
+                       if (!rx_desc->swdec &&
+                           !(_ieee80211_is_robust_mgmt_frame(hdr) &&
+                             ieee80211_has_protected(hdr->frame_control)))
                                rx_status->flag |= RX_FLAG_DECRYPTED;
                        if (rx_desc->crc32)
                                rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
@@ -7998,6 +8002,7 @@ static int rtl8xxxu_probe(struct usb_interface *interface,
        ieee80211_hw_set(hw, HAS_RATE_CONTROL);
        ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
        ieee80211_hw_set(hw, AMPDU_AGGREGATION);
+       ieee80211_hw_set(hw, MFP_CAPABLE);
 
        wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);