mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-12-20 02:43:38 +00:00
126 lines
4.1 KiB
Diff
126 lines
4.1 KiB
Diff
From 4009d6184a38cbc6a7c5bd842913c169b139da7c Mon Sep 17 00:00:00 2001
|
|
From: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
|
|
Date: Wed, 23 Feb 2022 11:58:52 -0800
|
|
Subject: [PATCH] hostapd: 11BE bringup Fixes
|
|
|
|
- Fix EHT MCS rates length calculation.
|
|
- Process PPE Thresholds only if there are additional bytes
|
|
available in EHT Caps after MAC CAPS. PHY CAPS and
|
|
MCS rates. This is temporary workaround to ignore
|
|
other driversnot adding PPE thresholds in EHT CAP
|
|
inspite of setting eht_ppe_threshlds_present bit in
|
|
EHT PHY CAPS.
|
|
- Fix ppe threshold size computation
|
|
|
|
Signed-off-by: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
|
|
---
|
|
src/ap/ieee802_11_eht.c | 33 ++++++++++++++++++---------------
|
|
src/common/ieee802_11_defs.h | 13 +++++++------
|
|
2 files changed, 25 insertions(+), 21 deletions(-)
|
|
|
|
--- a/src/ap/ieee802_11_eht.c
|
|
+++ b/src/ap/ieee802_11_eht.c
|
|
@@ -24,29 +24,29 @@
|
|
|
|
static u8 ieee80211_eht_ppet_size(const u8 *ppe_thres, const u8 *phy_cap_info)
|
|
{
|
|
- u8 sz = 0, ru;
|
|
+ u8 sz = 0, nss, num_nss = 0;
|
|
+ u32 ru;
|
|
|
|
if ((phy_cap_info[EHT_PHYCAP_PPE_THRESHOLD_PRESENT_IDX] &
|
|
EHT_PHYCAP_PPE_THRESHOLD_PRESENT) == 0)
|
|
return 0;
|
|
|
|
- ru = (ppe_thres[0] &
|
|
- (EHT_PPE_THRES_RU_INDEX_MASK << EHT_PPE_THRES_RU_INDEX_SHIFT));
|
|
+ ru = (u32) ppe_thres[0];
|
|
+ ru = (ru & EHT_PPE_THRES_RU_INDEX_MASK) >> EHT_PPE_THRES_RU_INDEX_SHIFT;
|
|
while (ru) {
|
|
if (ru & 0x1)
|
|
sz++;
|
|
ru >>= 1;
|
|
}
|
|
|
|
- ru = (ppe_thres[1] & (EHT_PPE_THRES_RU_INDEX_MASK >>
|
|
- (8 - EHT_PPE_THRES_RU_INDEX_SHIFT)));
|
|
- while (ru) {
|
|
- if (ru & 0x1)
|
|
- sz++;
|
|
- ru >>= 1;
|
|
+ nss = (ppe_thres[0] & EHT_PPE_THRES_NSS_MASK) >> EHT_PPE_THRES_NSS_SHIFT;
|
|
+ while (nss) {
|
|
+ if (nss & 0x1)
|
|
+ num_nss++;
|
|
+ nss >>= 1;
|
|
}
|
|
|
|
- sz *= (1 + (ppe_thres[0] & EHT_PPE_THRES_NSS_MASK));
|
|
+ sz = sz * (1 + num_nss);
|
|
sz = (sz * 6) + 9;
|
|
if (sz % 8)
|
|
sz += 8;
|
|
@@ -246,6 +246,7 @@ static int check_valid_eht_mcs(struct ho
|
|
{
|
|
struct hostapd_hw_modes *mode;
|
|
const u8 *ap_mcs, *sta_mcs;
|
|
+ u8 len;
|
|
|
|
mode = hapd->iface->current_mode;
|
|
if (!mode)
|
|
@@ -254,9 +255,9 @@ static int check_valid_eht_mcs(struct ho
|
|
ap_mcs = mode->eht_capab[opmode].mcs;
|
|
sta_mcs = ((const struct ieee80211_eht_capabilities *) sta_eht_capab)->optional;
|
|
|
|
- if (ieee80211_eht_mcs_set_size(mode->he_capab[opmode].phy_cap,
|
|
- mode->eht_capab[opmode].phy_cap) ==
|
|
- EHT_PHYCAP_MCS_NSS_LEN_20MHZ_ONLY) {
|
|
+ len = ieee80211_eht_mcs_set_size(mode->he_capab[opmode].phy_cap,
|
|
+ mode->eht_capab[opmode].phy_cap);
|
|
+ if (len == EHT_PHYCAP_MCS_NSS_LEN_20MHZ_ONLY) {
|
|
return check_valid_eht_mcs_nss(hapd, ap_mcs, sta_mcs, 1,
|
|
EHT_PHYCAP_MCS_NSS_LEN_20MHZ_ONLY);
|
|
|
|
@@ -274,7 +275,7 @@ static int check_valid_eht_mcs(struct ho
|
|
}
|
|
|
|
return check_valid_eht_mcs_nss(hapd, ap_mcs, sta_mcs, mcs_count,
|
|
- EHT_PHYCAP_MCS_NSS_LEN_20MHZ_PLUS);
|
|
+ len);
|
|
}
|
|
|
|
return 0;
|
|
@@ -298,7 +299,9 @@ static int ieee80211_invalid_eht_cap_siz
|
|
if (len < cap_len)
|
|
return 1;
|
|
|
|
- cap_len += ieee80211_eht_ppet_size(&eht_cap[cap_len], cap->phy_cap);
|
|
+ if ((cap->phy_cap[EHT_PHYCAP_PPE_THRESHOLD_PRESENT_IDX] &
|
|
+ EHT_PHYCAP_PPE_THRESHOLD_PRESENT) == 0 && len > cap_len)
|
|
+ cap_len += ieee80211_eht_ppet_size(&eht_cap[cap_len], cap->phy_cap);
|
|
|
|
return (len != cap_len);
|
|
}
|
|
--- a/src/common/ieee802_11_defs.h
|
|
+++ b/src/common/ieee802_11_defs.h
|
|
@@ -2511,14 +2511,14 @@ struct ieee80211_eht_operation {
|
|
#define EHT_PHYCAP_MCS_NSS_LEN_20MHZ_ONLY 4
|
|
#define EHT_PHYCAP_MCS_NSS_LEN_20MHZ_PLUS 3
|
|
|
|
-/* IEEE P802.11be/D1.0, May 2021, 9.4.2.295c.5 EHT PPE Thresholds field */
|
|
+/* IEEE P802.11be/D1.4, May 2021, 9.4.2.295c.5 EHT PPE Thresholds field */
|
|
#define EHT_PPE_THRES_NSS_SHIFT 0
|
|
#define EHT_PPE_THRES_NSS_MASK ((u8) (BIT(0) | BIT(1) | \
|
|
- BIT(2) | BIT(3)))
|
|
+ BIT(2) | BIT(3)))
|
|
#define EHT_PPE_THRES_RU_INDEX_SHIFT 4
|
|
-#define EHT_PPE_THRES_RU_INDEX_MASK ((u8) (BIT(0) | BIT(1) | \
|
|
- BIT(2) | BIT(3) | \
|
|
- BIT(4)))
|
|
+#define EHT_PPE_THRES_RU_INDEX_MASK ((u8) (BIT(4) | BIT(5) | \
|
|
+ BIT(6) | BIT(7) | \
|
|
+ BIT(8)))
|
|
|
|
#define EHT_OPERATION_CHANNEL_WIDTH_40MHZ 1
|
|
#define EHT_OPERATION_CHANNEL_WIDTH_80MHZ 2
|