From 4009d6184a38cbc6a7c5bd842913c169b139da7c Mon Sep 17 00:00:00 2001 From: Pradeep Kumar Chitrapu 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 --- 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