wifi: mac80211: handle wider bandwidth OFDMA during CSA
authorJohannes Berg <johannes.berg@intel.com>
Mon, 6 May 2024 19:54:50 +0000 (21:54 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 23 May 2024 09:28:54 +0000 (11:28 +0200)
During channel switch, track the AP configuration in the
chanreq, so that wider bandwidth OFDMA is taken into
account correctly, since multiple channel contexts may
be needed due to sharing not being possible due to
wider bandwidth OFDMA.

Reviewed-by: Miriam Rachel Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://msgid.link/20240506215543.b2c5a72dac1b.I69f65cb2e75d4a49a174b1aede68bf8ff0a3cab3@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/mlme.c
net/mac80211/spectmgmt.c

index 75d53257dd974ccff8cc84baa9815a4ac12b6300..1d0b414619a4baf25e62ca22f69d46370fe1801b 100644 (file)
@@ -2517,8 +2517,13 @@ ieee80211_sta_process_chanswitch(struct ieee80211_link_data *link,
                goto drop_connection;
        }
 
+       link->csa.chanreq = csa_ie.chanreq;
+       if (link->u.mgd.conn.mode < IEEE80211_CONN_MODE_EHT ||
+           sdata->vif.driver_flags & IEEE80211_VIF_IGNORE_OFDMA_WIDER_BW)
+               link->csa.chanreq.ap.chan = NULL;
+
        if (chanctx) {
-               res = ieee80211_link_reserve_chanctx(link, &csa_ie.chanreq,
+               res = ieee80211_link_reserve_chanctx(link, &link->csa.chanreq,
                                                     chanctx->mode, false);
                if (res) {
                        link_info(link,
@@ -2529,7 +2534,6 @@ ieee80211_sta_process_chanswitch(struct ieee80211_link_data *link,
        }
 
        link->conf->csa_active = true;
-       link->csa.chanreq = csa_ie.chanreq;
        link->u.mgd.csa.ignored_same_chan = false;
        link->u.mgd.beacon_crc_valid = false;
        link->u.mgd.csa.blocked_tx = csa_ie.mode;
index b2de4c6fb808860b7ae5a7f94c21a064fb877f5e..df96d3db1c0e6ed106e7b0032657c6f7e4f591ce 100644 (file)
@@ -9,7 +9,7 @@
  * Copyright 2007, Michael Wu <flamingice@sourmilk.net>
  * Copyright 2007-2008, Intel Corporation
  * Copyright 2008, Johannes Berg <johannes@sipsolutions.net>
- * Copyright (C) 2018, 2020, 2022-2023 Intel Corporation
+ * Copyright (C) 2018, 2020, 2022-2024 Intel Corporation
  */
 
 #include <linux/ieee80211.h>
@@ -366,6 +366,9 @@ int ieee80211_parse_ch_switch_ie(struct ieee80211_sub_if_data *sdata,
                validate_chandef_by_ht_vht_oper(sdata, conn, vht_cap_info,
                                                &new_chandef);
 
+       /* capture the AP chandef before (potential) downgrading */
+       csa_ie->chanreq.ap = new_chandef;
+
        /* if data is there validate the bandwidth & use it */
        if (new_chandef.chan) {
                if (conn->bw_limit < IEEE80211_CONN_BW_LIMIT_320 &&