wifi: rtl8xxxu: enable MFP support with security flag of RX descriptor
authorMartin Kaistra <martin.kaistra@linutronix.de>
Thu, 18 Apr 2024 07:18:13 +0000 (09:18 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 27 Jun 2024 11:49:14 +0000 (13:49 +0200)
[ Upstream commit cbfbb4ddbc8503478e0a138f9a31f61686cc5f11 ]

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 frame 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.

Use the security flag in the RX descriptor for this purpose, like it is
done in the rtw88 driver.

Cc: stable@vger.kernel.org
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://msgid.link/20240418071813.1883174-3-martin.kaistra@linutronix.de
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c

index 4695fb4e2d2dbaf0ecd78686c0f963205e5d33e5..af541e52e683b931913067dbd4d085b64f11df15 100644 (file)
@@ -121,6 +121,15 @@ enum rtl8xxxu_rx_type {
        RX_TYPE_ERROR = -1
 };
 
+enum rtl8xxxu_rx_desc_enc {
+       RX_DESC_ENC_NONE        = 0,
+       RX_DESC_ENC_WEP40       = 1,
+       RX_DESC_ENC_TKIP_WO_MIC = 2,
+       RX_DESC_ENC_TKIP_MIC    = 3,
+       RX_DESC_ENC_AES         = 4,
+       RX_DESC_ENC_WEP104      = 5,
+};
+
 struct rtl8xxxu_rxdesc16 {
 #ifdef __LITTLE_ENDIAN
        u32 pktlen:14;
index 5422f8da29e616d19874a27161e38e789634aa69..6e47dde938909264e86cd2e1cc8e6b7192823379 100644 (file)
@@ -6319,7 +6319,8 @@ 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 &&
+                           rx_desc->security != RX_DESC_ENC_NONE)
                                rx_status->flag |= RX_FLAG_DECRYPTED;
                        if (rx_desc->crc32)
                                rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
@@ -6419,7 +6420,8 @@ 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 &&
+                           rx_desc->security != RX_DESC_ENC_NONE)
                                rx_status->flag |= RX_FLAG_DECRYPTED;
                        if (rx_desc->crc32)
                                rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
@@ -7654,6 +7656,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);