diff mbox series

[v4,02/14] wifi: rtlwifi: rtl8192de: Fix low speed with WPA3-SAE

Message ID ed12ec17-ae6e-45fa-a72f-23e0a34654da@gmail.com
State Superseded
Headers show
Series wifi: rtlwifi: Add new rtl8192du driver | expand

Commit Message

Bitterblue Smith April 9, 2024, 7:52 p.m. UTC
Some (all?) management frames are incorrectly reported to mac80211 as
decrypted when actually the hardware did not decrypt them. This results
in speeds 3-5 times lower than expected, 20-30 Mbps instead of 100
Mbps.

Fix this by checking the encryption type field of the RX descriptor.
rtw88 does the same thing.

This fix was tested only with rtl8192du, which will use the same code.

Cc: stable@vger.kernel.org
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
---
v4:
 - Patch is new in v4.
---
 .../net/wireless/realtek/rtlwifi/rtl8192de/trx.c   |  5 ++---
 .../net/wireless/realtek/rtlwifi/rtl8192de/trx.h   | 14 ++++++++++++++
 2 files changed, 16 insertions(+), 3 deletions(-)

Comments

Stefan Lippers-Hollmann April 10, 2024, 4:53 a.m. UTC | #1
Hi

On 2024-04-09, Bitterblue Smith wrote:
> Some (all?) management frames are incorrectly reported to mac80211 as
> decrypted when actually the hardware did not decrypt them. This results
> in speeds 3-5 times lower than expected, 20-30 Mbps instead of 100
> Mbps.
>
> Fix this by checking the encryption type field of the RX descriptor.
> rtw88 does the same thing.
>
> This fix was tested only with rtl8192du, which will use the same code.
>
> Cc: stable@vger.kernel.org
> Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
> ---
> v4:
>  - Patch is new in v4.

This patch indeed provides a nice speedup with WPA3/ SAE on my
rtl8192du:

v3 of the patch series:

$ iperf3 -c <remote_server_ipv6>
Connecting to host <remote_server_ipv6>, port 5201
[  5] local <local_client_ipv6> port 45806 connected to <remote_server_ipv6> port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec  3.75 MBytes  31.4 Mbits/sec    0    241 KBytes
[  5]   1.00-2.00   sec  3.88 MBytes  32.5 Mbits/sec    0    411 KBytes
[  5]   2.00-3.00   sec  3.88 MBytes  32.5 Mbits/sec    0    580 KBytes
[  5]   3.00-4.00   sec  3.88 MBytes  32.5 Mbits/sec    0    720 KBytes
[  5]   4.00-5.00   sec  2.62 MBytes  22.0 Mbits/sec    0    846 KBytes
[  5]   5.00-6.00   sec  2.75 MBytes  23.1 Mbits/sec    0   1004 KBytes
[  5]   6.00-7.00   sec  2.62 MBytes  22.0 Mbits/sec    0   1.14 MBytes
[  5]   7.00-8.00   sec  2.75 MBytes  23.1 Mbits/sec    0   1.27 MBytes
[  5]   8.00-9.00   sec  2.62 MBytes  22.0 Mbits/sec    0   1.41 MBytes
[  5]   9.00-10.00  sec  2.75 MBytes  23.1 Mbits/sec    0   1.55 MBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  31.5 MBytes  26.4 Mbits/sec    0             sender
[  5]   0.00-10.00  sec  30.4 MBytes  25.5 Mbits/sec                  receiver

iperf Done.

$ iperf3 -c <remote_server_ipv6> --reverse
Connecting to host <remote_server_ipv6>, port 5201
Reverse mode, remote host <remote_server_ipv6> is sending
[  5] local <local_client_ipv6> port 57564 connected to <remote_server_ipv6> port 5201
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.00   sec  3.25 MBytes  27.2 Mbits/sec
[  5]   1.00-2.00   sec  2.50 MBytes  21.0 Mbits/sec
[  5]   2.00-3.00   sec  2.25 MBytes  18.9 Mbits/sec
[  5]   3.00-4.00   sec  2.25 MBytes  18.9 Mbits/sec
[  5]   4.00-5.00   sec  2.88 MBytes  24.1 Mbits/sec
[  5]   5.00-6.00   sec  2.88 MBytes  24.1 Mbits/sec
[  5]   6.00-7.00   sec  2.38 MBytes  19.9 Mbits/sec
[  5]   7.00-8.00   sec  2.62 MBytes  22.0 Mbits/sec
[  5]   8.00-9.00   sec  3.00 MBytes  25.2 Mbits/sec
[  5]   9.00-10.00  sec  3.00 MBytes  25.2 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.01  sec  29.9 MBytes  25.0 Mbits/sec    0             sender
[  5]   0.00-10.00  sec  27.0 MBytes  22.6 Mbits/sec                  receiver

