From: Aloka Dixit Date: Mon, 24 Jul 2023 23:16:23 +0000 (-0700) Subject: FILS: Move maximum NSS determination to a new function X-Git-Tag: hostap_2_11~957 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dcf66d2f4255452f969cd642fee0c1cdd08aaa49;p=thirdparty%2Fhostap.git FILS: Move maximum NSS determination to a new function Create a separate function to set the maximum number of spatial streams in FILS discovery frames. Signed-off-by: Aloka Dixit --- diff --git a/src/ap/beacon.c b/src/ap/beacon.c index 4a0e552ec..42fb3a7b8 100644 --- a/src/ap/beacon.c +++ b/src/ap/beacon.c @@ -1394,6 +1394,70 @@ static u16 hostapd_gen_fils_discovery_phy_index(struct hostapd_data *hapd) } +static u16 hostapd_gen_fils_discovery_nss(struct hostapd_hw_modes *mode, + u16 phy_index, u8 mcs_nss_size) +{ + u16 nss = 0; + + if (mode && phy_index == FD_CAP_PHY_INDEX_HE) { + const u8 *he_mcs = mode->he_capab[IEEE80211_MODE_AP].mcs; + int i; + u16 mcs[6]; + + os_memset(mcs, 0xff, 6 * sizeof(u16)); + + if (mcs_nss_size == 4) { + mcs[0] = WPA_GET_LE16(&he_mcs[0]); + mcs[1] = WPA_GET_LE16(&he_mcs[2]); + } + + if (mcs_nss_size == 8) { + mcs[2] = WPA_GET_LE16(&he_mcs[4]); + mcs[3] = WPA_GET_LE16(&he_mcs[6]); + } + + if (mcs_nss_size == 12) { + mcs[4] = WPA_GET_LE16(&he_mcs[8]); + mcs[5] = WPA_GET_LE16(&he_mcs[10]); + } + + for (i = 0; i < HE_NSS_MAX_STREAMS; i++) { + u16 nss_mask = 0x3 << (i * 2); + + /* + * If NSS values supported by RX and TX are different + * then choose the smaller of the two as the maximum + * supported NSS as that is the value supported by + * both RX and TX. + */ + if (mcs_nss_size == 4 && + (((mcs[0] & nss_mask) == nss_mask) || + ((mcs[1] & nss_mask) == nss_mask))) + continue; + + if (mcs_nss_size == 8 && + (((mcs[2] & nss_mask) == nss_mask) || + ((mcs[3] & nss_mask) == nss_mask))) + continue; + + if (mcs_nss_size == 12 && + (((mcs[4] & nss_mask) == nss_mask) || + ((mcs[5] & nss_mask) == nss_mask))) + continue; + + nss++; + } + } + + if (nss > 4) + return FD_CAP_NSS_5_8 << FD_CAP_NSS_SHIFT; + if (nss) + return (nss - 1) << FD_CAP_NSS_SHIFT; + + return 0; +} + + static u16 hostapd_fils_discovery_cap(struct hostapd_data *hapd) { u16 cap_info, phy_index; @@ -1449,62 +1513,8 @@ static u16 hostapd_fils_discovery_cap(struct hostapd_data *hapd) phy_index = hostapd_gen_fils_discovery_phy_index(hapd); cap_info |= phy_index << FD_CAP_PHY_INDEX_SHIFT; cap_info |= chwidth << FD_CAP_BSS_CHWIDTH_SHIFT; - - if (mode && phy_index == FD_CAP_PHY_INDEX_HE) { - const u8 *he_mcs = mode->he_capab[IEEE80211_MODE_AP].mcs; - int i; - u16 nss = 0, mcs[6]; - - os_memset(mcs, 0xff, 6 * sizeof(u16)); - - if (mcs_nss_size == 4) { - mcs[0] = WPA_GET_LE16(&he_mcs[0]); - mcs[1] = WPA_GET_LE16(&he_mcs[2]); - } - - if (mcs_nss_size == 8) { - mcs[2] = WPA_GET_LE16(&he_mcs[4]); - mcs[3] = WPA_GET_LE16(&he_mcs[6]); - } - - if (mcs_nss_size == 12) { - mcs[4] = WPA_GET_LE16(&he_mcs[8]); - mcs[5] = WPA_GET_LE16(&he_mcs[10]); - } - - for (i = 0; i < HE_NSS_MAX_STREAMS; i++) { - u16 nss_mask = 0x3 << (i * 2); - - /* - * If NSS values supported by RX and TX are different - * then choose the smaller of the two as the maximum - * supported NSS as that is the value supported by - * both RX and TX. - */ - if (mcs_nss_size == 4 && - (((mcs[0] & nss_mask) == nss_mask) || - ((mcs[1] & nss_mask) == nss_mask))) - continue; - - if (mcs_nss_size == 8 && - (((mcs[2] & nss_mask) == nss_mask) || - ((mcs[3] & nss_mask) == nss_mask))) - continue; - - if (mcs_nss_size == 12 && - (((mcs[4] & nss_mask) == nss_mask) || - ((mcs[5] & nss_mask) == nss_mask))) - continue; - - nss++; - } - - if (nss > 4) - cap_info |= FD_CAP_NSS_5_8 << FD_CAP_NSS_SHIFT; - else if (nss) - cap_info |= (nss - 1) << FD_CAP_NSS_SHIFT; - } - + cap_info |= hostapd_gen_fils_discovery_nss(mode, phy_index, + mcs_nss_size); return cap_info; }