802.11s: fix authsae support in netifd
[openwrt.git] / package / kernel / mac80211 / files / lib / netifd / wireless / mac80211.sh
index eefe1fed5dff70e4f0e93cc786a27f5c6aff1e1b..53d1cb9c8ff532a9f3abcc711a32f956ec431930 100644 (file)
@@ -17,18 +17,32 @@ MP_CONFIG_STRING="mesh_power_mode"
 drv_mac80211_init_device_config() {
        hostapd_common_add_device_config
 
-       config_add_string path phy macaddr
+       config_add_string path phy 'macaddr:macaddr'
        config_add_string hwmode
        config_add_int beacon_int chanbw frag rts
-       config_add_int rxantenna txantenna antenna_gain txpower
+       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() {
        hostapd_common_add_bss_config
 
-       config_add_string macaddr
+       config_add_string 'macaddr:macaddr' ifname
 
        config_add_boolean wds powersave
        config_add_int maxassoc
@@ -36,6 +50,7 @@ drv_mac80211_init_iface_config() {
        config_add_int dtim_interval
 
        # mesh
+       config_add_string mesh_id
        config_add_int $MP_CONFIG_INT
        config_add_boolean $MP_CONFIG_BOOL
        config_add_string $MP_CONFIG_STRING
@@ -55,12 +70,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
@@ -85,6 +252,8 @@ mac80211_hostapd_setup_bss() {
        hostapd_set_bss_options hostapd_cfg "$vif" || return 1
        json_get_vars wds dtim_period max_listen_int
 
+       set_default wds 0
+
        [ "$wds" -gt 0 ] && append hostapd_cfg "wds_sta=1" "$N"
        [ "$staidx" -gt 0 ] && append hostapd_cfg "start_disabled=1" "$N"
 
@@ -239,7 +408,7 @@ mac80211_setup_supplicant() {
 }
 
 mac80211_setup_adhoc() {
-       json_get_vars bssid ssid basic_rate key
+       json_get_vars bssid ssid key mcast_rate
 
        keyspec=
        [ "$auth_type" == "wep" ] && {
@@ -264,15 +433,14 @@ mac80211_setup_adhoc() {
        }
 
        brstr=
-       for br in $basic_rate; do
+       for br in $basic_rate_list; do
                hostapd_add_rate brstr "$br"
        done
 
        mcval=
        [ -n "$mcast_rate" ] && hostapd_add_rate mcval "$mcast_rate"
 
-       iw dev "$ifname" ibss join "$ssid" $freq $htmode \
-               ${fixed:+fixed-freq} $bssid \
+       iw dev "$ifname" ibss join "$ssid" $freq $htmode fixed-freq $bssid \
                ${beacon_int:+beacon-interval $beacon_int} \
                ${brstr:+basic-rates $brstr} \
                ${mcval:+mcast-rate $mcval} \
@@ -281,6 +449,7 @@ mac80211_setup_adhoc() {
 
 mac80211_setup_vif() {
        local name="$1"
+       local failed
 
        json_select data
        json_get_vars ifname
@@ -305,11 +474,23 @@ mac80211_setup_vif() {
                                json_get_var mp_val "$var"
                                [ -n "$mp_val" ] && iw dev "$ifname" set mesh_param "$var" "$mp_val"
                        done
-                       # todo: authsae
+
+                       # authsae
+                       json_get_vars key
+                       if [ -n "$key" ]; then
+                               if [ -e "/lib/wifi/authsae.sh" ]; then
+                                       . /lib/wifi/authsae.sh
+                                       authsae_start_interface || failed=1
+                               else
+                                       wireless_setup_vif_failed AUTHSAE_NOT_INSTALLED
+                                       json_select ..
+                                       return
+                               fi
+                       fi
                ;;
                adhoc)
                        wireless_vif_parse_encryption
-                       if [ "$wpa" -gt 0 ]; then
+                       if [ "$wpa" -gt 0 -o "$auto_channel" -gt 0 ]; then
                                mac80211_setup_supplicant || failed=1
                        else
                                mac80211_setup_adhoc
@@ -351,6 +532,7 @@ drv_mac80211_setup() {
                txpower antenna_gain \
                rxantenna txantenna \
                frag rts beacon_int
+       json_get_values basic_rate_list basic_rate
        json_select ..
 
        find_phy || {