iperf Done.

$ iperf3 -c <remote_server_ipv6> --bidir
Connecting to host <remote_server_ipv6>, port 5201
[  5] local <local_client_ipv6> port 44242 connected to <remote_server_ipv6> port 5201
[  7] local <local_client_ipv6> port 44252 connected to <remote_server_ipv6> port 5201
[ ID][Role] Interval           Transfer     Bitrate         Retr  Cwnd
[  5][TX-C]   0.00-1.00   sec  2.00 MBytes  16.8 Mbits/sec    0    109 KBytes
[  7][RX-C]   0.00-1.00   sec  1.00 MBytes  8.38 Mbits/sec
[  5][TX-C]   1.00-2.00   sec  2.75 MBytes  23.1 Mbits/sec    0    212 KBytes
[  7][RX-C]   1.00-2.00   sec   640 KBytes  5.24 Mbits/sec
[  5][TX-C]   2.00-3.00   sec  2.25 MBytes  18.9 Mbits/sec    0    315 KBytes
[  7][RX-C]   2.00-3.00   sec   640 KBytes  5.24 Mbits/sec
[  5][TX-C]   3.00-4.00   sec  3.12 MBytes  26.2 Mbits/sec    0    421 KBytes
[  7][RX-C]   3.00-4.00   sec   512 KBytes  4.19 Mbits/sec
[  5][TX-C]   4.00-5.00   sec  4.00 MBytes  33.6 Mbits/sec    0    551 KBytes
[  7][RX-C]   4.00-5.00   sec   640 KBytes  5.24 Mbits/sec
[  5][TX-C]   5.00-6.00   sec  2.50 MBytes  21.0 Mbits/sec    0    676 KBytes
[  7][RX-C]   5.00-6.00   sec   384 KBytes  3.15 Mbits/sec
[  5][TX-C]   6.00-7.00   sec  2.75 MBytes  23.1 Mbits/sec    0    802 KBytes
[  7][RX-C]   6.00-7.00   sec   384 KBytes  3.15 Mbits/sec
[  5][TX-C]   7.00-8.00   sec  2.62 MBytes  22.0 Mbits/sec    0    925 KBytes
[  7][RX-C]   7.00-8.00   sec   256 KBytes  2.10 Mbits/sec
[  5][TX-C]   8.00-9.00   sec  2.75 MBytes  23.1 Mbits/sec    0   1.05 MBytes
[  7][RX-C]   8.00-9.00   sec   512 KBytes  4.19 Mbits/sec
[  5][TX-C]   9.00-10.00  sec  2.62 MBytes  22.0 Mbits/sec    0   1.19 MBytes
[  7][RX-C]   9.00-10.00  sec   256 KBytes  2.10 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID][Role] Interval           Transfer     Bitrate         Retr
[  5][TX-C]   0.00-10.00  sec  27.4 MBytes  23.0 Mbits/sec    0             sender
[  5][TX-C]   0.00-10.00  sec  25.4 MBytes  21.3 Mbits/sec                  receiver
[  7][RX-C]   0.00-10.00  sec  6.12 MBytes  5.14 Mbits/sec    1             sender
[  7][RX-C]   0.00-10.00  sec  5.12 MBytes  4.30 Mbits/sec                  receiver

iperf Done.

***********************************************************************

v4 of the patch series:

