+
+ config_add_boolean sae_require_mfp
+
+ config_add_string 'owe_transition_bssid:macaddr' 'owe_transition_ssid:string'
+
+ config_add_boolean iw_enabled iw_internet iw_asra iw_esr iw_uesa
+ config_add_int iw_access_network_type iw_venue_group iw_venue_type
+ config_add_int iw_ipaddr_type_availability iw_gas_address3
+ config_add_string iw_hessid iw_network_auth_type iw_qos_map_set
+ config_add_array iw_roaming_consortium iw_domain_name iw_anqp_3gpp_cell_net iw_nai_realm
+ config_add_array iw_anqp_elem
+
+ 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_array airtime_sta_weight
+ 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_iw_roaming_consortium() {
+ [ -n "$1" ] && append bss_conf "roaming_consortium=$1" "$N"
+}
+
+append_iw_domain_name() {
+ if [ -z "$iw_domain_name_conf" ]; then
+ iw_domain_name_conf="$1"
+ else
+ iw_domain_name_conf="$iw_domain_name_conf,$1"
+ fi
+}
+
+append_iw_anqp_3gpp_cell_net() {
+ if [ -z "$iw_anqp_3gpp_cell_net_conf" ]; then
+ iw_anqp_3gpp_cell_net_conf="$1"
+ else
+ iw_anqp_3gpp_cell_net_conf="$iw_anqp_3gpp_cell_net_conf:$1"
+ fi
+}
+
+append_iw_anqp_elem() {
+ [ -n "$1" ] && append bss_conf "anqp_elem=$1" "$N"
+}
+
+append_iw_nai_realm() {
+ [ -n "$1" ] && append bss_conf "nai_realm=$1" "$N"
+}
+
+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"
+}
+
+append_airtime_sta_weight() {
+ [ -n "$1" ] && append bss_conf "airtime_sta_weight=$1" "$N"