mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-12-20 10:51:27 +00:00
61 lines
1.6 KiB
Diff
61 lines
1.6 KiB
Diff
From: Paul Zhang <quic_paulz@quicinc.com>
|
|
Subject: [PATCH v1] cfg80211: Fix bitrates overflow issue
|
|
|
|
When invoking function cfg80211_calculate_bitrate_eht about
|
|
(320 MHz, EHT-MCS 13, EHT-NSS 2, EHT-GI 0), which means the
|
|
parameters as flags: 0x80, bw: 7, mcs: 13, eht_gi: 0, nss: 2,
|
|
this formula (result * rate->nss) will overflow and causes
|
|
the returned bitrate to be 3959 when it should be 57646.
|
|
|
|
Here is the explanation:
|
|
u64 tmp;
|
|
u32 result;
|
|
…
|
|
/* tmp = result = 4 * rates_996[0]
|
|
* = 4 * 480388888 = 0x72889c60
|
|
*/
|
|
tmp = result;
|
|
|
|
/* tmp = 0x72889c60 * 6144 = 0xabccea90000 */
|
|
tmp *= SCALE;
|
|
|
|
/* tmp = 0xabccea90000 / mcs_divisors[13]
|
|
* = 0xabccea90000 / 5120 = 0x8970bba6
|
|
*/
|
|
do_div(tmp, mcs_divisors[rate->mcs]);
|
|
|
|
/* result = 0x8970bba6 */
|
|
result = tmp;
|
|
|
|
/* normally (result * rate->nss) = 0x8970bba6 * 2 = 0x112e1774c,
|
|
* but since result is u32, (result * rate->nss) = 0x12e1774c,
|
|
* overflow happens and it loses the highest bit.
|
|
* Then result = 0x12e1774c / 8 = 39595753,
|
|
*/
|
|
result = (result * rate->nss) / 8;
|
|
|
|
Signed-off-by: Paul Zhang <quic_paulz@quicinc.com>
|
|
---
|
|
net/wireless/util.c | 6 ++++--
|
|
1 file changed, 4 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/net/wireless/util.c b/net/wireless/util.c
|
|
index f09d528..59d4947 100644
|
|
--- a/net/wireless/util.c
|
|
+++ b/net/wireless/util.c
|
|
@@ -1557,10 +1557,12 @@ static u32 cfg80211_calculate_bitrate_eht(struct rate_info *rate)
|
|
tmp = result;
|
|
tmp *= SCALE;
|
|
do_div(tmp, mcs_divisors[rate->mcs]);
|
|
- result = tmp;
|
|
|
|
/* and take NSS */
|
|
- result = (result * rate->nss) / 8;
|
|
+ tmp *= rate->nss;
|
|
+ do_div(tmp, 8);
|
|
+
|
|
+ result = tmp;
|
|
|
|
return result / 10000;
|
|
}
|