|
@@ -23,6 +23,20 @@ drv_mac80211_init_device_config() {
|
|
|
config_add_int rxantenna txantenna antenna_gain txpower distance
|
|
|
config_add_boolean noscan
|
|
|
config_add_array ht_capab
|
|
|
+ config_add_boolean \
|
|
|
+ rxldpc \
|
|
|
+ short_gi_80 \
|
|
|
+ short_gi_160 \
|
|
|
+ tx_stbc_2by1 \
|
|
|
+ su_beamformer \
|
|
|
+ su_beamformee \
|
|
|
+ mu_beamformer \
|
|
|
+ mu_beamformee \
|
|
|
+ vht_txop_ps \
|
|
|
+ htc_vht \
|
|
|
+ rx_antenna_pattern \
|
|
|
+ tx_antenna_pattern
|
|
|
+ config_add_int vht_max_mpdu vht_max_rx_stbc vht_link_adapt vht160
|
|
|
}
|
|
|
|
|
|
drv_mac80211_init_iface_config() {
|
|
@@ -55,12 +69,164 @@ mac80211_hostapd_setup_base() {
|
|
|
append base_cfg "ieee80211n=1" "$N"
|
|
|
|
|
|
ht_capab=
|
|
|
- [ -n "$htmode" ] && ht_capab="[$htmode]"
|
|
|
+ case "$htmode" in
|
|
|
+ HT20|HT40-|HT40+) ht_capab="[$htmode]";;
|
|
|
+ VHT40|VHT80|VHT160)
|
|
|
+ case "$channel" in
|
|
|
+ 36|44|52|60|100|108|116|124|132|140|149|157) ht_capab="[HT40+]";;
|
|
|
+ 40|48|56|64|104|112|120|128|136|144|153|161) ht_capab="[HT40-]";;
|
|
|
+ esac
|
|
|
+ ;;
|
|
|
+ esac
|
|
|
for cap in $ht_capab_list; do
|
|
|
ht_capab="$ht_capab[$cap]"
|
|
|
done
|
|
|
|
|
|
[ -n "$ht_capab" ] && append base_cfg "ht_capab=$ht_capab" "$N"
|
|
|
+
|
|
|
+ # 802.11ac
|
|
|
+ enable_ac=0
|
|
|
+ idx="$channel"
|
|
|
+ case "$htmode" in
|
|
|
+ VHT40)
|
|
|
+ case "$channel" in
|
|
|
+ 36|40) idx=38;;
|
|
|
+ 44|48) idx=42;;
|
|
|
+ 52|56) idx=54;;
|
|
|
+ 60|64) idx=58;;
|
|
|
+ 100|104) idx=102;;
|
|
|
+ 108|112) idx=110;;
|
|
|
+ 116|120) idx=118;;
|
|
|
+ 124|128) idx=126;;
|
|
|
+ 132|136) idx=134;;
|
|
|
+ 140|144) idx=142;;
|
|
|
+ 149|153) idx=151;;
|
|
|
+ 157|161) idx=159;;
|
|
|
+ esac
|
|
|
+ enable_ac=1
|
|
|
+ append base_cfg "vht_oper_chwidth=0" "$N"
|
|
|
+ append base_cfg "vht_oper_centr_freq_seg0_idx=$idx" "$N"
|
|
|
+ ;;
|
|
|
+ VHT80)
|
|
|
+ case "$channel" in
|
|
|
+ 36|40|44|48) idx=42;;
|
|
|
+ 52|56|60|64) idx=58;;
|
|
|
+ 100|104|108|112) idx=106;;
|
|
|
+ 116|120|124|128) idx=122;;
|
|
|
+ 132|136|140|144) idx=138;;
|
|
|
+ 149|153|157|161) idx=155;;
|
|
|
+ esac
|
|
|
+ enable_ac=1
|
|
|
+ append base_cfg "vht_oper_chwidth=1" "$N"
|
|
|
+ append base_cfg "vht_oper_centr_freq_seg0_idx=$idx" "$N"
|
|
|
+ ;;
|
|
|
+ VHT160)
|
|
|
+ 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_ac=1
|
|
|
+ append base_cfg "vht_oper_chwidth=2" "$N"
|
|
|
+ append base_cfg "vht_oper_centr_freq_seg0_idx=$idx" "$N"
|
|
|
+ ;;
|
|
|
+ esac
|
|
|
+
|
|
|
+ if [ "$enable_ac" != "0" ]; then
|
|
|
+ json_get_vars \
|
|
|
+ rxldpc:1 \
|
|
|
+ short_gi_80:1 \
|
|
|
+ short_gi_160:1 \
|
|
|
+ tx_stbc_2by1:1 \
|
|
|
+ su_beamformer:1 \
|
|
|
+ su_beamformee:1 \
|
|
|
+ mu_beamformer:1 \
|
|
|
+ mu_beamformee:1 \
|
|
|
+ vht_txop_ps:1 \
|
|
|
+ htc_vht:1 \
|
|
|
+ rx_antenna_pattern:1 \
|
|
|
+ tx_antenna_pattern:1 \
|
|
|
+ vht_max_mpdu:11454 \
|
|
|
+ vht_max_rx_stbc:4 \
|
|
|
+ vht_link_adapt:3 \
|
|
|
+ vht160:2
|
|
|
+
|
|
|
+ append base_cfg "ieee80211ac=1" "$N"
|
|
|
+ vht_capab=""
|
|
|
+ vht_cap=0
|
|
|
+ for cap in $(iw phy "$phy" info | awk -F "[()]" '/VHT Capabilities/ { print $2 }'); do
|
|
|
+ vht_cap="$(($vht_cap | $cap))"
|
|
|
+ done
|
|
|
+
|
|
|
+ # boolean
|
|
|
+ [ "$((($vht_cap & 16) * $rxldpc))" -eq 16 ] && \
|
|
|
+ vht_capab="$vht_capab[RXLDPC]"
|
|
|
+ [ "$((($vht_cap & 32) * $short_gi_80))" -eq 32 ] && \
|
|
|
+ vht_capab="$vht_capab[SHORT-GI-80]"
|
|
|
+ [ "$((($vht_cap & 64) * $short_gi_160))" -eq 64 ] && \
|
|
|
+ vht_capab="$vht_capab[SHORT-GI-160]"
|
|
|
+ [ "$((($vht_cap & 128) * $tx_stbc_2by1))" -eq 128 ] && \
|
|
|
+ vht_capab="$vht_capab[TX-STBC-2BY1]"
|
|
|
+ [ "$((($vht_cap & 2048) * $su_beamformer))" -eq 2048 ] && \
|
|
|
+ vht_capab="$vht_capab[SU-BEAMFORMER]"
|
|
|
+ [ "$((($vht_cap & 4096) * $su_beamformee))" -eq 4096 ] && \
|
|
|
+ vht_capab="$vht_capab[SU-BEAMFORMEE]"
|
|
|
+ [ "$((($vht_cap & 524288) * $mu_beamformer))" -eq 524288 ] && \
|
|
|
+ vht_capab="$vht_capab[MU-BEAMFORMER]"
|
|
|
+ [ "$((($vht_cap & 1048576) * $mu_beamformee))" -eq 1048576 ] && \
|
|
|
+ vht_capab="$vht_capab[MU-BEAMFORMEE]"
|
|
|
+ [ "$((($vht_cap & 2097152) * $vht_txop_ps))" -eq 2097152 ] && \
|
|
|
+ vht_capab="$vht_capab[VHT-TXOP-PS]"
|
|
|
+ [ "$((($vht_cap & 4194304) * $htc_vht))" -eq 4194304 ] && \
|
|
|
+ vht_capab="$vht_capab[HTC-VHT]"
|
|
|
+ [ "$((($vht_cap & 268435456) * $rx_antenna_pattern))" -eq 268435456 ] && \
|
|
|
+ vht_capab="$vht_capab[RX-ANTENNA-PATTERN]"
|
|
|
+ [ "$((($vht_cap & 536870912) * $tx_antenna_pattern))" -eq 536870912 ] && \
|
|
|
+ vht_capab="$vht_capab[TX-ANTENNA-PATTERN]"
|
|
|
+
|
|
|
+ # supported Channel widths
|
|
|
+ vht160_hw=0
|
|
|
+ [ "$(($vht_cap & 12))" -eq 4 -a 1 -le "$vht160" ] && \
|
|
|
+ vht160_hw=1
|
|
|
+ [ "$(($vht_cap & 12))" -eq 8 -a 2 -le "$vht160" ] && \
|
|
|
+ vht160_hw=2
|
|
|
+ [ "$vht160_hw" = 1 ] && vht_capab="$vht_capab[VHT160]"
|
|
|
+ [ "$vht160_hw" = 2 ] && vht_capab="$vht_capab[VHT160-80PLUS80]"
|
|
|
+
|
|
|
+ # maximum MPDU length
|
|
|
+ vht_max_mpdu_hw=3895
|
|
|
+ [ "$(($vht_cap & 3))" -ge 1 -a 7991 -le "$vht_max_mpdu" ] && \
|
|
|
+ vht_max_mpdu_hw=7991
|
|
|
+ [ "$(($vht_cap & 3))" -ge 2 -a 11454 -le "$vht_max_mpdu" ] && \
|
|
|
+ vht_max_mpdu_hw=11454
|
|
|
+ [ "$vht_max_mpdu_hw" != 3895 ] && \
|
|
|
+ vht_capab="$vht_capab[MAX-MPDU-$vht_max_mpdu_hw]"
|
|
|
+
|
|
|
+ # support for the reception of PPDUs using STBC
|
|
|
+ vht_max_rx_stbc_hw=0
|
|
|
+ [ "$(($vht_cap & 1792))" -ge 256 -a 1 -le "$vht_max_rx_stbc" ] && \
|
|
|
+ vht_max_rx_stbc_hw=1
|
|
|
+ [ "$(($vht_cap & 1792))" -ge 512 -a 2 -le "$vht_max_rx_stbc" ] && \
|
|
|
+ vht_max_rx_stbc_hw=2
|
|
|
+ [ "$(($vht_cap & 1792))" -ge 768 -a 3 -le "$vht_max_rx_stbc" ] && \
|
|
|
+ vht_max_rx_stbc_hw=3
|
|
|
+ [ "$(($vht_cap & 1792))" -ge 1024 -a 4 -le "$vht_max_rx_stbc" ] && \
|
|
|
+ vht_max_rx_stbc_hw=4
|
|
|
+ [ "$vht_max_rx_stbc_hw" = 1 ] && vht_capab="$vht_capab[RX-STBC-1]"
|
|
|
+ [ "$vht_max_rx_stbc_hw" = 2 ] && vht_capab="$vht_capab[RX-STBC-12]"
|
|
|
+ [ "$vht_max_rx_stbc_hw" = 3 ] && vht_capab="$vht_capab[RX-STBC-123]"
|
|
|
+ [ "$vht_max_rx_stbc_hw" = 4 ] && vht_capab="$vht_capab[RX-STBC-1234]"
|
|
|
+
|
|
|
+ # whether or not the STA supports link adaptation using VHT variant
|
|
|
+ vht_link_adapt_hw=0
|
|
|
+ [ "$(($vht_cap & 201326592))" -ge 134217728 -a 2 -le "$vht_link_adapt" ] && \
|
|
|
+ vht_link_adapt_hw=2
|
|
|
+ [ "$(($vht_cap & 201326592))" -ge 201326592 -a 3 -le "$vht_link_adapt" ] && \
|
|
|
+ vht_link_adapt_hw=3
|
|
|
+ [ "$vht_link_adapt_hw" != 0 ] && \
|
|
|
+ vht_capab="$vht_capab[VHT-LINK-ADAPT-$vht_link_adapt_hw]"
|
|
|
+
|
|
|
+ [ -n "$vht_capab" ] && append base_cfg "vht_capab=$vht_capab" "$N"
|
|
|
+ fi
|
|
|
}
|
|
|
|
|
|
hostapd_prepare_device_config "$hostapd_conf_file" nl80211
|