git: 363846a7e31b - main - net80211: fix VHT80/VHT160 transmit width checks
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 03 May 2025 15:39:13 UTC
The branch main has been updated by adrian:
URL: https://cgit.FreeBSD.org/src/commit/?id=363846a7e31b013dc7ebccd8017578fe79ee5103
commit 363846a7e31b013dc7ebccd8017578fe79ee5103
Author: Adrian Chadd <adrian@FreeBSD.org>
AuthorDate: 2025-05-01 04:09:52 +0000
Commit: Adrian Chadd <adrian@FreeBSD.org>
CommitDate: 2025-05-03 15:38:25 +0000
net80211: fix VHT80/VHT160 transmit width checks
I didn't double check to see if ni_chw had been updated to actually
implement values other than 20/40. It's just implementing the
HT channel width stuff during both association and upon receiving
a HT TX channel width action frame.
This meant the VHT80/VHT160 transmit width checks were never
going to be true, as ni_chw is never set to VHT80 / VHT160.
After checking the HT action frame and looking for VHT changes,
I'm pretty sure there's nothing explicit about VHT width, as it's
normally done via CCA (clear channel access) and/or RTS/CTS exchanges -
each 20MHz subchannel is RTS/CTS'ed / will be checked and if they're
busy, a narrower frame will be transmitted.
So, change the VHT80 / VHT160 checks to only check if ni_chw is 20MHz.
If it's 20MHz then a HT action frame has come out saying to TX at 20MHz,
and we should obey it. Otherwise, do 80/160MHz as available.
Differential Revision: https://reviews.freebsd.org/D50096
Reviewed by: bz
---
sys/net80211/ieee80211_vht.c | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/sys/net80211/ieee80211_vht.c b/sys/net80211/ieee80211_vht.c
index 0df95d87d01a..eb4ea615da75 100644
--- a/sys/net80211/ieee80211_vht.c
+++ b/sys/net80211/ieee80211_vht.c
@@ -992,9 +992,15 @@ ieee80211_vht_check_tx_vht80(const struct ieee80211_node *ni)
vap = ni->ni_vap;
bss_chan = vap->iv_bss->ni_chan;
+ /*
+ * ni_chw represents 20MHz or 40MHz from the HT
+ * TX width action frame / HT channel negotiation.
+ * If a HT TX width action frame sets it to 20MHz
+ * then reject doing 80MHz.
+ */
return (IEEE80211_IS_CHAN_VHT80(bss_chan) &&
IEEE80211_IS_CHAN_VHT80(ni->ni_chan) &&
- (ni->ni_chw == IEEE80211_STA_RX_BW_80));
+ (ni->ni_chw != IEEE80211_STA_RX_BW_20));
}
/*
@@ -1015,7 +1021,13 @@ ieee80211_vht_check_tx_vht160(const struct ieee80211_node *ni)
vap = ni->ni_vap;
bss_chan = vap->iv_bss->ni_chan;
- if (ni->ni_chw != IEEE80211_STA_RX_BW_160)
+ /*
+ * ni_chw represents 20MHz or 40MHz from the HT
+ * TX width action frame / HT channel negotiation.
+ * If a HT TX width action frame sets it to 20MHz
+ * then reject doing 160MHz.
+ */
+ if (ni->ni_chw == IEEE80211_STA_RX_BW_20)
return (false);
if (IEEE80211_IS_CHAN_VHT160(bss_chan) &&