Signed-off-by: John Crispin <j...@phrozen.org> --- .../files/lib/netifd/wireless/mac80211.sh | 131 ++++++++++++++++-- .../mac80211/files/lib/wifi/mac80211.sh | 7 +- 2 files changed, 128 insertions(+), 10 deletions(-)
diff --git a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh index 4171af2f60..79f38eca8f 100644 --- a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh +++ b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh @@ -55,6 +55,12 @@ drv_mac80211_init_device_config() { short_gi_40 \ max_amsdu \ dsss_cck_40 + config_add_int \ + he_su_beamformer:1 \ + he_su_beamformee:0 \ + he_mu_beamformer:1 \ + he_twt_required:0 \ + he_spr_sr_control:0 } drv_mac80211_init_iface_config() { @@ -95,6 +101,20 @@ mac80211_add_capabilities() { export -n -- "$__var=$__out" } +mac80211_add_he_capabilities() { + local __out= oifs + + oifs="$IFS" + IFS=: + for capab in "$@"; do + set -- $capab + [ "$(($4))" -gt 0 ] || continue + [ "$(((0x$2) & $3))" -gt 0 ] || continue + append base_cfg "$1=1" "$N" + done + IFS="$oifs" +} + mac80211_hostapd_setup_base() { local phy="$1" @@ -118,8 +138,8 @@ mac80211_hostapd_setup_base() { ieee80211n=1 ht_capab= case "$htmode" in - VHT20|HT20) ;; - HT40*|VHT40|VHT80|VHT160) + VHT20|HT20|HE20) ;; + HT40*|VHT40|HE40|VHT80|HE80|VHT160|HE160) case "$hwmode" in a) case "$(( ($channel / 4) % 2 ))" in @@ -191,8 +211,8 @@ mac80211_hostapd_setup_base() { enable_ac=0 idx="$channel" case "$htmode" in - VHT20) enable_ac=1;; - VHT40) + VHT20|HE20) enable_ac=1;; + VHT40|HE40) case "$(( ($channel / 4) % 2 ))" in 1) idx=$(($channel + 2));; 0) idx=$(($channel - 2));; @@ -201,7 +221,7 @@ mac80211_hostapd_setup_base() { append base_cfg "vht_oper_chwidth=0" "$N" append base_cfg "vht_oper_centr_freq_seg0_idx=$idx" "$N" ;; - VHT80) + VHT80|HE80) case "$(( ($channel / 4) % 4 ))" in 1) idx=$(($channel + 6));; 2) idx=$(($channel + 2));; @@ -212,7 +232,7 @@ mac80211_hostapd_setup_base() { append base_cfg "vht_oper_chwidth=1" "$N" append base_cfg "vht_oper_centr_freq_seg0_idx=$idx" "$N" ;; - VHT160) + VHT160|HE160) case "$channel" in 36|40|44|48|52|56|60|64) idx=50;; 100|104|108|112|116|120|124|128) idx=114;; @@ -320,6 +340,99 @@ mac80211_hostapd_setup_base() { [ -n "$vht_capab" ] && append base_cfg "vht_capab=$vht_capab" "$N" fi + # 802.11ax + enable_ax=0 + idx="$channel" + case "$htmode" in + HE20) enable_ax=1;; + HE40) + case "$(( ($channel / 4) % 2 ))" in + 1) idx=$(($channel + 2));; + 0) idx=$(($channel - 2));; + esac + enable_ax=1 + if [ $channel -ge 36 ]; then + append base_cfg "he_oper_chwidth=0" "$N" + append base_cfg "he_oper_centr_freq_seg0_idx=$idx" "$N" + fi + ;; + HE80) + case "$(( ($channel / 4) % 4 ))" in + 1) idx=$(($channel + 6));; + 2) idx=$(($channel + 2));; + 3) idx=$(($channel - 2));; + 0) idx=$(($channel - 6));; + esac + enable_ax=1 + append base_cfg "he_oper_chwidth=1" "$N" + append base_cfg "he_oper_centr_freq_seg0_idx=$idx" "$N" + ;; + HE160) + case "$channel" in + 36|40|44|48|52|56|60|64) idx=50;; + 100|104|108|112|116|120|124|128) idx=114;; + esac + enable_ax=1 + append base_cfg "he_oper_chwidth=2" "$N" + append base_cfg "he_oper_centr_freq_seg0_idx=$idx" "$N" + ;; + esac + + if [ "$enable_ax" != "0" ]; then + json_get_vars \ + he_su_beamformer:1 \ + he_su_beamformee:0 \ + he_mu_beamformer:1 \ + he_twt_required:0 \ + he_spr_sr_control:0 + + append base_cfg "ieee80211ax=1" "$N" + he_phy_cap=$(iw phy "$phy" info | 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=${he_mac_cap:2} + + mac80211_add_he_capabilities \ + he_su_beamformer:${he_phy_cap:6:2}:0x80:$he_su_beamformer \ + he_su_beamformee:${he_phy_cap:8:2}:0x1:$he_su_beamformee \ + he_mu_beamformer:${he_phy_cap:8:2}:0x2:$he_mu_beamformer \ + he_spr_sr_control:${he_phy_cap:14:2}:0x1:$he_spr_sr_control \ + he_twt_required:${he_mac_cap:0:2}:0x6:$he_twt_required \ + + bsscolor=$(head -1 /dev/urandom | tr -dc '0-9' | head -c2) + bsscolor=$(($bsscolor + 1)) + bsscolor=$(($bsscolor % 63)) + + append base_cfg "he_bss_color=$bsscolor" "$N" + append base_cfg "he_default_pe_duration=4" "$N" + append base_cfg "he_mu_edca_qos_info_param_count=0" "$N" + append base_cfg "he_mu_edca_qos_info_q_ack=0" "$N" + append base_cfg "he_mu_edca_qos_info_queue_request=0" "$N" + append base_cfg "he_mu_edca_qos_info_txop_request=0" "$N" + append base_cfg "he_mu_edca_ac_be_aifsn=8" "$N" + append base_cfg "he_mu_edca_ac_be_aci=0" "$N" + append base_cfg "he_mu_edca_ac_be_ecwmin=9" "$N" + append base_cfg "he_mu_edca_ac_be_ecwmax=10" "$N" + append base_cfg "he_mu_edca_ac_be_timer=255" "$N" + append base_cfg "he_mu_edca_ac_bk_aifsn=15" "$N" + append base_cfg "he_mu_edca_ac_bk_aci=1" "$N" + append base_cfg "he_mu_edca_ac_bk_ecwmin=9" "$N" + append base_cfg "he_mu_edca_ac_bk_ecwmax=10" "$N" + append base_cfg "he_mu_edca_ac_bk_timer=255" "$N" + append base_cfg "he_mu_edca_ac_vi_ecwmin=5" "$N" + append base_cfg "he_mu_edca_ac_vi_ecwmax=7" "$N" + append base_cfg "he_mu_edca_ac_vi_aifsn=5" "$N" + append base_cfg "he_mu_edca_ac_vi_aci=2" "$N" + append base_cfg "he_mu_edca_ac_vi_timer=255" "$N" + append base_cfg "he_mu_edca_ac_vo_aifsn=5" "$N" + append base_cfg "he_mu_edca_ac_vo_aci=3" "$N" + append base_cfg "he_mu_edca_ac_vo_ecwmin=5" "$N" + append base_cfg "he_mu_edca_ac_vo_ecwmax=7" "$N" + append base_cfg "he_mu_edca_ac_vo_timer=255" "$N" + fi + + + hostapd_prepare_device_config "$hostapd_conf_file" nl80211 cat >> "$hostapd_conf_file" <<EOF ${channel:+channel=$channel} @@ -658,8 +771,8 @@ mac80211_setup_supplicant_noctl() { mac80211_prepare_iw_htmode() { case "$htmode" in - VHT20|HT20) iw_htmode=HT20;; - HT40*|VHT40|VHT160) + VHT20|HT20|HE20) iw_htmode=HT20;; + HT40*|VHT40|HE40|VHT160) case "$hwmode" in a) case "$(( ($channel / 4) % 2 ))" in @@ -683,7 +796,7 @@ mac80211_prepare_iw_htmode() { esac [ "$auto_channel" -gt 0 ] && iw_htmode="HT40+" ;; - VHT80) + VHT80|HE80) iw_htmode="80MHZ" ;; NONE|NOHT) diff --git a/package/kernel/mac80211/files/lib/wifi/mac80211.sh b/package/kernel/mac80211/files/lib/wifi/mac80211.sh index be9c537926..fc3b43b4c6 100644 --- a/package/kernel/mac80211/files/lib/wifi/mac80211.sh +++ b/package/kernel/mac80211/files/lib/wifi/mac80211.sh @@ -80,12 +80,17 @@ detect_mac80211() { htmode="" ht_capab="" - iw phy "$dev" info | grep -q 'Capabilities:' && htmode=HT20 + iw phy "$dev" info | grep -q 'Capabilities:' && { + htmode=HT20 + iw phy "$dev" info | grep -q 'HE.*Capabilities' && htmode="HE20" + } iw phy "$dev" info | grep -q '5180 MHz' && { mode_band="a" channel="36" + iw phy "$dev" info | grep -q '5180 MHz.*disabled' && channel=149 iw phy "$dev" info | grep -q 'VHT Capabilities' && htmode="VHT80" + iw phy "$dev" info | grep -q 'HE.*Capabilities' && htmode="HE80" } [ -n "$htmode" ] && ht_capab="set wireless.radio${devidx}.htmode=$htmode" -- 2.25.1 _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel