diff mbox series

[OpenWrt-Devel,2/2] mac80211: add 11AX script support

Message ID 20200613163700.10091-2-john@phrozen.org
State Under Review
Delegated to: John Crispin
Headers show
Series [OpenWrt-Devel,1/2] hostapd: add 11AX script support | expand

Commit Message

John Crispin June 13, 2020, 4:37 p.m. UTC
Signed-off-by: John Crispin <john@phrozen.org>
---
 .../files/lib/netifd/wireless/mac80211.sh     | 131 ++++++++++++++++--
 .../mac80211/files/lib/wifi/mac80211.sh       |   7 +-
 2 files changed, 128 insertions(+), 10 deletions(-)

Comments

Adrian Schmutzler June 13, 2020, 6:33 p.m. UTC | #1
Hi,

> -----Original Message-----
> From: openwrt-devel [mailto:openwrt-devel-bounces@lists.openwrt.org]
> On Behalf Of John Crispin
> Sent: Samstag, 13. Juni 2020 18:37
> To: openwrt-devel@lists.openwrt.org
> Cc: John Crispin <john@phrozen.org>
> Subject: [OpenWrt-Devel] [PATCH 2/2] mac80211: add 11AX script support
> 
> Signed-off-by: John Crispin <john@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

There seem to be some indent problems here and ...

>  }
> 
>  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 \

... here a single additional tab would be enough.

Best

Adrian

> +
> +		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
diff mbox series

Patch

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"