]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
FILS: Fix maximum NSS calculation for FD frame
authorAloka Dixit <quic_alokad@quicinc.com>
Mon, 13 Mar 2023 09:11:25 +0000 (02:11 -0700)
committerJouni Malinen <j@w1.fi>
Tue, 14 Mar 2023 09:27:00 +0000 (11:27 +0200)
Maximum NSS calculation assumed the host to be little endian while
retrieving MCS values from HE capabilities which is incorrect. Use
WPA_GET_LE16() instead.

Add a check for HE as the current NSS calculation assumes HE support.

Signed-off-by: Aloka Dixit <quic_alokad@quicinc.com>
src/ap/beacon.c

index d737343517a4fe1a8c5da4e936adc25eb4cc85e8..e9218dd9b5142c57b31b8b0bcce2d2991f34ef63 100644 (file)
@@ -1410,14 +1410,37 @@ static u16 hostapd_fils_discovery_cap(struct hostapd_data *hapd)
        cap_info |= phy_index << FD_CAP_PHY_INDEX_SHIFT;
        cap_info |= chwidth << FD_CAP_BSS_CHWIDTH_SHIFT;
 
-       if (mode) {
-               u16 *mcs = (u16 *) mode->he_capab[IEEE80211_MODE_AP].mcs;
+       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;
+               u16 nss = 0, mcs[6];
+
+               os_memset(mcs, 0xffff, 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)))