mac80211: parse the correct set of HE capabilities for AP mode
authorSultan Alsawaf <sultan@kerneltoast.com>
Fri, 22 Jul 2022 06:36:31 +0000 (23:36 -0700)
committerDaniel Golle <daniel@makrotopia.org>
Sat, 20 Aug 2022 10:33:50 +0000 (12:33 +0200)
It is common for 802.11ax NICs to support more than just AP mode, which
results in there being a distinct set of HE capabilities for each mode. As
(bad) luck would have it, iw prints out info for each HE mode in sequential
order according to `enum nl80211_iftype`, and AP mode isn't always first.

As a result, the wrong set of HE capabilities can be parsed if an AP NIC
supports station (managed) mode or any other mode preceding AP mode, since
only the first set of HE capabilities printed by iw is parsed from awk's
output.

This has a noticeable impact on beamforming for example, since managed mode
usually doesn't have beamformer capabilities enabled, while AP mode does.
Hostapd won't be set up with the configs to enable beamformer capabilities
in this scenario, causing hostapd to disable beamforming to HE stations
even when it's supported by the AP.

Always parse the correct set of HE capabilities for AP mode to fix this.
This is achieved by trimming all of iw's output prior to the AP mode
capabilities, which ensures that the first set of HE capabilities are
always for AP mode.

Signed-off-by: Sultan Alsawaf <sultan@kerneltoast.com>
package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh

index 62afd9e6a0fb6c4b047432ac8b1e8b97e42fc72b..f5249408546771e2c0dee27f11578c28444214d1 100644 (file)
@@ -421,9 +421,9 @@ mac80211_hostapd_setup_base() {
                        he_spr_non_srg_obss_pd_max_offset:1 \
                        he_bss_color
 
-               he_phy_cap=$(iw phy "$phy" info | awk -F "[()]" '/HE PHY Capabilities/ { print $2 }' | head -1)
+               he_phy_cap=$(iw phy "$phy" info | sed -n '/HE Iftypes: AP/,$p' | awk -F "[()]" '/HE PHY Capabilities/ { print $2 }' | head -1)
                he_phy_cap=${he_phy_cap:2}
-               he_mac_cap=$(iw phy "$phy" info | awk -F "[()]" '/HE MAC Capabilities/ { print $2 }' | head -1)
+               he_mac_cap=$(iw phy "$phy" info | sed -n '/HE Iftypes: AP/,$p' | awk -F "[()]" '/HE MAC Capabilities/ { print $2 }' | head -1)
                he_mac_cap=${he_mac_cap:2}
 
                append base_cfg "ieee80211ax=1" "$N"