wifi: mac80211: correctly parse Spatial Reuse Parameter Set element
authorLingbo Kong <quic_lingbok@quicinc.com>
Thu, 16 May 2024 02:18:54 +0000 (10:18 +0800)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 29 May 2024 13:35:12 +0000 (15:35 +0200)
Currently, the way of parsing Spatial Reuse Parameter Set element is
incorrect and some members of struct ieee80211_he_obss_pd are not assigned.

To address this issue, it must be parsed in the order of the elements of
Spatial Reuse Parameter Set defined in the IEEE Std 802.11ax specification.

The diagram of the Spatial Reuse Parameter Set element (IEEE Std 802.11ax
-2021-9.4.2.252).

-------------------------------------------------------------------------
|       |      |         |       |Non-SRG|  SRG  | SRG   | SRG  | SRG   |
|Element|Length| Element |  SR   |OBSS PD|OBSS PD|OBSS PD| BSS  |Partial|
|   ID  |      |   ID    |Control|  Max  |  Min  | Max   |Color | BSSID |
|       |      |Extension|       | Offset| Offset|Offset |Bitmap|Bitmap |
-------------------------------------------------------------------------

Fixes: 1ced169cc1c2 ("mac80211: allow setting spatial reuse parameters from bss_conf")
Signed-off-by: Lingbo Kong <quic_lingbok@quicinc.com>
Link: https://msgid.link/20240516021854.5682-3-quic_lingbok@quicinc.com
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/he.c

index 9f5ffdc9db284a73be270c48f40d77a94b301e79..ecbb042dd0433e2224237dc7e8ae127bf7e97449 100644 (file)
@@ -230,15 +230,21 @@ ieee80211_he_spr_ie_to_bss_conf(struct ieee80211_vif *vif,
 
        if (!he_spr_ie_elem)
                return;
+
+       he_obss_pd->sr_ctrl = he_spr_ie_elem->he_sr_control;
        data = he_spr_ie_elem->optional;
 
        if (he_spr_ie_elem->he_sr_control &
            IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT)
-               data++;
+               he_obss_pd->non_srg_max_offset = *data++;
+
        if (he_spr_ie_elem->he_sr_control &
            IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT) {
-               he_obss_pd->max_offset = *data++;
                he_obss_pd->min_offset = *data++;
+               he_obss_pd->max_offset = *data++;
+               memcpy(he_obss_pd->bss_color_bitmap, data, 8);
+               data += 8;
+               memcpy(he_obss_pd->partial_bssid_bitmap, data, 8);
                he_obss_pd->enable = true;
        }
 }