hostapd: remove ieee80211v option
[openwrt/openwrt.git] / package / network / services / hostapd / files / hostapd.sh
index 637f298ad9142a1725879192f4cfbae58a83b947..8e05ae211f0ecbbd44de958a88978543ecc7d4e6 100644 (file)
@@ -1,4 +1,5 @@
 . /lib/functions/network.sh
+. /lib/functions.sh
 
 wpa_supplicant_add_rate() {
        local var="$1"
@@ -70,6 +71,8 @@ hostapd_append_wpa_key_mgmt() {
                        append wpa_key_mgmt "OWE"
                ;;
        esac
+
+       [ "$auth_osen" = "1" ] && append wpa_key_mgmt "OSEN"
 }
 
 hostapd_add_log_config() {
@@ -110,7 +113,7 @@ hostapd_prepare_device_config() {
        local base_cfg=
 
        json_get_vars country country_ie beacon_int:100 dtim_period:2 doth require_mode legacy_rates \
-               acs_chan_bias local_pwr_constraint spectrum_mgmt_required
+               acs_chan_bias local_pwr_constraint spectrum_mgmt_required airtime_mode
 
        hostapd_set_log_options base_cfg
 
@@ -118,6 +121,7 @@ hostapd_prepare_device_config() {
        set_default spectrum_mgmt_required 0
        set_default doth 1
        set_default legacy_rates 1
+       set_default airtime_mode 0
 
        [ "$hwmode" = "b" ] && legacy_rates=1
 
@@ -164,6 +168,7 @@ hostapd_prepare_device_config() {
        [ -n "$brlist" ] && append base_cfg "basic_rates=$brlist" "$N"
        append base_cfg "beacon_int=$beacon_int" "$N"
        append base_cfg "dtim_period=$dtim_period" "$N"
+       [ "$airtime_mode" -gt 0 ] && append base_cfg "airtime_mode=$airtime_mode" "$N"
 
        json_get_values opts hostapd_options
        for val in $opts; do
@@ -196,7 +201,7 @@ hostapd_common_add_bss_config() {
        config_add_int eapol_version
 
        config_add_string 'auth_server:host' 'server:host'
-       config_add_string auth_secret
+       config_add_string auth_secret key
        config_add_int 'auth_port:port' 'port:port'
 
        config_add_string acct_server
@@ -234,7 +239,7 @@ hostapd_common_add_bss_config() {
        config_add_string wps_device_type wps_device_name wps_manufacturer wps_pin
        config_add_string multi_ap_backhaul_ssid multi_ap_backhaul_key
 
-       config_add_boolean ieee80211v wnm_sleep_mode bss_transition
+       config_add_boolean wnm_sleep_mode bss_transition
        config_add_int time_advertisement
        config_add_string time_zone
 
@@ -256,10 +261,114 @@ hostapd_common_add_bss_config() {
        config_add_int mcast_rate
        config_add_array basic_rate
        config_add_array supported_rates
-       
+
        config_add_boolean sae_require_mfp
-       
+
        config_add_string 'owe_transition_bssid:macaddr' 'owe_transition_ssid:string'
+
+       config_add_boolean hs20 disable_dgaf osen
+       config_add_int anqp_domain_id
+       config_add_int hs20_deauth_req_timeout
+       config_add_array hs20_oper_friendly_name
+       config_add_array osu_provider
+       config_add_array operator_icon
+       config_add_array hs20_conn_capab
+       config_add_string osu_ssid hs20_wan_metrics hs20_operating_class hs20_t_c_filename hs20_t_c_timestamp
+
+       config_add_int airtime_bss_weight airtime_bss_limit
+}
+
+hostapd_set_vlan_file() {
+       local ifname="$1"
+       local vlan="$2"
+       json_get_vars name vid
+       echo "${vid} ${ifname}-${name}" >> /var/run/hostapd-${ifname}.vlan
+       wireless_add_vlan "${vlan}" "${ifname}-${name}"
+}
+
+hostapd_set_vlan() {
+       local ifname="$1"
+
+       rm -f /var/run/hostapd-${ifname}.vlan
+       for_each_vlan hostapd_set_vlan_file ${ifname}
+}
+
+hostapd_set_psk_file() {
+       local ifname="$1"
+       local vlan="$2"
+       local vlan_id=""
+
+       json_get_vars mac vid key
+       set_default mac "00:00:00:00:00:00"
+       [ -n "$vid" ] && vlan_id="vlanid=$vid "
+       echo "${vlan_id} ${mac} ${key}" >> /var/run/hostapd-${ifname}.psk
+}
+
+hostapd_set_psk() {
+       local ifname="$1"
+
+       rm -f /var/run/hostapd-${ifname}.psk
+       for_each_station hostapd_set_psk_file ${ifname}
+}
+
+append_hs20_oper_friendly_name() {
+       append bss_conf "hs20_oper_friendly_name=$1" "$N"
+}
+
+append_osu_provider_service_desc() {
+       append bss_conf "osu_service_desc=$1" "$N"
+}
+
+append_hs20_icon() {
+       local width height lang type path
+       config_get width "$1" width
+       config_get height "$1" height
+       config_get lang "$1" lang
+       config_get type "$1" type
+       config_get path "$1" path
+
+       append bss_conf "hs20_icon=$width:$height:$lang:$type:$1:$path" "$N"
+}
+
+append_hs20_icons() {
+       config_load wireless
+       config_foreach append_hs20_icon hs20-icon
+}
+
+append_operator_icon() {
+       append bss_conf "operator_icon=$1" "$N"
+}
+
+append_osu_icon() {
+       append bss_conf "osu_icon=$1" "$N"
+}
+
+append_osu_provider() {
+       local cfgtype osu_server_uri osu_friendly_name osu_nai osu_nai2 osu_method_list 
+
+       config_load wireless
+       config_get cfgtype "$1" TYPE
+       [ "$cfgtype" != "osu-provider" ] && return
+
+       append bss_conf "# provider $1" "$N"
+       config_get osu_server_uri "$1" osu_server_uri
+       config_get osu_nai "$1" osu_nai
+       config_get osu_nai2 "$1" osu_nai2
+       config_get osu_method_list "$1" osu_method
+
+       append bss_conf "osu_server_uri=$osu_server_uri" "$N"
+       append bss_conf "osu_nai=$osu_nai" "$N"
+       append bss_conf "osu_nai2=$osu_nai2" "$N"
+       append bss_conf "osu_method_list=$osu_method_list" "$N"
+
+       config_list_foreach "$1" osu_service_desc append_osu_provider_service_desc
+       config_list_foreach "$1" osu_icon append_osu_icon
+
+       append bss_conf "$N"
+}
+
+append_hs20_conn_capab() {
+       [ -n "$1" ] && append bss_conf "hs20_conn_capab=$1" "$N"
 }
 
 hostapd_set_bss_options() {
@@ -282,7 +391,8 @@ hostapd_set_bss_options() {
                iapp_interface eapol_version dynamic_vlan ieee80211w nasid \
                acct_server acct_secret acct_port acct_interval \
                bss_load_update_period chan_util_avg_period sae_require_mfp \
-               multi_ap multi_ap_backhaul_ssid multi_ap_backhaul_key
+               multi_ap multi_ap_backhaul_ssid multi_ap_backhaul_key \
+               airtime_bss_weight airtime_bss_limit
 
        set_default isolate 0
        set_default maxassoc 0
@@ -300,6 +410,8 @@ hostapd_set_bss_options() {
        set_default chan_util_avg_period 600
        set_default utf8_ssid 1
        set_default multi_ap 0
+       set_default airtime_bss_weight 0
+       set_default airtime_bss_limit 0
 
        append bss_conf "ctrl_interface=/var/run/hostapd"
        if [ "$isolate" -gt 0 ]; then
@@ -312,6 +424,9 @@ hostapd_set_bss_options() {
                append bss_conf "ap_max_inactivity=$max_inactivity" "$N"
        fi
 
+       [ "$airtime_bss_weight" -gt 0 ] && append bss_conf "airtime_bss_weight=$airtime_bss_weight" "$N"
+       [ "$airtime_bss_limit" -gt 0 ] && append bss_conf "airtime_bss_limit=$airtime_bss_limit" "$N"
+
        append bss_conf "bss_load_update_period=$bss_load_update_period" "$N"
        append bss_conf "chan_util_avg_period=$chan_util_avg_period" "$N"
        append bss_conf "disassoc_low_ack=$disassoc_low_ack" "$N"
@@ -369,20 +484,23 @@ hostapd_set_bss_options() {
                ;;
                psk|sae|psk-sae)
                        json_get_vars key wpa_psk_file
-                       if [ ${#key} -lt 8 ]; then
-                               wireless_setup_vif_failed INVALID_WPA_PSK
-                               return 1
-                       elif [ ${#key} -eq 64 ]; then
+                       if [ ${#key} -eq 64 ]; then
                                append bss_conf "wpa_psk=$key" "$N"
-                       else
+                       elif [ ${#key} -ge 8 ] && [ ${#key} -le 63 ]; then
                                append bss_conf "wpa_passphrase=$key" "$N"
+                       elif [ -n "$key" ] || [ -z "$wpa_psk_file" ]; then
+                               wireless_setup_vif_failed INVALID_WPA_PSK
+                               return 1
                        fi
+                       [ -z "$wpa_psk_file" ] && set_default wpa_psk_file /var/run/hostapd-$ifname.psk
                        [ -n "$wpa_psk_file" ] && {
                                [ -e "$wpa_psk_file" ] || touch "$wpa_psk_file"
                                append bss_conf "wpa_psk_file=$wpa_psk_file" "$N"
                        }
                        [ "$eapol_version" -ge "1" -a "$eapol_version" -le "2" ] && append bss_conf "eapol_version=$eapol_version" "$N"
 
+                       set_default dynamic_vlan 0
+                       vlan_possible=1
                        wps_possible=1
                ;;
                eap|eap192|eap-eap192)
@@ -492,32 +610,23 @@ hostapd_set_bss_options() {
                append bss_conf "iapp_interface=$ifname" "$N"
        }
 
-       json_get_vars ieee80211v
-       set_default ieee80211v 0
-       if [ "$ieee80211v" -eq "1" ]; then
-               json_get_vars time_advertisement time_zone wnm_sleep_mode bss_transition
-
-               set_default time_advertisement 0
-               set_default wnm_sleep_mode 0
-               set_default bss_transition 0
+       json_get_vars time_advertisement time_zone wnm_sleep_mode bss_transition
 
-               append bss_conf "time_advertisement=$time_advertisement" "$N"
-               [ -n "$time_zone" ] && append bss_conf "time_zone=$time_zone" "$N"
-               append bss_conf "wnm_sleep_mode=$wnm_sleep_mode" "$N"
-               append bss_conf "bss_transition=$bss_transition" "$N"
-       fi
+       [ -n "$time_advertisement" ] && append bss_conf "time_advertisement=$time_advertisement" "$N"
+       [ -n "$time_zone" ] && append bss_conf "time_zone=$time_zone" "$N"
+       [ "$wnm_sleep_mode" -eq "1" ] && append bss_conf "wnm_sleep_mode=1" "$N"
+       [ "$bss_transition" -eq "1" ] && append bss_conf "bss_transition=1" "$N"
 
-       json_get_vars ieee80211k
+       json_get_vars ieee80211k rrm_neighbor_report rrm_beacon_report
        set_default ieee80211k 0
        if [ "$ieee80211k" -eq "1" ]; then
-               json_get_vars rrm_neighbor_report rrm_beacon_report
-
                set_default rrm_neighbor_report 1
                set_default rrm_beacon_report 1
-               append bss_conf "rrm_neighbor_report=$rrm_neighbor_report" "$N"
-               append bss_conf "rrm_beacon_report=$rrm_beacon_report" "$N"
        fi
 
+       [ "$rrm_neighbor_report" -eq "1" ] && append bss_conf "rrm_neighbor_report=1" "$N"
+       [ "$rrm_beacon_report" -eq "1" ] && append bss_conf "rrm_beacon_report=1" "$N"
+
        if [ "$wpa" -ge "1" ]; then
                json_get_vars ieee80211r
                set_default ieee80211r 0
@@ -639,6 +748,7 @@ hostapd_set_bss_options() {
        [ -n "$vlan_possible" -a -n "$dynamic_vlan" ] && {
                json_get_vars vlan_naming vlan_tagged_interface vlan_bridge vlan_file
                set_default vlan_naming 1
+               [ -z "$vlan_file" ] && set_default vlan_file /var/run/hostapd-$ifname.vlan
                append bss_conf "dynamic_vlan=$dynamic_vlan" "$N"
                append bss_conf "vlan_naming=$vlan_naming" "$N"
                [ -n "$vlan_bridge" ] && \
@@ -651,6 +761,34 @@ hostapd_set_bss_options() {
                }
        }
 
+       local hs20 disable_dgaf osen anqp_domain_id hs20_deauth_req_timeout \
+               osu_ssid hs20_wan_metrics hs20_operating_class hs20_t_c_filename hs20_t_c_timestamp
+       json_get_vars hs20 disable_dgaf osen anqp_domain_id hs20_deauth_req_timeout \
+               osu_ssid hs20_wan_metrics hs20_operating_class hs20_t_c_filename hs20_t_c_timestamp
+
+       set_default hs20 0
+       set_default disable_dgaf $hs20
+       set_default osen 0
+       set_default anqp_domain_id 0
+       set_default hs20_deauth_req_timeout 60
+       if [ "$hs20" = "1" ]; then
+               append bss_conf "hs20=1" "$N"
+               append_hs20_icons
+               append bss_conf "disable_dgaf=$disable_dgaf" "$N"
+               append bss_conf "osen=$osen" "$N"
+               append bss_conf "anqp_domain_id=$anqp_domain_id" "$N"
+               append bss_conf "hs20_deauth_req_timeout=$hs20_deauth_req_timeout" "$N"
+               [ -n "$osu_ssid" ] && append bss_conf "osu_ssid=$osu_ssid" "$N"
+               [ -n "$hs20_wan_metrics" ] && append bss_conf "hs20_wan_metrics=$hs20_wan_metrics" "$N"
+               [ -n "$hs20_operating_class" ] && append bss_conf "hs20_operating_class=$hs20_operating_class" "$N"
+               [ -n "$hs20_t_c_filename" ] && append bss_conf "hs20_t_c_filename=$hs20_t_c_filename" "$N"
+               [ -n "$hs20_t_c_timestamp" ] && append bss_conf "hs20_t_c_timestamp=$hs20_t_c_timestamp" "$N"
+               json_for_each_item append_hs20_conn_capab hs20_conn_capab
+               json_for_each_item append_hs20_oper_friendly_name hs20_oper_friendly_name
+               json_for_each_item append_osu_provider osu_provider
+               json_for_each_item append_operator_icon operator_icon
+       fi
+
        bss_md5sum=$(echo $bss_conf | md5sum | cut -d" " -f1)
        append bss_conf "config_id=$bss_md5sum" "$N"
 
@@ -749,6 +887,7 @@ wpa_supplicant_prepare_interface() {
        fi
        wpa_supplicant_teardown_interface "$ifname"
        cat > "$_config" <<EOF
+${scan_list:+freq_list=$scan_list}
 $ap_scan
 $country_str
 EOF
@@ -772,7 +911,8 @@ wpa_supplicant_set_fixed_freq() {
        case "$htmode" in
                VHT80) append network_data "max_oper_chwidth=1" "$N$T";;
                VHT160) append network_data "max_oper_chwidth=2" "$N$T";;
-               *) append network_data "max_oper_chwidth=0" "$N$T";;
+               VHT20|VHT40) append network_data "max_oper_chwidth=0" "$N$T";;
+               *) append network_data "disable_vht=1" "$N$T";;
        esac
 }
 
@@ -1087,7 +1227,7 @@ wpa_supplicant_run() {
 
        [ "$ret" != 0 ] && wireless_setup_vif_failed WPA_SUPPLICANT_FAILED
 
-       local supplicant_pid=$(ubus call service list '{"name": "hostapd"}' | jsonfilter -l 1 -e "@['hostapd'].instances['supplicant'].pid")
+       local supplicant_pid=$(ubus call service list '{"name": "wpad"}' | jsonfilter -l 1 -e "@['wpad'].instances['supplicant'].pid")
        wireless_add_process "$supplicant_pid" "/usr/sbin/wpa_supplicant" 1
 
        return $ret