$ iperf3 -c <remote_server_ipv6>
Connecting to host <remote_server_ipv6>, port 5201
[  5] local <local_client_ipv6> port 60528 connected to <remote_server_ipv6> port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec  13.1 MBytes   110 Mbits/sec    0    445 KBytes
[  5]   1.00-2.00   sec  13.2 MBytes   111 Mbits/sec    0    644 KBytes
[  5]   2.00-3.00   sec  11.9 MBytes  99.6 Mbits/sec    0    768 KBytes
[  5]   3.00-4.00   sec  11.5 MBytes  96.5 Mbits/sec    0    855 KBytes
[  5]   4.00-5.00   sec  12.0 MBytes   101 Mbits/sec    0    945 KBytes
[  5]   5.00-6.00   sec  11.4 MBytes  95.5 Mbits/sec    0    945 KBytes
[  5]   6.00-7.00   sec  11.6 MBytes  97.5 Mbits/sec    0    945 KBytes
[  5]   7.00-8.00   sec  11.2 MBytes  94.4 Mbits/sec    0    945 KBytes
[  5]   8.00-9.00   sec  13.0 MBytes   109 Mbits/sec    0    945 KBytes
[  5]   9.00-10.00  sec  12.0 MBytes   101 Mbits/sec    0   1000 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec   121 MBytes   101 Mbits/sec    0             sender
[  5]   0.00-10.03  sec   118 MBytes  98.3 Mbits/sec                  receiver

iperf Done.

$ iperf3 -c <remote_server_ipv6> --reverse
Connecting to host <remote_server_ipv6>, port 5201
Reverse mode, remote host <remote_server_ipv6> is sending
[  5] local <local_client_ipv6> port 59562 connected to <remote_server_ipv6> port 5201
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.00   sec  16.0 MBytes   134 Mbits/sec
[  5]   1.00-2.00   sec  14.9 MBytes   125 Mbits/sec
[  5]   2.00-3.00   sec  19.2 MBytes   162 Mbits/sec
[  5]   3.00-4.00   sec  14.9 MBytes   125 Mbits/sec
[  5]   4.00-5.00   sec  18.2 MBytes   153 Mbits/sec
[  5]   5.00-6.00   sec  18.9 MBytes   158 Mbits/sec
[  5]   6.00-7.00   sec  17.8 MBytes   149 Mbits/sec
[  5]   7.00-8.00   sec  17.5 MBytes   147 Mbits/sec
[  5]   8.00-9.00   sec  15.1 MBytes   127 Mbits/sec
[  5]   9.00-10.00  sec  14.8 MBytes   124 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.01  sec   171 MBytes   144 Mbits/sec    1             sender
[  5]   0.00-10.00  sec   167 MBytes   140 Mbits/sec                  receiver

iperf Done

$ iperf3 -c <remote_server_ipv6> --bidir
Connecting to host <remote_server_ipv6>, port 5201
[  5] local <local_client_ipv6> port 34312 connected to <remote_server_ipv6> port 5201
[  7] local <local_client_ipv6> port 34318 connected to <remote_server_ipv6> port 5201
[ ID][Role] Interval           Transfer     Bitrate         Retr  Cwnd
[  5][TX-C]   0.00-1.00   sec  8.25 MBytes  69.1 Mbits/sec    0    395 KBytes
[  7][RX-C]   0.00-1.00   sec  7.00 MBytes  58.7 Mbits/sec
[  5][TX-C]   1.00-2.00   sec  3.38 MBytes  28.3 Mbits/sec    0    420 KBytes
[  7][RX-C]   1.00-2.00   sec  14.6 MBytes   123 Mbits/sec
[  5][TX-C]   2.00-3.00   sec  2.88 MBytes  24.1 Mbits/sec    0    473 KBytes
[  7][RX-C]   2.00-3.00   sec  15.4 MBytes   129 Mbits/sec
[  5][TX-C]   3.00-4.00   sec  1.12 MBytes  9.44 Mbits/sec    0    531 KBytes
[  7][RX-C]   3.00-4.00   sec  10.9 MBytes  91.2 Mbits/sec
[  5][TX-C]   4.00-5.00   sec  1.12 MBytes  9.44 Mbits/sec    0    558 KBytes
[  7][RX-C]   4.00-5.00   sec  10.8 MBytes  90.2 Mbits/sec
[  5][TX-C]   5.00-6.00   sec  1.38 MBytes  11.5 Mbits/sec    0    600 KBytes
[  7][RX-C]   5.00-6.00   sec  3.62 MBytes  30.4 Mbits/sec
[  5][TX-C]   6.00-7.00   sec  2.75 MBytes  23.1 Mbits/sec    0    718 KBytes
[  7][RX-C]   6.00-7.00   sec  12.2 MBytes   103 Mbits/sec
[  5][TX-C]   7.00-8.00   sec  2.75 MBytes  23.1 Mbits/sec    0    853 KBytes
[  7][RX-C]   7.00-8.00   sec  11.1 MBytes  93.3 Mbits/sec
[  5][TX-C]   8.00-9.00   sec  2.75 MBytes  23.1 Mbits/sec    0   1.03 MBytes
[  7][RX-C]   8.00-9.00   sec  13.6 MBytes   114 Mbits/sec
[  5][TX-C]   9.00-10.00  sec  4.12 MBytes  34.6 Mbits/sec    0   1.12 MBytes
[  7][RX-C]   9.00-10.00  sec  16.6 MBytes   139 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID][Role] Interval           Transfer     Bitrate         Retr
[  5][TX-C]   0.00-10.00  sec  30.5 MBytes  25.6 Mbits/sec    0             sender
[  5][TX-C]   0.00-10.04  sec  27.1 MBytes  22.7 Mbits/sec                  receiver
[  7][RX-C]   0.00-10.00  sec   119 MBytes  99.7 Mbits/sec   10             sender
[  7][RX-C]   0.00-10.04  sec   116 MBytes  96.8 Mbits/sec                  receiver

