hostapd: add support for configuring supported rates
[openwrt/openwrt.git] / package / network / services / hostapd / files / netifd.sh
index 4879c044b2d4a4130372d0104257891016d1c927..1ec9e45feda5e5a33942c5db2d39e82924dc5638 100644 (file)
@@ -1,4 +1,4 @@
-hostapd_add_rate() {
+wpa_supplicant_add_rate() {
        local var="$1"
        local val="$(($2 / 1000))"
        local sub="$((($2 / 100) % 10))"
@@ -6,6 +6,12 @@ hostapd_add_rate() {
        [ $sub -gt 0 ] && append $var "."
 }
 
+hostapd_add_rate() {
+       local var="$1"
+       local val="$(($2 / 100))"
+       append $var "$val" " "
+}
+
 hostapd_append_wep_key() {
        local var="$1"
 
@@ -18,12 +24,12 @@ hostapd_append_wep_key() {
                                zidx=$(($idx - 1))
                                json_get_var ckey "key${idx}"
                                [ -n "$ckey" ] && \
-                                       append network_data "wep_key${zidx}=$(prepare_key_wep "$ckey")" "$N$T"
+                                       append $var "wep_key${zidx}=$(prepare_key_wep "$ckey")" "$N$T"
                        done
                        wep_keyidx=$((key - 1))
                ;;
                *)
-                       append network_data "wep_key0=$(prepare_key_wep "$key")" "$N$T"
+                       append $var "wep_key0=$(prepare_key_wep "$key")" "$N$T"
                ;;
        esac
 }
@@ -43,9 +49,11 @@ hostapd_add_log_config() {
 
 hostapd_common_add_device_config() {
        config_add_array basic_rate
+       config_add_array supported_rates
 
        config_add_string country
-       config_add_boolean country_ie
+       config_add_boolean country_ie doth
+       config_add_string require_mode
 
        hostapd_add_log_config
 }
@@ -57,21 +65,39 @@ hostapd_prepare_device_config() {
        local base="${config%%.conf}"
        local base_cfg=
 
-       json_get_vars country country_ie beacon_int basic_rate
+       json_get_vars country country_ie beacon_int doth require_mode
 
        hostapd_set_log_options base_cfg
 
        set_default country_ie 1
+       set_default doth 1
+
        [ -n "$country" ] && {
                append base_cfg "country_code=$country" "$N"
+
                [ "$country_ie" -gt 0 ] && append base_cfg "ieee80211d=1" "$N"
+               [ "$hwmode" = "a" -a "$doth" -gt 0 ] && append base_cfg "ieee80211h=1" "$N"
        }
        [ -n "$hwmode" ] && append base_cfg "hw_mode=$hwmode" "$N"
 
        local brlist= br
+       json_get_values basic_rate_list basic_rate
        for br in $basic_rate_list; do
                hostapd_add_rate brlist "$br"
        done
+       case "$require_mode" in
+               g) brlist="60 120 240" ;;
+               n) append base_cfg "require_ht=1" "$N";;
+               ac) append base_cfg "require_vht=1" "$N";;
+       esac
+
+       local rlist= r
+       json_get_values rate_list supported_rates
+       for r in $rate_list; do
+               hostapd_add_rate rlist "$r"
+       done
+
+       [ -n "$rlist" ] && append base_cfg "supported_rates=$rlist" "$N"
        [ -n "$brlist" ] && append base_cfg "basic_rates=$brlist" "$N"
        [ -n "$beacon_int" ] && append base_cfg "beacon_int=$beacon_int" "$N"
 
@@ -82,11 +108,11 @@ EOF
 }
 
 hostapd_common_add_bss_config() {
-       config_add_string bssid ssid
-       config_add_boolean wds
+       config_add_string 'bssid:macaddr' 'ssid:string'
+       config_add_boolean wds wmm hidden
 
        config_add_int maxassoc max_inactivity
-       config_add_boolean disassoc_low_ack ap_isolate short_preamble
+       config_add_boolean disassoc_low_ack isolate short_preamble
 
        config_add_int \
                wep_rekey eap_reauth_period \
@@ -95,9 +121,9 @@ hostapd_common_add_bss_config() {
        config_add_boolean rsn_preauth auth_cache
        config_add_int ieee80211w
 
-       config_add_string auth_server server
+       config_add_string 'auth_server:host' 'server:host'
        config_add_string auth_secret
-       config_add_int auth_port port
+       config_add_int 'auth_port:port' 'port:port'
 
        config_add_string acct_server
        config_add_string acct_secret
@@ -108,21 +134,28 @@ hostapd_common_add_bss_config() {
        config_add_int dae_port
 
        config_add_string nasid
+       config_add_string ownip
        config_add_string iapp_interface
        config_add_string eap_type ca_cert client_cert identity auth priv_key priv_key_pwd
 
-       config_add_string key1 key2 key3 key4 password
+       config_add_int dynamic_vlan vlan_naming
+       config_add_string vlan_tagged_interface vlan_bridge
+
+       config_add_string 'key1:wepkey' 'key2:wepkey' 'key3:wepkey' 'key4:wepkey' 'password:wpakey'
+
+       config_add_string wpa_psk_file
 
-       config_add_boolean wps_pushbutton wps_label ext_registrar
+       config_add_boolean wps_pushbutton wps_label ext_registrar wps_pbc_in_m1
        config_add_string wps_device_type wps_device_name wps_manufacturer wps_pin
 
        config_add_int ieee80211w_max_timeout ieee80211w_retry_timeout
 
-       config_add_string macfilter macfile
-       config_add_array maclist
+       config_add_string macfilter 'macfile:file'
+       config_add_array 'maclist:list(macaddr)'
 
        config_add_int mcast_rate
        config_add_array basic_rate
+       config_add_array supported_rates
 }
 
 hostapd_set_bss_options() {
@@ -137,12 +170,13 @@ hostapd_set_bss_options() {
 
        json_get_vars \
                wep_rekey wpa_group_rekey wpa_pair_rekey wpa_master_rekey \
-               maxassoc max_inactivity disassoc_low_ack ap_isolate auth_cache \
-               wps_pushbutton wps_label ext_registrar \
+               maxassoc max_inactivity disassoc_low_ack isolate auth_cache \
+               wps_pushbutton wps_label ext_registrar wps_pbc_in_m1 \
                wps_device_type wps_device_name wps_manufacturer wps_pin \
-               macfilter ssid wmm hidden
+               macfilter ssid wmm hidden short_preamble rsn_preauth \
+               iapp_interface
 
-       set_default ap_isolate 0
+       set_default isolate 0
        set_default maxassoc 0
        set_default max_inactivity 0
        set_default short_preamble 1
@@ -151,8 +185,8 @@ hostapd_set_bss_options() {
        set_default wmm 1
 
        append bss_conf "ctrl_interface=/var/run/hostapd"
-       if [ "$ap_isolate" -gt 0 ]; then
-               append bss_conf "ap_isolate=$ap_isolate" "$N"
+       if [ "$isolate" -gt 0 ]; then
+               append bss_conf "ap_isolate=$isolate" "$N"
        fi
        if [ "$maxassoc" -gt 0 ]; then
                append bss_conf "max_num_sta=$maxassoc" "$N"
@@ -180,7 +214,7 @@ hostapd_set_bss_options() {
                        wps_not_configured=1
                ;;
                psk)
-                       json_get_vars key
+                       json_get_vars key wpa_psk_file
                        if [ ${#key} -lt 8 ]; then
                                wireless_setup_vif_failed INVALID_WPA_PSK
                                return 1
@@ -189,6 +223,10 @@ hostapd_set_bss_options() {
                        else
                                append bss_conf "wpa_passphrase=$key" "$N"
                        fi
+                       [ -n "$wpa_psk_file" ] && {
+                               [ -e "$wpa_psk_file" ] || touch "$wpa_psk_file"
+                               append bss_conf "wpa_psk_file=$wpa_psk_file" "$N"
+                       }
                        wps_possible=1
                ;;
                eap)
@@ -196,8 +234,10 @@ hostapd_set_bss_options() {
                                auth_server auth_secret auth_port \
                                acct_server acct_secret acct_port \
                                dae_client dae_secret dae_port \
-                               nasid rsn_preauth iapp_interface \
-                               eap_reauth_period
+                               nasid ownip \
+                               eap_reauth_period dynamic_vlan \
+                               vlan_naming vlan_tagged_interface \
+                               vlan_bridge
 
                        # legacy compatibility
                        [ -n "$auth_server" ] || json_get_var auth_server server
@@ -208,6 +248,8 @@ hostapd_set_bss_options() {
                        set_default acct_port 1813
                        set_default dae_port 3799
 
+                       set_default vlan_naming 1
+
                        append bss_conf "auth_server_addr=$auth_server" "$N"
                        append bss_conf "auth_server_port=$auth_port" "$N"
                        append bss_conf "auth_server_shared_secret=$auth_secret" "$N"
@@ -227,14 +269,25 @@ hostapd_set_bss_options() {
                        }
 
                        append bss_conf "nas_identifier=$nasid" "$N"
+                       [ -n "$ownip" ] && append bss_conf "own_ip_addr=$ownip" "$N"
                        append bss_conf "eapol_key_index_workaround=1" "$N"
                        append bss_conf "ieee8021x=1" "$N"
                        append bss_conf "wpa_key_mgmt=WPA-EAP" "$N"
+
+                       [ -n "$dynamic_vlan" ] && {
+                               append bss_conf "dynamic_vlan=$dynamic_vlan" "$N"
+                               append bss_conf "vlan_naming=$vlan_naming" "$N"
+                               [ -n "$vlan_bridge" ] && \
+                                       append bss_conf "vlan_bridge=$vlan_bridge" "$N"
+                               [ -n "$vlan_tagged_interface" ] && \
+                                       append bss_conf "vlan_tagged_interface=$vlan_tagged_interface" "$N"
+                       }
                ;;
                wep)
                        local wep_keyidx=0
-                       hostapd_append_wep_key network_data
-                       append bss_conf "wep_default_key=$wep_key" "$N"
+                       json_get_vars key
+                       hostapd_append_wep_key bss_conf
+                       append bss_conf "wep_default_key=$wep_keyidx" "$N"
                        [ -n "$wep_rekey" ] && append bss_conf "wep_rekey_period=$wep_rekey" "$N"
                ;;
        esac
@@ -246,6 +299,7 @@ hostapd_set_bss_options() {
 
        set_default wps_pushbutton 0
        set_default wps_label 0
+       set_default wps_pbc_in_m1 0
 
        config_methods=
        [ "$wps_pushbutton" -gt 0 ] && append config_methods push_button
@@ -256,35 +310,35 @@ hostapd_set_bss_options() {
                set_default wps_device_type "6-0050F204-1"
                set_default wps_device_name "OpenWrt AP"
                set_default wps_manufacturer "openwrt.org"
-               set_default wps_pin "12345670"
 
                wps_state=2
                [ -n "$wps_configured" ] && wps_state=1
 
-               [ "$ext_registrar" -gt 0 -a -n "$bridge" ] && append bss_conf "upnp_iface=$bridge" "$N"
+               [ "$ext_registrar" -gt 0 -a -n "$network_bridge" ] && append bss_conf "upnp_iface=$network_bridge" "$N"
 
                append bss_conf "eap_server=1" "$N"
-               append bss_conf "ap_pin=$wps_pin" "$N"
+               [ -n "$wps_pin" ] && append bss_conf "ap_pin=$wps_pin" "$N"
                append bss_conf "wps_state=$wps_state" "$N"
                append bss_conf "ap_setup_locked=0" "$N"
                append bss_conf "device_type=$wps_device_type" "$N"
                append bss_conf "device_name=$wps_device_name" "$N"
                append bss_conf "manufacturer=$wps_manufacturer" "$N"
                append bss_conf "config_methods=$config_methods" "$N"
+               [ "$wps_pbc_in_m1" -gt 0 ] && append bss_conf "pbc_in_m1=$wps_pbc_in_m1" "$N"
        }
 
        append bss_conf "ssid=$ssid" "$N"
        [ -n "$network_bridge" ] && append bss_conf "bridge=$network_bridge" "$N"
-       [ -n "$iapp_interface" ] &&  {
+       [ -n "$iapp_interface" ] && {
                iapp_interface="$(uci_get_state network "$iapp_interface" ifname "$iapp_interface")"
                [ -n "$iapp_interface" ] && append bss_conf "iapp_interface=$iapp_interface" "$N"
        }
 
        if [ "$wpa" -ge "2" ]; then
-               if [ -n "$bridge" -a "$rsn_preauth" = 1 ]; then
+               if [ -n "$network_bridge" -a "$rsn_preauth" = 1 ]; then
                        set_default auth_cache 1
                        append bss_conf "rsn_preauth=1" "$N"
-                       append bss_conf "rsn_preauth_interfaces=$bridge" "$N"
+                       append bss_conf "rsn_preauth_interfaces=$network_bridge" "$N"
                else
                        set_default auth_cache 0
                fi
@@ -293,7 +347,7 @@ hostapd_set_bss_options() {
                [ "$auth_cache" = 0 ] && append bss_conf "disable_pmksa_caching=1" "$N"
 
                # RSN -> allow management frame protection
-               json_get_var ieee80211w
+               json_get_var ieee80211w ieee80211w
                case "$ieee80211w" in
                        [012])
                                json_get_vars ieee80211w_max_timeout ieee80211w_retry_timeout
@@ -355,7 +409,7 @@ hostapd_set_log_options() {
        set_default log_iapp   1
        set_default log_mlme   1
 
-       local log_mask=$((       \
+       local log_mask=$(( \
                ($log_80211  << 0) | \
                ($log_8021x  << 1) | \
                ($log_radius << 2) | \
@@ -382,7 +436,7 @@ _wpa_supplicant_common() {
 
 wpa_supplicant_teardown_interface() {
        _wpa_supplicant_common "$1"
-       rm -rf "$_rpath" "$_config"
+       rm -rf "$_rpath/$1" "$_config"
 }
 
 wpa_supplicant_prepare_interface() {
@@ -446,12 +500,14 @@ wpa_supplicant_add_network() {
 
        local wpa_key_mgmt="WPA-PSK"
        local scan_ssid="1"
+       local freq
 
        [[ "$_w_mode" = "adhoc" ]] && {
                append network_data "mode=1" "$N$T"
-               [ -n "$fixed_frequency" ] || {
+               [ -n "$channel" ] && {
+                       freq="$(get_freq "$phy" "$channel")"
                        append network_data "fixed_freq=1" "$N$T"
-                       append network_data "frequency=$fixed_frequency" "$N$T"
+                       append network_data "frequency=$freq" "$N$T"
                }
 
                scan_ssid=0
@@ -526,15 +582,15 @@ wpa_supplicant_add_network() {
        [ -n "$basic_rate" ] && {
                local br rate_list=
                for br in $basic_rate; do
-                       hostapd_add_rate rate_list "$br"
+                       wpa_supplicant_add_rate rate_list "$br"
                done
                [ -n "$rate_list" ] && append network_data "rates=$rate_list" "$N$T"
        }
 
        [ -n "$mcast_rate" ] && {
                local mc_rate=
-               hostapd_add_rate mc_rate "$mcast_rate"
-               [ -n "$mcast_rate" ] && append network_data "mcast_rate=$mcast_rate" "$N$T"
+               wpa_supplicant_add_rate mc_rate "$mcast_rate"
+               append network_data "mcast_rate=$mc_rate" "$N$T"
        }
 
        local ht_str
@@ -574,5 +630,5 @@ wpa_supplicant_run() {
 }
 
 hostapd_common_cleanup() {
-       killall hostapd wpa_supplicant
+       killall hostapd wpa_supplicant meshd-nl80211
 }