iperf Done.


Regards
	Stefan Lippers-Hollmann
Ping-Ke Shih April 12, 2024, 6:14 a.m. UTC | #2
Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote:

> Some (all?) management frames are incorrectly reported to mac80211 as
> decrypted when actually the hardware did not decrypt them. This results
> in speeds 3-5 times lower than expected, 20-30 Mbps instead of 100
> Mbps.
> 
> Fix this by checking the encryption type field of the RX descriptor.
> rtw88 does the same thing.
> 
> This fix was tested only with rtl8192du, which will use the same code.
> 
> Cc: stable@vger.kernel.org
> Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>

Acked-by: Ping-Ke Shih <pkshih@realtek.com>
diff mbox series

Patch

diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.c
index 192982ec8152..30b262c3f6d0 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.c
@@ -413,7 +413,8 @@  bool rtl92de_rx_query_desc(struct ieee80211_hw *hw,	struct rtl_stats *stats,
 	stats->icv = (u16)get_rx_desc_icv(pdesc);
 	stats->crc = (u16)get_rx_desc_crc32(pdesc);
 	stats->hwerror = (stats->crc | stats->icv);
-	stats->decrypted = !get_rx_desc_swdec(pdesc);
+	stats->decrypted = !get_rx_desc_swdec(pdesc) &&
+			   get_rx_desc_enc_type(pdesc) != RX_DESC_ENC_NONE;
 	stats->rate = (u8)get_rx_desc_rxmcs(pdesc);
 	stats->shortpreamble = (u16)get_rx_desc_splcp(pdesc);
 	stats->isampdu = (bool)(get_rx_desc_paggr(pdesc) == 1);
@@ -426,8 +427,6 @@  bool rtl92de_rx_query_desc(struct ieee80211_hw *hw,	struct rtl_stats *stats,
 	rx_status->band = hw->conf.chandef.chan->band;
 	if (get_rx_desc_crc32(pdesc))
 		rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
-	if (!get_rx_desc_swdec(pdesc))
-		rx_status->flag |= RX_FLAG_DECRYPTED;
 	if (get_rx_desc_bw(pdesc))
 		rx_status->bw = RATE_INFO_BW_40;
 	if (get_rx_desc_rxht(pdesc))
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.h b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.h
index 2992668c156c..f189ee2d9be2 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.h
@@ -14,6 +14,15 @@ 
 #define USB_HWDESC_HEADER_LEN			32
 #define CRCLENGTH				4
 
+enum rtl92d_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,
+};
+
 /* macros to read/write various fields in RX or TX descriptors */
 
 static inline void set_tx_desc_pkt_size(__le32 *__pdesc, u32 __val)
@@ -246,6 +255,11 @@  static inline u32 get_rx_desc_drv_info_size(__le32 *__pdesc)
 	return le32_get_bits(*__pdesc, GENMASK(19, 16));
 }
 
+static inline u32 get_rx_desc_enc_type(__le32 *__pdesc)
+{
+	return le32_get_bits(*__pdesc, GENMASK(22, 20));
+}
+
 static inline u32 get_rx_desc_shift(__le32 *__pdesc)
 {
 	return le32_get_bits(*__pdesc, GENMASK(25, 24));